diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 0d20b64..0000000
--- a/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.pyc
diff --git a/Android.bp b/Android.bp
deleted file mode 100644
index 24f235a..0000000
--- a/Android.bp
+++ /dev/null
@@ -1,415 +0,0 @@
-// Copyright 2017 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-filegroup {
-    name: "libmojo_mojom_files",
-    srcs: [
-        "ipc/ipc.mojom",
-        "mojo/common/file.mojom",
-        "mojo/common/file_path.mojom",
-        "mojo/common/string16.mojom",
-        "mojo/common/text_direction.mojom",
-        "mojo/common/time.mojom",
-        "mojo/common/unguessable_token.mojom",
-        "mojo/common/values.mojom",
-        "mojo/common/version.mojom",
-        "mojo/public/interfaces/bindings/interface_control_messages.mojom",
-        "mojo/public/interfaces/bindings/pipe_control_messages.mojom",
-        "ui/gfx/geometry/mojo/geometry.mojom",
-        "ui/gfx/range/mojo/range.mojom",
-    ],
-}
-
-filegroup {
-    name: "mojo_sources",
-    srcs: [
-        "mojo/**/*.cc",
-    ],
-    exclude_srcs: [
-        // Unused in Chrome. Looks like mistakenly checked in.
-        // TODO(hidehiko): Remove this after the file is removed in Chrome
-        // repository. http://crrev.com/c/644531
-        "mojo/public/cpp/system/message.cc",
-
-        // No WTF support.
-        "mojo/public/cpp/bindings/lib/string_traits_wtf.cc",
-
-        // Exclude windows/mac/ios files.
-        "**/*_win.cc",
-        "mojo/edk/system/mach_port_relay.cc",
-
-        // Exclude js binding related files.
-        "mojo/edk/js/**/*",
-        "mojo/public/js/**/*",
-
-        // Exclude tests.
-        // Note that mojo/edk/embedder/test_embedder.cc needs to be included
-        // for Mojo support. cf) b/62071944.
-        "**/*_unittest.cc",
-        "**/*_unittests.cc",
-        "**/*_perftest.cc",
-        "mojo/android/javatests/**/*",
-        "mojo/edk/system/core_test_base.cc",
-        "mojo/edk/system/test_utils.cc",
-        "mojo/edk/test/**/*",
-        "mojo/public/c/system/tests/**/*",
-        "mojo/public/cpp/bindings/tests/**/*",
-        "mojo/public/cpp/system/tests/**/*",
-        "mojo/public/cpp/test_support/**/*",
-        "mojo/public/tests/**/*",
-    ],
-}
-
-// Python in Chrome repository requires still Python 2.
-python_defaults {
-    name: "libmojo_scripts",
-    version: {
-        py2: {
-            enabled: true,
-        },
-        py3: {
-            enabled: false,
-        },
-    },
-}
-
-python_binary_host {
-    name: "jni_generator",
-    main: "base/android/jni_generator/jni_generator.py",
-    srcs: [
-        "base/android/jni_generator/jni_generator.py",
-        "build/**/*.py",
-        "third_party/catapult/devil/devil/**/*.py",
-    ],
-    defaults: ["libmojo_scripts"],
-}
-
-python_binary_host {
-    name: "mojom_bindings_generator",
-    main: "mojo/public/tools/bindings/mojom_bindings_generator.py",
-    srcs: [
-        "mojo/public/tools/bindings/**/*.py",
-        "build/**/*.py",
-        "third_party/catapult/devil/**/*.py",
-        "third_party/jinja2/**/*.py",
-        "third_party/markupsafe/**/*.py",
-        "third_party/ply/**/*.py",
-    ],
-    data: [
-        "mojo/public/tools/bindings/generators/cpp_templates/*.tmpl",
-        "mojo/public/tools/bindings/generators/java_templates/*.tmpl",
-        "mojo/public/tools/bindings/generators/js_templates/*.tmpl",
-    ],
-    defaults: ["libmojo_scripts"],
-}
-
-cc_prebuilt_binary {
-    name: "mojom_source_generator_sh",
-    srcs: ["soong/mojom_source_generator.sh"],
-    host_supported: true,
-}
-
-genrule {
-    name: "libmojo_mojom_headers",
-    cmd: "$(location mojom_source_generator_sh)" +
-    "    --mojom_bindings_generator=$(location mojom_bindings_generator)" +
-    "    --package=external/libmojo" +
-    "    --output_dir=$(genDir)" +
-    "    --bytecode_path=$(genDir)" +
-    "    --typemap=$(location gen/mojo/common/common_custom_types__type_mappings)" +
-    "    --generators=c++" +
-    "    --use_new_wrapper_types" +
-    "    $(in)",
-
-    tools: [
-        "mojom_bindings_generator",
-        "mojom_source_generator_sh",
-    ],
-
-    tool_files: [
-        // This file was copied from out/Release in a Chrome checkout.
-        // TODO(lhchavez): Generate this file instead of hardcoding it.
-        "gen/mojo/common/common_custom_types__type_mappings",
-    ],
-
-    srcs: [":libmojo_mojom_files"],
-
-    out: [
-        "ipc/ipc.mojom.h",
-        "ipc/ipc.mojom-shared.h",
-        "ipc/ipc.mojom-shared-internal.h",
-        "mojo/common/file.mojom.h",
-        "mojo/common/file.mojom-shared.h",
-        "mojo/common/file.mojom-shared-internal.h",
-        "mojo/common/file_path.mojom.h",
-        "mojo/common/file_path.mojom-shared.h",
-        "mojo/common/file_path.mojom-shared-internal.h",
-        "mojo/common/string16.mojom.h",
-        "mojo/common/string16.mojom-shared.h",
-        "mojo/common/string16.mojom-shared-internal.h",
-        "mojo/common/text_direction.mojom.h",
-        "mojo/common/text_direction.mojom-shared.h",
-        "mojo/common/text_direction.mojom-shared-internal.h",
-        "mojo/common/time.mojom.h",
-        "mojo/common/time.mojom-shared.h",
-        "mojo/common/time.mojom-shared-internal.h",
-        "mojo/common/unguessable_token.mojom.h",
-        "mojo/common/unguessable_token.mojom-shared.h",
-        "mojo/common/unguessable_token.mojom-shared-internal.h",
-        "mojo/common/values.mojom.h",
-        "mojo/common/values.mojom-shared.h",
-        "mojo/common/values.mojom-shared-internal.h",
-        "mojo/common/version.mojom.h",
-        "mojo/common/version.mojom-shared.h",
-        "mojo/common/version.mojom-shared-internal.h",
-        "mojo/public/interfaces/bindings/interface_control_messages.mojom.h",
-        "mojo/public/interfaces/bindings/interface_control_messages.mojom-shared.h",
-        "mojo/public/interfaces/bindings/interface_control_messages.mojom-shared-internal.h",
-        "mojo/public/interfaces/bindings/pipe_control_messages.mojom.h",
-        "mojo/public/interfaces/bindings/pipe_control_messages.mojom-shared.h",
-        "mojo/public/interfaces/bindings/pipe_control_messages.mojom-shared-internal.h",
-        "ui/gfx/geometry/mojo/geometry.mojom.h",
-        "ui/gfx/geometry/mojo/geometry.mojom-shared.h",
-        "ui/gfx/geometry/mojo/geometry.mojom-shared-internal.h",
-        "ui/gfx/range/mojo/range.mojom.h",
-        "ui/gfx/range/mojo/range.mojom-shared.h",
-        "ui/gfx/range/mojo/range.mojom-shared-internal.h",
-    ],
-}
-
-genrule {
-    name: "libmojo_mojom_srcs",
-    cmd: "$(location mojom_source_generator_sh)" +
-    "    --mojom_bindings_generator=$(location mojom_bindings_generator)" +
-    "    --package=external/libmojo" +
-    "    --output_dir=$(genDir)" +
-    "    --bytecode_path=$(genDir)" +
-    "    --typemap=$(location gen/mojo/common/common_custom_types__type_mappings)" +
-    "    --generators=c++" +
-    "    --use_new_wrapper_types" +
-    "    $(in)",
-
-    tools: [
-        "mojom_bindings_generator",
-        "mojom_source_generator_sh",
-    ],
-
-    tool_files: [
-        // This file was copied from out/Release in a Chrome checkout.
-        // TODO(lhchavez): Generate this file instead of hardcoding it.
-        "gen/mojo/common/common_custom_types__type_mappings",
-        "soong/mojom_source_generator.sh",
-    ],
-
-    srcs: [":libmojo_mojom_files"],
-
-    out: [
-        "ipc/ipc.mojom.cc",
-        "ipc/ipc.mojom-shared.cc",
-        "mojo/common/file.mojom.cc",
-        "mojo/common/file.mojom-shared.cc",
-        "mojo/common/string16.mojom.cc",
-        "mojo/common/string16.mojom-shared.cc",
-        "mojo/common/text_direction.mojom.cc",
-        "mojo/common/text_direction.mojom-shared.cc",
-        "mojo/common/time.mojom.cc",
-        "mojo/common/time.mojom-shared.cc",
-        "mojo/common/unguessable_token.mojom.cc",
-        "mojo/common/unguessable_token.mojom-shared.cc",
-        "mojo/common/version.mojom.cc",
-        "mojo/common/version.mojom-shared.cc",
-        "mojo/public/interfaces/bindings/interface_control_messages.mojom.cc",
-        "mojo/public/interfaces/bindings/interface_control_messages.mojom-shared.cc",
-        "mojo/public/interfaces/bindings/pipe_control_messages.mojom.cc",
-        "mojo/public/interfaces/bindings/pipe_control_messages.mojom-shared.cc",
-        "ui/gfx/geometry/mojo/geometry.mojom.cc",
-        "ui/gfx/geometry/mojo/geometry.mojom-shared.cc",
-        "ui/gfx/range/mojo/range.mojom.cc",
-        "ui/gfx/range/mojo/range.mojom-shared.cc",
-    ],
-}
-
-// TODO(hidehiko): Remove JNI for ContextUtils, after cleaning up the
-// depended code.
-genrule {
-    name: "libmojo_jni_headers",
-    cmd: "$(location soong/jni_generator_helper.sh)" +
-    "    --jni_generator=$(location jni_generator)" +
-    "    --output_dir=$(genDir)/jni" +
-    "    --includes=base/android/jni_generator/jni_generator_helper.h" +
-    "    --ptr_type=long" +
-    "    --native_exports_optional" +
-    "    $(in)",
-
-    tools: [
-        "jni_generator",
-    ],
-
-    tool_files: [
-        "soong/jni_generator_helper.sh",
-    ],
-
-    srcs: [
-        "base/android/java/src/org/chromium/base/BuildInfo.java",
-        "base/android/java/src/org/chromium/base/ContextUtils.java",
-        "mojo/android/system/src/org/chromium/mojo/system/impl/BaseRunLoop.java",
-        "mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java",
-        "mojo/android/system/src/org/chromium/mojo/system/impl/WatcherImpl.java",
-    ],
-
-    out: [
-        "jni/BuildInfo_jni.h",
-        "jni/ContextUtils_jni.h",
-        "jni/BaseRunLoop_jni.h",
-        "jni/CoreImpl_jni.h",
-        "jni/WatcherImpl_jni.h",
-    ],
-}
-
-cc_library_shared {
-    name: "libmojo",
-
-    generated_headers: [
-        "libmojo_jni_headers",
-        "libmojo_mojom_headers",
-    ],
-
-    generated_sources: [
-        "libmojo_mojom_srcs",
-    ],
-
-    export_generated_headers: [
-        "libmojo_jni_headers",
-        "libmojo_mojom_headers",
-    ],
-
-    srcs: [
-        "base/android/build_info.cc",
-        "base/android/context_utils.cc",
-        "base/android/jni_android.cc",
-        "base/android/jni_string.cc",
-        "base/android/scoped_java_ref.cc",
-        "ipc/ipc_message.cc",
-        "ipc/ipc_message_attachment.cc",
-        "ipc/ipc_message_attachment_set.cc",
-        "ipc/ipc_message_utils.cc",
-        "ipc/ipc_mojo_handle_attachment.cc",
-        "ipc/ipc_mojo_message_helper.cc",
-        "ipc/ipc_mojo_param_traits.cc",
-        "ipc/ipc_platform_file_attachment_posix.cc",
-        ":mojo_sources",
-    ],
-
-    cflags: [
-        "-Wall",
-        "-Werror",
-        "-Wno-unused-parameter",
-        "-Wno-missing-field-initializers",
-        "-DMOJO_EDK_LEGACY_PROTOCOL",
-    ],
-
-    // We also pass NO_ASHMEM to make base::SharedMemory avoid using it and prefer
-    // the POSIX versions.
-    cppflags: [
-        "-Wno-sign-promo",
-        "-Wno-non-virtual-dtor",
-        "-Wno-ignored-qualifiers",
-        "-Wno-extra",
-        "-DNO_ASHMEM",
-    ],
-
-    shared_libs: [
-        "libevent",
-        "liblog",
-        "libchrome",
-        "libchrome-crypto",
-    ],
-
-    export_include_dirs: ["."],
-}
-
-genrule {
-    name: "libmojo_mojom_java_srcs",
-    cmd: "$(location mojom_source_generator_sh)" +
-    "    --mojom_bindings_generator=$(location mojom_bindings_generator)" +
-    "    --package=external/libmojo" +
-    "    --output_dir=$(genDir)" +
-    "    --bytecode_path=$(genDir)" +
-    "    --typemap=$(location gen/mojo/common/common_custom_types__type_mappings)" +
-    "    --generators=java" +
-    "    --use_new_wrapper_types" +
-    "    $(in)",
-
-    tools: [
-        "mojom_bindings_generator",
-        "mojom_source_generator_sh",
-    ],
-
-    tool_files: [
-        // This file was copied from out/Release in a Chrome checkout.
-        // TODO(lhchavez): Generate this file instead of hardcoding it.
-        "gen/mojo/common/common_custom_types__type_mappings",
-    ],
-
-    srcs: [":libmojo_mojom_files"],
-
-    out: [
-        "src/org/chromium/gfx/mojom/InsetsF.java",
-        "src/org/chromium/gfx/mojom/Insets.java",
-        "src/org/chromium/gfx/mojom/PointF.java",
-        "src/org/chromium/gfx/mojom/Point.java",
-        "src/org/chromium/gfx/mojom/RangeF.java",
-        "src/org/chromium/gfx/mojom/Range.java",
-        "src/org/chromium/gfx/mojom/RectF.java",
-        "src/org/chromium/gfx/mojom/Rect.java",
-        "src/org/chromium/gfx/mojom/SizeF.java",
-        "src/org/chromium/gfx/mojom/Size.java",
-        "src/org/chromium/gfx/mojom/Vector2dF.java",
-        "src/org/chromium/gfx/mojom/Vector2d.java",
-        "src/org/chromium/IPC/mojom/ChannelBootstrap_Internal.java",
-        "src/org/chromium/IPC/mojom/ChannelBootstrap.java",
-        "src/org/chromium/IPC/mojom/Channel_Internal.java",
-        "src/org/chromium/IPC/mojom/Channel.java",
-        "src/org/chromium/IPC/mojom/GenericInterface_Internal.java",
-        "src/org/chromium/IPC/mojom/GenericInterface.java",
-        "src/org/chromium/IPC/mojom/IpcConstants.java",
-        "src/org/chromium/IPC/mojom/SerializedHandle.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/FlushForTesting.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/InterfaceControlMessagesConstants.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/QueryVersion.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/QueryVersionResult.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RequireVersion.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RunInput.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RunMessageParams.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RunOrClosePipeInput.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RunOrClosePipeMessageParams.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RunOutput.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RunResponseMessageParams.java",
-        "src/org/chromium/mojo/bindings/pipecontrol/DisconnectReason.java",
-        "src/org/chromium/mojo/bindings/pipecontrol/PeerAssociatedEndpointClosedEvent.java",
-        "src/org/chromium/mojo/bindings/pipecontrol/PipeControlMessagesConstants.java",
-        "src/org/chromium/mojo/bindings/pipecontrol/RunOrClosePipeInput.java",
-        "src/org/chromium/mojo/bindings/pipecontrol/RunOrClosePipeMessageParams.java",
-        "src/org/chromium/mojo/common/mojom/File.java",
-        "src/org/chromium/mojo/common/mojom/String16.java",
-        "src/org/chromium/mojo/common/mojom/TextDirection.java",
-        "src/org/chromium/mojo/common/mojom/TimeDelta.java",
-        "src/org/chromium/mojo/common/mojom/Time.java",
-        "src/org/chromium/mojo/common/mojom/TimeTicks.java",
-        "src/org/chromium/mojo/common/mojom/UnguessableToken.java",
-        "src/org/chromium/mojo/common/mojom/Version.java",
-    ],
-}
-
-java_library {
-    name: "android.mojo",
-
-    srcs: [
-        ":libmojo_mojom_java_srcs",
-        "base/android/java/src/**/*.java",
-        "mojo/android/system/src/**/*.java",
-        "mojo/public/java/system/src/**/*.java",
-        "mojo/public/java/bindings/src/**/*.java",
-    ],
-}
diff --git a/CleanSpec.mk b/CleanSpec.mk
deleted file mode 100644
index da5b4d1..0000000
--- a/CleanSpec.mk
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright (C) 2018 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# If you don't need to do a full clean build but would like to touch
-# a file or delete some intermediate files, add a clean step to the end
-# of the list.  These steps will only be run once, if they haven't been
-# run before.
-#
-# E.g.:
-#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
-#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
-#
-# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
-# files that are missing or have been moved.
-#
-# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
-# Use $(OUT_DIR) to refer to the "out" directory.
-#
-# If you need to re-do something that's already mentioned, just copy
-# the command and add it to the bottom of the list.  E.g., if a change
-# that you made last week required touching a file and a change you
-# made today requires touching the same file, just copy the old
-# touch step and add it to the end of the list.
-#
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
-
-# For example:
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
-#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
-#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
-
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/product/generic/system/framework/*_bp.jar)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj_x86/SHARED_LIBRARIES/*_bp_intermediates)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/*_bp_intermediates)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/*_bp.so)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib64/*_bp.so)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/arm/*_bp.so)
-
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..602ddf9
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+This repository was migrated into libchrome.
diff --git a/base/android/build_info.cc b/base/android/build_info.cc
deleted file mode 100644
index 869c703..0000000
--- a/base/android/build_info.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2012 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/android/build_info.h"
-
-#include <string>
-
-#include "base/android/jni_android.h"
-#include "base/android/jni_string.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/logging.h"
-#include "base/memory/singleton.h"
-#include "jni/BuildInfo_jni.h"
-
-namespace {
-
-// We are leaking these strings.
-const char* StrDupJString(const base::android::JavaRef<jstring>& java_string) {
-  std::string str = ConvertJavaStringToUTF8(java_string);
-  return strdup(str.c_str());
-}
-
-}  // namespace
-
-namespace base {
-namespace android {
-
-struct BuildInfoSingletonTraits {
-  static BuildInfo* New() {
-    return new BuildInfo(AttachCurrentThread());
-  }
-
-  static void Delete(BuildInfo* x) {
-    // We're leaking this type, see kRegisterAtExit.
-    NOTREACHED();
-  }
-
-  static const bool kRegisterAtExit = false;
-#if DCHECK_IS_ON()
-  static const bool kAllowedToAccessOnNonjoinableThread = true;
-#endif
-};
-
-BuildInfo::BuildInfo(JNIEnv* env)
-    : device_(StrDupJString(Java_BuildInfo_getDevice(env))),
-      manufacturer_(StrDupJString(Java_BuildInfo_getDeviceManufacturer(env))),
-      model_(StrDupJString(Java_BuildInfo_getDeviceModel(env))),
-      brand_(StrDupJString(Java_BuildInfo_getBrand(env))),
-      android_build_id_(StrDupJString(Java_BuildInfo_getAndroidBuildId(env))),
-      android_build_fp_(
-          StrDupJString(Java_BuildInfo_getAndroidBuildFingerprint(env))),
-      gms_version_code_(StrDupJString(Java_BuildInfo_getGMSVersionCode(env))),
-      package_version_code_(
-          StrDupJString(Java_BuildInfo_getPackageVersionCode(env))),
-      package_version_name_(
-          StrDupJString(Java_BuildInfo_getPackageVersionName(env))),
-      package_label_(StrDupJString(Java_BuildInfo_getPackageLabel(env))),
-      package_name_(StrDupJString(Java_BuildInfo_getPackageName(env))),
-      build_type_(StrDupJString(Java_BuildInfo_getBuildType(env))),
-      sdk_int_(Java_BuildInfo_getSdkInt(env)),
-      java_exception_info_(NULL) {}
-
-// static
-BuildInfo* BuildInfo::GetInstance() {
-  return Singleton<BuildInfo, BuildInfoSingletonTraits >::get();
-}
-
-void BuildInfo::SetJavaExceptionInfo(const std::string& info) {
-  DCHECK(!java_exception_info_) << "info should be set only once.";
-  java_exception_info_ = strndup(info.c_str(), 4096);
-}
-
-void BuildInfo::ClearJavaExceptionInfo() {
-  delete java_exception_info_;
-  java_exception_info_ = nullptr;
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/build_info.h b/base/android/build_info.h
deleted file mode 100644
index cce74f4..0000000
--- a/base/android/build_info.h
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (c) 2012 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_BUILD_INFO_H_
-#define BASE_ANDROID_BUILD_INFO_H_
-
-#include <jni.h>
-
-#include <string>
-
-#include "base/base_export.h"
-#include "base/macros.h"
-#include "base/memory/singleton.h"
-
-namespace base {
-namespace android {
-
-// This enumeration maps to the values returned by BuildInfo::sdk_int(),
-// indicating the Android release associated with a given SDK version.
-enum SdkVersion {
-  SDK_VERSION_JELLY_BEAN = 16,
-  SDK_VERSION_JELLY_BEAN_MR1 = 17,
-  SDK_VERSION_JELLY_BEAN_MR2 = 18,
-  SDK_VERSION_KITKAT = 19,
-  SDK_VERSION_KITKAT_WEAR = 20,
-  SDK_VERSION_LOLLIPOP = 21,
-  SDK_VERSION_LOLLIPOP_MR1 = 22,
-  SDK_VERSION_MARSHMALLOW = 23,
-  SDK_VERSION_NOUGAT = 24
-};
-
-// BuildInfo is a singleton class that stores android build and device
-// information. It will be called from Android specific code and gets used
-// primarily in crash reporting.
-
-// It is also used to store the last java exception seen during JNI.
-// TODO(nileshagrawal): Find a better place to store this info.
-class BASE_EXPORT BuildInfo {
- public:
-
-  ~BuildInfo() {}
-
-  // Static factory method for getting the singleton BuildInfo instance.
-  // Note that ownership is not conferred on the caller and the BuildInfo in
-  // question isn't actually freed until shutdown. This is ok because there
-  // should only be one instance of BuildInfo ever created.
-  static BuildInfo* GetInstance();
-
-  // Const char* is used instead of std::strings because these values must be
-  // available even if the process is in a crash state. Sadly
-  // std::string.c_str() doesn't guarantee that memory won't be allocated when
-  // it is called.
-  const char* device() const {
-    return device_;
-  }
-
-  const char* manufacturer() const {
-    return manufacturer_;
-  }
-
-  const char* model() const {
-    return model_;
-  }
-
-  const char* brand() const {
-    return brand_;
-  }
-
-  const char* android_build_id() const {
-    return android_build_id_;
-  }
-
-  const char* android_build_fp() const {
-    return android_build_fp_;
-  }
-
-  const char* gms_version_code() const {
-    return gms_version_code_;
-  }
-
-  const char* package_version_code() const {
-    return package_version_code_;
-  }
-
-  const char* package_version_name() const {
-    return package_version_name_;
-  }
-
-  const char* package_label() const {
-    return package_label_;
-  }
-
-  const char* package_name() const {
-    return package_name_;
-  }
-
-  const char* build_type() const {
-    return build_type_;
-  }
-
-  int sdk_int() const {
-    return sdk_int_;
-  }
-
-  const char* java_exception_info() const {
-    return java_exception_info_;
-  }
-
-  void SetJavaExceptionInfo(const std::string& info);
-
-  void ClearJavaExceptionInfo();
-
- private:
-  friend struct BuildInfoSingletonTraits;
-
-  explicit BuildInfo(JNIEnv* env);
-
-  // Const char* is used instead of std::strings because these values must be
-  // available even if the process is in a crash state. Sadly
-  // std::string.c_str() doesn't guarantee that memory won't be allocated when
-  // it is called.
-  const char* const device_;
-  const char* const manufacturer_;
-  const char* const model_;
-  const char* const brand_;
-  const char* const android_build_id_;
-  const char* const android_build_fp_;
-  const char* const gms_version_code_;
-  const char* const package_version_code_;
-  const char* const package_version_name_;
-  const char* const package_label_;
-  const char* const package_name_;
-  const char* const build_type_;
-  const int sdk_int_;
-  // This is set via set_java_exception_info, not at constructor time.
-  const char* java_exception_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(BuildInfo);
-};
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_BUILD_INFO_H_
diff --git a/base/android/context_utils.cc b/base/android/context_utils.cc
deleted file mode 100644
index e2c4ed0..0000000
--- a/base/android/context_utils.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2015 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/android/context_utils.h"
-
-#include <jni.h>
-
-#include "base/android/scoped_java_ref.h"
-#include "base/lazy_instance.h"
-#include "jni/ContextUtils_jni.h"
-
-using base::android::JavaRef;
-
-namespace base {
-namespace android {
-
-namespace {
-
-// Leak the global app context, as it is used from a non-joinable worker thread
-// that may still be running at shutdown. There is no harm in doing this.
-base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject>>::Leaky
-    g_application_context = LAZY_INSTANCE_INITIALIZER;
-
-void SetNativeApplicationContext(JNIEnv* env, const JavaRef<jobject>& context) {
-  if (env->IsSameObject(g_application_context.Get().obj(), context.obj())) {
-    // It's safe to set the context more than once if it's the same context.
-    return;
-  }
-  DCHECK(g_application_context.Get().is_null());
-  g_application_context.Get().Reset(context);
-}
-
-}  // namespace
-
-const JavaRef<jobject>& GetApplicationContext() {
-  DCHECK(!g_application_context.Get().is_null());
-  return g_application_context.Get();
-}
-
-static void InitNativeSideApplicationContext(
-    JNIEnv* env,
-    const JavaParamRef<jclass>& clazz,
-    const JavaParamRef<jobject>& context) {
-  SetNativeApplicationContext(env, context);
-}
-
-bool RegisterContextUtils(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/context_utils.h b/base/android/context_utils.h
deleted file mode 100644
index c5289f1..0000000
--- a/base/android/context_utils.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2015 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_CONTEXT_UTILS_H_
-#define BASE_ANDROID_CONTEXT_UTILS_H_
-
-#include <jni.h>
-
-#include "base/android/scoped_java_ref.h"
-#include "base/base_export.h"
-
-namespace base {
-namespace android {
-
-// Gets a global ref to the application context set with
-// InitApplicationContext(). Ownership is retained by the function - the caller
-// must NOT release it.
-BASE_EXPORT const JavaRef<jobject>& GetApplicationContext();
-
-bool RegisterContextUtils(JNIEnv* env);
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_CONTEXT_UTILS_H_
diff --git a/base/android/java/src/org/chromium/base/BuildInfo.java b/base/android/java/src/org/chromium/base/BuildInfo.java
deleted file mode 100644
index de4ad08..0000000
--- a/base/android/java/src/org/chromium/base/BuildInfo.java
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2012 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.
-
-package org.chromium.base;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.os.Build;
-import android.os.StrictMode;
-
-import org.chromium.base.annotations.CalledByNative;
-
-/**
- * BuildInfo is a utility class providing easy access to {@link PackageInfo} information. This is
- * primarily of use for accessing package information from native code.
- */
-public class BuildInfo {
-    private static final String TAG = "BuildInfo";
-    private static final int MAX_FINGERPRINT_LENGTH = 128;
-
-    /**
-     * BuildInfo is a static utility class and therefore shouldn't be instantiated.
-     */
-    private BuildInfo() {}
-
-    @CalledByNative
-    public static String getDevice() {
-        return Build.DEVICE;
-    }
-
-    @CalledByNative
-    public static String getBrand() {
-        return Build.BRAND;
-    }
-
-    @CalledByNative
-    public static String getAndroidBuildId() {
-        return Build.ID;
-    }
-
-    /**
-     * @return The build fingerprint for the current Android install.  The value is truncated to a
-     * 128 characters as this is used for crash and UMA reporting, which should avoid huge
-     * strings.
-     */
-    @CalledByNative
-    public static String getAndroidBuildFingerprint() {
-        return Build.FINGERPRINT.substring(
-                0, Math.min(Build.FINGERPRINT.length(), MAX_FINGERPRINT_LENGTH));
-    }
-
-    @CalledByNative
-    public static String getDeviceManufacturer() {
-        return Build.MANUFACTURER;
-    }
-
-    @CalledByNative
-    public static String getDeviceModel() {
-        return Build.MODEL;
-    }
-
-    @CalledByNative
-    public static String getGMSVersionCode() {
-        String msg = "gms versionCode not available.";
-        try {
-            PackageManager packageManager =
-                    ContextUtils.getApplicationContext().getPackageManager();
-            PackageInfo packageInfo = packageManager.getPackageInfo("com.google.android.gms", 0);
-            msg = Integer.toString(packageInfo.versionCode);
-        } catch (NameNotFoundException e) {
-            Log.d(TAG, "GMS package is not found.", e);
-        }
-        return msg;
-    }
-
-    @CalledByNative
-    public static String getPackageVersionCode() {
-        String msg = "versionCode not available.";
-        try {
-            PackageManager pm = ContextUtils.getApplicationContext().getPackageManager();
-            PackageInfo pi = pm.getPackageInfo(getPackageName(), 0);
-            msg = "";
-            if (pi.versionCode > 0) {
-                msg = Integer.toString(pi.versionCode);
-            }
-        } catch (NameNotFoundException e) {
-            Log.d(TAG, msg);
-        }
-        return msg;
-    }
-
-    @CalledByNative
-    public static String getPackageVersionName() {
-        String msg = "versionName not available";
-        try {
-            PackageManager pm = ContextUtils.getApplicationContext().getPackageManager();
-            PackageInfo pi = pm.getPackageInfo(getPackageName(), 0);
-            msg = "";
-            if (pi.versionName != null) {
-                msg = pi.versionName;
-            }
-        } catch (NameNotFoundException e) {
-            Log.d(TAG, msg);
-        }
-        return msg;
-    }
-
-    @CalledByNative
-    public static String getPackageLabel() {
-        // Third-party code does disk read on the getApplicationInfo call. http://crbug.com/614343
-        StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
-        try {
-            PackageManager packageManager =
-                    ContextUtils.getApplicationContext().getPackageManager();
-            ApplicationInfo appInfo = packageManager.getApplicationInfo(
-                    getPackageName(), PackageManager.GET_META_DATA);
-            CharSequence label = packageManager.getApplicationLabel(appInfo);
-            return label != null ? label.toString() : "";
-        } catch (NameNotFoundException e) {
-            return "";
-        } finally {
-            StrictMode.setThreadPolicy(oldPolicy);
-        }
-    }
-
-    @CalledByNative
-    public static String getPackageName() {
-        if (ContextUtils.getApplicationContext() == null) {
-            return "";
-        }
-        return ContextUtils.getApplicationContext().getPackageName();
-    }
-
-    @CalledByNative
-    public static String getBuildType() {
-        return Build.TYPE;
-    }
-
-    /**
-     * Check if this is a debuggable build of Android. Use this to enable developer-only features.
-     */
-    public static boolean isDebugAndroid() {
-        return "eng".equals(Build.TYPE) || "userdebug".equals(Build.TYPE);
-    }
-
-    @CalledByNative
-    public static int getSdkInt() {
-        return Build.VERSION.SDK_INT;
-    }
-
-    /**
-     * @return Whether the current device is running Android O release or newer.
-     */
-    public static boolean isAtLeastO() {
-        return !"REL".equals(Build.VERSION.CODENAME)
-                && ("O".equals(Build.VERSION.CODENAME) || Build.VERSION.CODENAME.startsWith("OMR"));
-    }
-
-    /**
-     * @return Whether the current app targets the SDK for at least O
-     */
-    public static boolean targetsAtLeastO(Context appContext) {
-        return isAtLeastO()
-                && appContext.getApplicationInfo().targetSdkVersion
-                == Build.VERSION_CODES.CUR_DEVELOPMENT;
-    }
-}
diff --git a/base/android/java/src/org/chromium/base/ContextUtils.java b/base/android/java/src/org/chromium/base/ContextUtils.java
deleted file mode 100644
index 448eff9..0000000
--- a/base/android/java/src/org/chromium/base/ContextUtils.java
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.base;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.base.annotations.MainDex;
-
-/**
- * This class provides Android application context related utility methods.
- */
-@JNINamespace("base::android")
-@MainDex
-public class ContextUtils {
-    private static final String TAG = "ContextUtils";
-    private static Context sApplicationContext;
-
-    /**
-     * Initialization-on-demand holder. This exists for thread-safe lazy initialization.
-     */
-    private static class Holder {
-        // Not final for tests.
-        private static SharedPreferences sSharedPreferences = fetchAppSharedPreferences();
-    }
-
-    /**
-     * Get the Android application context.
-     *
-     * Under normal circumstances there is only one application context in a process, so it's safe
-     * to treat this as a global. In WebView it's possible for more than one app using WebView to be
-     * running in a single process, but this mechanism is rarely used and this is not the only
-     * problem in that scenario, so we don't currently forbid using it as a global.
-     *
-     * Do not downcast the context returned by this method to Application (or any subclass). It may
-     * not be an Application object; it may be wrapped in a ContextWrapper. The only assumption you
-     * may make is that it is a Context whose lifetime is the same as the lifetime of the process.
-     */
-    public static Context getApplicationContext() {
-        return sApplicationContext;
-    }
-
-    /**
-     * Initializes the java application context.
-     *
-     * This should be called exactly once early on during startup, before native is loaded and
-     * before any other clients make use of the application context through this class.
-     *
-     * @param appContext The application context.
-     */
-    public static void initApplicationContext(Context appContext) {
-        // Conceding that occasionally in tests, native is loaded before the browser process is
-        // started, in which case the browser process re-sets the application context.
-        if (sApplicationContext != null && sApplicationContext != appContext) {
-            throw new RuntimeException("Attempting to set multiple global application contexts.");
-        }
-        initJavaSideApplicationContext(appContext);
-    }
-
-    /**
-     * Initialize the native Android application context to be the same as the java counter-part.
-     */
-    public static void initApplicationContextForNative() {
-        if (sApplicationContext == null) {
-            throw new RuntimeException("Cannot have native global application context be null.");
-        }
-        nativeInitNativeSideApplicationContext(sApplicationContext);
-    }
-
-    /**
-     * Only called by the static holder class and tests.
-     *
-     * @return The application-wide shared preferences.
-     */
-    private static SharedPreferences fetchAppSharedPreferences() {
-        return PreferenceManager.getDefaultSharedPreferences(sApplicationContext);
-    }
-
-    /**
-     * This is used to ensure that we always use the application context to fetch the default shared
-     * preferences. This avoids needless I/O for android N and above. It also makes it clear that
-     * the app-wide shared preference is desired, rather than the potentially context-specific one.
-     *
-     * @return application-wide shared preferences.
-     */
-    public static SharedPreferences getAppSharedPreferences() {
-        return Holder.sSharedPreferences;
-    }
-
-    /**
-     * Occasionally tests cannot ensure the application context doesn't change between tests (junit)
-     * and sometimes specific tests has its own special needs, initApplicationContext should be used
-     * as much as possible, but this method can be used to override it.
-     *
-     * @param appContext The new application context.
-     */
-    @VisibleForTesting
-    public static void initApplicationContextForTests(Context appContext) {
-        initJavaSideApplicationContext(appContext);
-        Holder.sSharedPreferences = fetchAppSharedPreferences();
-    }
-
-    private static void initJavaSideApplicationContext(Context appContext) {
-        if (appContext == null) {
-            throw new RuntimeException("Global application context cannot be set to null.");
-        }
-        sApplicationContext = appContext;
-    }
-
-    private static native void nativeInitNativeSideApplicationContext(Context appContext);
-}
diff --git a/base/android/java/src/org/chromium/base/Log.java b/base/android/java/src/org/chromium/base/Log.java
deleted file mode 100644
index 399f16d..0000000
--- a/base/android/java/src/org/chromium/base/Log.java
+++ /dev/null
@@ -1,387 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.base;
-
-import org.chromium.base.annotations.RemovableInRelease;
-
-import java.util.Locale;
-
-/**
- * Utility class for Logging.
- *
- * <p>
- * Defines logging access points for each feature. They format and forward the logs to
- * {@link android.util.Log}, allowing to standardize the output, to make it easy to identify
- * the origin of logs, and enable or disable logging in different parts of the code.
- * </p>
- * <p>
- * Usage documentation: {@code //docs/android_logging.md}.
- * </p>
- */
-public class Log {
-    /** Convenience property, same as {@link android.util.Log#ASSERT}. */
-    public static final int ASSERT = android.util.Log.ASSERT;
-
-    /** Convenience property, same as {@link android.util.Log#DEBUG}. */
-    public static final int DEBUG = android.util.Log.DEBUG;
-
-    /** Convenience property, same as {@link android.util.Log#ERROR}. */
-    public static final int ERROR = android.util.Log.ERROR;
-
-    /** Convenience property, same as {@link android.util.Log#INFO}. */
-    public static final int INFO = android.util.Log.INFO;
-
-    /** Convenience property, same as {@link android.util.Log#VERBOSE}. */
-    public static final int VERBOSE = android.util.Log.VERBOSE;
-
-    /** Convenience property, same as {@link android.util.Log#WARN}. */
-    public static final int WARN = android.util.Log.WARN;
-
-    private static final String sTagPrefix = "cr_";
-    private static final String sDeprecatedTagPrefix = "cr.";
-
-    private Log() {
-        // Static only access
-    }
-
-    /** Returns a formatted log message, using the supplied format and arguments.*/
-    private static String formatLog(String messageTemplate, Object... params) {
-        if (params != null && params.length != 0) {
-            messageTemplate = String.format(Locale.US, messageTemplate, params);
-        }
-
-        return messageTemplate;
-    }
-
-    /**
-     * Returns a normalized tag that will be in the form: "cr_foo". This function is called by the
-     * various Log overrides. If using {@link #isLoggable(String, int)}, you might want to call it
-     * to get the tag that will actually be used.
-     * @see #sTagPrefix
-     */
-    public static String normalizeTag(String tag) {
-        if (tag.startsWith(sTagPrefix)) return tag;
-
-        // TODO(dgn) simplify this once 'cr.' is out of the repo (http://crbug.com/533072)
-        int unprefixedTagStart = 0;
-        if (tag.startsWith(sDeprecatedTagPrefix)) {
-            unprefixedTagStart = sDeprecatedTagPrefix.length();
-        }
-
-        return sTagPrefix + tag.substring(unprefixedTagStart, tag.length());
-    }
-
-    /**
-     * Returns a formatted log message, using the supplied format and arguments.
-     * The message will be prepended with the filename and line number of the call.
-     */
-    private static String formatLogWithStack(String messageTemplate, Object... params) {
-        return "[" + getCallOrigin() + "] " + formatLog(messageTemplate, params);
-    }
-
-    /**
-     * Convenience function, forwards to {@link android.util.Log#isLoggable(String, int)}.
-     *
-     * Note: Has no effect on whether logs are sent or not. Use a method with
-     * {@link RemovableInRelease} to log something in Debug builds only.
-     */
-    public static boolean isLoggable(String tag, int level) {
-        return android.util.Log.isLoggable(tag, level);
-    }
-
-    /**
-     * Sends a {@link android.util.Log#VERBOSE} log message.
-     *
-     * For optimization purposes, only the fixed parameters versions are visible. If you need more
-     * than 7 parameters, consider building your log message using a function annotated with
-     * {@link RemovableInRelease}.
-     *
-     * @param tag Used to identify the source of a log message. Might be modified in the output
-     *            (see {@link #normalizeTag(String)})
-     * @param messageTemplate The message you would like logged. It is to be specified as a format
-     *                        string.
-     * @param args Arguments referenced by the format specifiers in the format string. If the last
-     *             one is a {@link Throwable}, its trace will be printed.
-     */
-    private static void verbose(String tag, String messageTemplate, Object... args) {
-        String message = formatLogWithStack(messageTemplate, args);
-        Throwable tr = getThrowableToLog(args);
-        if (tr != null) {
-            android.util.Log.v(normalizeTag(tag), message, tr);
-        } else {
-            android.util.Log.v(normalizeTag(tag), message);
-        }
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 0 args version. */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String message) {
-        verbose(tag, message);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 1 arg version. */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String messageTemplate, Object arg1) {
-        verbose(tag, messageTemplate, arg1);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 2 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String messageTemplate, Object arg1, Object arg2) {
-        verbose(tag, messageTemplate, arg1, arg2);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 3 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(
-            String tag, String messageTemplate, Object arg1, Object arg2, Object arg3) {
-        verbose(tag, messageTemplate, arg1, arg2, arg3);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 4 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4) {
-        verbose(tag, messageTemplate, arg1, arg2, arg3, arg4);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 5 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4, Object arg5) {
-        verbose(tag, messageTemplate, arg1, arg2, arg3, arg4, arg5);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 6 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4, Object arg5, Object arg6) {
-        verbose(tag, messageTemplate, arg1, arg2, arg3, arg4, arg5, arg6);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 7 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4, Object arg5, Object arg6, Object arg7) {
-        verbose(tag, messageTemplate, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
-    }
-
-    /**
-     * Sends a {@link android.util.Log#DEBUG} log message.
-     *
-     * For optimization purposes, only the fixed parameters versions are visible. If you need more
-     * than 7 parameters, consider building your log message using a function annotated with
-     * {@link RemovableInRelease}.
-     *
-     * @param tag Used to identify the source of a log message. Might be modified in the output
-     *            (see {@link #normalizeTag(String)})
-     * @param messageTemplate The message you would like logged. It is to be specified as a format
-     *                        string.
-     * @param args Arguments referenced by the format specifiers in the format string. If the last
-     *             one is a {@link Throwable}, its trace will be printed.
-     */
-    private static void debug(String tag, String messageTemplate, Object... args) {
-        String message = formatLogWithStack(messageTemplate, args);
-        Throwable tr = getThrowableToLog(args);
-        if (tr != null) {
-            android.util.Log.d(normalizeTag(tag), message, tr);
-        } else {
-            android.util.Log.d(normalizeTag(tag), message);
-        }
-    }
-
-    /** Sends a {@link android.util.Log#DEBUG} log message. 0 args version. */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String message) {
-        debug(tag, message);
-    }
-
-    /** Sends a {@link android.util.Log#DEBUG} log message. 1 arg version. */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String messageTemplate, Object arg1) {
-        debug(tag, messageTemplate, arg1);
-    }
-    /** Sends a {@link android.util.Log#DEBUG} log message. 2 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String messageTemplate, Object arg1, Object arg2) {
-        debug(tag, messageTemplate, arg1, arg2);
-    }
-    /** Sends a {@link android.util.Log#DEBUG} log message. 3 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(
-            String tag, String messageTemplate, Object arg1, Object arg2, Object arg3) {
-        debug(tag, messageTemplate, arg1, arg2, arg3);
-    }
-
-    /** Sends a {@link android.util.Log#DEBUG} log message. 4 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4) {
-        debug(tag, messageTemplate, arg1, arg2, arg3, arg4);
-    }
-
-    /** Sends a {@link android.util.Log#DEBUG} log message. 5 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4, Object arg5) {
-        debug(tag, messageTemplate, arg1, arg2, arg3, arg4, arg5);
-    }
-
-    /** Sends a {@link android.util.Log#DEBUG} log message. 6 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4, Object arg5, Object arg6) {
-        debug(tag, messageTemplate, arg1, arg2, arg3, arg4, arg5, arg6);
-    }
-
-    /** Sends a {@link android.util.Log#DEBUG} log message. 7 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4, Object arg5, Object arg6, Object arg7) {
-        debug(tag, messageTemplate, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
-    }
-
-    /**
-     * Sends an {@link android.util.Log#INFO} log message.
-     *
-     * @param tag Used to identify the source of a log message. Might be modified in the output
-     *            (see {@link #normalizeTag(String)})
-     * @param messageTemplate The message you would like logged. It is to be specified as a format
-     *                        string.
-     * @param args Arguments referenced by the format specifiers in the format string. If the last
-     *             one is a {@link Throwable}, its trace will be printed.
-     */
-    @VisibleForTesting
-    public static void i(String tag, String messageTemplate, Object... args) {
-        String message = formatLog(messageTemplate, args);
-        Throwable tr = getThrowableToLog(args);
-        if (tr != null) {
-            android.util.Log.i(normalizeTag(tag), message, tr);
-        } else {
-            android.util.Log.i(normalizeTag(tag), message);
-        }
-    }
-
-    /**
-     * Sends a {@link android.util.Log#WARN} log message.
-     *
-     * @param tag Used to identify the source of a log message. Might be modified in the output
-     *            (see {@link #normalizeTag(String)})
-     * @param messageTemplate The message you would like logged. It is to be specified as a format
-     *                        string.
-     * @param args Arguments referenced by the format specifiers in the format string. If the last
-     *             one is a {@link Throwable}, its trace will be printed.
-     */
-    @VisibleForTesting
-    public static void w(String tag, String messageTemplate, Object... args) {
-        String message = formatLog(messageTemplate, args);
-        Throwable tr = getThrowableToLog(args);
-        if (tr != null) {
-            android.util.Log.w(normalizeTag(tag), message, tr);
-        } else {
-            android.util.Log.w(normalizeTag(tag), message);
-        }
-    }
-
-    /**
-     * Sends an {@link android.util.Log#ERROR} log message.
-     *
-     * @param tag Used to identify the source of a log message. Might be modified in the output
-     *            (see {@link #normalizeTag(String)})
-     * @param messageTemplate The message you would like logged. It is to be specified as a format
-     *                        string.
-     * @param args Arguments referenced by the format specifiers in the format string. If the last
-     *             one is a {@link Throwable}, its trace will be printed.
-     */
-    @VisibleForTesting
-    public static void e(String tag, String messageTemplate, Object... args) {
-        String message = formatLog(messageTemplate, args);
-        Throwable tr = getThrowableToLog(args);
-        if (tr != null) {
-            android.util.Log.e(normalizeTag(tag), message, tr);
-        } else {
-            android.util.Log.e(normalizeTag(tag), message);
-        }
-    }
-
-    /**
-     * What a Terrible Failure: Used for conditions that should never happen, and logged at
-     * the {@link android.util.Log#ASSERT} level. Depending on the configuration, it might
-     * terminate the process.
-     *
-     * @see android.util.Log#wtf(String, String, Throwable)
-     *
-     * @param tag Used to identify the source of a log message. Might be modified in the output
-     *            (see {@link #normalizeTag(String)})
-     * @param messageTemplate The message you would like logged. It is to be specified as a format
-     *                        string.
-     * @param args Arguments referenced by the format specifiers in the format string. If the last
-     *             one is a {@link Throwable}, its trace will be printed.
-     */
-    @VisibleForTesting
-    public static void wtf(String tag, String messageTemplate, Object... args) {
-        String message = formatLog(messageTemplate, args);
-        Throwable tr = getThrowableToLog(args);
-        if (tr != null) {
-            android.util.Log.wtf(normalizeTag(tag), message, tr);
-        } else {
-            android.util.Log.wtf(normalizeTag(tag), message);
-        }
-    }
-
-    /** Handy function to get a loggable stack trace from a Throwable. */
-    public static String getStackTraceString(Throwable tr) {
-        return android.util.Log.getStackTraceString(tr);
-    }
-
-    private static Throwable getThrowableToLog(Object[] args) {
-        if (args == null || args.length == 0) return null;
-
-        Object lastArg = args[args.length - 1];
-
-        if (!(lastArg instanceof Throwable)) return null;
-        return (Throwable) lastArg;
-    }
-
-    /** Returns a string form of the origin of the log call, to be used as secondary tag.*/
-    private static String getCallOrigin() {
-        StackTraceElement[] st = Thread.currentThread().getStackTrace();
-
-        // The call stack should look like:
-        //   n [a variable number of calls depending on the vm used]
-        //  +0 getCallOrigin()
-        //  +1 privateLogFunction: verbose or debug
-        //  +2 formatLogWithStack()
-        //  +3 logFunction: v or d
-        //  +4 caller
-
-        int callerStackIndex;
-        String logClassName = Log.class.getName();
-        for (callerStackIndex = 0; callerStackIndex < st.length; callerStackIndex++) {
-            if (st[callerStackIndex].getClassName().equals(logClassName)) {
-                callerStackIndex += 4;
-                break;
-            }
-        }
-
-        return st[callerStackIndex].getFileName() + ":" + st[callerStackIndex].getLineNumber();
-    }
-}
diff --git a/base/android/java/src/org/chromium/base/PackageUtils.java b/base/android/java/src/org/chromium/base/PackageUtils.java
deleted file mode 100644
index ab554cd..0000000
--- a/base/android/java/src/org/chromium/base/PackageUtils.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.base;
-
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-
-/**
- * This class provides package checking related methods.
- */
-public class PackageUtils {
-    /**
-     * Retrieves the version of the given package installed on the device.
-     *
-     * @param context Any context.
-     * @param packageName Name of the package to find.
-     * @return The package's version code if found, -1 otherwise.
-     */
-    public static int getPackageVersion(Context context, String packageName) {
-        int versionCode = -1;
-        PackageManager pm = context.getPackageManager();
-        try {
-            PackageInfo packageInfo = pm.getPackageInfo(packageName, 0);
-            if (packageInfo != null) versionCode = packageInfo.versionCode;
-        } catch (PackageManager.NameNotFoundException e) {
-            // Do nothing, versionCode stays -1
-        }
-        return versionCode;
-    }
-
-    private PackageUtils() {
-        // Hide constructor
-    }
-}
diff --git a/base/android/java/src/org/chromium/base/VisibleForTesting.java b/base/android/java/src/org/chromium/base/VisibleForTesting.java
deleted file mode 100644
index 24cbfad..0000000
--- a/base/android/java/src/org/chromium/base/VisibleForTesting.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base;
-
-/**
- * Annotation used to mark code that has wider visibility or present for testing code.
- */
-public @interface VisibleForTesting {
-
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/AccessedByNative.java b/base/android/java/src/org/chromium/base/annotations/AccessedByNative.java
deleted file mode 100644
index 6df7c11..0000000
--- a/base/android/java/src/org/chromium/base/annotations/AccessedByNative.java
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2012 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- *  @AccessedByNative is used to ensure proguard will keep this field, since it's
- *  only accessed by native.
- */
-@Target(ElementType.FIELD)
-@Retention(RetentionPolicy.CLASS)
-public @interface AccessedByNative {
-    public String value() default "";
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/CalledByNative.java b/base/android/java/src/org/chromium/base/annotations/CalledByNative.java
deleted file mode 100644
index 94ef3fa..0000000
--- a/base/android/java/src/org/chromium/base/annotations/CalledByNative.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2012 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @CalledByNative is used by the JNI generator to create the necessary JNI
- * bindings and expose this method to native code.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.CLASS)
-public @interface CalledByNative {
-    /*
-     *  If present, tells which inner class the method belongs to.
-     */
-    public String value() default "";
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java b/base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java
deleted file mode 100644
index c0abcbe..0000000
--- a/base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2012 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- *  @CalledByNativeUnchecked is used to generate JNI bindings that do not check for exceptions.
- *  It only makes sense to use this annotation on methods that declare a throws... spec.
- *  However, note that the exception received native side maybe an 'unchecked' (RuntimeExpception)
- *  such as NullPointerException, so the native code should differentiate these cases.
- *  Usage of this should be very rare; where possible handle exceptions in the Java side and use a
- *  return value to indicate success / failure.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.CLASS)
-public @interface CalledByNativeUnchecked {
-    /*
-     *  If present, tells which inner class the method belongs to.
-     */
-    public String value() default "";
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java b/base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java
deleted file mode 100644
index f1bf85e..0000000
--- a/base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * JNIAdditionalImport is used by the JNI generator to qualify inner types used on JNI methods. Must
- * be used when an inner class is used from a class within the same package. Example:
- *
- * <pre>
- * @JNIAdditionImport(Foo.class)
- * public class Bar {
- *     @CalledByNative static void doSomethingWithInner(Foo.Inner inner) {
- *     ...
- *     }
- * }
- * <pre>
- * <p>
- * Notes:
- * 1) Foo must be in the same package as Bar
- * 2) For classes in different packages, they should be imported as:
- *    import other.package.Foo;
- *    and this annotation should not be used.
- */
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface JNIAdditionalImport {
-    Class<?>[] value();
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/JNINamespace.java b/base/android/java/src/org/chromium/base/annotations/JNINamespace.java
deleted file mode 100644
index 4cd5531..0000000
--- a/base/android/java/src/org/chromium/base/annotations/JNINamespace.java
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2012 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @JNINamespace is used by the JNI generator to create the necessary JNI
- * bindings and expose this method to native code using the specified namespace.
- */
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface JNINamespace {
-    public String value();
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/MainDex.java b/base/android/java/src/org/chromium/base/annotations/MainDex.java
deleted file mode 100644
index 0b35ade..0000000
--- a/base/android/java/src/org/chromium/base/annotations/MainDex.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * An annotation that signals that a class should be kept in the main dex file.
- *
- * This generally means it's used by renderer processes, which can't load secondary dexes
- * on K and below.
- */
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface MainDex {
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/NativeCall.java b/base/android/java/src/org/chromium/base/annotations/NativeCall.java
deleted file mode 100644
index b69cd17..0000000
--- a/base/android/java/src/org/chromium/base/annotations/NativeCall.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @NativeCall is used by the JNI generator to create the necessary JNI bindings
- * so a native function can be bound to a Java inner class. The native class for
- * which the JNI method will be generated is specified by the first parameter.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.CLASS)
-public @interface NativeCall {
-    /*
-     * Value determines which native class the method should map to.
-     */
-    public String value() default "";
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java b/base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java
deleted file mode 100644
index afbc368..0000000
--- a/base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2012 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @NativeClassQualifiedName is used by the JNI generator to create the necessary JNI
- * bindings to call into the specified native class name.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface NativeClassQualifiedName {
-    /*
-     * Tells which native class the method is going to be bound to.
-     * The first parameter of the annotated method must be an int nativePtr pointing to
-     * an instance of this class.
-     */
-    public String value();
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/RemovableInRelease.java b/base/android/java/src/org/chromium/base/annotations/RemovableInRelease.java
deleted file mode 100644
index 2191334..0000000
--- a/base/android/java/src/org/chromium/base/annotations/RemovableInRelease.java
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-
-/**
- * The annotated function can be removed in release builds.
- *
- * Calls to this function will be removed if its return value is not used. If all calls are removed,
- * the function definition itself will be candidate for removal.
- * It works by indicating to Proguard that the function has no side effects.
- */
-@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
-public @interface RemovableInRelease {}
diff --git a/base/android/java/src/org/chromium/base/annotations/SuppressFBWarnings.java b/base/android/java/src/org/chromium/base/annotations/SuppressFBWarnings.java
deleted file mode 100644
index 89068ac..0000000
--- a/base/android/java/src/org/chromium/base/annotations/SuppressFBWarnings.java
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- *  @SuppressFBWarnings is used to suppress FindBugs warnings.
- *
- *  The long name of FindBugs warnings can be found at
- *  http://findbugs.sourceforge.net/bugDescriptions.html
- */
-@Retention(RetentionPolicy.CLASS)
-public @interface SuppressFBWarnings {
-    String[] value() default {};
-    String justification() default "";
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/UsedByReflection.java b/base/android/java/src/org/chromium/base/annotations/UsedByReflection.java
deleted file mode 100644
index a2af704..0000000
--- a/base/android/java/src/org/chromium/base/annotations/UsedByReflection.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-
-/**
- * Annotation used for marking methods and fields that are called by reflection.
- * Useful for keeping components that would otherwise be removed by Proguard.
- * Use the value parameter to mention a file that calls this method.
- *
- * Note that adding this annotation to a method is not enough to guarantee that
- * it is kept - either its class must be referenced elsewhere in the program, or
- * the class must be annotated with this as well.
- */
-@Target({
-        ElementType.METHOD, ElementType.FIELD, ElementType.TYPE,
-        ElementType.CONSTRUCTOR })
-public @interface UsedByReflection {
-    String value();
-}
diff --git a/base/android/java_runtime.cc b/base/android/java_runtime.cc
deleted file mode 100644
index 5fae49a..0000000
--- a/base/android/java_runtime.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2015 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/android/java_runtime.h"
-
-#include "jni/Runtime_jni.h"
-
-namespace base {
-namespace android {
-
-void JavaRuntime::GetMemoryUsage(long* total_memory, long* free_memory) {
-  JNIEnv* env = base::android::AttachCurrentThread();
-  base::android::ScopedJavaLocalRef<jobject> runtime =
-      JNI_Runtime::Java_Runtime_getRuntime(env);
-  *total_memory = JNI_Runtime::Java_Runtime_totalMemory(env, runtime);
-  *free_memory = JNI_Runtime::Java_Runtime_freeMemory(env, runtime);
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/java_runtime.h b/base/android/java_runtime.h
deleted file mode 100644
index 2034fb9..0000000
--- a/base/android/java_runtime.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2015 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_JAVA_RUNTIME_H_
-#define BASE_ANDROID_JAVA_RUNTIME_H_
-
-#include "base/android/scoped_java_ref.h"
-#include "base/base_export.h"
-
-namespace base {
-namespace android {
-
-// Wrapper class for using the java.lang.Runtime object from jni.
-class BASE_EXPORT JavaRuntime {
- public:
-  // Fills the total memory used and memory allocated for objects by the java
-  // heap in the current process. Returns true on success.
-  static void GetMemoryUsage(long* total_memory, long* free_memory);
-};
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_JAVA_RUNTIME_H_
diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc
deleted file mode 100644
index 2b5869f..0000000
--- a/base/android/jni_android.cc
+++ /dev/null
@@ -1,320 +0,0 @@
-// Copyright (c) 2012 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/android/jni_android.h"
-
-#include <stddef.h>
-
-#include <map>
-
-#include "base/android/build_info.h"
-#include "base/android/jni_string.h"
-// Removed unused headers. TODO(hidehiko): Upstream.
-// #include "base/android/jni_utils.h"
-#include "base/debug/debugging_flags.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/threading/thread_local.h"
-
-namespace {
-using base::android::GetClass;
-using base::android::MethodID;
-using base::android::ScopedJavaLocalRef;
-
-base::android::JniRegistrationType g_jni_registration_type =
-    base::android::ALL_JNI_REGISTRATION;
-
-JavaVM* g_jvm = NULL;
-base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject>>::Leaky
-    g_class_loader = LAZY_INSTANCE_INITIALIZER;
-jmethodID g_class_loader_load_class_method_id = 0;
-
-#if BUILDFLAG(ENABLE_PROFILING) && HAVE_TRACE_STACK_FRAME_POINTERS
-base::LazyInstance<base::ThreadLocalPointer<void>>::Leaky
-    g_stack_frame_pointer = LAZY_INSTANCE_INITIALIZER;
-#endif
-
-}  // namespace
-
-namespace base {
-namespace android {
-
-JniRegistrationType GetJniRegistrationType() {
-  return g_jni_registration_type;
-}
-
-void SetJniRegistrationType(JniRegistrationType jni_registration_type) {
-  g_jni_registration_type = jni_registration_type;
-}
-
-JNIEnv* AttachCurrentThread() {
-  DCHECK(g_jvm);
-  JNIEnv* env = NULL;
-  jint ret = g_jvm->AttachCurrentThread(&env, NULL);
-  DCHECK_EQ(JNI_OK, ret);
-  return env;
-}
-
-JNIEnv* AttachCurrentThreadWithName(const std::string& thread_name) {
-  DCHECK(g_jvm);
-  JavaVMAttachArgs args;
-  args.version = JNI_VERSION_1_2;
-  args.name = thread_name.c_str();
-  args.group = NULL;
-  JNIEnv* env = NULL;
-  jint ret = g_jvm->AttachCurrentThread(&env, &args);
-  DCHECK_EQ(JNI_OK, ret);
-  return env;
-}
-
-void DetachFromVM() {
-  // Ignore the return value, if the thread is not attached, DetachCurrentThread
-  // will fail. But it is ok as the native thread may never be attached.
-  if (g_jvm)
-    g_jvm->DetachCurrentThread();
-}
-
-void InitVM(JavaVM* vm) {
-  DCHECK(!g_jvm || g_jvm == vm);
-  g_jvm = vm;
-}
-
-bool IsVMInitialized() {
-  return g_jvm != NULL;
-}
-
-void InitReplacementClassLoader(JNIEnv* env,
-                                const JavaRef<jobject>& class_loader) {
-  DCHECK(g_class_loader.Get().is_null());
-  DCHECK(!class_loader.is_null());
-
-  ScopedJavaLocalRef<jclass> class_loader_clazz =
-      GetClass(env, "java/lang/ClassLoader");
-  CHECK(!ClearException(env));
-  g_class_loader_load_class_method_id =
-      env->GetMethodID(class_loader_clazz.obj(),
-                       "loadClass",
-                       "(Ljava/lang/String;)Ljava/lang/Class;");
-  CHECK(!ClearException(env));
-
-  DCHECK(env->IsInstanceOf(class_loader.obj(), class_loader_clazz.obj()));
-  g_class_loader.Get().Reset(class_loader);
-}
-
-ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env, const char* class_name) {
-  jclass clazz;
-  if (!g_class_loader.Get().is_null()) {
-    // ClassLoader.loadClass expects a classname with components separated by
-    // dots instead of the slashes that JNIEnv::FindClass expects. The JNI
-    // generator generates names with slashes, so we have to replace them here.
-    // TODO(torne): move to an approach where we always use ClassLoader except
-    // for the special case of base::android::GetClassLoader(), and change the
-    // JNI generator to generate dot-separated names. http://crbug.com/461773
-    size_t bufsize = strlen(class_name) + 1;
-    char dotted_name[bufsize];
-    memmove(dotted_name, class_name, bufsize);
-    for (size_t i = 0; i < bufsize; ++i) {
-      if (dotted_name[i] == '/') {
-        dotted_name[i] = '.';
-      }
-    }
-
-    clazz = static_cast<jclass>(
-        env->CallObjectMethod(g_class_loader.Get().obj(),
-                              g_class_loader_load_class_method_id,
-                              ConvertUTF8ToJavaString(env, dotted_name).obj()));
-  } else {
-    clazz = env->FindClass(class_name);
-  }
-  if (ClearException(env) || !clazz) {
-    LOG(FATAL) << "Failed to find class " << class_name;
-  }
-  return ScopedJavaLocalRef<jclass>(env, clazz);
-}
-
-jclass LazyGetClass(
-    JNIEnv* env,
-    const char* class_name,
-    base::subtle::AtomicWord* atomic_class_id) {
-  static_assert(sizeof(subtle::AtomicWord) >= sizeof(jclass),
-                "AtomicWord can't be smaller than jclass");
-  subtle::AtomicWord value = base::subtle::Acquire_Load(atomic_class_id);
-  if (value)
-    return reinterpret_cast<jclass>(value);
-  ScopedJavaGlobalRef<jclass> clazz;
-  clazz.Reset(GetClass(env, class_name));
-  subtle::AtomicWord null_aw = reinterpret_cast<subtle::AtomicWord>(NULL);
-  subtle::AtomicWord cas_result = base::subtle::Release_CompareAndSwap(
-      atomic_class_id,
-      null_aw,
-      reinterpret_cast<subtle::AtomicWord>(clazz.obj()));
-  if (cas_result == null_aw) {
-    // We intentionally leak the global ref since we now storing it as a raw
-    // pointer in |atomic_class_id|.
-    return clazz.Release();
-  } else {
-    return reinterpret_cast<jclass>(cas_result);
-  }
-}
-
-template<MethodID::Type type>
-jmethodID MethodID::Get(JNIEnv* env,
-                        jclass clazz,
-                        const char* method_name,
-                        const char* jni_signature) {
-  jmethodID id = type == TYPE_STATIC ?
-      env->GetStaticMethodID(clazz, method_name, jni_signature) :
-      env->GetMethodID(clazz, method_name, jni_signature);
-  if (base::android::ClearException(env) || !id) {
-    LOG(FATAL) << "Failed to find " <<
-        (type == TYPE_STATIC ? "static " : "") <<
-        "method " << method_name << " " << jni_signature;
-  }
-  return id;
-}
-
-// If |atomic_method_id| set, it'll return immediately. Otherwise, it'll call
-// into ::Get() above. If there's a race, it's ok since the values are the same
-// (and the duplicated effort will happen only once).
-template<MethodID::Type type>
-jmethodID MethodID::LazyGet(JNIEnv* env,
-                            jclass clazz,
-                            const char* method_name,
-                            const char* jni_signature,
-                            base::subtle::AtomicWord* atomic_method_id) {
-  static_assert(sizeof(subtle::AtomicWord) >= sizeof(jmethodID),
-                "AtomicWord can't be smaller than jMethodID");
-  subtle::AtomicWord value = base::subtle::Acquire_Load(atomic_method_id);
-  if (value)
-    return reinterpret_cast<jmethodID>(value);
-  jmethodID id = MethodID::Get<type>(env, clazz, method_name, jni_signature);
-  base::subtle::Release_Store(
-      atomic_method_id, reinterpret_cast<subtle::AtomicWord>(id));
-  return id;
-}
-
-// Various template instantiations.
-template jmethodID MethodID::Get<MethodID::TYPE_STATIC>(
-    JNIEnv* env, jclass clazz, const char* method_name,
-    const char* jni_signature);
-
-template jmethodID MethodID::Get<MethodID::TYPE_INSTANCE>(
-    JNIEnv* env, jclass clazz, const char* method_name,
-    const char* jni_signature);
-
-template jmethodID MethodID::LazyGet<MethodID::TYPE_STATIC>(
-    JNIEnv* env, jclass clazz, const char* method_name,
-    const char* jni_signature, base::subtle::AtomicWord* atomic_method_id);
-
-template jmethodID MethodID::LazyGet<MethodID::TYPE_INSTANCE>(
-    JNIEnv* env, jclass clazz, const char* method_name,
-    const char* jni_signature, base::subtle::AtomicWord* atomic_method_id);
-
-bool HasException(JNIEnv* env) {
-  return env->ExceptionCheck() != JNI_FALSE;
-}
-
-bool ClearException(JNIEnv* env) {
-  if (!HasException(env))
-    return false;
-  env->ExceptionDescribe();
-  env->ExceptionClear();
-  return true;
-}
-
-void CheckException(JNIEnv* env) {
-  if (!HasException(env))
-    return;
-
-  // Exception has been found, might as well tell breakpad about it.
-  jthrowable java_throwable = env->ExceptionOccurred();
-  if (java_throwable) {
-    // Clear the pending exception, since a local reference is now held.
-    env->ExceptionDescribe();
-    env->ExceptionClear();
-
-    // Set the exception_string in BuildInfo so that breakpad can read it.
-    // RVO should avoid any extra copies of the exception string.
-    base::android::BuildInfo::GetInstance()->SetJavaExceptionInfo(
-        GetJavaExceptionInfo(env, java_throwable));
-  }
-
-  // Now, feel good about it and die.
-  // TODO(lhchavez): Remove this hack. See b/28814913 for details.
-  // We're using BuildInfo's java_exception_info() instead of storing the
-  // exception info a few lines above to avoid extra copies. It will be
-  // truncated to 1024 bytes anyways.
-  const char* exception_string =
-      base::android::BuildInfo::GetInstance()->java_exception_info();
-  if (exception_string)
-    LOG(FATAL) << exception_string;
-  else
-    LOG(FATAL) << "Unhandled exception";
-}
-
-std::string GetJavaExceptionInfo(JNIEnv* env, jthrowable java_throwable) {
-  ScopedJavaLocalRef<jclass> throwable_clazz =
-      GetClass(env, "java/lang/Throwable");
-  jmethodID throwable_printstacktrace =
-      MethodID::Get<MethodID::TYPE_INSTANCE>(
-          env, throwable_clazz.obj(), "printStackTrace",
-          "(Ljava/io/PrintStream;)V");
-
-  // Create an instance of ByteArrayOutputStream.
-  ScopedJavaLocalRef<jclass> bytearray_output_stream_clazz =
-      GetClass(env, "java/io/ByteArrayOutputStream");
-  jmethodID bytearray_output_stream_constructor =
-      MethodID::Get<MethodID::TYPE_INSTANCE>(
-          env, bytearray_output_stream_clazz.obj(), "<init>", "()V");
-  jmethodID bytearray_output_stream_tostring =
-      MethodID::Get<MethodID::TYPE_INSTANCE>(
-          env, bytearray_output_stream_clazz.obj(), "toString",
-          "()Ljava/lang/String;");
-  ScopedJavaLocalRef<jobject> bytearray_output_stream(env,
-      env->NewObject(bytearray_output_stream_clazz.obj(),
-                     bytearray_output_stream_constructor));
-
-  // Create an instance of PrintStream.
-  ScopedJavaLocalRef<jclass> printstream_clazz =
-      GetClass(env, "java/io/PrintStream");
-  jmethodID printstream_constructor =
-      MethodID::Get<MethodID::TYPE_INSTANCE>(
-          env, printstream_clazz.obj(), "<init>",
-          "(Ljava/io/OutputStream;)V");
-  ScopedJavaLocalRef<jobject> printstream(env,
-      env->NewObject(printstream_clazz.obj(), printstream_constructor,
-                     bytearray_output_stream.obj()));
-
-  // Call Throwable.printStackTrace(PrintStream)
-  env->CallVoidMethod(java_throwable, throwable_printstacktrace,
-      printstream.obj());
-
-  // Call ByteArrayOutputStream.toString()
-  ScopedJavaLocalRef<jstring> exception_string(
-      env, static_cast<jstring>(
-          env->CallObjectMethod(bytearray_output_stream.obj(),
-                                bytearray_output_stream_tostring)));
-
-  return ConvertJavaStringToUTF8(exception_string);
-}
-
-#if BUILDFLAG(ENABLE_PROFILING) && HAVE_TRACE_STACK_FRAME_POINTERS
-
-JNIStackFrameSaver::JNIStackFrameSaver(void* current_fp) {
-  previous_fp_ = g_stack_frame_pointer.Pointer()->Get();
-  g_stack_frame_pointer.Pointer()->Set(current_fp);
-}
-
-JNIStackFrameSaver::~JNIStackFrameSaver() {
-  g_stack_frame_pointer.Pointer()->Set(previous_fp_);
-}
-
-void* JNIStackFrameSaver::SavedFrame() {
-  return g_stack_frame_pointer.Pointer()->Get();
-}
-
-#endif  // ENABLE_PROFILING && HAVE_TRACE_STACK_FRAME_POINTERS
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/jni_android.h b/base/android/jni_android.h
deleted file mode 100644
index de53c10..0000000
--- a/base/android/jni_android.h
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright (c) 2012 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_JNI_ANDROID_H_
-#define BASE_ANDROID_JNI_ANDROID_H_
-
-#include <jni.h>
-#include <sys/types.h>
-
-#include <string>
-
-#include "base/android/scoped_java_ref.h"
-#include "base/atomicops.h"
-#include "base/base_export.h"
-#include "base/compiler_specific.h"
-#include "base/debug/stack_trace.h"
-#include "base/macros.h"
-
-#if HAVE_TRACE_STACK_FRAME_POINTERS
-
-// When profiling is enabled (enable_profiling=true) this macro is added to
-// all generated JNI stubs so that it becomes the last thing that runs before
-// control goes into Java.
-//
-// This macro saves stack frame pointer of the current function. Saved value
-// used later by JNI_LINK_SAVED_FRAME_POINTER.
-#define JNI_SAVE_FRAME_POINTER \
-  base::android::JNIStackFrameSaver jni_frame_saver(__builtin_frame_address(0))
-
-// When profiling is enabled (enable_profiling=true) this macro is added to
-// all generated JNI callbacks so that it becomes the first thing that runs
-// after control returns from Java.
-//
-// This macro links stack frame of the current function to the stack frame
-// saved by JNI_SAVE_FRAME_POINTER, allowing frame-based unwinding
-// (used by the heap profiler) to produce complete traces.
-#define JNI_LINK_SAVED_FRAME_POINTER                    \
-  base::debug::ScopedStackFrameLinker jni_frame_linker( \
-      __builtin_frame_address(0),                       \
-      base::android::JNIStackFrameSaver::SavedFrame())
-
-#else
-
-// Frame-based stack unwinding is not supported, do nothing.
-#define JNI_SAVE_FRAME_POINTER
-#define JNI_LINK_SAVED_FRAME_POINTER
-
-#endif  // HAVE_TRACE_STACK_FRAME_POINTERS
-
-namespace base {
-namespace android {
-
-// Used to mark symbols to be exported in a shared library's symbol table.
-#define JNI_EXPORT __attribute__ ((visibility("default")))
-
-// The level of JNI registration required for the current process.
-enum JniRegistrationType {
-  // Register all native methods.
-  ALL_JNI_REGISTRATION,
-  // Register some native methods, as controlled by the jni_generator.
-  SELECTIVE_JNI_REGISTRATION,
-  // Do not register any native methods.
-  NO_JNI_REGISTRATION,
-};
-
-BASE_EXPORT JniRegistrationType GetJniRegistrationType();
-
-// Set the JniRegistrationType for this process (defaults to
-// ALL_JNI_REGISTRATION). This should be called in the JNI_OnLoad function
-// which is called when the native library is first loaded.
-BASE_EXPORT void SetJniRegistrationType(
-    JniRegistrationType jni_registration_type);
-
-// Contains the registration method information for initializing JNI bindings.
-struct RegistrationMethod {
-  const char* name;
-  bool (*func)(JNIEnv* env);
-};
-
-// Attaches the current thread to the VM (if necessary) and return the JNIEnv*.
-BASE_EXPORT JNIEnv* AttachCurrentThread();
-
-// Same to AttachCurrentThread except that thread name will be set to
-// |thread_name| if it is the first call. Otherwise, thread_name won't be
-// changed. AttachCurrentThread() doesn't regard underlying platform thread
-// name, but just resets it to "Thread-???". This function should be called
-// right after new thread is created if it is important to keep thread name.
-BASE_EXPORT JNIEnv* AttachCurrentThreadWithName(const std::string& thread_name);
-
-// Detaches the current thread from VM if it is attached.
-BASE_EXPORT void DetachFromVM();
-
-// Initializes the global JVM.
-BASE_EXPORT void InitVM(JavaVM* vm);
-
-// Returns true if the global JVM has been initialized.
-BASE_EXPORT bool IsVMInitialized();
-
-// Initializes the global ClassLoader used by the GetClass and LazyGetClass
-// methods. This is needed because JNI will use the base ClassLoader when there
-// is no Java code on the stack. The base ClassLoader doesn't know about any of
-// the application classes and will fail to lookup anything other than system
-// classes.
-BASE_EXPORT void InitReplacementClassLoader(
-    JNIEnv* env,
-    const JavaRef<jobject>& class_loader);
-
-// Finds the class named |class_name| and returns it.
-// Use this method instead of invoking directly the JNI FindClass method (to
-// prevent leaking local references).
-// This method triggers a fatal assertion if the class could not be found.
-// Use HasClass if you need to check whether the class exists.
-BASE_EXPORT ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env,
-                                                const char* class_name);
-
-// The method will initialize |atomic_class_id| to contain a global ref to the
-// class. And will return that ref on subsequent calls.  It's the caller's
-// responsibility to release the ref when it is no longer needed.
-// The caller is responsible to zero-initialize |atomic_method_id|.
-// It's fine to simultaneously call this on multiple threads referencing the
-// same |atomic_method_id|.
-BASE_EXPORT jclass LazyGetClass(
-    JNIEnv* env,
-    const char* class_name,
-    base::subtle::AtomicWord* atomic_class_id);
-
-// This class is a wrapper for JNIEnv Get(Static)MethodID.
-class BASE_EXPORT MethodID {
- public:
-  enum Type {
-    TYPE_STATIC,
-    TYPE_INSTANCE,
-  };
-
-  // Returns the method ID for the method with the specified name and signature.
-  // This method triggers a fatal assertion if the method could not be found.
-  template<Type type>
-  static jmethodID Get(JNIEnv* env,
-                       jclass clazz,
-                       const char* method_name,
-                       const char* jni_signature);
-
-  // The caller is responsible to zero-initialize |atomic_method_id|.
-  // It's fine to simultaneously call this on multiple threads referencing the
-  // same |atomic_method_id|.
-  template<Type type>
-  static jmethodID LazyGet(JNIEnv* env,
-                           jclass clazz,
-                           const char* method_name,
-                           const char* jni_signature,
-                           base::subtle::AtomicWord* atomic_method_id);
-};
-
-// Returns true if an exception is pending in the provided JNIEnv*.
-BASE_EXPORT bool HasException(JNIEnv* env);
-
-// If an exception is pending in the provided JNIEnv*, this function clears it
-// and returns true.
-BASE_EXPORT bool ClearException(JNIEnv* env);
-
-// This function will call CHECK() macro if there's any pending exception.
-BASE_EXPORT void CheckException(JNIEnv* env);
-
-// This returns a string representation of the java stack trace.
-BASE_EXPORT std::string GetJavaExceptionInfo(JNIEnv* env,
-                                             jthrowable java_throwable);
-
-#if HAVE_TRACE_STACK_FRAME_POINTERS
-
-// Saves caller's PC and stack frame in a thread-local variable.
-// Implemented only when profiling is enabled (enable_profiling=true).
-class BASE_EXPORT JNIStackFrameSaver {
- public:
-  JNIStackFrameSaver(void* current_fp);
-  ~JNIStackFrameSaver();
-  static void* SavedFrame();
-
- private:
-  void* previous_fp_;
-
-  DISALLOW_COPY_AND_ASSIGN(JNIStackFrameSaver);
-};
-
-#endif  // HAVE_TRACE_STACK_FRAME_POINTERS
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_JNI_ANDROID_H_
diff --git a/base/android/jni_android_unittest.cc b/base/android/jni_android_unittest.cc
deleted file mode 100644
index dabd480..0000000
--- a/base/android/jni_android_unittest.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2012 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/android/jni_android.h"
-
-#include "base/at_exit.h"
-#include "base/logging.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace android {
-
-namespace {
-
-base::subtle::AtomicWord g_atomic_id = 0;
-int LazyMethodIDCall(JNIEnv* env, jclass clazz, int p) {
-  jmethodID id = base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, clazz,
-      "abs",
-      "(I)I",
-      &g_atomic_id);
-
-  return env->CallStaticIntMethod(clazz, id, p);
-}
-
-int MethodIDCall(JNIEnv* env, jclass clazz, jmethodID id, int p) {
-  return env->CallStaticIntMethod(clazz, id, p);
-}
-
-}  // namespace
-
-TEST(JNIAndroidMicrobenchmark, MethodId) {
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jclass> clazz(GetClass(env, "java/lang/Math"));
-  base::Time start_lazy = base::Time::Now();
-  int o = 0;
-  for (int i = 0; i < 1024; ++i)
-    o += LazyMethodIDCall(env, clazz.obj(), i);
-  base::Time end_lazy = base::Time::Now();
-
-  jmethodID id = reinterpret_cast<jmethodID>(g_atomic_id);
-  base::Time start = base::Time::Now();
-  for (int i = 0; i < 1024; ++i)
-    o += MethodIDCall(env, clazz.obj(), id, i);
-  base::Time end = base::Time::Now();
-
-  // On a Galaxy Nexus, results were in the range of:
-  // JNI LazyMethodIDCall (us) 1984
-  // JNI MethodIDCall (us) 1861
-  LOG(ERROR) << "JNI LazyMethodIDCall (us) " <<
-      base::TimeDelta(end_lazy - start_lazy).InMicroseconds();
-  LOG(ERROR) << "JNI MethodIDCall (us) " <<
-      base::TimeDelta(end - start).InMicroseconds();
-  LOG(ERROR) << "JNI " << o;
-}
-
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/jni_generator/android_jar.classes b/base/android/jni_generator/android_jar.classes
deleted file mode 100644
index 7d412ce..0000000
--- a/base/android/jni_generator/android_jar.classes
+++ /dev/null
@@ -1,98 +0,0 @@
-java/lang/AbstractMethodError.class
-java/lang/AbstractStringBuilder.class
-java/lang/Appendable.class
-java/lang/ArithmeticException.class
-java/lang/ArrayIndexOutOfBoundsException.class
-java/lang/ArrayStoreException.class
-java/lang/AssertionError.class
-java/lang/AutoCloseable.class
-java/lang/Boolean.class
-java/lang/Byte.class
-java/lang/Character.class
-java/lang/Character$Subset.class
-java/lang/Character$UnicodeBlock.class
-java/lang/CharSequence.class
-java/lang/ClassCastException.class
-java/lang/ClassCircularityError.class
-java/lang/Class.class
-java/lang/ClassFormatError.class
-java/lang/ClassLoader.class
-java/lang/ClassNotFoundException.class
-java/lang/Cloneable.class
-java/lang/CloneNotSupportedException.class
-java/lang/Comparable.class
-java/lang/Compiler.class
-java/lang/Deprecated.class
-java/lang/Double.class
-java/lang/Enum.class
-java/lang/EnumConstantNotPresentException.class
-java/lang/Error.class
-java/lang/Exception.class
-java/lang/ExceptionInInitializerError.class
-java/lang/Float.class
-java/lang/IllegalAccessError.class
-java/lang/IllegalAccessException.class
-java/lang/IllegalArgumentException.class
-java/lang/IllegalMonitorStateException.class
-java/lang/IllegalStateException.class
-java/lang/IncompatibleClassChangeError.class
-java/lang/IndexOutOfBoundsException.class
-java/lang/InheritableThreadLocal.class
-java/lang/InstantiationError.class
-java/lang/InstantiationException.class
-java/lang/Integer.class
-java/lang/InternalError.class
-java/lang/InterruptedException.class
-java/lang/Iterable.class
-java/lang/LinkageError.class
-java/lang/Long.class
-java/lang/Math.class
-java/lang/NegativeArraySizeException.class
-java/lang/NoClassDefFoundError.class
-java/lang/NoSuchFieldError.class
-java/lang/NoSuchFieldException.class
-java/lang/NoSuchMethodError.class
-java/lang/NoSuchMethodException.class
-java/lang/NullPointerException.class
-java/lang/Number.class
-java/lang/NumberFormatException.class
-java/lang/Object.class
-java/lang/OutOfMemoryError.class
-java/lang/Override.class
-java/lang/Package.class
-java/lang/ProcessBuilder.class
-java/lang/Process.class
-java/lang/Readable.class
-java/lang/ReflectiveOperationException.class
-java/lang/Runnable.class
-java/lang/Runtime.class
-java/lang/RuntimeException.class
-java/lang/RuntimePermission.class
-java/lang/SafeVarargs.class
-java/lang/SecurityException.class
-java/lang/SecurityManager.class
-java/lang/Short.class
-java/lang/StackOverflowError.class
-java/lang/StackTraceElement.class
-java/lang/StrictMath.class
-java/lang/StringBuffer.class
-java/lang/StringBuilder.class
-java/lang/String.class
-java/lang/StringIndexOutOfBoundsException.class
-java/lang/SuppressWarnings.class
-java/lang/System.class
-java/lang/Thread.class
-java/lang/ThreadDeath.class
-java/lang/ThreadGroup.class
-java/lang/ThreadLocal.class
-java/lang/Thread$State.class
-java/lang/Thread$UncaughtExceptionHandler.class
-java/lang/Throwable.class
-java/lang/TypeNotPresentException.class
-java/lang/UnknownError.class
-java/lang/UnsatisfiedLinkError.class
-java/lang/UnsupportedClassVersionError.class
-java/lang/UnsupportedOperationException.class
-java/lang/VerifyError.class
-java/lang/VirtualMachineError.class
-java/lang/Void.class
diff --git a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java
deleted file mode 100644
index 42d8e56..0000000
--- a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java
+++ /dev/null
@@ -1,318 +0,0 @@
-// Copyright 2012 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.
-
-package org.chromium.example.jni_generator;
-
-import android.graphics.Rect;
-
-import org.chromium.base.annotations.AccessedByNative;
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.CalledByNativeUnchecked;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.base.annotations.NativeCall;
-import org.chromium.base.annotations.NativeClassQualifiedName;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-// This class serves as a reference test for the bindings generator, and as example documentation
-// for how to use the jni generator.
-// The C++ counter-part is sample_for_tests.cc.
-// jni_generator/BUILD.gn has a jni_generator_tests target that will:
-//   * Generate a header file for the JNI bindings based on this file.
-//   * Compile sample_for_tests.cc using the generated header file.
-//   * link a native executable to prove the generated header + cc file are self-contained.
-// All comments are informational only, and are ignored by the jni generator.
-//
-// Binding C/C++ with Java is not trivial, specially when ownership and object lifetime
-// semantics needs to be managed across boundaries.
-// Following a few guidelines will make the code simpler and less buggy:
-//
-// - Never write any JNI "by hand". Rely on the bindings generator to have a thin
-// layer of type-safety.
-//
-// - Treat the types from the other side as "opaque" as possible. Do not inspect any
-// object directly, but rather, rely on well-defined getters / setters.
-//
-// - Minimize the surface API between the two sides, and rather than calling multiple
-// functions across boundaries, call only one (and then, internally in the other side,
-// call as many little functions as required).
-//
-// - If a Java object "owns" a native object, stash the pointer in a "long mNativeClassName".
-// Note that it needs to have a "destruction path", i.e., it must eventually call a method
-// to delete the native object (for example, the java object has a "close()" method that
-// in turn deletes the native object). Avoid relying on finalizers: those run in a different
-// thread and makes the native lifetime management more difficult.
-//
-// - For native object "owning" java objects:
-//   - If there's a strong 1:1 to relationship between native and java, the best way is to
-//   stash the java object into a base::android::ScopedJavaGlobalRef. This will ensure the
-//   java object can be GC'd once the native object is destroyed but note that this global strong
-//   ref implies a new GC root, so be sure it will not leak and it must never rely on being
-//   triggered (transitively) from a java side GC.
-//   - In all other cases, the native side should keep a JavaObjectWeakGlobalRef, and check whether
-//   that reference is still valid before de-referencing it. Note that you will need another
-//   java-side object to be holding a strong reference to this java object while it is in use, to
-//   avoid unpredictable GC of the object before native side has finished with it.
-//
-// - The best way to pass "compound" datatypes across in either direction is to create an inner
-// class with PODs and a factory function. If possible, make it immutable (i.e., mark all the
-// fields as "final"). See examples with "InnerStructB" below.
-//
-// - It's simpler to create thin wrappers with a well defined JNI interface than to
-// expose a lot of internal details. This is specially significant for system classes where it's
-// simpler to wrap factory methods and a few getters / setters than expose the entire class.
-//
-// - Use static factory functions annotated with @CalledByNative rather than calling the
-// constructors directly.
-//
-// - Iterate over containers where they are originally owned, then create inner structs or
-// directly call methods on the other side. It's much simpler than trying to amalgamate
-// java and stl containers.
-//
-// An important note about qualified class name resolution:
-// The generator doesn't compile the class and have little context about the
-// classes being passed through the JNI layers. It adds a few simple rules:
-//
-// - all classes are either explicitly imported, or they are assumed to be in
-// the same package.
-//
-// - Inner class needs to be done through an import and usage of the
-// outer class, so that the generator knows how to qualify it:
-// import foo.bar.Zoo;
-// void call(Zoo.Inner);
-//
-// - implicitly imported classes aren't supported, so in order to pass
-// things like Runnable, please import java.lang.Runnable;
-//
-// This JNINamespace annotation indicates that all native methods should be
-// generated inside this namespace, including the native class that this
-// object binds to.
-@JNINamespace("base::android")
-class SampleForTests {
-    // Classes can store their C++ pointer counter part as an int that is normally initialized by
-    // calling out a nativeInit() function. Replace "CPPClass" with your particular class name!
-    long mNativeCPPObject;
-
-    // You can define methods and attributes on the java class just like any other.
-    // Methods without the @CalledByNative annotation won't be exposed to JNI.
-    public SampleForTests() {
-    }
-
-    public void startExample() {
-        // Calls C++ Init(...) method and holds a pointer to the C++ class.
-        mNativeCPPObject = nativeInit("myParam");
-    }
-
-    public void doStuff() {
-        // This will call CPPClass::Method() using nativePtr as a pointer to the object. This must
-        // be done to:
-        // * avoid leaks.
-        // * using finalizers are not allowed to destroy the cpp class.
-        nativeMethod(mNativeCPPObject);
-    }
-
-    public void finishExample() {
-        // We're done, so let's destroy nativePtr object.
-        nativeDestroy(mNativeCPPObject);
-    }
-
-    // ---------------------------------------------------------------------------------------------
-    // The following methods demonstrate exporting Java methods for invocation from C++ code.
-    // Java functions are mapping into C global functions by prefixing the method name with
-    // "Java_<Class>_"
-    // This is triggered by the @CalledByNative annotation; the methods may be named as you wish.
-
-    // Exported to C++ as:
-    // Java_SampleForTests_javaMethod(JNIEnv* env, jobject caller, jint foo, jint bar)
-    // Typically the C++ code would have obtained the jobject via the Init() call described above.
-    @CalledByNative
-    public int javaMethod(int foo, int bar) {
-        return 0;
-    }
-
-    // Exported to C++ as Java_SampleForTests_staticJavaMethod(JNIEnv* env)
-    // Note no jobject argument, as it is static.
-    @CalledByNative
-    public static boolean staticJavaMethod() {
-        return true;
-    }
-
-    // No prefix, so this method is package private. It will still be exported.
-    @CalledByNative
-    void packagePrivateJavaMethod() {
-    }
-
-    // Note the "Unchecked" suffix. By default, @CalledByNative will always generate bindings that
-    // call CheckException(). With "@CalledByNativeUnchecked", the client C++ code is responsible to
-    // call ClearException() and act as appropriate.
-    // See more details at the "@CalledByNativeUnchecked" annotation.
-    @CalledByNativeUnchecked
-    void methodThatThrowsException() throws Exception {}
-
-    // The generator is not confused by inline comments:
-    // @CalledByNative void thisShouldNotAppearInTheOutput();
-    // @CalledByNativeUnchecked public static void neitherShouldThis(int foo);
-
-    /**
-     * The generator is not confused by block comments:
-     * @CalledByNative void thisShouldNotAppearInTheOutputEither();
-     * @CalledByNativeUnchecked public static void andDefinitelyNotThis(int foo);
-     */
-
-    // String constants that look like comments don't confuse the generator:
-    private String mArrgh = "*/*";
-
-    private @interface SomeAnnotation {}
-
-    // The generator is not confused by @Annotated parameters.
-    @CalledByNative
-    void javaMethodWithAnnotatedParam(@SomeAnnotation int foo) {
-    }
-
-    // ---------------------------------------------------------------------------------------------
-    // Java fields which are accessed from C++ code only must be annotated with @AccessedByNative to
-    // prevent them being eliminated when unreferenced code is stripped.
-    @AccessedByNative
-    private int mJavaField;
-
-    // ---------------------------------------------------------------------------------------------
-    // The following methods demonstrate declaring methods to call into C++ from Java.
-    // The generator detects the "native" and "static" keywords, the type and name of the first
-    // parameter, and the "native" prefix to the function name to determine the C++ function
-    // signatures. Besides these constraints the methods can be freely named.
-
-    // This declares a C++ function which the application code must implement:
-    // static jint Init(JNIEnv* env, jobject caller);
-    // The jobject parameter refers back to this java side object instance.
-    // The implementation must return the pointer to the C++ object cast to jint.
-    // The caller of this method should store it, and supply it as a the nativeCPPClass param to
-    // subsequent native method calls (see the methods below that take an "int native..." as first
-    // param).
-    private native long nativeInit(String param);
-
-    // This defines a function binding to the associated C++ class member function. The name is
-    // derived from |nativeDestroy| and |nativeCPPClass| to arrive at CPPClass::Destroy() (i.e.
-    // native prefixes stripped).
-    //
-    // The |nativeCPPClass| is automatically cast to type CPPClass*, in order to obtain the object
-    // on
-    // which to invoke the member function. Replace "CPPClass" with your particular class name!
-    private native void nativeDestroy(long nativeCPPClass);
-
-    // This declares a C++ function which the application code must implement:
-    // static jdouble GetDoubleFunction(JNIEnv* env, jobject caller);
-    // The jobject parameter refers back to this java side object instance.
-    private native double nativeGetDoubleFunction();
-
-    // Similar to nativeGetDoubleFunction(), but here the C++ side will receive a jclass rather than
-    // jobject param, as the function is declared static.
-    private static native float nativeGetFloatFunction();
-
-    // This function takes a non-POD datatype. We have a list mapping them to their full classpath
-    // in jni_generator.py JavaParamToJni. If you require a new datatype, make sure you add to that
-    // function.
-    private native void nativeSetNonPODDatatype(Rect rect);
-
-    // This declares a C++ function which the application code must implement:
-    // static ScopedJavaLocalRef<jobject> GetNonPODDatatype(JNIEnv* env, jobject caller);
-    // The jobject parameter refers back to this java side object instance.
-    // Note that it returns a ScopedJavaLocalRef<jobject> so that you don' have to worry about
-    // deleting the JNI local reference. This is similar with Strings and arrays.
-    private native Object nativeGetNonPODDatatype();
-
-    // Similar to nativeDestroy above, this will cast nativeCPPClass into pointer of CPPClass type
-    // and call its Method member function. Replace "CPPClass" with your particular class name!
-    private native int nativeMethod(long nativeCPPClass);
-
-    // Similar to nativeMethod above, but here the C++ fully qualified class name is taken from the
-    // annotation rather than parameter name, which can thus be chosen freely.
-    @NativeClassQualifiedName("CPPClass::InnerClass")
-    private native double nativeMethodOtherP0(long nativePtr);
-
-    // This "struct" will be created by the native side using |createInnerStructA|,
-    // and used by the java-side somehow.
-    // Note that |@CalledByNative| has to contain the inner class name.
-    static class InnerStructA {
-        private final long mLong;
-        private final int mInt;
-        private final String mString;
-
-        private InnerStructA(long l, int i, String s) {
-            mLong = l;
-            mInt = i;
-            mString = s;
-        }
-
-        @CalledByNative("InnerStructA")
-        private static InnerStructA create(long l, int i, String s) {
-            return new InnerStructA(l, i, s);
-        }
-    }
-
-    private List<InnerStructA> mListInnerStructA = new ArrayList<InnerStructA>();
-
-    @CalledByNative
-    private void addStructA(InnerStructA a) {
-        // Called by the native side to append another element.
-        mListInnerStructA.add(a);
-    }
-
-    @CalledByNative
-    private void iterateAndDoSomething() {
-        Iterator<InnerStructA> it = mListInnerStructA.iterator();
-        while (it.hasNext()) {
-            InnerStructA element = it.next();
-            // Now, do something with element.
-        }
-        // Done, clear the list.
-        mListInnerStructA.clear();
-    }
-
-    // This "struct" will be created by the java side passed to native, which
-    // will use its getters.
-    // Note that |@CalledByNative| has to contain the inner class name.
-    static class InnerStructB {
-        private final long mKey;
-        private final String mValue;
-
-        private InnerStructB(long k, String v) {
-            mKey = k;
-            mValue = v;
-        }
-
-        @CalledByNative("InnerStructB")
-        private long getKey() {
-            return mKey;
-        }
-
-        @CalledByNative("InnerStructB")
-        private String getValue() {
-            return mValue;
-        }
-    }
-
-    List<InnerStructB> mListInnerStructB = new ArrayList<InnerStructB>();
-
-    void iterateAndDoSomethingWithMap() {
-        Iterator<InnerStructB> it = mListInnerStructB.iterator();
-        while (it.hasNext()) {
-            InnerStructB element = it.next();
-            // Now, do something with element.
-            nativeAddStructB(mNativeCPPObject, element);
-        }
-        nativeIterateAndDoSomethingWithStructB(mNativeCPPObject);
-    }
-
-    native void nativeAddStructB(long nativeCPPClass, InnerStructB b);
-    native void nativeIterateAndDoSomethingWithStructB(long nativeCPPClass);
-    native String nativeReturnAString(long nativeCPPClass);
-
-    // This inner class shows how to annotate native methods on inner classes.
-    static class InnerClass {
-        @NativeCall("InnerClass")
-        private static native int nativeGetInnerIntFunction();
-    }
-}
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py
deleted file mode 100755
index 99d8b42..0000000
--- a/base/android/jni_generator/jni_generator.py
+++ /dev/null
@@ -1,1418 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 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.
-
-"""Extracts native methods from a Java file and generates the JNI bindings.
-If you change this, please run and update the tests."""
-
-import collections
-import errno
-import optparse
-import os
-import re
-import string
-from string import Template
-import subprocess
-import sys
-import textwrap
-import zipfile
-
-CHROMIUM_SRC = os.path.join(
-    os.path.dirname(__file__), os.pardir, os.pardir, os.pardir)
-BUILD_ANDROID_GYP = os.path.join(
-    CHROMIUM_SRC, 'build', 'android', 'gyp')
-
-sys.path.append(BUILD_ANDROID_GYP)
-
-from util import build_utils
-
-
-class ParseError(Exception):
-  """Exception thrown when we can't parse the input file."""
-
-  def __init__(self, description, *context_lines):
-    Exception.__init__(self)
-    self.description = description
-    self.context_lines = context_lines
-
-  def __str__(self):
-    context = '\n'.join(self.context_lines)
-    return '***\nERROR: %s\n\n%s\n***' % (self.description, context)
-
-
-class Param(object):
-  """Describes a param for a method, either java or native."""
-
-  def __init__(self, **kwargs):
-    self.datatype = kwargs['datatype']
-    self.name = kwargs['name']
-
-
-class NativeMethod(object):
-  """Describes a C/C++ method that is called by Java code"""
-
-  def __init__(self, **kwargs):
-    self.static = kwargs['static']
-    self.java_class_name = kwargs['java_class_name']
-    self.return_type = kwargs['return_type']
-    self.name = kwargs['name']
-    self.params = kwargs['params']
-    if self.params:
-      assert type(self.params) is list
-      assert type(self.params[0]) is Param
-    if (self.params and
-        self.params[0].datatype == kwargs.get('ptr_type', 'int') and
-        self.params[0].name.startswith('native')):
-      self.type = 'method'
-      self.p0_type = self.params[0].name[len('native'):]
-      if kwargs.get('native_class_name'):
-        self.p0_type = kwargs['native_class_name']
-    else:
-      self.type = 'function'
-    self.method_id_var_name = kwargs.get('method_id_var_name', None)
-
-
-class CalledByNative(object):
-  """Describes a java method exported to c/c++"""
-
-  def __init__(self, **kwargs):
-    self.system_class = kwargs['system_class']
-    self.unchecked = kwargs['unchecked']
-    self.static = kwargs['static']
-    self.java_class_name = kwargs['java_class_name']
-    self.return_type = kwargs['return_type']
-    self.name = kwargs['name']
-    self.params = kwargs['params']
-    self.method_id_var_name = kwargs.get('method_id_var_name', None)
-    self.signature = kwargs.get('signature')
-    self.is_constructor = kwargs.get('is_constructor', False)
-    self.env_call = GetEnvCall(self.is_constructor, self.static,
-                               self.return_type)
-    self.static_cast = GetStaticCastForReturnType(self.return_type)
-
-
-class ConstantField(object):
-  def __init__(self, **kwargs):
-    self.name = kwargs['name']
-    self.value = kwargs['value']
-
-
-def JavaDataTypeToC(java_type):
-  """Returns a C datatype for the given java type."""
-  java_pod_type_map = {
-      'int': 'jint',
-      'byte': 'jbyte',
-      'char': 'jchar',
-      'short': 'jshort',
-      'boolean': 'jboolean',
-      'long': 'jlong',
-      'double': 'jdouble',
-      'float': 'jfloat',
-  }
-  java_type_map = {
-      'void': 'void',
-      'String': 'jstring',
-      'Throwable': 'jthrowable',
-      'java/lang/String': 'jstring',
-      'java/lang/Class': 'jclass',
-      'java/lang/Throwable': 'jthrowable',
-  }
-
-  if java_type in java_pod_type_map:
-    return java_pod_type_map[java_type]
-  elif java_type in java_type_map:
-    return java_type_map[java_type]
-  elif java_type.endswith('[]'):
-    if java_type[:-2] in java_pod_type_map:
-      return java_pod_type_map[java_type[:-2]] + 'Array'
-    return 'jobjectArray'
-  elif java_type.startswith('Class'):
-    # Checking just the start of the name, rather than a direct comparison,
-    # in order to handle generics.
-    return 'jclass'
-  else:
-    return 'jobject'
-
-
-def WrapCTypeForDeclaration(c_type):
-  """Wrap the C datatype in a JavaRef if required."""
-  if re.match(RE_SCOPED_JNI_TYPES, c_type):
-    return 'const base::android::JavaParamRef<' + c_type + '>&'
-  else:
-    return c_type
-
-
-def JavaDataTypeToCForDeclaration(java_type):
-  """Returns a JavaRef-wrapped C datatype for the given java type."""
-  return WrapCTypeForDeclaration(JavaDataTypeToC(java_type))
-
-
-def JavaDataTypeToCForCalledByNativeParam(java_type):
-  """Returns a C datatype to be when calling from native."""
-  if java_type == 'int':
-    return 'JniIntWrapper'
-  else:
-    c_type = JavaDataTypeToC(java_type)
-    if re.match(RE_SCOPED_JNI_TYPES, c_type):
-      return 'const base::android::JavaRefOrBare<' + c_type + '>&'
-    else:
-      return c_type
-
-
-def JavaReturnValueToC(java_type):
-  """Returns a valid C return value for the given java type."""
-  java_pod_type_map = {
-      'int': '0',
-      'byte': '0',
-      'char': '0',
-      'short': '0',
-      'boolean': 'false',
-      'long': '0',
-      'double': '0',
-      'float': '0',
-      'void': ''
-  }
-  return java_pod_type_map.get(java_type, 'NULL')
-
-
-class JniParams(object):
-  _imports = []
-  _fully_qualified_class = ''
-  _package = ''
-  _inner_classes = []
-  _implicit_imports = []
-
-  @staticmethod
-  def SetFullyQualifiedClass(fully_qualified_class):
-    JniParams._fully_qualified_class = 'L' + fully_qualified_class
-    JniParams._package = '/'.join(fully_qualified_class.split('/')[:-1])
-
-  @staticmethod
-  def AddAdditionalImport(class_name):
-    assert class_name.endswith('.class')
-    raw_class_name = class_name[:-len('.class')]
-    if '.' in raw_class_name:
-      raise SyntaxError('%s cannot be used in @JNIAdditionalImport. '
-                        'Only import unqualified outer classes.' % class_name)
-    new_import = 'L%s/%s' % (JniParams._package, raw_class_name)
-    if new_import in JniParams._imports:
-      raise SyntaxError('Do not use JNIAdditionalImport on an already '
-                        'imported class: %s' % (new_import.replace('/', '.')))
-    JniParams._imports += [new_import]
-
-  @staticmethod
-  def ExtractImportsAndInnerClasses(contents):
-    if not JniParams._package:
-      raise RuntimeError('SetFullyQualifiedClass must be called before '
-                         'ExtractImportsAndInnerClasses')
-    contents = contents.replace('\n', '')
-    re_import = re.compile(r'import.*?(?P<class>\S*?);')
-    for match in re.finditer(re_import, contents):
-      JniParams._imports += ['L' + match.group('class').replace('.', '/')]
-
-    re_inner = re.compile(r'(class|interface)\s+?(?P<name>\w+?)\W')
-    for match in re.finditer(re_inner, contents):
-      inner = match.group('name')
-      if not JniParams._fully_qualified_class.endswith(inner):
-        JniParams._inner_classes += [JniParams._fully_qualified_class + '$' +
-                                     inner]
-
-    re_additional_imports = re.compile(
-        r'@JNIAdditionalImport\(\s*{?(?P<class_names>.*?)}?\s*\)')
-    for match in re.finditer(re_additional_imports, contents):
-      for class_name in match.group('class_names').split(','):
-        JniParams.AddAdditionalImport(class_name.strip())
-
-  @staticmethod
-  def ParseJavaPSignature(signature_line):
-    prefix = 'Signature: '
-    index = signature_line.find(prefix)
-    if index == -1:
-      prefix = 'descriptor: '
-      index = signature_line.index(prefix)
-    return '"%s"' % signature_line[index + len(prefix):]
-
-  @staticmethod
-  def JavaToJni(param):
-    """Converts a java param into a JNI signature type."""
-    pod_param_map = {
-        'int': 'I',
-        'boolean': 'Z',
-        'char': 'C',
-        'short': 'S',
-        'long': 'J',
-        'double': 'D',
-        'float': 'F',
-        'byte': 'B',
-        'void': 'V',
-    }
-    object_param_list = [
-        'Ljava/lang/Boolean',
-        'Ljava/lang/Integer',
-        'Ljava/lang/Long',
-        'Ljava/lang/Object',
-        'Ljava/lang/String',
-        'Ljava/lang/Class',
-        'Ljava/lang/CharSequence',
-        'Ljava/lang/Runnable',
-        'Ljava/lang/Throwable',
-    ]
-
-    prefix = ''
-    # Array?
-    while param[-2:] == '[]':
-      prefix += '['
-      param = param[:-2]
-    # Generic?
-    if '<' in param:
-      param = param[:param.index('<')]
-    if param in pod_param_map:
-      return prefix + pod_param_map[param]
-    if '/' in param:
-      # Coming from javap, use the fully qualified param directly.
-      return prefix + 'L' + param + ';'
-
-    for qualified_name in (object_param_list +
-                           [JniParams._fully_qualified_class] +
-                           JniParams._inner_classes):
-      if (qualified_name.endswith('/' + param) or
-          qualified_name.endswith('$' + param.replace('.', '$')) or
-          qualified_name == 'L' + param):
-        return prefix + qualified_name + ';'
-
-    # Is it from an import? (e.g. referecing Class from import pkg.Class;
-    # note that referencing an inner class Inner from import pkg.Class.Inner
-    # is not supported).
-    for qualified_name in JniParams._imports:
-      if qualified_name.endswith('/' + param):
-        # Ensure it's not an inner class.
-        components = qualified_name.split('/')
-        if len(components) > 2 and components[-2][0].isupper():
-          raise SyntaxError('Inner class (%s) can not be imported '
-                            'and used by JNI (%s). Please import the outer '
-                            'class and use Outer.Inner instead.' %
-                            (qualified_name, param))
-        return prefix + qualified_name + ';'
-
-    # Is it an inner class from an outer class import? (e.g. referencing
-    # Class.Inner from import pkg.Class).
-    if '.' in param:
-      components = param.split('.')
-      outer = '/'.join(components[:-1])
-      inner = components[-1]
-      for qualified_name in JniParams._imports:
-        if qualified_name.endswith('/' + outer):
-          return (prefix + qualified_name + '$' + inner + ';')
-      raise SyntaxError('Inner class (%s) can not be '
-                        'used directly by JNI. Please import the outer '
-                        'class, probably:\n'
-                        'import %s.%s;' %
-                        (param, JniParams._package.replace('/', '.'),
-                         outer.replace('/', '.')))
-
-    JniParams._CheckImplicitImports(param)
-
-    # Type not found, falling back to same package as this class.
-    return (prefix + 'L' + JniParams._package + '/' + param + ';')
-
-  @staticmethod
-  def _CheckImplicitImports(param):
-    # Ensure implicit imports, such as java.lang.*, are not being treated
-    # as being in the same package.
-    if not JniParams._implicit_imports:
-      # This file was generated from android.jar and lists
-      # all classes that are implicitly imported.
-      with file(os.path.join(os.path.dirname(sys.argv[0]),
-                             'android_jar.classes'), 'r') as f:
-        JniParams._implicit_imports = f.readlines()
-    for implicit_import in JniParams._implicit_imports:
-      implicit_import = implicit_import.strip().replace('.class', '')
-      implicit_import = implicit_import.replace('/', '.')
-      if implicit_import.endswith('.' + param):
-        raise SyntaxError('Ambiguous class (%s) can not be used directly '
-                          'by JNI.\nPlease import it, probably:\n\n'
-                          'import %s;' %
-                          (param, implicit_import))
-
-
-  @staticmethod
-  def Signature(params, returns, wrap):
-    """Returns the JNI signature for the given datatypes."""
-    items = ['(']
-    items += [JniParams.JavaToJni(param.datatype) for param in params]
-    items += [')']
-    items += [JniParams.JavaToJni(returns)]
-    if wrap:
-      return '\n' + '\n'.join(['"' + item + '"' for item in items])
-    else:
-      return '"' + ''.join(items) + '"'
-
-  @staticmethod
-  def Parse(params):
-    """Parses the params into a list of Param objects."""
-    if not params:
-      return []
-    ret = []
-    for p in [p.strip() for p in params.split(',')]:
-      items = p.split(' ')
-
-      # Remove @Annotations from parameters.
-      while items[0].startswith('@'):
-        del items[0]
-
-      if 'final' in items:
-        items.remove('final')
-
-      param = Param(
-          datatype=items[0],
-          name=(items[1] if len(items) > 1 else 'p%s' % len(ret)),
-      )
-      ret += [param]
-    return ret
-
-
-def ExtractJNINamespace(contents):
-  re_jni_namespace = re.compile('.*?@JNINamespace\("(.*?)"\)')
-  m = re.findall(re_jni_namespace, contents)
-  if not m:
-    return ''
-  return m[0]
-
-
-def ExtractFullyQualifiedJavaClassName(java_file_name, contents):
-  re_package = re.compile('.*?package (.*?);')
-  matches = re.findall(re_package, contents)
-  if not matches:
-    raise SyntaxError('Unable to find "package" line in %s' % java_file_name)
-  return (matches[0].replace('.', '/') + '/' +
-          os.path.splitext(os.path.basename(java_file_name))[0])
-
-
-def ExtractNatives(contents, ptr_type):
-  """Returns a list of dict containing information about a native method."""
-  contents = contents.replace('\n', '')
-  natives = []
-  re_native = re.compile(r'(@NativeClassQualifiedName'
-                         '\(\"(?P<native_class_name>.*?)\"\)\s+)?'
-                         '(@NativeCall(\(\"(?P<java_class_name>.*?)\"\))\s+)?'
-                         '(?P<qualifiers>\w+\s\w+|\w+|\s+)\s*native '
-                         '(?P<return_type>\S*) '
-                         '(?P<name>native\w+)\((?P<params>.*?)\);')
-  for match in re.finditer(re_native, contents):
-    native = NativeMethod(
-        static='static' in match.group('qualifiers'),
-        java_class_name=match.group('java_class_name'),
-        native_class_name=match.group('native_class_name'),
-        return_type=match.group('return_type'),
-        name=match.group('name').replace('native', ''),
-        params=JniParams.Parse(match.group('params')),
-        ptr_type=ptr_type)
-    natives += [native]
-  return natives
-
-
-def IsMainDexJavaClass(contents):
-  """Returns "true" if the class is annotated with "@MainDex", "false" if not.
-
-  JNI registration doesn't always need to be completed for non-browser processes
-  since most Java code is only used by the browser process. Classes that are
-  needed by non-browser processes must explicitly be annotated with @MainDex
-  to force JNI registration.
-  """
-  re_maindex = re.compile(r'@MainDex[\s\S]*class\s+\w+\s*{')
-  found = re.search(re_maindex, contents)
-  return 'true' if found else 'false'
-
-
-def GetStaticCastForReturnType(return_type):
-  type_map = { 'String' : 'jstring',
-               'java/lang/String' : 'jstring',
-               'Throwable': 'jthrowable',
-               'java/lang/Throwable': 'jthrowable',
-               'boolean[]': 'jbooleanArray',
-               'byte[]': 'jbyteArray',
-               'char[]': 'jcharArray',
-               'short[]': 'jshortArray',
-               'int[]': 'jintArray',
-               'long[]': 'jlongArray',
-               'float[]': 'jfloatArray',
-               'double[]': 'jdoubleArray' }
-  ret = type_map.get(return_type, None)
-  if ret:
-    return ret
-  if return_type.endswith('[]'):
-    return 'jobjectArray'
-  return None
-
-
-def GetEnvCall(is_constructor, is_static, return_type):
-  """Maps the types availabe via env->Call__Method."""
-  if is_constructor:
-    return 'NewObject'
-  env_call_map = {'boolean': 'Boolean',
-                  'byte': 'Byte',
-                  'char': 'Char',
-                  'short': 'Short',
-                  'int': 'Int',
-                  'long': 'Long',
-                  'float': 'Float',
-                  'void': 'Void',
-                  'double': 'Double',
-                  'Object': 'Object',
-                 }
-  call = env_call_map.get(return_type, 'Object')
-  if is_static:
-    call = 'Static' + call
-  return 'Call' + call + 'Method'
-
-
-def GetMangledParam(datatype):
-  """Returns a mangled identifier for the datatype."""
-  if len(datatype) <= 2:
-    return datatype.replace('[', 'A')
-  ret = ''
-  for i in range(1, len(datatype)):
-    c = datatype[i]
-    if c == '[':
-      ret += 'A'
-    elif c.isupper() or datatype[i - 1] in ['/', 'L']:
-      ret += c.upper()
-  return ret
-
-
-def GetMangledMethodName(name, params, return_type):
-  """Returns a mangled method name for the given signature.
-
-     The returned name can be used as a C identifier and will be unique for all
-     valid overloads of the same method.
-
-  Args:
-     name: string.
-     params: list of Param.
-     return_type: string.
-
-  Returns:
-      A mangled name.
-  """
-  mangled_items = []
-  for datatype in [return_type] + [x.datatype for x in params]:
-    mangled_items += [GetMangledParam(JniParams.JavaToJni(datatype))]
-  mangled_name = name + '_'.join(mangled_items)
-  assert re.match(r'[0-9a-zA-Z_]+', mangled_name)
-  return mangled_name
-
-
-def MangleCalledByNatives(called_by_natives):
-  """Mangles all the overloads from the call_by_natives list."""
-  method_counts = collections.defaultdict(
-      lambda: collections.defaultdict(lambda: 0))
-  for called_by_native in called_by_natives:
-    java_class_name = called_by_native.java_class_name
-    name = called_by_native.name
-    method_counts[java_class_name][name] += 1
-  for called_by_native in called_by_natives:
-    java_class_name = called_by_native.java_class_name
-    method_name = called_by_native.name
-    method_id_var_name = method_name
-    if method_counts[java_class_name][method_name] > 1:
-      method_id_var_name = GetMangledMethodName(method_name,
-                                                called_by_native.params,
-                                                called_by_native.return_type)
-    called_by_native.method_id_var_name = method_id_var_name
-  return called_by_natives
-
-
-# Regex to match the JNI types that should be wrapped in a JavaRef.
-RE_SCOPED_JNI_TYPES = re.compile('jobject|jclass|jstring|jthrowable|.*Array')
-
-
-# Regex to match a string like "@CalledByNative public void foo(int bar)".
-RE_CALLED_BY_NATIVE = re.compile(
-    '@CalledByNative(?P<Unchecked>(Unchecked)*?)(?:\("(?P<annotation>.*)"\))?'
-    '\s+(?P<prefix>[\w ]*?)'
-    '(:?\s*@\w+)?'  # Ignore annotations in return types.
-    '\s*(?P<return_type>\S+?)'
-    '\s+(?P<name>\w+)'
-    '\s*\((?P<params>[^\)]*)\)')
-
-
-# Removes empty lines that are indented (i.e. start with 2x spaces).
-def RemoveIndentedEmptyLines(string):
-  return re.sub('^(?: {2})+$\n', '', string, flags=re.MULTILINE)
-
-
-def ExtractCalledByNatives(contents):
-  """Parses all methods annotated with @CalledByNative.
-
-  Args:
-    contents: the contents of the java file.
-
-  Returns:
-    A list of dict with information about the annotated methods.
-    TODO(bulach): return a CalledByNative object.
-
-  Raises:
-    ParseError: if unable to parse.
-  """
-  called_by_natives = []
-  for match in re.finditer(RE_CALLED_BY_NATIVE, contents):
-    called_by_natives += [CalledByNative(
-        system_class=False,
-        unchecked='Unchecked' in match.group('Unchecked'),
-        static='static' in match.group('prefix'),
-        java_class_name=match.group('annotation') or '',
-        return_type=match.group('return_type'),
-        name=match.group('name'),
-        params=JniParams.Parse(match.group('params')))]
-  # Check for any @CalledByNative occurrences that weren't matched.
-  unmatched_lines = re.sub(RE_CALLED_BY_NATIVE, '', contents).split('\n')
-  for line1, line2 in zip(unmatched_lines, unmatched_lines[1:]):
-    if '@CalledByNative' in line1:
-      raise ParseError('could not parse @CalledByNative method signature',
-                       line1, line2)
-  return MangleCalledByNatives(called_by_natives)
-
-
-class JNIFromJavaP(object):
-  """Uses 'javap' to parse a .class file and generate the JNI header file."""
-
-  def __init__(self, contents, options):
-    self.contents = contents
-    self.namespace = options.namespace
-    for line in contents:
-      class_name = re.match(
-          '.*?(public).*?(class|interface) (?P<class_name>\S+?)( |\Z)',
-          line)
-      if class_name:
-        self.fully_qualified_class = class_name.group('class_name')
-        break
-    self.fully_qualified_class = self.fully_qualified_class.replace('.', '/')
-    # Java 7's javap includes type parameters in output, like HashSet<T>. Strip
-    # away the <...> and use the raw class name that Java 6 would've given us.
-    self.fully_qualified_class = self.fully_qualified_class.split('<', 1)[0]
-    JniParams.SetFullyQualifiedClass(self.fully_qualified_class)
-    self.java_class_name = self.fully_qualified_class.split('/')[-1]
-    if not self.namespace:
-      self.namespace = 'JNI_' + self.java_class_name
-    re_method = re.compile('(?P<prefix>.*?)(?P<return_type>\S+?) (?P<name>\w+?)'
-                           '\((?P<params>.*?)\)')
-    self.called_by_natives = []
-    for lineno, content in enumerate(contents[2:], 2):
-      match = re.match(re_method, content)
-      if not match:
-        continue
-      self.called_by_natives += [CalledByNative(
-          system_class=True,
-          unchecked=False,
-          static='static' in match.group('prefix'),
-          java_class_name='',
-          return_type=match.group('return_type').replace('.', '/'),
-          name=match.group('name'),
-          params=JniParams.Parse(match.group('params').replace('.', '/')),
-          signature=JniParams.ParseJavaPSignature(contents[lineno + 1]))]
-    re_constructor = re.compile('(.*?)public ' +
-                                self.fully_qualified_class.replace('/', '.') +
-                                '\((?P<params>.*?)\)')
-    for lineno, content in enumerate(contents[2:], 2):
-      match = re.match(re_constructor, content)
-      if not match:
-        continue
-      self.called_by_natives += [CalledByNative(
-          system_class=True,
-          unchecked=False,
-          static=False,
-          java_class_name='',
-          return_type=self.fully_qualified_class,
-          name='Constructor',
-          params=JniParams.Parse(match.group('params').replace('.', '/')),
-          signature=JniParams.ParseJavaPSignature(contents[lineno + 1]),
-          is_constructor=True)]
-    self.called_by_natives = MangleCalledByNatives(self.called_by_natives)
-
-    self.constant_fields = []
-    re_constant_field = re.compile('.*?public static final int (?P<name>.*?);')
-    re_constant_field_value = re.compile(
-        '.*?Constant(Value| value): int (?P<value>(-*[0-9]+)?)')
-    for lineno, content in enumerate(contents[2:], 2):
-      match = re.match(re_constant_field, content)
-      if not match:
-        continue
-      value = re.match(re_constant_field_value, contents[lineno + 2])
-      if not value:
-        value = re.match(re_constant_field_value, contents[lineno + 3])
-      if value:
-        self.constant_fields.append(
-            ConstantField(name=match.group('name'),
-                          value=value.group('value')))
-
-    self.inl_header_file_generator = InlHeaderFileGenerator(
-        self.namespace, self.fully_qualified_class, [], self.called_by_natives,
-        self.constant_fields, options)
-
-  def GetContent(self):
-    return self.inl_header_file_generator.GetContent()
-
-  @staticmethod
-  def CreateFromClass(class_file, options):
-    class_name = os.path.splitext(os.path.basename(class_file))[0]
-    p = subprocess.Popen(args=[options.javap, '-c', '-verbose',
-                               '-s', class_name],
-                         cwd=os.path.dirname(class_file),
-                         stdout=subprocess.PIPE,
-                         stderr=subprocess.PIPE)
-    stdout, _ = p.communicate()
-    jni_from_javap = JNIFromJavaP(stdout.split('\n'), options)
-    return jni_from_javap
-
-
-class JNIFromJavaSource(object):
-  """Uses the given java source file to generate the JNI header file."""
-
-  # Match single line comments, multiline comments, character literals, and
-  # double-quoted strings.
-  _comment_remover_regex = re.compile(
-      r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
-      re.DOTALL | re.MULTILINE)
-
-  def __init__(self, contents, fully_qualified_class, options):
-    contents = self._RemoveComments(contents)
-    JniParams.SetFullyQualifiedClass(fully_qualified_class)
-    JniParams.ExtractImportsAndInnerClasses(contents)
-    jni_namespace = ExtractJNINamespace(contents) or options.namespace
-    natives = ExtractNatives(contents, options.ptr_type)
-    called_by_natives = ExtractCalledByNatives(contents)
-    maindex = IsMainDexJavaClass(contents)
-    if len(natives) == 0 and len(called_by_natives) == 0:
-      raise SyntaxError('Unable to find any JNI methods for %s.' %
-                        fully_qualified_class)
-    inl_header_file_generator = InlHeaderFileGenerator(
-        jni_namespace, fully_qualified_class, natives, called_by_natives, [],
-        options, maindex)
-    self.content = inl_header_file_generator.GetContent()
-
-  @classmethod
-  def _RemoveComments(cls, contents):
-    # We need to support both inline and block comments, and we need to handle
-    # strings that contain '//' or '/*'.
-    # TODO(bulach): This is a bit hacky. It would be cleaner to use a real Java
-    # parser. Maybe we could ditch JNIFromJavaSource and just always use
-    # JNIFromJavaP; or maybe we could rewrite this script in Java and use APT.
-    # http://code.google.com/p/chromium/issues/detail?id=138941
-    def replacer(match):
-      # Replace matches that are comments with nothing; return literals/strings
-      # unchanged.
-      s = match.group(0)
-      if s.startswith('/'):
-        return ''
-      else:
-        return s
-    return cls._comment_remover_regex.sub(replacer, contents)
-
-  def GetContent(self):
-    return self.content
-
-  @staticmethod
-  def CreateFromFile(java_file_name, options):
-    contents = file(java_file_name).read()
-    fully_qualified_class = ExtractFullyQualifiedJavaClassName(java_file_name,
-                                                               contents)
-    return JNIFromJavaSource(contents, fully_qualified_class, options)
-
-
-class InlHeaderFileGenerator(object):
-  """Generates an inline header file for JNI integration."""
-
-  def __init__(self, namespace, fully_qualified_class, natives,
-               called_by_natives, constant_fields, options, maindex='false'):
-    self.namespace = namespace
-    self.fully_qualified_class = fully_qualified_class
-    self.class_name = self.fully_qualified_class.split('/')[-1]
-    self.natives = natives
-    self.called_by_natives = called_by_natives
-    self.header_guard = fully_qualified_class.replace('/', '_') + '_JNI'
-    self.constant_fields = constant_fields
-    self.maindex = maindex
-    self.options = options
-
-
-  def GetContent(self):
-    """Returns the content of the JNI binding file."""
-    template = Template("""\
-// 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.
-
-
-// This file is autogenerated by
-//     ${SCRIPT_NAME}
-// For
-//     ${FULLY_QUALIFIED_CLASS}
-
-#ifndef ${HEADER_GUARD}
-#define ${HEADER_GUARD}
-
-#include <jni.h>
-
-${INCLUDES}
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-$CLASS_PATH_DEFINITIONS
-
-}  // namespace
-
-$OPEN_NAMESPACE
-
-$CONSTANT_FIELDS
-
-// Step 2: method stubs.
-$METHOD_STUBS
-
-// Step 3: RegisterNatives.
-$JNI_NATIVE_METHODS
-$REGISTER_NATIVES
-$CLOSE_NAMESPACE
-
-#endif  // ${HEADER_GUARD}
-""")
-    values = {
-        'SCRIPT_NAME': self.options.script_name,
-        'FULLY_QUALIFIED_CLASS': self.fully_qualified_class,
-        'CLASS_PATH_DEFINITIONS': self.GetClassPathDefinitionsString(),
-        'CONSTANT_FIELDS': self.GetConstantFieldsString(),
-        'METHOD_STUBS': self.GetMethodStubsString(),
-        'OPEN_NAMESPACE': self.GetOpenNamespaceString(),
-        'JNI_NATIVE_METHODS': self.GetJNINativeMethodsString(),
-        'REGISTER_NATIVES': self.GetRegisterNativesString(),
-        'CLOSE_NAMESPACE': self.GetCloseNamespaceString(),
-        'HEADER_GUARD': self.header_guard,
-        'INCLUDES': self.GetIncludesString(),
-    }
-    assert ((values['JNI_NATIVE_METHODS'] == '') ==
-            (values['REGISTER_NATIVES'] == ''))
-    return WrapOutput(template.substitute(values))
-
-  def GetClassPathDefinitionsString(self):
-    ret = []
-    ret += [self.GetClassPathDefinitions()]
-    return '\n'.join(ret)
-
-  def GetConstantFieldsString(self):
-    if not self.constant_fields:
-      return ''
-    ret = ['enum Java_%s_constant_fields {' % self.class_name]
-    for c in self.constant_fields:
-      ret += ['  %s = %s,' % (c.name, c.value)]
-    ret += ['};']
-    return '\n'.join(ret)
-
-  def GetMethodStubsString(self):
-    """Returns the code corresponding to method stubs."""
-    ret = []
-    for native in self.natives:
-      ret += [self.GetNativeStub(native)]
-    ret += self.GetLazyCalledByNativeMethodStubs()
-    return '\n'.join(ret)
-
-  def GetLazyCalledByNativeMethodStubs(self):
-    return [self.GetLazyCalledByNativeMethodStub(called_by_native)
-            for called_by_native in self.called_by_natives]
-
-  def GetIncludesString(self):
-    if not self.options.includes:
-      return ''
-    includes = self.options.includes.split(',')
-    return '\n'.join('#include "%s"' % x for x in includes)
-
-  def GetKMethodsString(self, clazz):
-    ret = []
-    for native in self.natives:
-      if (native.java_class_name == clazz or
-          (not native.java_class_name and clazz == self.class_name)):
-        ret += [self.GetKMethodArrayEntry(native)]
-    return '\n'.join(ret)
-
-  def SubstituteNativeMethods(self, template):
-    """Substitutes JAVA_CLASS and KMETHODS in the provided template."""
-    ret = []
-    all_classes = self.GetUniqueClasses(self.natives)
-    all_classes[self.class_name] = self.fully_qualified_class
-    for clazz in all_classes:
-      kmethods = self.GetKMethodsString(clazz)
-      if kmethods:
-        values = {'JAVA_CLASS': clazz,
-                  'KMETHODS': kmethods}
-        ret += [template.substitute(values)]
-    if not ret: return ''
-    return '\n' + '\n'.join(ret)
-
-  def GetJNINativeMethodsString(self):
-    """Returns the implementation of the array of native methods."""
-    if not self.options.native_exports_optional:
-      return ''
-    template = Template("""\
-static const JNINativeMethod kMethods${JAVA_CLASS}[] = {
-${KMETHODS}
-};
-""")
-    return self.SubstituteNativeMethods(template)
-
-  def GetRegisterNativesString(self):
-    """Returns the code for RegisterNatives."""
-    natives = self.GetRegisterNativesImplString()
-    if not natives:
-      return ''
-
-    template = Template("""\
-${REGISTER_NATIVES_SIGNATURE} {
-${EARLY_EXIT}
-${NATIVES}
-  return true;
-}
-""")
-    signature = 'static bool RegisterNativesImpl(JNIEnv* env)'
-    early_exit = ''
-    if self.options.native_exports_optional:
-      early_exit = """\
-  if (jni_generator::ShouldSkipJniRegistration(%s))
-    return true;
-""" % self.maindex
-
-    values = {'REGISTER_NATIVES_SIGNATURE': signature,
-              'EARLY_EXIT': early_exit,
-              'NATIVES': natives,
-             }
-
-    return template.substitute(values)
-
-  def GetRegisterNativesImplString(self):
-    """Returns the shared implementation for RegisterNatives."""
-    if not self.options.native_exports_optional:
-      return ''
-
-    template = Template("""\
-  const int kMethods${JAVA_CLASS}Size = arraysize(kMethods${JAVA_CLASS});
-
-  if (env->RegisterNatives(${JAVA_CLASS}_clazz(env),
-                           kMethods${JAVA_CLASS},
-                           kMethods${JAVA_CLASS}Size) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, ${JAVA_CLASS}_clazz(env), __FILE__);
-    return false;
-  }
-""")
-    return self.SubstituteNativeMethods(template)
-
-  def GetOpenNamespaceString(self):
-    if self.namespace:
-      all_namespaces = ['namespace %s {' % ns
-                        for ns in self.namespace.split('::')]
-      return '\n'.join(all_namespaces)
-    return ''
-
-  def GetCloseNamespaceString(self):
-    if self.namespace:
-      all_namespaces = ['}  // namespace %s' % ns
-                        for ns in self.namespace.split('::')]
-      all_namespaces.reverse()
-      return '\n'.join(all_namespaces) + '\n'
-    return ''
-
-  def GetJNIFirstParamType(self, native):
-    if native.type == 'method':
-      return 'jobject'
-    elif native.type == 'function':
-      if native.static:
-        return 'jclass'
-      else:
-        return 'jobject'
-
-  def GetJNIFirstParam(self, native, for_declaration):
-    c_type = self.GetJNIFirstParamType(native)
-    if for_declaration:
-      c_type = WrapCTypeForDeclaration(c_type)
-    return [c_type + ' jcaller']
-
-  def GetParamsInDeclaration(self, native):
-    """Returns the params for the forward declaration.
-
-    Args:
-      native: the native dictionary describing the method.
-
-    Returns:
-      A string containing the params.
-    """
-    return ',\n    '.join(self.GetJNIFirstParam(native, True) +
-                          [JavaDataTypeToCForDeclaration(param.datatype) + ' ' +
-                           param.name
-                           for param in native.params])
-
-  def GetParamsInStub(self, native):
-    """Returns the params for the stub declaration.
-
-    Args:
-      native: the native dictionary describing the method.
-
-    Returns:
-      A string containing the params.
-    """
-    return ',\n    '.join(self.GetJNIFirstParam(native, False) +
-                          [JavaDataTypeToC(param.datatype) + ' ' +
-                           param.name
-                           for param in native.params])
-
-  def GetCalledByNativeParamsInDeclaration(self, called_by_native):
-    return ',\n    '.join([
-        JavaDataTypeToCForCalledByNativeParam(param.datatype) + ' ' +
-        param.name
-        for param in called_by_native.params])
-
-  def GetStubName(self, native):
-    """Return the name of the stub function for this native method.
-
-    Args:
-      native: the native dictionary describing the method.
-
-    Returns:
-      A string with the stub function name (used by the JVM).
-    """
-    template = Template("Java_${JAVA_NAME}_native${NAME}")
-
-    java_name = self.fully_qualified_class.replace('_', '_1').replace('/', '_')
-    if native.java_class_name:
-      java_name += '_00024' + native.java_class_name
-
-    values = {'NAME': native.name,
-              'JAVA_NAME': java_name}
-    return template.substitute(values)
-
-  def GetJavaParamRefForCall(self, c_type, name):
-    return Template(
-        'base::android::JavaParamRef<${TYPE}>(env, ${NAME})').substitute({
-        'TYPE': c_type,
-        'NAME': name,
-    })
-
-  def GetJNIFirstParamForCall(self, native):
-    c_type = self.GetJNIFirstParamType(native)
-    return [self.GetJavaParamRefForCall(c_type, 'jcaller')]
-
-  def GetNativeStub(self, native):
-    is_method = native.type == 'method'
-
-    if is_method:
-      params = native.params[1:]
-    else:
-      params = native.params
-    params_in_call = ['env'] + self.GetJNIFirstParamForCall(native)
-    for p in params:
-      c_type = JavaDataTypeToC(p.datatype)
-      if re.match(RE_SCOPED_JNI_TYPES, c_type):
-        params_in_call.append(self.GetJavaParamRefForCall(c_type, p.name))
-      else:
-        params_in_call.append(p.name)
-    params_in_call = ', '.join(params_in_call)
-
-    return_type = return_declaration = JavaDataTypeToC(native.return_type)
-    post_call = ''
-    if re.match(RE_SCOPED_JNI_TYPES, return_type):
-      post_call = '.Release()'
-      return_declaration = ('base::android::ScopedJavaLocalRef<' + return_type +
-                            '>')
-    profiling_entered_native = ''
-    if self.options.enable_profiling:
-      profiling_entered_native = 'JNI_LINK_SAVED_FRAME_POINTER;'
-    values = {
-        'RETURN': return_type,
-        'RETURN_DECLARATION': return_declaration,
-        'NAME': native.name,
-        'PARAMS': self.GetParamsInDeclaration(native),
-        'PARAMS_IN_STUB': self.GetParamsInStub(native),
-        'PARAMS_IN_CALL': params_in_call,
-        'POST_CALL': post_call,
-        'STUB_NAME': self.GetStubName(native),
-        'PROFILING_ENTERED_NATIVE': profiling_entered_native,
-    }
-
-    if is_method:
-      optional_error_return = JavaReturnValueToC(native.return_type)
-      if optional_error_return:
-        optional_error_return = ', ' + optional_error_return
-      values.update({
-          'OPTIONAL_ERROR_RETURN': optional_error_return,
-          'PARAM0_NAME': native.params[0].name,
-          'P0_TYPE': native.p0_type,
-      })
-      template = Template("""\
-JNI_GENERATOR_EXPORT ${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS_IN_STUB}) {
-  ${PROFILING_ENTERED_NATIVE}
-  ${P0_TYPE}* native = reinterpret_cast<${P0_TYPE}*>(${PARAM0_NAME});
-  CHECK_NATIVE_PTR(env, jcaller, native, "${NAME}"${OPTIONAL_ERROR_RETURN});
-  return native->${NAME}(${PARAMS_IN_CALL})${POST_CALL};
-}
-""")
-    else:
-      template = Template("""
-static ${RETURN_DECLARATION} ${NAME}(JNIEnv* env, ${PARAMS});
-
-JNI_GENERATOR_EXPORT ${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS_IN_STUB}) {
-  ${PROFILING_ENTERED_NATIVE}
-  return ${NAME}(${PARAMS_IN_CALL})${POST_CALL};
-}
-""")
-
-    return RemoveIndentedEmptyLines(template.substitute(values))
-
-  def GetArgument(self, param):
-    if param.datatype == 'int':
-      return 'as_jint(' + param.name + ')'
-    elif re.match(RE_SCOPED_JNI_TYPES, JavaDataTypeToC(param.datatype)):
-      return param.name + '.obj()'
-    else:
-      return param.name
-
-  def GetArgumentsInCall(self, params):
-    """Return a string of arguments to call from native into Java"""
-    return [self.GetArgument(p) for p in params]
-
-  def GetCalledByNativeValues(self, called_by_native):
-    """Fills in necessary values for the CalledByNative methods."""
-    java_class = called_by_native.java_class_name or self.class_name
-    if called_by_native.static or called_by_native.is_constructor:
-      first_param_in_declaration = ''
-      first_param_in_call = ('%s_clazz(env)' % java_class)
-    else:
-      first_param_in_declaration = (
-          ', const base::android::JavaRefOrBare<jobject>& obj')
-      first_param_in_call = 'obj.obj()'
-    params_in_declaration = self.GetCalledByNativeParamsInDeclaration(
-        called_by_native)
-    if params_in_declaration:
-      params_in_declaration = ', ' + params_in_declaration
-    params_in_call = ', '.join(self.GetArgumentsInCall(called_by_native.params))
-    if params_in_call:
-      params_in_call = ', ' + params_in_call
-    pre_call = ''
-    post_call = ''
-    if called_by_native.static_cast:
-      pre_call = 'static_cast<%s>(' % called_by_native.static_cast
-      post_call = ')'
-    check_exception = ''
-    if not called_by_native.unchecked:
-      check_exception = 'jni_generator::CheckException(env);'
-    return_type = JavaDataTypeToC(called_by_native.return_type)
-    optional_error_return = JavaReturnValueToC(called_by_native.return_type)
-    if optional_error_return:
-      optional_error_return = ', ' + optional_error_return
-    return_declaration = ''
-    return_clause = ''
-    if return_type != 'void':
-      pre_call = ' ' + pre_call
-      return_declaration = return_type + ' ret ='
-      if re.match(RE_SCOPED_JNI_TYPES, return_type):
-        return_type = 'base::android::ScopedJavaLocalRef<' + return_type + '>'
-        return_clause = 'return ' + return_type + '(env, ret);'
-      else:
-        return_clause = 'return ret;'
-    profiling_leaving_native = ''
-    if self.options.enable_profiling:
-      profiling_leaving_native = 'JNI_SAVE_FRAME_POINTER;'
-    return {
-        'JAVA_CLASS': java_class,
-        'RETURN_TYPE': return_type,
-        'OPTIONAL_ERROR_RETURN': optional_error_return,
-        'RETURN_DECLARATION': return_declaration,
-        'RETURN_CLAUSE': return_clause,
-        'FIRST_PARAM_IN_DECLARATION': first_param_in_declaration,
-        'PARAMS_IN_DECLARATION': params_in_declaration,
-        'PRE_CALL': pre_call,
-        'POST_CALL': post_call,
-        'ENV_CALL': called_by_native.env_call,
-        'FIRST_PARAM_IN_CALL': first_param_in_call,
-        'PARAMS_IN_CALL': params_in_call,
-        'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name,
-        'CHECK_EXCEPTION': check_exception,
-        'GET_METHOD_ID_IMPL': self.GetMethodIDImpl(called_by_native),
-        'PROFILING_LEAVING_NATIVE': profiling_leaving_native,
-    }
-
-
-  def GetLazyCalledByNativeMethodStub(self, called_by_native):
-    """Returns a string."""
-    function_signature_template = Template("""\
-static ${RETURN_TYPE} Java_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}(\
-JNIEnv* env${FIRST_PARAM_IN_DECLARATION}${PARAMS_IN_DECLARATION})""")
-    function_header_template = Template("""\
-${FUNCTION_SIGNATURE} {""")
-    function_header_with_unused_template = Template("""\
-${FUNCTION_SIGNATURE} __attribute__ ((unused));
-${FUNCTION_SIGNATURE} {""")
-    template = Template("""
-static base::subtle::AtomicWord g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = 0;
-${FUNCTION_HEADER}
-  CHECK_CLAZZ(env, ${FIRST_PARAM_IN_CALL},
-      ${JAVA_CLASS}_clazz(env)${OPTIONAL_ERROR_RETURN});
-  jmethodID method_id =
-    ${GET_METHOD_ID_IMPL}
-  ${PROFILING_LEAVING_NATIVE}
-  ${RETURN_DECLARATION}
-     ${PRE_CALL}env->${ENV_CALL}(${FIRST_PARAM_IN_CALL},
-          method_id${PARAMS_IN_CALL})${POST_CALL};
-  ${CHECK_EXCEPTION}
-  ${RETURN_CLAUSE}
-}""")
-    values = self.GetCalledByNativeValues(called_by_native)
-    values['FUNCTION_SIGNATURE'] = (
-        function_signature_template.substitute(values))
-    if called_by_native.system_class:
-      values['FUNCTION_HEADER'] = (
-          function_header_with_unused_template.substitute(values))
-    else:
-      values['FUNCTION_HEADER'] = function_header_template.substitute(values)
-    return RemoveIndentedEmptyLines(template.substitute(values))
-
-  def GetKMethodArrayEntry(self, native):
-    template = Template('    { "native${NAME}", ${JNI_SIGNATURE}, ' +
-                        'reinterpret_cast<void*>(${STUB_NAME}) },')
-    values = {'NAME': native.name,
-              'JNI_SIGNATURE': JniParams.Signature(native.params,
-                                                   native.return_type,
-                                                   True),
-              'STUB_NAME': self.GetStubName(native)}
-    return template.substitute(values)
-
-  def GetUniqueClasses(self, origin):
-    ret = {self.class_name: self.fully_qualified_class}
-    for entry in origin:
-      class_name = self.class_name
-      jni_class_path = self.fully_qualified_class
-      if entry.java_class_name:
-        class_name = entry.java_class_name
-        jni_class_path = self.fully_qualified_class + '$' + class_name
-      ret[class_name] = jni_class_path
-    return ret
-
-  def GetClassPathDefinitions(self):
-    """Returns the ClassPath constants."""
-    ret = []
-    template = Template("""\
-const char k${JAVA_CLASS}ClassPath[] = "${JNI_CLASS_PATH}";""")
-    all_classes = self.GetUniqueClasses(self.called_by_natives)
-    if self.options.native_exports_optional:
-      all_classes.update(self.GetUniqueClasses(self.natives))
-
-    for clazz in all_classes:
-      values = {
-          'JAVA_CLASS': clazz,
-          'JNI_CLASS_PATH': all_classes[clazz],
-      }
-      ret += [template.substitute(values)]
-    ret += ''
-
-    template = Template("""\
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_${JAVA_CLASS}_clazz __attribute__((unused)) = 0;
-#define ${JAVA_CLASS}_clazz(env) \
-base::android::LazyGetClass(env, k${JAVA_CLASS}ClassPath, \
-&g_${JAVA_CLASS}_clazz)""")
-
-    for clazz in all_classes:
-      values = {
-          'JAVA_CLASS': clazz,
-      }
-      ret += [template.substitute(values)]
-
-    return '\n'.join(ret)
-
-  def GetMethodIDImpl(self, called_by_native):
-    """Returns the implementation of GetMethodID."""
-    template = Template("""\
-  base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_${STATIC}>(
-      env, ${JAVA_CLASS}_clazz(env),
-      "${JNI_NAME}",
-      ${JNI_SIGNATURE},
-      &g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME});
-""")
-    jni_name = called_by_native.name
-    jni_return_type = called_by_native.return_type
-    if called_by_native.is_constructor:
-      jni_name = '<init>'
-      jni_return_type = 'void'
-    if called_by_native.signature:
-      signature = called_by_native.signature
-    else:
-      signature = JniParams.Signature(called_by_native.params,
-                                      jni_return_type,
-                                      True)
-    values = {
-        'JAVA_CLASS': called_by_native.java_class_name or self.class_name,
-        'JNI_NAME': jni_name,
-        'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name,
-        'STATIC': 'STATIC' if called_by_native.static else 'INSTANCE',
-        'JNI_SIGNATURE': signature,
-    }
-    return template.substitute(values)
-
-
-def WrapOutput(output):
-  ret = []
-  for line in output.splitlines():
-    # Do not wrap lines under 80 characters or preprocessor directives.
-    if len(line) < 80 or line.lstrip()[:1] == '#':
-      stripped = line.rstrip()
-      if len(ret) == 0 or len(ret[-1]) or len(stripped):
-        ret.append(stripped)
-    else:
-      first_line_indent = ' ' * (len(line) - len(line.lstrip()))
-      subsequent_indent =  first_line_indent + ' ' * 4
-      if line.startswith('//'):
-        subsequent_indent = '//' + subsequent_indent
-      wrapper = textwrap.TextWrapper(width=80,
-                                     subsequent_indent=subsequent_indent,
-                                     break_long_words=False)
-      ret += [wrapped.rstrip() for wrapped in wrapper.wrap(line)]
-  ret += ['']
-  return '\n'.join(ret)
-
-
-def ExtractJarInputFile(jar_file, input_file, out_dir):
-  """Extracts input file from jar and returns the filename.
-
-  The input file is extracted to the same directory that the generated jni
-  headers will be placed in.  This is passed as an argument to script.
-
-  Args:
-    jar_file: the jar file containing the input files to extract.
-    input_files: the list of files to extract from the jar file.
-    out_dir: the name of the directories to extract to.
-
-  Returns:
-    the name of extracted input file.
-  """
-  jar_file = zipfile.ZipFile(jar_file)
-
-  out_dir = os.path.join(out_dir, os.path.dirname(input_file))
-  try:
-    os.makedirs(out_dir)
-  except OSError as e:
-    if e.errno != errno.EEXIST:
-      raise
-  extracted_file_name = os.path.join(out_dir, os.path.basename(input_file))
-  with open(extracted_file_name, 'w') as outfile:
-    outfile.write(jar_file.read(input_file))
-
-  return extracted_file_name
-
-
-def GenerateJNIHeader(input_file, output_file, options):
-  try:
-    if os.path.splitext(input_file)[1] == '.class':
-      jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, options)
-      content = jni_from_javap.GetContent()
-    else:
-      jni_from_java_source = JNIFromJavaSource.CreateFromFile(
-          input_file, options)
-      content = jni_from_java_source.GetContent()
-  except ParseError, e:
-    print e
-    sys.exit(1)
-  if output_file:
-    if not os.path.exists(os.path.dirname(os.path.abspath(output_file))):
-      os.makedirs(os.path.dirname(os.path.abspath(output_file)))
-    if options.optimize_generation and os.path.exists(output_file):
-      with file(output_file, 'r') as f:
-        existing_content = f.read()
-        if existing_content == content:
-          return
-    with file(output_file, 'w') as f:
-      f.write(content)
-  else:
-    print content
-
-
-def GetScriptName():
-  script_components = os.path.abspath(sys.argv[0]).split(os.path.sep)
-  base_index = 0
-  for idx, value in enumerate(script_components):
-    if value == 'base' or value == 'third_party':
-      base_index = idx
-      break
-  return os.sep.join(script_components[base_index:])
-
-
-def main(argv):
-  usage = """usage: %prog [OPTIONS]
-This script will parse the given java source code extracting the native
-declarations and print the header file to stdout (or a file).
-See SampleForTests.java for more details.
-  """
-  option_parser = optparse.OptionParser(usage=usage)
-  build_utils.AddDepfileOption(option_parser)
-
-  option_parser.add_option('-j', '--jar_file', dest='jar_file',
-                           help='Extract the list of input files from'
-                           ' a specified jar file.'
-                           ' Uses javap to extract the methods from a'
-                           ' pre-compiled class. --input should point'
-                           ' to pre-compiled Java .class files.')
-  option_parser.add_option('-n', dest='namespace',
-                           help='Uses as a namespace in the generated header '
-                           'instead of the javap class name, or when there is '
-                           'no JNINamespace annotation in the java source.')
-  option_parser.add_option('--input_file',
-                           help='Single input file name. The output file name '
-                           'will be derived from it. Must be used with '
-                           '--output_dir.')
-  option_parser.add_option('--output_dir',
-                           help='The output directory. Must be used with '
-                           '--input')
-  option_parser.add_option('--optimize_generation', type="int",
-                           default=0, help='Whether we should optimize JNI '
-                           'generation by not regenerating files if they have '
-                           'not changed.')
-  option_parser.add_option('--script_name', default=GetScriptName(),
-                           help='The name of this script in the generated '
-                           'header.')
-  option_parser.add_option('--includes',
-                           help='The comma-separated list of header files to '
-                           'include in the generated header.')
-  option_parser.add_option('--ptr_type', default='int',
-                           type='choice', choices=['int', 'long'],
-                           help='The type used to represent native pointers in '
-                           'Java code. For 32-bit, use int; '
-                           'for 64-bit, use long.')
-  option_parser.add_option('--cpp', default='cpp',
-                           help='The path to cpp command.')
-  option_parser.add_option('--javap', default='javap',
-                           help='The path to javap command.')
-  option_parser.add_option('--native_exports_optional', action='store_true',
-                           help='Support both explicit and native method'
-                           'registration.')
-  option_parser.add_option('--enable_profiling', action='store_true',
-                           help='Add additional profiling instrumentation.')
-  options, args = option_parser.parse_args(argv)
-  if options.jar_file:
-    input_file = ExtractJarInputFile(options.jar_file, options.input_file,
-                                     options.output_dir)
-  elif options.input_file:
-    input_file = options.input_file
-  else:
-    option_parser.print_help()
-    print '\nError: Must specify --jar_file or --input_file.'
-    return 1
-  output_file = None
-  if options.output_dir:
-    root_name = os.path.splitext(os.path.basename(input_file))[0]
-    output_file = os.path.join(options.output_dir, root_name) + '_jni.h'
-  GenerateJNIHeader(input_file, output_file, options)
-
-  if options.depfile:
-    build_utils.WriteDepfile(options.depfile, output_file)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/base/android/jni_generator/jni_generator_helper.h b/base/android/jni_generator/jni_generator_helper.h
deleted file mode 100644
index 3062806..0000000
--- a/base/android/jni_generator/jni_generator_helper.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_ANDROID_JNI_GENERATOR_JNI_GENERATOR_HELPER_H_
-#define BASE_ANDROID_JNI_GENERATOR_JNI_GENERATOR_HELPER_H_
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/logging.h"
-#include "build/build_config.h"
-
-// Project-specific macros used by the header files generated by
-// jni_generator.py. Different projects can then specify their own
-// implementation for this file.
-#define CHECK_NATIVE_PTR(env, jcaller, native_ptr, method_name, ...) \
-  DCHECK(native_ptr) << method_name;
-
-#define CHECK_CLAZZ(env, jcaller, clazz, ...) DCHECK(clazz);
-
-#if defined(ARCH_CPU_X86)
-// Dalvik JIT generated code doesn't guarantee 16-byte stack alignment on
-// x86 - use force_align_arg_pointer to realign the stack at the JNI
-// boundary. crbug.com/655248
-#define JNI_GENERATOR_EXPORT \
-  extern "C" __attribute__((visibility("default"), force_align_arg_pointer))
-#else
-#define JNI_GENERATOR_EXPORT extern "C" __attribute__((visibility("default")))
-#endif
-
-namespace jni_generator {
-
-inline void HandleRegistrationError(JNIEnv* env,
-                                    jclass clazz,
-                                    const char* filename) {
-  LOG(ERROR) << "RegisterNatives failed in " << filename;
-}
-
-inline void CheckException(JNIEnv* env) {
-  base::android::CheckException(env);
-}
-
-inline bool ShouldSkipJniRegistration(bool is_maindex_class) {
-  switch (base::android::GetJniRegistrationType()) {
-    case base::android::ALL_JNI_REGISTRATION:
-      return false;
-    case base::android::NO_JNI_REGISTRATION:
-      // TODO(estevenson): Change this to a DCHECK.
-      return true;
-    case base::android::SELECTIVE_JNI_REGISTRATION:
-      return !is_maindex_class;
-    default:
-      NOTREACHED();
-      return false;
-  }
-}
-
-}  // namespace jni_generator
-
-#endif  // BASE_ANDROID_JNI_GENERATOR_JNI_GENERATOR_HELPER_H_
diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py
deleted file mode 100755
index c0c8238..0000000
--- a/base/android/jni_generator/jni_generator_tests.py
+++ /dev/null
@@ -1,1097 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 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.
-
-"""Tests for jni_generator.py.
-
-This test suite contains various tests for the JNI generator.
-It exercises the low-level parser all the way up to the
-code generator and ensures the output matches a golden
-file.
-"""
-
-import difflib
-import inspect
-import optparse
-import os
-import sys
-import unittest
-import jni_generator
-from jni_generator import CalledByNative, JniParams, NativeMethod, Param
-
-
-SCRIPT_NAME = 'base/android/jni_generator/jni_generator.py'
-INCLUDES = (
-    'base/android/jni_generator/jni_generator_helper.h'
-)
-
-# Set this environment variable in order to regenerate the golden text
-# files.
-REBASELINE_ENV = 'REBASELINE'
-
-class TestOptions(object):
-  """The mock options object which is passed to the jni_generator.py script."""
-
-  def __init__(self):
-    self.namespace = None
-    self.script_name = SCRIPT_NAME
-    self.includes = INCLUDES
-    self.ptr_type = 'long'
-    self.cpp = 'cpp'
-    self.javap = 'javap'
-    self.native_exports_optional = True
-    self.enable_profiling = False
-
-class TestGenerator(unittest.TestCase):
-  def assertObjEquals(self, first, second):
-    dict_first = first.__dict__
-    dict_second = second.__dict__
-    self.assertEquals(dict_first.keys(), dict_second.keys())
-    for key, value in dict_first.iteritems():
-      if (type(value) is list and len(value) and
-          isinstance(type(value[0]), object)):
-        self.assertListEquals(value, second.__getattribute__(key))
-      else:
-        actual = second.__getattribute__(key)
-        self.assertEquals(value, actual,
-                          'Key ' + key + ': ' + str(value) + '!=' + str(actual))
-
-  def assertListEquals(self, first, second):
-    self.assertEquals(len(first), len(second))
-    for i in xrange(len(first)):
-      if isinstance(first[i], object):
-        self.assertObjEquals(first[i], second[i])
-      else:
-        self.assertEquals(first[i], second[i])
-
-  def assertTextEquals(self, golden_text, generated_text):
-    if not self.compareText(golden_text, generated_text):
-      self.fail('Golden text mismatch.')
-
-  def compareText(self, golden_text, generated_text):
-    def FilterText(text):
-      return [
-          l.strip() for l in text.split('\n')
-          if not l.startswith('// Copyright')
-      ]
-    stripped_golden = FilterText(golden_text)
-    stripped_generated = FilterText(generated_text)
-    if stripped_golden == stripped_generated:
-      return True
-    print self.id()
-    for line in difflib.context_diff(stripped_golden, stripped_generated):
-      print line
-    print '\n\nGenerated'
-    print '=' * 80
-    print generated_text
-    print '=' * 80
-    print 'Run with:'
-    print 'REBASELINE=1', sys.argv[0]
-    print 'to regenerate the data files.'
-
-  def _ReadGoldenFile(self, golden_file):
-    if not os.path.exists(golden_file):
-      return None
-    with file(golden_file, 'r') as f:
-      return f.read()
-
-  def assertGoldenTextEquals(self, generated_text):
-    script_dir = os.path.dirname(sys.argv[0])
-    # This is the caller test method.
-    caller = inspect.stack()[1][3]
-    self.assertTrue(caller.startswith('test'),
-                    'assertGoldenTextEquals can only be called from a '
-                    'test* method, not %s' % caller)
-    golden_file = os.path.join(script_dir, caller + '.golden')
-    golden_text = self._ReadGoldenFile(golden_file)
-    if os.environ.get(REBASELINE_ENV):
-      if golden_text != generated_text:
-        with file(golden_file, 'w') as f:
-          f.write(generated_text)
-      return
-    self.assertTextEquals(golden_text, generated_text)
-
-  def testInspectCaller(self):
-    def willRaise():
-      # This function can only be called from a test* method.
-      self.assertGoldenTextEquals('')
-    self.assertRaises(AssertionError, willRaise)
-
-  def testNatives(self):
-    test_data = """"
-    interface OnFrameAvailableListener {}
-    private native int nativeInit();
-    private native void nativeDestroy(int nativeChromeBrowserProvider);
-    private native long nativeAddBookmark(
-            int nativeChromeBrowserProvider,
-            String url, String title, boolean isFolder, long parentId);
-    private static native String nativeGetDomainAndRegistry(String url);
-    private static native void nativeCreateHistoricalTabFromState(
-            byte[] state, int tab_index);
-    private native byte[] nativeGetStateAsByteArray(View view);
-    private static native String[] nativeGetAutofillProfileGUIDs();
-    private native void nativeSetRecognitionResults(
-            int sessionId, String[] results);
-    private native long nativeAddBookmarkFromAPI(
-            int nativeChromeBrowserProvider,
-            String url, Long created, Boolean isBookmark,
-            Long date, byte[] favicon, String title, Integer visits);
-    native int nativeFindAll(String find);
-    private static native OnFrameAvailableListener nativeGetInnerClass();
-    private native Bitmap nativeQueryBitmap(
-            int nativeChromeBrowserProvider,
-            String[] projection, String selection,
-            String[] selectionArgs, String sortOrder);
-    private native void nativeGotOrientation(
-            int nativeDataFetcherImplAndroid,
-            double alpha, double beta, double gamma);
-    private static native Throwable nativeMessWithJavaException(Throwable e);
-    """
-    jni_generator.JniParams.SetFullyQualifiedClass(
-        'org/chromium/example/jni_generator/SampleForTests')
-    jni_generator.JniParams.ExtractImportsAndInnerClasses(test_data)
-    natives = jni_generator.ExtractNatives(test_data, 'int')
-    golden_natives = [
-        NativeMethod(return_type='int', static=False,
-                     name='Init',
-                     params=[],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='void', static=False, name='Destroy',
-                     params=[Param(datatype='int',
-                                   name='nativeChromeBrowserProvider')],
-                     java_class_name=None,
-                     type='method',
-                     p0_type='ChromeBrowserProvider'),
-        NativeMethod(return_type='long', static=False, name='AddBookmark',
-                     params=[Param(datatype='int',
-                                   name='nativeChromeBrowserProvider'),
-                             Param(datatype='String',
-                                   name='url'),
-                             Param(datatype='String',
-                                   name='title'),
-                             Param(datatype='boolean',
-                                   name='isFolder'),
-                             Param(datatype='long',
-                                   name='parentId')],
-                     java_class_name=None,
-                     type='method',
-                     p0_type='ChromeBrowserProvider'),
-        NativeMethod(return_type='String', static=True,
-                     name='GetDomainAndRegistry',
-                     params=[Param(datatype='String',
-                                   name='url')],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='void', static=True,
-                     name='CreateHistoricalTabFromState',
-                     params=[Param(datatype='byte[]',
-                                   name='state'),
-                             Param(datatype='int',
-                                   name='tab_index')],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='byte[]', static=False,
-                     name='GetStateAsByteArray',
-                     params=[Param(datatype='View', name='view')],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='String[]', static=True,
-                     name='GetAutofillProfileGUIDs', params=[],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='void', static=False,
-                     name='SetRecognitionResults',
-                     params=[Param(datatype='int', name='sessionId'),
-                             Param(datatype='String[]', name='results')],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='long', static=False,
-                     name='AddBookmarkFromAPI',
-                     params=[Param(datatype='int',
-                                   name='nativeChromeBrowserProvider'),
-                             Param(datatype='String',
-                                   name='url'),
-                             Param(datatype='Long',
-                                   name='created'),
-                             Param(datatype='Boolean',
-                                   name='isBookmark'),
-                             Param(datatype='Long',
-                                   name='date'),
-                             Param(datatype='byte[]',
-                                   name='favicon'),
-                             Param(datatype='String',
-                                   name='title'),
-                             Param(datatype='Integer',
-                                   name='visits')],
-                     java_class_name=None,
-                     type='method',
-                     p0_type='ChromeBrowserProvider'),
-        NativeMethod(return_type='int', static=False,
-                     name='FindAll',
-                     params=[Param(datatype='String',
-                                   name='find')],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='OnFrameAvailableListener', static=True,
-                     name='GetInnerClass',
-                     params=[],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='Bitmap',
-                     static=False,
-                     name='QueryBitmap',
-                     params=[Param(datatype='int',
-                                   name='nativeChromeBrowserProvider'),
-                             Param(datatype='String[]',
-                                   name='projection'),
-                             Param(datatype='String',
-                                   name='selection'),
-                             Param(datatype='String[]',
-                                   name='selectionArgs'),
-                             Param(datatype='String',
-                                   name='sortOrder'),
-                            ],
-                     java_class_name=None,
-                     type='method',
-                     p0_type='ChromeBrowserProvider'),
-        NativeMethod(return_type='void', static=False,
-                     name='GotOrientation',
-                     params=[Param(datatype='int',
-                                   name='nativeDataFetcherImplAndroid'),
-                             Param(datatype='double',
-                                   name='alpha'),
-                             Param(datatype='double',
-                                   name='beta'),
-                             Param(datatype='double',
-                                   name='gamma'),
-                            ],
-                     java_class_name=None,
-                     type='method',
-                     p0_type='content::DataFetcherImplAndroid'),
-        NativeMethod(return_type='Throwable', static=True,
-                     name='MessWithJavaException',
-                     params=[Param(datatype='Throwable', name='e')],
-                     java_class_name=None,
-                     type='function')
-    ]
-    self.assertListEquals(golden_natives, natives)
-    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
-                                             natives, [], [], TestOptions())
-    self.assertGoldenTextEquals(h.GetContent())
-
-  def testInnerClassNatives(self):
-    test_data = """
-    class MyInnerClass {
-      @NativeCall("MyInnerClass")
-      private native int nativeInit();
-    }
-    """
-    natives = jni_generator.ExtractNatives(test_data, 'int')
-    golden_natives = [
-        NativeMethod(return_type='int', static=False,
-                     name='Init', params=[],
-                     java_class_name='MyInnerClass',
-                     type='function')
-    ]
-    self.assertListEquals(golden_natives, natives)
-    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
-                                             natives, [], [], TestOptions())
-    self.assertGoldenTextEquals(h.GetContent())
-
-  def testInnerClassNativesMultiple(self):
-    test_data = """
-    class MyInnerClass {
-      @NativeCall("MyInnerClass")
-      private native int nativeInit();
-    }
-    class MyOtherInnerClass {
-      @NativeCall("MyOtherInnerClass")
-      private native int nativeInit();
-    }
-    """
-    natives = jni_generator.ExtractNatives(test_data, 'int')
-    golden_natives = [
-        NativeMethod(return_type='int', static=False,
-                     name='Init', params=[],
-                     java_class_name='MyInnerClass',
-                     type='function'),
-        NativeMethod(return_type='int', static=False,
-                     name='Init', params=[],
-                     java_class_name='MyOtherInnerClass',
-                     type='function')
-    ]
-    self.assertListEquals(golden_natives, natives)
-    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
-                                             natives, [], [], TestOptions())
-    self.assertGoldenTextEquals(h.GetContent())
-
-  def testInnerClassNativesBothInnerAndOuter(self):
-    test_data = """
-    class MyOuterClass {
-      private native int nativeInit();
-      class MyOtherInnerClass {
-        @NativeCall("MyOtherInnerClass")
-        private native int nativeInit();
-      }
-    }
-    """
-    natives = jni_generator.ExtractNatives(test_data, 'int')
-    golden_natives = [
-        NativeMethod(return_type='int', static=False,
-                     name='Init', params=[],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='int', static=False,
-                     name='Init', params=[],
-                     java_class_name='MyOtherInnerClass',
-                     type='function')
-    ]
-    self.assertListEquals(golden_natives, natives)
-    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
-                                             natives, [], [], TestOptions())
-    self.assertGoldenTextEquals(h.GetContent())
-
-  def testCalledByNatives(self):
-    test_data = """"
-    import android.graphics.Bitmap;
-    import android.view.View;
-    import java.io.InputStream;
-    import java.util.List;
-
-    class InnerClass {}
-
-    @CalledByNative
-    InnerClass showConfirmInfoBar(int nativeInfoBar,
-            String buttonOk, String buttonCancel, String title, Bitmap icon) {
-        InfoBar infobar = new ConfirmInfoBar(nativeInfoBar, mContext,
-                                             buttonOk, buttonCancel,
-                                             title, icon);
-        return infobar;
-    }
-    @CalledByNative
-    InnerClass showAutoLoginInfoBar(int nativeInfoBar,
-            String realm, String account, String args) {
-        AutoLoginInfoBar infobar = new AutoLoginInfoBar(nativeInfoBar, mContext,
-                realm, account, args);
-        if (infobar.displayedAccountCount() == 0)
-            infobar = null;
-        return infobar;
-    }
-    @CalledByNative("InfoBar")
-    void dismiss();
-    @SuppressWarnings("unused")
-    @CalledByNative
-    private static boolean shouldShowAutoLogin(View view,
-            String realm, String account, String args) {
-        AccountManagerContainer accountManagerContainer =
-            new AccountManagerContainer((Activity)contentView.getContext(),
-            realm, account, args);
-        String[] logins = accountManagerContainer.getAccountLogins(null);
-        return logins.length != 0;
-    }
-    @CalledByNative
-    static InputStream openUrl(String url) {
-        return null;
-    }
-    @CalledByNative
-    private void activateHardwareAcceleration(final boolean activated,
-            final int iPid, final int iType,
-            final int iPrimaryID, final int iSecondaryID) {
-      if (!activated) {
-          return
-      }
-    }
-    @CalledByNative
-    public static @Status int updateStatus(@Status int status) {
-        return getAndUpdateStatus(status);
-    }
-    @CalledByNativeUnchecked
-    private void uncheckedCall(int iParam);
-
-    @CalledByNative
-    public byte[] returnByteArray();
-
-    @CalledByNative
-    public boolean[] returnBooleanArray();
-
-    @CalledByNative
-    public char[] returnCharArray();
-
-    @CalledByNative
-    public short[] returnShortArray();
-
-    @CalledByNative
-    public int[] returnIntArray();
-
-    @CalledByNative
-    public long[] returnLongArray();
-
-    @CalledByNative
-    public double[] returnDoubleArray();
-
-    @CalledByNative
-    public Object[] returnObjectArray();
-
-    @CalledByNative
-    public byte[][] returnArrayOfByteArray();
-
-    @CalledByNative
-    public Bitmap.CompressFormat getCompressFormat();
-
-    @CalledByNative
-    public List<Bitmap.CompressFormat> getCompressFormatList();
-    """
-    jni_generator.JniParams.SetFullyQualifiedClass('org/chromium/Foo')
-    jni_generator.JniParams.ExtractImportsAndInnerClasses(test_data)
-    called_by_natives = jni_generator.ExtractCalledByNatives(test_data)
-    golden_called_by_natives = [
-        CalledByNative(
-            return_type='InnerClass',
-            system_class=False,
-            static=False,
-            name='showConfirmInfoBar',
-            method_id_var_name='showConfirmInfoBar',
-            java_class_name='',
-            params=[Param(datatype='int', name='nativeInfoBar'),
-                    Param(datatype='String', name='buttonOk'),
-                    Param(datatype='String', name='buttonCancel'),
-                    Param(datatype='String', name='title'),
-                    Param(datatype='Bitmap', name='icon')],
-            env_call=('Object', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='InnerClass',
-            system_class=False,
-            static=False,
-            name='showAutoLoginInfoBar',
-            method_id_var_name='showAutoLoginInfoBar',
-            java_class_name='',
-            params=[Param(datatype='int', name='nativeInfoBar'),
-                    Param(datatype='String', name='realm'),
-                    Param(datatype='String', name='account'),
-                    Param(datatype='String', name='args')],
-            env_call=('Object', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='void',
-            system_class=False,
-            static=False,
-            name='dismiss',
-            method_id_var_name='dismiss',
-            java_class_name='InfoBar',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='boolean',
-            system_class=False,
-            static=True,
-            name='shouldShowAutoLogin',
-            method_id_var_name='shouldShowAutoLogin',
-            java_class_name='',
-            params=[Param(datatype='View', name='view'),
-                    Param(datatype='String', name='realm'),
-                    Param(datatype='String', name='account'),
-                    Param(datatype='String', name='args')],
-            env_call=('Boolean', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='InputStream',
-            system_class=False,
-            static=True,
-            name='openUrl',
-            method_id_var_name='openUrl',
-            java_class_name='',
-            params=[Param(datatype='String', name='url')],
-            env_call=('Object', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='void',
-            system_class=False,
-            static=False,
-            name='activateHardwareAcceleration',
-            method_id_var_name='activateHardwareAcceleration',
-            java_class_name='',
-            params=[Param(datatype='boolean', name='activated'),
-                    Param(datatype='int', name='iPid'),
-                    Param(datatype='int', name='iType'),
-                    Param(datatype='int', name='iPrimaryID'),
-                    Param(datatype='int', name='iSecondaryID'),
-                   ],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-          return_type='int',
-          system_class=False,
-          static=True,
-          name='updateStatus',
-          method_id_var_name='updateStatus',
-          java_class_name='',
-          params=[Param(datatype='int', name='status')],
-          env_call=('Integer', ''),
-          unchecked=False,
-        ),
-        CalledByNative(
-            return_type='void',
-            system_class=False,
-            static=False,
-            name='uncheckedCall',
-            method_id_var_name='uncheckedCall',
-            java_class_name='',
-            params=[Param(datatype='int', name='iParam')],
-            env_call=('Void', ''),
-            unchecked=True,
-        ),
-        CalledByNative(
-            return_type='byte[]',
-            system_class=False,
-            static=False,
-            name='returnByteArray',
-            method_id_var_name='returnByteArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='boolean[]',
-            system_class=False,
-            static=False,
-            name='returnBooleanArray',
-            method_id_var_name='returnBooleanArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='char[]',
-            system_class=False,
-            static=False,
-            name='returnCharArray',
-            method_id_var_name='returnCharArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='short[]',
-            system_class=False,
-            static=False,
-            name='returnShortArray',
-            method_id_var_name='returnShortArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='int[]',
-            system_class=False,
-            static=False,
-            name='returnIntArray',
-            method_id_var_name='returnIntArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='long[]',
-            system_class=False,
-            static=False,
-            name='returnLongArray',
-            method_id_var_name='returnLongArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='double[]',
-            system_class=False,
-            static=False,
-            name='returnDoubleArray',
-            method_id_var_name='returnDoubleArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='Object[]',
-            system_class=False,
-            static=False,
-            name='returnObjectArray',
-            method_id_var_name='returnObjectArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='byte[][]',
-            system_class=False,
-            static=False,
-            name='returnArrayOfByteArray',
-            method_id_var_name='returnArrayOfByteArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='Bitmap.CompressFormat',
-            system_class=False,
-            static=False,
-            name='getCompressFormat',
-            method_id_var_name='getCompressFormat',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='List<Bitmap.CompressFormat>',
-            system_class=False,
-            static=False,
-            name='getCompressFormatList',
-            method_id_var_name='getCompressFormatList',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-    ]
-    self.assertListEquals(golden_called_by_natives, called_by_natives)
-    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
-                                             [], called_by_natives, [],
-                                             TestOptions())
-    self.assertGoldenTextEquals(h.GetContent())
-
-  def testCalledByNativeParseError(self):
-    try:
-      jni_generator.ExtractCalledByNatives("""
-@CalledByNative
-public static int foo(); // This one is fine
-
-@CalledByNative
-scooby doo
-""")
-      self.fail('Expected a ParseError')
-    except jni_generator.ParseError, e:
-      self.assertEquals(('@CalledByNative', 'scooby doo'), e.context_lines)
-
-  def testFullyQualifiedClassName(self):
-    contents = """
-// Copyright (c) 2010 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.
-
-package org.chromium.content.browser;
-
-import org.chromium.base.BuildInfo;
-"""
-    self.assertEquals('org/chromium/content/browser/Foo',
-                      jni_generator.ExtractFullyQualifiedJavaClassName(
-                          'org/chromium/content/browser/Foo.java', contents))
-    self.assertEquals('org/chromium/content/browser/Foo',
-                      jni_generator.ExtractFullyQualifiedJavaClassName(
-                          'frameworks/Foo.java', contents))
-    self.assertRaises(SyntaxError,
-                      jni_generator.ExtractFullyQualifiedJavaClassName,
-                      'com/foo/Bar', 'no PACKAGE line')
-
-  def testMethodNameMangling(self):
-    self.assertEquals('closeV',
-        jni_generator.GetMangledMethodName('close', [], 'void'))
-    self.assertEquals('readI_AB_I_I',
-        jni_generator.GetMangledMethodName('read',
-            [Param(name='p1',
-                   datatype='byte[]'),
-             Param(name='p2',
-                   datatype='int'),
-             Param(name='p3',
-                   datatype='int'),],
-             'int'))
-    self.assertEquals('openJIIS_JLS',
-        jni_generator.GetMangledMethodName('open',
-            [Param(name='p1',
-                   datatype='java/lang/String'),],
-             'java/io/InputStream'))
-
-  def testFromJavaPGenerics(self):
-    contents = """
-public abstract class java.util.HashSet<T> extends java.util.AbstractSet<E>
-      implements java.util.Set<E>, java.lang.Cloneable, java.io.Serializable {
-    public void dummy();
-  Signature: ()V
-}
-"""
-    jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
-                                                TestOptions())
-    self.assertEquals(1, len(jni_from_javap.called_by_natives))
-    self.assertGoldenTextEquals(jni_from_javap.GetContent())
-
-  def testSnippnetJavap6_7_8(self):
-    content_javap6 = """
-public class java.util.HashSet {
-public boolean add(java.lang.Object);
- Signature: (Ljava/lang/Object;)Z
-}
-"""
-
-    content_javap7 = """
-public class java.util.HashSet {
-public boolean add(E);
-  Signature: (Ljava/lang/Object;)Z
-}
-"""
-
-    content_javap8 = """
-public class java.util.HashSet {
-  public boolean add(E);
-    descriptor: (Ljava/lang/Object;)Z
-}
-"""
-
-    jni_from_javap6 = jni_generator.JNIFromJavaP(content_javap6.split('\n'),
-                                                 TestOptions())
-    jni_from_javap7 = jni_generator.JNIFromJavaP(content_javap7.split('\n'),
-                                                 TestOptions())
-    jni_from_javap8 = jni_generator.JNIFromJavaP(content_javap8.split('\n'),
-                                                 TestOptions())
-    self.assertTrue(jni_from_javap6.GetContent())
-    self.assertTrue(jni_from_javap7.GetContent())
-    self.assertTrue(jni_from_javap8.GetContent())
-    # Ensure the javap7 is correctly parsed and uses the Signature field rather
-    # than the "E" parameter.
-    self.assertTextEquals(jni_from_javap6.GetContent(),
-                          jni_from_javap7.GetContent())
-    # Ensure the javap8 is correctly parsed and uses the descriptor field.
-    self.assertTextEquals(jni_from_javap7.GetContent(),
-                          jni_from_javap8.GetContent())
-
-  def testFromJavaP(self):
-    contents = self._ReadGoldenFile(os.path.join(os.path.dirname(sys.argv[0]),
-        'testInputStream.javap'))
-    jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
-                                                TestOptions())
-    self.assertEquals(10, len(jni_from_javap.called_by_natives))
-    self.assertGoldenTextEquals(jni_from_javap.GetContent())
-
-  def testConstantsFromJavaP(self):
-    for f in ['testMotionEvent.javap', 'testMotionEvent.javap7']:
-      contents = self._ReadGoldenFile(os.path.join(os.path.dirname(sys.argv[0]),
-          f))
-      jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
-                                                  TestOptions())
-      self.assertEquals(86, len(jni_from_javap.called_by_natives))
-      self.assertGoldenTextEquals(jni_from_javap.GetContent())
-
-  def testREForNatives(self):
-    # We should not match "native SyncSetupFlow" inside the comment.
-    test_data = """
-    /**
-     * Invoked when the setup process is complete so we can disconnect from the
-     * native-side SyncSetupFlowHandler.
-     */
-    public void destroy() {
-        Log.v(TAG, "Destroying native SyncSetupFlow");
-        if (mNativeSyncSetupFlow != 0) {
-            nativeSyncSetupEnded(mNativeSyncSetupFlow);
-            mNativeSyncSetupFlow = 0;
-        }
-    }
-    private native void nativeSyncSetupEnded(
-        int nativeAndroidSyncSetupFlowHandler);
-    """
-    jni_from_java = jni_generator.JNIFromJavaSource(
-        test_data, 'foo/bar', TestOptions())
-
-  def testRaisesOnNonJNIMethod(self):
-    test_data = """
-    class MyInnerClass {
-      private int Foo(int p0) {
-      }
-    }
-    """
-    self.assertRaises(SyntaxError,
-                      jni_generator.JNIFromJavaSource,
-                      test_data, 'foo/bar', TestOptions())
-
-  def testJniSelfDocumentingExample(self):
-    script_dir = os.path.dirname(sys.argv[0])
-    content = file(os.path.join(script_dir,
-        'java/src/org/chromium/example/jni_generator/SampleForTests.java')
-        ).read()
-    golden_file = os.path.join(script_dir, 'SampleForTests_jni.golden')
-    golden_content = file(golden_file).read()
-    jni_from_java = jni_generator.JNIFromJavaSource(
-        content, 'org/chromium/example/jni_generator/SampleForTests',
-        TestOptions())
-    generated_text = jni_from_java.GetContent()
-    if not self.compareText(golden_content, generated_text):
-      if os.environ.get(REBASELINE_ENV):
-        with file(golden_file, 'w') as f:
-          f.write(generated_text)
-        return
-      self.fail('testJniSelfDocumentingExample')
-
-  def testNoWrappingPreprocessorLines(self):
-    test_data = """
-    package com.google.lookhowextremelylongiam.snarf.icankeepthisupallday;
-
-    class ReallyLongClassNamesAreAllTheRage {
-        private static native int nativeTest();
-    }
-    """
-    jni_from_java = jni_generator.JNIFromJavaSource(
-        test_data, ('com/google/lookhowextremelylongiam/snarf/'
-                    'icankeepthisupallday/ReallyLongClassNamesAreAllTheRage'),
-        TestOptions())
-    jni_lines = jni_from_java.GetContent().split('\n')
-    line = filter(lambda line: line.lstrip().startswith('#ifndef'),
-                  jni_lines)[0]
-    self.assertTrue(len(line) > 80,
-                    ('Expected #ifndef line to be > 80 chars: ', line))
-
-  def testImports(self):
-    import_header = """
-// Copyright (c) 2012 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.
-
-package org.chromium.content.app;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.SurfaceTexture;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.ParcelFileDescriptor;
-import android.os.Process;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.Surface;
-
-import java.util.ArrayList;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.content.app.ContentMain;
-import org.chromium.content.browser.SandboxedProcessConnection;
-import org.chromium.content.common.ISandboxedProcessCallback;
-import org.chromium.content.common.ISandboxedProcessService;
-import org.chromium.content.common.WillNotRaise.AnException;
-import org.chromium.content.common.WillRaise.AnException;
-
-import static org.chromium.Bar.Zoo;
-
-class Foo {
-  public static class BookmarkNode implements Parcelable {
-  }
-  public interface PasswordListObserver {
-  }
-}
-    """
-    jni_generator.JniParams.SetFullyQualifiedClass(
-        'org/chromium/content/app/Foo')
-    jni_generator.JniParams.ExtractImportsAndInnerClasses(import_header)
-    self.assertTrue('Lorg/chromium/content/common/ISandboxedProcessService' in
-                    jni_generator.JniParams._imports)
-    self.assertTrue('Lorg/chromium/Bar/Zoo' in
-                    jni_generator.JniParams._imports)
-    self.assertTrue('Lorg/chromium/content/app/Foo$BookmarkNode' in
-                    jni_generator.JniParams._inner_classes)
-    self.assertTrue('Lorg/chromium/content/app/Foo$PasswordListObserver' in
-                    jni_generator.JniParams._inner_classes)
-    self.assertEquals('Lorg/chromium/content/app/ContentMain$Inner;',
-                      jni_generator.JniParams.JavaToJni('ContentMain.Inner'))
-    self.assertRaises(SyntaxError,
-                      jni_generator.JniParams.JavaToJni,
-                      'AnException')
-
-  def testJniParamsJavaToJni(self):
-    self.assertTextEquals('I', JniParams.JavaToJni('int'))
-    self.assertTextEquals('[B', JniParams.JavaToJni('byte[]'))
-    self.assertTextEquals(
-        '[Ljava/nio/ByteBuffer;', JniParams.JavaToJni('java/nio/ByteBuffer[]'))
-
-  def testNativesLong(self):
-    test_options = TestOptions()
-    test_options.ptr_type = 'long'
-    test_data = """"
-    private native void nativeDestroy(long nativeChromeBrowserProvider);
-    """
-    jni_generator.JniParams.ExtractImportsAndInnerClasses(test_data)
-    natives = jni_generator.ExtractNatives(test_data, test_options.ptr_type)
-    golden_natives = [
-        NativeMethod(return_type='void', static=False, name='Destroy',
-                     params=[Param(datatype='long',
-                                   name='nativeChromeBrowserProvider')],
-                     java_class_name=None,
-                     type='method',
-                     p0_type='ChromeBrowserProvider',
-                     ptr_type=test_options.ptr_type),
-    ]
-    self.assertListEquals(golden_natives, natives)
-    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
-                                             natives, [], [], test_options)
-    self.assertGoldenTextEquals(h.GetContent())
-
-  def testMainDexFile(self):
-    test_data = """
-    package org.chromium.example.jni_generator;
-
-    @MainDex
-    class Test {
-        private static native int nativeStaticMethod(long nativeTest, int arg1);
-    }
-    """
-    options = TestOptions()
-    jni_from_java = jni_generator.JNIFromJavaSource(
-      test_data, 'org/chromium/foo/Bar', options)
-    self.assertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testNonMainDexFile(self):
-    test_data = """
-    package org.chromium.example.jni_generator;
-
-    class Test {
-        private static native int nativeStaticMethod(long nativeTest, int arg1);
-    }
-    """
-    options = TestOptions()
-    jni_from_java = jni_generator.JNIFromJavaSource(
-      test_data, 'org/chromium/foo/Bar', options)
-    self.assertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testNativeExportsOnlyOption(self):
-    test_data = """
-    package org.chromium.example.jni_generator;
-
-    /** The pointer to the native Test. */
-    long nativeTest;
-
-    class Test {
-        private static native int nativeStaticMethod(long nativeTest, int arg1);
-        private native int nativeMethod(long nativeTest, int arg1);
-        @CalledByNative
-        private void testMethodWithParam(int iParam);
-        @CalledByNative
-        private String testMethodWithParamAndReturn(int iParam);
-        @CalledByNative
-        private static int testStaticMethodWithParam(int iParam);
-        @CalledByNative
-        private static double testMethodWithNoParam();
-        @CalledByNative
-        private static String testStaticMethodWithNoParam();
-
-        class MyInnerClass {
-          @NativeCall("MyInnerClass")
-          private native int nativeInit();
-        }
-        class MyOtherInnerClass {
-          @NativeCall("MyOtherInnerClass")
-          private native int nativeInit();
-        }
-    }
-    """
-    options = TestOptions()
-    options.native_exports_optional = False
-    jni_from_java = jni_generator.JNIFromJavaSource(
-        test_data, 'org/chromium/example/jni_generator/SampleForTests', options)
-    self.assertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testOuterInnerRaises(self):
-    test_data = """
-    package org.chromium.media;
-
-    @CalledByNative
-    static int getCaptureFormatWidth(VideoCapture.CaptureFormat format) {
-        return format.getWidth();
-    }
-    """
-    def willRaise():
-      jni_generator.JNIFromJavaSource(
-          test_data,
-          'org/chromium/media/VideoCaptureFactory',
-          TestOptions())
-    self.assertRaises(SyntaxError, willRaise)
-
-  def testSingleJNIAdditionalImport(self):
-    test_data = """
-    package org.chromium.foo;
-
-    @JNIAdditionalImport(Bar.class)
-    class Foo {
-
-    @CalledByNative
-    private static void calledByNative(Bar.Callback callback) {
-    }
-
-    private static native void nativeDoSomething(Bar.Callback callback);
-    }
-    """
-    jni_from_java = jni_generator.JNIFromJavaSource(test_data,
-                                                    'org/chromium/foo/Foo',
-                                                    TestOptions())
-    self.assertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testMultipleJNIAdditionalImport(self):
-    test_data = """
-    package org.chromium.foo;
-
-    @JNIAdditionalImport({Bar1.class, Bar2.class})
-    class Foo {
-
-    @CalledByNative
-    private static void calledByNative(Bar1.Callback callback1,
-                                       Bar2.Callback callback2) {
-    }
-
-    private static native void nativeDoSomething(Bar1.Callback callback1,
-                                                 Bar2.Callback callback2);
-    }
-    """
-    jni_from_java = jni_generator.JNIFromJavaSource(test_data,
-                                                    'org/chromium/foo/Foo',
-                                                    TestOptions())
-    self.assertGoldenTextEquals(jni_from_java.GetContent())
-
-
-def TouchStamp(stamp_path):
-  dir_name = os.path.dirname(stamp_path)
-  if not os.path.isdir(dir_name):
-    os.makedirs(dir_name)
-
-  with open(stamp_path, 'a'):
-    os.utime(stamp_path, None)
-
-
-def main(argv):
-  parser = optparse.OptionParser()
-  parser.add_option('--stamp', help='Path to touch on success.')
-  options, _ = parser.parse_args(argv[1:])
-
-  test_result = unittest.main(argv=argv[0:1], exit=False)
-
-  if test_result.result.wasSuccessful() and options.stamp:
-    TouchStamp(options.stamp)
-
-  return not test_result.result.wasSuccessful()
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/base/android/jni_generator/sample_for_tests.cc b/base/android/jni_generator/sample_for_tests.cc
deleted file mode 100644
index 42b2143..0000000
--- a/base/android/jni_generator/sample_for_tests.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright (c) 2012 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 <iostream>
-
-#include "base/android/jni_generator/sample_for_tests.h"
-
-#include "base/android/jni_android.h"
-#include "base/android/jni_string.h"
-#include "base/android/scoped_java_ref.h"
-// Generated file for JNI bindings from C++ to Java @CalledByNative methods.
-// Only to be included in one .cc file.
-// Name is based on the java file name: *.java -> jni/*_jni.h
-#include "jni/SampleForTests_jni.h"  // Generated by JNI.
-
-using base::android::AttachCurrentThread;
-using base::android::ConvertJavaStringToUTF8;
-using base::android::ConvertUTF8ToJavaString;
-using base::android::ScopedJavaLocalRef;
-
-namespace base {
-namespace android {
-
-jdouble CPPClass::InnerClass::MethodOtherP0(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
-  return 0.0;
-}
-
-CPPClass::CPPClass() {
-}
-
-CPPClass::~CPPClass() {
-}
-
-// static
-bool CPPClass::RegisterJNI(JNIEnv* env) {
-  return RegisterNativesImpl(env);  // Generated in SampleForTests_jni.h
-}
-
-void CPPClass::Destroy(JNIEnv* env, const JavaParamRef<jobject>& caller) {
-  delete this;
-}
-
-jint CPPClass::Method(JNIEnv* env, const JavaParamRef<jobject>& caller) {
-  return 0;
-}
-
-void CPPClass::AddStructB(JNIEnv* env,
-                          const JavaParamRef<jobject>& caller,
-                          const JavaParamRef<jobject>& structb) {
-  long key = Java_InnerStructB_getKey(env, structb);
-  std::string value =
-      ConvertJavaStringToUTF8(env, Java_InnerStructB_getValue(env, structb));
-  map_[key] = value;
-}
-
-void CPPClass::IterateAndDoSomethingWithStructB(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
-  // Iterate over the elements and do something with them.
-  for (std::map<long, std::string>::const_iterator it = map_.begin();
-       it != map_.end(); ++it) {
-    long key = it->first;
-    std::string value = it->second;
-    std::cout << key << value;
-  }
-  map_.clear();
-}
-
-ScopedJavaLocalRef<jstring> CPPClass::ReturnAString(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
-  return ConvertUTF8ToJavaString(env, "test");
-}
-
-// Static free functions declared and called directly from java.
-static jlong Init(JNIEnv* env,
-                  const JavaParamRef<jobject>& caller,
-                  const JavaParamRef<jstring>& param) {
-  return 0;
-}
-
-static jdouble GetDoubleFunction(JNIEnv*, const JavaParamRef<jobject>&) {
-  return 0;
-}
-
-static jfloat GetFloatFunction(JNIEnv*, const JavaParamRef<jclass>&) {
-  return 0;
-}
-
-static void SetNonPODDatatype(JNIEnv*,
-                              const JavaParamRef<jobject>&,
-                              const JavaParamRef<jobject>&) {}
-
-static ScopedJavaLocalRef<jobject> GetNonPODDatatype(
-    JNIEnv*,
-    const JavaParamRef<jobject>&) {
-  return ScopedJavaLocalRef<jobject>();
-}
-
-static jint GetInnerIntFunction(JNIEnv*, const JavaParamRef<jclass>&) {
-  return 0;
-}
-
-} // namespace android
-} // namespace base
-
-int main() {
-  // On a regular application, you'd call AttachCurrentThread(). This sample is
-  // not yet linking with all the libraries.
-  JNIEnv* env = /* AttachCurrentThread() */ NULL;
-
-  // This is how you call a java static method from C++.
-  bool foo = base::android::Java_SampleForTests_staticJavaMethod(env);
-
-  // This is how you call a java method from C++. Note that you must have
-  // obtained the jobject somehow.
-  ScopedJavaLocalRef<jobject> my_java_object;
-  int bar = base::android::Java_SampleForTests_javaMethod(
-      env, my_java_object, 1, 2);
-
-  std::cout << foo << bar;
-
-  for (int i = 0; i < 10; ++i) {
-    // Creates a "struct" that will then be used by the java side.
-    ScopedJavaLocalRef<jobject> struct_a =
-        base::android::Java_InnerStructA_create(
-            env, 0, 1, ConvertUTF8ToJavaString(env, "test"));
-    base::android::Java_SampleForTests_addStructA(env, my_java_object,
-                                                  struct_a);
-  }
-  base::android::Java_SampleForTests_iterateAndDoSomething(env, my_java_object);
-  base::android::Java_SampleForTests_packagePrivateJavaMethod(env,
-                                                              my_java_object);
-  base::android::Java_SampleForTests_methodThatThrowsException(env,
-                                                               my_java_object);
-  base::android::Java_SampleForTests_javaMethodWithAnnotatedParam(
-      env, my_java_object, 42);
-  return 0;
-}
diff --git a/base/android/jni_generator/sample_for_tests.h b/base/android/jni_generator/sample_for_tests.h
deleted file mode 100644
index a9cf7b0..0000000
--- a/base/android/jni_generator/sample_for_tests.h
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright (c) 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.
-
-#ifndef BASE_ANDROID_JNI_GENERATOR_SAMPLE_FOR_TESTS_H_
-#define BASE_ANDROID_JNI_GENERATOR_SAMPLE_FOR_TESTS_H_
-
-#include <jni.h>
-#include <map>
-#include <string>
-
-#include "base/android/jni_android.h"
-
-namespace base {
-namespace android {
-
-// This file is used to:
-// - document the best practices and guidelines on JNI usage.
-// - ensure sample_for_tests_jni.h compiles and the functions declared in it
-// as expected.
-//
-// Methods are called directly from Java (except RegisterJNI). More
-// documentation in SampleForTests.java
-//
-// For C++ to access Java methods:
-// - GN Build must be configured to generate bindings:
-//  # Add import at top of file:
-//  if (is_android) {
-//    import("//build/config/android/rules.gni")  # For generate_jni().
-//  }
-//  # ...
-//  # An example target that will rely on JNI:
-//  component("foo") {
-//    # ... normal sources, defines, deps.
-//    #     For each jni generated .java -> .h header file in jni_headers
-//    #     target there will be a single .cc file here that includes it.
-//    #
-//    # Add a dep for JNI:
-//    if (is_android) {
-//      deps += [ ":foo_jni" ]
-//    }
-//  }
-//  # ...
-//  # Create target for JNI:
-//  if (is_android) {
-//    generate_jni("jni_headers") {
-//      sources = [
-//        "java/src/org/chromium/example/jni_generator/SampleForTests.java",
-//      ]
-//      jni_package = "foo"
-//    }
-//    android_library("java") {
-//      java_files = [
-//        "java/src/org/chromium/example/jni_generator/SampleForTests.java",
-//        "java/src/org/chromium/example/jni_generator/NonJniFile.java",
-//      ]
-//    }
-//  }
-//
-// For C++ methods to be exposed to Java:
-// - The generated RegisterNativesImpl method must be called, this is typically
-//   done by having a static RegisterJNI method in the C++ class.
-// - The RegisterJNI method is added to a module's collection of register
-//   methods, such as: example_jni_registrar.h/cc files which call
-//   base::android::RegisterNativeMethods.
-//   An example_jni_registstrar.cc:
-//
-//     namespace {
-//     const base::android::RegistrationMethod kRegisteredMethods[] = {
-//         // Initial string is for debugging only.
-//         { "ExampleName", base::ExampleNameAndroid::RegisterJNI },
-//         { "ExampleName2", base::ExampleName2Android::RegisterJNI },
-//     };
-//     }  // namespace
-//
-//     bool RegisterModuleNameJni(JNIEnv* env) {
-//       return RegisterNativeMethods(env, kRegisteredMethods,
-//                                    arraysize(kRegisteredMethods));
-//     }
-//
-//  - Each module's RegisterModuleNameJni must be called by a larger module,
-//    or application during startup.
-//
-class CPPClass {
- public:
-  CPPClass();
-  ~CPPClass();
-
-  // Register C++ methods exposed to Java using JNI.
-  static bool RegisterJNI(JNIEnv* env);
-
-  // Java @CalledByNative methods implicitly available to C++ via the _jni.h
-  // file included in the .cc file.
-
-  class InnerClass {
-   public:
-    jdouble MethodOtherP0(JNIEnv* env,
-                          const base::android::JavaParamRef<jobject>& caller);
-  };
-
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller);
-
-  jint Method(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller);
-
-  void AddStructB(JNIEnv* env,
-                  const base::android::JavaParamRef<jobject>& caller,
-                  const base::android::JavaParamRef<jobject>& structb);
-
-  void IterateAndDoSomethingWithStructB(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
-
-  base::android::ScopedJavaLocalRef<jstring> ReturnAString(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
-
- private:
-  std::map<long, std::string> map_;
-
-  DISALLOW_COPY_AND_ASSIGN(CPPClass);
-};
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_JNI_GENERATOR_SAMPLE_FOR_TESTS_H_
diff --git a/base/android/jni_generator/testCalledByNatives.golden b/base/android/jni_generator/testCalledByNatives.golden
deleted file mode 100644
index ac86b2e..0000000
--- a/base/android/jni_generator/testCalledByNatives.golden
+++ /dev/null
@@ -1,497 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kTestJniClassPath[] = "org/chromium/TestJni";
-const char kInfoBarClassPath[] = "org/chromium/TestJni$InfoBar";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
-#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_InfoBar_clazz __attribute__((unused)) = 0;
-#define InfoBar_clazz(env) base::android::LazyGetClass(env, kInfoBarClassPath, &g_InfoBar_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static base::subtle::AtomicWord g_TestJni_showConfirmInfoBar = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_TestJni_showConfirmInfoBar(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper nativeInfoBar,
-    const base::android::JavaRefOrBare<jstring>& buttonOk,
-    const base::android::JavaRefOrBare<jstring>& buttonCancel,
-    const base::android::JavaRefOrBare<jstring>& title,
-    const base::android::JavaRefOrBare<jobject>& icon) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "showConfirmInfoBar",
-"("
-"I"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Landroid/graphics/Bitmap;"
-")"
-"Lorg/chromium/Foo$InnerClass;",
-      &g_TestJni_showConfirmInfoBar);
-
-  jobject ret =
-      env->CallObjectMethod(obj.obj(),
-          method_id, as_jint(nativeInfoBar), buttonOk.obj(), buttonCancel.obj(),
-              title.obj(), icon.obj());
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_showAutoLoginInfoBar = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_TestJni_showAutoLoginInfoBar(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper nativeInfoBar,
-    const base::android::JavaRefOrBare<jstring>& realm,
-    const base::android::JavaRefOrBare<jstring>& account,
-    const base::android::JavaRefOrBare<jstring>& args) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "showAutoLoginInfoBar",
-"("
-"I"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"Lorg/chromium/Foo$InnerClass;",
-      &g_TestJni_showAutoLoginInfoBar);
-
-  jobject ret =
-      env->CallObjectMethod(obj.obj(),
-          method_id, as_jint(nativeInfoBar), realm.obj(), account.obj(),
-              args.obj());
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_InfoBar_dismiss = 0;
-static void Java_InfoBar_dismiss(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InfoBar_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InfoBar_clazz(env),
-      "dismiss",
-"("
-")"
-"V",
-      &g_InfoBar_dismiss);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_TestJni_shouldShowAutoLogin = 0;
-static jboolean Java_TestJni_shouldShowAutoLogin(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& view,
-    const base::android::JavaRefOrBare<jstring>& realm,
-    const base::android::JavaRefOrBare<jstring>& account,
-    const base::android::JavaRefOrBare<jstring>& args) {
-  CHECK_CLAZZ(env, TestJni_clazz(env),
-      TestJni_clazz(env), false);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, TestJni_clazz(env),
-      "shouldShowAutoLogin",
-"("
-"Landroid/view/View;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"Z",
-      &g_TestJni_shouldShowAutoLogin);
-
-  jboolean ret =
-      env->CallStaticBooleanMethod(TestJni_clazz(env),
-          method_id, view.obj(), realm.obj(), account.obj(), args.obj());
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_TestJni_openUrl = 0;
-static base::android::ScopedJavaLocalRef<jobject> Java_TestJni_openUrl(JNIEnv*
-    env, const base::android::JavaRefOrBare<jstring>& url) {
-  CHECK_CLAZZ(env, TestJni_clazz(env),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, TestJni_clazz(env),
-      "openUrl",
-"("
-"Ljava/lang/String;"
-")"
-"Ljava/io/InputStream;",
-      &g_TestJni_openUrl);
-
-  jobject ret =
-      env->CallStaticObjectMethod(TestJni_clazz(env),
-          method_id, url.obj());
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_activateHardwareAcceleration = 0;
-static void Java_TestJni_activateHardwareAcceleration(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jboolean activated,
-    JniIntWrapper iPid,
-    JniIntWrapper iType,
-    JniIntWrapper iPrimaryID,
-    JniIntWrapper iSecondaryID) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "activateHardwareAcceleration",
-"("
-"Z"
-"I"
-"I"
-"I"
-"I"
-")"
-"V",
-      &g_TestJni_activateHardwareAcceleration);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, activated, as_jint(iPid), as_jint(iType),
-              as_jint(iPrimaryID), as_jint(iSecondaryID));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_TestJni_updateStatus = 0;
-static jint Java_TestJni_updateStatus(JNIEnv* env, JniIntWrapper status) {
-  CHECK_CLAZZ(env, TestJni_clazz(env),
-      TestJni_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, TestJni_clazz(env),
-      "updateStatus",
-"("
-"I"
-")"
-"I",
-      &g_TestJni_updateStatus);
-
-  jint ret =
-      env->CallStaticIntMethod(TestJni_clazz(env),
-          method_id, as_jint(status));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_TestJni_uncheckedCall = 0;
-static void Java_TestJni_uncheckedCall(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper iParam) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "uncheckedCall",
-"("
-"I"
-")"
-"V",
-      &g_TestJni_uncheckedCall);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(iParam));
-}
-
-static base::subtle::AtomicWord g_TestJni_returnByteArray = 0;
-static base::android::ScopedJavaLocalRef<jbyteArray>
-    Java_TestJni_returnByteArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnByteArray",
-"("
-")"
-"[B",
-      &g_TestJni_returnByteArray);
-
-  jbyteArray ret =
-      static_cast<jbyteArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jbyteArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnBooleanArray = 0;
-static base::android::ScopedJavaLocalRef<jbooleanArray>
-    Java_TestJni_returnBooleanArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnBooleanArray",
-"("
-")"
-"[Z",
-      &g_TestJni_returnBooleanArray);
-
-  jbooleanArray ret =
-      static_cast<jbooleanArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jbooleanArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnCharArray = 0;
-static base::android::ScopedJavaLocalRef<jcharArray>
-    Java_TestJni_returnCharArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnCharArray",
-"("
-")"
-"[C",
-      &g_TestJni_returnCharArray);
-
-  jcharArray ret =
-      static_cast<jcharArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jcharArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnShortArray = 0;
-static base::android::ScopedJavaLocalRef<jshortArray>
-    Java_TestJni_returnShortArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnShortArray",
-"("
-")"
-"[S",
-      &g_TestJni_returnShortArray);
-
-  jshortArray ret =
-      static_cast<jshortArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jshortArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnIntArray = 0;
-static base::android::ScopedJavaLocalRef<jintArray>
-    Java_TestJni_returnIntArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnIntArray",
-"("
-")"
-"[I",
-      &g_TestJni_returnIntArray);
-
-  jintArray ret =
-      static_cast<jintArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jintArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnLongArray = 0;
-static base::android::ScopedJavaLocalRef<jlongArray>
-    Java_TestJni_returnLongArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnLongArray",
-"("
-")"
-"[J",
-      &g_TestJni_returnLongArray);
-
-  jlongArray ret =
-      static_cast<jlongArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jlongArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnDoubleArray = 0;
-static base::android::ScopedJavaLocalRef<jdoubleArray>
-    Java_TestJni_returnDoubleArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnDoubleArray",
-"("
-")"
-"[D",
-      &g_TestJni_returnDoubleArray);
-
-  jdoubleArray ret =
-      static_cast<jdoubleArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jdoubleArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnObjectArray = 0;
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    Java_TestJni_returnObjectArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnObjectArray",
-"("
-")"
-"[Ljava/lang/Object;",
-      &g_TestJni_returnObjectArray);
-
-  jobjectArray ret =
-      static_cast<jobjectArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobjectArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnArrayOfByteArray = 0;
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    Java_TestJni_returnArrayOfByteArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnArrayOfByteArray",
-"("
-")"
-"[[B",
-      &g_TestJni_returnArrayOfByteArray);
-
-  jobjectArray ret =
-      static_cast<jobjectArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobjectArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_getCompressFormat = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_TestJni_getCompressFormat(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "getCompressFormat",
-"("
-")"
-"Landroid/graphics/Bitmap$CompressFormat;",
-      &g_TestJni_getCompressFormat);
-
-  jobject ret =
-      env->CallObjectMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_getCompressFormatList = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_TestJni_getCompressFormatList(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "getCompressFormatList",
-"("
-")"
-"Ljava/util/List;",
-      &g_TestJni_getCompressFormatList);
-
-  jobject ret =
-      env->CallObjectMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-// Step 3: RegisterNatives.
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/testConstantsFromJavaP.golden b/base/android/jni_generator/testConstantsFromJavaP.golden
deleted file mode 100644
index b16956f..0000000
--- a/base/android/jni_generator/testConstantsFromJavaP.golden
+++ /dev/null
@@ -1,2195 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     android/view/MotionEvent
-
-#ifndef android_view_MotionEvent_JNI
-#define android_view_MotionEvent_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kMotionEventClassPath[] = "android/view/MotionEvent";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_MotionEvent_clazz __attribute__((unused)) = 0;
-#define MotionEvent_clazz(env) base::android::LazyGetClass(env, kMotionEventClassPath, &g_MotionEvent_clazz)
-
-}  // namespace
-
-namespace JNI_MotionEvent {
-
-enum Java_MotionEvent_constant_fields {
-  INVALID_POINTER_ID = -1,
-  ACTION_MASK = 255,
-  ACTION_DOWN = 0,
-  ACTION_UP = 1,
-  ACTION_MOVE = 2,
-  ACTION_CANCEL = 3,
-  ACTION_OUTSIDE = 4,
-  ACTION_POINTER_DOWN = 5,
-  ACTION_POINTER_UP = 6,
-  ACTION_HOVER_MOVE = 7,
-  ACTION_SCROLL = 8,
-  ACTION_HOVER_ENTER = 9,
-  ACTION_HOVER_EXIT = 10,
-  ACTION_POINTER_INDEX_MASK = 65280,
-  ACTION_POINTER_INDEX_SHIFT = 8,
-  ACTION_POINTER_1_DOWN = 5,
-  ACTION_POINTER_2_DOWN = 261,
-  ACTION_POINTER_3_DOWN = 517,
-  ACTION_POINTER_1_UP = 6,
-  ACTION_POINTER_2_UP = 262,
-  ACTION_POINTER_3_UP = 518,
-  ACTION_POINTER_ID_MASK = 65280,
-  ACTION_POINTER_ID_SHIFT = 8,
-  FLAG_WINDOW_IS_OBSCURED = 1,
-  EDGE_TOP = 1,
-  EDGE_BOTTOM = 2,
-  EDGE_LEFT = 4,
-  EDGE_RIGHT = 8,
-  AXIS_X = 0,
-  AXIS_Y = 1,
-  AXIS_PRESSURE = 2,
-  AXIS_SIZE = 3,
-  AXIS_TOUCH_MAJOR = 4,
-  AXIS_TOUCH_MINOR = 5,
-  AXIS_TOOL_MAJOR = 6,
-  AXIS_TOOL_MINOR = 7,
-  AXIS_ORIENTATION = 8,
-  AXIS_VSCROLL = 9,
-  AXIS_HSCROLL = 10,
-  AXIS_Z = 11,
-  AXIS_RX = 12,
-  AXIS_RY = 13,
-  AXIS_RZ = 14,
-  AXIS_HAT_X = 15,
-  AXIS_HAT_Y = 16,
-  AXIS_LTRIGGER = 17,
-  AXIS_RTRIGGER = 18,
-  AXIS_THROTTLE = 19,
-  AXIS_RUDDER = 20,
-  AXIS_WHEEL = 21,
-  AXIS_GAS = 22,
-  AXIS_BRAKE = 23,
-  AXIS_DISTANCE = 24,
-  AXIS_TILT = 25,
-  AXIS_GENERIC_1 = 32,
-  AXIS_GENERIC_2 = 33,
-  AXIS_GENERIC_3 = 34,
-  AXIS_GENERIC_4 = 35,
-  AXIS_GENERIC_5 = 36,
-  AXIS_GENERIC_6 = 37,
-  AXIS_GENERIC_7 = 38,
-  AXIS_GENERIC_8 = 39,
-  AXIS_GENERIC_9 = 40,
-  AXIS_GENERIC_10 = 41,
-  AXIS_GENERIC_11 = 42,
-  AXIS_GENERIC_12 = 43,
-  AXIS_GENERIC_13 = 44,
-  AXIS_GENERIC_14 = 45,
-  AXIS_GENERIC_15 = 46,
-  AXIS_GENERIC_16 = 47,
-  BUTTON_PRIMARY = 1,
-  BUTTON_SECONDARY = 2,
-  BUTTON_TERTIARY = 4,
-  BUTTON_BACK = 8,
-  BUTTON_FORWARD = 16,
-  TOOL_TYPE_UNKNOWN = 0,
-  TOOL_TYPE_FINGER = 1,
-  TOOL_TYPE_STYLUS = 2,
-  TOOL_TYPE_MOUSE = 3,
-  TOOL_TYPE_ERASER = 4,
-};
-
-// Step 2: method stubs.
-
-static base::subtle::AtomicWord g_MotionEvent_finalize = 0;
-static void Java_MotionEvent_finalize(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static void Java_MotionEvent_finalize(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "finalize",
-      "()V",
-      &g_MotionEvent_finalize);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord
-    g_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I(JNIEnv*
-    env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    const base::android::JavaRefOrBare<jobjectArray>& p4,
-    const base::android::JavaRefOrBare<jobjectArray>& p5,
-    JniIntWrapper p6,
-    JniIntWrapper p7,
-    jfloat p8,
-    jfloat p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12,
-    JniIntWrapper p13) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I(JNIEnv*
-    env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    const base::android::JavaRefOrBare<jobjectArray>& p4,
-    const base::android::JavaRefOrBare<jobjectArray>& p5,
-    JniIntWrapper p6,
-    JniIntWrapper p7,
-    jfloat p8,
-    jfloat p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12,
-    JniIntWrapper p13) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtain",
-"(JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0, p1, as_jint(p2), as_jint(p3), p4.obj(), p5.obj(),
-              as_jint(p6), as_jint(p7), p8, p9, as_jint(p10), as_jint(p11),
-              as_jint(p12), as_jint(p13));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord
-    g_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I(JNIEnv* env,
-    jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    const base::android::JavaRefOrBare<jintArray>& p4,
-    const base::android::JavaRefOrBare<jobjectArray>& p5,
-    JniIntWrapper p6,
-    jfloat p7,
-    jfloat p8,
-    JniIntWrapper p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I(JNIEnv* env,
-    jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    const base::android::JavaRefOrBare<jintArray>& p4,
-    const base::android::JavaRefOrBare<jobjectArray>& p5,
-    JniIntWrapper p6,
-    jfloat p7,
-    jfloat p8,
-    JniIntWrapper p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtain",
-"(JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0, p1, as_jint(p2), as_jint(p3), p4.obj(), p5.obj(),
-              as_jint(p6), p7, p8, as_jint(p9), as_jint(p10), as_jint(p11),
-              as_jint(p12));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I
-    = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    jfloat p3,
-    jfloat p4,
-    jfloat p5,
-    jfloat p6,
-    JniIntWrapper p7,
-    jfloat p8,
-    jfloat p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    jfloat p3,
-    jfloat p4,
-    jfloat p5,
-    jfloat p6,
-    JniIntWrapper p7,
-    jfloat p8,
-    jfloat p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtain",
-      "(JJIFFFFIFFII)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0, p1, as_jint(p2), p3, p4, p5, p6, as_jint(p7), p8, p9,
-              as_jint(p10), as_jint(p11));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord
-    g_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    jfloat p4,
-    jfloat p5,
-    jfloat p6,
-    jfloat p7,
-    JniIntWrapper p8,
-    jfloat p9,
-    jfloat p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    jfloat p4,
-    jfloat p5,
-    jfloat p6,
-    jfloat p7,
-    JniIntWrapper p8,
-    jfloat p9,
-    jfloat p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtain",
-      "(JJIIFFFFIFFII)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0, p1, as_jint(p2), as_jint(p3), p4, p5, p6, p7,
-              as_jint(p8), p9, p10, as_jint(p11), as_jint(p12));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_obtainAVME_J_J_I_F_F_I = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_F_F_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    jfloat p3,
-    jfloat p4,
-    JniIntWrapper p5) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_F_F_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    jfloat p3,
-    jfloat p4,
-    JniIntWrapper p5) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtain",
-      "(JJIFFI)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainAVME_J_J_I_F_F_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0, p1, as_jint(p2), p3, p4, as_jint(p5));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_obtainAVME_AVME = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_AVME(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& p0) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_AVME(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& p0) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtain",
-      "(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainAVME_AVME);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0.obj());
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_obtainNoHistory = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainNoHistory(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& p0) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainNoHistory(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& p0) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtainNoHistory",
-      "(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainNoHistory);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0.obj());
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_recycle = 0;
-static void Java_MotionEvent_recycle(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static void Java_MotionEvent_recycle(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "recycle",
-      "()V",
-      &g_MotionEvent_recycle);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getDeviceId = 0;
-static jint Java_MotionEvent_getDeviceId(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getDeviceId(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getDeviceId",
-      "()I",
-      &g_MotionEvent_getDeviceId);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getSource = 0;
-static jint Java_MotionEvent_getSource(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getSource(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getSource",
-      "()I",
-      &g_MotionEvent_getSource);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_setSource = 0;
-static void Java_MotionEvent_setSource(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static void Java_MotionEvent_setSource(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "setSource",
-      "(I)V",
-      &g_MotionEvent_setSource);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getAction = 0;
-static jint Java_MotionEvent_getAction(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getAction(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getAction",
-      "()I",
-      &g_MotionEvent_getAction);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getActionMasked = 0;
-static jint Java_MotionEvent_getActionMasked(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getActionMasked(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getActionMasked",
-      "()I",
-      &g_MotionEvent_getActionMasked);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getActionIndex = 0;
-static jint Java_MotionEvent_getActionIndex(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getActionIndex(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getActionIndex",
-      "()I",
-      &g_MotionEvent_getActionIndex);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getFlags = 0;
-static jint Java_MotionEvent_getFlags(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getFlags(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getFlags",
-      "()I",
-      &g_MotionEvent_getFlags);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getDownTime = 0;
-static jlong Java_MotionEvent_getDownTime(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jlong Java_MotionEvent_getDownTime(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getDownTime",
-      "()J",
-      &g_MotionEvent_getDownTime);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getEventTime = 0;
-static jlong Java_MotionEvent_getEventTime(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jlong Java_MotionEvent_getEventTime(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getEventTime",
-      "()J",
-      &g_MotionEvent_getEventTime);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getXF = 0;
-static jfloat Java_MotionEvent_getXF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getXF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getX",
-      "()F",
-      &g_MotionEvent_getXF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getYF = 0;
-static jfloat Java_MotionEvent_getYF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getYF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getY",
-      "()F",
-      &g_MotionEvent_getYF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getPressureF = 0;
-static jfloat Java_MotionEvent_getPressureF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getPressureF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getPressure",
-      "()F",
-      &g_MotionEvent_getPressureF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getSizeF = 0;
-static jfloat Java_MotionEvent_getSizeF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getSizeF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getSize",
-      "()F",
-      &g_MotionEvent_getSizeF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getTouchMajorF = 0;
-static jfloat Java_MotionEvent_getTouchMajorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getTouchMajorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getTouchMajor",
-      "()F",
-      &g_MotionEvent_getTouchMajorF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getTouchMinorF = 0;
-static jfloat Java_MotionEvent_getTouchMinorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getTouchMinorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getTouchMinor",
-      "()F",
-      &g_MotionEvent_getTouchMinorF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getToolMajorF = 0;
-static jfloat Java_MotionEvent_getToolMajorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getToolMajorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getToolMajor",
-      "()F",
-      &g_MotionEvent_getToolMajorF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getToolMinorF = 0;
-static jfloat Java_MotionEvent_getToolMinorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getToolMinorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getToolMinor",
-      "()F",
-      &g_MotionEvent_getToolMinorF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getOrientationF = 0;
-static jfloat Java_MotionEvent_getOrientationF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getOrientationF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getOrientation",
-      "()F",
-      &g_MotionEvent_getOrientationF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getAxisValueF_I = 0;
-static jfloat Java_MotionEvent_getAxisValueF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getAxisValueF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getAxisValue",
-      "(I)F",
-      &g_MotionEvent_getAxisValueF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getPointerCount = 0;
-static jint Java_MotionEvent_getPointerCount(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getPointerCount(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getPointerCount",
-      "()I",
-      &g_MotionEvent_getPointerCount);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getPointerId = 0;
-static jint Java_MotionEvent_getPointerId(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jint Java_MotionEvent_getPointerId(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getPointerId",
-      "(I)I",
-      &g_MotionEvent_getPointerId);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getToolType = 0;
-static jint Java_MotionEvent_getToolType(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jint Java_MotionEvent_getToolType(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getToolType",
-      "(I)I",
-      &g_MotionEvent_getToolType);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_findPointerIndex = 0;
-static jint Java_MotionEvent_findPointerIndex(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jint Java_MotionEvent_findPointerIndex(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "findPointerIndex",
-      "(I)I",
-      &g_MotionEvent_findPointerIndex);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getXF_I = 0;
-static jfloat Java_MotionEvent_getXF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getXF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getX",
-      "(I)F",
-      &g_MotionEvent_getXF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getYF_I = 0;
-static jfloat Java_MotionEvent_getYF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getYF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getY",
-      "(I)F",
-      &g_MotionEvent_getYF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getPressureF_I = 0;
-static jfloat Java_MotionEvent_getPressureF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getPressureF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getPressure",
-      "(I)F",
-      &g_MotionEvent_getPressureF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getSizeF_I = 0;
-static jfloat Java_MotionEvent_getSizeF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getSizeF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getSize",
-      "(I)F",
-      &g_MotionEvent_getSizeF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getTouchMajorF_I = 0;
-static jfloat Java_MotionEvent_getTouchMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getTouchMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getTouchMajor",
-      "(I)F",
-      &g_MotionEvent_getTouchMajorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getTouchMinorF_I = 0;
-static jfloat Java_MotionEvent_getTouchMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getTouchMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getTouchMinor",
-      "(I)F",
-      &g_MotionEvent_getTouchMinorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getToolMajorF_I = 0;
-static jfloat Java_MotionEvent_getToolMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getToolMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getToolMajor",
-      "(I)F",
-      &g_MotionEvent_getToolMajorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getToolMinorF_I = 0;
-static jfloat Java_MotionEvent_getToolMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getToolMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getToolMinor",
-      "(I)F",
-      &g_MotionEvent_getToolMinorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getOrientationF_I = 0;
-static jfloat Java_MotionEvent_getOrientationF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getOrientationF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getOrientation",
-      "(I)F",
-      &g_MotionEvent_getOrientationF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getAxisValueF_I_I = 0;
-static jfloat Java_MotionEvent_getAxisValueF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getAxisValueF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getAxisValue",
-      "(II)F",
-      &g_MotionEvent_getAxisValueF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getPointerCoords = 0;
-static void Java_MotionEvent_getPointerCoords(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    const base::android::JavaRefOrBare<jobject>& p1) __attribute__ ((unused));
-static void Java_MotionEvent_getPointerCoords(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    const base::android::JavaRefOrBare<jobject>& p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getPointerCoords",
-      "(ILandroid/view/MotionEvent$PointerCoords;)V",
-      &g_MotionEvent_getPointerCoords);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0), p1.obj());
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getPointerProperties = 0;
-static void Java_MotionEvent_getPointerProperties(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    const base::android::JavaRefOrBare<jobject>& p1) __attribute__ ((unused));
-static void Java_MotionEvent_getPointerProperties(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    const base::android::JavaRefOrBare<jobject>& p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getPointerProperties",
-      "(ILandroid/view/MotionEvent$PointerProperties;)V",
-      &g_MotionEvent_getPointerProperties);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0), p1.obj());
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getMetaState = 0;
-static jint Java_MotionEvent_getMetaState(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getMetaState(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getMetaState",
-      "()I",
-      &g_MotionEvent_getMetaState);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getButtonState = 0;
-static jint Java_MotionEvent_getButtonState(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getButtonState(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getButtonState",
-      "()I",
-      &g_MotionEvent_getButtonState);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getRawX = 0;
-static jfloat Java_MotionEvent_getRawX(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getRawX(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getRawX",
-      "()F",
-      &g_MotionEvent_getRawX);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getRawY = 0;
-static jfloat Java_MotionEvent_getRawY(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getRawY(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getRawY",
-      "()F",
-      &g_MotionEvent_getRawY);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getXPrecision = 0;
-static jfloat Java_MotionEvent_getXPrecision(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getXPrecision(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getXPrecision",
-      "()F",
-      &g_MotionEvent_getXPrecision);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getYPrecision = 0;
-static jfloat Java_MotionEvent_getYPrecision(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getYPrecision(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getYPrecision",
-      "()F",
-      &g_MotionEvent_getYPrecision);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistorySize = 0;
-static jint Java_MotionEvent_getHistorySize(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getHistorySize(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistorySize",
-      "()I",
-      &g_MotionEvent_getHistorySize);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalEventTime = 0;
-static jlong Java_MotionEvent_getHistoricalEventTime(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jlong Java_MotionEvent_getHistoricalEventTime(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalEventTime",
-      "(I)J",
-      &g_MotionEvent_getHistoricalEventTime);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalXF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalXF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalXF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalX",
-      "(I)F",
-      &g_MotionEvent_getHistoricalXF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalYF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalYF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalYF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalY",
-      "(I)F",
-      &g_MotionEvent_getHistoricalYF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalPressureF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalPressureF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalPressureF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalPressure",
-      "(I)F",
-      &g_MotionEvent_getHistoricalPressureF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalSizeF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalSizeF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalSizeF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalSize",
-      "(I)F",
-      &g_MotionEvent_getHistoricalSizeF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalTouchMajorF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalTouchMajor",
-      "(I)F",
-      &g_MotionEvent_getHistoricalTouchMajorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalTouchMinorF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalTouchMinor",
-      "(I)F",
-      &g_MotionEvent_getHistoricalTouchMinorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalToolMajorF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalToolMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalToolMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalToolMajor",
-      "(I)F",
-      &g_MotionEvent_getHistoricalToolMajorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalToolMinorF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalToolMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalToolMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalToolMinor",
-      "(I)F",
-      &g_MotionEvent_getHistoricalToolMinorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalOrientationF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalOrientationF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalOrientationF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalOrientation",
-      "(I)F",
-      &g_MotionEvent_getHistoricalOrientationF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalAxisValueF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalAxisValue",
-      "(II)F",
-      &g_MotionEvent_getHistoricalAxisValueF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalXF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalXF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalXF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalX",
-      "(II)F",
-      &g_MotionEvent_getHistoricalXF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalYF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalYF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalYF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalY",
-      "(II)F",
-      &g_MotionEvent_getHistoricalYF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalPressureF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalPressureF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalPressureF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalPressure",
-      "(II)F",
-      &g_MotionEvent_getHistoricalPressureF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalSizeF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalSizeF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalSizeF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalSize",
-      "(II)F",
-      &g_MotionEvent_getHistoricalSizeF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalTouchMajorF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalTouchMajor",
-      "(II)F",
-      &g_MotionEvent_getHistoricalTouchMajorF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalTouchMinorF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalTouchMinor",
-      "(II)F",
-      &g_MotionEvent_getHistoricalTouchMinorF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalToolMajorF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalToolMajorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalToolMajorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalToolMajor",
-      "(II)F",
-      &g_MotionEvent_getHistoricalToolMajorF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalToolMinorF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalToolMinorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalToolMinorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalToolMinor",
-      "(II)F",
-      &g_MotionEvent_getHistoricalToolMinorF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalOrientationF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalOrientationF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalOrientationF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalOrientation",
-      "(II)F",
-      &g_MotionEvent_getHistoricalOrientationF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalAxisValueF_I_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1,
-    JniIntWrapper p2) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1,
-    JniIntWrapper p2) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalAxisValue",
-      "(III)F",
-      &g_MotionEvent_getHistoricalAxisValueF_I_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1), as_jint(p2));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalPointerCoords = 0;
-static void Java_MotionEvent_getHistoricalPointerCoords(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1,
-    const base::android::JavaRefOrBare<jobject>& p2) __attribute__ ((unused));
-static void Java_MotionEvent_getHistoricalPointerCoords(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1,
-    const base::android::JavaRefOrBare<jobject>& p2) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalPointerCoords",
-      "(IILandroid/view/MotionEvent$PointerCoords;)V",
-      &g_MotionEvent_getHistoricalPointerCoords);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1), p2.obj());
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getEdgeFlags = 0;
-static jint Java_MotionEvent_getEdgeFlags(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getEdgeFlags(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getEdgeFlags",
-      "()I",
-      &g_MotionEvent_getEdgeFlags);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_setEdgeFlags = 0;
-static void Java_MotionEvent_setEdgeFlags(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static void Java_MotionEvent_setEdgeFlags(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "setEdgeFlags",
-      "(I)V",
-      &g_MotionEvent_setEdgeFlags);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_setAction = 0;
-static void Java_MotionEvent_setAction(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static void Java_MotionEvent_setAction(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "setAction",
-      "(I)V",
-      &g_MotionEvent_setAction);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_offsetLocation = 0;
-static void Java_MotionEvent_offsetLocation(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jfloat p0,
-    jfloat p1) __attribute__ ((unused));
-static void Java_MotionEvent_offsetLocation(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jfloat p0,
-    jfloat p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "offsetLocation",
-      "(FF)V",
-      &g_MotionEvent_offsetLocation);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, p0, p1);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_setLocation = 0;
-static void Java_MotionEvent_setLocation(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jfloat p0,
-    jfloat p1) __attribute__ ((unused));
-static void Java_MotionEvent_setLocation(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jfloat p0,
-    jfloat p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "setLocation",
-      "(FF)V",
-      &g_MotionEvent_setLocation);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, p0, p1);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_transform = 0;
-static void Java_MotionEvent_transform(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jobject>& p0) __attribute__ ((unused));
-static void Java_MotionEvent_transform(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jobject>& p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "transform",
-      "(Landroid/graphics/Matrix;)V",
-      &g_MotionEvent_transform);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, p0.obj());
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_addBatchV_J_F_F_F_F_I = 0;
-static void Java_MotionEvent_addBatchV_J_F_F_F_F_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jlong p0,
-    jfloat p1,
-    jfloat p2,
-    jfloat p3,
-    jfloat p4,
-    JniIntWrapper p5) __attribute__ ((unused));
-static void Java_MotionEvent_addBatchV_J_F_F_F_F_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jlong p0,
-    jfloat p1,
-    jfloat p2,
-    jfloat p3,
-    jfloat p4,
-    JniIntWrapper p5) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "addBatch",
-      "(JFFFFI)V",
-      &g_MotionEvent_addBatchV_J_F_F_F_F_I);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, p0, p1, p2, p3, p4, as_jint(p5));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_addBatchV_J_LAVMEPC_I = 0;
-static void Java_MotionEvent_addBatchV_J_LAVMEPC_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jlong p0,
-    const base::android::JavaRefOrBare<jobjectArray>& p1,
-    JniIntWrapper p2) __attribute__ ((unused));
-static void Java_MotionEvent_addBatchV_J_LAVMEPC_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jlong p0,
-    const base::android::JavaRefOrBare<jobjectArray>& p1,
-    JniIntWrapper p2) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "addBatch",
-      "(J[Landroid/view/MotionEvent$PointerCoords;I)V",
-      &g_MotionEvent_addBatchV_J_LAVMEPC_I);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, p0, p1.obj(), as_jint(p2));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_toString = 0;
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_toString(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_toString(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "toString",
-      "()Ljava/lang/String;",
-      &g_MotionEvent_toString);
-
-  jstring ret =
-      static_cast<jstring>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_actionToString = 0;
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_actionToString(JNIEnv* env, JniIntWrapper p0) __attribute__
-    ((unused));
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_actionToString(JNIEnv* env, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "actionToString",
-      "(I)Ljava/lang/String;",
-      &g_MotionEvent_actionToString);
-
-  jstring ret =
-      static_cast<jstring>(env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, as_jint(p0)));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_axisToString = 0;
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_axisToString(JNIEnv* env, JniIntWrapper p0) __attribute__
-    ((unused));
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_axisToString(JNIEnv* env, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "axisToString",
-      "(I)Ljava/lang/String;",
-      &g_MotionEvent_axisToString);
-
-  jstring ret =
-      static_cast<jstring>(env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, as_jint(p0)));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_axisFromString = 0;
-static jint Java_MotionEvent_axisFromString(JNIEnv* env, const
-    base::android::JavaRefOrBare<jstring>& p0) __attribute__ ((unused));
-static jint Java_MotionEvent_axisFromString(JNIEnv* env, const
-    base::android::JavaRefOrBare<jstring>& p0) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "axisFromString",
-      "(Ljava/lang/String;)I",
-      &g_MotionEvent_axisFromString);
-
-  jint ret =
-      env->CallStaticIntMethod(MotionEvent_clazz(env),
-          method_id, p0.obj());
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_writeToParcel = 0;
-static void Java_MotionEvent_writeToParcel(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jobject>& p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static void Java_MotionEvent_writeToParcel(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jobject>& p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "writeToParcel",
-      "(Landroid/os/Parcel;I)V",
-      &g_MotionEvent_writeToParcel);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, p0.obj(), as_jint(p1));
-  jni_generator::CheckException(env);
-}
-
-// Step 3: RegisterNatives.
-
-}  // namespace JNI_MotionEvent
-
-#endif  // android_view_MotionEvent_JNI
diff --git a/base/android/jni_generator/testFromJavaP.golden b/base/android/jni_generator/testFromJavaP.golden
deleted file mode 100644
index 18a9430..0000000
--- a/base/android/jni_generator/testFromJavaP.golden
+++ /dev/null
@@ -1,260 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     java/io/InputStream
-
-#ifndef java_io_InputStream_JNI
-#define java_io_InputStream_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kInputStreamClassPath[] = "java/io/InputStream";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_InputStream_clazz __attribute__((unused)) = 0;
-#define InputStream_clazz(env) base::android::LazyGetClass(env, kInputStreamClassPath, &g_InputStream_clazz)
-
-}  // namespace
-
-namespace JNI_InputStream {
-
-// Step 2: method stubs.
-
-static base::subtle::AtomicWord g_InputStream_available = 0;
-static jint Java_InputStream_available(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_InputStream_available(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "available",
-      "()I",
-      &g_InputStream_available);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_InputStream_close = 0;
-static void Java_InputStream_close(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static void Java_InputStream_close(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "close",
-      "()V",
-      &g_InputStream_close);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_InputStream_mark = 0;
-static void Java_InputStream_mark(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static void Java_InputStream_mark(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "mark",
-      "(I)V",
-      &g_InputStream_mark);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_InputStream_markSupported = 0;
-static jboolean Java_InputStream_markSupported(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jboolean Java_InputStream_markSupported(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env), false);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "markSupported",
-      "()Z",
-      &g_InputStream_markSupported);
-
-  jboolean ret =
-      env->CallBooleanMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_InputStream_readI = 0;
-static jint Java_InputStream_readI(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_InputStream_readI(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "read",
-      "()I",
-      &g_InputStream_readI);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_InputStream_readI_AB = 0;
-static jint Java_InputStream_readI_AB(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jbyteArray>& p0) __attribute__ ((unused));
-static jint Java_InputStream_readI_AB(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jbyteArray>& p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "read",
-      "([B)I",
-      &g_InputStream_readI_AB);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id, p0.obj());
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_InputStream_readI_AB_I_I = 0;
-static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jbyteArray>& p0,
-    JniIntWrapper p1,
-    JniIntWrapper p2) __attribute__ ((unused));
-static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jbyteArray>& p0,
-    JniIntWrapper p1,
-    JniIntWrapper p2) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "read",
-      "([BII)I",
-      &g_InputStream_readI_AB_I_I);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id, p0.obj(), as_jint(p1), as_jint(p2));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_InputStream_reset = 0;
-static void Java_InputStream_reset(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static void Java_InputStream_reset(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "reset",
-      "()V",
-      &g_InputStream_reset);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_InputStream_skip = 0;
-static jlong Java_InputStream_skip(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jlong p0) __attribute__
-    ((unused));
-static jlong Java_InputStream_skip(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jlong p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "skip",
-      "(J)J",
-      &g_InputStream_skip);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          method_id, p0);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_InputStream_Constructor = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_InputStream_Constructor(JNIEnv* env) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_InputStream_Constructor(JNIEnv* env) {
-  CHECK_CLAZZ(env, InputStream_clazz(env),
-      InputStream_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "<init>",
-      "()V",
-      &g_InputStream_Constructor);
-
-  jobject ret =
-      env->NewObject(InputStream_clazz(env),
-          method_id);
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-// Step 3: RegisterNatives.
-
-}  // namespace JNI_InputStream
-
-#endif  // java_io_InputStream_JNI
diff --git a/base/android/jni_generator/testFromJavaPGenerics.golden b/base/android/jni_generator/testFromJavaPGenerics.golden
deleted file mode 100644
index c076c39..0000000
--- a/base/android/jni_generator/testFromJavaPGenerics.golden
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     java/util/HashSet
-
-#ifndef java_util_HashSet_JNI
-#define java_util_HashSet_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kHashSetClassPath[] = "java/util/HashSet";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_HashSet_clazz __attribute__((unused)) = 0;
-#define HashSet_clazz(env) base::android::LazyGetClass(env, kHashSetClassPath, &g_HashSet_clazz)
-
-}  // namespace
-
-namespace JNI_HashSet {
-
-// Step 2: method stubs.
-
-static base::subtle::AtomicWord g_HashSet_dummy = 0;
-static void Java_HashSet_dummy(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static void Java_HashSet_dummy(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      HashSet_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, HashSet_clazz(env),
-      "dummy",
-      "()V",
-      &g_HashSet_dummy);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-}
-
-// Step 3: RegisterNatives.
-
-}  // namespace JNI_HashSet
-
-#endif  // java_util_HashSet_JNI
diff --git a/base/android/jni_generator/testInnerClassNatives.golden b/base/android/jni_generator/testInnerClassNatives.golden
deleted file mode 100644
index 20b8830..0000000
--- a/base/android/jni_generator/testInnerClassNatives.golden
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kTestJniClassPath[] = "org/chromium/TestJni";
-const char kMyInnerClassClassPath[] = "org/chromium/TestJni$MyInnerClass";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
-#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_MyInnerClass_clazz __attribute__((unused)) = 0;
-#define MyInnerClass_clazz(env) base::android::LazyGetClass(env, kMyInnerClassClassPath, &g_MyInnerClass_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_TestJni_00024MyInnerClass_nativeInit(JNIEnv* env, jobject
-    jcaller) {
-  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsMyInnerClass[] = {
-    { "nativeInit",
-"("
-")"
-"I",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_00024MyInnerClass_nativeInit)
-    },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass);
-
-  if (env->RegisterNatives(MyInnerClass_clazz(env),
-                           kMethodsMyInnerClass,
-                           kMethodsMyInnerClassSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, MyInnerClass_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/testInnerClassNativesBothInnerAndOuter.golden b/base/android/jni_generator/testInnerClassNativesBothInnerAndOuter.golden
deleted file mode 100644
index 67352e7..0000000
--- a/base/android/jni_generator/testInnerClassNativesBothInnerAndOuter.golden
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kMyOtherInnerClassClassPath[] =
-    "org/chromium/TestJni$MyOtherInnerClass";
-const char kTestJniClassPath[] = "org/chromium/TestJni";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_MyOtherInnerClass_clazz __attribute__((unused)) = 0;
-#define MyOtherInnerClass_clazz(env) base::android::LazyGetClass(env, kMyOtherInnerClassClassPath, &g_MyOtherInnerClass_clazz)
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
-#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(JNIEnv* env,
-    jobject jcaller) {
-  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(JNIEnv* env,
-    jobject jcaller) {
-  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsMyOtherInnerClass[] = {
-    { "nativeInit",
-"("
-")"
-"I",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit)
-    },
-};
-
-static const JNINativeMethod kMethodsTestJni[] = {
-    { "nativeInit",
-"("
-")"
-"I", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeInit) },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsMyOtherInnerClassSize =
-      arraysize(kMethodsMyOtherInnerClass);
-
-  if (env->RegisterNatives(MyOtherInnerClass_clazz(env),
-                           kMethodsMyOtherInnerClass,
-                           kMethodsMyOtherInnerClassSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, MyOtherInnerClass_clazz(env), __FILE__);
-    return false;
-  }
-
-  const int kMethodsTestJniSize = arraysize(kMethodsTestJni);
-
-  if (env->RegisterNatives(TestJni_clazz(env),
-                           kMethodsTestJni,
-                           kMethodsTestJniSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, TestJni_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/testInnerClassNativesMultiple.golden b/base/android/jni_generator/testInnerClassNativesMultiple.golden
deleted file mode 100644
index 7807efa..0000000
--- a/base/android/jni_generator/testInnerClassNativesMultiple.golden
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kMyOtherInnerClassClassPath[] =
-    "org/chromium/TestJni$MyOtherInnerClass";
-const char kTestJniClassPath[] = "org/chromium/TestJni";
-const char kMyInnerClassClassPath[] = "org/chromium/TestJni$MyInnerClass";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_MyOtherInnerClass_clazz __attribute__((unused)) = 0;
-#define MyOtherInnerClass_clazz(env) base::android::LazyGetClass(env, kMyOtherInnerClassClassPath, &g_MyOtherInnerClass_clazz)
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
-#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_MyInnerClass_clazz __attribute__((unused)) = 0;
-#define MyInnerClass_clazz(env) base::android::LazyGetClass(env, kMyInnerClassClassPath, &g_MyInnerClass_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_TestJni_00024MyInnerClass_nativeInit(JNIEnv* env, jobject
-    jcaller) {
-  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(JNIEnv* env,
-    jobject jcaller) {
-  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsMyOtherInnerClass[] = {
-    { "nativeInit",
-"("
-")"
-"I",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit)
-    },
-};
-
-static const JNINativeMethod kMethodsMyInnerClass[] = {
-    { "nativeInit",
-"("
-")"
-"I",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_00024MyInnerClass_nativeInit)
-    },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsMyOtherInnerClassSize =
-      arraysize(kMethodsMyOtherInnerClass);
-
-  if (env->RegisterNatives(MyOtherInnerClass_clazz(env),
-                           kMethodsMyOtherInnerClass,
-                           kMethodsMyOtherInnerClassSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, MyOtherInnerClass_clazz(env), __FILE__);
-    return false;
-  }
-
-  const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass);
-
-  if (env->RegisterNatives(MyInnerClass_clazz(env),
-                           kMethodsMyInnerClass,
-                           kMethodsMyInnerClassSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, MyInnerClass_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/testInputStream.javap b/base/android/jni_generator/testInputStream.javap
deleted file mode 100644
index 50ab617..0000000
--- a/base/android/jni_generator/testInputStream.javap
+++ /dev/null
@@ -1,228 +0,0 @@
-Compiled from "InputStream.java"
-public abstract class java.io.InputStream extends java.lang.Object implements java.io.Closeable
-  SourceFile: "InputStream.java"
-  minor version: 0
-  major version: 49
-  Constant pool:
-const #1 = Method #6.#39; //  java/lang/Object."<init>":()V
-const #2 = class  #40;  //  java/lang/RuntimeException
-const #3 = String #41;  //  Stub!
-const #4 = Method #2.#42; //  java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-const #5 = class  #43;  //  java/io/InputStream
-const #6 = class  #44;  //  java/lang/Object
-const #7 = class  #45;  //  java/io/Closeable
-const #8 = Asciz  <init>;
-const #9 = Asciz  ()V;
-const #10 = Asciz Code;
-const #11 = Asciz LineNumberTable;
-const #12 = Asciz LocalVariableTable;
-const #13 = Asciz this;
-const #14 = Asciz Ljava/io/InputStream;;
-const #15 = Asciz available;
-const #16 = Asciz ()I;
-const #17 = Asciz Exceptions;
-const #18 = class #46;  //  java/io/IOException
-const #19 = Asciz close;
-const #20 = Asciz mark;
-const #21 = Asciz (I)V;
-const #22 = Asciz readlimit;
-const #23 = Asciz I;
-const #24 = Asciz markSupported;
-const #25 = Asciz ()Z;
-const #26 = Asciz read;
-const #27 = Asciz ([B)I;
-const #28 = Asciz buffer;
-const #29 = Asciz [B;
-const #30 = Asciz ([BII)I;
-const #31 = Asciz byteOffset;
-const #32 = Asciz byteCount;
-const #33 = Asciz reset;
-const #34 = Asciz skip;
-const #35 = Asciz (J)J;
-const #36 = Asciz J;
-const #37 = Asciz SourceFile;
-const #38 = Asciz InputStream.java;
-const #39 = NameAndType #8:#9;//  "<init>":()V
-const #40 = Asciz java/lang/RuntimeException;
-const #41 = Asciz Stub!;
-const #42 = NameAndType #8:#47;//  "<init>":(Ljava/lang/String;)V
-const #43 = Asciz java/io/InputStream;
-const #44 = Asciz java/lang/Object;
-const #45 = Asciz java/io/Closeable;
-const #46 = Asciz java/io/IOException;
-const #47 = Asciz (Ljava/lang/String;)V;
-
-{
-public java.io.InputStream();
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: aload_0
-   1: invokespecial #1; //Method java/lang/Object."<init>":()V
-   4: new #2; //class java/lang/RuntimeException
-   7: dup
-   8: ldc #3; //String Stub!
-   10:  invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   13:  athrow
-  LineNumberTable:
-   line 5: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      14      0    this       Ljava/io/InputStream;
-
-
-public int available()   throws java.io.IOException;
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 6: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-
-  Exceptions:
-   throws java.io.IOException
-public void close()   throws java.io.IOException;
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 7: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-
-  Exceptions:
-   throws java.io.IOException
-public void mark(int);
-  Signature: (I)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 8: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-   0      10      1    readlimit       I
-
-
-public boolean markSupported();
-  Signature: ()Z
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 9: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-
-
-public abstract int read()   throws java.io.IOException;
-  Signature: ()I
-  Exceptions:
-   throws java.io.IOException
-public int read(byte[])   throws java.io.IOException;
-  Signature: ([B)I
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 11: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-   0      10      1    buffer       [B
-
-  Exceptions:
-   throws java.io.IOException
-public int read(byte[], int, int)   throws java.io.IOException;
-  Signature: ([BII)I
-  Code:
-   Stack=3, Locals=4, Args_size=4
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 12: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-   0      10      1    buffer       [B
-   0      10      2    byteOffset       I
-   0      10      3    byteCount       I
-
-  Exceptions:
-   throws java.io.IOException
-public synchronized void reset()   throws java.io.IOException;
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 13: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-
-  Exceptions:
-   throws java.io.IOException
-public long skip(long)   throws java.io.IOException;
-  Signature: (J)J
-  Code:
-   Stack=3, Locals=3, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 14: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-   0      10      1    byteCount       J
-
-  Exceptions:
-   throws java.io.IOException
-}
-
diff --git a/base/android/jni_generator/testMotionEvent.javap b/base/android/jni_generator/testMotionEvent.javap
deleted file mode 100644
index 0746943..0000000
--- a/base/android/jni_generator/testMotionEvent.javap
+++ /dev/null
@@ -1,2295 +0,0 @@
-Compiled from "MotionEvent.java"
-public final class android.view.MotionEvent extends android.view.InputEvent implements android.os.Parcelable
-  SourceFile: "MotionEvent.java"
-  InnerClass:
-   public final #10= #9 of #6; //PointerProperties=class android/view/MotionEvent$PointerProperties of class android/view/MotionEvent
-   public final #13= #12 of #6; //PointerCoords=class android/view/MotionEvent$PointerCoords of class android/view/MotionEvent
-   public abstract #150= #149 of #8; //Creator=class android/os/Parcelable$Creator of class android/os/Parcelable
-  minor version: 0
-  major version: 49
-  Constant pool:
-const #1 = Method #7.#293;  //  android/view/InputEvent."<init>":()V
-const #2 = class  #294; //  java/lang/RuntimeException
-const #3 = String #295; //  Stub!
-const #4 = Method #2.#296;  //  java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-const #5 = Field  #6.#297;  //  android/view/MotionEvent.CREATOR:Landroid/os/Parcelable$Creator;
-const #6 = class  #298; //  android/view/MotionEvent
-const #7 = class  #299; //  android/view/InputEvent
-const #8 = class  #300; //  android/os/Parcelable
-const #9 = class  #301; //  android/view/MotionEvent$PointerProperties
-const #10 = Asciz PointerProperties;
-const #11 = Asciz InnerClasses;
-const #12 = class #302; //  android/view/MotionEvent$PointerCoords
-const #13 = Asciz PointerCoords;
-const #14 = Asciz INVALID_POINTER_ID;
-const #15 = Asciz I;
-const #16 = Asciz ConstantValue;
-const #17 = int -1;
-const #18 = Asciz ACTION_MASK;
-const #19 = int 255;
-const #20 = Asciz ACTION_DOWN;
-const #21 = int 0;
-const #22 = Asciz ACTION_UP;
-const #23 = int 1;
-const #24 = Asciz ACTION_MOVE;
-const #25 = int 2;
-const #26 = Asciz ACTION_CANCEL;
-const #27 = int 3;
-const #28 = Asciz ACTION_OUTSIDE;
-const #29 = int 4;
-const #30 = Asciz ACTION_POINTER_DOWN;
-const #31 = int 5;
-const #32 = Asciz ACTION_POINTER_UP;
-const #33 = int 6;
-const #34 = Asciz ACTION_HOVER_MOVE;
-const #35 = int 7;
-const #36 = Asciz ACTION_SCROLL;
-const #37 = int 8;
-const #38 = Asciz ACTION_HOVER_ENTER;
-const #39 = int 9;
-const #40 = Asciz ACTION_HOVER_EXIT;
-const #41 = int 10;
-const #42 = Asciz ACTION_POINTER_INDEX_MASK;
-const #43 = int 65280;
-const #44 = Asciz ACTION_POINTER_INDEX_SHIFT;
-const #45 = Asciz ACTION_POINTER_1_DOWN;
-const #46 = Asciz Deprecated;
-const #47 = Asciz RuntimeVisibleAnnotations;
-const #48 = Asciz Ljava/lang/Deprecated;;
-const #49 = Asciz ACTION_POINTER_2_DOWN;
-const #50 = int 261;
-const #51 = Asciz ACTION_POINTER_3_DOWN;
-const #52 = int 517;
-const #53 = Asciz ACTION_POINTER_1_UP;
-const #54 = Asciz ACTION_POINTER_2_UP;
-const #55 = int 262;
-const #56 = Asciz ACTION_POINTER_3_UP;
-const #57 = int 518;
-const #58 = Asciz ACTION_POINTER_ID_MASK;
-const #59 = Asciz ACTION_POINTER_ID_SHIFT;
-const #60 = Asciz FLAG_WINDOW_IS_OBSCURED;
-const #61 = Asciz EDGE_TOP;
-const #62 = Asciz EDGE_BOTTOM;
-const #63 = Asciz EDGE_LEFT;
-const #64 = Asciz EDGE_RIGHT;
-const #65 = Asciz AXIS_X;
-const #66 = Asciz AXIS_Y;
-const #67 = Asciz AXIS_PRESSURE;
-const #68 = Asciz AXIS_SIZE;
-const #69 = Asciz AXIS_TOUCH_MAJOR;
-const #70 = Asciz AXIS_TOUCH_MINOR;
-const #71 = Asciz AXIS_TOOL_MAJOR;
-const #72 = Asciz AXIS_TOOL_MINOR;
-const #73 = Asciz AXIS_ORIENTATION;
-const #74 = Asciz AXIS_VSCROLL;
-const #75 = Asciz AXIS_HSCROLL;
-const #76 = Asciz AXIS_Z;
-const #77 = int 11;
-const #78 = Asciz AXIS_RX;
-const #79 = int 12;
-const #80 = Asciz AXIS_RY;
-const #81 = int 13;
-const #82 = Asciz AXIS_RZ;
-const #83 = int 14;
-const #84 = Asciz AXIS_HAT_X;
-const #85 = int 15;
-const #86 = Asciz AXIS_HAT_Y;
-const #87 = int 16;
-const #88 = Asciz AXIS_LTRIGGER;
-const #89 = int 17;
-const #90 = Asciz AXIS_RTRIGGER;
-const #91 = int 18;
-const #92 = Asciz AXIS_THROTTLE;
-const #93 = int 19;
-const #94 = Asciz AXIS_RUDDER;
-const #95 = int 20;
-const #96 = Asciz AXIS_WHEEL;
-const #97 = int 21;
-const #98 = Asciz AXIS_GAS;
-const #99 = int 22;
-const #100 = Asciz  AXIS_BRAKE;
-const #101 = int  23;
-const #102 = Asciz  AXIS_DISTANCE;
-const #103 = int  24;
-const #104 = Asciz  AXIS_TILT;
-const #105 = int  25;
-const #106 = Asciz  AXIS_GENERIC_1;
-const #107 = int  32;
-const #108 = Asciz  AXIS_GENERIC_2;
-const #109 = int  33;
-const #110 = Asciz  AXIS_GENERIC_3;
-const #111 = int  34;
-const #112 = Asciz  AXIS_GENERIC_4;
-const #113 = int  35;
-const #114 = Asciz  AXIS_GENERIC_5;
-const #115 = int  36;
-const #116 = Asciz  AXIS_GENERIC_6;
-const #117 = int  37;
-const #118 = Asciz  AXIS_GENERIC_7;
-const #119 = int  38;
-const #120 = Asciz  AXIS_GENERIC_8;
-const #121 = int  39;
-const #122 = Asciz  AXIS_GENERIC_9;
-const #123 = int  40;
-const #124 = Asciz  AXIS_GENERIC_10;
-const #125 = int  41;
-const #126 = Asciz  AXIS_GENERIC_11;
-const #127 = int  42;
-const #128 = Asciz  AXIS_GENERIC_12;
-const #129 = int  43;
-const #130 = Asciz  AXIS_GENERIC_13;
-const #131 = int  44;
-const #132 = Asciz  AXIS_GENERIC_14;
-const #133 = int  45;
-const #134 = Asciz  AXIS_GENERIC_15;
-const #135 = int  46;
-const #136 = Asciz  AXIS_GENERIC_16;
-const #137 = int  47;
-const #138 = Asciz  BUTTON_PRIMARY;
-const #139 = Asciz  BUTTON_SECONDARY;
-const #140 = Asciz  BUTTON_TERTIARY;
-const #141 = Asciz  BUTTON_BACK;
-const #142 = Asciz  BUTTON_FORWARD;
-const #143 = Asciz  TOOL_TYPE_UNKNOWN;
-const #144 = Asciz  TOOL_TYPE_FINGER;
-const #145 = Asciz  TOOL_TYPE_STYLUS;
-const #146 = Asciz  TOOL_TYPE_MOUSE;
-const #147 = Asciz  TOOL_TYPE_ERASER;
-const #148 = Asciz  CREATOR;
-const #149 = class  #303; //  android/os/Parcelable$Creator
-const #150 = Asciz  Creator;
-const #151 = Asciz  Landroid/os/Parcelable$Creator;;
-const #152 = Asciz  Signature;
-const #153 = Asciz  Landroid/os/Parcelable$Creator<Landroid/view/MotionEvent;>;;
-const #154 = Asciz  <init>;
-const #155 = Asciz  ()V;
-const #156 = Asciz  Code;
-const #157 = Asciz  LineNumberTable;
-const #158 = Asciz  LocalVariableTable;
-const #159 = Asciz  this;
-const #160 = Asciz  Landroid/view/MotionEvent;;
-const #161 = Asciz  finalize;
-const #162 = Asciz  Exceptions;
-const #163 = class  #304; //  java/lang/Throwable
-const #164 = Asciz  obtain;
-const #165 = Asciz  (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;;
-const #166 = Asciz  downTime;
-const #167 = Asciz  J;
-const #168 = Asciz  eventTime;
-const #169 = Asciz  action;
-const #170 = Asciz  pointerCount;
-const #171 = Asciz  pointerProperties;
-const #172 = Asciz  [Landroid/view/MotionEvent$PointerProperties;;
-const #173 = Asciz  pointerCoords;
-const #174 = Asciz  [Landroid/view/MotionEvent$PointerCoords;;
-const #175 = Asciz  metaState;
-const #176 = Asciz  buttonState;
-const #177 = Asciz  xPrecision;
-const #178 = Asciz  F;
-const #179 = Asciz  yPrecision;
-const #180 = Asciz  deviceId;
-const #181 = Asciz  edgeFlags;
-const #182 = Asciz  source;
-const #183 = Asciz  flags;
-const #184 = Asciz  (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;;
-const #185 = Asciz  pointerIds;
-const #186 = Asciz  [I;
-const #187 = Asciz  (JJIFFFFIFFII)Landroid/view/MotionEvent;;
-const #188 = Asciz  x;
-const #189 = Asciz  y;
-const #190 = Asciz  pressure;
-const #191 = Asciz  size;
-const #192 = Asciz  (JJIIFFFFIFFII)Landroid/view/MotionEvent;;
-const #193 = Asciz  (JJIFFI)Landroid/view/MotionEvent;;
-const #194 = Asciz  (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;;
-const #195 = Asciz  other;
-const #196 = Asciz  obtainNoHistory;
-const #197 = Asciz  recycle;
-const #198 = Asciz  getDeviceId;
-const #199 = Asciz  ()I;
-const #200 = Asciz  getSource;
-const #201 = Asciz  setSource;
-const #202 = Asciz  (I)V;
-const #203 = Asciz  getAction;
-const #204 = Asciz  getActionMasked;
-const #205 = Asciz  getActionIndex;
-const #206 = Asciz  getFlags;
-const #207 = Asciz  getDownTime;
-const #208 = Asciz  ()J;
-const #209 = Asciz  getEventTime;
-const #210 = Asciz  getX;
-const #211 = Asciz  ()F;
-const #212 = Asciz  getY;
-const #213 = Asciz  getPressure;
-const #214 = Asciz  getSize;
-const #215 = Asciz  getTouchMajor;
-const #216 = Asciz  getTouchMinor;
-const #217 = Asciz  getToolMajor;
-const #218 = Asciz  getToolMinor;
-const #219 = Asciz  getOrientation;
-const #220 = Asciz  getAxisValue;
-const #221 = Asciz  (I)F;
-const #222 = Asciz  axis;
-const #223 = Asciz  getPointerCount;
-const #224 = Asciz  getPointerId;
-const #225 = Asciz  (I)I;
-const #226 = Asciz  pointerIndex;
-const #227 = Asciz  getToolType;
-const #228 = Asciz  findPointerIndex;
-const #229 = Asciz  pointerId;
-const #230 = Asciz  (II)F;
-const #231 = Asciz  getPointerCoords;
-const #232 = Asciz  (ILandroid/view/MotionEvent$PointerCoords;)V;
-const #233 = Asciz  outPointerCoords;
-const #234 = Asciz  Landroid/view/MotionEvent$PointerCoords;;
-const #235 = Asciz  getPointerProperties;
-const #236 = Asciz  (ILandroid/view/MotionEvent$PointerProperties;)V;
-const #237 = Asciz  outPointerProperties;
-const #238 = Asciz  Landroid/view/MotionEvent$PointerProperties;;
-const #239 = Asciz  getMetaState;
-const #240 = Asciz  getButtonState;
-const #241 = Asciz  getRawX;
-const #242 = Asciz  getRawY;
-const #243 = Asciz  getXPrecision;
-const #244 = Asciz  getYPrecision;
-const #245 = Asciz  getHistorySize;
-const #246 = Asciz  getHistoricalEventTime;
-const #247 = Asciz  (I)J;
-const #248 = Asciz  pos;
-const #249 = Asciz  getHistoricalX;
-const #250 = Asciz  getHistoricalY;
-const #251 = Asciz  getHistoricalPressure;
-const #252 = Asciz  getHistoricalSize;
-const #253 = Asciz  getHistoricalTouchMajor;
-const #254 = Asciz  getHistoricalTouchMinor;
-const #255 = Asciz  getHistoricalToolMajor;
-const #256 = Asciz  getHistoricalToolMinor;
-const #257 = Asciz  getHistoricalOrientation;
-const #258 = Asciz  getHistoricalAxisValue;
-const #259 = Asciz  (III)F;
-const #260 = Asciz  getHistoricalPointerCoords;
-const #261 = Asciz  (IILandroid/view/MotionEvent$PointerCoords;)V;
-const #262 = Asciz  getEdgeFlags;
-const #263 = Asciz  setEdgeFlags;
-const #264 = Asciz  setAction;
-const #265 = Asciz  offsetLocation;
-const #266 = Asciz  (FF)V;
-const #267 = Asciz  deltaX;
-const #268 = Asciz  deltaY;
-const #269 = Asciz  setLocation;
-const #270 = Asciz  transform;
-const #271 = Asciz  (Landroid/graphics/Matrix;)V;
-const #272 = Asciz  matrix;
-const #273 = Asciz  Landroid/graphics/Matrix;;
-const #274 = Asciz  addBatch;
-const #275 = Asciz  (JFFFFI)V;
-const #276 = Asciz  (J[Landroid/view/MotionEvent$PointerCoords;I)V;
-const #277 = Asciz  toString;
-const #278 = Asciz  ()Ljava/lang/String;;
-const #279 = Asciz  actionToString;
-const #280 = Asciz  (I)Ljava/lang/String;;
-const #281 = Asciz  axisToString;
-const #282 = Asciz  axisFromString;
-const #283 = Asciz  (Ljava/lang/String;)I;
-const #284 = Asciz  symbolicName;
-const #285 = Asciz  Ljava/lang/String;;
-const #286 = Asciz  writeToParcel;
-const #287 = Asciz  (Landroid/os/Parcel;I)V;
-const #288 = Asciz  out;
-const #289 = Asciz  Landroid/os/Parcel;;
-const #290 = Asciz  <clinit>;
-const #291 = Asciz  SourceFile;
-const #292 = Asciz  MotionEvent.java;
-const #293 = NameAndType  #154:#155;//  "<init>":()V
-const #294 = Asciz  java/lang/RuntimeException;
-const #295 = Asciz  Stub!;
-const #296 = NameAndType  #154:#305;//  "<init>":(Ljava/lang/String;)V
-const #297 = NameAndType  #148:#151;//  CREATOR:Landroid/os/Parcelable$Creator;
-const #298 = Asciz  android/view/MotionEvent;
-const #299 = Asciz  android/view/InputEvent;
-const #300 = Asciz  android/os/Parcelable;
-const #301 = Asciz  android/view/MotionEvent$PointerProperties;
-const #302 = Asciz  android/view/MotionEvent$PointerCoords;
-const #303 = Asciz  android/os/Parcelable$Creator;
-const #304 = Asciz  java/lang/Throwable;
-const #305 = Asciz  (Ljava/lang/String;)V;
-
-{
-public static final int INVALID_POINTER_ID;
-  Signature: I
-  Constant value: int -1
-
-public static final int ACTION_MASK;
-  Signature: I
-  Constant value: int 255
-
-public static final int ACTION_DOWN;
-  Signature: I
-  Constant value: int 0
-
-public static final int ACTION_UP;
-  Signature: I
-  Constant value: int 1
-
-public static final int ACTION_MOVE;
-  Signature: I
-  Constant value: int 2
-
-public static final int ACTION_CANCEL;
-  Signature: I
-  Constant value: int 3
-
-public static final int ACTION_OUTSIDE;
-  Signature: I
-  Constant value: int 4
-
-public static final int ACTION_POINTER_DOWN;
-  Signature: I
-  Constant value: int 5
-
-public static final int ACTION_POINTER_UP;
-  Signature: I
-  Constant value: int 6
-
-public static final int ACTION_HOVER_MOVE;
-  Signature: I
-  Constant value: int 7
-
-public static final int ACTION_SCROLL;
-  Signature: I
-  Constant value: int 8
-
-public static final int ACTION_HOVER_ENTER;
-  Signature: I
-  Constant value: int 9
-
-public static final int ACTION_HOVER_EXIT;
-  Signature: I
-  Constant value: int 10
-
-public static final int ACTION_POINTER_INDEX_MASK;
-  Signature: I
-  Constant value: int 65280
-
-public static final int ACTION_POINTER_INDEX_SHIFT;
-  Signature: I
-  Constant value: int 8
-
-public static final int ACTION_POINTER_1_DOWN;
-  Signature: I
-  Constant value: int 5Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_2_DOWN;
-  Signature: I
-  Constant value: int 261Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_3_DOWN;
-  Signature: I
-  Constant value: int 517Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_1_UP;
-  Signature: I
-  Constant value: int 6Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_2_UP;
-  Signature: I
-  Constant value: int 262Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_3_UP;
-  Signature: I
-  Constant value: int 518Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_ID_MASK;
-  Signature: I
-  Constant value: int 65280Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_ID_SHIFT;
-  Signature: I
-  Constant value: int 8Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int FLAG_WINDOW_IS_OBSCURED;
-  Signature: I
-  Constant value: int 1
-
-public static final int EDGE_TOP;
-  Signature: I
-  Constant value: int 1
-
-public static final int EDGE_BOTTOM;
-  Signature: I
-  Constant value: int 2
-
-public static final int EDGE_LEFT;
-  Signature: I
-  Constant value: int 4
-
-public static final int EDGE_RIGHT;
-  Signature: I
-  Constant value: int 8
-
-public static final int AXIS_X;
-  Signature: I
-  Constant value: int 0
-
-public static final int AXIS_Y;
-  Signature: I
-  Constant value: int 1
-
-public static final int AXIS_PRESSURE;
-  Signature: I
-  Constant value: int 2
-
-public static final int AXIS_SIZE;
-  Signature: I
-  Constant value: int 3
-
-public static final int AXIS_TOUCH_MAJOR;
-  Signature: I
-  Constant value: int 4
-
-public static final int AXIS_TOUCH_MINOR;
-  Signature: I
-  Constant value: int 5
-
-public static final int AXIS_TOOL_MAJOR;
-  Signature: I
-  Constant value: int 6
-
-public static final int AXIS_TOOL_MINOR;
-  Signature: I
-  Constant value: int 7
-
-public static final int AXIS_ORIENTATION;
-  Signature: I
-  Constant value: int 8
-
-public static final int AXIS_VSCROLL;
-  Signature: I
-  Constant value: int 9
-
-public static final int AXIS_HSCROLL;
-  Signature: I
-  Constant value: int 10
-
-public static final int AXIS_Z;
-  Signature: I
-  Constant value: int 11
-
-public static final int AXIS_RX;
-  Signature: I
-  Constant value: int 12
-
-public static final int AXIS_RY;
-  Signature: I
-  Constant value: int 13
-
-public static final int AXIS_RZ;
-  Signature: I
-  Constant value: int 14
-
-public static final int AXIS_HAT_X;
-  Signature: I
-  Constant value: int 15
-
-public static final int AXIS_HAT_Y;
-  Signature: I
-  Constant value: int 16
-
-public static final int AXIS_LTRIGGER;
-  Signature: I
-  Constant value: int 17
-
-public static final int AXIS_RTRIGGER;
-  Signature: I
-  Constant value: int 18
-
-public static final int AXIS_THROTTLE;
-  Signature: I
-  Constant value: int 19
-
-public static final int AXIS_RUDDER;
-  Signature: I
-  Constant value: int 20
-
-public static final int AXIS_WHEEL;
-  Signature: I
-  Constant value: int 21
-
-public static final int AXIS_GAS;
-  Signature: I
-  Constant value: int 22
-
-public static final int AXIS_BRAKE;
-  Signature: I
-  Constant value: int 23
-
-public static final int AXIS_DISTANCE;
-  Signature: I
-  Constant value: int 24
-
-public static final int AXIS_TILT;
-  Signature: I
-  Constant value: int 25
-
-public static final int AXIS_GENERIC_1;
-  Signature: I
-  Constant value: int 32
-
-public static final int AXIS_GENERIC_2;
-  Signature: I
-  Constant value: int 33
-
-public static final int AXIS_GENERIC_3;
-  Signature: I
-  Constant value: int 34
-
-public static final int AXIS_GENERIC_4;
-  Signature: I
-  Constant value: int 35
-
-public static final int AXIS_GENERIC_5;
-  Signature: I
-  Constant value: int 36
-
-public static final int AXIS_GENERIC_6;
-  Signature: I
-  Constant value: int 37
-
-public static final int AXIS_GENERIC_7;
-  Signature: I
-  Constant value: int 38
-
-public static final int AXIS_GENERIC_8;
-  Signature: I
-  Constant value: int 39
-
-public static final int AXIS_GENERIC_9;
-  Signature: I
-  Constant value: int 40
-
-public static final int AXIS_GENERIC_10;
-  Signature: I
-  Constant value: int 41
-
-public static final int AXIS_GENERIC_11;
-  Signature: I
-  Constant value: int 42
-
-public static final int AXIS_GENERIC_12;
-  Signature: I
-  Constant value: int 43
-
-public static final int AXIS_GENERIC_13;
-  Signature: I
-  Constant value: int 44
-
-public static final int AXIS_GENERIC_14;
-  Signature: I
-  Constant value: int 45
-
-public static final int AXIS_GENERIC_15;
-  Signature: I
-  Constant value: int 46
-
-public static final int AXIS_GENERIC_16;
-  Signature: I
-  Constant value: int 47
-
-public static final int BUTTON_PRIMARY;
-  Signature: I
-  Constant value: int 1
-
-public static final int BUTTON_SECONDARY;
-  Signature: I
-  Constant value: int 2
-
-public static final int BUTTON_TERTIARY;
-  Signature: I
-  Constant value: int 4
-
-public static final int BUTTON_BACK;
-  Signature: I
-  Constant value: int 8
-
-public static final int BUTTON_FORWARD;
-  Signature: I
-  Constant value: int 16
-
-public static final int TOOL_TYPE_UNKNOWN;
-  Signature: I
-  Constant value: int 0
-
-public static final int TOOL_TYPE_FINGER;
-  Signature: I
-  Constant value: int 1
-
-public static final int TOOL_TYPE_STYLUS;
-  Signature: I
-  Constant value: int 2
-
-public static final int TOOL_TYPE_MOUSE;
-  Signature: I
-  Constant value: int 3
-
-public static final int TOOL_TYPE_ERASER;
-  Signature: I
-  Constant value: int 4
-
-public static final android.os.Parcelable$Creator CREATOR;
-  Signature: Landroid/os/Parcelable$Creator;
-  Signature: length = 0x2
-   00 FFFFFF99
-
-
-android.view.MotionEvent();
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: aload_0
-   1: invokespecial #1; //Method android/view/InputEvent."<init>":()V
-   4: new #2; //class java/lang/RuntimeException
-   7: dup
-   8: ldc #3; //String Stub!
-   10:  invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   13:  athrow
-  LineNumberTable:
-   line 35: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      14      0    this       Landroid/view/MotionEvent;
-
-
-protected void finalize()   throws java.lang.Throwable;
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 36: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-  Exceptions:
-   throws java.lang.Throwable
-public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent$PointerProperties[], android.view.MotionEvent$PointerCoords[], int, int, float, float, int, int, int, int);
-  Signature: (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=16, Args_size=14
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 37: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    pointerCount       I
-   0      10      6    pointerProperties       [Landroid/view/MotionEvent$PointerProperties;
-   0      10      7    pointerCoords       [Landroid/view/MotionEvent$PointerCoords;
-   0      10      8    metaState       I
-   0      10      9    buttonState       I
-   0      10      10    xPrecision       F
-   0      10      11    yPrecision       F
-   0      10      12    deviceId       I
-   0      10      13    edgeFlags       I
-   0      10      14    source       I
-   0      10      15    flags       I
-
-
-public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent$PointerCoords[], int, float, float, int, int, int, int);
-  Signature: (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=15, Args_size=13
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 39: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    pointerCount       I
-   0      10      6    pointerIds       [I
-   0      10      7    pointerCoords       [Landroid/view/MotionEvent$PointerCoords;
-   0      10      8    metaState       I
-   0      10      9    xPrecision       F
-   0      10      10    yPrecision       F
-   0      10      11    deviceId       I
-   0      10      12    edgeFlags       I
-   0      10      13    source       I
-   0      10      14    flags       I
-
-  Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
-  Signature: (JJIFFFFIFFII)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=14, Args_size=12
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 40: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    x       F
-   0      10      6    y       F
-   0      10      7    pressure       F
-   0      10      8    size       F
-   0      10      9    metaState       I
-   0      10      10    xPrecision       F
-   0      10      11    yPrecision       F
-   0      10      12    deviceId       I
-   0      10      13    edgeFlags       I
-
-
-public static android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
-  Signature: (JJIIFFFFIFFII)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=15, Args_size=13
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 42: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    pointerCount       I
-   0      10      6    x       F
-   0      10      7    y       F
-   0      10      8    pressure       F
-   0      10      9    size       F
-   0      10      10    metaState       I
-   0      10      11    xPrecision       F
-   0      10      12    yPrecision       F
-   0      10      13    deviceId       I
-   0      10      14    edgeFlags       I
-
-  Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-public static android.view.MotionEvent obtain(long, long, int, float, float, int);
-  Signature: (JJIFFI)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=8, Args_size=6
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 43: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    x       F
-   0      10      6    y       F
-   0      10      7    metaState       I
-
-
-public static android.view.MotionEvent obtain(android.view.MotionEvent);
-  Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 44: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    other       Landroid/view/MotionEvent;
-
-
-public static android.view.MotionEvent obtainNoHistory(android.view.MotionEvent);
-  Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 45: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    other       Landroid/view/MotionEvent;
-
-
-public final void recycle();
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 46: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getDeviceId();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 47: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getSource();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 48: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final void setSource(int);
-  Signature: (I)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 49: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    source       I
-
-
-public final int getAction();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 50: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getActionMasked();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 51: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getActionIndex();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 52: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getFlags();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 53: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final long getDownTime();
-  Signature: ()J
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 54: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final long getEventTime();
-  Signature: ()J
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 55: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getX();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 56: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getY();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 57: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getPressure();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 58: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getSize();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 59: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getTouchMajor();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 60: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getTouchMinor();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 61: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getToolMajor();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 62: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getToolMinor();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 63: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getOrientation();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 64: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getAxisValue(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 65: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    axis       I
-
-
-public final int getPointerCount();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 66: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getPointerId(int);
-  Signature: (I)I
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 67: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final int getToolType(int);
-  Signature: (I)I
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 68: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final int findPointerIndex(int);
-  Signature: (I)I
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 69: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerId       I
-
-
-public final float getX(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 70: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getY(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 71: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getPressure(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 72: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getSize(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 73: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getTouchMajor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 74: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getTouchMinor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 75: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getToolMajor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 76: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getToolMinor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 77: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getOrientation(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 78: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getAxisValue(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 79: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    axis       I
-   0      10      2    pointerIndex       I
-
-
-public final void getPointerCoords(int, android.view.MotionEvent$PointerCoords);
-  Signature: (ILandroid/view/MotionEvent$PointerCoords;)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 80: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    outPointerCoords       Landroid/view/MotionEvent$PointerCoords;
-
-
-public final void getPointerProperties(int, android.view.MotionEvent$PointerProperties);
-  Signature: (ILandroid/view/MotionEvent$PointerProperties;)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 81: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    outPointerProperties       Landroid/view/MotionEvent$PointerProperties;
-
-
-public final int getMetaState();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 82: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getButtonState();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 83: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getRawX();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 84: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getRawY();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 85: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getXPrecision();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 86: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getYPrecision();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 87: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getHistorySize();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 88: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final long getHistoricalEventTime(int);
-  Signature: (I)J
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 89: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalX(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 90: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalY(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 91: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalPressure(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 92: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalSize(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 93: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalTouchMajor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 94: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalTouchMinor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 95: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalToolMajor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 96: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalToolMinor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 97: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalOrientation(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 98: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalAxisValue(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 99: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    axis       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalX(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 100: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalY(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 101: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalPressure(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 102: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalSize(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 103: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalTouchMajor(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 104: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalTouchMinor(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 105: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalToolMajor(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 106: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalToolMinor(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 107: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalOrientation(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 108: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalAxisValue(int, int, int);
-  Signature: (III)F
-  Code:
-   Stack=3, Locals=4, Args_size=4
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 109: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    axis       I
-   0      10      2    pointerIndex       I
-   0      10      3    pos       I
-
-
-public final void getHistoricalPointerCoords(int, int, android.view.MotionEvent$PointerCoords);
-  Signature: (IILandroid/view/MotionEvent$PointerCoords;)V
-  Code:
-   Stack=3, Locals=4, Args_size=4
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 110: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-   0      10      3    outPointerCoords       Landroid/view/MotionEvent$PointerCoords;
-
-
-public final int getEdgeFlags();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 111: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final void setEdgeFlags(int);
-  Signature: (I)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 112: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    flags       I
-
-
-public final void setAction(int);
-  Signature: (I)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 113: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    action       I
-
-
-public final void offsetLocation(float, float);
-  Signature: (FF)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 114: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    deltaX       F
-   0      10      2    deltaY       F
-
-
-public final void setLocation(float, float);
-  Signature: (FF)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 115: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    x       F
-   0      10      2    y       F
-
-
-public final void transform(android.graphics.Matrix);
-  Signature: (Landroid/graphics/Matrix;)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 116: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    matrix       Landroid/graphics/Matrix;
-
-
-public final void addBatch(long, float, float, float, float, int);
-  Signature: (JFFFFI)V
-  Code:
-   Stack=3, Locals=8, Args_size=7
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 117: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    eventTime       J
-   0      10      3    x       F
-   0      10      4    y       F
-   0      10      5    pressure       F
-   0      10      6    size       F
-   0      10      7    metaState       I
-
-
-public final void addBatch(long, android.view.MotionEvent$PointerCoords[], int);
-  Signature: (J[Landroid/view/MotionEvent$PointerCoords;I)V
-  Code:
-   Stack=3, Locals=5, Args_size=4
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 118: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    eventTime       J
-   0      10      3    pointerCoords       [Landroid/view/MotionEvent$PointerCoords;
-   0      10      4    metaState       I
-
-
-public java.lang.String toString();
-  Signature: ()Ljava/lang/String;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 119: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public static java.lang.String actionToString(int);
-  Signature: (I)Ljava/lang/String;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 120: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    action       I
-
-
-public static java.lang.String axisToString(int);
-  Signature: (I)Ljava/lang/String;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 121: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    axis       I
-
-
-public static int axisFromString(java.lang.String);
-  Signature: (Ljava/lang/String;)I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 122: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    symbolicName       Ljava/lang/String;
-
-
-public void writeToParcel(android.os.Parcel, int);
-  Signature: (Landroid/os/Parcel;I)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 123: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    out       Landroid/os/Parcel;
-   0      10      2    flags       I
-
-
-static {};
-  Signature: ()V
-  Code:
-   Stack=1, Locals=0, Args_size=0
-   0: aconst_null
-   1: putstatic #5; //Field CREATOR:Landroid/os/Parcelable$Creator;
-   4: return
-  LineNumberTable:
-   line 213: 0
-
-
-}
-
diff --git a/base/android/jni_generator/testMotionEvent.javap7 b/base/android/jni_generator/testMotionEvent.javap7
deleted file mode 100644
index f4f5444..0000000
--- a/base/android/jni_generator/testMotionEvent.javap7
+++ /dev/null
@@ -1,2370 +0,0 @@
-Classfile out_android/Debug/gen/content/jni/android/view/MotionEvent.class
-  Last modified Feb 27, 2014; size 13369 bytes
-  MD5 checksum 3718d77a994cb8aceb7b35c5df3c4dd1
-  Compiled from "MotionEvent.java"
-public final class android.view.MotionEvent extends android.view.InputEvent implements android.os.Parcelable
-  SourceFile: "MotionEvent.java"
-  InnerClasses:
-       public static final #10= #9 of #6; //PointerProperties=class android/view/MotionEvent$PointerProperties of class android/view/MotionEvent
-       public static final #13= #12 of #6; //PointerCoords=class android/view/MotionEvent$PointerCoords of class android/view/MotionEvent
-       public static #150= #149 of #8; //Creator=class android/os/Parcelable$Creator of class android/os/Parcelable
-  minor version: 0
-  major version: 49
-  flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER
-Constant pool:
-    #1 = Methodref          #7.#293       //  android/view/InputEvent."<init>":()V
-    #2 = Class              #294          //  java/lang/RuntimeException
-    #3 = String             #295          //  Stub!
-    #4 = Methodref          #2.#296       //  java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-    #5 = Fieldref           #6.#297       //  android/view/MotionEvent.CREATOR:Landroid/os/Parcelable$Creator;
-    #6 = Class              #298          //  android/view/MotionEvent
-    #7 = Class              #299          //  android/view/InputEvent
-    #8 = Class              #300          //  android/os/Parcelable
-    #9 = Class              #301          //  android/view/MotionEvent$PointerProperties
-   #10 = Utf8               PointerProperties
-   #11 = Utf8               InnerClasses
-   #12 = Class              #302          //  android/view/MotionEvent$PointerCoords
-   #13 = Utf8               PointerCoords
-   #14 = Utf8               INVALID_POINTER_ID
-   #15 = Utf8               I
-   #16 = Utf8               ConstantValue
-   #17 = Integer            -1
-   #18 = Utf8               ACTION_MASK
-   #19 = Integer            255
-   #20 = Utf8               ACTION_DOWN
-   #21 = Integer            0
-   #22 = Utf8               ACTION_UP
-   #23 = Integer            1
-   #24 = Utf8               ACTION_MOVE
-   #25 = Integer            2
-   #26 = Utf8               ACTION_CANCEL
-   #27 = Integer            3
-   #28 = Utf8               ACTION_OUTSIDE
-   #29 = Integer            4
-   #30 = Utf8               ACTION_POINTER_DOWN
-   #31 = Integer            5
-   #32 = Utf8               ACTION_POINTER_UP
-   #33 = Integer            6
-   #34 = Utf8               ACTION_HOVER_MOVE
-   #35 = Integer            7
-   #36 = Utf8               ACTION_SCROLL
-   #37 = Integer            8
-   #38 = Utf8               ACTION_HOVER_ENTER
-   #39 = Integer            9
-   #40 = Utf8               ACTION_HOVER_EXIT
-   #41 = Integer            10
-   #42 = Utf8               ACTION_POINTER_INDEX_MASK
-   #43 = Integer            65280
-   #44 = Utf8               ACTION_POINTER_INDEX_SHIFT
-   #45 = Utf8               ACTION_POINTER_1_DOWN
-   #46 = Utf8               Deprecated
-   #47 = Utf8               RuntimeVisibleAnnotations
-   #48 = Utf8               Ljava/lang/Deprecated;
-   #49 = Utf8               ACTION_POINTER_2_DOWN
-   #50 = Integer            261
-   #51 = Utf8               ACTION_POINTER_3_DOWN
-   #52 = Integer            517
-   #53 = Utf8               ACTION_POINTER_1_UP
-   #54 = Utf8               ACTION_POINTER_2_UP
-   #55 = Integer            262
-   #56 = Utf8               ACTION_POINTER_3_UP
-   #57 = Integer            518
-   #58 = Utf8               ACTION_POINTER_ID_MASK
-   #59 = Utf8               ACTION_POINTER_ID_SHIFT
-   #60 = Utf8               FLAG_WINDOW_IS_OBSCURED
-   #61 = Utf8               EDGE_TOP
-   #62 = Utf8               EDGE_BOTTOM
-   #63 = Utf8               EDGE_LEFT
-   #64 = Utf8               EDGE_RIGHT
-   #65 = Utf8               AXIS_X
-   #66 = Utf8               AXIS_Y
-   #67 = Utf8               AXIS_PRESSURE
-   #68 = Utf8               AXIS_SIZE
-   #69 = Utf8               AXIS_TOUCH_MAJOR
-   #70 = Utf8               AXIS_TOUCH_MINOR
-   #71 = Utf8               AXIS_TOOL_MAJOR
-   #72 = Utf8               AXIS_TOOL_MINOR
-   #73 = Utf8               AXIS_ORIENTATION
-   #74 = Utf8               AXIS_VSCROLL
-   #75 = Utf8               AXIS_HSCROLL
-   #76 = Utf8               AXIS_Z
-   #77 = Integer            11
-   #78 = Utf8               AXIS_RX
-   #79 = Integer            12
-   #80 = Utf8               AXIS_RY
-   #81 = Integer            13
-   #82 = Utf8               AXIS_RZ
-   #83 = Integer            14
-   #84 = Utf8               AXIS_HAT_X
-   #85 = Integer            15
-   #86 = Utf8               AXIS_HAT_Y
-   #87 = Integer            16
-   #88 = Utf8               AXIS_LTRIGGER
-   #89 = Integer            17
-   #90 = Utf8               AXIS_RTRIGGER
-   #91 = Integer            18
-   #92 = Utf8               AXIS_THROTTLE
-   #93 = Integer            19
-   #94 = Utf8               AXIS_RUDDER
-   #95 = Integer            20
-   #96 = Utf8               AXIS_WHEEL
-   #97 = Integer            21
-   #98 = Utf8               AXIS_GAS
-   #99 = Integer            22
-  #100 = Utf8               AXIS_BRAKE
-  #101 = Integer            23
-  #102 = Utf8               AXIS_DISTANCE
-  #103 = Integer            24
-  #104 = Utf8               AXIS_TILT
-  #105 = Integer            25
-  #106 = Utf8               AXIS_GENERIC_1
-  #107 = Integer            32
-  #108 = Utf8               AXIS_GENERIC_2
-  #109 = Integer            33
-  #110 = Utf8               AXIS_GENERIC_3
-  #111 = Integer            34
-  #112 = Utf8               AXIS_GENERIC_4
-  #113 = Integer            35
-  #114 = Utf8               AXIS_GENERIC_5
-  #115 = Integer            36
-  #116 = Utf8               AXIS_GENERIC_6
-  #117 = Integer            37
-  #118 = Utf8               AXIS_GENERIC_7
-  #119 = Integer            38
-  #120 = Utf8               AXIS_GENERIC_8
-  #121 = Integer            39
-  #122 = Utf8               AXIS_GENERIC_9
-  #123 = Integer            40
-  #124 = Utf8               AXIS_GENERIC_10
-  #125 = Integer            41
-  #126 = Utf8               AXIS_GENERIC_11
-  #127 = Integer            42
-  #128 = Utf8               AXIS_GENERIC_12
-  #129 = Integer            43
-  #130 = Utf8               AXIS_GENERIC_13
-  #131 = Integer            44
-  #132 = Utf8               AXIS_GENERIC_14
-  #133 = Integer            45
-  #134 = Utf8               AXIS_GENERIC_15
-  #135 = Integer            46
-  #136 = Utf8               AXIS_GENERIC_16
-  #137 = Integer            47
-  #138 = Utf8               BUTTON_PRIMARY
-  #139 = Utf8               BUTTON_SECONDARY
-  #140 = Utf8               BUTTON_TERTIARY
-  #141 = Utf8               BUTTON_BACK
-  #142 = Utf8               BUTTON_FORWARD
-  #143 = Utf8               TOOL_TYPE_UNKNOWN
-  #144 = Utf8               TOOL_TYPE_FINGER
-  #145 = Utf8               TOOL_TYPE_STYLUS
-  #146 = Utf8               TOOL_TYPE_MOUSE
-  #147 = Utf8               TOOL_TYPE_ERASER
-  #148 = Utf8               CREATOR
-  #149 = Class              #303          //  android/os/Parcelable$Creator
-  #150 = Utf8               Creator
-  #151 = Utf8               Landroid/os/Parcelable$Creator;
-  #152 = Utf8               Signature
-  #153 = Utf8               Landroid/os/Parcelable$Creator<Landroid/view/MotionEvent;>;
-  #154 = Utf8               <init>
-  #155 = Utf8               ()V
-  #156 = Utf8               Code
-  #157 = Utf8               LineNumberTable
-  #158 = Utf8               LocalVariableTable
-  #159 = Utf8               this
-  #160 = Utf8               Landroid/view/MotionEvent;
-  #161 = Utf8               finalize
-  #162 = Utf8               Exceptions
-  #163 = Class              #304          //  java/lang/Throwable
-  #164 = Utf8               obtain
-  #165 = Utf8               (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;
-  #166 = Utf8               downTime
-  #167 = Utf8               J
-  #168 = Utf8               eventTime
-  #169 = Utf8               action
-  #170 = Utf8               pointerCount
-  #171 = Utf8               pointerProperties
-  #172 = Utf8               [Landroid/view/MotionEvent$PointerProperties;
-  #173 = Utf8               pointerCoords
-  #174 = Utf8               [Landroid/view/MotionEvent$PointerCoords;
-  #175 = Utf8               metaState
-  #176 = Utf8               buttonState
-  #177 = Utf8               xPrecision
-  #178 = Utf8               F
-  #179 = Utf8               yPrecision
-  #180 = Utf8               deviceId
-  #181 = Utf8               edgeFlags
-  #182 = Utf8               source
-  #183 = Utf8               flags
-  #184 = Utf8               (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;
-  #185 = Utf8               pointerIds
-  #186 = Utf8               [I
-  #187 = Utf8               (JJIFFFFIFFII)Landroid/view/MotionEvent;
-  #188 = Utf8               x
-  #189 = Utf8               y
-  #190 = Utf8               pressure
-  #191 = Utf8               size
-  #192 = Utf8               (JJIIFFFFIFFII)Landroid/view/MotionEvent;
-  #193 = Utf8               (JJIFFI)Landroid/view/MotionEvent;
-  #194 = Utf8               (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-  #195 = Utf8               other
-  #196 = Utf8               obtainNoHistory
-  #197 = Utf8               recycle
-  #198 = Utf8               getDeviceId
-  #199 = Utf8               ()I
-  #200 = Utf8               getSource
-  #201 = Utf8               setSource
-  #202 = Utf8               (I)V
-  #203 = Utf8               getAction
-  #204 = Utf8               getActionMasked
-  #205 = Utf8               getActionIndex
-  #206 = Utf8               getFlags
-  #207 = Utf8               getDownTime
-  #208 = Utf8               ()J
-  #209 = Utf8               getEventTime
-  #210 = Utf8               getX
-  #211 = Utf8               ()F
-  #212 = Utf8               getY
-  #213 = Utf8               getPressure
-  #214 = Utf8               getSize
-  #215 = Utf8               getTouchMajor
-  #216 = Utf8               getTouchMinor
-  #217 = Utf8               getToolMajor
-  #218 = Utf8               getToolMinor
-  #219 = Utf8               getOrientation
-  #220 = Utf8               getAxisValue
-  #221 = Utf8               (I)F
-  #222 = Utf8               axis
-  #223 = Utf8               getPointerCount
-  #224 = Utf8               getPointerId
-  #225 = Utf8               (I)I
-  #226 = Utf8               pointerIndex
-  #227 = Utf8               getToolType
-  #228 = Utf8               findPointerIndex
-  #229 = Utf8               pointerId
-  #230 = Utf8               (II)F
-  #231 = Utf8               getPointerCoords
-  #232 = Utf8               (ILandroid/view/MotionEvent$PointerCoords;)V
-  #233 = Utf8               outPointerCoords
-  #234 = Utf8               Landroid/view/MotionEvent$PointerCoords;
-  #235 = Utf8               getPointerProperties
-  #236 = Utf8               (ILandroid/view/MotionEvent$PointerProperties;)V
-  #237 = Utf8               outPointerProperties
-  #238 = Utf8               Landroid/view/MotionEvent$PointerProperties;
-  #239 = Utf8               getMetaState
-  #240 = Utf8               getButtonState
-  #241 = Utf8               getRawX
-  #242 = Utf8               getRawY
-  #243 = Utf8               getXPrecision
-  #244 = Utf8               getYPrecision
-  #245 = Utf8               getHistorySize
-  #246 = Utf8               getHistoricalEventTime
-  #247 = Utf8               (I)J
-  #248 = Utf8               pos
-  #249 = Utf8               getHistoricalX
-  #250 = Utf8               getHistoricalY
-  #251 = Utf8               getHistoricalPressure
-  #252 = Utf8               getHistoricalSize
-  #253 = Utf8               getHistoricalTouchMajor
-  #254 = Utf8               getHistoricalTouchMinor
-  #255 = Utf8               getHistoricalToolMajor
-  #256 = Utf8               getHistoricalToolMinor
-  #257 = Utf8               getHistoricalOrientation
-  #258 = Utf8               getHistoricalAxisValue
-  #259 = Utf8               (III)F
-  #260 = Utf8               getHistoricalPointerCoords
-  #261 = Utf8               (IILandroid/view/MotionEvent$PointerCoords;)V
-  #262 = Utf8               getEdgeFlags
-  #263 = Utf8               setEdgeFlags
-  #264 = Utf8               setAction
-  #265 = Utf8               offsetLocation
-  #266 = Utf8               (FF)V
-  #267 = Utf8               deltaX
-  #268 = Utf8               deltaY
-  #269 = Utf8               setLocation
-  #270 = Utf8               transform
-  #271 = Utf8               (Landroid/graphics/Matrix;)V
-  #272 = Utf8               matrix
-  #273 = Utf8               Landroid/graphics/Matrix;
-  #274 = Utf8               addBatch
-  #275 = Utf8               (JFFFFI)V
-  #276 = Utf8               (J[Landroid/view/MotionEvent$PointerCoords;I)V
-  #277 = Utf8               toString
-  #278 = Utf8               ()Ljava/lang/String;
-  #279 = Utf8               actionToString
-  #280 = Utf8               (I)Ljava/lang/String;
-  #281 = Utf8               axisToString
-  #282 = Utf8               axisFromString
-  #283 = Utf8               (Ljava/lang/String;)I
-  #284 = Utf8               symbolicName
-  #285 = Utf8               Ljava/lang/String;
-  #286 = Utf8               writeToParcel
-  #287 = Utf8               (Landroid/os/Parcel;I)V
-  #288 = Utf8               out
-  #289 = Utf8               Landroid/os/Parcel;
-  #290 = Utf8               <clinit>
-  #291 = Utf8               SourceFile
-  #292 = Utf8               MotionEvent.java
-  #293 = NameAndType        #154:#155     //  "<init>":()V
-  #294 = Utf8               java/lang/RuntimeException
-  #295 = Utf8               Stub!
-  #296 = NameAndType        #154:#305     //  "<init>":(Ljava/lang/String;)V
-  #297 = NameAndType        #148:#151     //  CREATOR:Landroid/os/Parcelable$Creator;
-  #298 = Utf8               android/view/MotionEvent
-  #299 = Utf8               android/view/InputEvent
-  #300 = Utf8               android/os/Parcelable
-  #301 = Utf8               android/view/MotionEvent$PointerProperties
-  #302 = Utf8               android/view/MotionEvent$PointerCoords
-  #303 = Utf8               android/os/Parcelable$Creator
-  #304 = Utf8               java/lang/Throwable
-  #305 = Utf8               (Ljava/lang/String;)V
-{
-  public static final int INVALID_POINTER_ID;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int -1
-
-
-  public static final int ACTION_MASK;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 255
-
-
-  public static final int ACTION_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 0
-
-
-  public static final int ACTION_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int ACTION_MOVE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int ACTION_CANCEL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 3
-
-
-  public static final int ACTION_OUTSIDE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final int ACTION_POINTER_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 5
-
-
-  public static final int ACTION_POINTER_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 6
-
-
-  public static final int ACTION_HOVER_MOVE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 7
-
-
-  public static final int ACTION_SCROLL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int ACTION_HOVER_ENTER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 9
-
-
-  public static final int ACTION_HOVER_EXIT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 10
-
-
-  public static final int ACTION_POINTER_INDEX_MASK;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 65280
-
-
-  public static final int ACTION_POINTER_INDEX_SHIFT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int ACTION_POINTER_1_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 5
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_2_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 261
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_3_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 517
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_1_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 6
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_2_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 262
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_3_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 518
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_ID_MASK;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 65280
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_ID_SHIFT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int FLAG_WINDOW_IS_OBSCURED;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int EDGE_TOP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int EDGE_BOTTOM;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int EDGE_LEFT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final int EDGE_RIGHT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int AXIS_X;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 0
-
-
-  public static final int AXIS_Y;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int AXIS_PRESSURE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int AXIS_SIZE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 3
-
-
-  public static final int AXIS_TOUCH_MAJOR;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final int AXIS_TOUCH_MINOR;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 5
-
-
-  public static final int AXIS_TOOL_MAJOR;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 6
-
-
-  public static final int AXIS_TOOL_MINOR;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 7
-
-
-  public static final int AXIS_ORIENTATION;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int AXIS_VSCROLL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 9
-
-
-  public static final int AXIS_HSCROLL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 10
-
-
-  public static final int AXIS_Z;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 11
-
-
-  public static final int AXIS_RX;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 12
-
-
-  public static final int AXIS_RY;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 13
-
-
-  public static final int AXIS_RZ;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 14
-
-
-  public static final int AXIS_HAT_X;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 15
-
-
-  public static final int AXIS_HAT_Y;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 16
-
-
-  public static final int AXIS_LTRIGGER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 17
-
-
-  public static final int AXIS_RTRIGGER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 18
-
-
-  public static final int AXIS_THROTTLE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 19
-
-
-  public static final int AXIS_RUDDER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 20
-
-
-  public static final int AXIS_WHEEL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 21
-
-
-  public static final int AXIS_GAS;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 22
-
-
-  public static final int AXIS_BRAKE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 23
-
-
-  public static final int AXIS_DISTANCE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 24
-
-
-  public static final int AXIS_TILT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 25
-
-
-  public static final int AXIS_GENERIC_1;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 32
-
-
-  public static final int AXIS_GENERIC_2;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 33
-
-
-  public static final int AXIS_GENERIC_3;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 34
-
-
-  public static final int AXIS_GENERIC_4;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 35
-
-
-  public static final int AXIS_GENERIC_5;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 36
-
-
-  public static final int AXIS_GENERIC_6;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 37
-
-
-  public static final int AXIS_GENERIC_7;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 38
-
-
-  public static final int AXIS_GENERIC_8;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 39
-
-
-  public static final int AXIS_GENERIC_9;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 40
-
-
-  public static final int AXIS_GENERIC_10;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 41
-
-
-  public static final int AXIS_GENERIC_11;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 42
-
-
-  public static final int AXIS_GENERIC_12;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 43
-
-
-  public static final int AXIS_GENERIC_13;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 44
-
-
-  public static final int AXIS_GENERIC_14;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 45
-
-
-  public static final int AXIS_GENERIC_15;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 46
-
-
-  public static final int AXIS_GENERIC_16;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 47
-
-
-  public static final int BUTTON_PRIMARY;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int BUTTON_SECONDARY;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int BUTTON_TERTIARY;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final int BUTTON_BACK;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int BUTTON_FORWARD;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 16
-
-
-  public static final int TOOL_TYPE_UNKNOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 0
-
-
-  public static final int TOOL_TYPE_FINGER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int TOOL_TYPE_STYLUS;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int TOOL_TYPE_MOUSE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 3
-
-
-  public static final int TOOL_TYPE_ERASER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final android.os.Parcelable$Creator<android.view.MotionEvent> CREATOR;
-    Signature: Landroid/os/Parcelable$Creator;
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    Signature: #153                         // Landroid/os/Parcelable$Creator<Landroid/view/MotionEvent;>;
-
-
-  android.view.MotionEvent();
-    Signature: ()V
-    flags:
-    Code:
-      stack=3, locals=1, args_size=1
-         0: aload_0
-         1: invokespecial #1                  // Method android/view/InputEvent."<init>":()V
-         4: new           #2                  // class java/lang/RuntimeException
-         7: dup
-         8: ldc           #3                  // String Stub!
-        10: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-        13: athrow
-      LineNumberTable:
-        line 35: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      14     0  this   Landroid/view/MotionEvent;
-
-  protected void finalize() throws java.lang.Throwable;
-    Signature: ()V
-    flags: ACC_PROTECTED
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 36: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-    Exceptions:
-      throws java.lang.Throwable
-
-  public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent$PointerProperties[], android.view.MotionEvent$PointerCoords[], int, int, float, float, int, int, int, int);
-    Signature: (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=16, args_size=14
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 37: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5 pointerCount   I
-               0      10     6 pointerProperties   [Landroid/view/MotionEvent$PointerProperties;
-               0      10     7 pointerCoords   [Landroid/view/MotionEvent$PointerCoords;
-               0      10     8 metaState   I
-               0      10     9 buttonState   I
-               0      10    10 xPrecision   F
-               0      10    11 yPrecision   F
-               0      10    12 deviceId   I
-               0      10    13 edgeFlags   I
-               0      10    14 source   I
-               0      10    15 flags   I
-
-  public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent$PointerCoords[], int, float, float, int, int, int, int);
-    Signature: (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=15, args_size=13
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 39: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5 pointerCount   I
-               0      10     6 pointerIds   [I
-               0      10     7 pointerCoords   [Landroid/view/MotionEvent$PointerCoords;
-               0      10     8 metaState   I
-               0      10     9 xPrecision   F
-               0      10    10 yPrecision   F
-               0      10    11 deviceId   I
-               0      10    12 edgeFlags   I
-               0      10    13 source   I
-               0      10    14 flags   I
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-  public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
-    Signature: (JJIFFFFIFFII)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=14, args_size=12
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 40: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5     x   F
-               0      10     6     y   F
-               0      10     7 pressure   F
-               0      10     8  size   F
-               0      10     9 metaState   I
-               0      10    10 xPrecision   F
-               0      10    11 yPrecision   F
-               0      10    12 deviceId   I
-               0      10    13 edgeFlags   I
-
-  public static android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
-    Signature: (JJIIFFFFIFFII)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=15, args_size=13
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 42: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5 pointerCount   I
-               0      10     6     x   F
-               0      10     7     y   F
-               0      10     8 pressure   F
-               0      10     9  size   F
-               0      10    10 metaState   I
-               0      10    11 xPrecision   F
-               0      10    12 yPrecision   F
-               0      10    13 deviceId   I
-               0      10    14 edgeFlags   I
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-  public static android.view.MotionEvent obtain(long, long, int, float, float, int);
-    Signature: (JJIFFI)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=8, args_size=6
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 43: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5     x   F
-               0      10     6     y   F
-               0      10     7 metaState   I
-
-  public static android.view.MotionEvent obtain(android.view.MotionEvent);
-    Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 44: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 other   Landroid/view/MotionEvent;
-
-  public static android.view.MotionEvent obtainNoHistory(android.view.MotionEvent);
-    Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 45: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 other   Landroid/view/MotionEvent;
-
-  public final void recycle();
-    Signature: ()V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 46: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getDeviceId();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 47: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getSource();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 48: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final void setSource(int);
-    Signature: (I)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 49: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 source   I
-
-  public final int getAction();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 50: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getActionMasked();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 51: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getActionIndex();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 52: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getFlags();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 53: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final long getDownTime();
-    Signature: ()J
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 54: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final long getEventTime();
-    Signature: ()J
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 55: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getX();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 56: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getY();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 57: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getPressure();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 58: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getSize();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 59: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getTouchMajor();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 60: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getTouchMinor();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 61: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getToolMajor();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 62: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getToolMinor();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 63: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getOrientation();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 64: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getAxisValue(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 65: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1  axis   I
-
-  public final int getPointerCount();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 66: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getPointerId(int);
-    Signature: (I)I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 67: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final int getToolType(int);
-    Signature: (I)I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 68: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final int findPointerIndex(int);
-    Signature: (I)I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 69: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerId   I
-
-  public final float getX(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 70: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getY(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 71: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getPressure(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 72: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getSize(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 73: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getTouchMajor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 74: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getTouchMinor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 75: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getToolMajor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 76: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getToolMinor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 77: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getOrientation(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 78: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getAxisValue(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 79: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1  axis   I
-               0      10     2 pointerIndex   I
-
-  public final void getPointerCoords(int, android.view.MotionEvent$PointerCoords);
-    Signature: (ILandroid/view/MotionEvent$PointerCoords;)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 80: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2 outPointerCoords   Landroid/view/MotionEvent$PointerCoords;
-
-  public final void getPointerProperties(int, android.view.MotionEvent$PointerProperties);
-    Signature: (ILandroid/view/MotionEvent$PointerProperties;)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 81: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2 outPointerProperties   Landroid/view/MotionEvent$PointerProperties;
-
-  public final int getMetaState();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 82: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getButtonState();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 83: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getRawX();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 84: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getRawY();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 85: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getXPrecision();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 86: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getYPrecision();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 87: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getHistorySize();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 88: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final long getHistoricalEventTime(int);
-    Signature: (I)J
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 89: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalX(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 90: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalY(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 91: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalPressure(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 92: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalSize(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 93: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalTouchMajor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 94: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalTouchMinor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 95: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalToolMajor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 96: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalToolMinor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 97: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalOrientation(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 98: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalAxisValue(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 99: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1  axis   I
-               0      10     2   pos   I
-
-  public final float getHistoricalX(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 100: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalY(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 101: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalPressure(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 102: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalSize(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 103: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalTouchMajor(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 104: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalTouchMinor(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 105: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalToolMajor(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 106: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalToolMinor(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 107: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalOrientation(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 108: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalAxisValue(int, int, int);
-    Signature: (III)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=4, args_size=4
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 109: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1  axis   I
-               0      10     2 pointerIndex   I
-               0      10     3   pos   I
-
-  public final void getHistoricalPointerCoords(int, int, android.view.MotionEvent$PointerCoords);
-    Signature: (IILandroid/view/MotionEvent$PointerCoords;)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=4, args_size=4
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 110: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-               0      10     3 outPointerCoords   Landroid/view/MotionEvent$PointerCoords;
-
-  public final int getEdgeFlags();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 111: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final void setEdgeFlags(int);
-    Signature: (I)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 112: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 flags   I
-
-  public final void setAction(int);
-    Signature: (I)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 113: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 action   I
-
-  public final void offsetLocation(float, float);
-    Signature: (FF)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 114: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 deltaX   F
-               0      10     2 deltaY   F
-
-  public final void setLocation(float, float);
-    Signature: (FF)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 115: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1     x   F
-               0      10     2     y   F
-
-  public final void transform(android.graphics.Matrix);
-    Signature: (Landroid/graphics/Matrix;)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 116: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 matrix   Landroid/graphics/Matrix;
-
-  public final void addBatch(long, float, float, float, float, int);
-    Signature: (JFFFFI)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=8, args_size=7
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 117: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 eventTime   J
-               0      10     3     x   F
-               0      10     4     y   F
-               0      10     5 pressure   F
-               0      10     6  size   F
-               0      10     7 metaState   I
-
-  public final void addBatch(long, android.view.MotionEvent$PointerCoords[], int);
-    Signature: (J[Landroid/view/MotionEvent$PointerCoords;I)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=5, args_size=4
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 118: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 eventTime   J
-               0      10     3 pointerCoords   [Landroid/view/MotionEvent$PointerCoords;
-               0      10     4 metaState   I
-
-  public java.lang.String toString();
-    Signature: ()Ljava/lang/String;
-    flags: ACC_PUBLIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 119: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public static java.lang.String actionToString(int);
-    Signature: (I)Ljava/lang/String;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 120: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 action   I
-
-  public static java.lang.String axisToString(int);
-    Signature: (I)Ljava/lang/String;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 121: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  axis   I
-
-  public static int axisFromString(java.lang.String);
-    Signature: (Ljava/lang/String;)I
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 122: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 symbolicName   Ljava/lang/String;
-
-  public void writeToParcel(android.os.Parcel, int);
-    Signature: (Landroid/os/Parcel;I)V
-    flags: ACC_PUBLIC
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 123: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   out   Landroid/os/Parcel;
-               0      10     2 flags   I
-
-  static {};
-    Signature: ()V
-    flags: ACC_STATIC
-    Code:
-      stack=1, locals=0, args_size=0
-         0: aconst_null
-         1: putstatic     #5                  // Field CREATOR:Landroid/os/Parcelable$Creator;
-         4: return
-      LineNumberTable:
-        line 213: 0
-}
diff --git a/base/android/jni_generator/testMultipleJNIAdditionalImport.golden b/base/android/jni_generator/testMultipleJNIAdditionalImport.golden
deleted file mode 100644
index 0eecb5a..0000000
--- a/base/android/jni_generator/testMultipleJNIAdditionalImport.golden
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/foo/Foo
-
-#ifndef org_chromium_foo_Foo_JNI
-#define org_chromium_foo_Foo_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kFooClassPath[] = "org/chromium/foo/Foo";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_Foo_clazz __attribute__((unused)) = 0;
-#define Foo_clazz(env) base::android::LazyGetClass(env, kFooClassPath, &g_Foo_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static void DoSomething(JNIEnv* env, const base::android::JavaParamRef<jclass>&
-    jcaller,
-    const base::android::JavaParamRef<jobject>& callback1,
-    const base::android::JavaParamRef<jobject>& callback2);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeDoSomething(JNIEnv*
-    env, jclass jcaller,
-    jobject callback1,
-    jobject callback2) {
-  return DoSomething(env, base::android::JavaParamRef<jclass>(env, jcaller),
-      base::android::JavaParamRef<jobject>(env, callback1),
-      base::android::JavaParamRef<jobject>(env, callback2));
-}
-
-static base::subtle::AtomicWord g_Foo_calledByNative = 0;
-static void Java_Foo_calledByNative(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& callback1,
-    const base::android::JavaRefOrBare<jobject>& callback2) {
-  CHECK_CLAZZ(env, Foo_clazz(env),
-      Foo_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, Foo_clazz(env),
-      "calledByNative",
-"("
-"Lorg/chromium/foo/Bar1$Callback;"
-"Lorg/chromium/foo/Bar2$Callback;"
-")"
-"V",
-      &g_Foo_calledByNative);
-
-     env->CallStaticVoidMethod(Foo_clazz(env),
-          method_id, callback1.obj(), callback2.obj());
-  jni_generator::CheckException(env);
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsFoo[] = {
-    { "nativeDoSomething",
-"("
-"Lorg/chromium/foo/Bar1$Callback;"
-"Lorg/chromium/foo/Bar2$Callback;"
-")"
-"V", reinterpret_cast<void*>(Java_org_chromium_foo_Foo_nativeDoSomething) },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsFooSize = arraysize(kMethodsFoo);
-
-  if (env->RegisterNatives(Foo_clazz(env),
-                           kMethodsFoo,
-                           kMethodsFooSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, Foo_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_foo_Foo_JNI
diff --git a/base/android/jni_generator/testNatives.golden b/base/android/jni_generator/testNatives.golden
deleted file mode 100644
index 3362c92..0000000
--- a/base/android/jni_generator/testNatives.golden
+++ /dev/null
@@ -1,340 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kTestJniClassPath[] = "org/chromium/TestJni";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
-#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(JNIEnv* env,
-    jobject jcaller) {
-  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeDestroy(JNIEnv* env,
-    jobject jcaller,
-    jint nativeChromeBrowserProvider) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
-  return native->Destroy(env, base::android::JavaParamRef<jobject>(env,
-      jcaller));
-}
-
-JNI_GENERATOR_EXPORT jlong Java_org_chromium_TestJni_nativeAddBookmark(JNIEnv*
-    env, jobject jcaller,
-    jint nativeChromeBrowserProvider,
-    jstring url,
-    jstring title,
-    jboolean isFolder,
-    jlong parentId) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "AddBookmark", 0);
-  return native->AddBookmark(env, base::android::JavaParamRef<jobject>(env,
-      jcaller), base::android::JavaParamRef<jstring>(env, url),
-      base::android::JavaParamRef<jstring>(env, title), isFolder, parentId);
-}
-
-static base::android::ScopedJavaLocalRef<jstring> GetDomainAndRegistry(JNIEnv*
-    env, const base::android::JavaParamRef<jclass>& jcaller,
-    const base::android::JavaParamRef<jstring>& url);
-
-JNI_GENERATOR_EXPORT jstring
-    Java_org_chromium_TestJni_nativeGetDomainAndRegistry(JNIEnv* env, jclass
-    jcaller,
-    jstring url) {
-  return GetDomainAndRegistry(env, base::android::JavaParamRef<jclass>(env,
-      jcaller), base::android::JavaParamRef<jstring>(env, url)).Release();
-}
-
-static void CreateHistoricalTabFromState(JNIEnv* env, const
-    base::android::JavaParamRef<jclass>& jcaller,
-    const base::android::JavaParamRef<jbyteArray>& state,
-    jint tab_index);
-
-JNI_GENERATOR_EXPORT void
-    Java_org_chromium_TestJni_nativeCreateHistoricalTabFromState(JNIEnv* env,
-    jclass jcaller,
-    jbyteArray state,
-    jint tab_index) {
-  return CreateHistoricalTabFromState(env,
-      base::android::JavaParamRef<jclass>(env, jcaller),
-      base::android::JavaParamRef<jbyteArray>(env, state), tab_index);
-}
-
-static base::android::ScopedJavaLocalRef<jbyteArray> GetStateAsByteArray(JNIEnv*
-    env, const base::android::JavaParamRef<jobject>& jcaller,
-    const base::android::JavaParamRef<jobject>& view);
-
-JNI_GENERATOR_EXPORT jbyteArray
-    Java_org_chromium_TestJni_nativeGetStateAsByteArray(JNIEnv* env, jobject
-    jcaller,
-    jobject view) {
-  return GetStateAsByteArray(env, base::android::JavaParamRef<jobject>(env,
-      jcaller), base::android::JavaParamRef<jobject>(env, view)).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    GetAutofillProfileGUIDs(JNIEnv* env, const
-    base::android::JavaParamRef<jclass>& jcaller);
-
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_org_chromium_TestJni_nativeGetAutofillProfileGUIDs(JNIEnv* env, jclass
-    jcaller) {
-  return GetAutofillProfileGUIDs(env, base::android::JavaParamRef<jclass>(env,
-      jcaller)).Release();
-}
-
-static void SetRecognitionResults(JNIEnv* env, const
-    base::android::JavaParamRef<jobject>& jcaller,
-    jint sessionId,
-    const base::android::JavaParamRef<jobjectArray>& results);
-
-JNI_GENERATOR_EXPORT void
-    Java_org_chromium_TestJni_nativeSetRecognitionResults(JNIEnv* env, jobject
-    jcaller,
-    jint sessionId,
-    jobjectArray results) {
-  return SetRecognitionResults(env, base::android::JavaParamRef<jobject>(env,
-      jcaller), sessionId, base::android::JavaParamRef<jobjectArray>(env,
-      results));
-}
-
-JNI_GENERATOR_EXPORT jlong
-    Java_org_chromium_TestJni_nativeAddBookmarkFromAPI(JNIEnv* env, jobject
-    jcaller,
-    jint nativeChromeBrowserProvider,
-    jstring url,
-    jobject created,
-    jobject isBookmark,
-    jobject date,
-    jbyteArray favicon,
-    jstring title,
-    jobject visits) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "AddBookmarkFromAPI", 0);
-  return native->AddBookmarkFromAPI(env,
-      base::android::JavaParamRef<jobject>(env, jcaller),
-      base::android::JavaParamRef<jstring>(env, url),
-      base::android::JavaParamRef<jobject>(env, created),
-      base::android::JavaParamRef<jobject>(env, isBookmark),
-      base::android::JavaParamRef<jobject>(env, date),
-      base::android::JavaParamRef<jbyteArray>(env, favicon),
-      base::android::JavaParamRef<jstring>(env, title),
-      base::android::JavaParamRef<jobject>(env, visits));
-}
-
-static jint FindAll(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller,
-    const base::android::JavaParamRef<jstring>& find);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeFindAll(JNIEnv* env,
-    jobject jcaller,
-    jstring find) {
-  return FindAll(env, base::android::JavaParamRef<jobject>(env, jcaller),
-      base::android::JavaParamRef<jstring>(env, find));
-}
-
-static base::android::ScopedJavaLocalRef<jobject> GetInnerClass(JNIEnv* env,
-    const base::android::JavaParamRef<jclass>& jcaller);
-
-JNI_GENERATOR_EXPORT jobject
-    Java_org_chromium_TestJni_nativeGetInnerClass(JNIEnv* env, jclass jcaller) {
-  return GetInnerClass(env, base::android::JavaParamRef<jclass>(env,
-      jcaller)).Release();
-}
-
-JNI_GENERATOR_EXPORT jobject Java_org_chromium_TestJni_nativeQueryBitmap(JNIEnv*
-    env, jobject jcaller,
-    jint nativeChromeBrowserProvider,
-    jobjectArray projection,
-    jstring selection,
-    jobjectArray selectionArgs,
-    jstring sortOrder) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "QueryBitmap", NULL);
-  return native->QueryBitmap(env, base::android::JavaParamRef<jobject>(env,
-      jcaller), base::android::JavaParamRef<jobjectArray>(env, projection),
-      base::android::JavaParamRef<jstring>(env, selection),
-      base::android::JavaParamRef<jobjectArray>(env, selectionArgs),
-      base::android::JavaParamRef<jstring>(env, sortOrder)).Release();
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeGotOrientation(JNIEnv*
-    env, jobject jcaller,
-    jint nativeDataFetcherImplAndroid,
-    jdouble alpha,
-    jdouble beta,
-    jdouble gamma) {
-  DataFetcherImplAndroid* native =
-      reinterpret_cast<DataFetcherImplAndroid*>(nativeDataFetcherImplAndroid);
-  CHECK_NATIVE_PTR(env, jcaller, native, "GotOrientation");
-  return native->GotOrientation(env, base::android::JavaParamRef<jobject>(env,
-      jcaller), alpha, beta, gamma);
-}
-
-static base::android::ScopedJavaLocalRef<jthrowable>
-    MessWithJavaException(JNIEnv* env, const
-    base::android::JavaParamRef<jclass>& jcaller,
-    const base::android::JavaParamRef<jthrowable>& e);
-
-JNI_GENERATOR_EXPORT jthrowable
-    Java_org_chromium_TestJni_nativeMessWithJavaException(JNIEnv* env, jclass
-    jcaller,
-    jthrowable e) {
-  return MessWithJavaException(env, base::android::JavaParamRef<jclass>(env,
-      jcaller), base::android::JavaParamRef<jthrowable>(env, e)).Release();
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsTestJni[] = {
-    { "nativeInit",
-"("
-")"
-"I", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeInit) },
-    { "nativeDestroy",
-"("
-"I"
-")"
-"V", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeDestroy) },
-    { "nativeAddBookmark",
-"("
-"I"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Z"
-"J"
-")"
-"J", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeAddBookmark) },
-    { "nativeGetDomainAndRegistry",
-"("
-"Ljava/lang/String;"
-")"
-"Ljava/lang/String;",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetDomainAndRegistry)
-    },
-    { "nativeCreateHistoricalTabFromState",
-"("
-"[B"
-"I"
-")"
-"V",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeCreateHistoricalTabFromState)
-    },
-    { "nativeGetStateAsByteArray",
-"("
-"Landroid/view/View;"
-")"
-"[B",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetStateAsByteArray)
-    },
-    { "nativeGetAutofillProfileGUIDs",
-"("
-")"
-"[Ljava/lang/String;",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetAutofillProfileGUIDs)
-    },
-    { "nativeSetRecognitionResults",
-"("
-"I"
-"[Ljava/lang/String;"
-")"
-"V",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeSetRecognitionResults)
-    },
-    { "nativeAddBookmarkFromAPI",
-"("
-"I"
-"Ljava/lang/String;"
-"Ljava/lang/Long;"
-"Ljava/lang/Boolean;"
-"Ljava/lang/Long;"
-"[B"
-"Ljava/lang/String;"
-"Ljava/lang/Integer;"
-")"
-"J", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeAddBookmarkFromAPI)
-    },
-    { "nativeFindAll",
-"("
-"Ljava/lang/String;"
-")"
-"I", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeFindAll) },
-    { "nativeGetInnerClass",
-"("
-")"
-"Lorg/chromium/example/jni_generator/SampleForTests$OnFrameAvailableListener;",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetInnerClass) },
-    { "nativeQueryBitmap",
-"("
-"I"
-"[Ljava/lang/String;"
-"Ljava/lang/String;"
-"[Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"Landroid/graphics/Bitmap;",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeQueryBitmap) },
-    { "nativeGotOrientation",
-"("
-"I"
-"D"
-"D"
-"D"
-")"
-"V", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGotOrientation) },
-    { "nativeMessWithJavaException",
-"("
-"Ljava/lang/Throwable;"
-")"
-"Ljava/lang/Throwable;",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeMessWithJavaException)
-    },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsTestJniSize = arraysize(kMethodsTestJni);
-
-  if (env->RegisterNatives(TestJni_clazz(env),
-                           kMethodsTestJni,
-                           kMethodsTestJniSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, TestJni_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/testNativesLong.golden b/base/android/jni_generator/testNativesLong.golden
deleted file mode 100644
index ec029ce..0000000
--- a/base/android/jni_generator/testNativesLong.golden
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kTestJniClassPath[] = "org/chromium/TestJni";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
-#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeDestroy(JNIEnv* env,
-    jobject jcaller,
-    jlong nativeChromeBrowserProvider) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
-  return native->Destroy(env, base::android::JavaParamRef<jobject>(env,
-      jcaller));
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsTestJni[] = {
-    { "nativeDestroy",
-"("
-"J"
-")"
-"V", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeDestroy) },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsTestJniSize = arraysize(kMethodsTestJni);
-
-  if (env->RegisterNatives(TestJni_clazz(env),
-                           kMethodsTestJni,
-                           kMethodsTestJniSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, TestJni_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/testSingleJNIAdditionalImport.golden b/base/android/jni_generator/testSingleJNIAdditionalImport.golden
deleted file mode 100644
index ef618da..0000000
--- a/base/android/jni_generator/testSingleJNIAdditionalImport.golden
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/foo/Foo
-
-#ifndef org_chromium_foo_Foo_JNI
-#define org_chromium_foo_Foo_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kFooClassPath[] = "org/chromium/foo/Foo";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_Foo_clazz __attribute__((unused)) = 0;
-#define Foo_clazz(env) base::android::LazyGetClass(env, kFooClassPath, &g_Foo_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static void DoSomething(JNIEnv* env, const base::android::JavaParamRef<jclass>&
-    jcaller,
-    const base::android::JavaParamRef<jobject>& callback);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeDoSomething(JNIEnv*
-    env, jclass jcaller,
-    jobject callback) {
-  return DoSomething(env, base::android::JavaParamRef<jclass>(env, jcaller),
-      base::android::JavaParamRef<jobject>(env, callback));
-}
-
-static base::subtle::AtomicWord g_Foo_calledByNative = 0;
-static void Java_Foo_calledByNative(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& callback) {
-  CHECK_CLAZZ(env, Foo_clazz(env),
-      Foo_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, Foo_clazz(env),
-      "calledByNative",
-"("
-"Lorg/chromium/foo/Bar$Callback;"
-")"
-"V",
-      &g_Foo_calledByNative);
-
-     env->CallStaticVoidMethod(Foo_clazz(env),
-          method_id, callback.obj());
-  jni_generator::CheckException(env);
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsFoo[] = {
-    { "nativeDoSomething",
-"("
-"Lorg/chromium/foo/Bar$Callback;"
-")"
-"V", reinterpret_cast<void*>(Java_org_chromium_foo_Foo_nativeDoSomething) },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsFooSize = arraysize(kMethodsFoo);
-
-  if (env->RegisterNatives(Foo_clazz(env),
-                           kMethodsFoo,
-                           kMethodsFooSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, Foo_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_foo_Foo_JNI
diff --git a/base/android/jni_int_wrapper.h b/base/android/jni_int_wrapper.h
deleted file mode 100644
index fa0f3d5..0000000
--- a/base/android/jni_int_wrapper.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_ANDROID_JNI_INT_WRAPPER_H_
-#define BASE_ANDROID_JNI_INT_WRAPPER_H_
-
-// Wrapper used to receive int when calling Java from native.
-// The wrapper disallows automatic conversion of long to int.
-// This is to avoid a common anti-pattern where a Java int is used
-// to receive a native pointer. Please use a Java long to receive
-// native pointers, so that the code works on both 32-bit and 64-bit
-// platforms. Note the wrapper allows other lossy conversions into
-// jint that could be consider anti-patterns, such as from size_t.
-
-// Checking is only done in debugging builds.
-
-#ifdef NDEBUG
-
-typedef jint JniIntWrapper;
-
-// This inline is sufficiently trivial that it does not change the
-// final code generated by g++.
-inline jint as_jint(JniIntWrapper wrapper) {
-  return wrapper;
-}
-
-#else
-
-class JniIntWrapper {
- public:
-  JniIntWrapper() : i_(0) {}
-  JniIntWrapper(int i) : i_(i) {}
-  JniIntWrapper(const JniIntWrapper& ji) : i_(ji.i_) {}
-  template <class T> JniIntWrapper(const T& t) : i_(t) {}
-  jint as_jint() const { return i_; }
- private:
-  // If you get an "is private" error at the line below it is because you used
-  // an implicit conversion to convert a long to an int when calling Java.
-  // We disallow this, as a common anti-pattern allows converting a native
-  // pointer (intptr_t) to a Java int. Please use a Java long to represent
-  // a native pointer. If you want a lossy conversion, please use an
-  // explicit conversion in your C++ code. Note an error is only seen when
-  // compiling on a 64-bit platform, as intptr_t is indistinguishable from
-  // int on 32-bit platforms.
-  JniIntWrapper(long);
-  jint i_;
-};
-
-inline jint as_jint(const JniIntWrapper& wrapper) {
-  return wrapper.as_jint();
-}
-
-#endif  // NDEBUG
-
-#endif  // BASE_ANDROID_JNI_INT_WRAPPER_H_
diff --git a/base/android/jni_string.cc b/base/android/jni_string.cc
deleted file mode 100644
index f28f649..0000000
--- a/base/android/jni_string.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright (c) 2012 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/android/jni_string.h"
-
-#include "base/android/jni_android.h"
-#include "base/logging.h"
-#include "base/strings/utf_string_conversions.h"
-
-namespace {
-
-// Internal version that does not use a scoped local pointer.
-jstring ConvertUTF16ToJavaStringImpl(JNIEnv* env,
-                                     const base::StringPiece16& str) {
-  jstring result = env->NewString(str.data(), str.length());
-  base::android::CheckException(env);
-  return result;
-}
-
-}  // namespace
-
-namespace base {
-namespace android {
-
-void ConvertJavaStringToUTF8(JNIEnv* env, jstring str, std::string* result) {
-  DCHECK(str);
-  if (!str) {
-    LOG(WARNING) << "ConvertJavaStringToUTF8 called with null string.";
-    result->clear();
-    return;
-  }
-  const jsize length = env->GetStringLength(str);
-  if (!length) {
-    result->clear();
-    CheckException(env);
-    return;
-  }
-  // JNI's GetStringUTFChars() returns strings in Java "modified" UTF8, so
-  // instead get the String in UTF16 and convert using chromium's conversion
-  // function that yields plain (non Java-modified) UTF8.
-  const jchar* chars = env->GetStringChars(str, NULL);
-  DCHECK(chars);
-  UTF16ToUTF8(chars, length, result);
-  env->ReleaseStringChars(str, chars);
-  CheckException(env);
-}
-
-std::string ConvertJavaStringToUTF8(JNIEnv* env, jstring str) {
-  std::string result;
-  ConvertJavaStringToUTF8(env, str, &result);
-  return result;
-}
-
-std::string ConvertJavaStringToUTF8(const JavaRef<jstring>& str) {
-  return ConvertJavaStringToUTF8(AttachCurrentThread(), str.obj());
-}
-
-std::string ConvertJavaStringToUTF8(JNIEnv* env, const JavaRef<jstring>& str) {
-  return ConvertJavaStringToUTF8(env, str.obj());
-}
-
-ScopedJavaLocalRef<jstring> ConvertUTF8ToJavaString(
-    JNIEnv* env,
-    const base::StringPiece& str) {
-  // JNI's NewStringUTF expects "modified" UTF8 so instead create the string
-  // via our own UTF16 conversion utility.
-  // Further, Dalvik requires the string passed into NewStringUTF() to come from
-  // a trusted source. We can't guarantee that all UTF8 will be sanitized before
-  // it gets here, so constructing via UTF16 side-steps this issue.
-  // (Dalvik stores strings internally as UTF16 anyway, so there shouldn't be
-  // a significant performance hit by doing it this way).
-  return ScopedJavaLocalRef<jstring>(env, ConvertUTF16ToJavaStringImpl(
-      env, UTF8ToUTF16(str)));
-}
-
-void ConvertJavaStringToUTF16(JNIEnv* env, jstring str, string16* result) {
-  DCHECK(str);
-  if (!str) {
-    LOG(WARNING) << "ConvertJavaStringToUTF16 called with null string.";
-    result->clear();
-    return;
-  }
-  const jsize length = env->GetStringLength(str);
-  if (!length) {
-    result->clear();
-    CheckException(env);
-    return;
-  }
-  const jchar* chars = env->GetStringChars(str, NULL);
-  DCHECK(chars);
-  // GetStringChars isn't required to NULL-terminate the strings
-  // it returns, so the length must be explicitly checked.
-  result->assign(chars, length);
-  env->ReleaseStringChars(str, chars);
-  CheckException(env);
-}
-
-string16 ConvertJavaStringToUTF16(JNIEnv* env, jstring str) {
-  string16 result;
-  ConvertJavaStringToUTF16(env, str, &result);
-  return result;
-}
-
-string16 ConvertJavaStringToUTF16(const JavaRef<jstring>& str) {
-  return ConvertJavaStringToUTF16(AttachCurrentThread(), str.obj());
-}
-
-string16 ConvertJavaStringToUTF16(JNIEnv* env, const JavaRef<jstring>& str) {
-  return ConvertJavaStringToUTF16(env, str.obj());
-}
-
-ScopedJavaLocalRef<jstring> ConvertUTF16ToJavaString(
-    JNIEnv* env,
-    const base::StringPiece16& str) {
-  return ScopedJavaLocalRef<jstring>(env,
-                                     ConvertUTF16ToJavaStringImpl(env, str));
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/jni_string.h b/base/android/jni_string.h
deleted file mode 100644
index 09e85f3..0000000
--- a/base/android/jni_string.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2012 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_JNI_STRING_H_
-#define BASE_ANDROID_JNI_STRING_H_
-
-#include <jni.h>
-#include <string>
-
-#include "base/android/scoped_java_ref.h"
-#include "base/base_export.h"
-#include "base/strings/string_piece.h"
-
-namespace base {
-namespace android {
-
-// Convert a Java string to UTF8. Returns a std string.
-BASE_EXPORT void ConvertJavaStringToUTF8(JNIEnv* env,
-                                         jstring str,
-                                         std::string* result);
-BASE_EXPORT std::string ConvertJavaStringToUTF8(JNIEnv* env, jstring str);
-BASE_EXPORT std::string ConvertJavaStringToUTF8(const JavaRef<jstring>& str);
-BASE_EXPORT std::string ConvertJavaStringToUTF8(JNIEnv* env,
-                                                const JavaRef<jstring>& str);
-
-// Convert a std string to Java string.
-BASE_EXPORT ScopedJavaLocalRef<jstring> ConvertUTF8ToJavaString(
-    JNIEnv* env,
-    const base::StringPiece& str);
-
-// Convert a Java string to UTF16. Returns a string16.
-BASE_EXPORT void ConvertJavaStringToUTF16(JNIEnv* env,
-                                          jstring str,
-                                          string16* result);
-BASE_EXPORT string16 ConvertJavaStringToUTF16(JNIEnv* env, jstring str);
-BASE_EXPORT string16 ConvertJavaStringToUTF16(const JavaRef<jstring>& str);
-BASE_EXPORT string16 ConvertJavaStringToUTF16(JNIEnv* env,
-                                              const JavaRef<jstring>& str);
-
-// Convert a string16 to a Java string.
-BASE_EXPORT ScopedJavaLocalRef<jstring> ConvertUTF16ToJavaString(
-    JNIEnv* env,
-    const base::StringPiece16& str);
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_JNI_STRING_H_
diff --git a/base/android/jni_string_unittest.cc b/base/android/jni_string_unittest.cc
deleted file mode 100644
index 3da8b87..0000000
--- a/base/android/jni_string_unittest.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2012 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/android/jni_string.h"
-
-#include "base/android/jni_android.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace android {
-
-TEST(JniString, BasicConversionsUTF8) {
-  const std::string kSimpleString = "SimpleTest8";
-  JNIEnv* env = AttachCurrentThread();
-  std::string result =
-      ConvertJavaStringToUTF8(ConvertUTF8ToJavaString(env, kSimpleString));
-  EXPECT_EQ(kSimpleString, result);
-}
-
-TEST(JniString, BasicConversionsUTF16) {
-  const string16 kSimpleString = UTF8ToUTF16("SimpleTest16");
-  JNIEnv* env = AttachCurrentThread();
-  string16 result =
-      ConvertJavaStringToUTF16(ConvertUTF16ToJavaString(env, kSimpleString));
-  EXPECT_EQ(kSimpleString, result);
-}
-
-TEST(JniString, EmptyConversionUTF8) {
-  const std::string kEmptyString = "";
-  JNIEnv* env = AttachCurrentThread();
-  std::string result =
-      ConvertJavaStringToUTF8(ConvertUTF8ToJavaString(env, kEmptyString));
-  EXPECT_EQ(kEmptyString, result);
-}
-
-TEST(JniString, EmptyConversionUTF16) {
-  const string16 kEmptyString = UTF8ToUTF16("");
-  JNIEnv* env = AttachCurrentThread();
-  string16 result =
-      ConvertJavaStringToUTF16(ConvertUTF16ToJavaString(env, kEmptyString));
-  EXPECT_EQ(kEmptyString, result);
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/scoped_java_ref.cc b/base/android/scoped_java_ref.cc
deleted file mode 100644
index 7d31a75..0000000
--- a/base/android/scoped_java_ref.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (c) 2012 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/android/scoped_java_ref.h"
-
-#include "base/android/jni_android.h"
-#include "base/logging.h"
-
-namespace base {
-namespace android {
-namespace {
-
-const int kDefaultLocalFrameCapacity = 16;
-
-}  // namespace
-
-ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env) : env_(env) {
-  int failed = env_->PushLocalFrame(kDefaultLocalFrameCapacity);
-  DCHECK(!failed);
-}
-
-ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env, int capacity)
-    : env_(env) {
-  int failed = env_->PushLocalFrame(capacity);
-  DCHECK(!failed);
-}
-
-ScopedJavaLocalFrame::~ScopedJavaLocalFrame() {
-  env_->PopLocalFrame(nullptr);
-}
-
-#if DCHECK_IS_ON()
-// This constructor is inlined when DCHECKs are disabled; don't add anything
-// else here.
-JavaRef<jobject>::JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {
-  if (obj) {
-    DCHECK(env && env->GetObjectRefType(obj) == JNILocalRefType);
-  }
-}
-#endif
-
-JNIEnv* JavaRef<jobject>::SetNewLocalRef(JNIEnv* env, jobject obj) {
-  if (!env) {
-    env = AttachCurrentThread();
-  } else {
-    DCHECK_EQ(env, AttachCurrentThread());  // Is |env| on correct thread.
-  }
-  if (obj)
-    obj = env->NewLocalRef(obj);
-  if (obj_)
-    env->DeleteLocalRef(obj_);
-  obj_ = obj;
-  return env;
-}
-
-void JavaRef<jobject>::SetNewGlobalRef(JNIEnv* env, jobject obj) {
-  if (!env) {
-    env = AttachCurrentThread();
-  } else {
-    DCHECK_EQ(env, AttachCurrentThread());  // Is |env| on correct thread.
-  }
-  if (obj)
-    obj = env->NewGlobalRef(obj);
-  if (obj_)
-    env->DeleteGlobalRef(obj_);
-  obj_ = obj;
-}
-
-void JavaRef<jobject>::ResetLocalRef(JNIEnv* env) {
-  if (obj_) {
-    DCHECK_EQ(env, AttachCurrentThread());  // Is |env| on correct thread.
-    env->DeleteLocalRef(obj_);
-    obj_ = nullptr;
-  }
-}
-
-void JavaRef<jobject>::ResetGlobalRef() {
-  if (obj_) {
-    AttachCurrentThread()->DeleteGlobalRef(obj_);
-    obj_ = nullptr;
-  }
-}
-
-jobject JavaRef<jobject>::ReleaseInternal() {
-  jobject obj = obj_;
-  obj_ = nullptr;
-  return obj;
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/scoped_java_ref.h b/base/android/scoped_java_ref.h
deleted file mode 100644
index 6d728e9..0000000
--- a/base/android/scoped_java_ref.h
+++ /dev/null
@@ -1,301 +0,0 @@
-// Copyright (c) 2012 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_SCOPED_JAVA_REF_H_
-#define BASE_ANDROID_SCOPED_JAVA_REF_H_
-
-#include <jni.h>
-#include <stddef.h>
-
-#include <type_traits>
-#include <utility>
-
-#include "base/base_export.h"
-#include "base/logging.h"
-#include "base/macros.h"
-
-namespace base {
-namespace android {
-
-// Creates a new local reference frame, in which at least a given number of
-// local references can be created. Note that local references already created
-// in previous local frames are still valid in the current local frame.
-class BASE_EXPORT ScopedJavaLocalFrame {
- public:
-  explicit ScopedJavaLocalFrame(JNIEnv* env);
-  ScopedJavaLocalFrame(JNIEnv* env, int capacity);
-  ~ScopedJavaLocalFrame();
-
- private:
-  // This class is only good for use on the thread it was created on so
-  // it's safe to cache the non-threadsafe JNIEnv* inside this object.
-  JNIEnv* env_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedJavaLocalFrame);
-};
-
-// Forward declare the generic java reference template class.
-template<typename T> class JavaRef;
-
-// Template specialization of JavaRef, which acts as the base class for all
-// other JavaRef<> template types. This allows you to e.g. pass
-// ScopedJavaLocalRef<jstring> into a function taking const JavaRef<jobject>&
-template<>
-class BASE_EXPORT JavaRef<jobject> {
- public:
-  // Initializes a null reference. Don't add anything else here; it's inlined.
-  JavaRef() : obj_(nullptr) {}
-
-  // Allow nullptr to be converted to JavaRef. This avoids having to declare an
-  // empty JavaRef just to pass null to a function, and makes C++ "nullptr" and
-  // Java "null" equivalent.
-  JavaRef(std::nullptr_t) : JavaRef() {}
-
-  // Public to allow destruction of null JavaRef objects.
-  // Don't add anything else here; it's inlined.
-  ~JavaRef() {}
-
-  jobject obj() const { return obj_; }
-
-  bool is_null() const { return obj_ == nullptr; }
-
- protected:
-  // Takes ownership of the |obj| reference passed; requires it to be a local
-  // reference type.
-#if DCHECK_IS_ON()
-  // Implementation contains a DCHECK; implement out-of-line when DCHECK_IS_ON.
-  JavaRef(JNIEnv* env, jobject obj);
-#else
-  // Don't add anything else here; it's inlined.
-  JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {}
-#endif
-
-  void swap(JavaRef& other) { std::swap(obj_, other.obj_); }
-
-  // The following are implementation detail convenience methods, for
-  // use by the sub-classes.
-  JNIEnv* SetNewLocalRef(JNIEnv* env, jobject obj);
-  void SetNewGlobalRef(JNIEnv* env, jobject obj);
-  void ResetLocalRef(JNIEnv* env);
-  void ResetGlobalRef();
-  jobject ReleaseInternal();
-
- private:
-  jobject obj_;
-
-  DISALLOW_COPY_AND_ASSIGN(JavaRef);
-};
-
-// Generic base class for ScopedJavaLocalRef and ScopedJavaGlobalRef. Useful
-// for allowing functions to accept a reference without having to mandate
-// whether it is a local or global type.
-template<typename T>
-class JavaRef : public JavaRef<jobject> {
- public:
-  JavaRef() {}
-  JavaRef(std::nullptr_t) : JavaRef<jobject>(nullptr) {}
-  ~JavaRef() {}
-
-  T obj() const { return static_cast<T>(JavaRef<jobject>::obj()); }
-
- protected:
-  JavaRef(JNIEnv* env, T obj) : JavaRef<jobject>(env, obj) {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(JavaRef);
-};
-
-// Holds a local reference to a JNI method parameter.
-// Method parameters should not be deleted, and so this class exists purely to
-// wrap them as a JavaRef<T> in the JNI binding generator. Do not create
-// instances manually.
-template<typename T>
-class JavaParamRef : public JavaRef<T> {
- public:
-  // Assumes that |obj| is a parameter passed to a JNI method from Java.
-  // Does not assume ownership as parameters should not be deleted.
-  JavaParamRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj) {}
-
-  // Allow nullptr to be converted to JavaParamRef. Some unit tests call JNI
-  // methods directly from C++ and pass null for objects which are not actually
-  // used by the implementation (e.g. the caller object); allow this to keep
-  // working.
-  JavaParamRef(std::nullptr_t) : JavaRef<T>(nullptr) {}
-
-  ~JavaParamRef() {}
-
-  // TODO(torne): remove this cast once we're using JavaRef consistently.
-  // http://crbug.com/506850
-  operator T() const { return JavaRef<T>::obj(); }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(JavaParamRef);
-};
-
-// Holds a local reference to a Java object. The local reference is scoped
-// to the lifetime of this object.
-// Instances of this class may hold onto any JNIEnv passed into it until
-// destroyed. Therefore, since a JNIEnv is only suitable for use on a single
-// thread, objects of this class must be created, used, and destroyed, on a
-// single thread.
-// Therefore, this class should only be used as a stack-based object and from a
-// single thread. If you wish to have the reference outlive the current
-// callstack (e.g. as a class member) or you wish to pass it across threads,
-// use a ScopedJavaGlobalRef instead.
-template<typename T>
-class ScopedJavaLocalRef : public JavaRef<T> {
- public:
-  ScopedJavaLocalRef() : env_(nullptr) {}
-  ScopedJavaLocalRef(std::nullptr_t) : env_(nullptr) {}
-
-  // Non-explicit copy constructor, to allow ScopedJavaLocalRef to be returned
-  // by value as this is the normal usage pattern.
-  ScopedJavaLocalRef(const ScopedJavaLocalRef<T>& other)
-      : env_(other.env_) {
-    this->SetNewLocalRef(env_, other.obj());
-  }
-
-  ScopedJavaLocalRef(ScopedJavaLocalRef<T>&& other) : env_(other.env_) {
-    this->swap(other);
-  }
-
-  explicit ScopedJavaLocalRef(const JavaRef<T>& other) : env_(nullptr) {
-    this->Reset(other);
-  }
-
-  // Assumes that |obj| is a local reference to a Java object and takes
-  // ownership  of this local reference.
-  // TODO(torne): this shouldn't be used outside of JNI helper functions but
-  // there are currently some cases where there aren't helpers for things.
-  ScopedJavaLocalRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj), env_(env) {}
-
-  ~ScopedJavaLocalRef() {
-    this->Reset();
-  }
-
-  // Overloaded assignment operator defined for consistency with the implicit
-  // copy constructor.
-  void operator=(const ScopedJavaLocalRef<T>& other) {
-    this->Reset(other);
-  }
-
-  void operator=(ScopedJavaLocalRef<T>&& other) {
-    env_ = other.env_;
-    this->swap(other);
-  }
-
-  void Reset() {
-    this->ResetLocalRef(env_);
-  }
-
-  void Reset(const ScopedJavaLocalRef<T>& other) {
-    // We can copy over env_ here as |other| instance must be from the same
-    // thread as |this| local ref. (See class comment for multi-threading
-    // limitations, and alternatives).
-    this->Reset(other.env_, other.obj());
-  }
-
-  void Reset(const JavaRef<T>& other) {
-    // If |env_| was not yet set (is still null) it will be attached to the
-    // current thread in SetNewLocalRef().
-    this->Reset(env_, other.obj());
-  }
-
-  // Creates a new local reference to the Java object, unlike the constructor
-  // with the same parameters that takes ownership of the existing reference.
-  // TODO(torne): these should match as this is confusing.
-  void Reset(JNIEnv* env, T obj) { env_ = this->SetNewLocalRef(env, obj); }
-
-  // Releases the local reference to the caller. The caller *must* delete the
-  // local reference when it is done with it. Note that calling a Java method
-  // is *not* a transfer of ownership and Release() should not be used.
-  T Release() {
-    return static_cast<T>(this->ReleaseInternal());
-  }
-
- private:
-  // This class is only good for use on the thread it was created on so
-  // it's safe to cache the non-threadsafe JNIEnv* inside this object.
-  JNIEnv* env_;
-
-  // Prevent ScopedJavaLocalRef(JNIEnv*, T obj) from being used to take
-  // ownership of a JavaParamRef's underlying object - parameters are not
-  // allowed to be deleted and so should not be owned by ScopedJavaLocalRef.
-  // TODO(torne): this can be removed once JavaParamRef no longer has an
-  // implicit conversion back to T.
-  ScopedJavaLocalRef(JNIEnv* env, const JavaParamRef<T>& other);
-};
-
-// Holds a global reference to a Java object. The global reference is scoped
-// to the lifetime of this object. This class does not hold onto any JNIEnv*
-// passed to it, hence it is safe to use across threads (within the constraints
-// imposed by the underlying Java object that it references).
-template<typename T>
-class ScopedJavaGlobalRef : public JavaRef<T> {
- public:
-  ScopedJavaGlobalRef() {}
-  ScopedJavaGlobalRef(std::nullptr_t) {}
-
-  ScopedJavaGlobalRef(const ScopedJavaGlobalRef<T>& other) {
-    this->Reset(other);
-  }
-
-  ScopedJavaGlobalRef(ScopedJavaGlobalRef<T>&& other) { this->swap(other); }
-
-  ScopedJavaGlobalRef(JNIEnv* env, T obj) { this->Reset(env, obj); }
-
-  explicit ScopedJavaGlobalRef(const JavaRef<T>& other) { this->Reset(other); }
-
-  ~ScopedJavaGlobalRef() {
-    this->Reset();
-  }
-
-  // Overloaded assignment operator defined for consistency with the implicit
-  // copy constructor.
-  void operator=(const ScopedJavaGlobalRef<T>& other) {
-    this->Reset(other);
-  }
-
-  void operator=(ScopedJavaGlobalRef<T>&& other) { this->swap(other); }
-
-  void Reset() {
-    this->ResetGlobalRef();
-  }
-
-  void Reset(const JavaRef<T>& other) { this->Reset(nullptr, other.obj()); }
-
-  void Reset(JNIEnv* env, const JavaParamRef<T>& other) {
-    this->Reset(env, other.obj());
-  }
-
-  void Reset(JNIEnv* env, T obj) { this->SetNewGlobalRef(env, obj); }
-
-  // Releases the global reference to the caller. The caller *must* delete the
-  // global reference when it is done with it. Note that calling a Java method
-  // is *not* a transfer of ownership and Release() should not be used.
-  T Release() {
-    return static_cast<T>(this->ReleaseInternal());
-  }
-};
-
-// Temporary type for parameters to Java functions, to allow incremental
-// migration from bare jobject to JavaRef. Don't use outside JNI generator.
-template <typename T>
-class JavaRefOrBare {
- public:
-  JavaRefOrBare(std::nullptr_t) : obj_(nullptr) {}
-  JavaRefOrBare(const JavaRef<T>& ref) : obj_(ref.obj()) {}
-  JavaRefOrBare(T obj) : obj_(obj) {}
-  T obj() const { return obj_; }
-
- private:
-  T obj_;
-
-  DISALLOW_COPY_AND_ASSIGN(JavaRefOrBare);
-};
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_SCOPED_JAVA_REF_H_
diff --git a/base/android/scoped_java_ref_unittest.cc b/base/android/scoped_java_ref_unittest.cc
deleted file mode 100644
index 99d035b..0000000
--- a/base/android/scoped_java_ref_unittest.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright (c) 2012 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/android/scoped_java_ref.h"
-
-#include "base/android/jni_android.h"
-#include "base/android/jni_string.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace android {
-
-namespace {
-int g_local_refs = 0;
-int g_global_refs = 0;
-
-const JNINativeInterface* g_previous_functions;
-
-jobject NewGlobalRef(JNIEnv* env, jobject obj) {
-  ++g_global_refs;
-  return g_previous_functions->NewGlobalRef(env, obj);
-}
-
-void DeleteGlobalRef(JNIEnv* env, jobject obj) {
-  --g_global_refs;
-  return g_previous_functions->DeleteGlobalRef(env, obj);
-}
-
-jobject NewLocalRef(JNIEnv* env, jobject obj) {
-  ++g_local_refs;
-  return g_previous_functions->NewLocalRef(env, obj);
-}
-
-void DeleteLocalRef(JNIEnv* env, jobject obj) {
-  --g_local_refs;
-  return g_previous_functions->DeleteLocalRef(env, obj);
-}
-}  // namespace
-
-class ScopedJavaRefTest : public testing::Test {
- protected:
-  void SetUp() override {
-    g_local_refs = 0;
-    g_global_refs = 0;
-    JNIEnv* env = AttachCurrentThread();
-    g_previous_functions = env->functions;
-    hooked_functions = *g_previous_functions;
-    env->functions = &hooked_functions;
-    // We inject our own functions in JNINativeInterface so we can keep track
-    // of the reference counting ourselves.
-    hooked_functions.NewGlobalRef = &NewGlobalRef;
-    hooked_functions.DeleteGlobalRef = &DeleteGlobalRef;
-    hooked_functions.NewLocalRef = &NewLocalRef;
-    hooked_functions.DeleteLocalRef = &DeleteLocalRef;
-  }
-
-  void TearDown() override {
-    JNIEnv* env = AttachCurrentThread();
-    env->functions = g_previous_functions;
-  }
-  // From JellyBean release, the instance of this struct provided in JNIEnv is
-  // read-only, so we deep copy it to allow individual functions to be hooked.
-  JNINativeInterface hooked_functions;
-};
-
-// The main purpose of this is testing the various conversions compile.
-TEST_F(ScopedJavaRefTest, Conversions) {
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jstring> str = ConvertUTF8ToJavaString(env, "string");
-  ScopedJavaGlobalRef<jstring> global(str);
-  {
-    ScopedJavaGlobalRef<jobject> global_obj(str);
-    ScopedJavaLocalRef<jobject> local_obj(global);
-    const JavaRef<jobject>& obj_ref1(str);
-    const JavaRef<jobject>& obj_ref2(global);
-    EXPECT_TRUE(env->IsSameObject(obj_ref1.obj(), obj_ref2.obj()));
-    EXPECT_TRUE(env->IsSameObject(global_obj.obj(), obj_ref2.obj()));
-  }
-  global.Reset(str);
-  const JavaRef<jstring>& str_ref = str;
-  EXPECT_EQ("string", ConvertJavaStringToUTF8(str_ref));
-  str.Reset();
-}
-
-TEST_F(ScopedJavaRefTest, RefCounts) {
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jstring> str;
-  // The ConvertJavaStringToUTF8 below creates a new string that would normally
-  // return a local ref. We simulate that by starting the g_local_refs count at
-  // 1.
-  g_local_refs = 1;
-  str.Reset(ConvertUTF8ToJavaString(env, "string"));
-  EXPECT_EQ(1, g_local_refs);
-  EXPECT_EQ(0, g_global_refs);
-  {
-    ScopedJavaGlobalRef<jstring> global_str(str);
-    ScopedJavaGlobalRef<jobject> global_obj(global_str);
-    EXPECT_EQ(1, g_local_refs);
-    EXPECT_EQ(2, g_global_refs);
-
-    ScopedJavaLocalRef<jstring> str2(env, str.Release());
-    EXPECT_EQ(1, g_local_refs);
-    {
-      ScopedJavaLocalRef<jstring> str3(str2);
-      EXPECT_EQ(2, g_local_refs);
-    }
-    EXPECT_EQ(1, g_local_refs);
-    {
-      ScopedJavaLocalRef<jstring> str4((ScopedJavaLocalRef<jstring>(str2)));
-      EXPECT_EQ(2, g_local_refs);
-    }
-    EXPECT_EQ(1, g_local_refs);
-    {
-      ScopedJavaLocalRef<jstring> str5;
-      str5 = ScopedJavaLocalRef<jstring>(str2);
-      EXPECT_EQ(2, g_local_refs);
-    }
-    EXPECT_EQ(1, g_local_refs);
-    str2.Reset();
-    EXPECT_EQ(0, g_local_refs);
-    global_str.Reset();
-    EXPECT_EQ(1, g_global_refs);
-    ScopedJavaGlobalRef<jobject> global_obj2(global_obj);
-    EXPECT_EQ(2, g_global_refs);
-  }
-
-  EXPECT_EQ(0, g_local_refs);
-  EXPECT_EQ(0, g_global_refs);
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/build/android/gyp/util/__init__.py b/build/android/gyp/util/__init__.py
deleted file mode 100644
index 727e987..0000000
--- a/build/android/gyp/util/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-# Copyright (c) 2012 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.
-
diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py
deleted file mode 100644
index abd2dfc..0000000
--- a/build/android/gyp/util/build_utils.py
+++ /dev/null
@@ -1,589 +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.
-
-import ast
-import contextlib
-import fnmatch
-import json
-import os
-import pipes
-import re
-import shlex
-import shutil
-import stat
-import subprocess
-import sys
-import tempfile
-import zipfile
-
-# Some clients do not add //build/android/gyp to PYTHONPATH.
-import md5_check  # pylint: disable=relative-import
-
-# pylib conflicts with mojo/public/tools/bindings/pylib. Prioritize
-# build/android/pylib.
-# PYTHONPATH wouldn't help in this case, because soong put source files under
-# temp directory for each build, so the abspath is unknown until the
-# execution.
-# sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir))
-sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir, os.pardir))
-from pylib.constants import host_paths
-
-sys.path.append(os.path.join(os.path.dirname(__file__),
-                             os.pardir, os.pardir, os.pardir))
-import gn_helpers
-
-COLORAMA_ROOT = os.path.join(host_paths.DIR_SOURCE_ROOT,
-                             'third_party', 'colorama', 'src')
-# aapt should ignore OWNERS files in addition the default ignore pattern.
-AAPT_IGNORE_PATTERN = ('!OWNERS:!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:' +
-                       '!CVS:!thumbs.db:!picasa.ini:!*~:!*.d.stamp')
-HERMETIC_TIMESTAMP = (2001, 1, 1, 0, 0, 0)
-_HERMETIC_FILE_ATTR = (0644 << 16L)
-
-
-@contextlib.contextmanager
-def TempDir():
-  dirname = tempfile.mkdtemp()
-  try:
-    yield dirname
-  finally:
-    shutil.rmtree(dirname)
-
-
-def MakeDirectory(dir_path):
-  try:
-    os.makedirs(dir_path)
-  except OSError:
-    pass
-
-
-def DeleteDirectory(dir_path):
-  if os.path.exists(dir_path):
-    shutil.rmtree(dir_path)
-
-
-def Touch(path, fail_if_missing=False):
-  if fail_if_missing and not os.path.exists(path):
-    raise Exception(path + ' doesn\'t exist.')
-
-  MakeDirectory(os.path.dirname(path))
-  with open(path, 'a'):
-    os.utime(path, None)
-
-
-def FindInDirectory(directory, filename_filter):
-  files = []
-  for root, _dirnames, filenames in os.walk(directory):
-    matched_files = fnmatch.filter(filenames, filename_filter)
-    files.extend((os.path.join(root, f) for f in matched_files))
-  return files
-
-
-def FindInDirectories(directories, filename_filter):
-  all_files = []
-  for directory in directories:
-    all_files.extend(FindInDirectory(directory, filename_filter))
-  return all_files
-
-
-def ParseGnList(gn_string):
-  """Converts a command-line parameter into a list.
-
-  If the input starts with a '[' it is assumed to be a GN-formatted list and
-  it will be parsed accordingly. When empty an empty list will be returned.
-  Otherwise, the parameter will be treated as a single raw string (not
-  GN-formatted in that it's not assumed to have literal quotes that must be
-  removed) and a list will be returned containing that string.
-
-  The common use for this behavior is in the Android build where things can
-  take lists of @FileArg references that are expanded via ExpandFileArgs.
-  """
-  if gn_string.startswith('['):
-    parser = gn_helpers.GNValueParser(gn_string)
-    return parser.ParseList()
-  if len(gn_string):
-    return [ gn_string ]
-  return []
-
-
-def CheckOptions(options, parser, required=None):
-  if not required:
-    return
-  for option_name in required:
-    if getattr(options, option_name) is None:
-      parser.error('--%s is required' % option_name.replace('_', '-'))
-
-
-def WriteJson(obj, path, only_if_changed=False):
-  old_dump = None
-  if os.path.exists(path):
-    with open(path, 'r') as oldfile:
-      old_dump = oldfile.read()
-
-  new_dump = json.dumps(obj, sort_keys=True, indent=2, separators=(',', ': '))
-
-  if not only_if_changed or old_dump != new_dump:
-    with open(path, 'w') as outfile:
-      outfile.write(new_dump)
-
-
-def ReadJson(path):
-  with open(path, 'r') as jsonfile:
-    return json.load(jsonfile)
-
-
-class CalledProcessError(Exception):
-  """This exception is raised when the process run by CheckOutput
-  exits with a non-zero exit code."""
-
-  def __init__(self, cwd, args, output):
-    super(CalledProcessError, self).__init__()
-    self.cwd = cwd
-    self.args = args
-    self.output = output
-
-  def __str__(self):
-    # A user should be able to simply copy and paste the command that failed
-    # into their shell.
-    copyable_command = '( cd {}; {} )'.format(os.path.abspath(self.cwd),
-        ' '.join(map(pipes.quote, self.args)))
-    return 'Command failed: {}\n{}'.format(copyable_command, self.output)
-
-
-# This can be used in most cases like subprocess.check_output(). The output,
-# particularly when the command fails, better highlights the command's failure.
-# If the command fails, raises a build_utils.CalledProcessError.
-def CheckOutput(args, cwd=None, env=None,
-                print_stdout=False, print_stderr=True,
-                stdout_filter=None,
-                stderr_filter=None,
-                fail_func=lambda returncode, stderr: returncode != 0):
-  if not cwd:
-    cwd = os.getcwd()
-
-  child = subprocess.Popen(args,
-      stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd, env=env)
-  stdout, stderr = child.communicate()
-
-  if stdout_filter is not None:
-    stdout = stdout_filter(stdout)
-
-  if stderr_filter is not None:
-    stderr = stderr_filter(stderr)
-
-  if fail_func(child.returncode, stderr):
-    raise CalledProcessError(cwd, args, stdout + stderr)
-
-  if print_stdout:
-    sys.stdout.write(stdout)
-  if print_stderr:
-    sys.stderr.write(stderr)
-
-  return stdout
-
-
-def GetModifiedTime(path):
-  # For a symlink, the modified time should be the greater of the link's
-  # modified time and the modified time of the target.
-  return max(os.lstat(path).st_mtime, os.stat(path).st_mtime)
-
-
-def IsTimeStale(output, inputs):
-  if not os.path.exists(output):
-    return True
-
-  output_time = GetModifiedTime(output)
-  for i in inputs:
-    if GetModifiedTime(i) > output_time:
-      return True
-  return False
-
-
-def IsDeviceReady():
-  device_state = CheckOutput(['adb', 'get-state'])
-  return device_state.strip() == 'device'
-
-
-def CheckZipPath(name):
-  if os.path.normpath(name) != name:
-    raise Exception('Non-canonical zip path: %s' % name)
-  if os.path.isabs(name):
-    raise Exception('Absolute zip path: %s' % name)
-
-
-def IsSymlink(zip_file, name):
-  zi = zip_file.getinfo(name)
-
-  # The two high-order bytes of ZipInfo.external_attr represent
-  # UNIX permissions and file type bits.
-  return stat.S_ISLNK(zi.external_attr >> 16L)
-
-
-def ExtractAll(zip_path, path=None, no_clobber=True, pattern=None,
-               predicate=None):
-  if path is None:
-    path = os.getcwd()
-  elif not os.path.exists(path):
-    MakeDirectory(path)
-
-  if not zipfile.is_zipfile(zip_path):
-    raise Exception('Invalid zip file: %s' % zip_path)
-
-  extracted = []
-  with zipfile.ZipFile(zip_path) as z:
-    for name in z.namelist():
-      if name.endswith('/'):
-        continue
-      if pattern is not None:
-        if not fnmatch.fnmatch(name, pattern):
-          continue
-      if predicate and not predicate(name):
-        continue
-      CheckZipPath(name)
-      if no_clobber:
-        output_path = os.path.join(path, name)
-        if os.path.exists(output_path):
-          raise Exception(
-              'Path already exists from zip: %s %s %s'
-              % (zip_path, name, output_path))
-      if IsSymlink(z, name):
-        dest = os.path.join(path, name)
-        MakeDirectory(os.path.dirname(dest))
-        os.symlink(z.read(name), dest)
-        extracted.append(dest)
-      else:
-        z.extract(name, path)
-        extracted.append(os.path.join(path, name))
-
-  return extracted
-
-
-def AddToZipHermetic(zip_file, zip_path, src_path=None, data=None,
-                     compress=None):
-  """Adds a file to the given ZipFile with a hard-coded modified time.
-
-  Args:
-    zip_file: ZipFile instance to add the file to.
-    zip_path: Destination path within the zip file.
-    src_path: Path of the source file. Mutually exclusive with |data|.
-    data: File data as a string.
-    compress: Whether to enable compression. Default is take from ZipFile
-        constructor.
-  """
-  assert (src_path is None) != (data is None), (
-      '|src_path| and |data| are mutually exclusive.')
-  CheckZipPath(zip_path)
-  zipinfo = zipfile.ZipInfo(filename=zip_path, date_time=HERMETIC_TIMESTAMP)
-  zipinfo.external_attr = _HERMETIC_FILE_ATTR
-
-  if src_path and os.path.islink(src_path):
-    zipinfo.filename = zip_path
-    zipinfo.external_attr |= stat.S_IFLNK << 16L # mark as a symlink
-    zip_file.writestr(zipinfo, os.readlink(src_path))
-    return
-
-  if src_path:
-    with file(src_path) as f:
-      data = f.read()
-
-  # zipfile will deflate even when it makes the file bigger. To avoid
-  # growing files, disable compression at an arbitrary cut off point.
-  if len(data) < 16:
-    compress = False
-
-  # None converts to ZIP_STORED, when passed explicitly rather than the
-  # default passed to the ZipFile constructor.
-  compress_type = zip_file.compression
-  if compress is not None:
-    compress_type = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED
-  zip_file.writestr(zipinfo, data, compress_type)
-
-
-def DoZip(inputs, output, base_dir=None):
-  """Creates a zip file from a list of files.
-
-  Args:
-    inputs: A list of paths to zip, or a list of (zip_path, fs_path) tuples.
-    output: Destination .zip file.
-    base_dir: Prefix to strip from inputs.
-  """
-  input_tuples = []
-  for tup in inputs:
-    if isinstance(tup, basestring):
-      tup = (os.path.relpath(tup, base_dir), tup)
-    input_tuples.append(tup)
-
-  # Sort by zip path to ensure stable zip ordering.
-  input_tuples.sort(key=lambda tup: tup[0])
-  with zipfile.ZipFile(output, 'w') as outfile:
-    for zip_path, fs_path in input_tuples:
-      AddToZipHermetic(outfile, zip_path, src_path=fs_path)
-
-
-def ZipDir(output, base_dir):
-  """Creates a zip file from a directory."""
-  inputs = []
-  for root, _, files in os.walk(base_dir):
-    for f in files:
-      inputs.append(os.path.join(root, f))
-  DoZip(inputs, output, base_dir)
-
-
-def MatchesGlob(path, filters):
-  """Returns whether the given path matches any of the given glob patterns."""
-  return filters and any(fnmatch.fnmatch(path, f) for f in filters)
-
-
-def MergeZips(output, inputs, exclude_patterns=None, path_transform=None):
-  path_transform = path_transform or (lambda p, z: p)
-  added_names = set()
-
-  output_is_already_open = not isinstance(output, basestring)
-  if output_is_already_open:
-    assert isinstance(output, zipfile.ZipFile)
-    out_zip = output
-  else:
-    out_zip = zipfile.ZipFile(output, 'w')
-
-  try:
-    for in_file in inputs:
-      with zipfile.ZipFile(in_file, 'r') as in_zip:
-        in_zip._expected_crc = None
-        for info in in_zip.infolist():
-          # Ignore directories.
-          if info.filename[-1] == '/':
-            continue
-          dst_name = path_transform(info.filename, in_file)
-          already_added = dst_name in added_names
-          if not already_added and not MatchesGlob(dst_name, exclude_patterns):
-            AddToZipHermetic(out_zip, dst_name, data=in_zip.read(info),
-                             compress=info.compress_type != zipfile.ZIP_STORED)
-            added_names.add(dst_name)
-  finally:
-    if not output_is_already_open:
-      out_zip.close()
-
-
-def PrintWarning(message):
-  print 'WARNING: ' + message
-
-
-def PrintBigWarning(message):
-  print '*****     ' * 8
-  PrintWarning(message)
-  print '*****     ' * 8
-
-
-def GetSortedTransitiveDependencies(top, deps_func):
-  """Gets the list of all transitive dependencies in sorted order.
-
-  There should be no cycles in the dependency graph.
-
-  Args:
-    top: a list of the top level nodes
-    deps_func: A function that takes a node and returns its direct dependencies.
-  Returns:
-    A list of all transitive dependencies of nodes in top, in order (a node will
-    appear in the list at a higher index than all of its dependencies).
-  """
-  def Node(dep):
-    return (dep, deps_func(dep))
-
-  # First: find all deps
-  unchecked_deps = list(top)
-  all_deps = set(top)
-  while unchecked_deps:
-    dep = unchecked_deps.pop()
-    new_deps = deps_func(dep).difference(all_deps)
-    unchecked_deps.extend(new_deps)
-    all_deps = all_deps.union(new_deps)
-
-  # Then: simple, slow topological sort.
-  sorted_deps = []
-  unsorted_deps = dict(map(Node, all_deps))
-  while unsorted_deps:
-    for library, dependencies in unsorted_deps.items():
-      if not dependencies.intersection(unsorted_deps.keys()):
-        sorted_deps.append(library)
-        del unsorted_deps[library]
-
-  return sorted_deps
-
-
-def GetPythonDependencies():
-  """Gets the paths of imported non-system python modules.
-
-  A path is assumed to be a "system" import if it is outside of chromium's
-  src/. The paths will be relative to the current directory.
-  """
-  module_paths = GetModulePaths()
-
-  abs_module_paths = map(os.path.abspath, module_paths)
-
-  assert os.path.isabs(host_paths.DIR_SOURCE_ROOT)
-  non_system_module_paths = [
-      p for p in abs_module_paths if p.startswith(host_paths.DIR_SOURCE_ROOT)]
-  def ConvertPycToPy(s):
-    if s.endswith('.pyc'):
-      return s[:-1]
-    return s
-
-  non_system_module_paths = map(ConvertPycToPy, non_system_module_paths)
-  non_system_module_paths = map(os.path.relpath, non_system_module_paths)
-  return sorted(set(non_system_module_paths))
-
-
-def GetModulePaths():
-  """Returns the paths to all of the modules in sys.modules."""
-  ForceLazyModulesToLoad()
-  return (m.__file__ for m in sys.modules.itervalues()
-          if m is not None and hasattr(m, '__file__'))
-
-
-def ForceLazyModulesToLoad():
-  """Forces any lazily imported modules to fully load themselves.
-
-  Inspecting the modules' __file__ attribute causes lazily imported modules
-  (e.g. from email) to get fully imported and update sys.modules. Iterate
-  over the values until sys.modules stabilizes so that no modules are missed.
-  """
-  while True:
-    num_modules_before = len(sys.modules.keys())
-    for m in sys.modules.values():
-      if m is not None and hasattr(m, '__file__'):
-        _ = m.__file__
-    num_modules_after = len(sys.modules.keys())
-    if num_modules_before == num_modules_after:
-      break
-
-
-def AddDepfileOption(parser):
-  # TODO(agrieve): Get rid of this once we've moved to argparse.
-  if hasattr(parser, 'add_option'):
-    func = parser.add_option
-  else:
-    func = parser.add_argument
-  func('--depfile',
-       help='Path to depfile (refer to `gn help depfile`)')
-
-
-def WriteDepfile(depfile_path, first_gn_output, inputs=None, add_pydeps=True):
-  assert depfile_path != first_gn_output  # http://crbug.com/646165
-  inputs = inputs or []
-  if add_pydeps:
-    inputs = GetPythonDependencies() + inputs
-  MakeDirectory(os.path.dirname(depfile_path))
-  # Ninja does not support multiple outputs in depfiles.
-  with open(depfile_path, 'w') as depfile:
-    depfile.write(first_gn_output.replace(' ', '\\ '))
-    depfile.write(': ')
-    depfile.write(' '.join(i.replace(' ', '\\ ') for i in inputs))
-    depfile.write('\n')
-
-
-def ExpandFileArgs(args):
-  """Replaces file-arg placeholders in args.
-
-  These placeholders have the form:
-    @FileArg(filename:key1:key2:...:keyn)
-
-  The value of such a placeholder is calculated by reading 'filename' as json.
-  And then extracting the value at [key1][key2]...[keyn].
-
-  Note: This intentionally does not return the list of files that appear in such
-  placeholders. An action that uses file-args *must* know the paths of those
-  files prior to the parsing of the arguments (typically by explicitly listing
-  them in the action's inputs in build files).
-  """
-  new_args = list(args)
-  file_jsons = dict()
-  r = re.compile('@FileArg\((.*?)\)')
-  for i, arg in enumerate(args):
-    match = r.search(arg)
-    if not match:
-      continue
-
-    if match.end() != len(arg):
-      raise Exception('Unexpected characters after FileArg: ' + arg)
-
-    lookup_path = match.group(1).split(':')
-    file_path = lookup_path[0]
-    if not file_path in file_jsons:
-      file_jsons[file_path] = ReadJson(file_path)
-
-    expansion = file_jsons[file_path]
-    for k in lookup_path[1:]:
-      expansion = expansion[k]
-
-    # This should match ParseGNList. The output is either a GN-formatted list
-    # or a literal (with no quotes).
-    if isinstance(expansion, list):
-      new_args[i] = arg[:match.start()] + gn_helpers.ToGNString(expansion)
-    else:
-      new_args[i] = arg[:match.start()] + str(expansion)
-
-  return new_args
-
-
-def ReadSourcesList(sources_list_file_name):
-  """Reads a GN-written file containing list of file names and returns a list.
-
-  Note that this function should not be used to parse response files.
-  """
-  with open(sources_list_file_name) as f:
-    return [file_name.strip() for file_name in f]
-
-
-def CallAndWriteDepfileIfStale(function, options, record_path=None,
-                               input_paths=None, input_strings=None,
-                               output_paths=None, force=False,
-                               pass_changes=False,
-                               depfile_deps=None):
-  """Wraps md5_check.CallAndRecordIfStale() and also writes dep & stamp files.
-
-  Depfiles and stamp files are automatically added to output_paths when present
-  in the |options| argument. They are then created after |function| is called.
-
-  By default, only python dependencies are added to the depfile. If there are
-  other input paths that are not captured by GN deps, then they should be listed
-  in depfile_deps. It's important to write paths to the depfile that are already
-  captured by GN deps since GN args can cause GN deps to change, and such
-  changes are not immediately reflected in depfiles (http://crbug.com/589311).
-  """
-  if not output_paths:
-    raise Exception('At least one output_path must be specified.')
-  input_paths = list(input_paths or [])
-  input_strings = list(input_strings or [])
-  output_paths = list(output_paths or [])
-
-  python_deps = None
-  if hasattr(options, 'depfile') and options.depfile:
-    python_deps = GetPythonDependencies()
-    input_paths += python_deps
-    output_paths += [options.depfile]
-
-  stamp_file = hasattr(options, 'stamp') and options.stamp
-  if stamp_file:
-    output_paths += [stamp_file]
-
-  def on_stale_md5(changes):
-    args = (changes,) if pass_changes else ()
-    function(*args)
-    if python_deps is not None:
-      all_depfile_deps = list(python_deps)
-      if depfile_deps:
-        all_depfile_deps.extend(depfile_deps)
-      WriteDepfile(options.depfile, output_paths[0], all_depfile_deps,
-                   add_pydeps=False)
-    if stamp_file:
-      Touch(stamp_file)
-
-  md5_check.CallAndRecordIfStale(
-      on_stale_md5,
-      record_path=record_path,
-      input_paths=input_paths,
-      input_strings=input_strings,
-      output_paths=output_paths,
-      force=force,
-      pass_changes=True)
diff --git a/build/android/gyp/util/md5_check.py b/build/android/gyp/util/md5_check.py
deleted file mode 100644
index 7659124..0000000
--- a/build/android/gyp/util/md5_check.py
+++ /dev/null
@@ -1,410 +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.
-
-import difflib
-import hashlib
-import itertools
-import json
-import os
-import sys
-import zipfile
-
-
-# When set and a difference is detected, a diff of what changed is printed.
-PRINT_EXPLANATIONS = int(os.environ.get('PRINT_BUILD_EXPLANATIONS', 0))
-
-# An escape hatch that causes all targets to be rebuilt.
-_FORCE_REBUILD = int(os.environ.get('FORCE_REBUILD', 0))
-
-
-def CallAndRecordIfStale(
-    function, record_path=None, input_paths=None, input_strings=None,
-    output_paths=None, force=False, pass_changes=False):
-  """Calls function if outputs are stale.
-
-  Outputs are considered stale if:
-  - any output_paths are missing, or
-  - the contents of any file within input_paths has changed, or
-  - the contents of input_strings has changed.
-
-  To debug which files are out-of-date, set the environment variable:
-      PRINT_MD5_DIFFS=1
-
-  Args:
-    function: The function to call.
-    record_path: Path to record metadata.
-      Defaults to output_paths[0] + '.md5.stamp'
-    input_paths: List of paths to calcualte an md5 sum on.
-    input_strings: List of strings to record verbatim.
-    output_paths: List of output paths.
-    force: Whether to treat outputs as missing regardless of whether they
-      actually are.
-    pass_changes: Whether to pass a Changes instance to |function|.
-  """
-  assert record_path or output_paths
-  input_paths = input_paths or []
-  input_strings = input_strings or []
-  output_paths = output_paths or []
-  record_path = record_path or output_paths[0] + '.md5.stamp'
-
-  assert record_path.endswith('.stamp'), (
-      'record paths must end in \'.stamp\' so that they are easy to find '
-      'and delete')
-
-  new_metadata = _Metadata()
-  new_metadata.AddStrings(input_strings)
-
-  for path in input_paths:
-    if _IsZipFile(path):
-      entries = _ExtractZipEntries(path)
-      new_metadata.AddZipFile(path, entries)
-    else:
-      new_metadata.AddFile(path, _Md5ForPath(path))
-
-  old_metadata = None
-  force = force or _FORCE_REBUILD
-  missing_outputs = [x for x in output_paths if force or not os.path.exists(x)]
-  # When outputs are missing, don't bother gathering change information.
-  if not missing_outputs and os.path.exists(record_path):
-    with open(record_path, 'r') as jsonfile:
-      try:
-        old_metadata = _Metadata.FromFile(jsonfile)
-      except:  # pylint: disable=bare-except
-        pass  # Not yet using new file format.
-
-  changes = Changes(old_metadata, new_metadata, force, missing_outputs)
-  if not changes.HasChanges():
-    return
-
-  if PRINT_EXPLANATIONS:
-    print '=' * 80
-    print 'Target is stale: %s' % record_path
-    print changes.DescribeDifference()
-    print '=' * 80
-
-  args = (changes,) if pass_changes else ()
-  function(*args)
-
-  with open(record_path, 'w') as f:
-    new_metadata.ToFile(f)
-
-
-class Changes(object):
-  """Provides and API for querying what changed between runs."""
-
-  def __init__(self, old_metadata, new_metadata, force, missing_outputs):
-    self.old_metadata = old_metadata
-    self.new_metadata = new_metadata
-    self.force = force
-    self.missing_outputs = missing_outputs
-
-  def _GetOldTag(self, path, subpath=None):
-    return self.old_metadata and self.old_metadata.GetTag(path, subpath)
-
-  def HasChanges(self):
-    """Returns whether any changes exist."""
-    return (self.force or
-            not self.old_metadata or
-            self.old_metadata.StringsMd5() != self.new_metadata.StringsMd5() or
-            self.old_metadata.FilesMd5() != self.new_metadata.FilesMd5())
-
-  def AddedOrModifiedOnly(self):
-    """Returns whether the only changes were from added or modified (sub)files.
-
-    No missing outputs, no removed paths/subpaths.
-    """
-    if (self.force or
-        not self.old_metadata or
-        self.old_metadata.StringsMd5() != self.new_metadata.StringsMd5()):
-      return False
-    if any(self.IterRemovedPaths()):
-      return False
-    for path in self.IterModifiedPaths():
-      if any(self.IterRemovedSubpaths(path)):
-        return False
-    return True
-
-  def IterAllPaths(self):
-    """Generator for paths."""
-    return self.new_metadata.IterPaths();
-
-  def IterAllSubpaths(self, path):
-    """Generator for subpaths."""
-    return self.new_metadata.IterSubpaths(path);
-
-  def IterAddedPaths(self):
-    """Generator for paths that were added."""
-    for path in self.new_metadata.IterPaths():
-      if self._GetOldTag(path) is None:
-        yield path
-
-  def IterAddedSubpaths(self, path):
-    """Generator for paths that were added within the given zip file."""
-    for subpath in self.new_metadata.IterSubpaths(path):
-      if self._GetOldTag(path, subpath) is None:
-        yield subpath
-
-  def IterRemovedPaths(self):
-    """Generator for paths that were removed."""
-    if self.old_metadata:
-      for path in self.old_metadata.IterPaths():
-        if self.new_metadata.GetTag(path) is None:
-          yield path
-
-  def IterRemovedSubpaths(self, path):
-    """Generator for paths that were removed within the given zip file."""
-    if self.old_metadata:
-      for subpath in self.old_metadata.IterSubpaths(path):
-        if self.new_metadata.GetTag(path, subpath) is None:
-          yield subpath
-
-  def IterModifiedPaths(self):
-    """Generator for paths whose contents have changed."""
-    for path in self.new_metadata.IterPaths():
-      old_tag = self._GetOldTag(path)
-      new_tag = self.new_metadata.GetTag(path)
-      if old_tag is not None and old_tag != new_tag:
-        yield path
-
-  def IterModifiedSubpaths(self, path):
-    """Generator for paths within a zip file whose contents have changed."""
-    for subpath in self.new_metadata.IterSubpaths(path):
-      old_tag = self._GetOldTag(path, subpath)
-      new_tag = self.new_metadata.GetTag(path, subpath)
-      if old_tag is not None and old_tag != new_tag:
-        yield subpath
-
-  def IterChangedPaths(self):
-    """Generator for all changed paths (added/removed/modified)."""
-    return itertools.chain(self.IterRemovedPaths(),
-                           self.IterModifiedPaths(),
-                           self.IterAddedPaths())
-
-  def IterChangedSubpaths(self, path):
-    """Generator for paths within a zip that were added/removed/modified."""
-    return itertools.chain(self.IterRemovedSubpaths(path),
-                           self.IterModifiedSubpaths(path),
-                           self.IterAddedSubpaths(path))
-
-  def DescribeDifference(self):
-    """Returns a human-readable description of what changed."""
-    if self.force:
-      return 'force=True'
-    elif self.missing_outputs:
-      return 'Outputs do not exist:\n  ' + '\n  '.join(self.missing_outputs)
-    elif self.old_metadata is None:
-      return 'Previous stamp file not found.'
-
-    if self.old_metadata.StringsMd5() != self.new_metadata.StringsMd5():
-      ndiff = difflib.ndiff(self.old_metadata.GetStrings(),
-                            self.new_metadata.GetStrings())
-      changed = [s for s in ndiff if not s.startswith(' ')]
-      return 'Input strings changed:\n  ' + '\n  '.join(changed)
-
-    if self.old_metadata.FilesMd5() == self.new_metadata.FilesMd5():
-      return "There's no difference."
-
-    lines = []
-    lines.extend('Added: ' + p for p in self.IterAddedPaths())
-    lines.extend('Removed: ' + p for p in self.IterRemovedPaths())
-    for path in self.IterModifiedPaths():
-      lines.append('Modified: ' + path)
-      lines.extend('  -> Subpath added: ' + p
-                   for p in self.IterAddedSubpaths(path))
-      lines.extend('  -> Subpath removed: ' + p
-                   for p in self.IterRemovedSubpaths(path))
-      lines.extend('  -> Subpath modified: ' + p
-                   for p in self.IterModifiedSubpaths(path))
-    if lines:
-      return 'Input files changed:\n  ' + '\n  '.join(lines)
-    return 'I have no idea what changed (there is a bug).'
-
-
-class _Metadata(object):
-  """Data model for tracking change metadata."""
-  # Schema:
-  # {
-  #   "files-md5": "VALUE",
-  #   "strings-md5": "VALUE",
-  #   "input-files": [
-  #     {
-  #       "path": "path.jar",
-  #       "tag": "{MD5 of entries}",
-  #       "entries": [
-  #         { "path": "org/chromium/base/Foo.class", "tag": "{CRC32}" }, ...
-  #       ]
-  #     }, {
-  #       "path": "path.txt",
-  #       "tag": "{MD5}",
-  #     }
-  #   ],
-  #   "input-strings": ["a", "b", ...],
-  # }
-  def __init__(self):
-    self._files_md5 = None
-    self._strings_md5 = None
-    self._files = []
-    self._strings = []
-    # Map of (path, subpath) -> entry. Created upon first call to _GetEntry().
-    self._file_map = None
-
-  @classmethod
-  def FromFile(cls, fileobj):
-    """Returns a _Metadata initialized from a file object."""
-    ret = cls()
-    obj = json.load(fileobj)
-    ret._files_md5 = obj['files-md5']
-    ret._strings_md5 = obj['strings-md5']
-    ret._files = obj['input-files']
-    ret._strings = obj['input-strings']
-    return ret
-
-  def ToFile(self, fileobj):
-    """Serializes metadata to the given file object."""
-    obj = {
-        "files-md5": self.FilesMd5(),
-        "strings-md5": self.StringsMd5(),
-        "input-files": self._files,
-        "input-strings": self._strings,
-    }
-    json.dump(obj, fileobj, indent=2)
-
-  def _AssertNotQueried(self):
-    assert self._files_md5 is None
-    assert self._strings_md5 is None
-    assert self._file_map is None
-
-  def AddStrings(self, values):
-    self._AssertNotQueried()
-    self._strings.extend(str(v) for v in values)
-
-  def AddFile(self, path, tag):
-    """Adds metadata for a non-zip file.
-
-    Args:
-      path: Path to the file.
-      tag: A short string representative of the file contents.
-    """
-    self._AssertNotQueried()
-    self._files.append({
-        'path': path,
-        'tag': tag,
-    })
-
-  def AddZipFile(self, path, entries):
-    """Adds metadata for a zip file.
-
-    Args:
-      path: Path to the file.
-      entries: List of (subpath, tag) tuples for entries within the zip.
-    """
-    self._AssertNotQueried()
-    tag = _ComputeInlineMd5(itertools.chain((e[0] for e in entries),
-                                            (e[1] for e in entries)))
-    self._files.append({
-        'path': path,
-        'tag': tag,
-        'entries': [{"path": e[0], "tag": e[1]} for e in entries],
-    })
-
-  def GetStrings(self):
-    """Returns the list of input strings."""
-    return self._strings
-
-  def FilesMd5(self):
-    """Lazily computes and returns the aggregate md5 of input files."""
-    if self._files_md5 is None:
-      # Omit paths from md5 since temporary files have random names.
-      self._files_md5 = _ComputeInlineMd5(
-          self.GetTag(p) for p in sorted(self.IterPaths()))
-    return self._files_md5
-
-  def StringsMd5(self):
-    """Lazily computes and returns the aggregate md5 of input strings."""
-    if self._strings_md5 is None:
-      self._strings_md5 = _ComputeInlineMd5(self._strings)
-    return self._strings_md5
-
-  def _GetEntry(self, path, subpath=None):
-    """Returns the JSON entry for the given path / subpath."""
-    if self._file_map is None:
-      self._file_map = {}
-      for entry in self._files:
-        self._file_map[(entry['path'], None)] = entry
-        for subentry in entry.get('entries', ()):
-          self._file_map[(entry['path'], subentry['path'])] = subentry
-    return self._file_map.get((path, subpath))
-
-  def GetTag(self, path, subpath=None):
-    """Returns the tag for the given path / subpath."""
-    ret = self._GetEntry(path, subpath)
-    return ret and ret['tag']
-
-  def IterPaths(self):
-    """Returns a generator for all top-level paths."""
-    return (e['path'] for e in self._files)
-
-  def IterSubpaths(self, path):
-    """Returns a generator for all subpaths in the given zip.
-
-    If the given path is not a zip file or doesn't exist, returns an empty
-    iterable.
-    """
-    outer_entry = self._GetEntry(path)
-    if not outer_entry:
-      return ()
-    subentries = outer_entry.get('entries', [])
-    return (entry['path'] for entry in subentries)
-
-
-def _UpdateMd5ForFile(md5, path, block_size=2**16):
-  with open(path, 'rb') as infile:
-    while True:
-      data = infile.read(block_size)
-      if not data:
-        break
-      md5.update(data)
-
-
-def _UpdateMd5ForDirectory(md5, dir_path):
-  for root, _, files in os.walk(dir_path):
-    for f in files:
-      _UpdateMd5ForFile(md5, os.path.join(root, f))
-
-
-def _Md5ForPath(path):
-  md5 = hashlib.md5()
-  if os.path.isdir(path):
-    _UpdateMd5ForDirectory(md5, path)
-  else:
-    _UpdateMd5ForFile(md5, path)
-  return md5.hexdigest()
-
-
-def _ComputeInlineMd5(iterable):
-  """Computes the md5 of the concatenated parameters."""
-  md5 = hashlib.md5()
-  for item in iterable:
-    md5.update(str(item))
-  return md5.hexdigest()
-
-
-def _IsZipFile(path):
-  """Returns whether to treat the given file as a zip file."""
-  # ijar doesn't set the CRC32 field.
-  if path.endswith('.interface.jar'):
-    return False
-  return path[-4:] in ('.zip', '.apk', '.jar') or path.endswith('.srcjar')
-
-
-def _ExtractZipEntries(path):
-  """Returns a list of (path, CRC32) of all files within |path|."""
-  entries = []
-  with zipfile.ZipFile(path) as zip_file:
-    for zip_info in zip_file.infolist():
-      # Skip directories and empty files.
-      if zip_info.CRC:
-        entries.append(
-            (zip_info.filename, zip_info.CRC + zip_info.compress_type))
-  return entries
diff --git a/build/android/pylib/__init__.py b/build/android/pylib/__init__.py
deleted file mode 100644
index b93eb4f..0000000
--- a/build/android/pylib/__init__.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright (c) 2012 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.
-
-import os
-import sys
-
-
-_CATAPULT_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..', '..', 'third_party', 'catapult'))
-
-_DEVIL_PATH = os.path.join(_CATAPULT_PATH, 'devil')
-
-_PYTRACE_PATH = os.path.join(_CATAPULT_PATH, 'common', 'py_trace_event')
-
-_PY_UTILS_PATH = os.path.join(_CATAPULT_PATH, 'common', 'py_utils')
-
-_TRACE2HTML_PATH = os.path.join(_CATAPULT_PATH, 'tracing')
-
-
-if _DEVIL_PATH not in sys.path:
-  sys.path.append(_DEVIL_PATH)
-
-if _PYTRACE_PATH not in sys.path:
-  sys.path.append(_PYTRACE_PATH)
-
-if _PY_UTILS_PATH not in sys.path:
-  sys.path.append(_PY_UTILS_PATH)
-
-if _TRACE2HTML_PATH not in sys.path:
-  sys.path.append(_TRACE2HTML_PATH)
diff --git a/build/android/pylib/constants/__init__.py b/build/android/pylib/constants/__init__.py
deleted file mode 100644
index 916ee27..0000000
--- a/build/android/pylib/constants/__init__.py
+++ /dev/null
@@ -1,225 +0,0 @@
-# Copyright (c) 2012 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.
-
-"""Defines a set of constants shared by test runners and other scripts."""
-
-# TODO(jbudorick): Split these constants into coherent modules.
-
-# pylint: disable=W0212
-
-import collections
-import glob
-import logging
-import os
-import subprocess
-
-import devil.android.sdk.keyevent
-from devil.android.constants import chrome
-from devil.android.sdk import version_codes
-from devil.constants import exit_codes
-
-
-keyevent = devil.android.sdk.keyevent
-
-
-DIR_SOURCE_ROOT = os.environ.get('CHECKOUT_SOURCE_ROOT',
-    os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                 os.pardir, os.pardir, os.pardir, os.pardir)))
-
-PACKAGE_INFO = dict(chrome.PACKAGE_INFO)
-PACKAGE_INFO.update({
-    'legacy_browser': chrome.PackageInfo(
-        'com.google.android.browser',
-        'com.android.browser.BrowserActivity',
-        None,
-        None),
-    'chromecast_shell': chrome.PackageInfo(
-        'com.google.android.apps.mediashell',
-        'com.google.android.apps.mediashell.MediaShellActivity',
-        'castshell-command-line',
-        None),
-    'android_webview_shell': chrome.PackageInfo(
-        'org.chromium.android_webview.shell',
-        'org.chromium.android_webview.shell.AwShellActivity',
-        'android-webview-command-line',
-        None),
-    'gtest': chrome.PackageInfo(
-        'org.chromium.native_test',
-        'org.chromium.native_test.NativeUnitTestActivity',
-        'chrome-native-tests-command-line',
-        None),
-    'components_browsertests': chrome.PackageInfo(
-        'org.chromium.components_browsertests_apk',
-        ('org.chromium.components_browsertests_apk' +
-         '.ComponentsBrowserTestsActivity'),
-        'chrome-native-tests-command-line',
-        None),
-    'content_browsertests': chrome.PackageInfo(
-        'org.chromium.content_browsertests_apk',
-        'org.chromium.content_browsertests_apk.ContentBrowserTestsActivity',
-        'chrome-native-tests-command-line',
-        None),
-    'chromedriver_webview_shell': chrome.PackageInfo(
-        'org.chromium.chromedriver_webview_shell',
-        'org.chromium.chromedriver_webview_shell.Main',
-        None,
-        None),
-})
-
-
-# Ports arrangement for various test servers used in Chrome for Android.
-# Lighttpd server will attempt to use 9000 as default port, if unavailable it
-# will find a free port from 8001 - 8999.
-LIGHTTPD_DEFAULT_PORT = 9000
-LIGHTTPD_RANDOM_PORT_FIRST = 8001
-LIGHTTPD_RANDOM_PORT_LAST = 8999
-TEST_SYNC_SERVER_PORT = 9031
-TEST_SEARCH_BY_IMAGE_SERVER_PORT = 9041
-TEST_POLICY_SERVER_PORT = 9051
-
-
-TEST_EXECUTABLE_DIR = '/data/local/tmp'
-# Directories for common java libraries for SDK build.
-# These constants are defined in build/android/ant/common.xml
-SDK_BUILD_JAVALIB_DIR = 'lib.java'
-SDK_BUILD_TEST_JAVALIB_DIR = 'test.lib.java'
-SDK_BUILD_APKS_DIR = 'apks'
-
-ADB_KEYS_FILE = '/data/misc/adb/adb_keys'
-
-PERF_OUTPUT_DIR = os.path.join(DIR_SOURCE_ROOT, 'out', 'step_results')
-# The directory on the device where perf test output gets saved to.
-DEVICE_PERF_OUTPUT_DIR = (
-    '/data/data/' + PACKAGE_INFO['chrome'].package + '/files')
-
-SCREENSHOTS_DIR = os.path.join(DIR_SOURCE_ROOT, 'out_screenshots')
-
-ANDROID_SDK_VERSION = version_codes.MARSHMALLOW
-ANDROID_SDK_BUILD_TOOLS_VERSION = '24.0.2'
-ANDROID_SDK_ROOT = os.path.join(DIR_SOURCE_ROOT,
-                                'third_party', 'android_tools', 'sdk')
-ANDROID_SDK_TOOLS = os.path.join(ANDROID_SDK_ROOT,
-                                 'build-tools', ANDROID_SDK_BUILD_TOOLS_VERSION)
-ANDROID_NDK_ROOT = os.path.join(DIR_SOURCE_ROOT,
-                                'third_party', 'android_tools', 'ndk')
-
-PROGUARD_SCRIPT_PATH = os.path.join(
-    ANDROID_SDK_ROOT, 'tools', 'proguard', 'bin', 'proguard.sh')
-
-PROGUARD_ROOT = os.path.join(DIR_SOURCE_ROOT, 'third_party', 'proguard')
-
-BAD_DEVICES_JSON = os.path.join(DIR_SOURCE_ROOT,
-                                os.environ.get('CHROMIUM_OUT_DIR', 'out'),
-                                'bad_devices.json')
-
-UPSTREAM_FLAKINESS_SERVER = 'test-results.appspot.com'
-
-# TODO(jbudorick): Remove once unused.
-DEVICE_LOCAL_PROPERTIES_PATH = '/data/local.prop'
-
-# TODO(jbudorick): Rework this into testing/buildbot/
-PYTHON_UNIT_TEST_SUITES = {
-  'pylib_py_unittests': {
-    'path': os.path.join(DIR_SOURCE_ROOT, 'build', 'android'),
-    'test_modules': [
-      'devil.android.device_utils_test',
-      'devil.android.md5sum_test',
-      'devil.utils.cmd_helper_test',
-      'pylib.results.json_results_test',
-      'pylib.utils.proguard_test',
-    ]
-  },
-  'gyp_py_unittests': {
-    'path': os.path.join(DIR_SOURCE_ROOT, 'build', 'android', 'gyp'),
-    'test_modules': [
-      'java_cpp_enum_tests',
-      'java_google_api_keys_tests',
-    ]
-  },
-}
-
-LOCAL_MACHINE_TESTS = ['junit', 'python']
-VALID_ENVIRONMENTS = ['local']
-VALID_TEST_TYPES = ['gtest', 'instrumentation', 'junit', 'linker', 'monkey',
-                    'perf', 'python']
-VALID_DEVICE_TYPES = ['Android', 'iOS']
-
-
-def GetBuildType():
-  try:
-    return os.environ['BUILDTYPE']
-  except KeyError:
-    raise EnvironmentError(
-        'The BUILDTYPE environment variable has not been set')
-
-
-def SetBuildType(build_type):
-  os.environ['BUILDTYPE'] = build_type
-
-
-def SetBuildDirectory(build_directory):
-  os.environ['CHROMIUM_OUT_DIR'] = build_directory
-
-
-def SetOutputDirectory(output_directory):
-  os.environ['CHROMIUM_OUTPUT_DIR'] = output_directory
-
-
-def GetOutDirectory(build_type=None):
-  """Returns the out directory where the output binaries are built.
-
-  Args:
-    build_type: Build type, generally 'Debug' or 'Release'. Defaults to the
-      globally set build type environment variable BUILDTYPE.
-  """
-  if 'CHROMIUM_OUTPUT_DIR' in os.environ:
-    return os.path.abspath(os.path.join(
-        DIR_SOURCE_ROOT, os.environ.get('CHROMIUM_OUTPUT_DIR')))
-
-  return os.path.abspath(os.path.join(
-      DIR_SOURCE_ROOT, os.environ.get('CHROMIUM_OUT_DIR', 'out'),
-      GetBuildType() if build_type is None else build_type))
-
-
-def CheckOutputDirectory():
-  """Checks that CHROMIUM_OUT_DIR or CHROMIUM_OUTPUT_DIR is set.
-
-  If neither are set, but the current working directory is a build directory,
-  then CHROMIUM_OUTPUT_DIR is set to the current working directory.
-
-  Raises:
-    Exception: If no output directory is detected.
-  """
-  output_dir = os.environ.get('CHROMIUM_OUTPUT_DIR')
-  out_dir = os.environ.get('CHROMIUM_OUT_DIR')
-  if not output_dir and not out_dir:
-    # If CWD is an output directory, then assume it's the desired one.
-    if os.path.exists('build.ninja'):
-      output_dir = os.getcwd()
-      SetOutputDirectory(output_dir)
-    elif os.environ.get('CHROME_HEADLESS'):
-      # When running on bots, see if the output directory is obvious.
-      dirs = glob.glob(os.path.join(DIR_SOURCE_ROOT, 'out', '*', 'build.ninja'))
-      if len(dirs) == 1:
-        SetOutputDirectory(dirs[0])
-      else:
-        raise Exception('Neither CHROMIUM_OUTPUT_DIR nor CHROMIUM_OUT_DIR '
-                        'has been set. CHROME_HEADLESS detected, but multiple '
-                        'out dirs exist: %r' % dirs)
-    else:
-      raise Exception('Neither CHROMIUM_OUTPUT_DIR nor CHROMIUM_OUT_DIR '
-                      'has been set')
-
-
-# TODO(jbudorick): Convert existing callers to AdbWrapper.GetAdbPath() and
-# remove this.
-def GetAdbPath():
-  from devil.android.sdk import adb_wrapper
-  return adb_wrapper.AdbWrapper.GetAdbPath()
-
-
-# Exit codes
-ERROR_EXIT_CODE = exit_codes.ERROR
-INFRA_EXIT_CODE = exit_codes.INFRA
-WARNING_EXIT_CODE = exit_codes.WARNING
diff --git a/build/android/pylib/constants/host_paths.py b/build/android/pylib/constants/host_paths.py
deleted file mode 100644
index 98aa53d..0000000
--- a/build/android/pylib/constants/host_paths.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import os
-import sys
-
-DIR_SOURCE_ROOT = os.environ.get(
-    'CHECKOUT_SOURCE_ROOT',
-    os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                 os.pardir, os.pardir, os.pardir, os.pardir)))
-
-BUILD_COMMON_PATH = os.path.join(
-    DIR_SOURCE_ROOT, 'build', 'util', 'lib', 'common')
-
-# third-party libraries
-ANDROID_PLATFORM_DEVELOPMENT_SCRIPTS_PATH = os.path.join(
-    DIR_SOURCE_ROOT, 'third_party', 'android_platform', 'development',
-    'scripts')
-DEVIL_PATH = os.path.join(
-    DIR_SOURCE_ROOT, 'third_party', 'catapult', 'devil')
-PYMOCK_PATH = os.path.join(
-    DIR_SOURCE_ROOT, 'third_party', 'pymock')
-
-@contextlib.contextmanager
-def SysPath(path, position=None):
-  if position is None:
-    sys.path.append(path)
-  else:
-    sys.path.insert(position, path)
-  try:
-    yield
-  finally:
-    if sys.path[-1] == path:
-      sys.path.pop()
-    else:
-      sys.path.remove(path)
diff --git a/build/build_config.h b/build/build_config.h
deleted file mode 100644
index 5ee96b1..0000000
--- a/build/build_config.h
+++ /dev/null
@@ -1,229 +0,0 @@
-// Copyright (c) 2012 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 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 (NACL_SFI or NACL_NONSFI) / OS_NACL_SFI / OS_NACL_NONSFI
-//    OS_CHROMEOS is set by the build system
-//  Compiler:
-//    COMPILER_MSVC / COMPILER_GCC
-//  Processor:
-//    ARCH_CPU_X86 / ARCH_CPU_X86_64 / ARCH_CPU_X86_FAMILY (X86 or X86_64)
-//    ARCH_CPU_32_BITS / ARCH_CPU_64_BITS
-
-#ifndef BUILD_BUILD_CONFIG_H_
-#define BUILD_BUILD_CONFIG_H_
-
-// A brief primer on #defines:
-//
-// - __ANDROID__ is automatically defined by the Android toolchain (see
-//   https://goo.gl/v61lXa). It's not defined when building host code.
-// - __ANDROID_HOST__ is defined via -D by Android.mk when building host code
-//   within an Android checkout.
-// - ANDROID is defined via -D when building code for either Android targets or
-//   hosts. Use __ANDROID__ and __ANDROID_HOST__ instead.
-// - OS_ANDROID is a Chrome-specific define used to build Chrome for Android
-//   within the NDK.
-
-// Android targets and hosts don't use tcmalloc.
-#if defined(__ANDROID__) || defined(__ANDROID_HOST__)
-#define NO_TCMALLOC
-#endif  // defined(__ANDROID__) || defined(__ANDROID_HOST__)
-
-// Use the Chrome OS version of the code for both Android targets and Chrome OS builds.
-#if !defined(__ANDROID_HOST__)
-#define OS_CHROMEOS 1
-#endif  // !defined(__ANDROID_HOST__)
-
-#if defined(__ANDROID__)  // Android targets
-
-#define __linux__ 1
-
-#elif !defined(__ANDROID_HOST__)  // Chrome OS
-
-// TODO: Remove these once the GLib MessageLoopForUI isn't being used:
-// https://crbug.com/361635
-#define USE_GLIB 1
-#define USE_OZONE 1
-
-#endif  // defined(__ANDROID__)
-
-// A set of macros to use for platform detection.
-#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
-// Don't set OS_ANDROID; it's only used when building Chrome for Android.
-#elif defined(__APPLE__)
-// only include TargetConditions after testing ANDROID as some android builds
-// on mac don't have this header available and it's not needed unless the target
-// is really mac/ios.
-#include <TargetConditionals.h>
-#define OS_MACOSX 1
-#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
-#define OS_IOS 1
-#endif  // defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
-#elif defined(__linux__)
-#define OS_LINUX 1
-// include a system header to pull in features.h for glibc/uclibc macros.
-#include <unistd.h>
-#if defined(__GLIBC__) && !defined(__UCLIBC__)
-// we really are using glibc, not uClibc pretending to be glibc
-#define LIBC_GLIBC 1
-#endif
-#elif defined(_WIN32)
-#define OS_WIN 1
-#elif defined(__FreeBSD__)
-#define OS_FREEBSD 1
-#elif defined(__NetBSD__)
-#define OS_NETBSD 1
-#elif defined(__OpenBSD__)
-#define OS_OPENBSD 1
-#elif defined(__sun)
-#define OS_SOLARIS 1
-#elif defined(__QNXNTO__)
-#define OS_QNX 1
-#else
-#error Please add support for your platform in build/build_config.h
-#endif
-
-#if defined(USE_OPENSSL_CERTS) && defined(USE_NSS_CERTS)
-#error Cannot use both OpenSSL and NSS for certificates
-#endif
-
-// For access to standard BSD features, use OS_BSD instead of a
-// more specific macro.
-#if defined(OS_FREEBSD) || defined(OS_NETBSD) || defined(OS_OPENBSD)
-#define OS_BSD 1
-#endif
-
-// For access to standard POSIXish features, use OS_POSIX instead of a
-// more specific macro.
-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_FREEBSD) ||     \
-    defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_SOLARIS) ||   \
-    defined(OS_ANDROID) || defined(OS_OPENBSD) || defined(OS_SOLARIS) ||  \
-    defined(OS_ANDROID) || defined(OS_NACL) || defined(OS_QNX)
-#define OS_POSIX 1
-#endif
-
-// Use tcmalloc
-#if (defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID)) && \
-    !defined(NO_TCMALLOC)
-#define USE_TCMALLOC 1
-#endif
-
-// Compiler detection.
-#if defined(__GNUC__)
-#define COMPILER_GCC 1
-#elif defined(_MSC_VER)
-#define COMPILER_MSVC 1
-#else
-#error Please add support for your compiler in build/build_config.h
-#endif
-
-// Processor architecture detection.  For more info on what's defined, see:
-//   http://msdn.microsoft.com/en-us/library/b0084kay.aspx
-//   http://www.agner.org/optimize/calling_conventions.pdf
-//   or with gcc, run: "echo | gcc -E -dM -"
-#if defined(_M_X64) || defined(__x86_64__)
-#define ARCH_CPU_X86_FAMILY 1
-#define ARCH_CPU_X86_64 1
-#define ARCH_CPU_64_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(_M_IX86) || defined(__i386__)
-#define ARCH_CPU_X86_FAMILY 1
-#define ARCH_CPU_X86 1
-#define ARCH_CPU_32_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(__s390x__)
-#define ARCH_CPU_S390_FAMILY 1
-#define ARCH_CPU_S390X 1
-#define ARCH_CPU_64_BITS 1
-#define ARCH_CPU_BIG_ENDIAN 1
-#elif defined(__s390__)
-#define ARCH_CPU_S390_FAMILY 1
-#define ARCH_CPU_S390 1
-#define ARCH_CPU_31_BITS 1
-#define ARCH_CPU_BIG_ENDIAN 1
-#elif defined(__PPC64__) && defined(__BIG_ENDIAN__)
-#define ARCH_CPU_PPC64_FAMILY 1
-#define ARCH_CPU_PPC64 1
-#define ARCH_CPU_64_BITS 1
-#define ARCH_CPU_BIG_ENDIAN 1
-#elif defined(__PPC64__) && defined(__LITTLE_ENDIAN__)
-#define ARCH_CPU_PPC64_FAMILY 1
-#define ARCH_CPU_PPC64 1
-#define ARCH_CPU_64_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(__PPC__)
-#define ARCH_CPU_PPC_FAMILY 1
-#define ARCH_CPU_PPC 1
-#define ARCH_CPU_32_BITS 1
-#define ARCH_CPU_BIG_ENDIAN 1
-#elif defined(__ARMEL__)
-#define ARCH_CPU_ARM_FAMILY 1
-#define ARCH_CPU_ARMEL 1
-#define ARCH_CPU_32_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(__aarch64__)
-#define ARCH_CPU_ARM_FAMILY 1
-#define ARCH_CPU_ARM64 1
-#define ARCH_CPU_64_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(__pnacl__)
-#define ARCH_CPU_32_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(__MIPSEL__)
-#if defined(__LP64__)
-#define ARCH_CPU_MIPS_FAMILY 1
-#define ARCH_CPU_MIPS64EL 1
-#define ARCH_CPU_64_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#else
-#define ARCH_CPU_MIPS_FAMILY 1
-#define ARCH_CPU_MIPSEL 1
-#define ARCH_CPU_32_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#endif
-#else
-#error Please add support for your architecture in build/build_config.h
-#endif
-
-// Type detection for wchar_t.
-#if defined(OS_WIN)
-#define WCHAR_T_IS_UTF16
-#elif defined(OS_POSIX) && defined(COMPILER_GCC) && \
-    defined(__WCHAR_MAX__) && \
-    (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff)
-#define WCHAR_T_IS_UTF32
-#elif defined(OS_POSIX) && defined(COMPILER_GCC) && \
-    defined(__WCHAR_MAX__) && \
-    (__WCHAR_MAX__ == 0x7fff || __WCHAR_MAX__ == 0xffff)
-// On Posix, we'll detect short wchar_t, but projects aren't guaranteed to
-// compile in this mode (in particular, Chrome doesn't). This is intended for
-// other projects using base who manage their own dependencies and make sure
-// short wchar works for them.
-#define WCHAR_T_IS_UTF16
-#else
-#error Please add support for your compiler in build/build_config.h
-#endif
-
-#if defined(OS_ANDROID)
-// The compiler thinks std::string::const_iterator and "const char*" are
-// equivalent types.
-#define STD_STRING_ITERATOR_IS_CHAR_POINTER
-// The compiler thinks base::string16::const_iterator and "char16*" are
-// equivalent types.
-#define BASE_STRING16_ITERATOR_IS_CHAR16_POINTER
-#endif
-
-#endif  // BUILD_BUILD_CONFIG_H_
diff --git a/build/gn_helpers.py b/build/gn_helpers.py
deleted file mode 100644
index 33cc578..0000000
--- a/build/gn_helpers.py
+++ /dev/null
@@ -1,351 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Helper functions useful when writing scripts that integrate with GN.
-
-The main functions are ToGNString and FromGNString which convert between
-serialized GN veriables and Python variables.
-
-To use in a random python file in the build:
-
-  import os
-  import sys
-
-  sys.path.append(os.path.join(os.path.dirname(__file__),
-                               os.pardir, os.pardir, "build"))
-  import gn_helpers
-
-Where the sequence of parameters to join is the relative path from your source
-file to the build directory."""
-
-class GNException(Exception):
-  pass
-
-
-def ToGNString(value, allow_dicts = True):
-  """Returns a stringified GN equivalent of the Python value.
-
-  allow_dicts indicates if this function will allow converting dictionaries
-  to GN scopes. This is only possible at the top level, you can't nest a
-  GN scope in a list, so this should be set to False for recursive calls."""
-  if isinstance(value, basestring):
-    if value.find('\n') >= 0:
-      raise GNException("Trying to print a string with a newline in it.")
-    return '"' + \
-        value.replace('\\', '\\\\').replace('"', '\\"').replace('$', '\\$') + \
-        '"'
-
-  if isinstance(value, unicode):
-    return ToGNString(value.encode('utf-8'))
-
-  if isinstance(value, bool):
-    if value:
-      return "true"
-    return "false"
-
-  if isinstance(value, list):
-    return '[ %s ]' % ', '.join(ToGNString(v) for v in value)
-
-  if isinstance(value, dict):
-    if not allow_dicts:
-      raise GNException("Attempting to recursively print a dictionary.")
-    result = ""
-    for key in sorted(value):
-      if not isinstance(key, basestring):
-        raise GNException("Dictionary key is not a string.")
-      result += "%s = %s\n" % (key, ToGNString(value[key], False))
-    return result
-
-  if isinstance(value, int):
-    return str(value)
-
-  raise GNException("Unsupported type when printing to GN.")
-
-
-def FromGNString(input_string):
-  """Converts the input string from a GN serialized value to Python values.
-
-  For details on supported types see GNValueParser.Parse() below.
-
-  If your GN script did:
-    something = [ "file1", "file2" ]
-    args = [ "--values=$something" ]
-  The command line would look something like:
-    --values="[ \"file1\", \"file2\" ]"
-  Which when interpreted as a command line gives the value:
-    [ "file1", "file2" ]
-
-  You can parse this into a Python list using GN rules with:
-    input_values = FromGNValues(options.values)
-  Although the Python 'ast' module will parse many forms of such input, it
-  will not handle GN escaping properly, nor GN booleans. You should use this
-  function instead.
-
-
-  A NOTE ON STRING HANDLING:
-
-  If you just pass a string on the command line to your Python script, or use
-  string interpolation on a string variable, the strings will not be quoted:
-    str = "asdf"
-    args = [ str, "--value=$str" ]
-  Will yield the command line:
-    asdf --value=asdf
-  The unquoted asdf string will not be valid input to this function, which
-  accepts only quoted strings like GN scripts. In such cases, you can just use
-  the Python string literal directly.
-
-  The main use cases for this is for other types, in particular lists. When
-  using string interpolation on a list (as in the top example) the embedded
-  strings will be quoted and escaped according to GN rules so the list can be
-  re-parsed to get the same result."""
-  parser = GNValueParser(input_string)
-  return parser.Parse()
-
-
-def FromGNArgs(input_string):
-  """Converts a string with a bunch of gn arg assignments into a Python dict.
-
-  Given a whitespace-separated list of
-
-    <ident> = (integer | string | boolean | <list of the former>)
-
-  gn assignments, this returns a Python dict, i.e.:
-
-    FromGNArgs("foo=true\nbar=1\n") -> { 'foo': True, 'bar': 1 }.
-
-  Only simple types and lists supported; variables, structs, calls
-  and other, more complicated things are not.
-
-  This routine is meant to handle only the simple sorts of values that
-  arise in parsing --args.
-  """
-  parser = GNValueParser(input_string)
-  return parser.ParseArgs()
-
-
-def UnescapeGNString(value):
-  """Given a string with GN escaping, returns the unescaped string.
-
-  Be careful not to feed with input from a Python parsing function like
-  'ast' because it will do Python unescaping, which will be incorrect when
-  fed into the GN unescaper."""
-  result = ''
-  i = 0
-  while i < len(value):
-    if value[i] == '\\':
-      if i < len(value) - 1:
-        next_char = value[i + 1]
-        if next_char in ('$', '"', '\\'):
-          # These are the escaped characters GN supports.
-          result += next_char
-          i += 1
-        else:
-          # Any other backslash is a literal.
-          result += '\\'
-    else:
-      result += value[i]
-    i += 1
-  return result
-
-
-def _IsDigitOrMinus(char):
-  return char in "-0123456789"
-
-
-class GNValueParser(object):
-  """Duplicates GN parsing of values and converts to Python types.
-
-  Normally you would use the wrapper function FromGNValue() below.
-
-  If you expect input as a specific type, you can also call one of the Parse*
-  functions directly. All functions throw GNException on invalid input. """
-  def __init__(self, string):
-    self.input = string
-    self.cur = 0
-
-  def IsDone(self):
-    return self.cur == len(self.input)
-
-  def ConsumeWhitespace(self):
-    while not self.IsDone() and self.input[self.cur] in ' \t\n':
-      self.cur += 1
-
-  def Parse(self):
-    """Converts a string representing a printed GN value to the Python type.
-
-    See additional usage notes on FromGNString above.
-
-    - GN booleans ('true', 'false') will be converted to Python booleans.
-
-    - GN numbers ('123') will be converted to Python numbers.
-
-    - GN strings (double-quoted as in '"asdf"') will be converted to Python
-      strings with GN escaping rules. GN string interpolation (embedded
-      variables preceeded by $) are not supported and will be returned as
-      literals.
-
-    - GN lists ('[1, "asdf", 3]') will be converted to Python lists.
-
-    - GN scopes ('{ ... }') are not supported."""
-    result = self._ParseAllowTrailing()
-    self.ConsumeWhitespace()
-    if not self.IsDone():
-      raise GNException("Trailing input after parsing:\n  " +
-                        self.input[self.cur:])
-    return result
-
-  def ParseArgs(self):
-    """Converts a whitespace-separated list of ident=literals to a dict.
-
-    See additional usage notes on FromGNArgs, above.
-    """
-    d = {}
-
-    self.ConsumeWhitespace()
-    while not self.IsDone():
-      ident = self._ParseIdent()
-      self.ConsumeWhitespace()
-      if self.input[self.cur] != '=':
-        raise GNException("Unexpected token: " + self.input[self.cur:])
-      self.cur += 1
-      self.ConsumeWhitespace()
-      val = self._ParseAllowTrailing()
-      self.ConsumeWhitespace()
-      d[ident] = val
-
-    return d
-
-  def _ParseAllowTrailing(self):
-    """Internal version of Parse that doesn't check for trailing stuff."""
-    self.ConsumeWhitespace()
-    if self.IsDone():
-      raise GNException("Expected input to parse.")
-
-    next_char = self.input[self.cur]
-    if next_char == '[':
-      return self.ParseList()
-    elif _IsDigitOrMinus(next_char):
-      return self.ParseNumber()
-    elif next_char == '"':
-      return self.ParseString()
-    elif self._ConstantFollows('true'):
-      return True
-    elif self._ConstantFollows('false'):
-      return False
-    else:
-      raise GNException("Unexpected token: " + self.input[self.cur:])
-
-  def _ParseIdent(self):
-    ident = ''
-
-    next_char = self.input[self.cur]
-    if not next_char.isalpha() and not next_char=='_':
-      raise GNException("Expected an identifier: " + self.input[self.cur:])
-
-    ident += next_char
-    self.cur += 1
-
-    next_char = self.input[self.cur]
-    while next_char.isalpha() or next_char.isdigit() or next_char=='_':
-      ident += next_char
-      self.cur += 1
-      next_char = self.input[self.cur]
-
-    return ident
-
-  def ParseNumber(self):
-    self.ConsumeWhitespace()
-    if self.IsDone():
-      raise GNException('Expected number but got nothing.')
-
-    begin = self.cur
-
-    # The first character can include a negative sign.
-    if not self.IsDone() and _IsDigitOrMinus(self.input[self.cur]):
-      self.cur += 1
-    while not self.IsDone() and self.input[self.cur].isdigit():
-      self.cur += 1
-
-    number_string = self.input[begin:self.cur]
-    if not len(number_string) or number_string == '-':
-      raise GNException("Not a valid number.")
-    return int(number_string)
-
-  def ParseString(self):
-    self.ConsumeWhitespace()
-    if self.IsDone():
-      raise GNException('Expected string but got nothing.')
-
-    if self.input[self.cur] != '"':
-      raise GNException('Expected string beginning in a " but got:\n  ' +
-                        self.input[self.cur:])
-    self.cur += 1  # Skip over quote.
-
-    begin = self.cur
-    while not self.IsDone() and self.input[self.cur] != '"':
-      if self.input[self.cur] == '\\':
-        self.cur += 1  # Skip over the backslash.
-        if self.IsDone():
-          raise GNException("String ends in a backslash in:\n  " +
-                            self.input)
-      self.cur += 1
-
-    if self.IsDone():
-      raise GNException('Unterminated string:\n  ' + self.input[begin:])
-
-    end = self.cur
-    self.cur += 1  # Consume trailing ".
-
-    return UnescapeGNString(self.input[begin:end])
-
-  def ParseList(self):
-    self.ConsumeWhitespace()
-    if self.IsDone():
-      raise GNException('Expected list but got nothing.')
-
-    # Skip over opening '['.
-    if self.input[self.cur] != '[':
-      raise GNException("Expected [ for list but got:\n  " +
-                        self.input[self.cur:])
-    self.cur += 1
-    self.ConsumeWhitespace()
-    if self.IsDone():
-      raise GNException("Unterminated list:\n  " + self.input)
-
-    list_result = []
-    previous_had_trailing_comma = True
-    while not self.IsDone():
-      if self.input[self.cur] == ']':
-        self.cur += 1  # Skip over ']'.
-        return list_result
-
-      if not previous_had_trailing_comma:
-        raise GNException("List items not separated by comma.")
-
-      list_result += [ self._ParseAllowTrailing() ]
-      self.ConsumeWhitespace()
-      if self.IsDone():
-        break
-
-      # Consume comma if there is one.
-      previous_had_trailing_comma = self.input[self.cur] == ','
-      if previous_had_trailing_comma:
-        # Consume comma.
-        self.cur += 1
-        self.ConsumeWhitespace()
-
-    raise GNException("Unterminated list:\n  " + self.input)
-
-  def _ConstantFollows(self, constant):
-    """Returns true if the given constant follows immediately at the current
-    location in the input. If it does, the text is consumed and the function
-    returns true. Otherwise, returns false and the current position is
-    unchanged."""
-    end = self.cur + len(constant)
-    if end > len(self.input):
-      return False  # Not enough room.
-    if self.input[self.cur:end] == constant:
-      self.cur = end
-      return True
-    return False
diff --git a/gen/mojo/common/common_custom_types__type_mappings b/gen/mojo/common/common_custom_types__type_mappings
deleted file mode 100644
index 1906049..0000000
--- a/gen/mojo/common/common_custom_types__type_mappings
+++ /dev/null
@@ -1,193 +0,0 @@
-{
-  "c++": {
-    "mojo.common.mojom.Value": {
-      "hashable": false, 
-      "typename": "std::unique_ptr<base::Value>", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/values_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": true, 
-      "nullable_is_same_type": true, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/values.h"
-      ]
-    }, 
-    "mojo.common.mojom.UnguessableToken": {
-      "hashable": false, 
-      "typename": "base::UnguessableToken", 
-      "traits_headers": [
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/unguessable_token.h"
-      ]
-    }, 
-    "mojo.common.mojom.TextDirection": {
-      "hashable": false, 
-      "typename": "base::i18n::TextDirection", 
-      "traits_headers": [
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/i18n/rtl.h"
-      ]
-    }, 
-    "mojo.common.mojom.ListValue": {
-      "hashable": false, 
-      "typename": "std::unique_ptr<base::ListValue>", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/values_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": true, 
-      "nullable_is_same_type": true, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/values.h"
-      ]
-    }, 
-    "mojo.common.mojom.String16": {
-      "hashable": false, 
-      "typename": "base::string16", 
-      "traits_headers": [
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/strings/string16.h"
-      ]
-    }, 
-    "mojo.common.mojom.Time": {
-      "hashable": false, 
-      "typename": "base::Time", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": true, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/time/time.h"
-      ]
-    }, 
-    "mojo.common.mojom.TimeDelta": {
-      "hashable": false, 
-      "typename": "base::TimeDelta", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": true, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/time/time.h"
-      ]
-    }, 
-    "mojo.common.mojom.TimeTicks": {
-      "hashable": false, 
-      "typename": "base::TimeTicks", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": true, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/time/time.h"
-      ]
-    }, 
-    "mojo.common.mojom.LegacyListValue": {
-      "hashable": false, 
-      "typename": "base::ListValue", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/values_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": true, 
-      "public_headers": [
-        "base/values.h"
-      ]
-    }, 
-    "mojo.common.mojom.File": {
-      "hashable": false, 
-      "typename": "base::File", 
-      "traits_headers": [
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": true, 
-      "nullable_is_same_type": true, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/files/file.h"
-      ]
-    }, 
-    "mojo.common.mojom.FilePath": {
-      "hashable": false, 
-      "typename": "base::FilePath", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/files/file_path.h"
-      ]
-    }, 
-    "mojo.common.mojom.DictionaryValue": {
-      "hashable": false, 
-      "typename": "std::unique_ptr<base::DictionaryValue>", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/values_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": true, 
-      "nullable_is_same_type": true, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/values.h"
-      ]
-    }, 
-    "mojo.common.mojom.Version": {
-      "hashable": false, 
-      "typename": "base::Version", 
-      "traits_headers": [
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/version.h"
-      ]
-    }
-  }
-}
\ No newline at end of file
diff --git a/ipc/ipc.mojom b/ipc/ipc.mojom
deleted file mode 100644
index 0a4fcfa..0000000
--- a/ipc/ipc.mojom
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module IPC.mojom;
-
-// NOTE: This MUST match the value of MSG_ROUTING_NONE in src/ipc/ipc_message.h.
-const int32 kRoutingIdNone = -2;
-
-struct SerializedHandle {
-  handle the_handle;
-
-  enum Type {
-    MOJO_HANDLE,
-    PLATFORM_FILE,
-    WIN_HANDLE,
-    MACH_PORT,
-  };
-
-  Type type;
-};
-
-// A placeholder interface type since we don't yet support generic associated
-// message pipe handles.
-interface GenericInterface {};
-
-interface Channel {
-  // Informs the remote end of this client's PID. Must be called exactly once,
-  // before any calls to Receive() below.
-  SetPeerPid(int32 pid);
-
-  // Transmits a classical Chrome IPC message.
-  Receive(array<uint8> data, array<SerializedHandle>? handles);
-
-  // Requests a Channel-associated interface.
-  GetAssociatedInterface(string name, associated GenericInterface& request);
-};
-
-// A strictly nominal interface used to identify Channel bootstrap requests.
-interface ChannelBootstrap {};
diff --git a/ipc/ipc_channel_handle.h b/ipc/ipc_channel_handle.h
deleted file mode 100644
index ef31b84..0000000
--- a/ipc/ipc_channel_handle.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2012 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 IPC_IPC_CHANNEL_HANDLE_H_
-#define IPC_IPC_CHANNEL_HANDLE_H_
-
-#include <string>
-
-#include "build/build_config.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-#if defined(OS_NACL_SFI)
-#include "base/file_descriptor_posix.h"
-#endif  // defined (OS_NACL_SFI)
-
-namespace IPC {
-
-// Note that serialization for this object is defined in the ParamTraits
-// template specialization in ipc_message_utils.h.
-#if defined(OS_NACL_SFI)
-struct ChannelHandle {
-  ChannelHandle() {}
-  explicit ChannelHandle(const base::FileDescriptor& s) : socket(s) {}
-
-  base::FileDescriptor socket;
-};
-#else
-struct ChannelHandle {
-  ChannelHandle() {}
-  ChannelHandle(mojo::MessagePipeHandle h) : mojo_handle(h) {}
-
-  bool is_mojo_channel_handle() const { return mojo_handle.is_valid(); }
-
-  mojo::MessagePipeHandle mojo_handle;
-};
-#endif  // defined(OS_NACL_SFI)
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_CHANNEL_HANDLE_H_
diff --git a/ipc/ipc_export.h b/ipc/ipc_export.h
deleted file mode 100644
index e1cbe88..0000000
--- a/ipc/ipc_export.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IPC_IPC_EXPORT_H_
-#define IPC_IPC_EXPORT_H_
-
-// Defines IPC_EXPORT so that functionality implemented by the IPC module can be
-// exported to consumers.
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(IPC_IMPLEMENTATION)
-#define IPC_EXPORT __declspec(dllexport)
-#else
-#define IPC_EXPORT __declspec(dllimport)
-#endif  // defined(IPC_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-
-#if defined(IPC_IMPLEMENTATION)
-#define IPC_EXPORT __attribute__((visibility("default")))
-#else
-#define IPC_EXPORT
-#endif
-
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define IPC_EXPORT
-#endif
-
-#endif  // IPC_IPC_EXPORT_H_
diff --git a/ipc/ipc_listener.h b/ipc/ipc_listener.h
deleted file mode 100644
index d7ad75c..0000000
--- a/ipc/ipc_listener.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2012 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 IPC_IPC_LISTENER_H_
-#define IPC_IPC_LISTENER_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "build/build_config.h"
-#include "ipc/ipc_export.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace IPC {
-
-class Message;
-
-// Implemented by consumers of a Channel to receive messages.
-class IPC_EXPORT Listener {
- public:
-  // Called when a message is received.  Returns true iff the message was
-  // handled.
-  virtual bool OnMessageReceived(const Message& message) = 0;
-
-  // Called when the channel is connected and we have received the internal
-  // Hello message from the peer.
-  virtual void OnChannelConnected(int32_t peer_pid) {}
-
-  // Called when an error is detected that causes the channel to close.
-  // This method is not called when a channel is closed normally.
-  virtual void OnChannelError() {}
-
-  // Called when a message's deserialization failed.
-  virtual void OnBadMessageReceived(const Message& message) {}
-
-  // Called when an associated interface request is received on a Channel and
-  // the Channel has no registered handler for it.
-  virtual void OnAssociatedInterfaceRequest(
-      const std::string& interface_name,
-      mojo::ScopedInterfaceEndpointHandle handle) {}
-
-#if defined(OS_POSIX)
-  // Called on the server side when a channel that listens for connections
-  // denies an attempt to connect.
-  virtual void OnChannelDenied() {}
-
-  // Called on the server side when a channel that listens for connections
-  // has an error that causes the listening channel to close.
-  virtual void OnChannelListenError() {}
-#endif  // OS_POSIX
-
- protected:
-  virtual ~Listener() {}
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_LISTENER_H_
diff --git a/ipc/ipc_message.cc b/ipc/ipc_message.cc
deleted file mode 100644
index f5e9ac7..0000000
--- a/ipc/ipc_message.cc
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright (c) 2012 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 "ipc/ipc_message.h"
-
-#include <limits.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/atomic_sequence_num.h"
-#include "base/logging.h"
-#include "build/build_config.h"
-#include "ipc/ipc_message_attachment.h"
-#include "ipc/ipc_message_attachment_set.h"
-
-#if defined(OS_POSIX)
-#include "base/file_descriptor_posix.h"
-#include "ipc/ipc_platform_file_attachment_posix.h"
-#endif
-
-namespace {
-
-base::StaticAtomicSequenceNumber g_ref_num;
-
-// Create a reference number for identifying IPC messages in traces. The return
-// values has the reference number stored in the upper 24 bits, leaving the low
-// 8 bits set to 0 for use as flags.
-inline uint32_t GetRefNumUpper24() {
-  base::trace_event::TraceLog* trace_log =
-      base::trace_event::TraceLog::GetInstance();
-  uint32_t pid = trace_log ? trace_log->process_id() : 0;
-  uint32_t count = g_ref_num.GetNext();
-  // The 24 bit hash is composed of 14 bits of the count and 10 bits of the
-  // Process ID. With the current trace event buffer cap, the 14-bit count did
-  // not appear to wrap during a trace. Note that it is not a big deal if
-  // collisions occur, as this is only used for debugging and trace analysis.
-  return ((pid << 14) | (count & 0x3fff)) << 8;
-}
-
-}  // namespace
-
-namespace IPC {
-
-//------------------------------------------------------------------------------
-
-Message::~Message() {
-}
-
-Message::Message() : base::Pickle(sizeof(Header)) {
-  header()->routing = header()->type = 0;
-  header()->flags = GetRefNumUpper24();
-#if defined(OS_POSIX)
-  header()->num_fds = 0;
-  header()->pad = 0;
-#endif
-  Init();
-}
-
-Message::Message(int32_t routing_id, uint32_t type, PriorityValue priority)
-    : base::Pickle(sizeof(Header)) {
-  header()->routing = routing_id;
-  header()->type = type;
-  DCHECK((priority & 0xffffff00) == 0);
-  header()->flags = priority | GetRefNumUpper24();
-#if defined(OS_POSIX)
-  header()->num_fds = 0;
-  header()->pad = 0;
-#endif
-  Init();
-}
-
-Message::Message(const char* data, int data_len)
-    : base::Pickle(data, data_len) {
-  Init();
-}
-
-Message::Message(const Message& other) : base::Pickle(other) {
-  Init();
-  attachment_set_ = other.attachment_set_;
-}
-
-void Message::Init() {
-  dispatch_error_ = false;
-#ifdef IPC_MESSAGE_LOG_ENABLED
-  received_time_ = 0;
-  dont_log_ = false;
-  log_data_ = NULL;
-#endif
-}
-
-Message& Message::operator=(const Message& other) {
-  *static_cast<base::Pickle*>(this) = other;
-  attachment_set_ = other.attachment_set_;
-  return *this;
-}
-
-void Message::SetHeaderValues(int32_t routing, uint32_t type, uint32_t flags) {
-  // This should only be called when the message is already empty.
-  DCHECK(payload_size() == 0);
-
-  header()->routing = routing;
-  header()->type = type;
-  header()->flags = flags;
-}
-
-void Message::EnsureMessageAttachmentSet() {
-  if (attachment_set_.get() == NULL)
-    attachment_set_ = new MessageAttachmentSet;
-}
-
-#ifdef IPC_MESSAGE_LOG_ENABLED
-void Message::set_sent_time(int64_t time) {
-  DCHECK((header()->flags & HAS_SENT_TIME_BIT) == 0);
-  header()->flags |= HAS_SENT_TIME_BIT;
-  WriteInt64(time);
-}
-
-int64_t Message::sent_time() const {
-  if ((header()->flags & HAS_SENT_TIME_BIT) == 0)
-    return 0;
-
-  const char* data = end_of_payload();
-  data -= sizeof(int64_t);
-  return *(reinterpret_cast<const int64_t*>(data));
-}
-
-void Message::set_received_time(int64_t time) const {
-  received_time_ = time;
-}
-#endif
-
-Message::NextMessageInfo::NextMessageInfo()
-    : message_size(0), message_found(false), pickle_end(nullptr),
-      message_end(nullptr) {}
-Message::NextMessageInfo::~NextMessageInfo() {}
-
-// static
-void Message::FindNext(const char* range_start,
-                       const char* range_end,
-                       NextMessageInfo* info) {
-  DCHECK(info);
-  info->message_found = false;
-  info->message_size = 0;
-
-  size_t pickle_size = 0;
-  if (!base::Pickle::PeekNext(sizeof(Header),
-                              range_start, range_end, &pickle_size))
-    return;
-
-  bool have_entire_pickle =
-      static_cast<size_t>(range_end - range_start) >= pickle_size;
-
-  info->message_size = pickle_size;
-
-  if (!have_entire_pickle)
-    return;
-
-  const char* pickle_end = range_start + pickle_size;
-
-  info->message_end = pickle_end;
-
-  info->pickle_end = pickle_end;
-  info->message_found = true;
-}
-
-bool Message::WriteAttachment(
-    scoped_refptr<base::Pickle::Attachment> attachment) {
-  size_t index;
-  bool success = attachment_set()->AddAttachment(
-      make_scoped_refptr(static_cast<MessageAttachment*>(attachment.get())),
-      &index);
-  DCHECK(success);
-
-  // NOTE: If you add more data to the pickle, make sure to update
-  // PickleSizer::AddAttachment.
-
-  // Write the index of the descriptor so that we don't have to
-  // keep the current descriptor as extra decoding state when deserialising.
-  WriteInt(static_cast<int>(index));
-
-  return success;
-}
-
-bool Message::ReadAttachment(
-    base::PickleIterator* iter,
-    scoped_refptr<base::Pickle::Attachment>* attachment) const {
-  int index;
-  if (!iter->ReadInt(&index))
-    return false;
-
-  MessageAttachmentSet* attachment_set = attachment_set_.get();
-  if (!attachment_set)
-    return false;
-
-  *attachment = attachment_set->GetAttachmentAt(index);
-
-  return nullptr != attachment->get();
-}
-
-bool Message::HasAttachments() const {
-  return attachment_set_.get() && !attachment_set_->empty();
-}
-
-}  // namespace IPC
diff --git a/ipc/ipc_message.h b/ipc/ipc_message.h
deleted file mode 100644
index 43e9ae3..0000000
--- a/ipc/ipc_message.h
+++ /dev/null
@@ -1,305 +0,0 @@
-// Copyright (c) 2012 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 IPC_IPC_MESSAGE_H_
-#define IPC_IPC_MESSAGE_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <string>
-
-#include "base/gtest_prod_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/pickle.h"
-#include "base/trace_event/trace_event.h"
-#include "build/build_config.h"
-#include "ipc/ipc_export.h"
-
-#if !defined(NDEBUG)
-#define IPC_MESSAGE_LOG_ENABLED
-#endif
-
-namespace IPC {
-
-namespace internal {
-class ChannelReader;
-}  // namespace internal
-
-//------------------------------------------------------------------------------
-
-struct LogData;
-class MessageAttachmentSet;
-
-class IPC_EXPORT Message : public base::Pickle {
- public:
-  enum PriorityValue {
-    PRIORITY_LOW = 1,
-    PRIORITY_NORMAL,
-    PRIORITY_HIGH
-  };
-
-  // Bit values used in the flags field.
-  // Upper 24 bits of flags store a reference number, so this enum is limited to
-  // 8 bits.
-  enum {
-    PRIORITY_MASK     = 0x03,  // Low 2 bits of store the priority value.
-    SYNC_BIT          = 0x04,
-    REPLY_BIT         = 0x08,
-    REPLY_ERROR_BIT   = 0x10,
-    UNBLOCK_BIT       = 0x20,
-    PUMPING_MSGS_BIT  = 0x40,
-    HAS_SENT_TIME_BIT = 0x80,
-  };
-
-  ~Message() override;
-
-  Message();
-
-  // Initialize a message with a user-defined type, priority value, and
-  // destination WebView ID.
-  Message(int32_t routing_id, uint32_t type, PriorityValue priority);
-
-  // Initializes a message from a const block of data.  The data is not copied;
-  // instead the data is merely referenced by this message.  Only const methods
-  // should be used on the message when initialized this way.
-  Message(const char* data, int data_len);
-
-  Message(const Message& other);
-  Message& operator=(const Message& other);
-
-  PriorityValue priority() const {
-    return static_cast<PriorityValue>(header()->flags & PRIORITY_MASK);
-  }
-
-  // True if this is a synchronous message.
-  void set_sync() {
-    header()->flags |= SYNC_BIT;
-  }
-  bool is_sync() const {
-    return (header()->flags & SYNC_BIT) != 0;
-  }
-
-  // Set this on a reply to a synchronous message.
-  void set_reply() {
-    header()->flags |= REPLY_BIT;
-  }
-
-  bool is_reply() const {
-    return (header()->flags & REPLY_BIT) != 0;
-  }
-
-  // Set this on a reply to a synchronous message to indicate that no receiver
-  // was found.
-  void set_reply_error() {
-    header()->flags |= REPLY_ERROR_BIT;
-  }
-
-  bool is_reply_error() const {
-    return (header()->flags & REPLY_ERROR_BIT) != 0;
-  }
-
-  // Normally when a receiver gets a message and they're blocked on a
-  // synchronous message Send, they buffer a message.  Setting this flag causes
-  // the receiver to be unblocked and the message to be dispatched immediately.
-  void set_unblock(bool unblock) {
-    if (unblock) {
-      header()->flags |= UNBLOCK_BIT;
-    } else {
-      header()->flags &= ~UNBLOCK_BIT;
-    }
-  }
-
-  bool should_unblock() const {
-    return (header()->flags & UNBLOCK_BIT) != 0;
-  }
-
-  // Tells the receiver that the caller is pumping messages while waiting
-  // for the result.
-  bool is_caller_pumping_messages() const {
-    return (header()->flags & PUMPING_MSGS_BIT) != 0;
-  }
-
-  void set_dispatch_error() const {
-    dispatch_error_ = true;
-  }
-
-  bool dispatch_error() const {
-    return dispatch_error_;
-  }
-
-  uint32_t type() const {
-    return header()->type;
-  }
-
-  int32_t routing_id() const {
-    return header()->routing;
-  }
-
-  void set_routing_id(int32_t new_id) {
-    header()->routing = new_id;
-  }
-
-  uint32_t flags() const {
-    return header()->flags;
-  }
-
-  // Sets all the given header values. The message should be empty at this
-  // call.
-  void SetHeaderValues(int32_t routing, uint32_t type, uint32_t flags);
-
-  template<class T, class S, class P>
-  static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter,
-                       void (T::*func)()) {
-    (obj->*func)();
-    return true;
-  }
-
-  template<class T, class S, class P>
-  static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter,
-                       void (T::*func)(P*)) {
-    (obj->*func)(parameter);
-    return true;
-  }
-
-  // Used for async messages with no parameters.
-  static void Log(std::string* name, const Message* msg, std::string* l) {
-  }
-
-  // The static method FindNext() returns several pieces of information, which
-  // are aggregated into an instance of this struct.
-  struct IPC_EXPORT NextMessageInfo {
-    NextMessageInfo();
-    ~NextMessageInfo();
-
-    // Total message size. Always valid if |message_found| is true.
-    // If |message_found| is false but we could determine message size
-    // from the header, this field is non-zero. Otherwise it's zero.
-    size_t message_size;
-    // Whether an entire message was found in the given memory range.
-    bool message_found;
-    // Only filled in if |message_found| is true.
-    // The start address is passed into FindNext() by the caller, so isn't
-    // repeated in this struct. The end address of the pickle should be used to
-    // construct a base::Pickle.
-    const char* pickle_end;
-    // Only filled in if |message_found| is true.
-    // The end address of the message should be used to determine the start
-    // address of the next message.
-    const char* message_end;
-  };
-
-  // |info| is an output parameter and must not be nullptr.
-  static void FindNext(const char* range_start,
-                       const char* range_end,
-                       NextMessageInfo* info);
-
-  // WriteAttachment appends |attachment| to the end of the set. It returns
-  // false iff the set is full.
-  bool WriteAttachment(
-      scoped_refptr<base::Pickle::Attachment> attachment) override;
-  // ReadAttachment parses an attachment given the parsing state |iter| and
-  // writes it to |*attachment|. It returns true on success.
-  bool ReadAttachment(
-      base::PickleIterator* iter,
-      scoped_refptr<base::Pickle::Attachment>* attachment) const override;
-  // Returns true if there are any attachment in this message.
-  bool HasAttachments() const override;
-
-#ifdef IPC_MESSAGE_LOG_ENABLED
-  // Adds the outgoing time from Time::Now() at the end of the message and sets
-  // a bit to indicate that it's been added.
-  void set_sent_time(int64_t time);
-  int64_t sent_time() const;
-
-  void set_received_time(int64_t time) const;
-  int64_t received_time() const { return received_time_; }
-  void set_output_params(const std::string& op) const { output_params_ = op; }
-  const std::string& output_params() const { return output_params_; }
-  // The following four functions are needed so we can log sync messages with
-  // delayed replies.  We stick the log data from the sent message into the
-  // reply message, so that when it's sent and we have the output parameters
-  // we can log it.  As such, we set a flag on the sent message to not log it.
-  void set_sync_log_data(LogData* data) const { log_data_ = data; }
-  LogData* sync_log_data() const { return log_data_; }
-  void set_dont_log() const { dont_log_ = true; }
-  bool dont_log() const { return dont_log_; }
-#endif
-
- protected:
-  friend class Channel;
-  friend class ChannelMojo;
-  friend class ChannelNacl;
-  friend class ChannelPosix;
-  friend class ChannelWin;
-  friend class internal::ChannelReader;
-  friend class MessageReplyDeserializer;
-  friend class SyncMessage;
-
-#pragma pack(push, 4)
-  struct Header : base::Pickle::Header {
-    int32_t routing;  // ID of the view that this message is destined for
-    uint32_t type;    // specifies the user-defined message type
-    uint32_t flags;   // specifies control flags for the message
-#if defined(OS_POSIX)
-    uint16_t num_fds; // the number of descriptors included with this message
-    uint16_t pad;     // explicitly initialize this to appease valgrind
-#endif
-  };
-#pragma pack(pop)
-
-  Header* header() {
-    return headerT<Header>();
-  }
-  const Header* header() const {
-    return headerT<Header>();
-  }
-
-  void Init();
-
-  // Used internally to support IPC::Listener::OnBadMessageReceived.
-  mutable bool dispatch_error_;
-
-  // The set of file descriptors associated with this message.
-  scoped_refptr<MessageAttachmentSet> attachment_set_;
-
-  // Ensure that a MessageAttachmentSet is allocated
-  void EnsureMessageAttachmentSet();
-
-  MessageAttachmentSet* attachment_set() {
-    EnsureMessageAttachmentSet();
-    return attachment_set_.get();
-  }
-  const MessageAttachmentSet* attachment_set() const {
-    return attachment_set_.get();
-  }
-
-#ifdef IPC_MESSAGE_LOG_ENABLED
-  // Used for logging.
-  mutable int64_t received_time_;
-  mutable std::string output_params_;
-  mutable LogData* log_data_;
-  mutable bool dont_log_;
-#endif
-
-  FRIEND_TEST_ALL_PREFIXES(IPCMessageTest, FindNext);
-  FRIEND_TEST_ALL_PREFIXES(IPCMessageTest, FindNextOverflow);
-};
-
-//------------------------------------------------------------------------------
-
-}  // namespace IPC
-
-enum SpecialRoutingIDs {
-  // indicates that we don't have a routing ID yet.
-  MSG_ROUTING_NONE = -2,
-
-  // indicates a general message not sent to a particular tab.
-  MSG_ROUTING_CONTROL = INT32_MAX,
-};
-
-#define IPC_REPLY_ID 0xFFFFFFF0  // Special message id for replies
-#define IPC_LOGGING_ID 0xFFFFFFF1  // Special message id for logging
-
-#endif  // IPC_IPC_MESSAGE_H_
diff --git a/ipc/ipc_message_attachment.cc b/ipc/ipc_message_attachment.cc
deleted file mode 100644
index 83440ae..0000000
--- a/ipc/ipc_message_attachment.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2015 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 "ipc/ipc_message_attachment.h"
-
-namespace IPC {
-
-MessageAttachment::MessageAttachment() {
-}
-
-MessageAttachment::~MessageAttachment() {
-}
-
-}  // namespace IPC
diff --git a/ipc/ipc_message_attachment.h b/ipc/ipc_message_attachment.h
deleted file mode 100644
index 9ff1de8..0000000
--- a/ipc/ipc_message_attachment.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2015 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 IPC_IPC_MESSAGE_ATTACHMENT_H_
-#define IPC_IPC_MESSAGE_ATTACHMENT_H_
-
-#include "base/files/file.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/pickle.h"
-#include "build/build_config.h"
-#include "ipc/ipc.mojom.h"
-#include "ipc/ipc_export.h"
-
-namespace IPC {
-
-// Auxiliary data sent with |Message|. This can be a platform file descriptor
-// or a mojo |MessagePipe|. |GetType()| returns the type of the subclass.
-class IPC_EXPORT MessageAttachment : public base::Pickle::Attachment {
- public:
-  using Type = mojom::SerializedHandle::Type;
-
-  virtual Type GetType() const = 0;
-
- protected:
-  friend class base::RefCountedThreadSafe<MessageAttachment>;
-  MessageAttachment();
-  ~MessageAttachment() override;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageAttachment);
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_MESSAGE_ATTACHMENT_H_
diff --git a/ipc/ipc_message_attachment_set.cc b/ipc/ipc_message_attachment_set.cc
deleted file mode 100644
index b9a990d..0000000
--- a/ipc/ipc_message_attachment_set.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ipc/ipc_message_attachment_set.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "base/posix/eintr_wrapper.h"
-#include "build/build_config.h"
-#include "ipc/ipc_message_attachment.h"
-
-namespace IPC {
-
-namespace {
-
-unsigned count_attachments_of_type(
-    const std::vector<scoped_refptr<MessageAttachment>>& attachments,
-    MessageAttachment::Type type) {
-  unsigned count = 0;
-  for (const scoped_refptr<MessageAttachment>& attachment : attachments) {
-    if (attachment->GetType() == type)
-      ++count;
-  }
-  return count;
-}
-
-}  // namespace
-
-MessageAttachmentSet::MessageAttachmentSet()
-    : consumed_descriptor_highwater_(0) {
-}
-
-MessageAttachmentSet::~MessageAttachmentSet() {
-  if (consumed_descriptor_highwater_ == size())
-    return;
-
-  // We close all the owning descriptors. If this message should have
-  // been transmitted, then closing those with close flags set mirrors
-  // the expected behaviour.
-  //
-  // If this message was received with more descriptors than expected
-  // (which could a DOS against the browser by a rogue renderer) then all
-  // the descriptors have their close flag set and we free all the extra
-  // kernel resources.
-  LOG(WARNING) << "MessageAttachmentSet destroyed with unconsumed attachments: "
-               << consumed_descriptor_highwater_ << "/" << size();
-}
-
-unsigned MessageAttachmentSet::num_descriptors() const {
-  return count_attachments_of_type(attachments_,
-                                   MessageAttachment::Type::PLATFORM_FILE);
-}
-
-unsigned MessageAttachmentSet::size() const {
-  return static_cast<unsigned>(attachments_.size());
-}
-
-bool MessageAttachmentSet::AddAttachment(
-    scoped_refptr<MessageAttachment> attachment,
-    size_t* index) {
-#if defined(OS_POSIX)
-  if (attachment->GetType() == MessageAttachment::Type::PLATFORM_FILE &&
-      num_descriptors() == kMaxDescriptorsPerMessage) {
-    DLOG(WARNING) << "Cannot add file descriptor. MessageAttachmentSet full.";
-    return false;
-  }
-#endif
-
-  switch (attachment->GetType()) {
-    case MessageAttachment::Type::PLATFORM_FILE:
-    case MessageAttachment::Type::MOJO_HANDLE:
-    case MessageAttachment::Type::WIN_HANDLE:
-    case MessageAttachment::Type::MACH_PORT:
-      attachments_.push_back(attachment);
-      *index = attachments_.size() - 1;
-      return true;
-  }
-  return false;
-}
-
-bool MessageAttachmentSet::AddAttachment(
-    scoped_refptr<MessageAttachment> attachment) {
-  size_t index;
-  return AddAttachment(attachment, &index);
-}
-
-scoped_refptr<MessageAttachment> MessageAttachmentSet::GetAttachmentAt(
-    unsigned index) {
-  if (index >= size()) {
-    DLOG(WARNING) << "Accessing out of bound index:" << index << "/" << size();
-    return scoped_refptr<MessageAttachment>();
-  }
-
-  // We should always walk the descriptors in order, so it's reasonable to
-  // enforce this. Consider the case where a compromised renderer sends us
-  // the following message:
-  //
-  //   ExampleMsg:
-  //     num_fds:2 msg:FD(index = 1) control:SCM_RIGHTS {n, m}
-  //
-  // Here the renderer sent us a message which should have a descriptor, but
-  // actually sent two in an attempt to fill our fd table and kill us. By
-  // setting the index of the descriptor in the message to 1 (it should be
-  // 0), we would record a highwater of 1 and then consider all the
-  // descriptors to have been used.
-  //
-  // So we can either track of the use of each descriptor in a bitset, or we
-  // can enforce that we walk the indexes strictly in order.
-  //
-  // There's one more wrinkle: When logging messages, we may reparse them. So
-  // we have an exception: When the consumed_descriptor_highwater_ is at the
-  // end of the array and index 0 is requested, we reset the highwater value.
-  // TODO(morrita): This is absurd. This "wringle" disallow to introduce clearer
-  // ownership model. Only client is NaclIPCAdapter. See crbug.com/415294
-  if (index == 0 && consumed_descriptor_highwater_ == size()) {
-    consumed_descriptor_highwater_ = 0;
-  }
-
-  if (index != consumed_descriptor_highwater_)
-    return scoped_refptr<MessageAttachment>();
-
-  consumed_descriptor_highwater_ = index + 1;
-
-  return attachments_[index];
-}
-
-void MessageAttachmentSet::CommitAllDescriptors() {
-  attachments_.clear();
-  consumed_descriptor_highwater_ = 0;
-}
-
-}  // namespace IPC
diff --git a/ipc/ipc_message_attachment_set.h b/ipc/ipc_message_attachment_set.h
deleted file mode 100644
index de37211..0000000
--- a/ipc/ipc_message_attachment_set.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IPC_IPC_MESSAGE_ATTACHMENT_SET_H_
-#define IPC_IPC_MESSAGE_ATTACHMENT_SET_H_
-
-#include <stddef.h>
-
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "build/build_config.h"
-#include "ipc/ipc_export.h"
-
-namespace IPC {
-
-class MessageAttachment;
-
-// -----------------------------------------------------------------------------
-// A MessageAttachmentSet is an ordered set of MessageAttachment objects
-// associated with an IPC message. All attachments are wrapped in a mojo handle
-// if necessary and sent over the mojo message pipe.
-//
-// For ChannelNacl under SFI NaCl, only Type::PLATFORM_FILE is supported. In
-// that case, the FD is sent over socket.
-// -----------------------------------------------------------------------------
-class IPC_EXPORT MessageAttachmentSet
-    : public base::RefCountedThreadSafe<MessageAttachmentSet> {
- public:
-  MessageAttachmentSet();
-
-  // Return the number of attachments
-  unsigned size() const;
-
-  // Return true if no unconsumed descriptors remain
-  bool empty() const { return attachments_.empty(); }
-
-  // Returns whether the attachment was successfully added.
-  // |index| is an output variable. On success, it contains the index of the
-  // newly added attachment.
-  bool AddAttachment(scoped_refptr<MessageAttachment> attachment,
-                     size_t* index);
-
-  // Similar to the above method, but without output variables.
-  bool AddAttachment(scoped_refptr<MessageAttachment> attachment);
-
-  // Take the nth from the beginning of the vector, Code using this /must/
-  // access the attachments in order, and must do it at most once.
-  //
-  // This interface is designed for the deserialising code as it doesn't
-  // support close flags.
-  //   returns: an attachment, or nullptr on error
-  scoped_refptr<MessageAttachment> GetAttachmentAt(unsigned index);
-
-  // Marks all the descriptors as consumed and closes those which are
-  // auto-close.
-  void CommitAllDescriptors();
-
-#if defined(OS_POSIX)
-  // This is the maximum number of descriptors per message. We need to know this
-  // because the control message kernel interface has to be given a buffer which
-  // is large enough to store all the descriptor numbers. Otherwise the kernel
-  // tells us that it truncated the control data and the extra descriptors are
-  // lost.
-  //
-  // In debugging mode, it's a fatal error to try and add more than this number
-  // of descriptors to a MessageAttachmentSet.
-  static const size_t kMaxDescriptorsPerMessage = 7;
-#endif  // OS_POSIX
-
-  // ---------------------------------------------------------------------------
-
- private:
-  friend class base::RefCountedThreadSafe<MessageAttachmentSet>;
-
-  ~MessageAttachmentSet();
-
-  // Return the number of file descriptors
-  unsigned num_descriptors() const;
-
-  std::vector<scoped_refptr<MessageAttachment>> attachments_;
-
-  // This contains the index of the next descriptor which should be consumed.
-  // It's used in a couple of ways. Firstly, at destruction we can check that
-  // all the descriptors have been read (with GetNthDescriptor). Secondly, we
-  // can check that they are read in order.
-  unsigned consumed_descriptor_highwater_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageAttachmentSet);
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_MESSAGE_ATTACHMENT_SET_H_
diff --git a/ipc/ipc_message_start.h b/ipc/ipc_message_start.h
deleted file mode 100644
index 1368635..0000000
--- a/ipc/ipc_message_start.h
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2012 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 IPC_IPC_MESSAGE_START_H_
-#define IPC_IPC_MESSAGE_START_H_
-
-// Used by IPC_BEGIN_MESSAGES so that each message class starts from a unique
-// base.  Messages have unique IDs across channels in order for the IPC logging
-// code to figure out the message class from its ID.
-enum IPCMessageStart {
-  AutomationMsgStart = 0,
-  FrameMsgStart,
-  PageMsgStart,
-  ViewMsgStart,
-  InputMsgStart,
-  ProfileImportMsgStart,
-  TestMsgStart,
-  DevToolsMsgStart,
-  WorkerMsgStart,
-  NaClMsgStart,
-  UtilityMsgStart,
-  GpuChannelMsgStart,
-  GpuMsgStart,
-  MediaMsgStart,
-  ServiceMsgStart,
-  PpapiMsgStart,
-  FirefoxImporterUnittestMsgStart,
-  FileUtilitiesMsgStart,
-  DatabaseMsgStart,
-  DOMStorageMsgStart,
-  SpeechRecognitionMsgStart,
-  SafeBrowsingMsgStart,
-  P2PMsgStart,
-  ResourceMsgStart,
-  FileSystemMsgStart,
-  ChildProcessMsgStart,
-  ClipboardMsgStart,
-  BlobMsgStart,
-  AppCacheMsgStart,
-  AudioMsgStart,
-  MidiMsgStart,
-  ChromeMsgStart,
-  DragMsgStart,
-  PrintMsgStart,
-  SpellCheckMsgStart,
-  ExtensionMsgStart,
-  VideoCaptureMsgStart,
-  QuotaMsgStart,
-  TextInputClientMsgStart,
-  ChromeUtilityMsgStart,
-  MediaStreamMsgStart,
-  ChromeBenchmarkingMsgStart,
-  JavaBridgeMsgStart,
-  GamepadMsgStart,
-  ShellMsgStart,
-  AccessibilityMsgStart,
-  PrefetchMsgStart,
-  PrerenderMsgStart,
-  ChromotingMsgStart,
-  BrowserPluginMsgStart,
-  AndroidWebViewMsgStart,
-  MetroViewerMsgStart,
-  CCMsgStart,
-  MediaPlayerMsgStart,
-  TracingMsgStart,
-  PeerConnectionTrackerMsgStart,
-  VisitedLinkMsgStart,
-  AppShimMsgStart,
-  WebRtcLoggingMsgStart,
-  TtsMsgStart,
-  WebSocketMsgStart,
-  NaClHostMsgStart,
-  WebRTCIdentityMsgStart,
-  PowerMonitorMsgStart,
-  EncryptedMediaMsgStart,
-  CacheStorageMsgStart,
-  ServiceWorkerMsgStart,
-  MessagePortMsgStart,
-  EmbeddedWorkerMsgStart,
-  EmbeddedWorkerContextMsgStart,
-  CastMsgStart,
-  CdmMsgStart,
-  MediaStreamTrackMetricsHostMsgStart,
-  ChromeExtensionMsgStart,
-  PushMessagingMsgStart,
-  GinJavaBridgeMsgStart,
-  ChromeUtilityPrintingMsgStart,
-  AecDumpMsgStart,
-  OzoneGpuMsgStart,
-  ChromeUtilityExtensionsMsgStart,
-  PlatformNotificationMsgStart,
-  PDFMsgStart,
-  ManifestManagerMsgStart,
-  LayoutTestMsgStart,
-  NetworkHintsMsgStart,
-  BluetoothMsgStart,
-  CastMediaMsgStart,
-  AwMessagePortMsgStart,
-  SyncCompositorMsgStart,
-  ExtensionsGuestViewMsgStart,
-  GuestViewMsgStart,
-  // Note: CastCryptoMsgStart and CastChannelMsgStart reserved for Chromecast
-  // internal code. Contact gunsch@ before changing/removing.
-  CastCryptoMsgStart,
-  CastChannelMsgStart,
-  DataReductionProxyStart,
-  ChromeAppBannerMsgStart,
-  AttachmentBrokerMsgStart,
-  RenderProcessMsgStart,
-  PageLoadMetricsMsgStart,
-  MemoryMsgStart,
-  IPCTestMsgStart,
-  ArcInstanceMsgStart,
-  ArcInstanceHostMsgStart,
-  DistillerMsgStart,
-  ArcCameraMsgStart,
-  DWriteFontProxyMsgStart,
-  MediaPlayerDelegateMsgStart,
-  SurfaceViewManagerMsgStart,
-  ExtensionWorkerMsgStart,
-  SubresourceFilterMsgStart,
-  LastIPCMsgStart  // Must come last.
-};
-
-#endif  // IPC_IPC_MESSAGE_START_H_
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc
deleted file mode 100644
index bf8daa5..0000000
--- a/ipc/ipc_message_utils.cc
+++ /dev/null
@@ -1,1238 +0,0 @@
-// Copyright (c) 2012 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 "ipc/ipc_message_utils.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/files/file_path.h"
-#include "base/json/json_writer.h"
-#include "base/strings/nullable_string16.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
-#include "base/unguessable_token.h"
-#include "base/values.h"
-#include "build/build_config.h"
-#include "ipc/ipc_channel_handle.h"
-#include "ipc/ipc_message_attachment.h"
-#include "ipc/ipc_message_attachment_set.h"
-#include "ipc/ipc_mojo_param_traits.h"
-
-#if defined(OS_POSIX)
-#include "base/file_descriptor_posix.h"
-#include "ipc/ipc_platform_file_attachment_posix.h"
-#endif
-
-#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
-#include "base/memory/shared_memory_handle.h"
-#endif  // (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "ipc/mach_port_mac.h"
-#endif
-
-#if defined(OS_WIN)
-#include <tchar.h>
-#include "ipc/handle_win.h"
-#endif
-
-namespace IPC {
-
-namespace {
-
-const int kMaxRecursionDepth = 200;
-
-template<typename CharType>
-void LogBytes(const std::vector<CharType>& data, std::string* out) {
-#if defined(OS_WIN)
-  // Windows has a GUI for logging, which can handle arbitrary binary data.
-  for (size_t i = 0; i < data.size(); ++i)
-    out->push_back(data[i]);
-#else
-  // On POSIX, we log to stdout, which we assume can display ASCII.
-  static const size_t kMaxBytesToLog = 100;
-  for (size_t i = 0; i < std::min(data.size(), kMaxBytesToLog); ++i) {
-    if (isprint(data[i]))
-      out->push_back(data[i]);
-    else
-      out->append(
-          base::StringPrintf("[%02X]", static_cast<unsigned char>(data[i])));
-  }
-  if (data.size() > kMaxBytesToLog) {
-    out->append(base::StringPrintf(
-        " and %u more bytes",
-        static_cast<unsigned>(data.size() - kMaxBytesToLog)));
-  }
-#endif
-}
-
-bool ReadValue(const base::Pickle* m,
-               base::PickleIterator* iter,
-               base::Value** value,
-               int recursion);
-
-void GetValueSize(base::PickleSizer* sizer,
-                  const base::Value* value,
-                  int recursion) {
-  if (recursion > kMaxRecursionDepth) {
-    LOG(ERROR) << "Max recursion depth hit in GetValueSize.";
-    return;
-  }
-
-  sizer->AddInt();
-  switch (value->GetType()) {
-    case base::Value::Type::NONE:
-      break;
-    case base::Value::Type::BOOLEAN:
-      sizer->AddBool();
-      break;
-    case base::Value::Type::INTEGER:
-      sizer->AddInt();
-      break;
-    case base::Value::Type::DOUBLE:
-      sizer->AddDouble();
-      break;
-    case base::Value::Type::STRING: {
-      const base::Value* result;
-      value->GetAsString(&result);
-      if (value->GetAsString(&result)) {
-        DCHECK(result);
-        GetParamSize(sizer, result->GetString());
-      } else {
-        std::string str;
-        bool as_string_result = value->GetAsString(&str);
-        DCHECK(as_string_result);
-        GetParamSize(sizer, str);
-      }
-      break;
-    }
-    case base::Value::Type::BINARY: {
-      sizer->AddData(static_cast<int>(value->GetSize()));
-      break;
-    }
-    case base::Value::Type::DICTIONARY: {
-      sizer->AddInt();
-      const base::DictionaryValue* dict =
-          static_cast<const base::DictionaryValue*>(value);
-      for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd();
-           it.Advance()) {
-        GetParamSize(sizer, it.key());
-        GetValueSize(sizer, &it.value(), recursion + 1);
-      }
-      break;
-    }
-    case base::Value::Type::LIST: {
-      sizer->AddInt();
-      const base::ListValue* list = static_cast<const base::ListValue*>(value);
-      for (const auto& entry : *list) {
-        GetValueSize(sizer, entry.get(), recursion + 1);
-      }
-      break;
-    }
-    default:
-      NOTREACHED() << "Invalid base::Value type.";
-  }
-}
-
-void WriteValue(base::Pickle* m, const base::Value* value, int recursion) {
-  bool result;
-  if (recursion > kMaxRecursionDepth) {
-    LOG(ERROR) << "Max recursion depth hit in WriteValue.";
-    return;
-  }
-
-  m->WriteInt(static_cast<int>(value->GetType()));
-
-  switch (value->GetType()) {
-    case base::Value::Type::NONE:
-    break;
-    case base::Value::Type::BOOLEAN: {
-      bool val;
-      result = value->GetAsBoolean(&val);
-      DCHECK(result);
-      WriteParam(m, val);
-      break;
-    }
-    case base::Value::Type::INTEGER: {
-      int val;
-      result = value->GetAsInteger(&val);
-      DCHECK(result);
-      WriteParam(m, val);
-      break;
-    }
-    case base::Value::Type::DOUBLE: {
-      double val;
-      result = value->GetAsDouble(&val);
-      DCHECK(result);
-      WriteParam(m, val);
-      break;
-    }
-    case base::Value::Type::STRING: {
-      std::string val;
-      result = value->GetAsString(&val);
-      DCHECK(result);
-      WriteParam(m, val);
-      break;
-    }
-    case base::Value::Type::BINARY: {
-      m->WriteData(value->GetBuffer(), static_cast<int>(value->GetSize()));
-      break;
-    }
-    case base::Value::Type::DICTIONARY: {
-      const base::DictionaryValue* dict =
-          static_cast<const base::DictionaryValue*>(value);
-
-      WriteParam(m, static_cast<int>(dict->size()));
-
-      for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd();
-           it.Advance()) {
-        WriteParam(m, it.key());
-        WriteValue(m, &it.value(), recursion + 1);
-      }
-      break;
-    }
-    case base::Value::Type::LIST: {
-      const base::ListValue* list = static_cast<const base::ListValue*>(value);
-      WriteParam(m, static_cast<int>(list->GetSize()));
-      for (const auto& entry : *list) {
-        WriteValue(m, entry.get(), recursion + 1);
-      }
-      break;
-    }
-  }
-}
-
-// Helper for ReadValue that reads a DictionaryValue into a pre-allocated
-// object.
-bool ReadDictionaryValue(const base::Pickle* m,
-                         base::PickleIterator* iter,
-                         base::DictionaryValue* value,
-                         int recursion) {
-  int size;
-  if (!ReadParam(m, iter, &size))
-    return false;
-
-  for (int i = 0; i < size; ++i) {
-    std::string key;
-    base::Value* subval;
-    if (!ReadParam(m, iter, &key) ||
-        !ReadValue(m, iter, &subval, recursion + 1))
-      return false;
-    value->SetWithoutPathExpansion(key, subval);
-  }
-
-  return true;
-}
-
-// Helper for ReadValue that reads a ReadListValue into a pre-allocated
-// object.
-bool ReadListValue(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   base::ListValue* value,
-                   int recursion) {
-  int size;
-  if (!ReadParam(m, iter, &size))
-    return false;
-
-  for (int i = 0; i < size; ++i) {
-    base::Value* subval;
-    if (!ReadValue(m, iter, &subval, recursion + 1))
-      return false;
-    value->Set(i, subval);
-  }
-
-  return true;
-}
-
-bool ReadValue(const base::Pickle* m,
-               base::PickleIterator* iter,
-               base::Value** value,
-               int recursion) {
-  if (recursion > kMaxRecursionDepth) {
-    LOG(ERROR) << "Max recursion depth hit in ReadValue.";
-    return false;
-  }
-
-  int type;
-  if (!ReadParam(m, iter, &type))
-    return false;
-
-  switch (static_cast<base::Value::Type>(type)) {
-    case base::Value::Type::NONE:
-      *value = base::Value::CreateNullValue().release();
-    break;
-    case base::Value::Type::BOOLEAN: {
-      bool val;
-      if (!ReadParam(m, iter, &val))
-        return false;
-      *value = new base::Value(val);
-      break;
-    }
-    case base::Value::Type::INTEGER: {
-      int val;
-      if (!ReadParam(m, iter, &val))
-        return false;
-      *value = new base::Value(val);
-      break;
-    }
-    case base::Value::Type::DOUBLE: {
-      double val;
-      if (!ReadParam(m, iter, &val))
-        return false;
-      *value = new base::Value(val);
-      break;
-    }
-    case base::Value::Type::STRING: {
-      std::string val;
-      if (!ReadParam(m, iter, &val))
-        return false;
-      *value = new base::Value(val);
-      break;
-    }
-    case base::Value::Type::BINARY: {
-      const char* data;
-      int length;
-      if (!iter->ReadData(&data, &length))
-        return false;
-      std::unique_ptr<base::BinaryValue> val =
-          base::BinaryValue::CreateWithCopiedBuffer(data, length);
-      *value = val.release();
-      break;
-    }
-    case base::Value::Type::DICTIONARY: {
-      std::unique_ptr<base::DictionaryValue> val(new base::DictionaryValue());
-      if (!ReadDictionaryValue(m, iter, val.get(), recursion))
-        return false;
-      *value = val.release();
-      break;
-    }
-    case base::Value::Type::LIST: {
-      std::unique_ptr<base::ListValue> val(new base::ListValue());
-      if (!ReadListValue(m, iter, val.get(), recursion))
-        return false;
-      *value = val.release();
-      break;
-    }
-    default:
-    return false;
-  }
-
-  return true;
-}
-
-}  // namespace
-
-// -----------------------------------------------------------------------------
-
-LogData::LogData()
-    : routing_id(0),
-      type(0),
-      sent(0),
-      receive(0),
-      dispatch(0) {
-}
-
-LogData::LogData(const LogData& other) = default;
-
-LogData::~LogData() {
-}
-
-void ParamTraits<bool>::Log(const param_type& p, std::string* l) {
-  l->append(p ? "true" : "false");
-}
-
-void ParamTraits<signed char>::GetSize(base::PickleSizer* sizer,
-                                       const param_type& p) {
-  sizer->AddBytes(sizeof(param_type));
-}
-
-void ParamTraits<signed char>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteBytes(&p, sizeof(param_type));
-}
-
-bool ParamTraits<signed char>::Read(const base::Pickle* m,
-                                    base::PickleIterator* iter,
-                                    param_type* r) {
-  const char* data;
-  if (!iter->ReadBytes(&data, sizeof(param_type)))
-    return false;
-  memcpy(r, data, sizeof(param_type));
-  return true;
-}
-
-void ParamTraits<signed char>::Log(const param_type& p, std::string* l) {
-  l->append(base::IntToString(p));
-}
-
-void ParamTraits<unsigned char>::GetSize(base::PickleSizer* sizer,
-                                       const param_type& p) {
-  sizer->AddBytes(sizeof(param_type));
-}
-
-void ParamTraits<unsigned char>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteBytes(&p, sizeof(param_type));
-}
-
-bool ParamTraits<unsigned char>::Read(const base::Pickle* m,
-                                      base::PickleIterator* iter,
-                                      param_type* r) {
-  const char* data;
-  if (!iter->ReadBytes(&data, sizeof(param_type)))
-    return false;
-  memcpy(r, data, sizeof(param_type));
-  return true;
-}
-
-void ParamTraits<unsigned char>::Log(const param_type& p, std::string* l) {
-  l->append(base::UintToString(p));
-}
-
-void ParamTraits<unsigned short>::GetSize(base::PickleSizer* sizer,
-                                          const param_type& p) {
-  sizer->AddBytes(sizeof(param_type));
-}
-
-void ParamTraits<unsigned short>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteBytes(&p, sizeof(param_type));
-}
-
-bool ParamTraits<unsigned short>::Read(const base::Pickle* m,
-                                       base::PickleIterator* iter,
-                                       param_type* r) {
-  const char* data;
-  if (!iter->ReadBytes(&data, sizeof(param_type)))
-    return false;
-  memcpy(r, data, sizeof(param_type));
-  return true;
-}
-
-void ParamTraits<unsigned short>::Log(const param_type& p, std::string* l) {
-  l->append(base::UintToString(p));
-}
-
-void ParamTraits<int>::Log(const param_type& p, std::string* l) {
-  l->append(base::IntToString(p));
-}
-
-void ParamTraits<unsigned int>::Log(const param_type& p, std::string* l) {
-  l->append(base::UintToString(p));
-}
-
-#if defined(OS_WIN) || defined(OS_LINUX) || \
-    (defined(OS_ANDROID) && defined(ARCH_CPU_64_BITS))
-void ParamTraits<long>::Log(const param_type& p, std::string* l) {
-  l->append(base::Int64ToString(static_cast<int64_t>(p)));
-}
-
-void ParamTraits<unsigned long>::Log(const param_type& p, std::string* l) {
-  l->append(base::Uint64ToString(static_cast<uint64_t>(p)));
-}
-#endif
-
-void ParamTraits<long long>::Log(const param_type& p, std::string* l) {
-  l->append(base::Int64ToString(static_cast<int64_t>(p)));
-}
-
-void ParamTraits<unsigned long long>::Log(const param_type& p, std::string* l) {
-  l->append(base::Uint64ToString(p));
-}
-
-void ParamTraits<float>::Log(const param_type& p, std::string* l) {
-  l->append(base::StringPrintf("%e", p));
-}
-
-void ParamTraits<double>::GetSize(base::PickleSizer* sizer,
-                                  const param_type& p) {
-  sizer->AddBytes(sizeof(param_type));
-}
-
-void ParamTraits<double>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteBytes(reinterpret_cast<const char*>(&p), sizeof(param_type));
-}
-
-bool ParamTraits<double>::Read(const base::Pickle* m,
-                               base::PickleIterator* iter,
-                               param_type* r) {
-  const char *data;
-  if (!iter->ReadBytes(&data, sizeof(*r))) {
-    NOTREACHED();
-    return false;
-  }
-  memcpy(r, data, sizeof(param_type));
-  return true;
-}
-
-void ParamTraits<double>::Log(const param_type& p, std::string* l) {
-  l->append(base::StringPrintf("%e", p));
-}
-
-
-void ParamTraits<std::string>::Log(const param_type& p, std::string* l) {
-  l->append(p);
-}
-
-void ParamTraits<base::string16>::Log(const param_type& p, std::string* l) {
-  l->append(base::UTF16ToUTF8(p));
-}
-
-void ParamTraits<std::vector<char>>::GetSize(base::PickleSizer* sizer,
-                                             const param_type& p) {
-  sizer->AddData(static_cast<int>(p.size()));
-}
-
-void ParamTraits<std::vector<char>>::Write(base::Pickle* m,
-                                           const param_type& p) {
-  if (p.empty()) {
-    m->WriteData(NULL, 0);
-  } else {
-    m->WriteData(&p.front(), static_cast<int>(p.size()));
-  }
-}
-
-bool ParamTraits<std::vector<char>>::Read(const base::Pickle* m,
-                                          base::PickleIterator* iter,
-                                          param_type* r) {
-  const char *data;
-  int data_size = 0;
-  if (!iter->ReadData(&data, &data_size) || data_size < 0)
-    return false;
-  r->resize(data_size);
-  if (data_size)
-    memcpy(&r->front(), data, data_size);
-  return true;
-}
-
-void ParamTraits<std::vector<char> >::Log(const param_type& p, std::string* l) {
-  LogBytes(p, l);
-}
-
-void ParamTraits<std::vector<unsigned char>>::GetSize(base::PickleSizer* sizer,
-                                                      const param_type& p) {
-  sizer->AddData(static_cast<int>(p.size()));
-}
-
-void ParamTraits<std::vector<unsigned char>>::Write(base::Pickle* m,
-                                                    const param_type& p) {
-  if (p.empty()) {
-    m->WriteData(NULL, 0);
-  } else {
-    m->WriteData(reinterpret_cast<const char*>(&p.front()),
-                 static_cast<int>(p.size()));
-  }
-}
-
-bool ParamTraits<std::vector<unsigned char>>::Read(const base::Pickle* m,
-                                                   base::PickleIterator* iter,
-                                                   param_type* r) {
-  const char *data;
-  int data_size = 0;
-  if (!iter->ReadData(&data, &data_size) || data_size < 0)
-    return false;
-  r->resize(data_size);
-  if (data_size)
-    memcpy(&r->front(), data, data_size);
-  return true;
-}
-
-void ParamTraits<std::vector<unsigned char> >::Log(const param_type& p,
-                                                   std::string* l) {
-  LogBytes(p, l);
-}
-
-void ParamTraits<std::vector<bool>>::GetSize(base::PickleSizer* sizer,
-                                             const param_type& p) {
-  GetParamSize(sizer, static_cast<int>(p.size()));
-  for (size_t i = 0; i < p.size(); ++i)
-    GetParamSize(sizer, static_cast<bool>(p[i]));
-}
-
-void ParamTraits<std::vector<bool>>::Write(base::Pickle* m,
-                                           const param_type& p) {
-  WriteParam(m, static_cast<int>(p.size()));
-  // Cast to bool below is required because libc++'s
-  // vector<bool>::const_reference is different from bool, and we want to avoid
-  // writing an extra specialization of ParamTraits for it.
-  for (size_t i = 0; i < p.size(); i++)
-    WriteParam(m, static_cast<bool>(p[i]));
-}
-
-bool ParamTraits<std::vector<bool>>::Read(const base::Pickle* m,
-                                          base::PickleIterator* iter,
-                                          param_type* r) {
-  int size;
-  // ReadLength() checks for < 0 itself.
-  if (!iter->ReadLength(&size))
-    return false;
-  r->resize(size);
-  for (int i = 0; i < size; i++) {
-    bool value;
-    if (!ReadParam(m, iter, &value))
-      return false;
-    (*r)[i] = value;
-  }
-  return true;
-}
-
-void ParamTraits<std::vector<bool> >::Log(const param_type& p, std::string* l) {
-  for (size_t i = 0; i < p.size(); ++i) {
-    if (i != 0)
-      l->push_back(' ');
-    LogParam(static_cast<bool>(p[i]), l);
-  }
-}
-
-void ParamTraits<base::DictionaryValue>::GetSize(base::PickleSizer* sizer,
-                                                 const param_type& p) {
-  GetValueSize(sizer, &p, 0);
-}
-
-void ParamTraits<base::DictionaryValue>::Write(base::Pickle* m,
-                                               const param_type& p) {
-  WriteValue(m, &p, 0);
-}
-
-bool ParamTraits<base::DictionaryValue>::Read(const base::Pickle* m,
-                                              base::PickleIterator* iter,
-                                              param_type* r) {
-  int type;
-  if (!ReadParam(m, iter, &type) ||
-      type != static_cast<int>(base::Value::Type::DICTIONARY))
-    return false;
-
-  return ReadDictionaryValue(m, iter, r, 0);
-}
-
-void ParamTraits<base::DictionaryValue>::Log(const param_type& p,
-                                             std::string* l) {
-  std::string json;
-  base::JSONWriter::Write(p, &json);
-  l->append(json);
-}
-
-#if defined(OS_POSIX)
-void ParamTraits<base::FileDescriptor>::GetSize(base::PickleSizer* sizer,
-                                                const param_type& p) {
-  GetParamSize(sizer, p.fd >= 0);
-  if (p.fd >= 0)
-    sizer->AddAttachment();
-}
-
-void ParamTraits<base::FileDescriptor>::Write(base::Pickle* m,
-                                              const param_type& p) {
-  const bool valid = p.fd >= 0;
-  WriteParam(m, valid);
-
-  if (!valid)
-    return;
-
-  if (p.auto_close) {
-    if (!m->WriteAttachment(
-            new internal::PlatformFileAttachment(base::ScopedFD(p.fd))))
-      NOTREACHED();
-  } else {
-    if (!m->WriteAttachment(new internal::PlatformFileAttachment(p.fd)))
-      NOTREACHED();
-  }
-}
-
-bool ParamTraits<base::FileDescriptor>::Read(const base::Pickle* m,
-                                             base::PickleIterator* iter,
-                                             param_type* r) {
-  *r = base::FileDescriptor();
-
-  bool valid;
-  if (!ReadParam(m, iter, &valid))
-    return false;
-
-  // TODO(morrita): Seems like this should return false.
-  if (!valid)
-    return true;
-
-  scoped_refptr<base::Pickle::Attachment> attachment;
-  if (!m->ReadAttachment(iter, &attachment))
-    return false;
-
-  if (static_cast<MessageAttachment*>(attachment.get())->GetType() !=
-      MessageAttachment::Type::PLATFORM_FILE) {
-    return false;
-  }
-
-  *r = base::FileDescriptor(
-      static_cast<internal::PlatformFileAttachment*>(attachment.get())
-          ->TakePlatformFile(),
-      true);
-  return true;
-}
-
-void ParamTraits<base::FileDescriptor>::Log(const param_type& p,
-                                            std::string* l) {
-  if (p.auto_close) {
-    l->append(base::StringPrintf("FD(%d auto-close)", p.fd));
-  } else {
-    l->append(base::StringPrintf("FD(%d)", p.fd));
-  }
-}
-#endif  // defined(OS_POSIX)
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* sizer,
-                                                    const param_type& p) {
-  GetParamSize(sizer, p.GetMemoryObject());
-  uint32_t dummy = 0;
-  GetParamSize(sizer, dummy);
-}
-
-void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
-                                                  const param_type& p) {
-  MachPortMac mach_port_mac(p.GetMemoryObject());
-  ParamTraits<MachPortMac>::Write(m, mach_port_mac);
-  size_t size = 0;
-  bool result = p.GetSize(&size);
-  DCHECK(result);
-  ParamTraits<uint32_t>::Write(m, static_cast<uint32_t>(size));
-
-  // If the caller intended to pass ownership to the IPC stack, release a
-  // reference.
-  if (p.OwnershipPassesToIPC())
-    p.Close();
-}
-
-bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
-                                                 base::PickleIterator* iter,
-                                                 param_type* r) {
-  MachPortMac mach_port_mac;
-  if (!ParamTraits<MachPortMac>::Read(m, iter, &mach_port_mac))
-    return false;
-
-  uint32_t size;
-  if (!ParamTraits<uint32_t>::Read(m, iter, &size))
-    return false;
-
-  *r = base::SharedMemoryHandle(mach_port_mac.get_mach_port(),
-                                static_cast<size_t>(size),
-                                base::GetCurrentProcId());
-  return true;
-}
-
-void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
-                                                std::string* l) {
-  l->append("Mach port: ");
-  LogParam(p.GetMemoryObject(), l);
-}
-
-#elif defined(OS_WIN)
-void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* s,
-                                                    const param_type& p) {
-  GetParamSize(s, p.NeedsBrokering());
-  if (p.NeedsBrokering()) {
-    GetParamSize(s, p.GetHandle());
-  } else {
-    GetParamSize(s, HandleToLong(p.GetHandle()));
-  }
-}
-
-void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
-                                                  const param_type& p) {
-  m->WriteBool(p.NeedsBrokering());
-
-  if (p.NeedsBrokering()) {
-    HandleWin handle_win(p.GetHandle(), HandleWin::DUPLICATE);
-    ParamTraits<HandleWin>::Write(m, handle_win);
-
-    // If the caller intended to pass ownership to the IPC stack, release a
-    // reference.
-    if (p.OwnershipPassesToIPC() && p.BelongsToCurrentProcess())
-      p.Close();
-  } else {
-    m->WriteInt(HandleToLong(p.GetHandle()));
-  }
-}
-
-bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
-                                                 base::PickleIterator* iter,
-                                                 param_type* r) {
-  bool needs_brokering;
-  if (!iter->ReadBool(&needs_brokering))
-    return false;
-
-  if (needs_brokering) {
-    HandleWin handle_win;
-    if (!ParamTraits<HandleWin>::Read(m, iter, &handle_win))
-      return false;
-    *r = base::SharedMemoryHandle(handle_win.get_handle(),
-                                  base::GetCurrentProcId());
-    return true;
-  }
-
-  int handle_int;
-  if (!iter->ReadInt(&handle_int))
-    return false;
-  HANDLE handle = LongToHandle(handle_int);
-  *r = base::SharedMemoryHandle(handle, base::GetCurrentProcId());
-  return true;
-}
-
-void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
-                                                std::string* l) {
-  LogParam(p.GetHandle(), l);
-  l->append(" needs brokering: ");
-  LogParam(p.NeedsBrokering(), l);
-}
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-void ParamTraits<base::FilePath>::GetSize(base::PickleSizer* sizer,
-                                          const param_type& p) {
-  p.GetSizeForPickle(sizer);
-}
-
-void ParamTraits<base::FilePath>::Write(base::Pickle* m, const param_type& p) {
-  p.WriteToPickle(m);
-}
-
-bool ParamTraits<base::FilePath>::Read(const base::Pickle* m,
-                                       base::PickleIterator* iter,
-                                       param_type* r) {
-  return r->ReadFromPickle(iter);
-}
-
-void ParamTraits<base::FilePath>::Log(const param_type& p, std::string* l) {
-  ParamTraits<base::FilePath::StringType>::Log(p.value(), l);
-}
-
-void ParamTraits<base::ListValue>::GetSize(base::PickleSizer* sizer,
-                                           const param_type& p) {
-  GetValueSize(sizer, &p, 0);
-}
-
-void ParamTraits<base::ListValue>::Write(base::Pickle* m, const param_type& p) {
-  WriteValue(m, &p, 0);
-}
-
-bool ParamTraits<base::ListValue>::Read(const base::Pickle* m,
-                                        base::PickleIterator* iter,
-                                        param_type* r) {
-  int type;
-  if (!ReadParam(m, iter, &type) ||
-      type != static_cast<int>(base::Value::Type::LIST))
-    return false;
-
-  return ReadListValue(m, iter, r, 0);
-}
-
-void ParamTraits<base::ListValue>::Log(const param_type& p, std::string* l) {
-  std::string json;
-  base::JSONWriter::Write(p, &json);
-  l->append(json);
-}
-
-void ParamTraits<base::NullableString16>::GetSize(base::PickleSizer* sizer,
-                                                  const param_type& p) {
-  GetParamSize(sizer, p.string());
-  GetParamSize(sizer, p.is_null());
-}
-
-void ParamTraits<base::NullableString16>::Write(base::Pickle* m,
-                                                const param_type& p) {
-  WriteParam(m, p.string());
-  WriteParam(m, p.is_null());
-}
-
-bool ParamTraits<base::NullableString16>::Read(const base::Pickle* m,
-                                               base::PickleIterator* iter,
-                                               param_type* r) {
-  base::string16 string;
-  if (!ReadParam(m, iter, &string))
-    return false;
-  bool is_null;
-  if (!ReadParam(m, iter, &is_null))
-    return false;
-  *r = base::NullableString16(string, is_null);
-  return true;
-}
-
-void ParamTraits<base::NullableString16>::Log(const param_type& p,
-                                              std::string* l) {
-  l->append("(");
-  LogParam(p.string(), l);
-  l->append(", ");
-  LogParam(p.is_null(), l);
-  l->append(")");
-}
-
-void ParamTraits<base::File::Info>::GetSize(base::PickleSizer* sizer,
-                                            const param_type& p) {
-  GetParamSize(sizer, p.size);
-  GetParamSize(sizer, p.is_directory);
-  GetParamSize(sizer, p.last_modified.ToDoubleT());
-  GetParamSize(sizer, p.last_accessed.ToDoubleT());
-  GetParamSize(sizer, p.creation_time.ToDoubleT());
-}
-
-void ParamTraits<base::File::Info>::Write(base::Pickle* m,
-                                          const param_type& p) {
-  WriteParam(m, p.size);
-  WriteParam(m, p.is_directory);
-  WriteParam(m, p.last_modified.ToDoubleT());
-  WriteParam(m, p.last_accessed.ToDoubleT());
-  WriteParam(m, p.creation_time.ToDoubleT());
-}
-
-bool ParamTraits<base::File::Info>::Read(const base::Pickle* m,
-                                         base::PickleIterator* iter,
-                                         param_type* p) {
-  double last_modified, last_accessed, creation_time;
-  if (!ReadParam(m, iter, &p->size) ||
-      !ReadParam(m, iter, &p->is_directory) ||
-      !ReadParam(m, iter, &last_modified) ||
-      !ReadParam(m, iter, &last_accessed) ||
-      !ReadParam(m, iter, &creation_time))
-    return false;
-  p->last_modified = base::Time::FromDoubleT(last_modified);
-  p->last_accessed = base::Time::FromDoubleT(last_accessed);
-  p->creation_time = base::Time::FromDoubleT(creation_time);
-  return true;
-}
-
-void ParamTraits<base::File::Info>::Log(const param_type& p,
-                                        std::string* l) {
-  l->append("(");
-  LogParam(p.size, l);
-  l->append(",");
-  LogParam(p.is_directory, l);
-  l->append(",");
-  LogParam(p.last_modified.ToDoubleT(), l);
-  l->append(",");
-  LogParam(p.last_accessed.ToDoubleT(), l);
-  l->append(",");
-  LogParam(p.creation_time.ToDoubleT(), l);
-  l->append(")");
-}
-
-void ParamTraits<base::Time>::GetSize(base::PickleSizer* sizer,
-                                      const param_type& p) {
-  sizer->AddInt64();
-}
-
-void ParamTraits<base::Time>::Write(base::Pickle* m, const param_type& p) {
-  ParamTraits<int64_t>::Write(m, p.ToInternalValue());
-}
-
-bool ParamTraits<base::Time>::Read(const base::Pickle* m,
-                                   base::PickleIterator* iter,
-                                   param_type* r) {
-  int64_t value;
-  if (!ParamTraits<int64_t>::Read(m, iter, &value))
-    return false;
-  *r = base::Time::FromInternalValue(value);
-  return true;
-}
-
-void ParamTraits<base::Time>::Log(const param_type& p, std::string* l) {
-  ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
-}
-
-void ParamTraits<base::TimeDelta>::GetSize(base::PickleSizer* sizer,
-                                           const param_type& p) {
-  sizer->AddInt64();
-}
-
-void ParamTraits<base::TimeDelta>::Write(base::Pickle* m, const param_type& p) {
-  ParamTraits<int64_t>::Write(m, p.ToInternalValue());
-}
-
-bool ParamTraits<base::TimeDelta>::Read(const base::Pickle* m,
-                                        base::PickleIterator* iter,
-                                        param_type* r) {
-  int64_t value;
-  bool ret = ParamTraits<int64_t>::Read(m, iter, &value);
-  if (ret)
-    *r = base::TimeDelta::FromInternalValue(value);
-
-  return ret;
-}
-
-void ParamTraits<base::TimeDelta>::Log(const param_type& p, std::string* l) {
-  ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
-}
-
-void ParamTraits<base::TimeTicks>::GetSize(base::PickleSizer* sizer,
-                                           const param_type& p) {
-  sizer->AddInt64();
-}
-
-void ParamTraits<base::TimeTicks>::Write(base::Pickle* m, const param_type& p) {
-  ParamTraits<int64_t>::Write(m, p.ToInternalValue());
-}
-
-bool ParamTraits<base::TimeTicks>::Read(const base::Pickle* m,
-                                        base::PickleIterator* iter,
-                                        param_type* r) {
-  int64_t value;
-  bool ret = ParamTraits<int64_t>::Read(m, iter, &value);
-  if (ret)
-    *r = base::TimeTicks::FromInternalValue(value);
-
-  return ret;
-}
-
-void ParamTraits<base::TimeTicks>::Log(const param_type& p, std::string* l) {
-  ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
-}
-
-// If base::UnguessableToken is no longer 128 bits, the IPC serialization logic
-// below should be updated.
-static_assert(sizeof(base::UnguessableToken) == 2 * sizeof(uint64_t),
-              "base::UnguessableToken should be of size 2 * sizeof(uint64_t).");
-
-void ParamTraits<base::UnguessableToken>::GetSize(base::PickleSizer* sizer,
-                                                  const param_type& p) {
-  sizer->AddBytes(2 * sizeof(uint64_t));
-}
-
-void ParamTraits<base::UnguessableToken>::Write(base::Pickle* m,
-                                                const param_type& p) {
-  DCHECK(!p.is_empty());
-
-  ParamTraits<uint64_t>::Write(m, p.GetHighForSerialization());
-  ParamTraits<uint64_t>::Write(m, p.GetLowForSerialization());
-}
-
-bool ParamTraits<base::UnguessableToken>::Read(const base::Pickle* m,
-                                               base::PickleIterator* iter,
-                                               param_type* r) {
-  uint64_t high, low;
-  if (!ParamTraits<uint64_t>::Read(m, iter, &high) ||
-      !ParamTraits<uint64_t>::Read(m, iter, &low))
-    return false;
-
-  // Receiving a zeroed UnguessableToken is a security issue.
-  if (high == 0 && low == 0)
-    return false;
-
-  *r = base::UnguessableToken::Deserialize(high, low);
-  return true;
-}
-
-void ParamTraits<base::UnguessableToken>::Log(const param_type& p,
-                                              std::string* l) {
-  l->append(p.ToString());
-}
-
-void ParamTraits<IPC::ChannelHandle>::GetSize(base::PickleSizer* sizer,
-                                              const param_type& p) {
-#if defined(OS_NACL_SFI)
-  GetParamSize(sizer, p.socket);
-#else
-  GetParamSize(sizer, p.mojo_handle);
-#endif
-}
-
-void ParamTraits<IPC::ChannelHandle>::Write(base::Pickle* m,
-                                            const param_type& p) {
-#if defined(OS_NACL_SFI)
-  WriteParam(m, p.socket);
-#else
-  WriteParam(m, p.mojo_handle);
-#endif
-}
-
-bool ParamTraits<IPC::ChannelHandle>::Read(const base::Pickle* m,
-                                           base::PickleIterator* iter,
-                                           param_type* r) {
-#if defined(OS_NACL_SFI)
-  return ReadParam(m, iter, &r->socket);
-#else
-  return ReadParam(m, iter, &r->mojo_handle);
-#endif
-}
-
-void ParamTraits<IPC::ChannelHandle>::Log(const param_type& p,
-                                          std::string* l) {
-  l->append("ChannelHandle(");
-#if defined(OS_NACL_SFI)
-  ParamTraits<base::FileDescriptor>::Log(p.socket, l);
-#else
-  LogParam(p.mojo_handle, l);
-#endif
-  l->append(")");
-}
-
-void ParamTraits<LogData>::GetSize(base::PickleSizer* sizer,
-                                   const param_type& p) {
-  GetParamSize(sizer, p.channel);
-  GetParamSize(sizer, p.routing_id);
-  GetParamSize(sizer, p.type);
-  GetParamSize(sizer, p.flags);
-  GetParamSize(sizer, p.sent);
-  GetParamSize(sizer, p.receive);
-  GetParamSize(sizer, p.dispatch);
-  GetParamSize(sizer, p.message_name);
-  GetParamSize(sizer, p.params);
-}
-
-void ParamTraits<LogData>::Write(base::Pickle* m, const param_type& p) {
-  WriteParam(m, p.channel);
-  WriteParam(m, p.routing_id);
-  WriteParam(m, p.type);
-  WriteParam(m, p.flags);
-  WriteParam(m, p.sent);
-  WriteParam(m, p.receive);
-  WriteParam(m, p.dispatch);
-  WriteParam(m, p.message_name);
-  WriteParam(m, p.params);
-}
-
-bool ParamTraits<LogData>::Read(const base::Pickle* m,
-                                base::PickleIterator* iter,
-                                param_type* r) {
-  return
-      ReadParam(m, iter, &r->channel) &&
-      ReadParam(m, iter, &r->routing_id) &&
-      ReadParam(m, iter, &r->type) &&
-      ReadParam(m, iter, &r->flags) &&
-      ReadParam(m, iter, &r->sent) &&
-      ReadParam(m, iter, &r->receive) &&
-      ReadParam(m, iter, &r->dispatch) &&
-      ReadParam(m, iter, &r->message_name) &&
-      ReadParam(m, iter, &r->params);
-}
-
-void ParamTraits<LogData>::Log(const param_type& p, std::string* l) {
-  // Doesn't make sense to implement this!
-}
-
-void ParamTraits<Message>::Write(base::Pickle* m, const Message& p) {
-#if defined(OS_POSIX)
-  // We don't serialize the file descriptors in the nested message, so there
-  // better not be any.
-  DCHECK(!p.HasAttachments());
-#endif
-
-  // Don't just write out the message. This is used to send messages between
-  // NaCl (Posix environment) and the browser (could be on Windows). The message
-  // header formats differ between these systems (so does handle sharing, but
-  // we already asserted we don't have any handles). So just write out the
-  // parts of the header we use.
-  //
-  // Be careful also to use only explicitly-sized types. The NaCl environment
-  // could be 64-bit and the host browser could be 32-bits. The nested message
-  // may or may not be safe to send between 32-bit and 64-bit systems, but we
-  // leave that up to the code sending the message to ensure.
-  m->WriteUInt32(static_cast<uint32_t>(p.routing_id()));
-  m->WriteUInt32(p.type());
-  m->WriteUInt32(p.flags());
-  m->WriteData(p.payload(), static_cast<uint32_t>(p.payload_size()));
-}
-
-bool ParamTraits<Message>::Read(const base::Pickle* m,
-                                base::PickleIterator* iter,
-                                Message* r) {
-  uint32_t routing_id, type, flags;
-  if (!iter->ReadUInt32(&routing_id) ||
-      !iter->ReadUInt32(&type) ||
-      !iter->ReadUInt32(&flags))
-    return false;
-
-  int payload_size;
-  const char* payload;
-  if (!iter->ReadData(&payload, &payload_size))
-    return false;
-
-  r->SetHeaderValues(static_cast<int32_t>(routing_id), type, flags);
-  return r->WriteBytes(payload, payload_size);
-}
-
-void ParamTraits<Message>::Log(const Message& p, std::string* l) {
-  l->append("<IPC::Message>");
-}
-
-#if defined(OS_WIN)
-void ParamTraits<HANDLE>::GetSize(base::PickleSizer* sizer,
-                                  const param_type& p) {
-  sizer->AddInt();
-}
-
-// Note that HWNDs/HANDLE/HCURSOR/HACCEL etc are always 32 bits, even on 64
-// bit systems. That's why we use the Windows macros to convert to 32 bits.
-void ParamTraits<HANDLE>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteInt(HandleToLong(p));
-}
-
-bool ParamTraits<HANDLE>::Read(const base::Pickle* m,
-                               base::PickleIterator* iter,
-                               param_type* r) {
-  int32_t temp;
-  if (!iter->ReadInt(&temp))
-    return false;
-  *r = LongToHandle(temp);
-  return true;
-}
-
-void ParamTraits<HANDLE>::Log(const param_type& p, std::string* l) {
-  l->append(base::StringPrintf("0x%p", p));
-}
-
-void ParamTraits<LOGFONT>::GetSize(base::PickleSizer* sizer,
-                                   const param_type& p) {
-  sizer->AddData(sizeof(LOGFONT));
-}
-
-void ParamTraits<LOGFONT>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteData(reinterpret_cast<const char*>(&p), sizeof(LOGFONT));
-}
-
-bool ParamTraits<LOGFONT>::Read(const base::Pickle* m,
-                                base::PickleIterator* iter,
-                                param_type* r) {
-  const char *data;
-  int data_size = 0;
-  if (iter->ReadData(&data, &data_size) && data_size == sizeof(LOGFONT)) {
-    const LOGFONT *font = reinterpret_cast<LOGFONT*>(const_cast<char*>(data));
-    if (_tcsnlen(font->lfFaceName, LF_FACESIZE) < LF_FACESIZE) {
-      memcpy(r, data, sizeof(LOGFONT));
-      return true;
-    }
-  }
-
-  NOTREACHED();
-  return false;
-}
-
-void ParamTraits<LOGFONT>::Log(const param_type& p, std::string* l) {
-  l->append(base::StringPrintf("<LOGFONT>"));
-}
-
-void ParamTraits<MSG>::GetSize(base::PickleSizer* sizer, const param_type& p) {
-  sizer->AddData(sizeof(MSG));
-}
-
-void ParamTraits<MSG>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteData(reinterpret_cast<const char*>(&p), sizeof(MSG));
-}
-
-bool ParamTraits<MSG>::Read(const base::Pickle* m,
-                            base::PickleIterator* iter,
-                            param_type* r) {
-  const char *data;
-  int data_size = 0;
-  bool result = iter->ReadData(&data, &data_size);
-  if (result && data_size == sizeof(MSG)) {
-    memcpy(r, data, sizeof(MSG));
-  } else {
-    result = false;
-    NOTREACHED();
-  }
-
-  return result;
-}
-
-void ParamTraits<MSG>::Log(const param_type& p, std::string* l) {
-  l->append("<MSG>");
-}
-
-#endif  // OS_WIN
-
-}  // namespace IPC
diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h
deleted file mode 100644
index 2d51c98..0000000
--- a/ipc/ipc_message_utils.h
+++ /dev/null
@@ -1,1145 +0,0 @@
-// Copyright (c) 2012 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 IPC_IPC_MESSAGE_UTILS_H_
-#define IPC_IPC_MESSAGE_UTILS_H_
-
-#include <limits.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <tuple>
-#include <vector>
-
-#include "base/containers/small_map.h"
-#include "base/containers/stack_container.h"
-#include "base/files/file.h"
-#include "base/format_macros.h"
-#include "base/optional.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "build/build_config.h"
-#include "ipc/ipc_message_start.h"
-#include "ipc/ipc_param_traits.h"
-#include "ipc/ipc_sync_message.h"
-
-namespace base {
-class DictionaryValue;
-class FilePath;
-class ListValue;
-class NullableString16;
-class Time;
-class TimeDelta;
-class TimeTicks;
-class UnguessableToken;
-struct FileDescriptor;
-
-#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
-class SharedMemoryHandle;
-#endif  // (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
-}
-
-namespace IPC {
-
-struct ChannelHandle;
-
-// -----------------------------------------------------------------------------
-// How we send IPC message logs across channels.
-struct IPC_EXPORT LogData {
-  LogData();
-  LogData(const LogData& other);
-  ~LogData();
-
-  std::string channel;
-  int32_t routing_id;
-  uint32_t type;  // "User-defined" message type, from ipc_message.h.
-  std::string flags;
-  int64_t sent;  // Time that the message was sent (i.e. at Send()).
-  int64_t receive;  // Time before it was dispatched (i.e. before calling
-                    // OnMessageReceived).
-  int64_t dispatch;  // Time after it was dispatched (i.e. after calling
-                     // OnMessageReceived).
-  std::string message_name;
-  std::string params;
-};
-
-//-----------------------------------------------------------------------------
-
-// A dummy struct to place first just to allow leading commas for all
-// members in the macro-generated constructor initializer lists.
-struct NoParams {
-};
-
-// Specializations are checked by 'IPC checker' part of find-bad-constructs
-// Clang plugin (see WriteParam() below for the details).
-template <typename... Ts>
-struct CheckedTuple {
-  typedef std::tuple<Ts...> Tuple;
-};
-
-template <class P>
-static inline void GetParamSize(base::PickleSizer* sizer, const P& p) {
-  typedef typename SimilarTypeTraits<P>::Type Type;
-  ParamTraits<Type>::GetSize(sizer, static_cast<const Type&>(p));
-}
-
-// This function is checked by 'IPC checker' part of find-bad-constructs
-// Clang plugin to make it's not called on the following types:
-// 1. long / unsigned long (but not typedefs to)
-// 2. intmax_t, uintmax_t, intptr_t, uintptr_t, wint_t,
-//    size_t, rsize_t, ssize_t, ptrdiff_t, dev_t, off_t, clock_t,
-//    time_t, suseconds_t (including typedefs to)
-// 3. Any template referencing types above (e.g. std::vector<size_t>)
-template <class P>
-static inline void WriteParam(base::Pickle* m, const P& p) {
-  typedef typename SimilarTypeTraits<P>::Type Type;
-  ParamTraits<Type>::Write(m, static_cast<const Type& >(p));
-}
-
-template <class P>
-static inline bool WARN_UNUSED_RESULT ReadParam(const base::Pickle* m,
-                                                base::PickleIterator* iter,
-                                                P* p) {
-  typedef typename SimilarTypeTraits<P>::Type Type;
-  return ParamTraits<Type>::Read(m, iter, reinterpret_cast<Type* >(p));
-}
-
-template <class P>
-static inline void LogParam(const P& p, std::string* l) {
-  typedef typename SimilarTypeTraits<P>::Type Type;
-  ParamTraits<Type>::Log(static_cast<const Type& >(p), l);
-}
-
-// Primitive ParamTraits -------------------------------------------------------
-
-template <>
-struct ParamTraits<bool> {
-  typedef bool param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddBool();
-  }
-  static void Write(base::Pickle* m, const param_type& p) { m->WriteBool(p); }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadBool(r);
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<signed char> {
-  typedef signed char param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<unsigned char> {
-  typedef unsigned char param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<unsigned short> {
-  typedef unsigned short param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<int> {
-  typedef int param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddInt();
-  }
-  static void Write(base::Pickle* m, const param_type& p) { m->WriteInt(p); }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadInt(r);
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<unsigned int> {
-  typedef unsigned int param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddInt();
-  }
-  static void Write(base::Pickle* m, const param_type& p) { m->WriteInt(p); }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadInt(reinterpret_cast<int*>(r));
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-// long isn't safe to send over IPC because it's 4 bytes on 32 bit builds but
-// 8 bytes on 64 bit builds. So if a 32 bit and 64 bit process have a channel
-// that would cause problem.
-// We need to keep this on for a few configs:
-//   1) Windows because DWORD is typedef'd to it, which is fine because we have
-//      very few IPCs that cross this boundary.
-//   2) We also need to keep it for Linux for two reasons: int64_t is typedef'd
-//      to long, and gfx::PluginWindow is long and is used in one GPU IPC.
-//   3) Android 64 bit also has int64_t typedef'd to long.
-// Since we want to support Android 32<>64 bit IPC, as long as we don't have
-// these traits for 32 bit ARM then that'll catch any errors.
-#if defined(OS_WIN) || defined(OS_LINUX) || \
-    (defined(OS_ANDROID) && defined(ARCH_CPU_64_BITS))
-template <>
-struct ParamTraits<long> {
-  typedef long param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddLong();
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    m->WriteLong(p);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadLong(r);
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<unsigned long> {
-  typedef unsigned long param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddLong();
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    m->WriteLong(p);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadLong(reinterpret_cast<long*>(r));
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-#endif
-
-template <>
-struct ParamTraits<long long> {
-  typedef long long param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddInt64();
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    m->WriteInt64(static_cast<int64_t>(p));
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadInt64(reinterpret_cast<int64_t*>(r));
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<unsigned long long> {
-  typedef unsigned long long param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddInt64();
-  }
-  static void Write(base::Pickle* m, const param_type& p) { m->WriteInt64(p); }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadInt64(reinterpret_cast<int64_t*>(r));
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-// Note that the IPC layer doesn't sanitize NaNs and +/- INF values.  Clients
-// should be sure to check the sanity of these values after receiving them over
-// IPC.
-template <>
-struct IPC_EXPORT ParamTraits<float> {
-  typedef float param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddFloat();
-  }
-  static void Write(base::Pickle* m, const param_type& p) { m->WriteFloat(p); }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadFloat(r);
-  }
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<double> {
-  typedef double param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <class P, size_t Size>
-struct ParamTraits<P[Size]> {
-  using param_type = P[Size];
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    for (const P& element : p)
-      GetParamSize(sizer, element);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    for (const P& element : p)
-      WriteParam(m, element);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    for (P& element : *r) {
-      if (!ReadParam(m, iter, &element))
-        return false;
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    l->append("[");
-    for (const P& element : p) {
-      if (&element != &p[0])
-        l->append(" ");
-      LogParam(element, l);
-    }
-    l->append("]");
-  }
-};
-
-// STL ParamTraits -------------------------------------------------------------
-
-template <>
-struct ParamTraits<std::string> {
-  typedef std::string param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddString(p);
-  }
-  static void Write(base::Pickle* m, const param_type& p) { m->WriteString(p); }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadString(r);
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<base::string16> {
-  typedef base::string16 param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddString16(p);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    m->WriteString16(p);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadString16(r);
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<std::vector<char> > {
-  typedef std::vector<char> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle*,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<std::vector<unsigned char> > {
-  typedef std::vector<unsigned char> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<std::vector<bool> > {
-  typedef std::vector<bool> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <class P>
-struct ParamTraits<std::vector<P>> {
-  typedef std::vector<P> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    for (size_t i = 0; i < p.size(); i++)
-      GetParamSize(sizer, p[i]);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, static_cast<int>(p.size()));
-    for (size_t i = 0; i < p.size(); i++)
-      WriteParam(m, p[i]);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    int size;
-    // ReadLength() checks for < 0 itself.
-    if (!iter->ReadLength(&size))
-      return false;
-    // Resizing beforehand is not safe, see BUG 1006367 for details.
-    if (INT_MAX / sizeof(P) <= static_cast<size_t>(size))
-      return false;
-    r->resize(size);
-    for (int i = 0; i < size; i++) {
-      if (!ReadParam(m, iter, &(*r)[i]))
-        return false;
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    for (size_t i = 0; i < p.size(); ++i) {
-      if (i != 0)
-        l->append(" ");
-      LogParam((p[i]), l);
-    }
-  }
-};
-
-template <class P>
-struct ParamTraits<std::set<P> > {
-  typedef std::set<P> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter)
-      GetParamSize(sizer, *iter);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter)
-      WriteParam(m, *iter);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    int size;
-    if (!iter->ReadLength(&size))
-      return false;
-    for (int i = 0; i < size; ++i) {
-      P item;
-      if (!ReadParam(m, iter, &item))
-        return false;
-      r->insert(item);
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    l->append("<std::set>");
-  }
-};
-
-template <class K, class V, class C, class A>
-struct ParamTraits<std::map<K, V, C, A> > {
-  typedef std::map<K, V, C, A> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter) {
-      GetParamSize(sizer, iter->first);
-      GetParamSize(sizer, iter->second);
-    }
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter) {
-      WriteParam(m, iter->first);
-      WriteParam(m, iter->second);
-    }
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    int size;
-    if (!ReadParam(m, iter, &size) || size < 0)
-      return false;
-    for (int i = 0; i < size; ++i) {
-      K k;
-      if (!ReadParam(m, iter, &k))
-        return false;
-      V& value = (*r)[k];
-      if (!ReadParam(m, iter, &value))
-        return false;
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    l->append("<std::map>");
-  }
-};
-
-template <class A, class B>
-struct ParamTraits<std::pair<A, B> > {
-  typedef std::pair<A, B> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, p.first);
-    GetParamSize(sizer, p.second);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, p.first);
-    WriteParam(m, p.second);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return ReadParam(m, iter, &r->first) && ReadParam(m, iter, &r->second);
-  }
-  static void Log(const param_type& p, std::string* l) {
-    l->append("(");
-    LogParam(p.first, l);
-    l->append(", ");
-    LogParam(p.second, l);
-    l->append(")");
-  }
-};
-
-// Base ParamTraits ------------------------------------------------------------
-
-template <>
-struct IPC_EXPORT ParamTraits<base::DictionaryValue> {
-  typedef base::DictionaryValue param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-#if defined(OS_POSIX)
-// FileDescriptors may be serialised over IPC channels on POSIX. On the
-// receiving side, the FileDescriptor is a valid duplicate of the file
-// descriptor which was transmitted: *it is not just a copy of the integer like
-// HANDLEs on Windows*. The only exception is if the file descriptor is < 0. In
-// this case, the receiving end will see a value of -1. *Zero is a valid file
-// descriptor*.
-//
-// The received file descriptor will have the |auto_close| flag set to true. The
-// code which handles the message is responsible for taking ownership of it.
-// File descriptors are OS resources and must be closed when no longer needed.
-//
-// When sending a file descriptor, the file descriptor must be valid at the time
-// of transmission. Since transmission is not synchronous, one should consider
-// dup()ing any file descriptors to be transmitted and setting the |auto_close|
-// flag, which causes the file descriptor to be closed after writing.
-template<>
-struct IPC_EXPORT ParamTraits<base::FileDescriptor> {
-  typedef base::FileDescriptor param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-#endif  // defined(OS_POSIX)
-
-#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
-template <>
-struct IPC_EXPORT ParamTraits<base::SharedMemoryHandle> {
-  typedef base::SharedMemoryHandle param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-#endif  // (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
-
-template <>
-struct IPC_EXPORT ParamTraits<base::FilePath> {
-  typedef base::FilePath param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<base::ListValue> {
-  typedef base::ListValue param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<base::NullableString16> {
-  typedef base::NullableString16 param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<base::File::Info> {
-  typedef base::File::Info param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct SimilarTypeTraits<base::File::Error> {
-  typedef int Type;
-};
-
-#if defined(OS_WIN)
-template <>
-struct SimilarTypeTraits<HWND> {
-  typedef HANDLE Type;
-};
-#endif  // defined(OS_WIN)
-
-template <>
-struct IPC_EXPORT ParamTraits<base::Time> {
-  typedef base::Time param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<base::TimeDelta> {
-  typedef base::TimeDelta param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<base::TimeTicks> {
-  typedef base::TimeTicks param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<base::UnguessableToken> {
-  typedef base::UnguessableToken param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<std::tuple<>> {
-  typedef std::tuple<> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {}
-  static void Write(base::Pickle* m, const param_type& p) {}
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-  }
-};
-
-template <class A>
-struct ParamTraits<std::tuple<A>> {
-  typedef std::tuple<A> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, std::get<0>(p));
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, std::get<0>(p));
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return ReadParam(m, iter, &std::get<0>(*r));
-  }
-  static void Log(const param_type& p, std::string* l) {
-    LogParam(std::get<0>(p), l);
-  }
-};
-
-template <class A, class B>
-struct ParamTraits<std::tuple<A, B>> {
-  typedef std::tuple<A, B> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, std::get<0>(p));
-    GetParamSize(sizer, std::get<1>(p));
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, std::get<0>(p));
-    WriteParam(m, std::get<1>(p));
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return (ReadParam(m, iter, &std::get<0>(*r)) &&
-            ReadParam(m, iter, &std::get<1>(*r)));
-  }
-  static void Log(const param_type& p, std::string* l) {
-    LogParam(std::get<0>(p), l);
-    l->append(", ");
-    LogParam(std::get<1>(p), l);
-  }
-};
-
-template <class A, class B, class C>
-struct ParamTraits<std::tuple<A, B, C>> {
-  typedef std::tuple<A, B, C> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, std::get<0>(p));
-    GetParamSize(sizer, std::get<1>(p));
-    GetParamSize(sizer, std::get<2>(p));
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, std::get<0>(p));
-    WriteParam(m, std::get<1>(p));
-    WriteParam(m, std::get<2>(p));
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return (ReadParam(m, iter, &std::get<0>(*r)) &&
-            ReadParam(m, iter, &std::get<1>(*r)) &&
-            ReadParam(m, iter, &std::get<2>(*r)));
-  }
-  static void Log(const param_type& p, std::string* l) {
-    LogParam(std::get<0>(p), l);
-    l->append(", ");
-    LogParam(std::get<1>(p), l);
-    l->append(", ");
-    LogParam(std::get<2>(p), l);
-  }
-};
-
-template <class A, class B, class C, class D>
-struct ParamTraits<std::tuple<A, B, C, D>> {
-  typedef std::tuple<A, B, C, D> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, std::get<0>(p));
-    GetParamSize(sizer, std::get<1>(p));
-    GetParamSize(sizer, std::get<2>(p));
-    GetParamSize(sizer, std::get<3>(p));
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, std::get<0>(p));
-    WriteParam(m, std::get<1>(p));
-    WriteParam(m, std::get<2>(p));
-    WriteParam(m, std::get<3>(p));
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return (ReadParam(m, iter, &std::get<0>(*r)) &&
-            ReadParam(m, iter, &std::get<1>(*r)) &&
-            ReadParam(m, iter, &std::get<2>(*r)) &&
-            ReadParam(m, iter, &std::get<3>(*r)));
-  }
-  static void Log(const param_type& p, std::string* l) {
-    LogParam(std::get<0>(p), l);
-    l->append(", ");
-    LogParam(std::get<1>(p), l);
-    l->append(", ");
-    LogParam(std::get<2>(p), l);
-    l->append(", ");
-    LogParam(std::get<3>(p), l);
-  }
-};
-
-template <class A, class B, class C, class D, class E>
-struct ParamTraits<std::tuple<A, B, C, D, E>> {
-  typedef std::tuple<A, B, C, D, E> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, std::get<0>(p));
-    GetParamSize(sizer, std::get<1>(p));
-    GetParamSize(sizer, std::get<2>(p));
-    GetParamSize(sizer, std::get<3>(p));
-    GetParamSize(sizer, std::get<4>(p));
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, std::get<0>(p));
-    WriteParam(m, std::get<1>(p));
-    WriteParam(m, std::get<2>(p));
-    WriteParam(m, std::get<3>(p));
-    WriteParam(m, std::get<4>(p));
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return (ReadParam(m, iter, &std::get<0>(*r)) &&
-            ReadParam(m, iter, &std::get<1>(*r)) &&
-            ReadParam(m, iter, &std::get<2>(*r)) &&
-            ReadParam(m, iter, &std::get<3>(*r)) &&
-            ReadParam(m, iter, &std::get<4>(*r)));
-  }
-  static void Log(const param_type& p, std::string* l) {
-    LogParam(std::get<0>(p), l);
-    l->append(", ");
-    LogParam(std::get<1>(p), l);
-    l->append(", ");
-    LogParam(std::get<2>(p), l);
-    l->append(", ");
-    LogParam(std::get<3>(p), l);
-    l->append(", ");
-    LogParam(std::get<4>(p), l);
-  }
-};
-
-template <class P, size_t stack_capacity>
-struct ParamTraits<base::StackVector<P, stack_capacity> > {
-  typedef base::StackVector<P, stack_capacity> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p->size()));
-    for (size_t i = 0; i < p->size(); i++)
-      GetParamSize(sizer, p[i]);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, static_cast<int>(p->size()));
-    for (size_t i = 0; i < p->size(); i++)
-      WriteParam(m, p[i]);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    int size;
-    // ReadLength() checks for < 0 itself.
-    if (!iter->ReadLength(&size))
-      return false;
-    // Sanity check for the vector size.
-    if (INT_MAX / sizeof(P) <= static_cast<size_t>(size))
-      return false;
-    P value;
-    for (int i = 0; i < size; i++) {
-      if (!ReadParam(m, iter, &value))
-        return false;
-      (*r)->push_back(value);
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    for (size_t i = 0; i < p->size(); ++i) {
-      if (i != 0)
-        l->append(" ");
-      LogParam((p[i]), l);
-    }
-  }
-};
-
-template <typename NormalMap,
-          int kArraySize,
-          typename EqualKey,
-          typename MapInit>
-struct ParamTraits<base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> > {
-  typedef base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> param_type;
-  typedef typename param_type::key_type K;
-  typedef typename param_type::data_type V;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter) {
-      GetParamSize(sizer, iter->first);
-      GetParamSize(sizer, iter->second);
-    }
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter) {
-      WriteParam(m, iter->first);
-      WriteParam(m, iter->second);
-    }
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    int size;
-    if (!iter->ReadLength(&size))
-      return false;
-    for (int i = 0; i < size; ++i) {
-      K key;
-      if (!ReadParam(m, iter, &key))
-        return false;
-      V& value = (*r)[key];
-      if (!ReadParam(m, iter, &value))
-        return false;
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    l->append("<base::SmallMap>");
-  }
-};
-
-template <class P>
-struct ParamTraits<std::unique_ptr<P>> {
-  typedef std::unique_ptr<P> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    bool valid = !!p;
-    GetParamSize(sizer, valid);
-    if (valid)
-      GetParamSize(sizer, *p);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    bool valid = !!p;
-    WriteParam(m, valid);
-    if (valid)
-      WriteParam(m, *p);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    bool valid = false;
-    if (!ReadParam(m, iter, &valid))
-      return false;
-
-    if (!valid) {
-      r->reset();
-      return true;
-    }
-
-    param_type temp(new P());
-    if (!ReadParam(m, iter, temp.get()))
-      return false;
-
-    r->swap(temp);
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    if (p)
-      LogParam(*p, l);
-    else
-      l->append("NULL");
-  }
-};
-
-template <class P>
-struct ParamTraits<base::Optional<P>> {
-  typedef base::Optional<P> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    const bool is_set = static_cast<bool>(p);
-    GetParamSize(sizer, is_set);
-    if (is_set)
-      GetParamSize(sizer, p.value());
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    const bool is_set = static_cast<bool>(p);
-    WriteParam(m, is_set);
-    if (is_set)
-      WriteParam(m, p.value());
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    bool is_set = false;
-    if (!iter->ReadBool(&is_set))
-      return false;
-    if (is_set) {
-      P value;
-      if (!ReadParam(m, iter, &value))
-        return false;
-      *r = std::move(value);
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    if (p)
-      LogParam(p.value(), l);
-    else
-      l->append("(unset)");
-  }
-};
-
-// IPC types ParamTraits -------------------------------------------------------
-
-// A ChannelHandle is basically a platform-inspecific wrapper around the
-// fact that IPC endpoints are handled specially on POSIX.  See above comments
-// on FileDescriptor for more background.
-template<>
-struct IPC_EXPORT ParamTraits<IPC::ChannelHandle> {
-  typedef ChannelHandle param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<LogData> {
-  typedef LogData param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<Message> {
-  static void Write(base::Pickle* m, const Message& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   Message* r);
-  static void Log(const Message& p, std::string* l);
-};
-
-// Windows ParamTraits ---------------------------------------------------------
-
-#if defined(OS_WIN)
-template <>
-struct IPC_EXPORT ParamTraits<HANDLE> {
-  typedef HANDLE param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<LOGFONT> {
-  typedef LOGFONT param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<MSG> {
-  typedef MSG param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-#endif  // defined(OS_WIN)
-
-//-----------------------------------------------------------------------------
-// Generic message subclasses
-
-// defined in ipc_logging.cc
-IPC_EXPORT void GenerateLogData(const Message& message,
-                                LogData* data,
-                                bool get_params);
-
-#if defined(IPC_MESSAGE_LOG_ENABLED)
-inline void AddOutputParamsToLog(const Message* msg, std::string* l) {
-  const std::string& output_params = msg->output_params();
-  if (!l->empty() && !output_params.empty())
-    l->append(", ");
-
-  l->append(output_params);
-}
-
-template <class ReplyParamType>
-inline void LogReplyParamsToMessage(const ReplyParamType& reply_params,
-                                    const Message* msg) {
-  if (msg->received_time() != 0) {
-    std::string output_params;
-    LogParam(reply_params, &output_params);
-    msg->set_output_params(output_params);
-  }
-}
-
-inline void ConnectMessageAndReply(const Message* msg, Message* reply) {
-  if (msg->sent_time()) {
-    // Don't log the sync message after dispatch, as we don't have the
-    // output parameters at that point.  Instead, save its data and log it
-    // with the outgoing reply message when it's sent.
-    LogData* data = new LogData;
-    GenerateLogData(*msg, data, true);
-    msg->set_dont_log();
-    reply->set_sync_log_data(data);
-  }
-}
-#else
-inline void AddOutputParamsToLog(const Message* msg, std::string* l) {}
-
-template <class ReplyParamType>
-inline void LogReplyParamsToMessage(const ReplyParamType& reply_params,
-                                    const Message* msg) {}
-
-inline void ConnectMessageAndReply(const Message* msg, Message* reply) {}
-#endif
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_MESSAGE_UTILS_H_
diff --git a/ipc/ipc_mojo_handle_attachment.cc b/ipc/ipc_mojo_handle_attachment.cc
deleted file mode 100644
index e3421c3..0000000
--- a/ipc/ipc_mojo_handle_attachment.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2015 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 "ipc/ipc_mojo_handle_attachment.h"
-
-#include <utility>
-
-#include "build/build_config.h"
-
-namespace IPC {
-namespace internal {
-
-MojoHandleAttachment::MojoHandleAttachment(mojo::ScopedHandle handle)
-    : handle_(std::move(handle)) {}
-
-MojoHandleAttachment::~MojoHandleAttachment() {
-}
-
-MessageAttachment::Type MojoHandleAttachment::GetType() const {
-  return Type::MOJO_HANDLE;
-}
-
-mojo::ScopedHandle MojoHandleAttachment::TakeHandle() {
-  return std::move(handle_);
-}
-
-}  // namespace internal
-}  // namespace IPC
diff --git a/ipc/ipc_mojo_handle_attachment.h b/ipc/ipc_mojo_handle_attachment.h
deleted file mode 100644
index d615276..0000000
--- a/ipc/ipc_mojo_handle_attachment.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2015 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 IPC_IPC_MOJO_HANDLE_ATTACHMENT_H_
-#define IPC_IPC_MOJO_HANDLE_ATTACHMENT_H_
-
-#include "base/files/file.h"
-#include "base/macros.h"
-#include "build/build_config.h"
-#include "ipc/ipc_export.h"
-#include "ipc/ipc_message_attachment.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace IPC {
-
-namespace internal {
-
-// A MessageAttachment that holds a MojoHandle.
-// This can hold any type of transferrable Mojo handle (i.e. message pipe, data
-// pipe, etc), but the receiver is expected to know what type of handle to
-// expect.
-class IPC_EXPORT MojoHandleAttachment : public MessageAttachment {
- public:
-  explicit MojoHandleAttachment(mojo::ScopedHandle handle);
-
-  Type GetType() const override;
-
-  // Returns the owning handle transferring the ownership.
-  mojo::ScopedHandle TakeHandle();
-
- private:
-  ~MojoHandleAttachment() override;
-  mojo::ScopedHandle handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(MojoHandleAttachment);
-};
-
-}  // namespace internal
-}  // namespace IPC
-
-#endif  // IPC_IPC_MOJO_HANDLE_ATTACHMENT_H_
diff --git a/ipc/ipc_mojo_message_helper.cc b/ipc/ipc_mojo_message_helper.cc
deleted file mode 100644
index a87a2d6..0000000
--- a/ipc/ipc_mojo_message_helper.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2015 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 "ipc/ipc_mojo_message_helper.h"
-
-#include <utility>
-
-#include "ipc/ipc_mojo_handle_attachment.h"
-
-namespace IPC {
-
-// static
-bool MojoMessageHelper::WriteMessagePipeTo(
-    base::Pickle* message,
-    mojo::ScopedMessagePipeHandle handle) {
-  message->WriteAttachment(new internal::MojoHandleAttachment(
-      mojo::ScopedHandle::From(std::move(handle))));
-  return true;
-}
-
-// static
-bool MojoMessageHelper::ReadMessagePipeFrom(
-    const base::Pickle* message,
-    base::PickleIterator* iter,
-    mojo::ScopedMessagePipeHandle* handle) {
-  scoped_refptr<base::Pickle::Attachment> attachment;
-  if (!message->ReadAttachment(iter, &attachment)) {
-    LOG(ERROR) << "Failed to read attachment for message pipe.";
-    return false;
-  }
-
-  MessageAttachment::Type type =
-      static_cast<MessageAttachment*>(attachment.get())->GetType();
-  if (type != MessageAttachment::Type::MOJO_HANDLE) {
-    LOG(ERROR) << "Unxpected attachment type:" << type;
-    return false;
-  }
-
-  handle->reset(mojo::MessagePipeHandle(
-      static_cast<internal::MojoHandleAttachment*>(attachment.get())
-          ->TakeHandle()
-          .release()
-          .value()));
-  return true;
-}
-
-MojoMessageHelper::MojoMessageHelper() {
-}
-
-}  // namespace IPC
diff --git a/ipc/ipc_mojo_message_helper.h b/ipc/ipc_mojo_message_helper.h
deleted file mode 100644
index 4a71b5c..0000000
--- a/ipc/ipc_mojo_message_helper.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2015 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 IPC_IPC_MOJO_MESSAGE_HELPER_H_
-#define IPC_IPC_MOJO_MESSAGE_HELPER_H_
-
-#include "ipc/ipc_export.h"
-#include "ipc/ipc_message.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace IPC {
-
-// Reads and writes |mojo::MessagePipe| from/to |Message|.
-class IPC_EXPORT MojoMessageHelper {
- public:
-  static bool WriteMessagePipeTo(base::Pickle* message,
-                                 mojo::ScopedMessagePipeHandle handle);
-  static bool ReadMessagePipeFrom(const base::Pickle* message,
-                                  base::PickleIterator* iter,
-                                  mojo::ScopedMessagePipeHandle* handle);
-
- private:
-  MojoMessageHelper();
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_MOJO_MESSAGE_HELPER_H_
diff --git a/ipc/ipc_mojo_param_traits.cc b/ipc/ipc_mojo_param_traits.cc
deleted file mode 100644
index 189af35..0000000
--- a/ipc/ipc_mojo_param_traits.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2015 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 "ipc/ipc_mojo_param_traits.h"
-
-#include "ipc/ipc_message_utils.h"
-#include "ipc/ipc_mojo_message_helper.h"
-
-namespace IPC {
-
-void ParamTraits<mojo::MessagePipeHandle>::GetSize(base::PickleSizer* sizer,
-                                                   const param_type& p) {
-  GetParamSize(sizer, p.is_valid());
-  if (p.is_valid())
-    sizer->AddAttachment();
-}
-
-void ParamTraits<mojo::MessagePipeHandle>::Write(base::Pickle* m,
-                                                 const param_type& p) {
-  WriteParam(m, p.is_valid());
-  if (p.is_valid())
-    MojoMessageHelper::WriteMessagePipeTo(m, mojo::ScopedMessagePipeHandle(p));
-}
-
-bool ParamTraits<mojo::MessagePipeHandle>::Read(const base::Pickle* m,
-                                                base::PickleIterator* iter,
-                                                param_type* r) {
-  bool is_valid;
-  if (!ReadParam(m, iter, &is_valid))
-    return false;
-  if (!is_valid)
-    return true;
-
-  mojo::ScopedMessagePipeHandle handle;
-  if (!MojoMessageHelper::ReadMessagePipeFrom(m, iter, &handle))
-    return false;
-  DCHECK(handle.is_valid());
-  *r = handle.release();
-  return true;
-}
-
-void ParamTraits<mojo::MessagePipeHandle>::Log(const param_type& p,
-                                               std::string* l) {
-  l->append("mojo::MessagePipeHandle(");
-  LogParam(p.value(), l);
-  l->append(")");
-}
-
-}  // namespace IPC
diff --git a/ipc/ipc_mojo_param_traits.h b/ipc/ipc_mojo_param_traits.h
deleted file mode 100644
index 39be43e..0000000
--- a/ipc/ipc_mojo_param_traits.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2015 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 IPC_IPC_MOJO_PARAM_TRAITS_H_
-#define IPC_IPC_MOJO_PARAM_TRAITS_H_
-
-#include <string>
-
-#include "ipc/ipc_export.h"
-#include "ipc/ipc_param_traits.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace base {
-class Pickle;
-class PickleIterator;
-class PickleSizer;
-}
-
-namespace IPC {
-
-template <>
-struct IPC_EXPORT ParamTraits<mojo::MessagePipeHandle> {
-  typedef mojo::MessagePipeHandle param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m, base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_MOJO_PARAM_TRAITS_H_
diff --git a/ipc/ipc_param_traits.h b/ipc/ipc_param_traits.h
deleted file mode 100644
index 45e975c..0000000
--- a/ipc/ipc_param_traits.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2010 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 IPC_IPC_PARAM_TRAITS_H_
-#define IPC_IPC_PARAM_TRAITS_H_
-
-// Our IPC system uses the following partially specialized header to define how
-// a data type is read, written and logged in the IPC system.
-
-namespace IPC {
-
-template <class P> struct ParamTraits {
-};
-
-template <class P>
-struct SimilarTypeTraits {
-  typedef P Type;
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_PARAM_TRAITS_H_
diff --git a/ipc/ipc_platform_file_attachment_posix.cc b/ipc/ipc_platform_file_attachment_posix.cc
deleted file mode 100644
index 7111cfa..0000000
--- a/ipc/ipc_platform_file_attachment_posix.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2015 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 "ipc/ipc_platform_file_attachment_posix.h"
-
-#include <utility>
-
-namespace IPC {
-namespace internal {
-
-PlatformFileAttachment::PlatformFileAttachment(base::PlatformFile file)
-    : file_(file) {
-}
-
-PlatformFileAttachment::PlatformFileAttachment(base::ScopedFD file)
-    : file_(file.get()), owning_(std::move(file)) {}
-
-PlatformFileAttachment::~PlatformFileAttachment() {
-}
-
-MessageAttachment::Type PlatformFileAttachment::GetType() const {
-  return Type::PLATFORM_FILE;
-}
-
-base::PlatformFile PlatformFileAttachment::TakePlatformFile() {
-  ignore_result(owning_.release());
-  return file_;
-}
-
-base::PlatformFile GetPlatformFile(
-    scoped_refptr<MessageAttachment> attachment) {
-  DCHECK_EQ(attachment->GetType(), MessageAttachment::Type::PLATFORM_FILE);
-  return static_cast<PlatformFileAttachment*>(attachment.get())->file();
-}
-
-}  // namespace internal
-}  // namespace IPC
diff --git a/ipc/ipc_platform_file_attachment_posix.h b/ipc/ipc_platform_file_attachment_posix.h
deleted file mode 100644
index 9b07900..0000000
--- a/ipc/ipc_platform_file_attachment_posix.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2015 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 IPC_IPC_PLATFORM_FILE_ATTACHMENT_H_
-#define IPC_IPC_PLATFORM_FILE_ATTACHMENT_H_
-
-#include "ipc/ipc_export.h"
-#include "ipc/ipc_message_attachment.h"
-
-namespace IPC {
-namespace internal {
-
-// A platform file that is sent over |Channel| as a part of |Message|.
-// PlatformFileAttachment optionally owns the file and |owning_| is set in that
-// case. Also, |file_| is not cleared even after the ownership is taken.
-// Some old clients require this strange behavior.
-class IPC_EXPORT PlatformFileAttachment : public MessageAttachment {
- public:
-  // Non-owning constructor
-  explicit PlatformFileAttachment(base::PlatformFile file);
-  // Owning constructor
-  explicit PlatformFileAttachment(base::ScopedFD file);
-
-  Type GetType() const override;
-  base::PlatformFile TakePlatformFile();
-
-  base::PlatformFile file() const { return file_; }
-  bool Owns() const { return owning_.is_valid(); }
-
- private:
-  ~PlatformFileAttachment() override;
-
-  base::PlatformFile file_;
-  base::ScopedFD owning_;
-};
-
-base::PlatformFile GetPlatformFile(scoped_refptr<MessageAttachment> attachment);
-
-}  // namespace internal
-}  // namespace IPC
-
-#endif  // IPC_IPC_PLATFORM_FILE_ATTACHMENT_H_
diff --git a/ipc/ipc_sync_message.h b/ipc/ipc_sync_message.h
deleted file mode 100644
index 7f05551..0000000
--- a/ipc/ipc_sync_message.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (c) 2012 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 IPC_IPC_SYNC_MESSAGE_H_
-#define IPC_IPC_SYNC_MESSAGE_H_
-
-#include <stdint.h>
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-
-#include <memory>
-#include <string>
-
-#include "build/build_config.h"
-#include "ipc/ipc_message.h"
-
-namespace base {
-class WaitableEvent;
-}
-
-namespace IPC {
-
-class MessageReplyDeserializer;
-
-class IPC_EXPORT SyncMessage : public Message {
- public:
-  SyncMessage(int32_t routing_id,
-              uint32_t type,
-              PriorityValue priority,
-              MessageReplyDeserializer* deserializer);
-  ~SyncMessage() override;
-
-  // Call this to get a deserializer for the output parameters.
-  // Note that this can only be called once, and the caller is responsible
-  // for deleting the deserializer when they're done.
-  MessageReplyDeserializer* GetReplyDeserializer();
-
-  // If this message can cause the receiver to block while waiting for user
-  // input (i.e. by calling MessageBox), then the caller needs to pump window
-  // messages and dispatch asynchronous messages while waiting for the reply.
-  // This call enables message pumping behavior while waiting for a reply to
-  // this message.
-  void EnableMessagePumping() {
-    header()->flags |= PUMPING_MSGS_BIT;
-  }
-
-  // Indicates whether window messages should be pumped while waiting for a
-  // reply to this message.
-  bool ShouldPumpMessages() const {
-    return (header()->flags & PUMPING_MSGS_BIT) != 0;
-  }
-
-  // Returns true if the message is a reply to the given request id.
-  static bool IsMessageReplyTo(const Message& msg, int request_id);
-
-  // Given a reply message, returns an iterator to the beginning of the data
-  // (i.e. skips over the synchronous specific data).
-  static base::PickleIterator GetDataIterator(const Message* msg);
-
-  // Given a synchronous message (or its reply), returns its id.
-  static int GetMessageId(const Message& msg);
-
-  // Generates a reply message to the given message.
-  static Message* GenerateReply(const Message* msg);
-
- private:
-  struct SyncHeader {
-    // unique ID (unique per sender)
-    int message_id;
-  };
-
-  static bool ReadSyncHeader(const Message& msg, SyncHeader* header);
-  static bool WriteSyncHeader(Message* msg, const SyncHeader& header);
-
-  std::unique_ptr<MessageReplyDeserializer> deserializer_;
-};
-
-// Used to deserialize parameters from a reply to a synchronous message
-class IPC_EXPORT MessageReplyDeserializer {
- public:
-  virtual ~MessageReplyDeserializer() {}
-  bool SerializeOutputParameters(const Message& msg);
- private:
-  // Derived classes need to implement this, using the given iterator (which
-  // is skipped past the header for synchronous messages).
-  virtual bool SerializeOutputParameters(const Message& msg,
-                                         base::PickleIterator iter) = 0;
-};
-
-// When sending a synchronous message, this structure contains an object
-// that knows how to deserialize the response.
-struct PendingSyncMsg {
-  PendingSyncMsg(int id, MessageReplyDeserializer* d, base::WaitableEvent* e)
-      : id(id), deserializer(d), done_event(e), send_result(false) {}
-
-  int id;
-  MessageReplyDeserializer* deserializer;
-  base::WaitableEvent* done_event;
-  bool send_result;
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_SYNC_MESSAGE_H_
diff --git a/libmojo.pc.in b/libmojo.pc.in
deleted file mode 100644
index a750bdd..0000000
--- a/libmojo.pc.in
+++ /dev/null
@@ -1,13 +0,0 @@
-bslot=@BSLOT@
-prefix=/usr
-exec_prefix=${prefix}
-libdir=${exec_prefix}/@LIB@
-includedir=${prefix}/include
-
-Name: libmojo
-Description: Chrome Mojo IPC library
-Requires.private:
-Version: ${bslot}
-Libs: -lmojo-${bslot}.pic
-Libs.private:
-Cflags: -I${includedir}/libmojo-${bslot} -Wno-cast-qual -Wno-cast-align
diff --git a/mojo/BUILD.gn b/mojo/BUILD.gn
deleted file mode 100644
index 070e2d1..0000000
--- a/mojo/BUILD.gn
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/ui.gni")
-
-group("mojo") {
-  # Meta-target, don't link into production code.
-  testonly = true
-  deps = [
-    ":tests",
-    "//mojo/common",
-  ]
-
-  if (!(is_linux && current_cpu == "x86")) {
-    deps += [ "//mojo/public" ]
-  }
-
-  if (is_android) {
-    deps += [ "//mojo/android" ]
-  }
-
-  deps += [ "//services/service_manager:all" ]
-}
-
-group("tests") {
-  testonly = true
-  deps = [
-    "//ipc:ipc_tests",
-    "//mojo/common:mojo_common_unittests",
-    "//mojo/edk/js/tests",
-    "//mojo/edk/system:mojo_message_pipe_perftests",
-    "//mojo/edk/system:mojo_system_unittests",
-    "//mojo/edk/test:mojo_public_bindings_perftests",
-    "//mojo/edk/test:mojo_public_bindings_unittests",
-    "//mojo/edk/test:mojo_public_system_perftests",
-    "//mojo/edk/test:mojo_public_system_unittests",
-    "//services/service_manager/public/cpp/tests:mojo_public_application_unittests",
-    "//services/service_manager/tests",
-  ]
-}
diff --git a/mojo/DEPS b/mojo/DEPS
deleted file mode 100644
index 49d7fd3..0000000
--- a/mojo/DEPS
+++ /dev/null
@@ -1,7 +0,0 @@
-include_rules = [
-  "+base",
-  "+build",
-  "+testing",
-
-  "+services/service_manager",
-]
diff --git a/mojo/PRESUBMIT.py b/mojo/PRESUBMIT.py
deleted file mode 100644
index 2766055..0000000
--- a/mojo/PRESUBMIT.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Presubmit script for mojo
-
-See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
-for more details about the presubmit API built into depot_tools.
-"""
-
-import os.path
-
-def CheckChangeOnUpload(input_api, output_api):
-  # Additional python module paths (we're in src/mojo/); not everyone needs
-  # them, but it's easiest to add them to everyone's path.
-  # For ply and jinja2:
-  third_party_path = os.path.join(
-      input_api.PresubmitLocalPath(), "..", "third_party")
-  # For the bindings generator:
-  mojo_public_bindings_pylib_path = os.path.join(
-      input_api.PresubmitLocalPath(), "public", "tools", "bindings", "pylib")
-  # For the python bindings:
-  mojo_python_bindings_path = os.path.join(
-      input_api.PresubmitLocalPath(), "public", "python")
-  # TODO(vtl): Don't lint these files until the (many) problems are fixed
-  # (possibly by deleting/rewriting some files).
-  temporary_black_list = input_api.DEFAULT_BLACK_LIST + \
-      (r".*\bpublic[\\\/]tools[\\\/]bindings[\\\/]pylib[\\\/]mojom[\\\/]"
-           r"generate[\\\/].+\.py$",
-       r".*\bpublic[\\\/]tools[\\\/]bindings[\\\/]generators[\\\/].+\.py$",
-       r".*\bspy[\\\/]ui[\\\/].+\.py$",
-       r".*\btools[\\\/]pylib[\\\/]transitive_hash\.py$",
-       r".*\btools[\\\/]test_runner\.py$")
-
-  results = []
-  pylint_extra_paths = [
-      third_party_path,
-      mojo_public_bindings_pylib_path,
-      mojo_python_bindings_path,
-  ]
-  results += input_api.canned_checks.RunPylint(
-      input_api, output_api, extra_paths_list=pylint_extra_paths,
-      black_list=temporary_black_list)
-  return results
diff --git a/mojo/README.md b/mojo/README.md
deleted file mode 100644
index e1e7583..0000000
--- a/mojo/README.md
+++ /dev/null
@@ -1,142 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Getting Started With Mojo
-
-To get started using Mojo in applications which already support it (such as
-Chrome), the fastest path forward will be to look at the bindings documentation
-for your language of choice ([**C++**](#C_Bindings),
-[**JavaScript**](#JavaScript-Bindings), or [**Java**](#Java-Bindings)) as well
-as the documentation for the
-[**Mojom IDL and bindings generator**](/mojo/public/tools/bindings).
-
-If you're looking for information on creating and/or connecting to services, see
-the top-level [Services documentation](/services).
-
-For specific details regarding the conversion of old things to new things, check
-out [Converting Legacy Chrome IPC To Mojo](/ipc).
-
-## System Overview
-
-Mojo is a layered collection of runtime libraries providing a platform-agnostic
-abstraction of common IPC primitives, a message IDL format, and a bindings
-library with code generation for multiple target languages to facilitate
-convenient message passing across arbitrary inter- and intra-process boundaries.
-
-The documentation here is segmented according to the different isolated layers
-and libraries comprising the system. The basic hierarchy of features is as
-follows:
-
-![Mojo Library Layering: EDK on bottom, different language bindings on top, public system support APIs in the middle](https://docs.google.com/drawings/d/1aNbLfF-fejgzxCxH_b8xAaCVvftW8BGTH_EHD7nvU1w/pub?w=570&h=327)
-
-## Embedder Development Kit (EDK)
-Every process to be interconnected via Mojo IPC is called a **Mojo embedder**
-and needs to embed the
-[**Embedder Development Kit (EDK)**](/mojo/edk/embedder) library. The EDK
-exposes the means for an embedder to physically connect one process to another
-using any supported native IPC primitive (*e.g.,* a UNIX domain socket or
-Windows named pipe) on the host platform.
-
-Details regarding where and how an application process actually embeds and
-configures the EDK are generaly hidden from the rest of the application code,
-and applications instead use the public System and Bindings APIs to get things
-done within processes that embed Mojo.
-
-## C System API
-Once the EDK is initialized within a process, the public
-[**C System API**](/mojo/public/c/system) is usable on any thread for the
-remainder of the process's lifetime. This is a lightweight API with a relatively
-small (and eventually stable) ABI. Typically this API is not used directly, but
-it is the foundation upon which all remaining upper layers are built. It exposes
-the fundamental capabilities to create and interact with various types of Mojo
-handles including **message pipes**, **data pipes**, and **shared buffers**.
-
-## High-Level System APIs
-
-There is a relatively small, higher-level system API for each supported
-language, built upon the low-level C API. Like the C API, direct usage of these
-system APIs is rare compared to the bindings APIs, but it is sometimes desirable
-or necessary.
-
-### C++
-The [**C++ System API**](/mojo/public/cpp/system) provides a layer of
-C++ helper classes and functions to make safe System API usage easier:
-strongly-typed handle scopers, synchronous waiting operations, system handle
-wrapping and unwrapping helpers, common handle operations, and utilities for
-more easily watching handle state changes.
-
-### JavaScript
-The [**JavaScript APIs**](/mojo/public/js) are WIP. :)
-
-### Java
-The [**Java System API**](/mojo/public/java/system) provides helper classes for
-working with Mojo primitives, covering all basic functionality of the low-level
-C API.
-
-## High-Level Bindings APIs
-Typically developers do not use raw message pipe I/O directly, but instead
-define some set of interfaces which are used to generate code that message pipe
-usage feel like a more idiomatic method-calling interface in the target
-language of choice. This is the bindings layer.
-
-### Mojom IDL and Bindings Generator
-Interfaces are defined using the [**Mojom IDL**](/mojo/public/tools/bindings),
-which can be fed to the [**bindings generator**](/mojo/public/tools/bindings) to
-generate code in various supported languages. Generated code manages
-serialization and deserialization of messages between interface clients and
-implementations, simplifying the code -- and ultimately hiding the message pipe
--- on either side of an interface connection.
-
-### C++ Bindings
-By far the most commonly used API defined by Mojo, the
-[**C++ Bindings API**](/mojo/public/cpp/bindings) exposes a robust set of
-features for interacting with message pipes via generated C++ bindings code,
-including support for sets of related bindings endpoints, associated interfaces,
-nested sync IPC, versioning, bad-message reporting, arbitrary message filter
-injection, and convenient test facilities.
-
-### JavaScript Bindings
-The [**JavaScript APIs**](/mojo/public/js) are WIP. :)
-
-### Java Bindings
-The [**Java Bindings API**](/mojo/public/java/bindings) provides helper classes
-for working with Java code emitted by the bindings generator.
-
-## FAQ
-
-### Why not protobuf? Why a new thing?
-There are number of potentially decent answers to this question, but the
-deal-breaker is that a useful IPC mechanism must support transfer of native
-object handles (*e.g.* file descriptors) across process boundaries. Other
-non-new IPC things that do support this capability (*e.g.* D-Bus) have their own
-substantial deficiencies.
-
-### Are message pipes expensive?
-No. As an implementation detail, creating a message pipe is essentially
-generating two random numbers and stuffing them into a hash table, along with a
-few tiny heap allocations.
-
-### So really, can I create like, thousands of them?
-Yes! Nobody will mind. Create millions if you like. (OK but maybe don't.)
-
-### Can I use in-process message pipes?
-Yes, and message pipe usage is identical regardless of whether the pipe actually
-crosses a process boundary -- in fact this detail is intentionally obscured.
-
-Message pipes which don't cross a process boundary are efficient: sent messages
-are never copied, and a write on one end will synchronously modify the message
-queue on the other end. When working with generated C++ bindings, for example,
-the net result is that an `InterfacePtr` on one thread sending a message to a
-`Binding` on another thread (or even the same thread) is effectively a
-`PostTask` to the `Binding`'s `TaskRunner` with the added -- but often small --
-costs of serialization, deserialization, validation, and some internal routing
-logic.
-
-### What about ____?
-
-Please post questions to
-[`chromium-mojo@chromium.org`](https://groups.google.com/a/chromium.org/forum/#!forum/chromium-mojo)!
-The list is quite responsive.
-
diff --git a/mojo/android/BUILD.gn b/mojo/android/BUILD.gn
deleted file mode 100644
index 1a8cdbd..0000000
--- a/mojo/android/BUILD.gn
+++ /dev/null
@@ -1,155 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/android/rules.gni")
-
-group("android") {
-  testonly = true
-  deps = [
-    ":mojo_javatests",
-    ":mojo_test_apk",
-    ":system_java",
-  ]
-}
-
-generate_jni("jni_headers") {
-  sources = [
-    "javatests/src/org/chromium/mojo/MojoTestCase.java",
-    "javatests/src/org/chromium/mojo/bindings/ValidationTestUtil.java",
-  ]
-  public_deps = [
-    ":system_java_jni_headers",
-  ]
-
-  jni_package = "mojo"
-}
-
-generate_jni("system_java_jni_headers") {
-  sources = [
-    "system/src/org/chromium/mojo/system/impl/BaseRunLoop.java",
-    "system/src/org/chromium/mojo/system/impl/CoreImpl.java",
-    "system/src/org/chromium/mojo/system/impl/WatcherImpl.java",
-  ]
-
-  jni_package = "mojo"
-}
-
-source_set("libsystem_java") {
-  sources = [
-    "system/base_run_loop.cc",
-    "system/base_run_loop.h",
-    "system/core_impl.cc",
-    "system/core_impl.h",
-    "system/watcher_impl.cc",
-    "system/watcher_impl.h",
-  ]
-
-  deps = [
-    ":system_java_jni_headers",
-    "//base",
-    "//mojo/public/c/system",
-    "//mojo/public/cpp/system",
-  ]
-}
-
-android_library("system_java") {
-  java_files = [
-    "system/src/org/chromium/mojo/system/impl/BaseRunLoop.java",
-    "system/src/org/chromium/mojo/system/impl/CoreImpl.java",
-    "system/src/org/chromium/mojo/system/impl/DataPipeConsumerHandleImpl.java",
-    "system/src/org/chromium/mojo/system/impl/DataPipeProducerHandleImpl.java",
-    "system/src/org/chromium/mojo/system/impl/HandleBase.java",
-    "system/src/org/chromium/mojo/system/impl/MessagePipeHandleImpl.java",
-    "system/src/org/chromium/mojo/system/impl/SharedBufferHandleImpl.java",
-    "system/src/org/chromium/mojo/system/impl/UntypedHandleImpl.java",
-    "system/src/org/chromium/mojo/system/impl/WatcherImpl.java",
-  ]
-
-  deps = [
-    "//base:base_java",
-    "//mojo/public/java:system_java",
-  ]
-}
-
-android_library("mojo_javatests") {
-  testonly = true
-  java_files = [
-    "javatests/src/org/chromium/mojo/HandleMock.java",
-    "javatests/src/org/chromium/mojo/MojoTestCase.java",
-    "javatests/src/org/chromium/mojo/TestUtils.java",
-    "javatests/src/org/chromium/mojo/bindings/BindingsHelperTest.java",
-    "javatests/src/org/chromium/mojo/bindings/BindingsTest.java",
-    "javatests/src/org/chromium/mojo/bindings/BindingsTestUtils.java",
-    "javatests/src/org/chromium/mojo/bindings/BindingsVersioningTest.java",
-    "javatests/src/org/chromium/mojo/bindings/CallbacksTest.java",
-    "javatests/src/org/chromium/mojo/bindings/ConnectorTest.java",
-    "javatests/src/org/chromium/mojo/bindings/ExecutorFactoryTest.java",
-    "javatests/src/org/chromium/mojo/bindings/InterfacesTest.java",
-    "javatests/src/org/chromium/mojo/bindings/MessageHeaderTest.java",
-    "javatests/src/org/chromium/mojo/bindings/ReadAndDispatchMessageTest.java",
-    "javatests/src/org/chromium/mojo/bindings/RouterTest.java",
-    "javatests/src/org/chromium/mojo/bindings/SerializationTest.java",
-    "javatests/src/org/chromium/mojo/bindings/test/mojom/mojo/IntegrationTestInterfaceTestHelper.java",
-    "javatests/src/org/chromium/mojo/bindings/ValidationTest.java",
-    "javatests/src/org/chromium/mojo/bindings/ValidationTestUtil.java",
-    "javatests/src/org/chromium/mojo/bindings/ValidationTestUtilTest.java",
-    "javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java",
-    "javatests/src/org/chromium/mojo/system/impl/WatcherImplTest.java",
-  ]
-
-  deps = [
-    ":system_java",
-    "//base:base_java",
-    "//base:base_java_test_support",
-    "//mojo/public/interfaces/bindings/tests:test_interfaces_java",
-    "//mojo/public/interfaces/bindings/tests:test_mojom_import2_java",
-    "//mojo/public/interfaces/bindings/tests:test_mojom_import_java",
-    "//mojo/public/java:bindings_java",
-    "//mojo/public/java:system_java",
-    "//third_party/android_support_test_runner:runner_java",
-  ]
-
-  data = [
-    "//mojo/public/interfaces/bindings/tests/data/validation/",
-  ]
-}
-
-shared_library("mojo_java_unittests") {
-  testonly = true
-
-  sources = [
-    "javatests/init_library.cc",
-    "javatests/mojo_test_case.cc",
-    "javatests/mojo_test_case.h",
-    "javatests/validation_test_util.cc",
-    "javatests/validation_test_util.h",
-  ]
-
-  deps = [
-    ":jni_headers",
-    ":libsystem_java",
-    ":system_java_jni_headers",
-    "//base",
-    "//base/test:test_support",
-    "//build/config/sanitizers:deps",
-    "//mojo/edk/system",
-    "//mojo/public/cpp/bindings/tests:mojo_public_bindings_test_utils",
-    "//mojo/public/cpp/test_support:test_utils",
-  ]
-  defines = [ "UNIT_TEST" ]
-}
-
-instrumentation_test_apk("mojo_test_apk") {
-  deps = [
-    ":mojo_javatests",
-    ":system_java",
-    "//base:base_java",
-    "//mojo/public/interfaces/bindings/tests:test_interfaces",
-    "//mojo/public/java:bindings_java",
-    "//third_party/android_support_test_runner:runner_java",
-  ]
-  shared_libraries = [ ":mojo_java_unittests" ]
-  apk_name = "MojoTest"
-  android_manifest = "javatests/AndroidManifest.xml"
-}
diff --git a/mojo/android/DEPS b/mojo/android/DEPS
deleted file mode 100644
index c80012b..0000000
--- a/mojo/android/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+jni",
-]
diff --git a/mojo/android/javatests/AndroidManifest.xml b/mojo/android/javatests/AndroidManifest.xml
deleted file mode 100644
index 32a3927..0000000
--- a/mojo/android/javatests/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-  <!-- Copyright (c) 2012 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. -->
-  <!-- package name must be unique so suffix with "tests" so package loader
-       doesn't ignore this. -->
-  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      xmlns:tools="http://schemas.android.com/tools"
-      package="org.chromium.mojo.tests">
-
-    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
-
-    <uses-permission android:name="android.permission.INJECT_EVENTS"
-        tools:ignore="ProtectedPermissions"/>
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.RUN_INSTRUMENTATION" />
-
-    <!-- We add an application tag here just so that we can indicate that this
-         package needs to link against the android.test library, which is
-         needed when building test cases. -->
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
-        android:targetPackage="org.chromium.mojo.tests"
-        android:label="Tests for org.chromium.mojo"/>
-
-</manifest>
diff --git a/mojo/android/javatests/DEPS b/mojo/android/javatests/DEPS
deleted file mode 100644
index 78cf465..0000000
--- a/mojo/android/javatests/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  # out should be allowed by default, but bots are failing on this.
-  "+out",
-]
diff --git a/mojo/android/javatests/apk/.empty b/mojo/android/javatests/apk/.empty
deleted file mode 100644
index e69de29..0000000
--- a/mojo/android/javatests/apk/.empty
+++ /dev/null
diff --git a/mojo/android/javatests/init_library.cc b/mojo/android/javatests/init_library.cc
deleted file mode 100644
index 9e1a593..0000000
--- a/mojo/android/javatests/init_library.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/android/base_jni_onload.h"
-#include "base/android/base_jni_registrar.h"
-#include "base/android/jni_android.h"
-#include "base/android/jni_registrar.h"
-#include "base/android/library_loader/library_loader_hooks.h"
-#include "base/bind.h"
-#include "mojo/android/javatests/mojo_test_case.h"
-#include "mojo/android/javatests/validation_test_util.h"
-#include "mojo/android/system/core_impl.h"
-#include "mojo/android/system/watcher_impl.h"
-#include "mojo/edk/embedder/embedder.h"
-
-namespace {
-
-base::android::RegistrationMethod kMojoRegisteredMethods[] = {
-    {"CoreImpl", mojo::android::RegisterCoreImpl},
-    {"MojoTestCase", mojo::android::RegisterMojoTestCase},
-    {"ValidationTestUtil", mojo::android::RegisterValidationTestUtil},
-    {"WatcherImpl", mojo::android::RegisterWatcherImpl},
-};
-
-bool RegisterJNI(JNIEnv* env) {
-  return base::android::RegisterJni(env) &&
-         RegisterNativeMethods(env, kMojoRegisteredMethods,
-                               arraysize(kMojoRegisteredMethods));
-}
-
-bool NativeInit() {
-  if (!base::android::OnJNIOnLoadInit())
-    return false;
-
-  mojo::edk::Init();
-  return true;
-}
-
-}  // namespace
-
-JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
-  base::android::InitVM(vm);
-  JNIEnv* env = base::android::AttachCurrentThread();
-  if (!base::android::OnJNIOnLoadRegisterJNI(env) || !RegisterJNI(env) ||
-      !NativeInit()) {
-    return -1;
-  }
-  return JNI_VERSION_1_4;
-}
diff --git a/mojo/android/javatests/mojo_test_case.cc b/mojo/android/javatests/mojo_test_case.cc
deleted file mode 100644
index fc59009..0000000
--- a/mojo/android/javatests/mojo_test_case.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/android/javatests/mojo_test_case.h"
-
-#include "base/android/jni_android.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/at_exit.h"
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/test/test_support_android.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "jni/MojoTestCase_jni.h"
-
-using base::android::JavaParamRef;
-
-namespace {
-
-struct TestEnvironment {
-  TestEnvironment() {}
-
-  base::ShadowingAtExitManager at_exit;
-  base::MessageLoop message_loop;
-};
-
-}  // namespace
-
-namespace mojo {
-namespace android {
-
-static void Init(JNIEnv* env, const JavaParamRef<jobject>& jcaller) {
-  base::InitAndroidTestMessageLoop();
-}
-
-static jlong SetupTestEnvironment(JNIEnv* env,
-                                  const JavaParamRef<jobject>& jcaller) {
-  return reinterpret_cast<intptr_t>(new TestEnvironment());
-}
-
-static void TearDownTestEnvironment(JNIEnv* env,
-                                    const JavaParamRef<jobject>& jcaller,
-                                    jlong test_environment) {
-  delete reinterpret_cast<TestEnvironment*>(test_environment);
-}
-
-static void RunLoop(JNIEnv* env,
-                    const JavaParamRef<jobject>& jcaller,
-                    jlong timeout_ms) {
-  base::RunLoop run_loop;
-  if (timeout_ms) {
-    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
-        base::TimeDelta::FromMilliseconds(timeout_ms));
-    run_loop.Run();
-  } else {
-    run_loop.RunUntilIdle();
-  }
-}
-
-bool RegisterMojoTestCase(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-}  // namespace android
-}  // namespace mojo
diff --git a/mojo/android/javatests/mojo_test_case.h b/mojo/android/javatests/mojo_test_case.h
deleted file mode 100644
index 2ce3428..0000000
--- a/mojo/android/javatests/mojo_test_case.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_ANDROID_JAVATESTS_CORE_TEST_H_
-#define MOJO_ANDROID_JAVATESTS_CORE_TEST_H_
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-
-namespace mojo {
-namespace android {
-
-JNI_EXPORT bool RegisterMojoTestCase(JNIEnv* env);
-
-}  // namespace android
-}  // namespace mojo
-
-#endif  // MOJO_SYSTEM_ANDROID_JAVATESTS_CORE_TEST_H_
diff --git a/mojo/android/javatests/src/org/chromium/mojo/HandleMock.java b/mojo/android/javatests/src/org/chromium/mojo/HandleMock.java
deleted file mode 100644
index 1f8de94..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/HandleMock.java
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo;
-
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Core.HandleSignalsState;
-import org.chromium.mojo.system.DataPipe;
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.SharedBufferHandle;
-import org.chromium.mojo.system.UntypedHandle;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-
-/**
- * A mock handle, that does nothing.
- */
-public class HandleMock implements UntypedHandle, MessagePipeHandle,
-        ProducerHandle, ConsumerHandle, SharedBufferHandle {
-
-    /**
-     * @see Handle#close()
-     */
-    @Override
-    public void close() {
-        // Do nothing.
-    }
-
-    /**
-     * @see Handle#querySignalsState()
-     */
-    @Override
-    public HandleSignalsState querySignalsState() {
-        return null;
-    }
-
-    /**
-     * @see Handle#isValid()
-     */
-    @Override
-    public boolean isValid() {
-        return true;
-    }
-
-    /**
-     * @see Handle#toUntypedHandle()
-     */
-    @Override
-    public UntypedHandle toUntypedHandle() {
-        return this;
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#getCore()
-     */
-    @Override
-    public Core getCore() {
-        return CoreImpl.getInstance();
-    }
-
-    /**
-     * @see org.chromium.mojo.system.UntypedHandle#pass()
-     */
-    @Override
-    public HandleMock pass() {
-        return this;
-    }
-
-    /**
-     * @see Handle#releaseNativeHandle()
-     */
-    @Override
-    public int releaseNativeHandle() {
-        return 0;
-    }
-
-    /**
-     * @see ConsumerHandle#discardData(int, DataPipe.ReadFlags)
-     */
-    @Override
-    public int discardData(int numBytes, DataPipe.ReadFlags flags) {
-        // Do nothing.
-        return 0;
-    }
-
-    /**
-     * @see ConsumerHandle#readData(java.nio.ByteBuffer, DataPipe.ReadFlags)
-     */
-    @Override
-    public ResultAnd<Integer> readData(ByteBuffer elements, DataPipe.ReadFlags flags) {
-        // Do nothing.
-        return new ResultAnd<Integer>(MojoResult.OK, 0);
-    }
-
-    /**
-     * @see ConsumerHandle#beginReadData(int, DataPipe.ReadFlags)
-     */
-    @Override
-    public ByteBuffer beginReadData(int numBytes,
-            DataPipe.ReadFlags flags) {
-        // Do nothing.
-        return null;
-    }
-
-    /**
-     * @see ConsumerHandle#endReadData(int)
-     */
-    @Override
-    public void endReadData(int numBytesRead) {
-        // Do nothing.
-    }
-
-    /**
-     * @see ProducerHandle#writeData(java.nio.ByteBuffer, DataPipe.WriteFlags)
-     */
-    @Override
-    public ResultAnd<Integer> writeData(ByteBuffer elements, DataPipe.WriteFlags flags) {
-        // Do nothing.
-        return new ResultAnd<Integer>(MojoResult.OK, 0);
-    }
-
-    /**
-     * @see ProducerHandle#beginWriteData(int, DataPipe.WriteFlags)
-     */
-    @Override
-    public ByteBuffer beginWriteData(int numBytes,
-            DataPipe.WriteFlags flags) {
-        // Do nothing.
-        return null;
-    }
-
-    /**
-     * @see ProducerHandle#endWriteData(int)
-     */
-    @Override
-    public void endWriteData(int numBytesWritten) {
-        // Do nothing.
-    }
-
-    /**
-     * @see MessagePipeHandle#writeMessage(java.nio.ByteBuffer, java.util.List,
-     *      MessagePipeHandle.WriteFlags)
-     */
-    @Override
-    public void writeMessage(ByteBuffer bytes, List<? extends Handle> handles,
-            WriteFlags flags) {
-        // Do nothing.
-    }
-
-    /**
-     * @see MessagePipeHandle#readMessage(java.nio.ByteBuffer, int, MessagePipeHandle.ReadFlags)
-     */
-    @Override
-    public ResultAnd<ReadMessageResult> readMessage(
-            ByteBuffer bytes, int maxNumberOfHandles, ReadFlags flags) {
-        // Do nothing.
-        return new ResultAnd<ReadMessageResult>(MojoResult.OK, new ReadMessageResult());
-    }
-
-    /**
-     * @see UntypedHandle#toMessagePipeHandle()
-     */
-    @Override
-    public MessagePipeHandle toMessagePipeHandle() {
-        return this;
-    }
-
-    /**
-     * @see UntypedHandle#toDataPipeConsumerHandle()
-     */
-    @Override
-    public ConsumerHandle toDataPipeConsumerHandle() {
-        return this;
-    }
-
-    /**
-     * @see UntypedHandle#toDataPipeProducerHandle()
-     */
-    @Override
-    public ProducerHandle toDataPipeProducerHandle() {
-        return this;
-    }
-
-    /**
-     * @see UntypedHandle#toSharedBufferHandle()
-     */
-    @Override
-    public SharedBufferHandle toSharedBufferHandle() {
-        return this;
-    }
-
-    /**
-     * @see SharedBufferHandle#duplicate(SharedBufferHandle.DuplicateOptions)
-     */
-    @Override
-    public SharedBufferHandle duplicate(DuplicateOptions options) {
-        // Do nothing.
-        return null;
-    }
-
-    /**
-     * @see SharedBufferHandle#map(long, long, SharedBufferHandle.MapFlags)
-     */
-    @Override
-    public ByteBuffer map(long offset, long numBytes, MapFlags flags) {
-        // Do nothing.
-        return null;
-    }
-
-    /**
-     * @see SharedBufferHandle#unmap(java.nio.ByteBuffer)
-     */
-    @Override
-    public void unmap(ByteBuffer buffer) {
-        // Do nothing.
-    }
-
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/MojoTestCase.java b/mojo/android/javatests/src/org/chromium/mojo/MojoTestCase.java
deleted file mode 100644
index f4d7ab7..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/MojoTestCase.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo;
-
-import android.test.InstrumentationTestCase;
-
-import org.chromium.base.ContextUtils;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.base.library_loader.LibraryLoader;
-import org.chromium.base.library_loader.LibraryProcessType;
-
-/**
- * Base class to test mojo. Setup the environment.
- */
-@JNINamespace("mojo::android")
-public class MojoTestCase extends InstrumentationTestCase {
-
-    private long mTestEnvironmentPointer;
-
-    /**
-     * @see junit.framework.TestCase#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        ContextUtils.initApplicationContext(
-                getInstrumentation().getTargetContext().getApplicationContext());
-        LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER).ensureInitialized();
-        nativeInit();
-        mTestEnvironmentPointer = nativeSetupTestEnvironment();
-    }
-
-    /**
-     * @see android.test.InstrumentationTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        nativeTearDownTestEnvironment(mTestEnvironmentPointer);
-        super.tearDown();
-    }
-
-    /**
-     * Runs the run loop for the given time.
-     */
-    protected void runLoop(long timeoutMS) {
-        nativeRunLoop(timeoutMS);
-    }
-
-    /**
-     * Runs the run loop until no handle or task are immediately available.
-     */
-    protected void runLoopUntilIdle() {
-        nativeRunLoop(0);
-    }
-
-    private native void nativeInit();
-
-    private native long nativeSetupTestEnvironment();
-
-    private native void nativeTearDownTestEnvironment(long testEnvironment);
-
-    private native void nativeRunLoop(long timeoutMS);
-
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/TestUtils.java b/mojo/android/javatests/src/org/chromium/mojo/TestUtils.java
deleted file mode 100644
index d10d0d7..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/TestUtils.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Random;
-
-/**
- * Utilities methods for tests.
- */
-public final class TestUtils {
-
-    private static final Random RANDOM = new Random();
-
-    /**
-     * Returns a new direct ByteBuffer of the given size with random (but reproducible) data.
-     */
-    public static ByteBuffer newRandomBuffer(int size) {
-        byte bytes[] = new byte[size];
-        RANDOM.setSeed(size);
-        RANDOM.nextBytes(bytes);
-        ByteBuffer data = ByteBuffer.allocateDirect(size);
-        data.order(ByteOrder.LITTLE_ENDIAN);
-        data.put(bytes);
-        data.flip();
-        return data;
-    }
-
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsHelperTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsHelperTest.java
deleted file mode 100644
index 38bd348..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsHelperTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import junit.framework.TestCase;
-
-import java.nio.charset.Charset;
-
-/**
- * Testing {@link BindingsHelper}.
- */
-public class BindingsHelperTest extends TestCase {
-
-    /**
-     * Testing {@link BindingsHelper#utf8StringSizeInBytes(String)}.
-     */
-    @SmallTest
-    public void testUTF8StringLength() {
-        String[] stringsToTest = {
-            "",
-            "a",
-            "hello world",
-            "éléphant",
-            "𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕",
-            "你午饭想吃什么",
-            "你午饭想吃什么\0éléphant",
-        };
-        for (String s : stringsToTest) {
-            assertEquals(s.getBytes(Charset.forName("utf8")).length,
-                    BindingsHelper.utf8StringSizeInBytes(s));
-        }
-        assertEquals(1, BindingsHelper.utf8StringSizeInBytes("\0"));
-        String s = new StringBuilder().appendCodePoint(0x0).appendCodePoint(0x80)
-                .appendCodePoint(0x800).appendCodePoint(0x10000).toString();
-        assertEquals(10, BindingsHelper.utf8StringSizeInBytes(s));
-        assertEquals(10, s.getBytes(Charset.forName("utf8")).length);
-    }
-
-    /**
-     * Testing {@link BindingsHelper#align(int)}.
-     */
-    @SmallTest
-    public void testAlign() {
-        for (int i = 0; i < 3 * BindingsHelper.ALIGNMENT; ++i) {
-            int j = BindingsHelper.align(i);
-            assertTrue(j >= i);
-            assertTrue(j % BindingsHelper.ALIGNMENT == 0);
-            assertTrue(j - i < BindingsHelper.ALIGNMENT);
-        }
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsTest.java
deleted file mode 100644
index d280c77..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsTest.java
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import junit.framework.TestCase;
-
-import org.chromium.mojo.HandleMock;
-import org.chromium.mojo.bindings.test.mojom.imported.Color;
-import org.chromium.mojo.bindings.test.mojom.imported.Point;
-import org.chromium.mojo.bindings.test.mojom.imported.Shape;
-import org.chromium.mojo.bindings.test.mojom.imported.Thing;
-import org.chromium.mojo.bindings.test.mojom.sample.Bar;
-import org.chromium.mojo.bindings.test.mojom.sample.Bar.Type;
-import org.chromium.mojo.bindings.test.mojom.sample.DefaultsTest;
-import org.chromium.mojo.bindings.test.mojom.sample.Enum;
-import org.chromium.mojo.bindings.test.mojom.sample.Foo;
-import org.chromium.mojo.bindings.test.mojom.sample.InterfaceConstants;
-import org.chromium.mojo.bindings.test.mojom.sample.SampleServiceConstants;
-import org.chromium.mojo.bindings.test.mojom.test_structs.EmptyStruct;
-import org.chromium.mojo.bindings.test.mojom.test_structs.Rect;
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-import org.chromium.mojo.system.MessagePipeHandle;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Testing generated classes and associated features.
- */
-public class BindingsTest extends TestCase {
-
-    /**
-     * Create a new typical Bar instance.
-     */
-    private static Bar newBar() {
-        Bar bar = new Bar();
-        bar.alpha = (byte) 0x01;
-        bar.beta = (byte) 0x02;
-        bar.gamma = (byte) 0x03;
-        bar.type = Type.BOTH;
-        return bar;
-    }
-
-    /**
-     * Create a new typical Foo instance.
-     */
-    private static Foo createFoo() {
-        Foo foo = new Foo();
-        foo.name = "HELLO WORLD";
-        foo.arrayOfArrayOfBools = new boolean[][] {
-            { true, false, true }, { }, { }, { false }, { true } };
-        foo.bar = newBar();
-        foo.a = true;
-        foo.c = true;
-        foo.data = new byte[] { 0x01, 0x02, 0x03 };
-        foo.extraBars = new Bar[] { newBar(), newBar() };
-        String[][][] strings = new String[3][2][1];
-        for (int i0 = 0; i0 < strings.length; ++i0) {
-            for (int i1 = 0; i1 < strings[i0].length; ++i1) {
-                for (int i2 = 0; i2 < strings[i0][i1].length; ++i2) {
-                    strings[i0][i1][i2] = "Hello(" + i0 + ", " + i1 + ", " + i2 + ")";
-                }
-            }
-        }
-        foo.multiArrayOfStrings = strings;
-        ConsumerHandle[] inputStreams = new ConsumerHandle[5];
-        for (int i = 0; i < inputStreams.length; ++i) {
-            inputStreams[i] = new HandleMock();
-        }
-        foo.inputStreams = inputStreams;
-        ProducerHandle[] outputStreams = new ProducerHandle[3];
-        for (int i = 0; i < outputStreams.length; ++i) {
-            outputStreams[i] = new HandleMock();
-        }
-        foo.outputStreams = outputStreams;
-        foo.source = new HandleMock();
-        return foo;
-    }
-
-    private static Rect createRect(int x, int y, int width, int height) {
-        Rect rect = new Rect();
-        rect.x = x;
-        rect.y = y;
-        rect.width = width;
-        rect.height = height;
-        return rect;
-    }
-
-    private static <T> void checkConstantField(
-            Field field, Class<T> expectedClass, T value) throws IllegalAccessException {
-        assertEquals(expectedClass, field.getType());
-        assertEquals(Modifier.FINAL, field.getModifiers() & Modifier.FINAL);
-        assertEquals(Modifier.STATIC, field.getModifiers() & Modifier.STATIC);
-        assertEquals(value, field.get(null));
-    }
-
-    private static <T> void checkField(Field field, Class<T> expectedClass,
-            Object object, T value) throws IllegalArgumentException, IllegalAccessException {
-        assertEquals(expectedClass, field.getType());
-        assertEquals(0, field.getModifiers() & Modifier.FINAL);
-        assertEquals(0, field.getModifiers() & Modifier.STATIC);
-        assertEquals(value, field.get(object));
-    }
-
-    /**
-     * Testing constants are correctly generated.
-     */
-    @SmallTest
-    public void testConstants() throws NoSuchFieldException, SecurityException,
-            IllegalAccessException {
-        checkConstantField(SampleServiceConstants.class.getField("TWELVE"), byte.class, (byte) 12);
-        checkConstantField(InterfaceConstants.class.getField("LONG"), long.class, 4405L);
-    }
-
-    /**
-     * Testing enums are correctly generated.
-     */
-    @SmallTest
-    public void testEnums() throws NoSuchFieldException, SecurityException,
-            IllegalAccessException {
-        checkConstantField(Color.class.getField("RED"), int.class, 0);
-        checkConstantField(Color.class.getField("BLACK"), int.class, 1);
-
-        checkConstantField(Enum.class.getField("VALUE"), int.class, 0);
-
-        checkConstantField(Shape.class.getField("RECTANGLE"), int.class, 1);
-        checkConstantField(Shape.class.getField("CIRCLE"), int.class, 2);
-        checkConstantField(Shape.class.getField("TRIANGLE"), int.class, 3);
-    }
-
-    /**
-     * Testing default values on structs.
-     *
-     * @throws IllegalAccessException
-     * @throws IllegalArgumentException
-     */
-    @SmallTest
-    public void testStructDefaults() throws NoSuchFieldException, SecurityException,
-            IllegalArgumentException, IllegalAccessException {
-        // Check default values.
-        DefaultsTest test = new DefaultsTest();
-
-        checkField(DefaultsTest.class.getField("a0"), byte.class, test, (byte) -12);
-        checkField(DefaultsTest.class.getField("a1"), byte.class, test, (byte) 12);
-        checkField(DefaultsTest.class.getField("a2"), short.class, test, (short) 1234);
-        checkField(DefaultsTest.class.getField("a3"), short.class, test, (short) 34567);
-        checkField(DefaultsTest.class.getField("a4"), int.class, test, 123456);
-        checkField(DefaultsTest.class.getField("a5"), int.class, test, (int) 3456789012L);
-        checkField(DefaultsTest.class.getField("a6"), long.class, test, -111111111111L);
-        // -8446744073709551617 == 9999999999999999999 - 2 ^ 64.
-        checkField(DefaultsTest.class.getField("a7"), long.class, test, -8446744073709551617L);
-        checkField(DefaultsTest.class.getField("a8"), int.class, test, 0x12345);
-        checkField(DefaultsTest.class.getField("a9"), int.class, test, -0x12345);
-        checkField(DefaultsTest.class.getField("a10"), int.class, test, 1234);
-        checkField(DefaultsTest.class.getField("a11"), boolean.class, test, true);
-        checkField(DefaultsTest.class.getField("a12"), boolean.class, test, false);
-        checkField(DefaultsTest.class.getField("a13"), float.class, test, (float) 123.25);
-        checkField(DefaultsTest.class.getField("a14"), double.class, test, 1234567890.123);
-        checkField(DefaultsTest.class.getField("a15"), double.class, test, 1E10);
-        checkField(DefaultsTest.class.getField("a16"), double.class, test, -1.2E+20);
-        checkField(DefaultsTest.class.getField("a17"), double.class, test, +1.23E-20);
-        checkField(DefaultsTest.class.getField("a18"), byte[].class, test, null);
-        checkField(DefaultsTest.class.getField("a19"), String.class, test, null);
-        checkField(DefaultsTest.class.getField("a20"), int.class, test, Bar.Type.BOTH);
-        checkField(DefaultsTest.class.getField("a21"), Point.class, test, null);
-
-        assertNotNull(test.a22);
-        checkField(DefaultsTest.class.getField("a22"), Thing.class, test, test.a22);
-        checkField(DefaultsTest.class.getField("a23"), long.class, test, -1L);
-        checkField(DefaultsTest.class.getField("a24"), long.class, test, 0x123456789L);
-        checkField(DefaultsTest.class.getField("a25"), long.class, test, -0x123456789L);
-    }
-
-    /**
-     * Testing generation of the Foo class.
-     *
-     * @throws IllegalAccessException
-     */
-    @SmallTest
-    public void testFooGeneration() throws NoSuchFieldException, SecurityException,
-            IllegalAccessException {
-        // Checking Foo constants.
-        checkConstantField(Foo.class.getField("FOOBY"), String.class, "Fooby");
-
-        // Checking Foo default values.
-        Foo foo = new Foo();
-        checkField(Foo.class.getField("name"), String.class, foo, Foo.FOOBY);
-
-        assertNotNull(foo.source);
-        assertFalse(foo.source.isValid());
-        checkField(Foo.class.getField("source"), MessagePipeHandle.class, foo, foo.source);
-    }
-
-    /**
-     * Testing serialization of the Foo class.
-     */
-    @SmallTest
-    public void testFooSerialization() {
-        // Checking serialization and deserialization of a Foo object.
-        Foo typicalFoo = createFoo();
-        Message serializedFoo = typicalFoo.serialize(null);
-        Foo deserializedFoo = Foo.deserialize(serializedFoo);
-        assertEquals(typicalFoo, deserializedFoo);
-    }
-
-    /**
-     * Testing serialization of the EmptyStruct class.
-     */
-    @SmallTest
-    public void testEmptyStructSerialization() {
-        // Checking serialization and deserialization of a EmptyStruct object.
-        Message serializedStruct = new EmptyStruct().serialize(null);
-        EmptyStruct emptyStruct = EmptyStruct.deserialize(serializedStruct);
-        assertNotNull(emptyStruct);
-    }
-
-    // In testing maps we want to make sure that the key used when inserting an
-    // item the key used when looking it up again are different objects. Java
-    // has default implementations of equals and hashCode that use reference
-    // equality and hashing, respectively, and that's not what we want for our
-    // mojom values.
-    @SmallTest
-    public void testHashMapStructKey() {
-        Map<Rect, Integer> map = new HashMap<>();
-        map.put(createRect(1, 2, 3, 4), 123);
-
-        Rect key = createRect(1, 2, 3, 4);
-        assertNotNull(map.get(key));
-        assertEquals(123, map.get(key).intValue());
-
-        map.remove(key);
-        assertTrue(map.isEmpty());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsTestUtils.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsTestUtils.java
deleted file mode 100644
index 5554f80..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsTestUtils.java
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.TestUtils;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.io.Closeable;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Utility class for bindings tests.
- */
-public class BindingsTestUtils {
-
-    /**
-     * {@link MessageReceiver} that records any message it receives.
-     */
-    public static class RecordingMessageReceiver extends SideEffectFreeCloseable
-            implements MessageReceiver {
-
-        public final List<Message> messages = new ArrayList<Message>();
-
-        /**
-         * @see MessageReceiver#accept(Message)
-         */
-        @Override
-        public boolean accept(Message message) {
-            messages.add(message);
-            return true;
-        }
-    }
-
-    /**
-     * {@link MessageReceiverWithResponder} that records any message it receives.
-     */
-    public static class RecordingMessageReceiverWithResponder extends RecordingMessageReceiver
-            implements MessageReceiverWithResponder {
-
-        public final List<Pair<Message, MessageReceiver>> messagesWithReceivers =
-                new ArrayList<Pair<Message, MessageReceiver>>();
-
-        /**
-         * @see MessageReceiverWithResponder#acceptWithResponder(Message, MessageReceiver)
-         */
-        @Override
-        public boolean acceptWithResponder(Message message, MessageReceiver responder) {
-            messagesWithReceivers.add(Pair.create(message, responder));
-            return true;
-        }
-    }
-
-    /**
-     * {@link ConnectionErrorHandler} that records any error it received.
-     */
-    public static class CapturingErrorHandler implements ConnectionErrorHandler {
-
-        private MojoException mLastMojoException = null;
-
-        /**
-         * @see ConnectionErrorHandler#onConnectionError(MojoException)
-         */
-        @Override
-        public void onConnectionError(MojoException e) {
-            mLastMojoException = e;
-        }
-
-        /**
-         * Returns the last recorded exception.
-         */
-        public MojoException getLastMojoException() {
-            return mLastMojoException;
-        }
-
-    }
-
-    /**
-     * Creates a new valid {@link Message}. The message will have a valid header.
-     */
-    public static Message newRandomMessage(int size) {
-        assert size > 16;
-        ByteBuffer message = TestUtils.newRandomBuffer(size);
-        int[] headerAsInts = {16, 2, 0, 0};
-        for (int i = 0; i < 4; ++i) {
-            message.putInt(4 * i, headerAsInts[i]);
-        }
-        message.position(0);
-        return new Message(message, new ArrayList<Handle>());
-    }
-
-    public static <I extends Interface, P extends Interface.Proxy> P newProxyOverPipe(
-            Interface.Manager<I, P> manager, I impl, List<Closeable> toClose) {
-        Pair<MessagePipeHandle, MessagePipeHandle> handles =
-                CoreImpl.getInstance().createMessagePipe(null);
-        P proxy = manager.attachProxy(handles.first, 0);
-        toClose.add(proxy);
-        manager.bind(impl, handles.second);
-        return proxy;
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsVersioningTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsVersioningTest.java
deleted file mode 100644
index eea92ab..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsVersioningTest.java
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStruct;
-import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV0;
-import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV1;
-import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV3;
-import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV5;
-import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV7;
-import org.chromium.mojo.bindings.test.mojom.test_structs.Rect;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-/**
- * Testing generated classes with the [MinVersion] annotation. Struct in this test are from:
- * mojo/public/interfaces/bindings/tests/rect.mojom and
- * mojo/public/interfaces/bindings/tests/test_structs.mojom
- */
-public class BindingsVersioningTest extends MojoTestCase {
-    private static Rect newRect(int factor) {
-        Rect rect = new Rect();
-        rect.x = factor;
-        rect.y = 2 * factor;
-        rect.width = 10 * factor;
-        rect.height = 20 * factor;
-        return rect;
-    }
-
-    private static MultiVersionStruct newStruct() {
-        MultiVersionStruct struct = new MultiVersionStruct();
-        struct.fInt32 = 123;
-        struct.fRect = newRect(5);
-        struct.fString = "hello";
-        struct.fArray = new byte[] {10, 9, 8};
-        struct.fBool = true;
-        struct.fInt16 = 256;
-        return struct;
-    }
-
-    /**
-     * Testing serializing old struct version to newer one.
-     */
-    @SmallTest
-    public void testOldToNew() {
-        {
-            MultiVersionStructV0 v0 = new MultiVersionStructV0();
-            v0.fInt32 = 123;
-            MultiVersionStruct expected = new MultiVersionStruct();
-            expected.fInt32 = 123;
-
-            MultiVersionStruct output = MultiVersionStruct.deserialize(v0.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(0, v0.getVersion());
-            assertEquals(0, output.getVersion());
-        }
-
-        {
-            MultiVersionStructV1 v1 = new MultiVersionStructV1();
-            v1.fInt32 = 123;
-            v1.fRect = newRect(5);
-            MultiVersionStruct expected = new MultiVersionStruct();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-
-            MultiVersionStruct output = MultiVersionStruct.deserialize(v1.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(1, v1.getVersion());
-            assertEquals(1, output.getVersion());
-        }
-
-        {
-            MultiVersionStructV3 v3 = new MultiVersionStructV3();
-            v3.fInt32 = 123;
-            v3.fRect = newRect(5);
-            v3.fString = "hello";
-            MultiVersionStruct expected = new MultiVersionStruct();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-            expected.fString = "hello";
-
-            MultiVersionStruct output = MultiVersionStruct.deserialize(v3.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(3, v3.getVersion());
-            assertEquals(3, output.getVersion());
-        }
-
-        {
-            MultiVersionStructV5 v5 = new MultiVersionStructV5();
-            v5.fInt32 = 123;
-            v5.fRect = newRect(5);
-            v5.fString = "hello";
-            v5.fArray = new byte[] {10, 9, 8};
-            MultiVersionStruct expected = new MultiVersionStruct();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-            expected.fString = "hello";
-            expected.fArray = new byte[] {10, 9, 8};
-
-            MultiVersionStruct output = MultiVersionStruct.deserialize(v5.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(5, v5.getVersion());
-            assertEquals(5, output.getVersion());
-        }
-
-        {
-            int expectedHandle = 42;
-            MultiVersionStructV7 v7 = new MultiVersionStructV7();
-            v7.fInt32 = 123;
-            v7.fRect = newRect(5);
-            v7.fString = "hello";
-            v7.fArray = new byte[] {10, 9, 8};
-            v7.fMessagePipe = CoreImpl.getInstance()
-                                      .acquireNativeHandle(expectedHandle)
-                                      .toMessagePipeHandle();
-            v7.fBool = true;
-            MultiVersionStruct expected = new MultiVersionStruct();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-            expected.fString = "hello";
-            expected.fArray = new byte[] {10, 9, 8};
-            expected.fBool = true;
-
-            MultiVersionStruct output = MultiVersionStruct.deserialize(v7.serialize(null));
-
-            // Handles must be tested separately.
-            assertEquals(expectedHandle, output.fMessagePipe.releaseNativeHandle());
-            output.fMessagePipe = expected.fMessagePipe;
-
-            assertEquals(expected, output);
-            assertEquals(7, v7.getVersion());
-            assertEquals(7, output.getVersion());
-        }
-    }
-
-    /**
-     * Testing serializing new struct version to older one.
-     */
-    @SmallTest
-    public void testNewToOld() {
-        MultiVersionStruct struct = newStruct();
-        {
-            MultiVersionStructV0 expected = new MultiVersionStructV0();
-            expected.fInt32 = 123;
-
-            MultiVersionStructV0 output = MultiVersionStructV0.deserialize(struct.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(9, output.getVersion());
-        }
-
-        {
-            MultiVersionStructV1 expected = new MultiVersionStructV1();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-
-            MultiVersionStructV1 output = MultiVersionStructV1.deserialize(struct.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(9, output.getVersion());
-        }
-
-        {
-            MultiVersionStructV3 expected = new MultiVersionStructV3();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-            expected.fString = "hello";
-
-            MultiVersionStructV3 output = MultiVersionStructV3.deserialize(struct.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(9, output.getVersion());
-        }
-
-        {
-            MultiVersionStructV5 expected = new MultiVersionStructV5();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-            expected.fString = "hello";
-            expected.fArray = new byte[] {10, 9, 8};
-
-            MultiVersionStructV5 output = MultiVersionStructV5.deserialize(struct.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(9, output.getVersion());
-        }
-
-        {
-            int expectedHandle = 42;
-            MultiVersionStructV7 expected = new MultiVersionStructV7();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-            expected.fString = "hello";
-            expected.fArray = new byte[] {10, 9, 8};
-            expected.fBool = true;
-
-            MultiVersionStruct input = struct;
-            input.fMessagePipe = CoreImpl.getInstance()
-                                         .acquireNativeHandle(expectedHandle)
-                                         .toMessagePipeHandle();
-
-            MultiVersionStructV7 output = MultiVersionStructV7.deserialize(input.serialize(null));
-
-            assertEquals(expectedHandle, output.fMessagePipe.releaseNativeHandle());
-            output.fMessagePipe = expected.fMessagePipe;
-
-            assertEquals(expected, output);
-            assertEquals(9, output.getVersion());
-        }
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/CallbacksTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/CallbacksTest.java
deleted file mode 100644
index 497be65..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/CallbacksTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import junit.framework.TestCase;
-
-import org.chromium.mojo.bindings.Callbacks.Callback1;
-import org.chromium.mojo.bindings.Callbacks.Callback7;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Testing generated callbacks
- */
-public class CallbacksTest extends TestCase {
-
-    /**
-     * Testing {@link Callback1}.
-     */
-    @SmallTest
-    public void testCallback1() {
-        final List<Integer> parameters = new ArrayList<Integer>();
-        new Callback1<Integer>() {
-            @Override
-            public void call(Integer i1) {
-                parameters.add(i1);
-            }
-        }.call(1);
-        assertEquals(Arrays.asList(1), parameters);
-    }
-
-    /**
-     * Testing {@link Callback7}.
-     */
-    @SmallTest
-    public void testCallback7() {
-        final List<Integer> parameters = new ArrayList<Integer>();
-        new Callback7<Integer, Integer, Integer, Integer, Integer, Integer, Integer>() {
-            @Override
-            public void call(Integer i1, Integer i2, Integer i3, Integer i4, Integer i5, Integer i6,
-                    Integer i7) {
-                parameters.add(i1);
-                parameters.add(i2);
-                parameters.add(i3);
-                parameters.add(i4);
-                parameters.add(i5);
-                parameters.add(i6);
-                parameters.add(i7);
-            }
-        }.call(1, 2, 3, 4, 5, 6, 7);
-        assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6, 7), parameters);
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ConnectorTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ConnectorTest.java
deleted file mode 100644
index 15f9f1f..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/ConnectorTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.BindingsTestUtils.CapturingErrorHandler;
-import org.chromium.mojo.bindings.BindingsTestUtils.RecordingMessageReceiver;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-
-/**
- * Testing the {@link Connector} class.
- */
-public class ConnectorTest extends MojoTestCase {
-
-    private static final int DATA_LENGTH = 1024;
-
-    private MessagePipeHandle mHandle;
-    private Connector mConnector;
-    private Message mTestMessage;
-    private RecordingMessageReceiver mReceiver;
-    private CapturingErrorHandler mErrorHandler;
-
-    /**
-     * @see MojoTestCase#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(
-                new MessagePipeHandle.CreateOptions());
-        mHandle = handles.first;
-        mConnector = new Connector(handles.second);
-        mReceiver = new RecordingMessageReceiver();
-        mConnector.setIncomingMessageReceiver(mReceiver);
-        mErrorHandler = new CapturingErrorHandler();
-        mConnector.setErrorHandler(mErrorHandler);
-        mConnector.start();
-        mTestMessage = BindingsTestUtils.newRandomMessage(DATA_LENGTH);
-        assertNull(mErrorHandler.getLastMojoException());
-        assertEquals(0, mReceiver.messages.size());
-    }
-
-    /**
-     * @see MojoTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        mConnector.close();
-        mHandle.close();
-        super.tearDown();
-    }
-
-    /**
-     * Test sending a message through a {@link Connector}.
-     */
-    @SmallTest
-    public void testSendingMessage() {
-        mConnector.accept(mTestMessage);
-        assertNull(mErrorHandler.getLastMojoException());
-        ByteBuffer received = ByteBuffer.allocateDirect(DATA_LENGTH);
-        ResultAnd<MessagePipeHandle.ReadMessageResult> result =
-                mHandle.readMessage(received, 0, MessagePipeHandle.ReadFlags.NONE);
-        assertEquals(MojoResult.OK, result.getMojoResult());
-        assertEquals(DATA_LENGTH, result.getValue().getMessageSize());
-        assertEquals(mTestMessage.getData(), received);
-    }
-
-    /**
-     * Test receiving a message through a {@link Connector}
-     */
-    @SmallTest
-    public void testReceivingMessage() {
-        mHandle.writeMessage(mTestMessage.getData(), new ArrayList<Handle>(),
-                MessagePipeHandle.WriteFlags.NONE);
-        runLoopUntilIdle();
-        assertNull(mErrorHandler.getLastMojoException());
-        assertEquals(1, mReceiver.messages.size());
-        Message received = mReceiver.messages.get(0);
-        assertEquals(0, received.getHandles().size());
-        assertEquals(mTestMessage.getData(), received.getData());
-    }
-
-    /**
-     * Test receiving an error through a {@link Connector}.
-     */
-    @SmallTest
-    public void testErrors() {
-        mHandle.close();
-        runLoopUntilIdle();
-        assertNotNull(mErrorHandler.getLastMojoException());
-        assertEquals(MojoResult.FAILED_PRECONDITION,
-                mErrorHandler.getLastMojoException().getMojoResult());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ExecutorFactoryTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ExecutorFactoryTest.java
deleted file mode 100644
index cabe230..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/ExecutorFactoryTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.BrokenBarrierException;
-import java.util.concurrent.CyclicBarrier;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-/**
- * Testing the executor factory.
- */
-public class ExecutorFactoryTest extends MojoTestCase {
-
-    private static final long RUN_LOOP_TIMEOUT_MS = 50;
-    private static final int CONCURRENCY_LEVEL = 5;
-    private static final ExecutorService WORKERS = Executors.newFixedThreadPool(CONCURRENCY_LEVEL);
-
-    private Executor mExecutor;
-    private List<Thread> mThreadContainer;
-
-    /**
-     * @see MojoTestCase#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mExecutor = ExecutorFactory.getExecutorForCurrentThread(CoreImpl.getInstance());
-        mThreadContainer = new ArrayList<Thread>();
-    }
-
-    /**
-     * Testing the {@link Executor} when called from the executor thread.
-     */
-    @SmallTest
-    public void testExecutorOnCurrentThread() {
-        Runnable action = new Runnable() {
-            @Override
-            public void run() {
-                mThreadContainer.add(Thread.currentThread());
-            }
-        };
-        mExecutor.execute(action);
-        mExecutor.execute(action);
-        assertEquals(0, mThreadContainer.size());
-        runLoop(RUN_LOOP_TIMEOUT_MS);
-        assertEquals(2, mThreadContainer.size());
-        for (Thread thread : mThreadContainer) {
-            assertEquals(Thread.currentThread(), thread);
-        }
-    }
-
-    /**
-     * Testing the {@link Executor} when called from another thread.
-     */
-    @SmallTest
-    public void testExecutorOnOtherThread() {
-        final CyclicBarrier barrier = new CyclicBarrier(CONCURRENCY_LEVEL + 1);
-        for (int i = 0; i < CONCURRENCY_LEVEL; ++i) {
-            WORKERS.execute(new Runnable() {
-                @Override
-                public void run() {
-                    mExecutor.execute(new Runnable() {
-
-                        @Override
-                        public void run() {
-                            mThreadContainer.add(Thread.currentThread());
-                        }
-                    });
-                    try {
-                        barrier.await();
-                    } catch (InterruptedException e) {
-                        fail("Unexpected exception: " + e.getMessage());
-                    } catch (BrokenBarrierException e) {
-                        fail("Unexpected exception: " + e.getMessage());
-                    }
-                }
-            });
-        }
-        try {
-            barrier.await();
-        } catch (InterruptedException e) {
-            fail("Unexpected exception: " + e.getMessage());
-        } catch (BrokenBarrierException e) {
-            fail("Unexpected exception: " + e.getMessage());
-        }
-        assertEquals(0, mThreadContainer.size());
-        runLoop(RUN_LOOP_TIMEOUT_MS);
-        assertEquals(CONCURRENCY_LEVEL, mThreadContainer.size());
-        for (Thread thread : mThreadContainer) {
-            assertEquals(Thread.currentThread(), thread);
-        }
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java
deleted file mode 100644
index 8cdd4ab..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.Callbacks.Callback1;
-import org.chromium.mojo.bindings.test.mojom.sample.Enum;
-import org.chromium.mojo.bindings.test.mojom.sample.IntegerAccessor;
-import org.chromium.mojo.system.MojoException;
-
-import java.io.Closeable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Tests for interface control messages.
- */
-public class InterfaceControlMessageTest extends MojoTestCase {
-    private final List<Closeable> mCloseablesToClose = new ArrayList<Closeable>();
-
-    /**
-     * See mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.
-     */
-    class IntegerAccessorImpl extends SideEffectFreeCloseable implements IntegerAccessor {
-        private long mValue = 0;
-        private int mEnum = 0;
-        private boolean mEncounteredError = false;
-
-        /**
-         * @see ConnectionErrorHandler#onConnectionError(MojoException)
-         */
-        @Override
-        public void onConnectionError(MojoException e) {
-            mEncounteredError = true;
-        }
-
-        /**
-         * @see IntegerAccessor#getInteger(IntegerAccessor.GetIntegerResponse)
-         */
-        @Override
-        public void getInteger(GetIntegerResponse response) {
-            response.call(mValue, mEnum);
-        }
-
-        /**
-         * @see IntegerAccessor#setInteger(long, int)
-         */
-        @Override
-        public void setInteger(long value, int enumValue) {
-            mValue = value;
-            mEnum = enumValue;
-        }
-
-        public long getValue() {
-            return mValue;
-        }
-
-        public boolean encounteredError() {
-            return mEncounteredError;
-        }
-    }
-
-    /**
-     * @see MojoTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        // Close the elements in the reverse order they were added. This is needed because it is an
-        // error to close the handle of a proxy without closing the proxy first.
-        Collections.reverse(mCloseablesToClose);
-        for (Closeable c : mCloseablesToClose) {
-            c.close();
-        }
-        super.tearDown();
-    }
-
-    @SmallTest
-    public void testQueryVersion() {
-        IntegerAccessor.Proxy p = BindingsTestUtils.newProxyOverPipe(
-                IntegerAccessor.MANAGER, new IntegerAccessorImpl(), mCloseablesToClose);
-        assertEquals(0, p.getProxyHandler().getVersion());
-        p.getProxyHandler().queryVersion(new Callback1<Integer>() {
-            @Override
-            public void call(Integer version) {
-                assertEquals(3, version.intValue());
-            }
-        });
-        runLoopUntilIdle();
-        assertEquals(3, p.getProxyHandler().getVersion());
-    }
-
-    @SmallTest
-    public void testRequireVersion() {
-        IntegerAccessorImpl impl = new IntegerAccessorImpl();
-        IntegerAccessor.Proxy p = BindingsTestUtils.newProxyOverPipe(
-                IntegerAccessor.MANAGER, impl, mCloseablesToClose);
-
-        assertEquals(0, p.getProxyHandler().getVersion());
-
-        p.getProxyHandler().requireVersion(1);
-        assertEquals(1, p.getProxyHandler().getVersion());
-        p.setInteger(123, Enum.VALUE);
-        runLoopUntilIdle();
-        assertFalse(impl.encounteredError());
-        assertEquals(123, impl.getValue());
-
-        p.getProxyHandler().requireVersion(3);
-        assertEquals(3, p.getProxyHandler().getVersion());
-        p.setInteger(456, Enum.VALUE);
-        runLoopUntilIdle();
-        assertFalse(impl.encounteredError());
-        assertEquals(456, impl.getValue());
-
-        // Require a version that is not supported by the implementation side.
-        p.getProxyHandler().requireVersion(4);
-        // getVersion() is updated synchronously.
-        assertEquals(4, p.getProxyHandler().getVersion());
-        p.setInteger(789, Enum.VALUE);
-        runLoopUntilIdle();
-        assertTrue(impl.encounteredError());
-        // The call to setInteger() after requireVersion() is ignored.
-        assertEquals(456, impl.getValue());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfacesTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfacesTest.java
deleted file mode 100644
index d8bd3e8..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfacesTest.java
+++ /dev/null
@@ -1,284 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.BindingsTestUtils.CapturingErrorHandler;
-import org.chromium.mojo.bindings.test.mojom.imported.ImportedInterface;
-import org.chromium.mojo.bindings.test.mojom.sample.Factory;
-import org.chromium.mojo.bindings.test.mojom.sample.NamedObject;
-import org.chromium.mojo.bindings.test.mojom.sample.NamedObject.GetNameResponse;
-import org.chromium.mojo.bindings.test.mojom.sample.Request;
-import org.chromium.mojo.bindings.test.mojom.sample.Response;
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.io.Closeable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Tests for interfaces / proxies / stubs generated for sample_factory.mojom.
- */
-public class InterfacesTest extends MojoTestCase {
-
-    private static final String OBJECT_NAME = "hello world";
-
-    private final List<Closeable> mCloseablesToClose = new ArrayList<Closeable>();
-
-    /**
-     * Basic implementation of {@link NamedObject}.
-     */
-    public static class MockNamedObjectImpl extends CapturingErrorHandler implements NamedObject {
-
-        private String mName = "";
-
-        /**
-         * @see org.chromium.mojo.bindings.Interface#close()
-         */
-        @Override
-        public void close() {
-        }
-
-        @Override
-        public void setName(String name) {
-            mName = name;
-        }
-
-        @Override
-        public void getName(GetNameResponse callback) {
-            callback.call(mName);
-        }
-
-        public String getNameSynchronously() {
-            return mName;
-        }
-    }
-
-    /**
-     * Implementation of {@link GetNameResponse} keeping track of usage.
-     */
-    public static class RecordingGetNameResponse implements GetNameResponse {
-        private String mName;
-        private boolean mCalled;
-
-        public RecordingGetNameResponse() {
-            reset();
-        }
-
-        @Override
-        public void call(String name) {
-            mName = name;
-            mCalled = true;
-        }
-
-        public String getName() {
-            return mName;
-        }
-
-        public boolean wasCalled() {
-            return mCalled;
-        }
-
-        public void reset() {
-            mName = null;
-            mCalled = false;
-        }
-    }
-
-    /**
-     * Basic implementation of {@link Factory}.
-     */
-    public class MockFactoryImpl extends CapturingErrorHandler implements Factory {
-
-        private boolean mClosed = false;
-
-        public boolean isClosed() {
-            return mClosed;
-        }
-
-        /**
-         * @see org.chromium.mojo.bindings.Interface#close()
-         */
-        @Override
-        public void close() {
-            mClosed = true;
-        }
-
-        @Override
-        public void doStuff(Request request, MessagePipeHandle pipe, DoStuffResponse callback) {
-            if (pipe != null) {
-                pipe.close();
-            }
-            Response response = new Response();
-            response.x = 42;
-            callback.call(response, "Hello");
-        }
-
-        @Override
-        public void doStuff2(ConsumerHandle pipe, DoStuff2Response callback) {
-            callback.call("World");
-        }
-
-        @Override
-        public void createNamedObject(InterfaceRequest<NamedObject> obj) {
-            NamedObject.MANAGER.bind(new MockNamedObjectImpl(), obj);
-        }
-
-        @Override
-        public void requestImportedInterface(InterfaceRequest<ImportedInterface> obj,
-                RequestImportedInterfaceResponse callback) {
-            throw new UnsupportedOperationException("Not implemented.");
-        }
-
-        @Override
-        public void takeImportedInterface(ImportedInterface obj,
-                TakeImportedInterfaceResponse callback) {
-            throw new UnsupportedOperationException("Not implemented.");
-        }
-    }
-
-    /**
-     * Implementation of DoStuffResponse that keeps track of if the response is called.
-     */
-    public static class DoStuffResponseImpl implements Factory.DoStuffResponse {
-        private boolean mResponseCalled = false;
-
-        public boolean wasResponseCalled() {
-            return mResponseCalled;
-        }
-
-        @Override
-        public void call(Response response, String string) {
-            mResponseCalled = true;
-        }
-    }
-
-    /**
-     * @see MojoTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        // Close the elements in the reverse order they were added. This is needed because it is an
-        // error to close the handle of a proxy without closing the proxy first.
-        Collections.reverse(mCloseablesToClose);
-        for (Closeable c : mCloseablesToClose) {
-            c.close();
-        }
-        super.tearDown();
-    }
-
-    /**
-     * Check that the given proxy receives the calls. If |impl| is not null, also check that the
-     * calls are forwared to |impl|.
-     */
-    private void checkProxy(NamedObject.Proxy proxy, MockNamedObjectImpl impl) {
-        RecordingGetNameResponse callback = new RecordingGetNameResponse();
-        CapturingErrorHandler errorHandler = new CapturingErrorHandler();
-        proxy.getProxyHandler().setErrorHandler(errorHandler);
-
-        if (impl != null) {
-            assertNull(impl.getLastMojoException());
-            assertEquals("", impl.getNameSynchronously());
-        }
-
-        proxy.getName(callback);
-        runLoopUntilIdle();
-
-        assertNull(errorHandler.getLastMojoException());
-        assertTrue(callback.wasCalled());
-        assertEquals("", callback.getName());
-
-        callback.reset();
-        proxy.setName(OBJECT_NAME);
-        runLoopUntilIdle();
-
-        assertNull(errorHandler.getLastMojoException());
-        if (impl != null) {
-            assertNull(impl.getLastMojoException());
-            assertEquals(OBJECT_NAME, impl.getNameSynchronously());
-        }
-
-        proxy.getName(callback);
-        runLoopUntilIdle();
-
-        assertNull(errorHandler.getLastMojoException());
-        assertTrue(callback.wasCalled());
-        assertEquals(OBJECT_NAME, callback.getName());
-    }
-
-    @SmallTest
-    public void testName() {
-        assertEquals("sample::NamedObject", NamedObject.MANAGER.getName());
-    }
-
-    @SmallTest
-    public void testProxyAndStub() {
-        MockNamedObjectImpl impl = new MockNamedObjectImpl();
-        NamedObject.Proxy proxy =
-                NamedObject.MANAGER.buildProxy(null, NamedObject.MANAGER.buildStub(null, impl));
-
-        checkProxy(proxy, impl);
-    }
-
-    @SmallTest
-    public void testProxyAndStubOverPipe() {
-        MockNamedObjectImpl impl = new MockNamedObjectImpl();
-        NamedObject.Proxy proxy =
-                BindingsTestUtils.newProxyOverPipe(NamedObject.MANAGER, impl, mCloseablesToClose);
-
-        checkProxy(proxy, impl);
-    }
-
-    @SmallTest
-    public void testFactoryOverPipe() {
-        Factory.Proxy proxy = BindingsTestUtils.newProxyOverPipe(
-                Factory.MANAGER, new MockFactoryImpl(), mCloseablesToClose);
-        Pair<NamedObject.Proxy, InterfaceRequest<NamedObject>> request =
-                NamedObject.MANAGER.getInterfaceRequest(CoreImpl.getInstance());
-        mCloseablesToClose.add(request.first);
-        proxy.createNamedObject(request.second);
-
-        checkProxy(request.first, null);
-    }
-
-    @SmallTest
-    public void testInterfaceClosing() {
-        MockFactoryImpl impl = new MockFactoryImpl();
-        Factory.Proxy proxy =
-                BindingsTestUtils.newProxyOverPipe(Factory.MANAGER, impl, mCloseablesToClose);
-
-        assertFalse(impl.isClosed());
-
-        proxy.close();
-        runLoopUntilIdle();
-
-        assertTrue(impl.isClosed());
-    }
-
-    @SmallTest
-    public void testResponse() {
-        MockFactoryImpl impl = new MockFactoryImpl();
-        Factory.Proxy proxy =
-                BindingsTestUtils.newProxyOverPipe(Factory.MANAGER, impl, mCloseablesToClose);
-        Request request = new Request();
-        request.x = 42;
-        Pair<MessagePipeHandle, MessagePipeHandle> handles =
-                CoreImpl.getInstance().createMessagePipe(null);
-        DoStuffResponseImpl response = new DoStuffResponseImpl();
-        proxy.doStuff(request, handles.first, response);
-
-        assertFalse(response.wasResponseCalled());
-
-        runLoopUntilIdle();
-
-        assertTrue(response.wasResponseCalled());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/MessageHeaderTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/MessageHeaderTest.java
deleted file mode 100644
index b2e6ac8..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/MessageHeaderTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import junit.framework.TestCase;
-
-import org.chromium.mojo.bindings.test.mojom.imported.Point;
-
-/**
- * Testing internal classes of interfaces.
- */
-public class MessageHeaderTest extends TestCase {
-
-    /**
-     * Testing that headers are identical after being serialized/deserialized.
-     */
-    @SmallTest
-    public void testSimpleMessageHeader() {
-        final int xValue = 1;
-        final int yValue = 2;
-        final int type = 6;
-        Point p = new Point();
-        p.x = xValue;
-        p.y = yValue;
-        ServiceMessage message = p.serializeWithHeader(null, new MessageHeader(type));
-
-        MessageHeader header = message.getHeader();
-        assertTrue(header.validateHeader(type, 0));
-        assertEquals(type, header.getType());
-        assertEquals(0, header.getFlags());
-
-        Point p2 = Point.deserialize(message.getPayload());
-        assertNotNull(p2);
-        assertEquals(p.x, p2.x);
-        assertEquals(p.y, p2.y);
-    }
-
-    /**
-     * Testing that headers are identical after being serialized/deserialized.
-     */
-    @SmallTest
-    public void testMessageWithRequestIdHeader() {
-        final int xValue = 1;
-        final int yValue = 2;
-        final int type = 6;
-        final long requestId = 0x1deadbeafL;
-        Point p = new Point();
-        p.x = xValue;
-        p.y = yValue;
-        ServiceMessage message = p.serializeWithHeader(null,
-                new MessageHeader(type, MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, 0));
-        message.setRequestId(requestId);
-
-        MessageHeader header = message.getHeader();
-        assertTrue(header.validateHeader(type, MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG));
-        assertEquals(type, header.getType());
-        assertEquals(MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, header.getFlags());
-        assertEquals(requestId, header.getRequestId());
-
-        Point p2 = Point.deserialize(message.getPayload());
-        assertNotNull(p2);
-        assertEquals(p.x, p2.x);
-        assertEquals(p.y, p2.y);
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ReadAndDispatchMessageTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ReadAndDispatchMessageTest.java
deleted file mode 100644
index 51dbd22..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/ReadAndDispatchMessageTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.BindingsTestUtils.RecordingMessageReceiver;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.DataPipe;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Testing {@link Connector#readAndDispatchMessage}.
- */
-public class ReadAndDispatchMessageTest extends MojoTestCase {
-
-    private static final int DATA_SIZE = 1024;
-
-    private ByteBuffer mData;
-    private Pair<MessagePipeHandle, MessagePipeHandle> mHandles;
-    private List<Handle> mHandlesToSend = new ArrayList<Handle>();
-    private List<Handle> mHandlesToClose = new ArrayList<Handle>();
-    private RecordingMessageReceiver mMessageReceiver;
-
-    /**
-     * @see org.chromium.mojo.MojoTestCase#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        Core core = CoreImpl.getInstance();
-        mData = BindingsTestUtils.newRandomMessage(DATA_SIZE).getData();
-        mMessageReceiver = new RecordingMessageReceiver();
-        mHandles = core.createMessagePipe(new MessagePipeHandle.CreateOptions());
-        Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> datapipe = core.createDataPipe(null);
-        mHandlesToSend.addAll(Arrays.asList(datapipe.first, datapipe.second));
-        mHandlesToClose.addAll(Arrays.asList(mHandles.first, mHandles.second));
-        mHandlesToClose.addAll(mHandlesToSend);
-    }
-
-    /**
-     * @see org.chromium.mojo.MojoTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        for (Handle handle : mHandlesToClose) {
-            handle.close();
-        }
-        super.tearDown();
-    }
-
-    /**
-     * Testing {@link Connector#readAndDispatchMessage(MessagePipeHandle, MessageReceiver)}
-     */
-    @SmallTest
-    public void testReadAndDispatchMessage() {
-        mHandles.first.writeMessage(mData, mHandlesToSend, MessagePipeHandle.WriteFlags.NONE);
-        assertEquals(MojoResult.OK, Connector.readAndDispatchMessage(mHandles.second,
-                                                      mMessageReceiver).getMojoResult());
-        assertEquals(1, mMessageReceiver.messages.size());
-        Message message = mMessageReceiver.messages.get(0);
-        mHandlesToClose.addAll(message.getHandles());
-        assertEquals(mData, message.getData());
-        assertEquals(2, message.getHandles().size());
-        for (Handle handle : message.getHandles()) {
-            assertTrue(handle.isValid());
-        }
-    }
-
-    /**
-     * Testing {@link Connector#readAndDispatchMessage(MessagePipeHandle, MessageReceiver)}
-     * with no message available.
-     */
-    @SmallTest
-    public void testReadAndDispatchMessageOnEmptyHandle() {
-        assertEquals(MojoResult.SHOULD_WAIT, Connector.readAndDispatchMessage(mHandles.second,
-                                                               mMessageReceiver).getMojoResult());
-        assertEquals(0, mMessageReceiver.messages.size());
-    }
-
-    /**
-     * Testing {@link Connector#readAndDispatchMessage(MessagePipeHandle, MessageReceiver)}
-     * on closed handle.
-     */
-    @SmallTest
-    public void testReadAndDispatchMessageOnClosedHandle() {
-        mHandles.first.close();
-        try {
-            Connector.readAndDispatchMessage(mHandles.second, mMessageReceiver);
-            fail("MojoException should have been thrown");
-        } catch (MojoException expected) {
-            assertEquals(MojoResult.FAILED_PRECONDITION, expected.getMojoResult());
-        }
-        assertEquals(0, mMessageReceiver.messages.size());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/RouterTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/RouterTest.java
deleted file mode 100644
index 6aa1726..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/RouterTest.java
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.base.annotations.SuppressFBWarnings;
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.BindingsTestUtils.CapturingErrorHandler;
-import org.chromium.mojo.bindings.BindingsTestUtils.RecordingMessageReceiverWithResponder;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Core.HandleSignals;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-
-/**
- * Testing {@link Router}
- */
-public class RouterTest extends MojoTestCase {
-
-    private MessagePipeHandle mHandle;
-    private Router mRouter;
-    private RecordingMessageReceiverWithResponder mReceiver;
-    private CapturingErrorHandler mErrorHandler;
-
-    /**
-     * @see MojoTestCase#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        mHandle = handles.first;
-        mRouter = new RouterImpl(handles.second);
-        mReceiver = new RecordingMessageReceiverWithResponder();
-        mRouter.setIncomingMessageReceiver(mReceiver);
-        mErrorHandler = new CapturingErrorHandler();
-        mRouter.setErrorHandler(mErrorHandler);
-        mRouter.start();
-    }
-
-    /**
-     * Testing sending a message via the router that expected a response.
-     */
-    @SmallTest
-    public void testSendingToRouterWithResponse() {
-        final int requestMessageType = 0xdead;
-        final int responseMessageType = 0xbeaf;
-
-        // Sending a message expecting a response.
-        MessageHeader header = new MessageHeader(requestMessageType,
-                MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, 0);
-        Encoder encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
-        header.encode(encoder);
-        mRouter.acceptWithResponder(encoder.getMessage(), mReceiver);
-        ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(header.getSize());
-        ResultAnd<MessagePipeHandle.ReadMessageResult> result =
-                mHandle.readMessage(receiveBuffer, 0, MessagePipeHandle.ReadFlags.NONE);
-
-        assertEquals(MojoResult.OK, result.getMojoResult());
-        MessageHeader receivedHeader = new Message(
-                receiveBuffer, new ArrayList<Handle>()).asServiceMessage().getHeader();
-
-        assertEquals(header.getType(), receivedHeader.getType());
-        assertEquals(header.getFlags(), receivedHeader.getFlags());
-        assertTrue(receivedHeader.getRequestId() != 0);
-
-        // Sending the response.
-        MessageHeader responseHeader = new MessageHeader(responseMessageType,
-                MessageHeader.MESSAGE_IS_RESPONSE_FLAG, receivedHeader.getRequestId());
-        encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
-        responseHeader.encode(encoder);
-        Message responseMessage = encoder.getMessage();
-        mHandle.writeMessage(responseMessage.getData(), new ArrayList<Handle>(),
-                MessagePipeHandle.WriteFlags.NONE);
-        runLoopUntilIdle();
-
-        assertEquals(1, mReceiver.messages.size());
-        ServiceMessage receivedResponseMessage = mReceiver.messages.get(0).asServiceMessage();
-        assertEquals(MessageHeader.MESSAGE_IS_RESPONSE_FLAG,
-                receivedResponseMessage.getHeader().getFlags());
-        assertEquals(responseMessage.getData(), receivedResponseMessage.getData());
-    }
-
-    /**
-     * Sends a message to the Router.
-     *
-     * @param messageIndex Used when sending multiple messages to indicate the index of this
-     * message.
-     * @param requestMessageType The message type to use in the header of the sent message.
-     * @param requestId The requestId to use in the header of the sent message.
-     */
-    private void sendMessageToRouter(int messageIndex, int requestMessageType, int requestId) {
-        MessageHeader header = new MessageHeader(
-                requestMessageType, MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, requestId);
-        Encoder encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
-        header.encode(encoder);
-        Message headerMessage = encoder.getMessage();
-        mHandle.writeMessage(headerMessage.getData(), new ArrayList<Handle>(),
-                MessagePipeHandle.WriteFlags.NONE);
-        runLoopUntilIdle();
-
-        assertEquals(messageIndex + 1, mReceiver.messagesWithReceivers.size());
-        Pair<Message, MessageReceiver> receivedMessage =
-                mReceiver.messagesWithReceivers.get(messageIndex);
-        assertEquals(headerMessage.getData(), receivedMessage.first.getData());
-    }
-
-    /**
-     * Sends a response message from the Router.
-     *
-     * @param messageIndex Used when sending responses to multiple messages to indicate the index
-     * of the message that this message is a response to.
-     * @param responseMessageType The message type to use in the header of the response message.
-     */
-    private void sendResponseFromRouter(int messageIndex, int responseMessageType) {
-        Pair<Message, MessageReceiver> receivedMessage =
-                mReceiver.messagesWithReceivers.get(messageIndex);
-
-        long requestId = receivedMessage.first.asServiceMessage().getHeader().getRequestId();
-
-        MessageHeader responseHeader = new MessageHeader(
-                responseMessageType, MessageHeader.MESSAGE_IS_RESPONSE_FLAG, requestId);
-        Encoder encoder = new Encoder(CoreImpl.getInstance(), responseHeader.getSize());
-        responseHeader.encode(encoder);
-        Message message = encoder.getMessage();
-        receivedMessage.second.accept(message);
-
-        ByteBuffer receivedResponseMessage = ByteBuffer.allocateDirect(responseHeader.getSize());
-        ResultAnd<MessagePipeHandle.ReadMessageResult> result =
-                mHandle.readMessage(receivedResponseMessage, 0, MessagePipeHandle.ReadFlags.NONE);
-
-        assertEquals(MojoResult.OK, result.getMojoResult());
-        assertEquals(message.getData(), receivedResponseMessage);
-    }
-
-    /**
-     * Clears {@code mReceiver.messagesWithReceivers} allowing all message receivers to be
-     * finalized.
-     * <p>
-     * Since there is no way to force the Garbage Collector to actually call finalize and we want to
-     * test the effects of the finalize() method, we explicitly call finalize() on all of the
-     * message receivers. We do this in a custom thread to better approximate what the JVM does.
-     */
-    private void clearAllMessageReceivers() {
-        Thread myFinalizerThread = new Thread() {
-            @Override
-            @SuppressFBWarnings("FI_EXPLICIT_INVOCATION")
-            public void run() {
-                for (Pair<Message, MessageReceiver> receivedMessage :
-                        mReceiver.messagesWithReceivers) {
-                    RouterImpl.ResponderThunk thunk =
-                            (RouterImpl.ResponderThunk) receivedMessage.second;
-                    try {
-                        thunk.finalize();
-                    } catch (Throwable e) {
-                        throw new RuntimeException(e);
-                    }
-                }
-            }
-        };
-        myFinalizerThread.start();
-        try {
-            myFinalizerThread.join();
-        } catch (InterruptedException e) {
-            // ignore.
-        }
-        mReceiver.messagesWithReceivers.clear();
-    }
-
-    /**
-     * Testing receiving a message via the router that expected a response.
-     */
-    @SmallTest
-    public void testReceivingViaRouterWithResponse() {
-        final int requestMessageType = 0xdead;
-        final int responseMessageType = 0xbeef;
-        final int requestId = 0xdeadbeaf;
-
-        // Send a message expecting a response.
-        sendMessageToRouter(0, requestMessageType, requestId);
-
-        // Sending the response.
-        sendResponseFromRouter(0, responseMessageType);
-    }
-
-    /**
-     * Tests that if a callback is dropped (i.e. becomes unreachable and is finalized
-     * without being used), then the message pipe will be closed.
-     */
-    @SmallTest
-    public void testDroppingReceiverWithoutUsingIt() {
-        // Send 10 messages to the router without sending a response.
-        for (int i = 0; i < 10; i++) {
-            sendMessageToRouter(i, i, i);
-        }
-
-        // Now send the 10 responses. This should work fine.
-        for (int i = 0; i < 10; i++) {
-            sendResponseFromRouter(i, i);
-        }
-
-        // Clear all MessageRecievers so that the ResponderThunks will
-        // be finalized.
-        clearAllMessageReceivers();
-
-        // Send another  message to the router without sending a response.
-        sendMessageToRouter(0, 0, 0);
-
-        // Clear the MessageReciever so that the ResponderThunk will
-        // be finalized. Since the RespondeThunk was never used, this
-        // should close the pipe.
-        clearAllMessageReceivers();
-        // The close() occurs asynchronously on this thread.
-        runLoopUntilIdle();
-
-        // Confirm that the pipe was closed on the Router side.
-        HandleSignals closedFlag = HandleSignals.none().setPeerClosed(true);
-        assertEquals(closedFlag, mHandle.querySignalsState().getSatisfiedSignals());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/SerializationTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/SerializationTest.java
deleted file mode 100644
index 2c17e3a..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/SerializationTest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import junit.framework.TestCase;
-
-import org.chromium.mojo.HandleMock;
-import org.chromium.mojo.bindings.test.mojom.mojo.Struct1;
-import org.chromium.mojo.bindings.test.mojom.mojo.Struct2;
-import org.chromium.mojo.bindings.test.mojom.mojo.Struct3;
-import org.chromium.mojo.bindings.test.mojom.mojo.Struct4;
-import org.chromium.mojo.bindings.test.mojom.mojo.Struct5;
-import org.chromium.mojo.bindings.test.mojom.mojo.Struct6;
-import org.chromium.mojo.bindings.test.mojom.mojo.StructOfNullables;
-
-import java.nio.ByteBuffer;
-
-/**
- * Tests for the serialization logic of the generated structs, using structs defined in
- * mojo/public/interfaces/bindings/tests/serialization_test_structs.mojom .
- */
-public class SerializationTest extends TestCase {
-
-    private static void assertThrowsSerializationException(Struct struct) {
-        try {
-            struct.serialize(null);
-            fail("Serialization of invalid struct should have thrown an exception.");
-        } catch (SerializationException ex) {
-            // Expected.
-        }
-    }
-
-    /**
-     * Verifies that serializing a struct with an invalid handle of a non-nullable type throws an
-     * exception.
-     */
-    @SmallTest
-    public void testHandle() {
-        Struct2 struct = new Struct2();
-        assertFalse(struct.hdl.isValid());
-        assertThrowsSerializationException(struct);
-
-        // Make the struct valid and verify that it serializes without an exception.
-        struct.hdl = new HandleMock();
-        struct.serialize(null);
-    }
-
-    /**
-     * Verifies that serializing a struct with a null struct pointer throws an exception.
-     */
-    @SmallTest
-    public void testStructPointer() {
-        Struct3 struct = new Struct3();
-        assertNull(struct.struct1);
-        assertThrowsSerializationException(struct);
-
-        // Make the struct valid and verify that it serializes without an exception.
-        struct.struct1 = new Struct1();
-        struct.serialize(null);
-    }
-
-    /**
-     * Verifies that serializing a struct with an array of structs throws an exception when the
-     * struct is invalid.
-     */
-    @SmallTest
-    public void testStructArray() {
-        Struct4 struct = new Struct4();
-        assertNull(struct.data);
-        assertThrowsSerializationException(struct);
-
-        // Create the (1-element) array but have the element null.
-        struct.data = new Struct1[1];
-        assertThrowsSerializationException(struct);
-
-        // Create the array element, struct should serialize now.
-        struct.data[0] = new Struct1();
-        struct.serialize(null);
-    }
-
-    /**
-     * Verifies that serializing a struct with a fixed-size array of incorrect length throws an
-     * exception.
-     */
-    @SmallTest
-    public void testFixedSizeArray() {
-        Struct5 struct = new Struct5();
-        assertNull(struct.pair);
-        assertThrowsSerializationException(struct);
-
-        // Create the (1-element) array, 2-element array is required.
-        struct.pair = new Struct1[1];
-        struct.pair[0] = new Struct1();
-        assertThrowsSerializationException(struct);
-
-        // Create the array of a correct size, struct should serialize now.
-        struct.pair = new Struct1[2];
-        struct.pair[0] = new Struct1();
-        struct.pair[1] = new Struct1();
-        struct.serialize(null);
-    }
-
-    /**
-     * Verifies that serializing a struct with a null string throws an exception.
-     */
-    @SmallTest
-    public void testString() {
-        Struct6 struct = new Struct6();
-        assertNull(struct.str);
-        assertThrowsSerializationException(struct);
-
-        // Make the struct valid and verify that it serializes without an exception.
-        struct.str = "";
-        struct.serialize(null);
-    }
-
-    /**
-     * Verifies that a struct with an invalid nullable handle, null nullable struct pointer and null
-     * nullable string serializes without an exception.
-     */
-    @SmallTest
-    public void testNullableFields() {
-        StructOfNullables struct = new StructOfNullables();
-        assertFalse(struct.hdl.isValid());
-        assertNull(struct.struct1);
-        assertNull(struct.str);
-        struct.serialize(null);
-    }
-
-    /**
-     * Verifies that a struct can be serialized to and deserialized from a ByteBuffer.
-     */
-    @SmallTest
-    public void testByteBufferSerialization() {
-        Struct1 input = new Struct1();
-        input.i = 0x7F;
-
-        ByteBuffer buf = input.serialize();
-
-        byte[] expected_raw_bytes = {16, 0, 0, 0, 0, 0, 0, 0, 0x7F, 0, 0, 0, 0, 0, 0, 0};
-        ByteBuffer expected_buf = ByteBuffer.wrap(expected_raw_bytes);
-        assertEquals(expected_buf, buf);
-
-        Struct1 output = Struct1.deserialize(buf);
-        assertEquals(0x7F, output.i);
-    }
-
-    /**
-     * Verifies that a struct with handles cannot be serialized to a ByteBuffer.
-     */
-    @SmallTest
-    public void testByteBufferSerializationWithHandles() {
-        StructOfNullables struct = new StructOfNullables();
-        assertFalse(struct.hdl.isValid());
-        assertNull(struct.struct1);
-        assertNull(struct.str);
-
-        // It is okay to serialize invalid handles.
-        struct.serialize();
-
-        struct.hdl = new HandleMock();
-
-        try {
-            struct.serialize();
-            fail("Serializing a struct with handles to a ByteBuffer should have thrown an "
-                    + "exception.");
-        } catch (UnsupportedOperationException ex) {
-            // Expected.
-        }
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTest.java
deleted file mode 100644
index 8424618..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTest.java
+++ /dev/null
@@ -1,237 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.base.test.util.UrlUtils;
-import org.chromium.mojo.HandleMock;
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.test.mojom.mojo.ConformanceTestInterface;
-import org.chromium.mojo.bindings.test.mojom.mojo.IntegrationTestInterface;
-import org.chromium.mojo.bindings.test.mojom.mojo.IntegrationTestInterfaceTestHelper;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FileNotFoundException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Scanner;
-
-/**
- * Testing validation upon deserialization using the interfaces defined in the
- * mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom file.
- * <p>
- * One needs to pass '--test_data=bindings:{path to mojo/public/interfaces/bindings/tests/data}' to
- * the test_runner script for this test to find the validation data it needs.
- */
-public class ValidationTest extends MojoTestCase {
-
-    /**
-     * The path where validation test data is.
-     */
-    private static final File VALIDATION_TEST_DATA_PATH =
-            new File(UrlUtils.getIsolatedTestFilePath(
-                "mojo/public/interfaces/bindings/tests/data/validation"));
-
-    /**
-     * The data needed for a validation test.
-     */
-    private static class TestData {
-        public File dataFile;
-        public ValidationTestUtil.Data inputData;
-        public String expectedResult;
-    }
-
-    private static class DataFileFilter implements FileFilter {
-        private final String mPrefix;
-
-        public DataFileFilter(String prefix) {
-            this.mPrefix = prefix;
-        }
-
-        @Override
-        public boolean accept(File pathname) {
-            // TODO(yzshen, qsr): skip some interface versioning tests.
-            if (pathname.getName().startsWith("conformance_mthd13_good_2")) {
-                return false;
-            }
-            return pathname.isFile() && pathname.getName().startsWith(mPrefix)
-                    && pathname.getName().endsWith(".data");
-        }
-    }
-
-    private static String getStringContent(File f) throws FileNotFoundException {
-        try (Scanner scanner = new Scanner(f)) {
-            scanner.useDelimiter("\\Z");
-            StringBuilder result = new StringBuilder();
-            while (scanner.hasNext()) {
-                result.append(scanner.next());
-            }
-            return result.toString().trim();
-        }
-    }
-
-    private static List<TestData> getTestData(String prefix)
-            throws FileNotFoundException {
-        List<TestData> results = new ArrayList<TestData>();
-
-        // Fail if the test data is not present.
-        if (!VALIDATION_TEST_DATA_PATH.isDirectory()) {
-            fail("No test data directory found. "
-                    + "Expected directory at: " + VALIDATION_TEST_DATA_PATH);
-        }
-
-        File[] files = VALIDATION_TEST_DATA_PATH.listFiles(new DataFileFilter(prefix));
-        if (files != null) {
-            for (File dataFile : files) {
-                File resultFile = new File(dataFile.getParent(),
-                        dataFile.getName().replaceFirst("\\.data$", ".expected"));
-                TestData testData = new TestData();
-                testData.dataFile = dataFile;
-                testData.inputData = ValidationTestUtil.parseData(getStringContent(dataFile));
-                testData.expectedResult = getStringContent(resultFile);
-                results.add(testData);
-            }
-        }
-        return results;
-    }
-
-    /**
-     * Runs all the test with the given prefix on the given {@link MessageReceiver}.
-     */
-    private static void runTest(String prefix, MessageReceiver messageReceiver)
-            throws FileNotFoundException {
-        List<TestData> testData = getTestData(prefix);
-        for (TestData test : testData) {
-            assertNull("Unable to read: " + test.dataFile.getName()
-                    + ": " + test.inputData.getErrorMessage(),
-                    test.inputData.getErrorMessage());
-            List<Handle> handles = new ArrayList<Handle>();
-            for (int i = 0; i < test.inputData.getHandlesCount(); ++i) {
-                handles.add(new HandleMock());
-            }
-            Message message = new Message(test.inputData.getData(), handles);
-            boolean passed = messageReceiver.accept(message);
-            if (passed && !test.expectedResult.equals("PASS")) {
-                fail("Input: " + test.dataFile.getName()
-                        + ": The message should have been refused. Expected error: "
-                        + test.expectedResult);
-            }
-            if (!passed && test.expectedResult.equals("PASS")) {
-                fail("Input: " + test.dataFile.getName()
-                        + ": The message should have been accepted.");
-            }
-        }
-    }
-
-    private static class RoutingMessageReceiver implements MessageReceiver {
-        private final MessageReceiverWithResponder mRequest;
-        private final MessageReceiver mResponse;
-
-        private RoutingMessageReceiver(MessageReceiverWithResponder request,
-                MessageReceiver response) {
-            this.mRequest = request;
-            this.mResponse = response;
-        }
-
-        /**
-         * @see MessageReceiver#accept(Message)
-         */
-        @Override
-        public boolean accept(Message message) {
-            try {
-                MessageHeader header = message.asServiceMessage().getHeader();
-                if (header.hasFlag(MessageHeader.MESSAGE_IS_RESPONSE_FLAG)) {
-                    return mResponse.accept(message);
-                } else {
-                    return mRequest.acceptWithResponder(message, new SinkMessageReceiver());
-                }
-            } catch (DeserializationException e) {
-                return false;
-            }
-        }
-
-        /**
-         * @see MessageReceiver#close()
-         */
-        @Override
-        public void close() {
-        }
-
-    }
-
-    /**
-     * A trivial message receiver that refuses all messages it receives.
-     */
-    private static class SinkMessageReceiver implements MessageReceiverWithResponder {
-
-        @Override
-        public boolean accept(Message message) {
-            return true;
-        }
-
-        @Override
-        public void close() {
-        }
-
-        @Override
-        public boolean acceptWithResponder(Message message, MessageReceiver responder) {
-            return true;
-        }
-    }
-
-    /**
-     * Testing the conformance suite.
-     */
-    @SmallTest
-    public void testConformance() throws FileNotFoundException {
-        runTest("conformance_",
-                ConformanceTestInterface.MANAGER.buildStub(CoreImpl.getInstance(),
-                        ConformanceTestInterface.MANAGER.buildProxy(
-                                CoreImpl.getInstance(), new SinkMessageReceiver())));
-    }
-
-    /**
-     * Testing the integration suite for message headers.
-     */
-    @SmallTest
-    public void testIntegrationMessageHeader() throws FileNotFoundException {
-        runTest("integration_msghdr_",
-                new RoutingMessageReceiver(IntegrationTestInterface.MANAGER.buildStub(null,
-                        IntegrationTestInterface.MANAGER.buildProxy(null,
-                                new SinkMessageReceiver())),
-                        IntegrationTestInterfaceTestHelper
-                                .newIntegrationTestInterfaceMethodCallback()));
-    }
-
-    /**
-     * Testing the integration suite for request messages.
-     */
-    @SmallTest
-    public void testIntegrationRequestMessage() throws FileNotFoundException {
-        runTest("integration_intf_rqst_",
-                new RoutingMessageReceiver(IntegrationTestInterface.MANAGER.buildStub(null,
-                        IntegrationTestInterface.MANAGER.buildProxy(null,
-                                new SinkMessageReceiver())),
-                        IntegrationTestInterfaceTestHelper
-                                .newIntegrationTestInterfaceMethodCallback()));
-    }
-
-    /**
-     * Testing the integration suite for response messages.
-     */
-    @SmallTest
-    public void testIntegrationResponseMessage() throws FileNotFoundException {
-        runTest("integration_intf_resp_",
-                new RoutingMessageReceiver(IntegrationTestInterface.MANAGER.buildStub(null,
-                        IntegrationTestInterface.MANAGER.buildProxy(null,
-                                new SinkMessageReceiver())),
-                        IntegrationTestInterfaceTestHelper
-                                .newIntegrationTestInterfaceMethodCallback()));
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTestUtil.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTestUtil.java
deleted file mode 100644
index 91b993c..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTestUtil.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Utility class for testing message validation. The file format used to describe a message is
- * described in The format is described in
- * mojo/public/cpp/bindings/tests/validation_test_input_parser.h
- */
-@JNINamespace("mojo::android")
-public class ValidationTestUtil {
-
-    /**
-     * Content of a '.data' file.
-     */
-    public static class Data {
-        private final ByteBuffer mData;
-        private final int mHandlesCount;
-        private final String mErrorMessage;
-
-        public ByteBuffer getData() {
-            return mData;
-        }
-
-        public int getHandlesCount() {
-            return mHandlesCount;
-        }
-
-        public String getErrorMessage() {
-            return mErrorMessage;
-        }
-
-        private Data(ByteBuffer data, int handlesCount, String errorMessage) {
-            this.mData = data;
-            this.mHandlesCount = handlesCount;
-            this.mErrorMessage = errorMessage;
-        }
-    }
-
-    /**
-     * Parse a '.data' file.
-     */
-    public static Data parseData(String dataAsString) {
-        return nativeParseData(dataAsString);
-    }
-
-    private static native Data nativeParseData(String dataAsString);
-
-    @CalledByNative
-    private static Data buildData(ByteBuffer data, int handlesCount, String errorMessage) {
-        ByteBuffer copiedData = null;
-        if (data != null) {
-            copiedData = ByteBuffer.allocateDirect(data.limit());
-            copiedData.order(ByteOrder.LITTLE_ENDIAN);
-            copiedData.put(data);
-            copiedData.flip();
-        }
-        return new Data(copiedData, handlesCount, errorMessage);
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTestUtilTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTestUtilTest.java
deleted file mode 100644
index 623abc3..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTestUtilTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Testing {@link ValidationTestUtil}.
- */
-public class ValidationTestUtilTest extends MojoTestCase {
-
-    /**
-     * Check that the input parser is correct on a given input.
-     */
-    public static void checkInputParser(
-            String input, boolean isInputValid, ByteBuffer expectedData, int expectedHandlesCount) {
-        ValidationTestUtil.Data data = ValidationTestUtil.parseData(input);
-        if (isInputValid) {
-            assertNull(data.getErrorMessage());
-            assertEquals(expectedData, data.getData());
-            assertEquals(expectedHandlesCount, data.getHandlesCount());
-        } else {
-            assertNotNull(data.getErrorMessage());
-            assertNull(data.getData());
-        }
-    }
-
-    /**
-     * Testing {@link ValidationTestUtil#parseData(String)}.
-     */
-    @SmallTest
-    public void testCorrectMessageParsing() {
-        {
-            // Test empty input.
-            String input = "";
-            ByteBuffer expected = ByteBuffer.allocateDirect(0);
-            expected.order(ByteOrder.LITTLE_ENDIAN);
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            // Test input that only consists of comments and whitespaces.
-            String input = "    \t  // hello world \n\r \t// the answer is 42   ";
-            ByteBuffer expected = ByteBuffer.allocateDirect(0);
-            expected.order(ByteOrder.nativeOrder());
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            String input = "[u1]0x10// hello world !! \n\r  \t [u2]65535 \n"
-                    + "[u4]65536 [u8]0xFFFFFFFFFFFFFFFF 0 0Xff";
-            ByteBuffer expected = ByteBuffer.allocateDirect(17);
-            expected.order(ByteOrder.nativeOrder());
-            expected.put((byte) 0x10);
-            expected.putShort((short) 65535);
-            expected.putInt(65536);
-            expected.putLong(-1);
-            expected.put((byte) 0);
-            expected.put((byte) 0xff);
-            expected.flip();
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            String input = "[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40";
-            ByteBuffer expected = ByteBuffer.allocateDirect(15);
-            expected.order(ByteOrder.nativeOrder());
-            expected.putLong(-0x800);
-            expected.put((byte) -128);
-            expected.putShort((short) 0);
-            expected.putInt(-40);
-            expected.flip();
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            String input = "[b]00001011 [b]10000000  // hello world\r [b]00000000";
-            ByteBuffer expected = ByteBuffer.allocateDirect(3);
-            expected.order(ByteOrder.nativeOrder());
-            expected.put((byte) 11);
-            expected.put((byte) 128);
-            expected.put((byte) 0);
-            expected.flip();
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            String input = "[f]+.3e9 [d]-10.03";
-            ByteBuffer expected = ByteBuffer.allocateDirect(12);
-            expected.order(ByteOrder.nativeOrder());
-            expected.putFloat(+.3e9f);
-            expected.putDouble(-10.03);
-            expected.flip();
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            String input = "[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar";
-            ByteBuffer expected = ByteBuffer.allocateDirect(14);
-            expected.order(ByteOrder.nativeOrder());
-            expected.putInt(14);
-            expected.put((byte) 0);
-            expected.putLong(9);
-            expected.put((byte) 0);
-            expected.flip();
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            String input = "// This message has handles! \n[handles]50 [u8]2";
-            ByteBuffer expected = ByteBuffer.allocateDirect(8);
-            expected.order(ByteOrder.nativeOrder());
-            expected.putLong(2);
-            expected.flip();
-
-            checkInputParser(input, true, expected, 50);
-        }
-
-        // Test some failure cases.
-        {
-            String error_inputs[] = {
-                "/ hello world",
-                "[u1]x",
-                "[u2]-1000",
-                "[u1]0x100",
-                "[s2]-0x8001",
-                "[b]1",
-                "[b]1111111k",
-                "[dist4]unmatched",
-                "[anchr]hello [dist8]hello",
-                "[dist4]a [dist4]a [anchr]a",
-                "[dist4]a [anchr]a [dist4]a [anchr]a",
-                "0 [handles]50"
-            };
-
-            for (String input : error_inputs) {
-                ByteBuffer expected = ByteBuffer.allocateDirect(0);
-                expected.order(ByteOrder.nativeOrder());
-                checkInputParser(input, false, expected, 0);
-            }
-        }
-
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/test/mojom/mojo/IntegrationTestInterfaceTestHelper.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/test/mojom/mojo/IntegrationTestInterfaceTestHelper.java
deleted file mode 100644
index 8fb79d7..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/test/mojom/mojo/IntegrationTestInterfaceTestHelper.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings.test.mojom.mojo;
-
-import org.chromium.mojo.bindings.MessageReceiver;
-import org.chromium.mojo.bindings.test.mojom.mojo.IntegrationTestInterface.Method0Response;
-import org.chromium.mojo.bindings.test.mojom.mojo.IntegrationTestInterface_Internal.IntegrationTestInterfaceMethod0ResponseParamsForwardToCallback;
-
-/**
- * Helper class to access {@link IntegrationTestInterface_Internal} package protected method for
- * tests.
- */
-public class IntegrationTestInterfaceTestHelper {
-
-    private static final class SinkMethod0Response implements Method0Response {
-        @Override
-        public void call(byte[] arg1) {
-        }
-    }
-
-    /**
-     * Creates a new {@link MessageReceiver} to use for the callback of
-     * |IntegrationTestInterface#method0(Method0Response)|.
-     */
-    public static MessageReceiver newIntegrationTestInterfaceMethodCallback() {
-        return new IntegrationTestInterfaceMethod0ResponseParamsForwardToCallback(
-                new SinkMethod0Response());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java b/mojo/android/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java
deleted file mode 100644
index 5120198..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java
+++ /dev/null
@@ -1,545 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Core.HandleSignals;
-import org.chromium.mojo.system.DataPipe;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.InvalidHandle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.SharedBufferHandle;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-
-/**
- * Testing the core API.
- */
-public class CoreImplTest extends MojoTestCase {
-    private static final long RUN_LOOP_TIMEOUT_MS = 5;
-
-    private static final ScheduledExecutorService WORKER =
-            Executors.newSingleThreadScheduledExecutor();
-
-    private static final HandleSignals ALL_SIGNALS =
-            HandleSignals.none().setPeerClosed(true).setReadable(true).setWritable(true);
-
-    private List<Handle> mHandlesToClose = new ArrayList<Handle>();
-
-    /**
-     * @see MojoTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        MojoException toThrow = null;
-        for (Handle handle : mHandlesToClose) {
-            try {
-                handle.close();
-            } catch (MojoException e) {
-                if (toThrow == null) {
-                    toThrow = e;
-                }
-            }
-        }
-        if (toThrow != null) {
-            throw toThrow;
-        }
-        super.tearDown();
-    }
-
-    private void addHandleToClose(Handle handle) {
-        mHandlesToClose.add(handle);
-    }
-
-    private void addHandlePairToClose(Pair<? extends Handle, ? extends Handle> handles) {
-        mHandlesToClose.add(handles.first);
-        mHandlesToClose.add(handles.second);
-    }
-
-    private static void checkSendingMessage(MessagePipeHandle in, MessagePipeHandle out) {
-        Random random = new Random();
-
-        // Writing a random 8 bytes message.
-        byte[] bytes = new byte[8];
-        random.nextBytes(bytes);
-        ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length);
-        buffer.put(bytes);
-        in.writeMessage(buffer, null, MessagePipeHandle.WriteFlags.NONE);
-
-        // Try to read into a small buffer.
-        ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(bytes.length / 2);
-        ResultAnd<MessagePipeHandle.ReadMessageResult> result =
-                out.readMessage(receiveBuffer, 0, MessagePipeHandle.ReadFlags.NONE);
-        assertEquals(MojoResult.RESOURCE_EXHAUSTED, result.getMojoResult());
-        assertEquals(bytes.length, result.getValue().getMessageSize());
-        assertEquals(0, result.getValue().getHandlesCount());
-
-        // Read into a correct buffer.
-        receiveBuffer = ByteBuffer.allocateDirect(bytes.length);
-        result = out.readMessage(receiveBuffer, 0, MessagePipeHandle.ReadFlags.NONE);
-        assertEquals(MojoResult.OK, result.getMojoResult());
-        assertEquals(bytes.length, result.getValue().getMessageSize());
-        assertEquals(0, result.getValue().getHandlesCount());
-        assertEquals(0, receiveBuffer.position());
-        assertEquals(result.getValue().getMessageSize(), receiveBuffer.limit());
-        byte[] receivedBytes = new byte[result.getValue().getMessageSize()];
-        receiveBuffer.get(receivedBytes);
-        assertTrue(Arrays.equals(bytes, receivedBytes));
-    }
-
-    private static void checkSendingData(DataPipe.ProducerHandle in, DataPipe.ConsumerHandle out) {
-        Random random = new Random();
-
-        // Writing a random 8 bytes message.
-        byte[] bytes = new byte[8];
-        random.nextBytes(bytes);
-        ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length);
-        buffer.put(bytes);
-        ResultAnd<Integer> result = in.writeData(buffer, DataPipe.WriteFlags.NONE);
-        assertEquals(MojoResult.OK, result.getMojoResult());
-        assertEquals(bytes.length, result.getValue().intValue());
-
-        // Query number of bytes available.
-        ResultAnd<Integer> readResult = out.readData(null, DataPipe.ReadFlags.none().query(true));
-        assertEquals(MojoResult.OK, readResult.getMojoResult());
-        assertEquals(bytes.length, readResult.getValue().intValue());
-
-        // Peek data into a buffer.
-        ByteBuffer peekBuffer = ByteBuffer.allocateDirect(bytes.length);
-        readResult = out.readData(peekBuffer, DataPipe.ReadFlags.none().peek(true));
-        assertEquals(MojoResult.OK, readResult.getMojoResult());
-        assertEquals(bytes.length, readResult.getValue().intValue());
-        assertEquals(bytes.length, peekBuffer.limit());
-        byte[] peekBytes = new byte[bytes.length];
-        peekBuffer.get(peekBytes);
-        assertTrue(Arrays.equals(bytes, peekBytes));
-
-        // Read into a buffer.
-        ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(bytes.length);
-        readResult = out.readData(receiveBuffer, DataPipe.ReadFlags.NONE);
-        assertEquals(MojoResult.OK, readResult.getMojoResult());
-        assertEquals(bytes.length, readResult.getValue().intValue());
-        assertEquals(0, receiveBuffer.position());
-        assertEquals(bytes.length, receiveBuffer.limit());
-        byte[] receivedBytes = new byte[bytes.length];
-        receiveBuffer.get(receivedBytes);
-        assertTrue(Arrays.equals(bytes, receivedBytes));
-    }
-
-    private static void checkSharing(SharedBufferHandle in, SharedBufferHandle out) {
-        Random random = new Random();
-
-        ByteBuffer buffer1 = in.map(0, 8, SharedBufferHandle.MapFlags.NONE);
-        assertEquals(8, buffer1.capacity());
-        ByteBuffer buffer2 = out.map(0, 8, SharedBufferHandle.MapFlags.NONE);
-        assertEquals(8, buffer2.capacity());
-
-        byte[] bytes = new byte[8];
-        random.nextBytes(bytes);
-        buffer1.put(bytes);
-
-        byte[] receivedBytes = new byte[bytes.length];
-        buffer2.get(receivedBytes);
-
-        assertTrue(Arrays.equals(bytes, receivedBytes));
-
-        in.unmap(buffer1);
-        out.unmap(buffer2);
-    }
-
-    /**
-     * Testing that Core can be retrieved from a handle.
-     */
-    @SmallTest
-    public void testGetCore() {
-        Core core = CoreImpl.getInstance();
-
-        Pair<? extends Handle, ? extends Handle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-        assertEquals(core, handles.first.getCore());
-        assertEquals(core, handles.second.getCore());
-
-        handles = core.createDataPipe(null);
-        addHandlePairToClose(handles);
-        assertEquals(core, handles.first.getCore());
-        assertEquals(core, handles.second.getCore());
-
-        SharedBufferHandle handle = core.createSharedBuffer(null, 100);
-        SharedBufferHandle handle2 = handle.duplicate(null);
-        addHandleToClose(handle);
-        addHandleToClose(handle2);
-        assertEquals(core, handle.getCore());
-        assertEquals(core, handle2.getCore());
-    }
-
-    private static void createAndCloseMessagePipe(MessagePipeHandle.CreateOptions options) {
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(options);
-        handles.first.close();
-        handles.second.close();
-    }
-
-    /**
-     * Testing {@link MessagePipeHandle} creation.
-     */
-    @SmallTest
-    public void testMessagePipeCreation() {
-        // Test creation with null options.
-        createAndCloseMessagePipe(null);
-        // Test creation with default options.
-        createAndCloseMessagePipe(new MessagePipeHandle.CreateOptions());
-    }
-
-    /**
-     * Testing {@link MessagePipeHandle}.
-     */
-    @SmallTest
-    public void testMessagePipeEmpty() {
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        // Testing read on an empty pipe.
-        ResultAnd<MessagePipeHandle.ReadMessageResult> readResult =
-                handles.first.readMessage(null, 0, MessagePipeHandle.ReadFlags.NONE);
-        assertEquals(MojoResult.SHOULD_WAIT, readResult.getMojoResult());
-
-        handles.first.close();
-        handles.second.close();
-    }
-
-    /**
-     * Testing {@link MessagePipeHandle}.
-     */
-    @SmallTest
-    public void testMessagePipeSend() {
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        checkSendingMessage(handles.first, handles.second);
-        checkSendingMessage(handles.second, handles.first);
-    }
-
-    /**
-     * Testing {@link MessagePipeHandle}.
-     */
-    @SmallTest
-    public void testMessagePipeReceiveOnSmallBuffer() {
-        Random random = new Random();
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        // Writing a random 8 bytes message.
-        byte[] bytes = new byte[8];
-        random.nextBytes(bytes);
-        ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length);
-        buffer.put(bytes);
-        handles.first.writeMessage(buffer, null, MessagePipeHandle.WriteFlags.NONE);
-
-        ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(1);
-        ResultAnd<MessagePipeHandle.ReadMessageResult> result =
-                handles.second.readMessage(receiveBuffer, 0, MessagePipeHandle.ReadFlags.NONE);
-        assertEquals(MojoResult.RESOURCE_EXHAUSTED, result.getMojoResult());
-        assertEquals(bytes.length, result.getValue().getMessageSize());
-        assertEquals(0, result.getValue().getHandlesCount());
-    }
-
-    /**
-     * Testing {@link MessagePipeHandle}.
-     */
-    @SmallTest
-    public void testMessagePipeSendHandles() {
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        Pair<MessagePipeHandle, MessagePipeHandle> handlesToShare = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-        addHandlePairToClose(handlesToShare);
-
-        handles.first.writeMessage(null, Collections.<Handle>singletonList(handlesToShare.second),
-                MessagePipeHandle.WriteFlags.NONE);
-        assertFalse(handlesToShare.second.isValid());
-        ResultAnd<MessagePipeHandle.ReadMessageResult> readMessageResult =
-                handles.second.readMessage(null, 1, MessagePipeHandle.ReadFlags.NONE);
-        assertEquals(1, readMessageResult.getValue().getHandlesCount());
-        MessagePipeHandle newHandle =
-                readMessageResult.getValue().getHandles().get(0).toMessagePipeHandle();
-        addHandleToClose(newHandle);
-        assertTrue(newHandle.isValid());
-        checkSendingMessage(handlesToShare.first, newHandle);
-        checkSendingMessage(newHandle, handlesToShare.first);
-    }
-
-    private static void createAndCloseDataPipe(DataPipe.CreateOptions options) {
-        Core core = CoreImpl.getInstance();
-        Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles =
-                core.createDataPipe(options);
-        handles.first.close();
-        handles.second.close();
-    }
-
-    /**
-     * Testing {@link DataPipe}.
-     */
-    @SmallTest
-    public void testDataPipeCreation() {
-        // Create datapipe with null options.
-        createAndCloseDataPipe(null);
-        DataPipe.CreateOptions options = new DataPipe.CreateOptions();
-        // Create datapipe with element size set.
-        options.setElementNumBytes(24);
-        createAndCloseDataPipe(options);
-        // Create datapipe with capacity set.
-        options.setCapacityNumBytes(1024 * options.getElementNumBytes());
-        createAndCloseDataPipe(options);
-    }
-
-    /**
-     * Testing {@link DataPipe}.
-     */
-    @SmallTest
-    public void testDataPipeSend() {
-        Core core = CoreImpl.getInstance();
-
-        Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles = core.createDataPipe(null);
-        addHandlePairToClose(handles);
-
-        checkSendingData(handles.first, handles.second);
-    }
-
-    /**
-     * Testing {@link DataPipe}.
-     */
-    @SmallTest
-    public void testDataPipeTwoPhaseSend() {
-        Random random = new Random();
-        Core core = CoreImpl.getInstance();
-        Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles = core.createDataPipe(null);
-        addHandlePairToClose(handles);
-
-        // Writing a random 8 bytes message.
-        byte[] bytes = new byte[8];
-        random.nextBytes(bytes);
-        ByteBuffer buffer = handles.first.beginWriteData(bytes.length, DataPipe.WriteFlags.NONE);
-        assertTrue(buffer.capacity() >= bytes.length);
-        buffer.put(bytes);
-        handles.first.endWriteData(bytes.length);
-
-        // Read into a buffer.
-        ByteBuffer receiveBuffer =
-                handles.second.beginReadData(bytes.length, DataPipe.ReadFlags.NONE);
-        assertEquals(0, receiveBuffer.position());
-        assertEquals(bytes.length, receiveBuffer.limit());
-        byte[] receivedBytes = new byte[bytes.length];
-        receiveBuffer.get(receivedBytes);
-        assertTrue(Arrays.equals(bytes, receivedBytes));
-        handles.second.endReadData(bytes.length);
-    }
-
-    /**
-     * Testing {@link DataPipe}.
-     */
-    @SmallTest
-    public void testDataPipeDiscard() {
-        Random random = new Random();
-        Core core = CoreImpl.getInstance();
-        Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles = core.createDataPipe(null);
-        addHandlePairToClose(handles);
-
-        // Writing a random 8 bytes message.
-        byte[] bytes = new byte[8];
-        random.nextBytes(bytes);
-        ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length);
-        buffer.put(bytes);
-        ResultAnd<Integer> result = handles.first.writeData(buffer, DataPipe.WriteFlags.NONE);
-        assertEquals(MojoResult.OK, result.getMojoResult());
-        assertEquals(bytes.length, result.getValue().intValue());
-
-        // Discard bytes.
-        final int nbBytesToDiscard = 4;
-        assertEquals(nbBytesToDiscard,
-                handles.second.discardData(nbBytesToDiscard, DataPipe.ReadFlags.NONE));
-
-        // Read into a buffer.
-        ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(bytes.length - nbBytesToDiscard);
-        ResultAnd<Integer> readResult =
-                handles.second.readData(receiveBuffer, DataPipe.ReadFlags.NONE);
-        assertEquals(MojoResult.OK, readResult.getMojoResult());
-        assertEquals(bytes.length - nbBytesToDiscard, readResult.getValue().intValue());
-        assertEquals(0, receiveBuffer.position());
-        assertEquals(bytes.length - nbBytesToDiscard, receiveBuffer.limit());
-        byte[] receivedBytes = new byte[bytes.length - nbBytesToDiscard];
-        receiveBuffer.get(receivedBytes);
-        assertTrue(Arrays.equals(
-                Arrays.copyOfRange(bytes, nbBytesToDiscard, bytes.length), receivedBytes));
-    }
-
-    /**
-     * Testing {@link SharedBufferHandle}.
-     */
-    @SmallTest
-    public void testSharedBufferCreation() {
-        Core core = CoreImpl.getInstance();
-        // Test creation with empty options.
-        core.createSharedBuffer(null, 8).close();
-        // Test creation with default options.
-        core.createSharedBuffer(new SharedBufferHandle.CreateOptions(), 8).close();
-    }
-
-    /**
-     * Testing {@link SharedBufferHandle}.
-     */
-    @SmallTest
-    public void testSharedBufferDuplication() {
-        Core core = CoreImpl.getInstance();
-        SharedBufferHandle handle = core.createSharedBuffer(null, 8);
-        addHandleToClose(handle);
-
-        // Test duplication with empty options.
-        handle.duplicate(null).close();
-        // Test creation with default options.
-        handle.duplicate(new SharedBufferHandle.DuplicateOptions()).close();
-    }
-
-    /**
-     * Testing {@link SharedBufferHandle}.
-     */
-    @SmallTest
-    public void testSharedBufferSending() {
-        Core core = CoreImpl.getInstance();
-        SharedBufferHandle handle = core.createSharedBuffer(null, 8);
-        addHandleToClose(handle);
-        SharedBufferHandle newHandle = handle.duplicate(null);
-        addHandleToClose(newHandle);
-
-        checkSharing(handle, newHandle);
-        checkSharing(newHandle, handle);
-    }
-
-    /**
-     * Testing that invalid handle can be used with this implementation.
-     */
-    @SmallTest
-    public void testInvalidHandle() {
-        Core core = CoreImpl.getInstance();
-        Handle handle = InvalidHandle.INSTANCE;
-
-        // Checking sending an invalid handle.
-        // Until the behavior is changed on the C++ side, handle gracefully 2 different use case:
-        // - Receive a INVALID_ARGUMENT exception
-        // - Receive an invalid handle on the other side.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-        try {
-            handles.first.writeMessage(null, Collections.<Handle>singletonList(handle),
-                    MessagePipeHandle.WriteFlags.NONE);
-            ResultAnd<MessagePipeHandle.ReadMessageResult> readMessageResult =
-                    handles.second.readMessage(null, 1, MessagePipeHandle.ReadFlags.NONE);
-            assertEquals(1, readMessageResult.getValue().getHandlesCount());
-            assertFalse(readMessageResult.getValue().getHandles().get(0).isValid());
-        } catch (MojoException e) {
-            assertEquals(MojoResult.INVALID_ARGUMENT, e.getMojoResult());
-        }
-    }
-
-    /**
-     * Testing the pass method on message pipes.
-     */
-    @SmallTest
-    public void testMessagePipeHandlePass() {
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        assertTrue(handles.first.isValid());
-        MessagePipeHandle handleClone = handles.first.pass();
-
-        addHandleToClose(handleClone);
-
-        assertFalse(handles.first.isValid());
-        assertTrue(handleClone.isValid());
-        checkSendingMessage(handleClone, handles.second);
-        checkSendingMessage(handles.second, handleClone);
-    }
-
-    /**
-     * Testing the pass method on data pipes.
-     */
-    @SmallTest
-    public void testDataPipeHandlePass() {
-        Core core = CoreImpl.getInstance();
-        Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles = core.createDataPipe(null);
-        addHandlePairToClose(handles);
-
-        DataPipe.ProducerHandle producerClone = handles.first.pass();
-        DataPipe.ConsumerHandle consumerClone = handles.second.pass();
-
-        addHandleToClose(producerClone);
-        addHandleToClose(consumerClone);
-
-        assertFalse(handles.first.isValid());
-        assertFalse(handles.second.isValid());
-        assertTrue(producerClone.isValid());
-        assertTrue(consumerClone.isValid());
-        checkSendingData(producerClone, consumerClone);
-    }
-
-    /**
-     * Testing the pass method on shared buffers.
-     */
-    @SmallTest
-    public void testSharedBufferPass() {
-        Core core = CoreImpl.getInstance();
-        SharedBufferHandle handle = core.createSharedBuffer(null, 8);
-        addHandleToClose(handle);
-        SharedBufferHandle newHandle = handle.duplicate(null);
-        addHandleToClose(newHandle);
-
-        SharedBufferHandle handleClone = handle.pass();
-        SharedBufferHandle newHandleClone = newHandle.pass();
-
-        addHandleToClose(handleClone);
-        addHandleToClose(newHandleClone);
-
-        assertFalse(handle.isValid());
-        assertTrue(handleClone.isValid());
-        checkSharing(handleClone, newHandleClone);
-        checkSharing(newHandleClone, handleClone);
-    }
-
-    /**
-     * esting handle conversion to native and back.
-     */
-    @SmallTest
-    public void testHandleConversion() {
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        MessagePipeHandle converted =
-                core.acquireNativeHandle(handles.first.releaseNativeHandle()).toMessagePipeHandle();
-        addHandleToClose(converted);
-
-        assertFalse(handles.first.isValid());
-
-        checkSendingMessage(converted, handles.second);
-        checkSendingMessage(handles.second, converted);
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/system/impl/WatcherImplTest.java b/mojo/android/javatests/src/org/chromium/mojo/system/impl/WatcherImplTest.java
deleted file mode 100644
index e14adb1..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/system/impl/WatcherImplTest.java
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.InvalidHandle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.Watcher;
-import org.chromium.mojo.system.Watcher.Callback;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Testing the Watcher.
- */
-public class WatcherImplTest extends MojoTestCase {
-    private List<Handle> mHandlesToClose = new ArrayList<Handle>();
-    private Watcher mWatcher;
-    private Core mCore;
-
-    /**
-     * @see MojoTestCase#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mWatcher = new WatcherImpl();
-        mCore = CoreImpl.getInstance();
-    }
-
-    /**
-     * @see MojoTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        mWatcher.destroy();
-        MojoException toThrow = null;
-        for (Handle handle : mHandlesToClose) {
-            try {
-                handle.close();
-            } catch (MojoException e) {
-                if (toThrow == null) {
-                    toThrow = e;
-                }
-            }
-        }
-        if (toThrow != null) {
-            throw toThrow;
-        }
-        super.tearDown();
-    }
-
-    private void addHandlePairToClose(Pair<? extends Handle, ? extends Handle> handles) {
-        mHandlesToClose.add(handles.first);
-        mHandlesToClose.add(handles.second);
-    }
-
-    private static class WatcherResult implements Callback {
-        private int mResult = Integer.MIN_VALUE;
-        private MessagePipeHandle mReadPipe;
-
-        /**
-         * @param readPipe A MessagePipeHandle to read from when onResult triggers success.
-         */
-        public WatcherResult(MessagePipeHandle readPipe) {
-            mReadPipe = readPipe;
-        }
-        public WatcherResult() {
-            this(null);
-        }
-
-        /**
-         * @see Callback#onResult(int)
-         */
-        @Override
-        public void onResult(int result) {
-            this.mResult = result;
-
-            if (result == MojoResult.OK && mReadPipe != null) {
-                mReadPipe.readMessage(
-                        null, 0, MessagePipeHandle.ReadFlags.none().setMayDiscard(true));
-            }
-        }
-
-        /**
-         * @return the result
-         */
-        public int getResult() {
-            return mResult;
-        }
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testCorrectResult() {
-        // Checking a correct result.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = mCore.createMessagePipe(null);
-        addHandlePairToClose(handles);
-        final WatcherResult watcherResult = new WatcherResult(handles.first);
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        mWatcher.start(handles.first, Core.HandleSignals.READABLE, watcherResult);
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        handles.second.writeMessage(
-                ByteBuffer.allocateDirect(1), null, MessagePipeHandle.WriteFlags.NONE);
-        runLoopUntilIdle();
-        assertEquals(MojoResult.OK, watcherResult.getResult());
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testClosingPeerHandle() {
-        // Closing the peer handle.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = mCore.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        final WatcherResult watcherResult = new WatcherResult();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        mWatcher.start(handles.first, Core.HandleSignals.READABLE, watcherResult);
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        handles.second.close();
-        runLoopUntilIdle();
-        assertEquals(MojoResult.FAILED_PRECONDITION, watcherResult.getResult());
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testClosingWatchedHandle() {
-        // Closing the peer handle.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = mCore.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        final WatcherResult watcherResult = new WatcherResult();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        mWatcher.start(handles.first, Core.HandleSignals.READABLE, watcherResult);
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        handles.first.close();
-        runLoopUntilIdle();
-        assertEquals(MojoResult.CANCELLED, watcherResult.getResult());
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testInvalidHandle() {
-        // Closing the peer handle.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = mCore.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        final WatcherResult watcherResult = new WatcherResult();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        handles.first.close();
-        assertEquals(MojoResult.INVALID_ARGUMENT,
-                mWatcher.start(handles.first, Core.HandleSignals.READABLE, watcherResult));
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testDefaultInvalidHandle() {
-        final WatcherResult watcherResult = new WatcherResult();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        assertEquals(MojoResult.INVALID_ARGUMENT,
-                mWatcher.start(InvalidHandle.INSTANCE, Core.HandleSignals.READABLE, watcherResult));
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testCancel() {
-        // Closing the peer handle.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = mCore.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        final WatcherResult watcherResult = new WatcherResult();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        mWatcher.start(handles.first, Core.HandleSignals.READABLE, watcherResult);
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        mWatcher.cancel();
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        handles.second.writeMessage(
-                ByteBuffer.allocateDirect(1), null, MessagePipeHandle.WriteFlags.NONE);
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testImmediateCancelOnInvalidHandle() {
-        // Closing the peer handle.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = mCore.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        final WatcherResult watcherResult = new WatcherResult();
-        handles.first.close();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        mWatcher.start(handles.first, Core.HandleSignals.READABLE, watcherResult);
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-        mWatcher.cancel();
-
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-    }
-}
diff --git a/mojo/android/javatests/validation_test_util.cc b/mojo/android/javatests/validation_test_util.cc
deleted file mode 100644
index 75f79b3..0000000
--- a/mojo/android/javatests/validation_test_util.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/android/javatests/validation_test_util.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/android/jni_android.h"
-#include "base/android/jni_string.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/test/test_support_android.h"
-#include "jni/ValidationTestUtil_jni.h"
-#include "mojo/public/cpp/bindings/tests/validation_test_input_parser.h"
-
-using base::android::JavaParamRef;
-using base::android::ScopedJavaLocalRef;
-
-namespace mojo {
-namespace android {
-
-bool RegisterValidationTestUtil(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-ScopedJavaLocalRef<jobject> ParseData(
-    JNIEnv* env,
-    const JavaParamRef<jclass>& jcaller,
-    const JavaParamRef<jstring>& data_as_string) {
-  std::string input =
-      base::android::ConvertJavaStringToUTF8(env, data_as_string);
-  std::vector<uint8_t> data;
-  size_t num_handles;
-  std::string error_message;
-  if (!test::ParseValidationTestInput(
-          input, &data, &num_handles, &error_message)) {
-    ScopedJavaLocalRef<jstring> j_error_message =
-        base::android::ConvertUTF8ToJavaString(env, error_message);
-    return Java_ValidationTestUtil_buildData(env, nullptr, 0, j_error_message);
-  }
-  void* data_ptr = &data[0];
-  if (!data_ptr) {
-    DCHECK(!data.size());
-    data_ptr = &data;
-  }
-  jobject byte_buffer =
-      env->NewDirectByteBuffer(data_ptr, data.size());
-  return Java_ValidationTestUtil_buildData(env, byte_buffer, num_handles,
-                                           nullptr);
-}
-
-}  // namespace android
-}  // namespace mojo
diff --git a/mojo/android/javatests/validation_test_util.h b/mojo/android/javatests/validation_test_util.h
deleted file mode 100644
index f58dc07..0000000
--- a/mojo/android/javatests/validation_test_util.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_ANDROID_JAVATESTS_VALIDATION_TEST_UTIL_H_
-#define MOJO_ANDROID_JAVATESTS_VALIDATION_TEST_UTIL_H_
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-
-namespace mojo {
-namespace android {
-
-JNI_EXPORT bool RegisterValidationTestUtil(JNIEnv* env);
-
-}  // namespace android
-}  // namespace mojo
-
-#endif  // MOJO_SYSTEM_ANDROID_JAVATESTS_VALIDATION_TEST_UTIL_H_
diff --git a/mojo/android/system/base_run_loop.cc b/mojo/android/system/base_run_loop.cc
deleted file mode 100644
index 7993ba8..0000000
--- a/mojo/android/system/base_run_loop.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2015 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 "mojo/android/system/base_run_loop.h"
-
-#include <jni.h>
-
-// Removed unused headers. TODO(hidehiko): Upstream.
-// #include "base/android/base_jni_registrar.h"
-#include "base/android/jni_android.h"
-// #include "base/android/jni_registrar.h"
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "jni/BaseRunLoop_jni.h"
-
-using base::android::JavaParamRef;
-
-namespace mojo {
-namespace android {
-
-static jlong CreateBaseRunLoop(JNIEnv* env,
-                               const JavaParamRef<jobject>& jcaller) {
-  base::MessageLoop* message_loop = new base::MessageLoop;
-  return reinterpret_cast<uintptr_t>(message_loop);
-}
-
-static void Run(JNIEnv* env,
-                const JavaParamRef<jobject>& jcaller) {
-  base::RunLoop().Run();
-}
-
-static void RunUntilIdle(JNIEnv* env,
-                         const JavaParamRef<jobject>& jcaller) {
-  base::RunLoop().RunUntilIdle();
-}
-
-static void Quit(JNIEnv* env,
-                 const JavaParamRef<jobject>& jcaller,
-                 jlong runLoopID) {
-  reinterpret_cast<base::MessageLoop*>(runLoopID)->QuitWhenIdle();
-}
-
-static void RunJavaRunnable(
-    const base::android::ScopedJavaGlobalRef<jobject>& runnable_ref) {
-  Java_BaseRunLoop_runRunnable(base::android::AttachCurrentThread(),
-                               runnable_ref);
-}
-
-static void PostDelayedTask(JNIEnv* env,
-                            const JavaParamRef<jobject>& jcaller,
-                            jlong runLoopID,
-                            const JavaParamRef<jobject>& runnable,
-                            jlong delay) {
-  base::android::ScopedJavaGlobalRef<jobject> runnable_ref;
-  // ScopedJavaGlobalRef do not hold onto the env reference, so it is safe to
-  // use it across threads. |RunJavaRunnable| will acquire a new JNIEnv before
-  // running the Runnable.
-  runnable_ref.Reset(env, runnable);
-  reinterpret_cast<base::MessageLoop*>(runLoopID)
-      ->task_runner()
-      ->PostDelayedTask(FROM_HERE, base::Bind(&RunJavaRunnable, runnable_ref),
-                        base::TimeDelta::FromMicroseconds(delay));
-}
-
-static void DeleteMessageLoop(JNIEnv* env,
-                              const JavaParamRef<jobject>& jcaller,
-                              jlong runLoopID) {
-  base::MessageLoop* message_loop =
-      reinterpret_cast<base::MessageLoop*>(runLoopID);
-  delete message_loop;
-}
-
-bool RegisterBaseRunLoop(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-}  // namespace android
-}  // namespace mojo
diff --git a/mojo/android/system/base_run_loop.h b/mojo/android/system/base_run_loop.h
deleted file mode 100644
index f225c65..0000000
--- a/mojo/android/system/base_run_loop.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2015 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 MOJO_ANDROID_SYSTEM_BASE_RUN_LOOP_H_
-#define MOJO_ANDROID_SYSTEM_BASE_RUN_LOOP_H_
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-
-namespace mojo {
-namespace android {
-
-JNI_EXPORT bool RegisterBaseRunLoop(JNIEnv* env);
-
-}  // namespace android
-}  // namespace mojo
-
-#endif  // MOJO_ANDROID_SYSTEM_BASE_RUN_LOOP_H_
diff --git a/mojo/android/system/core_impl.cc b/mojo/android/system/core_impl.cc
deleted file mode 100644
index 7d5a402..0000000
--- a/mojo/android/system/core_impl.cc
+++ /dev/null
@@ -1,310 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/android/system/core_impl.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-// Removed unused headers. TODO(hidehiko): Upstream.
-// #include "base/android/base_jni_registrar.h"
-#include "base/android/jni_android.h"
-// #include "base/android/jni_registrar.h"
-// #include "base/android/library_loader/library_loader_hooks.h"
-#include "base/android/scoped_java_ref.h"
-#include "jni/CoreImpl_jni.h"
-#include "mojo/public/c/system/core.h"
-
-namespace mojo {
-namespace android {
-
-using base::android::JavaParamRef;
-using base::android::ScopedJavaLocalRef;
-
-static jlong GetTimeTicksNow(JNIEnv* env,
-                             const JavaParamRef<jobject>& jcaller) {
-  return MojoGetTimeTicksNow();
-}
-
-static ScopedJavaLocalRef<jobject> CreateMessagePipe(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    const JavaParamRef<jobject>& options_buffer) {
-  const MojoCreateMessagePipeOptions* options = NULL;
-  if (options_buffer) {
-    const void* buffer_start = env->GetDirectBufferAddress(options_buffer);
-    DCHECK(buffer_start);
-    DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u);
-    const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer);
-    DCHECK_EQ(buffer_size, sizeof(MojoCreateMessagePipeOptions));
-    options = static_cast<const MojoCreateMessagePipeOptions*>(buffer_start);
-    DCHECK_EQ(options->struct_size, buffer_size);
-  }
-  MojoHandle handle1;
-  MojoHandle handle2;
-  MojoResult result = MojoCreateMessagePipe(options, &handle1, &handle2);
-  return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2);
-}
-
-static ScopedJavaLocalRef<jobject> CreateDataPipe(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    const JavaParamRef<jobject>& options_buffer) {
-  const MojoCreateDataPipeOptions* options = NULL;
-  if (options_buffer) {
-    const void* buffer_start = env->GetDirectBufferAddress(options_buffer);
-    DCHECK(buffer_start);
-    DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u);
-    const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer);
-    DCHECK_EQ(buffer_size, sizeof(MojoCreateDataPipeOptions));
-    options = static_cast<const MojoCreateDataPipeOptions*>(buffer_start);
-    DCHECK_EQ(options->struct_size, buffer_size);
-  }
-  MojoHandle handle1;
-  MojoHandle handle2;
-  MojoResult result = MojoCreateDataPipe(options, &handle1, &handle2);
-  return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2);
-}
-
-static ScopedJavaLocalRef<jobject> CreateSharedBuffer(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    const JavaParamRef<jobject>& options_buffer,
-    jlong num_bytes) {
-  const MojoCreateSharedBufferOptions* options = 0;
-  if (options_buffer) {
-    const void* buffer_start = env->GetDirectBufferAddress(options_buffer);
-    DCHECK(buffer_start);
-    DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u);
-    const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer);
-    DCHECK_EQ(buffer_size, sizeof(MojoCreateSharedBufferOptions));
-    options = static_cast<const MojoCreateSharedBufferOptions*>(buffer_start);
-    DCHECK_EQ(options->struct_size, buffer_size);
-  }
-  MojoHandle handle;
-  MojoResult result = MojoCreateSharedBuffer(options, num_bytes, &handle);
-  return Java_CoreImpl_newResultAndInteger(env, result, handle);
-}
-
-static jint Close(JNIEnv* env,
-                  const JavaParamRef<jobject>& jcaller,
-                  jint mojo_handle) {
-  return MojoClose(mojo_handle);
-}
-
-static jint QueryHandleSignalsState(JNIEnv* env,
-                                    const JavaParamRef<jobject>& jcaller,
-                                    jint mojo_handle,
-                                    const JavaParamRef<jobject>& buffer) {
-  MojoHandleSignalsState* signals_state =
-      static_cast<MojoHandleSignalsState*>(env->GetDirectBufferAddress(buffer));
-  DCHECK(signals_state);
-  DCHECK_EQ(sizeof(MojoHandleSignalsState),
-            static_cast<size_t>(env->GetDirectBufferCapacity(buffer)));
-  return MojoQueryHandleSignalsState(mojo_handle, signals_state);
-}
-
-static jint WriteMessage(JNIEnv* env,
-                         const JavaParamRef<jobject>& jcaller,
-                         jint mojo_handle,
-                         const JavaParamRef<jobject>& bytes,
-                         jint num_bytes,
-                         const JavaParamRef<jobject>& handles_buffer,
-                         jint flags) {
-  const void* buffer_start = 0;
-  uint32_t buffer_size = 0;
-  if (bytes) {
-    buffer_start = env->GetDirectBufferAddress(bytes);
-    DCHECK(buffer_start);
-    DCHECK(env->GetDirectBufferCapacity(bytes) >= num_bytes);
-    buffer_size = num_bytes;
-  }
-  const MojoHandle* handles = 0;
-  uint32_t num_handles = 0;
-  if (handles_buffer) {
-    handles =
-        static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer));
-    num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4;
-  }
-  // Java code will handle invalidating handles if the write succeeded.
-  return MojoWriteMessage(
-      mojo_handle, buffer_start, buffer_size, handles, num_handles, flags);
-}
-
-static ScopedJavaLocalRef<jobject> ReadMessage(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    jint mojo_handle,
-    const JavaParamRef<jobject>& bytes,
-    const JavaParamRef<jobject>& handles_buffer,
-    jint flags) {
-  void* buffer_start = 0;
-  uint32_t buffer_size = 0;
-  if (bytes) {
-    buffer_start = env->GetDirectBufferAddress(bytes);
-    DCHECK(buffer_start);
-    buffer_size = env->GetDirectBufferCapacity(bytes);
-  }
-  MojoHandle* handles = 0;
-  uint32_t num_handles = 0;
-  if (handles_buffer) {
-    handles =
-        static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer));
-    num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4;
-  }
-  MojoResult result = MojoReadMessage(
-      mojo_handle, buffer_start, &buffer_size, handles, &num_handles, flags);
-  // Jave code will handle taking ownership of any received handle.
-  return Java_CoreImpl_newReadMessageResult(env, result, buffer_size,
-                                            num_handles);
-}
-
-static ScopedJavaLocalRef<jobject> ReadData(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    jint mojo_handle,
-    const JavaParamRef<jobject>& elements,
-    jint elements_capacity,
-    jint flags) {
-  void* buffer_start = 0;
-  uint32_t buffer_size = elements_capacity;
-  if (elements) {
-    buffer_start = env->GetDirectBufferAddress(elements);
-    DCHECK(buffer_start);
-    DCHECK(elements_capacity <= env->GetDirectBufferCapacity(elements));
-  }
-  MojoResult result =
-      MojoReadData(mojo_handle, buffer_start, &buffer_size, flags);
-  return Java_CoreImpl_newResultAndInteger(
-      env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0);
-}
-
-static ScopedJavaLocalRef<jobject> BeginReadData(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    jint mojo_handle,
-    jint num_bytes,
-    jint flags) {
-  void const* buffer = 0;
-  uint32_t buffer_size = num_bytes;
-  MojoResult result =
-      MojoBeginReadData(mojo_handle, &buffer, &buffer_size, flags);
-  jobject byte_buffer = 0;
-  if (result == MOJO_RESULT_OK) {
-    byte_buffer =
-        env->NewDirectByteBuffer(const_cast<void*>(buffer), buffer_size);
-  }
-  return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer);
-}
-
-static jint EndReadData(JNIEnv* env,
-                        const JavaParamRef<jobject>& jcaller,
-                        jint mojo_handle,
-                        jint num_bytes_read) {
-  return MojoEndReadData(mojo_handle, num_bytes_read);
-}
-
-static ScopedJavaLocalRef<jobject> WriteData(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    jint mojo_handle,
-    const JavaParamRef<jobject>& elements,
-    jint limit,
-    jint flags) {
-  void* buffer_start = env->GetDirectBufferAddress(elements);
-  DCHECK(buffer_start);
-  DCHECK(limit <= env->GetDirectBufferCapacity(elements));
-  uint32_t buffer_size = limit;
-  MojoResult result =
-      MojoWriteData(mojo_handle, buffer_start, &buffer_size, flags);
-  return Java_CoreImpl_newResultAndInteger(
-      env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0);
-}
-
-static ScopedJavaLocalRef<jobject> BeginWriteData(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    jint mojo_handle,
-    jint num_bytes,
-    jint flags) {
-  void* buffer = 0;
-  uint32_t buffer_size = num_bytes;
-  MojoResult result =
-      MojoBeginWriteData(mojo_handle, &buffer, &buffer_size, flags);
-  jobject byte_buffer = 0;
-  if (result == MOJO_RESULT_OK) {
-    byte_buffer = env->NewDirectByteBuffer(buffer, buffer_size);
-  }
-  return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer);
-}
-
-static jint EndWriteData(JNIEnv* env,
-                         const JavaParamRef<jobject>& jcaller,
-                         jint mojo_handle,
-                         jint num_bytes_written) {
-  return MojoEndWriteData(mojo_handle, num_bytes_written);
-}
-
-static ScopedJavaLocalRef<jobject> Duplicate(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    jint mojo_handle,
-    const JavaParamRef<jobject>& options_buffer) {
-  const MojoDuplicateBufferHandleOptions* options = 0;
-  if (options_buffer) {
-    const void* buffer_start = env->GetDirectBufferAddress(options_buffer);
-    DCHECK(buffer_start);
-    const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer);
-    DCHECK_EQ(buffer_size, sizeof(MojoDuplicateBufferHandleOptions));
-    options =
-        static_cast<const MojoDuplicateBufferHandleOptions*>(buffer_start);
-    DCHECK_EQ(options->struct_size, buffer_size);
-  }
-  MojoHandle handle;
-  MojoResult result = MojoDuplicateBufferHandle(mojo_handle, options, &handle);
-  return Java_CoreImpl_newResultAndInteger(env, result, handle);
-}
-
-static ScopedJavaLocalRef<jobject> Map(JNIEnv* env,
-                                       const JavaParamRef<jobject>& jcaller,
-                                       jint mojo_handle,
-                                       jlong offset,
-                                       jlong num_bytes,
-                                       jint flags) {
-  void* buffer = 0;
-  MojoResult result =
-      MojoMapBuffer(mojo_handle, offset, num_bytes, &buffer, flags);
-  jobject byte_buffer = 0;
-  if (result == MOJO_RESULT_OK) {
-    byte_buffer = env->NewDirectByteBuffer(buffer, num_bytes);
-  }
-  return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer);
-}
-
-static int Unmap(JNIEnv* env,
-                 const JavaParamRef<jobject>& jcaller,
-                 const JavaParamRef<jobject>& buffer) {
-  void* buffer_start = env->GetDirectBufferAddress(buffer);
-  DCHECK(buffer_start);
-  return MojoUnmapBuffer(buffer_start);
-}
-
-static jint GetNativeBufferOffset(JNIEnv* env,
-                                  const JavaParamRef<jobject>& jcaller,
-                                  const JavaParamRef<jobject>& buffer,
-                                  jint alignment) {
-  jint offset =
-      reinterpret_cast<uintptr_t>(env->GetDirectBufferAddress(buffer)) %
-      alignment;
-  if (offset == 0)
-    return 0;
-  return alignment - offset;
-}
-
-bool RegisterCoreImpl(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-}  // namespace android
-}  // namespace mojo
diff --git a/mojo/android/system/core_impl.h b/mojo/android/system/core_impl.h
deleted file mode 100644
index c624999..0000000
--- a/mojo/android/system/core_impl.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_ANDROID_SYSTEM_CORE_IMPL_H_
-#define MOJO_ANDROID_SYSTEM_CORE_IMPL_H_
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-
-namespace mojo {
-namespace android {
-
-JNI_EXPORT bool RegisterCoreImpl(JNIEnv* env);
-
-}  // namespace android
-}  // namespace mojo
-
-#endif  // MOJO_ANDROID_SYSTEM_CORE_IMPL_H_
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/BaseRunLoop.java b/mojo/android/system/src/org/chromium/mojo/system/impl/BaseRunLoop.java
deleted file mode 100644
index 3db6670..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/BaseRunLoop.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.mojo.system.RunLoop;
-
-/**
- * Implementation of {@link RunLoop} suitable for the base:: message loop implementation.
- */
-@JNINamespace("mojo::android")
-class BaseRunLoop implements RunLoop {
-    /**
-     * Pointer to the C run loop.
-     */
-    private long mRunLoopID;
-    private final CoreImpl mCore;
-
-    BaseRunLoop(CoreImpl core) {
-        this.mCore = core;
-        this.mRunLoopID = nativeCreateBaseRunLoop();
-    }
-
-    @Override
-    public void run() {
-        assert mRunLoopID != 0 : "The run loop cannot run once closed";
-        nativeRun();
-    }
-
-    @Override
-    public void runUntilIdle() {
-        assert mRunLoopID != 0 : "The run loop cannot run once closed";
-        nativeRunUntilIdle();
-    }
-
-    @Override
-    public void quit() {
-        assert mRunLoopID != 0 : "The run loop cannot be quitted run once closed";
-        nativeQuit(mRunLoopID);
-    }
-
-    @Override
-    public void postDelayedTask(Runnable runnable, long delay) {
-        assert mRunLoopID != 0 : "The run loop cannot run tasks once closed";
-        nativePostDelayedTask(mRunLoopID, runnable, delay);
-    }
-
-    @Override
-    public void close() {
-        if (mRunLoopID == 0) {
-            return;
-        }
-        // We don't want to de-register a different run loop!
-        assert mCore.getCurrentRunLoop() == this : "Only the current run loop can be closed";
-        mCore.clearCurrentRunLoop();
-        nativeDeleteMessageLoop(mRunLoopID);
-        mRunLoopID = 0;
-    }
-
-    @CalledByNative
-    private static void runRunnable(Runnable runnable) {
-        runnable.run();
-    }
-
-    private native long nativeCreateBaseRunLoop();
-    private native void nativeRun();
-    private native void nativeRunUntilIdle();
-    private native void nativeQuit(long runLoopID);
-    private native void nativePostDelayedTask(long runLoopID, Runnable runnable, long delay);
-    private native void nativeDeleteMessageLoop(long runLoopID);
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java
deleted file mode 100644
index 173f801..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java
+++ /dev/null
@@ -1,522 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.base.annotations.MainDex;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Core.HandleSignalsState;
-import org.chromium.mojo.system.DataPipe;
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.RunLoop;
-import org.chromium.mojo.system.SharedBufferHandle;
-import org.chromium.mojo.system.SharedBufferHandle.DuplicateOptions;
-import org.chromium.mojo.system.SharedBufferHandle.MapFlags;
-import org.chromium.mojo.system.UntypedHandle;
-import org.chromium.mojo.system.Watcher;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Implementation of {@link Core}.
- */
-@JNINamespace("mojo::android")
-@MainDex
-public class CoreImpl implements Core {
-    /**
-     * Discard flag for the |MojoReadData| operation.
-     */
-    private static final int MOJO_READ_DATA_FLAG_DISCARD = 1 << 1;
-
-    /**
-     * the size of a handle, in bytes.
-     */
-    private static final int HANDLE_SIZE = 4;
-
-    /**
-     * the size of a flag, in bytes.
-     */
-    private static final int FLAG_SIZE = 4;
-
-    /**
-     * The mojo handle for an invalid handle.
-     */
-    static final int INVALID_HANDLE = 0;
-
-    private static class LazyHolder { private static final Core INSTANCE = new CoreImpl(); }
-
-    /**
-     * The run loop for the current thread.
-     */
-    private final ThreadLocal<BaseRunLoop> mCurrentRunLoop = new ThreadLocal<BaseRunLoop>();
-
-    /**
-     * The offset needed to get an aligned buffer.
-     */
-    private final int mByteBufferOffset;
-
-    /**
-     * @return the instance.
-     */
-    public static Core getInstance() {
-        return LazyHolder.INSTANCE;
-    }
-
-    private CoreImpl() {
-        // Fix for the ART runtime, before:
-        // https://android.googlesource.com/platform/libcore/+/fb6c80875a8a8d0a9628562f89c250b6a962e824%5E!/
-        // This assumes consistent allocation.
-        mByteBufferOffset = nativeGetNativeBufferOffset(ByteBuffer.allocateDirect(8), 8);
-    }
-
-    /**
-     * @see Core#getTimeTicksNow()
-     */
-    @Override
-    public long getTimeTicksNow() {
-        return nativeGetTimeTicksNow();
-    }
-
-    /**
-     * @see Core#createMessagePipe(MessagePipeHandle.CreateOptions)
-     */
-    @Override
-    public Pair<MessagePipeHandle, MessagePipeHandle> createMessagePipe(
-            MessagePipeHandle.CreateOptions options) {
-        ByteBuffer optionsBuffer = null;
-        if (options != null) {
-            optionsBuffer = allocateDirectBuffer(8);
-            optionsBuffer.putInt(0, 8);
-            optionsBuffer.putInt(4, options.getFlags().getFlags());
-        }
-        ResultAnd<IntegerPair> result = nativeCreateMessagePipe(optionsBuffer);
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return Pair.<MessagePipeHandle, MessagePipeHandle>create(
-                new MessagePipeHandleImpl(this, result.getValue().first),
-                new MessagePipeHandleImpl(this, result.getValue().second));
-    }
-
-    /**
-     * @see Core#createDataPipe(DataPipe.CreateOptions)
-     */
-    @Override
-    public Pair<ProducerHandle, ConsumerHandle> createDataPipe(DataPipe.CreateOptions options) {
-        ByteBuffer optionsBuffer = null;
-        if (options != null) {
-            optionsBuffer = allocateDirectBuffer(16);
-            optionsBuffer.putInt(0, 16);
-            optionsBuffer.putInt(4, options.getFlags().getFlags());
-            optionsBuffer.putInt(8, options.getElementNumBytes());
-            optionsBuffer.putInt(12, options.getCapacityNumBytes());
-        }
-        ResultAnd<IntegerPair> result = nativeCreateDataPipe(optionsBuffer);
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return Pair.<ProducerHandle, ConsumerHandle>create(
-                new DataPipeProducerHandleImpl(this, result.getValue().first),
-                new DataPipeConsumerHandleImpl(this, result.getValue().second));
-    }
-
-    /**
-     * @see Core#createSharedBuffer(SharedBufferHandle.CreateOptions, long)
-     */
-    @Override
-    public SharedBufferHandle createSharedBuffer(
-            SharedBufferHandle.CreateOptions options, long numBytes) {
-        ByteBuffer optionsBuffer = null;
-        if (options != null) {
-            optionsBuffer = allocateDirectBuffer(8);
-            optionsBuffer.putInt(0, 8);
-            optionsBuffer.putInt(4, options.getFlags().getFlags());
-        }
-        ResultAnd<Integer> result = nativeCreateSharedBuffer(optionsBuffer, numBytes);
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return new SharedBufferHandleImpl(this, result.getValue());
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Core#acquireNativeHandle(int)
-     */
-    @Override
-    public UntypedHandle acquireNativeHandle(int handle) {
-        return new UntypedHandleImpl(this, handle);
-    }
-
-    /**
-     * @see Core#getWatcher()
-     */
-    @Override
-    public Watcher getWatcher() {
-        return new WatcherImpl();
-    }
-
-    /**
-     * @see Core#createDefaultRunLoop()
-     */
-    @Override
-    public RunLoop createDefaultRunLoop() {
-        if (mCurrentRunLoop.get() != null) {
-            throw new MojoException(MojoResult.FAILED_PRECONDITION);
-        }
-        BaseRunLoop runLoop = new BaseRunLoop(this);
-        mCurrentRunLoop.set(runLoop);
-        return runLoop;
-    }
-
-    /**
-     * @see Core#getCurrentRunLoop()
-     */
-    @Override
-    public RunLoop getCurrentRunLoop() {
-        return mCurrentRunLoop.get();
-    }
-
-    /**
-     * Remove the current run loop.
-     */
-    void clearCurrentRunLoop() {
-        mCurrentRunLoop.remove();
-    }
-
-    int closeWithResult(int mojoHandle) {
-        return nativeClose(mojoHandle);
-    }
-
-    void close(int mojoHandle) {
-        int mojoResult = nativeClose(mojoHandle);
-        if (mojoResult != MojoResult.OK) {
-            throw new MojoException(mojoResult);
-        }
-    }
-
-    HandleSignalsState queryHandleSignalsState(int mojoHandle) {
-        ByteBuffer buffer = allocateDirectBuffer(8);
-        int result = nativeQueryHandleSignalsState(mojoHandle, buffer);
-        if (result != MojoResult.OK) throw new MojoException(result);
-        return new HandleSignalsState(
-                new HandleSignals(buffer.getInt(0)), new HandleSignals(buffer.getInt(4)));
-    }
-
-    /**
-     * @see MessagePipeHandle#writeMessage(ByteBuffer, List, MessagePipeHandle.WriteFlags)
-     */
-    void writeMessage(MessagePipeHandleImpl pipeHandle, ByteBuffer bytes,
-            List<? extends Handle> handles, MessagePipeHandle.WriteFlags flags) {
-        ByteBuffer handlesBuffer = null;
-        if (handles != null && !handles.isEmpty()) {
-            handlesBuffer = allocateDirectBuffer(handles.size() * HANDLE_SIZE);
-            for (Handle handle : handles) {
-                handlesBuffer.putInt(getMojoHandle(handle));
-            }
-            handlesBuffer.position(0);
-        }
-        int mojoResult = nativeWriteMessage(pipeHandle.getMojoHandle(), bytes,
-                bytes == null ? 0 : bytes.limit(), handlesBuffer, flags.getFlags());
-        if (mojoResult != MojoResult.OK) {
-            throw new MojoException(mojoResult);
-        }
-        // Success means the handles have been invalidated.
-        if (handles != null) {
-            for (Handle handle : handles) {
-                if (handle.isValid()) {
-                    ((HandleBase) handle).invalidateHandle();
-                }
-            }
-        }
-    }
-
-    /**
-     * @see MessagePipeHandle#readMessage(ByteBuffer, int, MessagePipeHandle.ReadFlags)
-     */
-    ResultAnd<MessagePipeHandle.ReadMessageResult> readMessage(MessagePipeHandleImpl handle,
-            ByteBuffer bytes, int maxNumberOfHandles, MessagePipeHandle.ReadFlags flags) {
-        ByteBuffer handlesBuffer = null;
-        if (maxNumberOfHandles > 0) {
-            handlesBuffer = allocateDirectBuffer(maxNumberOfHandles * HANDLE_SIZE);
-        }
-        ResultAnd<MessagePipeHandle.ReadMessageResult> result =
-                nativeReadMessage(handle.getMojoHandle(), bytes, handlesBuffer, flags.getFlags());
-        if (result.getMojoResult() != MojoResult.OK
-                && result.getMojoResult() != MojoResult.RESOURCE_EXHAUSTED
-                && result.getMojoResult() != MojoResult.SHOULD_WAIT) {
-            throw new MojoException(result.getMojoResult());
-        }
-
-        if (result.getMojoResult() == MojoResult.OK) {
-            MessagePipeHandle.ReadMessageResult readResult = result.getValue();
-            if (bytes != null) {
-                bytes.position(0);
-                bytes.limit(readResult.getMessageSize());
-            }
-
-            List<UntypedHandle> handles =
-                    new ArrayList<UntypedHandle>(readResult.getHandlesCount());
-            for (int i = 0; i < readResult.getHandlesCount(); ++i) {
-                int mojoHandle = handlesBuffer.getInt(HANDLE_SIZE * i);
-                handles.add(new UntypedHandleImpl(this, mojoHandle));
-            }
-            readResult.setHandles(handles);
-        }
-        return result;
-    }
-
-    /**
-     * @see ConsumerHandle#discardData(int, DataPipe.ReadFlags)
-     */
-    int discardData(DataPipeConsumerHandleImpl handle, int numBytes, DataPipe.ReadFlags flags) {
-        ResultAnd<Integer> result = nativeReadData(handle.getMojoHandle(), null, numBytes,
-                flags.getFlags() | MOJO_READ_DATA_FLAG_DISCARD);
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return result.getValue();
-    }
-
-    /**
-     * @see ConsumerHandle#readData(ByteBuffer, DataPipe.ReadFlags)
-     */
-    ResultAnd<Integer> readData(
-            DataPipeConsumerHandleImpl handle, ByteBuffer elements, DataPipe.ReadFlags flags) {
-        ResultAnd<Integer> result = nativeReadData(handle.getMojoHandle(), elements,
-                elements == null ? 0 : elements.capacity(), flags.getFlags());
-        if (result.getMojoResult() != MojoResult.OK
-                && result.getMojoResult() != MojoResult.SHOULD_WAIT) {
-            throw new MojoException(result.getMojoResult());
-        }
-        if (result.getMojoResult() == MojoResult.OK) {
-            if (elements != null) {
-                elements.limit(result.getValue());
-            }
-        }
-        return result;
-    }
-
-    /**
-     * @see ConsumerHandle#beginReadData(int, DataPipe.ReadFlags)
-     */
-    ByteBuffer beginReadData(
-            DataPipeConsumerHandleImpl handle, int numBytes, DataPipe.ReadFlags flags) {
-        ResultAnd<ByteBuffer> result =
-                nativeBeginReadData(handle.getMojoHandle(), numBytes, flags.getFlags());
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return result.getValue().asReadOnlyBuffer();
-    }
-
-    /**
-     * @see ConsumerHandle#endReadData(int)
-     */
-    void endReadData(DataPipeConsumerHandleImpl handle, int numBytesRead) {
-        int result = nativeEndReadData(handle.getMojoHandle(), numBytesRead);
-        if (result != MojoResult.OK) {
-            throw new MojoException(result);
-        }
-    }
-
-    /**
-     * @see ProducerHandle#writeData(ByteBuffer, DataPipe.WriteFlags)
-     */
-    ResultAnd<Integer> writeData(
-            DataPipeProducerHandleImpl handle, ByteBuffer elements, DataPipe.WriteFlags flags) {
-        return nativeWriteData(
-                handle.getMojoHandle(), elements, elements.limit(), flags.getFlags());
-    }
-
-    /**
-     * @see ProducerHandle#beginWriteData(int, DataPipe.WriteFlags)
-     */
-    ByteBuffer beginWriteData(
-            DataPipeProducerHandleImpl handle, int numBytes, DataPipe.WriteFlags flags) {
-        ResultAnd<ByteBuffer> result =
-                nativeBeginWriteData(handle.getMojoHandle(), numBytes, flags.getFlags());
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return result.getValue();
-    }
-
-    /**
-     * @see ProducerHandle#endWriteData(int)
-     */
-    void endWriteData(DataPipeProducerHandleImpl handle, int numBytesWritten) {
-        int result = nativeEndWriteData(handle.getMojoHandle(), numBytesWritten);
-        if (result != MojoResult.OK) {
-            throw new MojoException(result);
-        }
-    }
-
-    /**
-     * @see SharedBufferHandle#duplicate(DuplicateOptions)
-     */
-    SharedBufferHandle duplicate(SharedBufferHandleImpl handle, DuplicateOptions options) {
-        ByteBuffer optionsBuffer = null;
-        if (options != null) {
-            optionsBuffer = allocateDirectBuffer(8);
-            optionsBuffer.putInt(0, 8);
-            optionsBuffer.putInt(4, options.getFlags().getFlags());
-        }
-        ResultAnd<Integer> result = nativeDuplicate(handle.getMojoHandle(), optionsBuffer);
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return new SharedBufferHandleImpl(this, result.getValue());
-    }
-
-    /**
-     * @see SharedBufferHandle#map(long, long, MapFlags)
-     */
-    ByteBuffer map(SharedBufferHandleImpl handle, long offset, long numBytes, MapFlags flags) {
-        ResultAnd<ByteBuffer> result =
-                nativeMap(handle.getMojoHandle(), offset, numBytes, flags.getFlags());
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return result.getValue();
-    }
-
-    /**
-     * @see SharedBufferHandle#unmap(ByteBuffer)
-     */
-    void unmap(ByteBuffer buffer) {
-        int result = nativeUnmap(buffer);
-        if (result != MojoResult.OK) {
-            throw new MojoException(result);
-        }
-    }
-
-    /**
-     * @return the mojo handle associated to the given handle, considering invalid handles.
-     */
-    private int getMojoHandle(Handle handle) {
-        if (handle.isValid()) {
-            return ((HandleBase) handle).getMojoHandle();
-        }
-        return 0;
-    }
-
-    private static boolean isUnrecoverableError(int code) {
-        switch (code) {
-            case MojoResult.OK:
-            case MojoResult.DEADLINE_EXCEEDED:
-            case MojoResult.CANCELLED:
-            case MojoResult.FAILED_PRECONDITION:
-                return false;
-            default:
-                return true;
-        }
-    }
-
-    private static int filterMojoResultForWait(int code) {
-        if (isUnrecoverableError(code)) {
-            throw new MojoException(code);
-        }
-        return code;
-    }
-
-    private ByteBuffer allocateDirectBuffer(int capacity) {
-        ByteBuffer buffer = ByteBuffer.allocateDirect(capacity + mByteBufferOffset);
-        if (mByteBufferOffset != 0) {
-            buffer.position(mByteBufferOffset);
-            buffer = buffer.slice();
-        }
-        return buffer.order(ByteOrder.nativeOrder());
-    }
-
-    @CalledByNative
-    private static ResultAnd<ByteBuffer> newResultAndBuffer(int mojoResult, ByteBuffer buffer) {
-        return new ResultAnd<>(mojoResult, buffer);
-    }
-
-    /**
-     * Trivial alias for Pair<Integer, Integer>. This is needed because our jni generator is unable
-     * to handle class that contains space.
-     */
-    private static final class IntegerPair extends Pair<Integer, Integer> {
-        public IntegerPair(Integer first, Integer second) {
-            super(first, second);
-        }
-    }
-
-    @CalledByNative
-    private static ResultAnd<MessagePipeHandle.ReadMessageResult> newReadMessageResult(
-            int mojoResult, int messageSize, int handlesCount) {
-        MessagePipeHandle.ReadMessageResult result = new MessagePipeHandle.ReadMessageResult();
-        result.setMessageSize(messageSize);
-        result.setHandlesCount(handlesCount);
-        return new ResultAnd<>(mojoResult, result);
-    }
-
-    @CalledByNative
-    private static ResultAnd<Integer> newResultAndInteger(int mojoResult, int numBytesRead) {
-        return new ResultAnd<>(mojoResult, numBytesRead);
-    }
-
-    @CalledByNative
-    private static ResultAnd<IntegerPair> newNativeCreationResult(
-            int mojoResult, int mojoHandle1, int mojoHandle2) {
-        return new ResultAnd<>(mojoResult, new IntegerPair(mojoHandle1, mojoHandle2));
-    }
-
-    private native long nativeGetTimeTicksNow();
-
-    private native ResultAnd<IntegerPair> nativeCreateMessagePipe(ByteBuffer optionsBuffer);
-
-    private native ResultAnd<IntegerPair> nativeCreateDataPipe(ByteBuffer optionsBuffer);
-
-    private native ResultAnd<Integer> nativeCreateSharedBuffer(
-            ByteBuffer optionsBuffer, long numBytes);
-
-    private native int nativeClose(int mojoHandle);
-
-    private native int nativeQueryHandleSignalsState(int mojoHandle, ByteBuffer signalsStateBuffer);
-
-    private native int nativeWriteMessage(
-            int mojoHandle, ByteBuffer bytes, int numBytes, ByteBuffer handlesBuffer, int flags);
-
-    private native ResultAnd<MessagePipeHandle.ReadMessageResult> nativeReadMessage(
-            int mojoHandle, ByteBuffer bytes, ByteBuffer handlesBuffer, int flags);
-
-    private native ResultAnd<Integer> nativeReadData(
-            int mojoHandle, ByteBuffer elements, int elementsSize, int flags);
-
-    private native ResultAnd<ByteBuffer> nativeBeginReadData(
-            int mojoHandle, int numBytes, int flags);
-
-    private native int nativeEndReadData(int mojoHandle, int numBytesRead);
-
-    private native ResultAnd<Integer> nativeWriteData(
-            int mojoHandle, ByteBuffer elements, int limit, int flags);
-
-    private native ResultAnd<ByteBuffer> nativeBeginWriteData(
-            int mojoHandle, int numBytes, int flags);
-
-    private native int nativeEndWriteData(int mojoHandle, int numBytesWritten);
-
-    private native ResultAnd<Integer> nativeDuplicate(int mojoHandle, ByteBuffer optionsBuffer);
-
-    private native ResultAnd<ByteBuffer> nativeMap(
-            int mojoHandle, long offset, long numBytes, int flags);
-
-    private native int nativeUnmap(ByteBuffer buffer);
-
-    private native int nativeGetNativeBufferOffset(ByteBuffer buffer, int alignment);
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/DataPipeConsumerHandleImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/DataPipeConsumerHandleImpl.java
deleted file mode 100644
index 83097d7..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/DataPipeConsumerHandleImpl.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ReadFlags;
-import org.chromium.mojo.system.ResultAnd;
-
-import java.nio.ByteBuffer;
-
-/**
- * Implementation of {@link ConsumerHandle}.
- */
-class DataPipeConsumerHandleImpl extends HandleBase implements ConsumerHandle {
-
-    /**
-     * @see HandleBase#HandleBase(CoreImpl, int)
-     */
-    DataPipeConsumerHandleImpl(CoreImpl core, int mojoHandle) {
-        super(core, mojoHandle);
-    }
-
-    /**
-     * @see HandleBase#HandleBase(HandleBase)
-     */
-    DataPipeConsumerHandleImpl(HandleBase other) {
-        super(other);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#pass()
-     */
-    @Override
-    public ConsumerHandle pass() {
-        return new DataPipeConsumerHandleImpl(this);
-    }
-
-    /**
-     * @see ConsumerHandle#discardData(int, ReadFlags)
-     */
-    @Override
-    public int discardData(int numBytes, ReadFlags flags) {
-        return mCore.discardData(this, numBytes, flags);
-    }
-
-    /**
-     * @see ConsumerHandle#readData(ByteBuffer, ReadFlags)
-     */
-    @Override
-    public ResultAnd<Integer> readData(ByteBuffer elements, ReadFlags flags) {
-        return mCore.readData(this, elements, flags);
-    }
-
-    /**
-     * @see ConsumerHandle#beginReadData(int, ReadFlags)
-     */
-    @Override
-    public ByteBuffer beginReadData(int numBytes, ReadFlags flags) {
-        return mCore.beginReadData(this, numBytes, flags);
-    }
-
-    /**
-     * @see ConsumerHandle#endReadData(int)
-     */
-    @Override
-    public void endReadData(int numBytesRead) {
-        mCore.endReadData(this, numBytesRead);
-    }
-
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/DataPipeProducerHandleImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/DataPipeProducerHandleImpl.java
deleted file mode 100644
index 901f26c..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/DataPipeProducerHandleImpl.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-import org.chromium.mojo.system.DataPipe.WriteFlags;
-import org.chromium.mojo.system.ResultAnd;
-
-import java.nio.ByteBuffer;
-
-/**
- * Implementation of {@link ProducerHandle}.
- */
-class DataPipeProducerHandleImpl extends HandleBase implements ProducerHandle {
-
-    /**
-     * @see HandleBase#HandleBase(CoreImpl, int)
-     */
-    DataPipeProducerHandleImpl(CoreImpl core, int mojoHandle) {
-        super(core, mojoHandle);
-    }
-
-    /**
-     * @see HandleBase#HandleBase(HandleBase)
-     */
-    DataPipeProducerHandleImpl(HandleBase handle) {
-        super(handle);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.DataPipe.ProducerHandle#pass()
-     */
-    @Override
-    public ProducerHandle pass() {
-        return new DataPipeProducerHandleImpl(this);
-    }
-
-    /**
-     * @see ProducerHandle#writeData(ByteBuffer, WriteFlags)
-     */
-    @Override
-    public ResultAnd<Integer> writeData(ByteBuffer elements, WriteFlags flags) {
-        return mCore.writeData(this, elements, flags);
-    }
-
-    /**
-     * @see ProducerHandle#beginWriteData(int, WriteFlags)
-     */
-    @Override
-    public ByteBuffer beginWriteData(int numBytes, WriteFlags flags) {
-        return mCore.beginWriteData(this, numBytes, flags);
-    }
-
-    /**
-     * @see ProducerHandle#endWriteData(int)
-     */
-    @Override
-    public void endWriteData(int numBytesWritten) {
-        mCore.endWriteData(this, numBytesWritten);
-    }
-
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/HandleBase.java b/mojo/android/system/src/org/chromium/mojo/system/impl/HandleBase.java
deleted file mode 100644
index 4d149a4..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/HandleBase.java
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import android.util.Log;
-
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Core.HandleSignalsState;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.UntypedHandle;
-
-/**
- * Implementation of {@link Handle}.
- */
-abstract class HandleBase implements Handle {
-
-    private static final String TAG = "HandleImpl";
-
-    /**
-     * The pointer to the scoped handle owned by this object.
-     */
-    private int mMojoHandle;
-
-    /**
-     * The core implementation. Will be used to delegate all behavior.
-     */
-    protected CoreImpl mCore;
-
-    /**
-     * Base constructor. Takes ownership of the passed handle.
-     */
-    HandleBase(CoreImpl core, int mojoHandle) {
-        mCore = core;
-        mMojoHandle = mojoHandle;
-    }
-
-    /**
-     * Constructor for transforming {@link HandleBase} into a specific one. It is used to transform
-     * an {@link UntypedHandle} into a typed one, or any handle into an {@link UntypedHandle}.
-     */
-    protected HandleBase(HandleBase other) {
-        mCore = other.mCore;
-        HandleBase otherAsHandleImpl = other;
-        int mojoHandle = otherAsHandleImpl.mMojoHandle;
-        otherAsHandleImpl.mMojoHandle = CoreImpl.INVALID_HANDLE;
-        mMojoHandle = mojoHandle;
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#close()
-     */
-    @Override
-    public void close() {
-        if (mMojoHandle != CoreImpl.INVALID_HANDLE) {
-            // After a close, the handle is invalid whether the close succeed or not.
-            int handle = mMojoHandle;
-            mMojoHandle = CoreImpl.INVALID_HANDLE;
-            mCore.close(handle);
-        }
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#querySignalsState()
-     */
-    @Override
-    public HandleSignalsState querySignalsState() {
-        return mCore.queryHandleSignalsState(mMojoHandle);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#isValid()
-     */
-    @Override
-    public boolean isValid() {
-        return mMojoHandle != CoreImpl.INVALID_HANDLE;
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#toUntypedHandle()
-     */
-    @Override
-    public UntypedHandle toUntypedHandle() {
-        return new UntypedHandleImpl(this);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#getCore()
-     */
-    @Override
-    public Core getCore() {
-        return mCore;
-    }
-
-    /**
-     * @see Handle#releaseNativeHandle()
-     */
-    @Override
-    public int releaseNativeHandle() {
-        int result = mMojoHandle;
-        mMojoHandle = CoreImpl.INVALID_HANDLE;
-        return result;
-    }
-
-    /**
-     * Getter for the native scoped handle.
-     *
-     * @return the native scoped handle.
-     */
-    int getMojoHandle() {
-        return mMojoHandle;
-    }
-
-    /**
-     * invalidate the handle. The caller must ensures that the handle does not leak.
-     */
-    void invalidateHandle() {
-        mMojoHandle = CoreImpl.INVALID_HANDLE;
-    }
-
-    /**
-     * Close the handle if it is valid. Necessary because we cannot let handle leak, and we cannot
-     * ensure that every handle will be manually closed.
-     *
-     * @see java.lang.Object#finalize()
-     */
-    @Override
-    protected final void finalize() throws Throwable {
-        if (isValid()) {
-            // This should not happen, as the user of this class should close the handle. Adding a
-            // warning.
-            Log.w(TAG, "Handle was not closed.");
-            // Ignore result at this point.
-            mCore.closeWithResult(mMojoHandle);
-        }
-        super.finalize();
-    }
-
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/MessagePipeHandleImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/MessagePipeHandleImpl.java
deleted file mode 100644
index b3df0ae..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/MessagePipeHandleImpl.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.ResultAnd;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-
-/**
- * Implementation of {@link MessagePipeHandle}.
- */
-class MessagePipeHandleImpl extends HandleBase implements MessagePipeHandle {
-
-    /**
-     * @see HandleBase#HandleBase(CoreImpl, int)
-     */
-    MessagePipeHandleImpl(CoreImpl core, int mojoHandle) {
-        super(core, mojoHandle);
-    }
-
-    /**
-     * @see HandleBase#HandleBase(HandleBase)
-     */
-    MessagePipeHandleImpl(HandleBase handle) {
-        super(handle);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.MessagePipeHandle#pass()
-     */
-    @Override
-    public MessagePipeHandle pass() {
-        return new MessagePipeHandleImpl(this);
-    }
-
-    /**
-     * @see MessagePipeHandle#writeMessage(ByteBuffer, List, WriteFlags)
-     */
-    @Override
-    public void writeMessage(ByteBuffer bytes, List<? extends Handle> handles, WriteFlags flags) {
-        mCore.writeMessage(this, bytes, handles, flags);
-    }
-
-    /**
-     * @see MessagePipeHandle#readMessage(ByteBuffer, int, ReadFlags)
-     */
-    @Override
-    public ResultAnd<ReadMessageResult> readMessage(
-            ByteBuffer bytes, int maxNumberOfHandles, ReadFlags flags) {
-        return mCore.readMessage(this, bytes, maxNumberOfHandles, flags);
-    }
-
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/SharedBufferHandleImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/SharedBufferHandleImpl.java
deleted file mode 100644
index 76ef739..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/SharedBufferHandleImpl.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.mojo.system.SharedBufferHandle;
-
-import java.nio.ByteBuffer;
-
-/**
- * Implementation of {@link SharedBufferHandle}.
- */
-class SharedBufferHandleImpl extends HandleBase implements SharedBufferHandle {
-
-    /**
-     * @see HandleBase#HandleBase(CoreImpl, int)
-     */
-    SharedBufferHandleImpl(CoreImpl core, int mojoHandle) {
-        super(core, mojoHandle);
-    }
-
-    /**
-     * @see HandleBase#HandleBase(HandleBase)
-     */
-    SharedBufferHandleImpl(HandleBase handle) {
-        super(handle);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.SharedBufferHandle#pass()
-     */
-    @Override
-    public SharedBufferHandle pass() {
-        return new SharedBufferHandleImpl(this);
-    }
-
-    /**
-     * @see SharedBufferHandle#duplicate(DuplicateOptions)
-     */
-    @Override
-    public SharedBufferHandle duplicate(DuplicateOptions options) {
-        return mCore.duplicate(this, options);
-    }
-
-    /**
-     * @see SharedBufferHandle#map(long, long, MapFlags)
-     */
-    @Override
-    public ByteBuffer map(long offset, long numBytes, MapFlags flags) {
-        return mCore.map(this, offset, numBytes, flags);
-    }
-
-    /**
-     * @see SharedBufferHandle#unmap(ByteBuffer)
-     */
-    @Override
-    public void unmap(ByteBuffer buffer) {
-        mCore.unmap(buffer);
-    }
-
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/UntypedHandleImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/UntypedHandleImpl.java
deleted file mode 100644
index 4774ab8..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/UntypedHandleImpl.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.SharedBufferHandle;
-import org.chromium.mojo.system.UntypedHandle;
-
-/**
- * Implementation of {@link UntypedHandle}.
- */
-class UntypedHandleImpl extends HandleBase implements UntypedHandle {
-
-    /**
-     * @see HandleBase#HandleBase(CoreImpl, int)
-     */
-    UntypedHandleImpl(CoreImpl core, int mojoHandle) {
-        super(core, mojoHandle);
-    }
-
-    /**
-     * @see HandleBase#HandleBase(HandleBase)
-     */
-    UntypedHandleImpl(HandleBase handle) {
-        super(handle);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.UntypedHandle#pass()
-     */
-    @Override
-    public UntypedHandle pass() {
-        return new UntypedHandleImpl(this);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.UntypedHandle#toMessagePipeHandle()
-     */
-    @Override
-    public MessagePipeHandle toMessagePipeHandle() {
-        return new MessagePipeHandleImpl(this);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.UntypedHandle#toDataPipeConsumerHandle()
-     */
-    @Override
-    public ConsumerHandle toDataPipeConsumerHandle() {
-        return new DataPipeConsumerHandleImpl(this);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.UntypedHandle#toDataPipeProducerHandle()
-     */
-    @Override
-    public ProducerHandle toDataPipeProducerHandle() {
-        return new DataPipeProducerHandleImpl(this);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.UntypedHandle#toSharedBufferHandle()
-     */
-    @Override
-    public SharedBufferHandle toSharedBufferHandle() {
-        return new SharedBufferHandleImpl(this);
-    }
-
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/WatcherImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/WatcherImpl.java
deleted file mode 100644
index 094ad90..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/WatcherImpl.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Watcher;
-
-@JNINamespace("mojo::android")
-class WatcherImpl implements Watcher {
-    private long mImplPtr = nativeCreateWatcher();
-    private Callback mCallback;
-
-    @Override
-    public int start(Handle handle, Core.HandleSignals signals, Callback callback) {
-        if (mImplPtr == 0) {
-            return MojoResult.INVALID_ARGUMENT;
-        }
-        if (!(handle instanceof HandleBase)) {
-            return MojoResult.INVALID_ARGUMENT;
-        }
-        int result =
-                nativeStart(mImplPtr, ((HandleBase) handle).getMojoHandle(), signals.getFlags());
-        if (result == MojoResult.OK) mCallback = callback;
-        return result;
-    }
-
-    @Override
-    public void cancel() {
-        if (mImplPtr == 0) {
-            return;
-        }
-        mCallback = null;
-        nativeCancel(mImplPtr);
-    }
-
-    @Override
-    public void destroy() {
-        if (mImplPtr == 0) {
-            return;
-        }
-        nativeDelete(mImplPtr);
-        mImplPtr = 0;
-    }
-
-    @CalledByNative
-    private void onHandleReady(int result) {
-        mCallback.onResult(result);
-    }
-
-    private native long nativeCreateWatcher();
-
-    private native int nativeStart(long implPtr, int mojoHandle, int flags);
-
-    private native void nativeCancel(long implPtr);
-
-    private native void nativeDelete(long implPtr);
-}
diff --git a/mojo/android/system/watcher_impl.cc b/mojo/android/system/watcher_impl.cc
deleted file mode 100644
index 3344447..0000000
--- a/mojo/android/system/watcher_impl.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/android/system/watcher_impl.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-// Removed unused headers. TODO(hidehiko): Upstream.
-// #include "base/android/base_jni_registrar.h"
-#include "base/android/jni_android.h"
-// #include "base/android/jni_registrar.h"
-// #include "base/android/library_loader/library_loader_hooks.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/bind.h"
-#include "jni/WatcherImpl_jni.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-
-namespace mojo {
-namespace android {
-
-using base::android::JavaParamRef;
-
-namespace {
-
-class WatcherImpl {
- public:
-  WatcherImpl() : watcher_(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC) {}
-
-  ~WatcherImpl() = default;
-
-  jint Start(JNIEnv* env,
-             const JavaParamRef<jobject>& jcaller,
-             jint mojo_handle,
-             jint signals) {
-    java_watcher_.Reset(env, jcaller);
-
-    auto ready_callback =
-        base::Bind(&WatcherImpl::OnHandleReady, base::Unretained(this));
-
-    MojoResult result =
-        watcher_.Watch(mojo::Handle(static_cast<MojoHandle>(mojo_handle)),
-                       static_cast<MojoHandleSignals>(signals), ready_callback);
-    if (result != MOJO_RESULT_OK)
-      java_watcher_.Reset();
-
-    return result;
-  }
-
-  void Cancel() {
-    java_watcher_.Reset();
-    watcher_.Cancel();
-  }
-
- private:
-  void OnHandleReady(MojoResult result) {
-    DCHECK(!java_watcher_.is_null());
-
-    base::android::ScopedJavaGlobalRef<jobject> java_watcher_preserver;
-    if (result == MOJO_RESULT_CANCELLED)
-      java_watcher_preserver = std::move(java_watcher_);
-
-    Java_WatcherImpl_onHandleReady(
-        base::android::AttachCurrentThread(),
-        java_watcher_.is_null() ? java_watcher_preserver : java_watcher_,
-        result);
-  }
-
-  SimpleWatcher watcher_;
-  base::android::ScopedJavaGlobalRef<jobject> java_watcher_;
-
-  DISALLOW_COPY_AND_ASSIGN(WatcherImpl);
-};
-
-}  // namespace
-
-static jlong CreateWatcher(JNIEnv* env, const JavaParamRef<jobject>& jcaller) {
-  return reinterpret_cast<jlong>(new WatcherImpl);
-}
-
-static jint Start(JNIEnv* env,
-                  const JavaParamRef<jobject>& jcaller,
-                  jlong watcher_ptr,
-                  jint mojo_handle,
-                  jint signals) {
-  auto* watcher = reinterpret_cast<WatcherImpl*>(watcher_ptr);
-  return watcher->Start(env, jcaller, mojo_handle, signals);
-}
-
-static void Cancel(JNIEnv* env,
-                   const JavaParamRef<jobject>& jcaller,
-                   jlong watcher_ptr) {
-  reinterpret_cast<WatcherImpl*>(watcher_ptr)->Cancel();
-}
-
-static void Delete(JNIEnv* env,
-                   const JavaParamRef<jobject>& jcaller,
-                   jlong watcher_ptr) {
-  delete reinterpret_cast<WatcherImpl*>(watcher_ptr);
-}
-
-bool RegisterWatcherImpl(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-}  // namespace android
-}  // namespace mojo
diff --git a/mojo/android/system/watcher_impl.h b/mojo/android/system/watcher_impl.h
deleted file mode 100644
index 784f007..0000000
--- a/mojo/android/system/watcher_impl.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_ANDROID_SYSTEM_WATCHER_IMPL_H_
-#define MOJO_ANDROID_SYSTEM_WATCHER_IMPL_H_
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-
-namespace mojo {
-namespace android {
-
-JNI_EXPORT bool RegisterWatcherImpl(JNIEnv* env);
-
-}  // namespace android
-}  // namespace mojo
-
-#endif  // MOJO_ANDROID_SYSTEM_WATCHER_IMPL_H_
diff --git a/mojo/common/BUILD.gn b/mojo/common/BUILD.gn
deleted file mode 100644
index 9e74e58..0000000
--- a/mojo/common/BUILD.gn
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-import("//testing/test.gni")
-
-group("common") {
-  public_deps = [
-    ":common_base",
-    ":common_custom_types",
-  ]
-}
-
-mojom("common_custom_types") {
-  sources = [
-    "file.mojom",
-    "file_path.mojom",
-    "string16.mojom",
-    "text_direction.mojom",
-    "time.mojom",
-    "unguessable_token.mojom",
-    "values.mojom",
-    "version.mojom",
-  ]
-}
-
-component("common_base") {
-  output_name = "mojo_common_lib"
-
-  sources = [
-    "data_pipe_drainer.cc",
-    "data_pipe_drainer.h",
-    "data_pipe_utils.cc",
-    "data_pipe_utils.h",
-  ]
-
-  defines = [ "MOJO_COMMON_IMPLEMENTATION" ]
-
-  public_deps = [
-    "//base",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/system",
-  ]
-}
-
-mojom("test_common_custom_types") {
-  sources = [
-    "test_common_custom_types.mojom",
-    "traits_test_service.mojom",
-  ]
-  public_deps = [
-    ":common_custom_types",
-  ]
-}
-
-test("mojo_common_unittests") {
-  deps = [
-    ":common",
-    ":common_custom_types",
-    ":struct_traits",
-    ":test_common_custom_types",
-    "//base",
-    "//base:message_loop_tests",
-    "//base/test:test_support",
-    "//mojo/edk/test:run_all_unittests",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/test_support:test_utils",
-    "//testing/gtest",
-    "//url",
-  ]
-
-  sources = [
-    "common_custom_types_unittest.cc",
-    "struct_traits_unittest.cc",
-  ]
-}
-
-source_set("struct_traits") {
-  sources = [
-    "common_custom_types_struct_traits.cc",
-    "common_custom_types_struct_traits.h",
-  ]
-  deps = [
-    ":common_custom_types_shared_cpp_sources",
-    "//base:base",
-    "//mojo/public/cpp/system",
-  ]
-  public_deps = [
-    "//base:i18n",
-  ]
-}
diff --git a/mojo/common/DEPS b/mojo/common/DEPS
deleted file mode 100644
index e8ac428..0000000
--- a/mojo/common/DEPS
+++ /dev/null
@@ -1,6 +0,0 @@
-include_rules = [
-  # common must not depend on embedder.
-  "-mojo",
-  "+mojo/common",
-  "+mojo/public",
-]
diff --git a/mojo/common/common_custom_types_struct_traits.cc b/mojo/common/common_custom_types_struct_traits.cc
deleted file mode 100644
index 6289504..0000000
--- a/mojo/common/common_custom_types_struct_traits.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/common/common_custom_types_struct_traits.h"
-
-#include "mojo/public/cpp/system/platform_handle.h"
-
-namespace mojo {
-
-// static
-bool StructTraits<common::mojom::String16DataView, base::string16>::Read(
-    common::mojom::String16DataView data,
-    base::string16* out) {
-  ArrayDataView<uint16_t> view;
-  data.GetDataDataView(&view);
-  out->assign(reinterpret_cast<const base::char16*>(view.data()), view.size());
-  return true;
-}
-
-// static
-const std::vector<uint32_t>&
-StructTraits<common::mojom::VersionDataView, base::Version>::components(
-    const base::Version& version) {
-  return version.components();
-}
-
-// static
-bool StructTraits<common::mojom::VersionDataView, base::Version>::Read(
-    common::mojom::VersionDataView data,
-    base::Version* out) {
-  std::vector<uint32_t> components;
-  if (!data.ReadComponents(&components))
-    return false;
-
-  *out = base::Version(base::Version(std::move(components)));
-  return out->IsValid();
-}
-
-// static
-bool StructTraits<
-    common::mojom::UnguessableTokenDataView,
-    base::UnguessableToken>::Read(common::mojom::UnguessableTokenDataView data,
-                                  base::UnguessableToken* out) {
-  uint64_t high = data.high();
-  uint64_t low = data.low();
-
-  // Receiving a zeroed UnguessableToken is a security issue.
-  if (high == 0 && low == 0)
-    return false;
-
-  *out = base::UnguessableToken::Deserialize(high, low);
-  return true;
-}
-
-mojo::ScopedHandle StructTraits<common::mojom::FileDataView, base::File>::fd(
-    base::File& file) {
-  DCHECK(file.IsValid());
-  return mojo::WrapPlatformFile(file.TakePlatformFile());
-}
-
-bool StructTraits<common::mojom::FileDataView, base::File>::Read(
-    common::mojom::FileDataView data,
-    base::File* file) {
-  base::PlatformFile platform_handle = base::kInvalidPlatformFile;
-  if (mojo::UnwrapPlatformFile(data.TakeFd(), &platform_handle) !=
-      MOJO_RESULT_OK) {
-    return false;
-  }
-  *file = base::File(platform_handle);
-  return true;
-}
-
-// static
-common::mojom::TextDirection
-EnumTraits<common::mojom::TextDirection, base::i18n::TextDirection>::ToMojom(
-    base::i18n::TextDirection text_direction) {
-  switch (text_direction) {
-    case base::i18n::UNKNOWN_DIRECTION:
-      return common::mojom::TextDirection::UNKNOWN_DIRECTION;
-    case base::i18n::RIGHT_TO_LEFT:
-      return common::mojom::TextDirection::RIGHT_TO_LEFT;
-    case base::i18n::LEFT_TO_RIGHT:
-      return common::mojom::TextDirection::LEFT_TO_RIGHT;
-  }
-  NOTREACHED();
-  return common::mojom::TextDirection::UNKNOWN_DIRECTION;
-}
-
-// static
-bool EnumTraits<common::mojom::TextDirection, base::i18n::TextDirection>::
-    FromMojom(common::mojom::TextDirection input,
-              base::i18n::TextDirection* out) {
-  switch (input) {
-    case common::mojom::TextDirection::UNKNOWN_DIRECTION:
-      *out = base::i18n::UNKNOWN_DIRECTION;
-      return true;
-    case common::mojom::TextDirection::RIGHT_TO_LEFT:
-      *out = base::i18n::RIGHT_TO_LEFT;
-      return true;
-    case common::mojom::TextDirection::LEFT_TO_RIGHT:
-      *out = base::i18n::LEFT_TO_RIGHT;
-      return true;
-  }
-  return false;
-}
-
-}  // namespace mojo
diff --git a/mojo/common/common_custom_types_struct_traits.h b/mojo/common/common_custom_types_struct_traits.h
deleted file mode 100644
index 85815ff..0000000
--- a/mojo/common/common_custom_types_struct_traits.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_COMMON_COMMON_CUSTOM_TYPES_STRUCT_TRAITS_H_
-#define MOJO_COMMON_COMMON_CUSTOM_TYPES_STRUCT_TRAITS_H_
-
-#include "base/files/file.h"
-#include "base/i18n/rtl.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/unguessable_token.h"
-#include "base/version.h"
-#include "mojo/common/file.mojom-shared.h"
-#include "mojo/common/mojo_common_export.h"
-#include "mojo/common/string16.mojom-shared.h"
-#include "mojo/common/text_direction.mojom-shared.h"
-#include "mojo/common/time.mojom-shared.h"
-#include "mojo/common/unguessable_token.mojom-shared.h"
-#include "mojo/common/version.mojom-shared.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<common::mojom::String16DataView, base::string16> {
-  static ConstCArray<uint16_t> data(const base::string16& str) {
-    return ConstCArray<uint16_t>(str.size(),
-                                 reinterpret_cast<const uint16_t*>(str.data()));
-  }
-
-  static bool Read(common::mojom::String16DataView data, base::string16* out);
-};
-
-template <>
-struct StructTraits<common::mojom::VersionDataView, base::Version> {
-  static bool IsNull(const base::Version& version) {
-    return !version.IsValid();
-  }
-  static void SetToNull(base::Version* out) {
-    *out = base::Version(std::string());
-  }
-  static const std::vector<uint32_t>& components(const base::Version& version);
-  static bool Read(common::mojom::VersionDataView data, base::Version* out);
-};
-
-// If base::UnguessableToken is no longer 128 bits, the logic below and the
-// mojom::UnguessableToken type should be updated.
-static_assert(sizeof(base::UnguessableToken) == 2 * sizeof(uint64_t),
-              "base::UnguessableToken should be of size 2 * sizeof(uint64_t).");
-
-template <>
-struct StructTraits<common::mojom::UnguessableTokenDataView,
-                    base::UnguessableToken> {
-  static uint64_t high(const base::UnguessableToken& token) {
-    return token.GetHighForSerialization();
-  }
-
-  static uint64_t low(const base::UnguessableToken& token) {
-    return token.GetLowForSerialization();
-  }
-
-  static bool Read(common::mojom::UnguessableTokenDataView data,
-                   base::UnguessableToken* out);
-};
-
-template <>
-struct StructTraits<common::mojom::FileDataView, base::File> {
-  static bool IsNull(const base::File& file) { return !file.IsValid(); }
-
-  static void SetToNull(base::File* file) { *file = base::File(); }
-
-  static mojo::ScopedHandle fd(base::File& file);
-  static bool Read(common::mojom::FileDataView data, base::File* file);
-};
-
-template <>
-struct EnumTraits<common::mojom::TextDirection, base::i18n::TextDirection> {
-  static common::mojom::TextDirection ToMojom(
-      base::i18n::TextDirection text_direction);
-  static bool FromMojom(common::mojom::TextDirection input,
-                        base::i18n::TextDirection* out);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_COMMON_COMMON_CUSTOM_TYPES_STRUCT_TRAITS_H_
diff --git a/mojo/common/common_custom_types_unittest.cc b/mojo/common/common_custom_types_unittest.cc
deleted file mode 100644
index e3571d9..0000000
--- a/mojo/common/common_custom_types_unittest.cc
+++ /dev/null
@@ -1,433 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/file_path.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/numerics/safe_math.h"
-#include "base/run_loop.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/values.h"
-#include "mojo/common/test_common_custom_types.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace common {
-namespace test {
-namespace {
-
-template <typename T>
-struct BounceTestTraits {
-  static void ExpectEquality(const T& a, const T& b) {
-    EXPECT_EQ(a, b);
-  }
-};
-
-template <typename T>
-struct PassTraits {
-  using Type = const T&;
-};
-
-template <>
-struct PassTraits<base::Time> {
-  using Type = base::Time;
-};
-
-template <>
-struct PassTraits<base::TimeDelta> {
-  using Type = base::TimeDelta;
-};
-
-template <>
-struct PassTraits<base::TimeTicks> {
-  using Type = base::TimeTicks;
-};
-
-template <typename T>
-void DoExpectResponse(T* expected_value,
-                      const base::Closure& closure,
-                      typename PassTraits<T>::Type value) {
-  BounceTestTraits<T>::ExpectEquality(*expected_value, value);
-  closure.Run();
-}
-
-template <typename T>
-base::Callback<void(typename PassTraits<T>::Type)> ExpectResponse(
-    T* expected_value,
-    const base::Closure& closure) {
-  return base::Bind(&DoExpectResponse<T>, expected_value, closure);
-}
-
-class TestFilePathImpl : public TestFilePath {
- public:
-  explicit TestFilePathImpl(TestFilePathRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestFilePath implementation:
-  void BounceFilePath(const base::FilePath& in,
-                      const BounceFilePathCallback& callback) override {
-    callback.Run(in);
-  }
-
- private:
-  mojo::Binding<TestFilePath> binding_;
-};
-
-class TestUnguessableTokenImpl : public TestUnguessableToken {
- public:
-  explicit TestUnguessableTokenImpl(TestUnguessableTokenRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestUnguessableToken implementation:
-  void BounceNonce(const base::UnguessableToken& in,
-                   const BounceNonceCallback& callback) override {
-    callback.Run(in);
-  }
-
- private:
-  mojo::Binding<TestUnguessableToken> binding_;
-};
-
-class TestTimeImpl : public TestTime {
- public:
-  explicit TestTimeImpl(TestTimeRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestTime implementation:
-  void BounceTime(base::Time in, const BounceTimeCallback& callback) override {
-    callback.Run(in);
-  }
-
-  void BounceTimeDelta(base::TimeDelta in,
-                       const BounceTimeDeltaCallback& callback) override {
-    callback.Run(in);
-  }
-
-  void BounceTimeTicks(base::TimeTicks in,
-                       const BounceTimeTicksCallback& callback) override {
-    callback.Run(in);
-  }
-
- private:
-  mojo::Binding<TestTime> binding_;
-};
-
-class TestValueImpl : public TestValue {
- public:
-  explicit TestValueImpl(TestValueRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestValue implementation:
-  void BounceDictionaryValue(
-      std::unique_ptr<base::DictionaryValue> in,
-      const BounceDictionaryValueCallback& callback) override {
-    callback.Run(std::move(in));
-  }
-
-  void BounceListValue(std::unique_ptr<base::ListValue> in,
-                       const BounceListValueCallback& callback) override {
-    callback.Run(std::move(in));
-  }
-
-  void BounceValue(std::unique_ptr<base::Value> in,
-                   const BounceValueCallback& callback) override {
-    callback.Run(std::move(in));
-  }
-
- private:
-  mojo::Binding<TestValue> binding_;
-};
-
-class TestString16Impl : public TestString16 {
- public:
-  explicit TestString16Impl(TestString16Request request)
-      : binding_(this, std::move(request)) {}
-
-  // TestString16 implementation:
-  void BounceString16(const base::string16& in,
-                      const BounceString16Callback& callback) override {
-    callback.Run(in);
-  }
-
- private:
-  mojo::Binding<TestString16> binding_;
-};
-
-class TestFileImpl : public TestFile {
- public:
-  explicit TestFileImpl(TestFileRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestFile implementation:
-  void BounceFile(base::File in, const BounceFileCallback& callback) override {
-    callback.Run(std::move(in));
-  }
-
- private:
-  mojo::Binding<TestFile> binding_;
-};
-
-class TestTextDirectionImpl : public TestTextDirection {
- public:
-  explicit TestTextDirectionImpl(TestTextDirectionRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestTextDirection:
-  void BounceTextDirection(
-      base::i18n::TextDirection in,
-      const BounceTextDirectionCallback& callback) override {
-    callback.Run(in);
-  }
-
- private:
-  mojo::Binding<TestTextDirection> binding_;
-};
-
-class CommonCustomTypesTest : public testing::Test {
- protected:
-  CommonCustomTypesTest() {}
-  ~CommonCustomTypesTest() override {}
-
- private:
-  base::MessageLoop message_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(CommonCustomTypesTest);
-};
-
-}  // namespace
-
-TEST_F(CommonCustomTypesTest, FilePath) {
-  base::RunLoop run_loop;
-
-  TestFilePathPtr ptr;
-  TestFilePathImpl impl(MakeRequest(&ptr));
-
-  base::FilePath dir(FILE_PATH_LITERAL("hello"));
-  base::FilePath file = dir.Append(FILE_PATH_LITERAL("world"));
-
-  ptr->BounceFilePath(file, ExpectResponse(&file, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, UnguessableToken) {
-  base::RunLoop run_loop;
-
-  TestUnguessableTokenPtr ptr;
-  TestUnguessableTokenImpl impl(MakeRequest(&ptr));
-
-  base::UnguessableToken token = base::UnguessableToken::Create();
-
-  ptr->BounceNonce(token, ExpectResponse(&token, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, Time) {
-  base::RunLoop run_loop;
-
-  TestTimePtr ptr;
-  TestTimeImpl impl(MakeRequest(&ptr));
-
-  base::Time t = base::Time::Now();
-
-  ptr->BounceTime(t, ExpectResponse(&t, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, TimeDelta) {
-  base::RunLoop run_loop;
-
-  TestTimePtr ptr;
-  TestTimeImpl impl(MakeRequest(&ptr));
-
-  base::TimeDelta t = base::TimeDelta::FromDays(123);
-
-  ptr->BounceTimeDelta(t, ExpectResponse(&t, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, TimeTicks) {
-  base::RunLoop run_loop;
-
-  TestTimePtr ptr;
-  TestTimeImpl impl(MakeRequest(&ptr));
-
-  base::TimeTicks t = base::TimeTicks::Now();
-
-  ptr->BounceTimeTicks(t, ExpectResponse(&t, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, Value) {
-  TestValuePtr ptr;
-  TestValueImpl impl(MakeRequest(&ptr));
-
-  std::unique_ptr<base::Value> output;
-
-  ASSERT_TRUE(ptr->BounceValue(nullptr, &output));
-  EXPECT_FALSE(output);
-
-  std::unique_ptr<base::Value> input = base::Value::CreateNullValue();
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  input = base::MakeUnique<base::Value>(123);
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  input = base::MakeUnique<base::Value>(1.23);
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  input = base::MakeUnique<base::Value>(false);
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  input = base::MakeUnique<base::Value>("test string");
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  input = base::BinaryValue::CreateWithCopiedBuffer("mojo", 4);
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  auto dict = base::MakeUnique<base::DictionaryValue>();
-  dict->SetBoolean("bool", false);
-  dict->SetInteger("int", 2);
-  dict->SetString("string", "some string");
-  dict->SetBoolean("nested.bool", true);
-  dict->SetInteger("nested.int", 9);
-  dict->Set("some_binary",
-            base::BinaryValue::CreateWithCopiedBuffer("mojo", 4));
-  dict->Set("null_value", base::Value::CreateNullValue());
-  dict->SetIntegerWithoutPathExpansion("non_nested.int", 10);
-  {
-    std::unique_ptr<base::ListValue> dict_list(new base::ListValue());
-    dict_list->AppendString("string");
-    dict_list->AppendBoolean(true);
-    dict->Set("list", std::move(dict_list));
-  }
-
-  std::unique_ptr<base::DictionaryValue> dict_output;
-  ASSERT_TRUE(ptr->BounceDictionaryValue(dict->CreateDeepCopy(), &dict_output));
-  EXPECT_TRUE(base::Value::Equals(dict.get(), dict_output.get()));
-
-  input = std::move(dict);
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  auto list = base::MakeUnique<base::ListValue>();
-  list->AppendString("string");
-  list->AppendDouble(42.1);
-  list->AppendBoolean(true);
-  list->Append(base::BinaryValue::CreateWithCopiedBuffer("mojo", 4));
-  list->Append(base::Value::CreateNullValue());
-  {
-    std::unique_ptr<base::DictionaryValue> list_dict(
-        new base::DictionaryValue());
-    list_dict->SetString("string", "str");
-    list->Append(std::move(list_dict));
-  }
-  std::unique_ptr<base::ListValue> list_output;
-  ASSERT_TRUE(ptr->BounceListValue(list->CreateDeepCopy(), &list_output));
-  EXPECT_TRUE(base::Value::Equals(list.get(), list_output.get()));
-
-  input = std::move(list);
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  ASSERT_TRUE(base::Value::Equals(input.get(), output.get()));
-}
-
-TEST_F(CommonCustomTypesTest, String16) {
-  base::RunLoop run_loop;
-
-  TestString16Ptr ptr;
-  TestString16Impl impl(MakeRequest(&ptr));
-
-  base::string16 str16 = base::ASCIIToUTF16("hello world");
-
-  ptr->BounceString16(str16, ExpectResponse(&str16, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, EmptyString16) {
-  base::RunLoop run_loop;
-
-  TestString16Ptr ptr;
-  TestString16Impl impl(MakeRequest(&ptr));
-
-  base::string16 str16;
-
-  ptr->BounceString16(str16, ExpectResponse(&str16, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, File) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  TestFilePtr ptr;
-  TestFileImpl impl(MakeRequest(&ptr));
-
-  base::File file(
-      temp_dir.GetPath().AppendASCII("test_file.txt"),
-      base::File::FLAG_CREATE | base::File::FLAG_WRITE | base::File::FLAG_READ);
-  const base::StringPiece test_content =
-      "A test string to be stored in a test file";
-  file.WriteAtCurrentPos(
-      test_content.data(),
-      base::CheckedNumeric<int>(test_content.size()).ValueOrDie());
-
-  base::File file_out;
-  ASSERT_TRUE(ptr->BounceFile(std::move(file), &file_out));
-  std::vector<char> content(test_content.size());
-  ASSERT_TRUE(file_out.IsValid());
-  ASSERT_EQ(static_cast<int>(test_content.size()),
-            file_out.Read(
-                0, content.data(),
-                base::CheckedNumeric<int>(test_content.size()).ValueOrDie()));
-  EXPECT_EQ(test_content,
-            base::StringPiece(content.data(), test_content.size()));
-}
-
-TEST_F(CommonCustomTypesTest, InvalidFile) {
-  TestFilePtr ptr;
-  TestFileImpl impl(MakeRequest(&ptr));
-
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  // Test that |file_out| is set to an invalid file.
-  base::File file_out(
-      temp_dir.GetPath().AppendASCII("test_file.txt"),
-      base::File::FLAG_CREATE | base::File::FLAG_WRITE | base::File::FLAG_READ);
-
-  ASSERT_TRUE(ptr->BounceFile(base::File(), &file_out));
-  EXPECT_FALSE(file_out.IsValid());
-}
-
-TEST_F(CommonCustomTypesTest, TextDirection) {
-  base::i18n::TextDirection kTestDirections[] = {base::i18n::LEFT_TO_RIGHT,
-                                                 base::i18n::RIGHT_TO_LEFT,
-                                                 base::i18n::UNKNOWN_DIRECTION};
-
-  TestTextDirectionPtr ptr;
-  TestTextDirectionImpl impl(MakeRequest(&ptr));
-
-  for (size_t i = 0; i < arraysize(kTestDirections); i++) {
-    base::i18n::TextDirection direction_out;
-    ASSERT_TRUE(ptr->BounceTextDirection(kTestDirections[i], &direction_out));
-    EXPECT_EQ(kTestDirections[i], direction_out);
-  }
-}
-
-}  // namespace test
-}  // namespace common
-}  // namespace mojo
diff --git a/mojo/common/data_pipe_drainer.cc b/mojo/common/data_pipe_drainer.cc
deleted file mode 100644
index e705c8d..0000000
--- a/mojo/common/data_pipe_drainer.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/common/data_pipe_drainer.h"
-
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/bind.h"
-
-namespace mojo {
-namespace common {
-
-DataPipeDrainer::DataPipeDrainer(Client* client,
-                                 mojo::ScopedDataPipeConsumerHandle source)
-    : client_(client),
-      source_(std::move(source)),
-      handle_watcher_(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC),
-      weak_factory_(this) {
-  DCHECK(client_);
-  handle_watcher_.Watch(
-      source_.get(), MOJO_HANDLE_SIGNAL_READABLE,
-      base::Bind(&DataPipeDrainer::WaitComplete, weak_factory_.GetWeakPtr()));
-}
-
-DataPipeDrainer::~DataPipeDrainer() {}
-
-void DataPipeDrainer::ReadData() {
-  const void* buffer = nullptr;
-  uint32_t num_bytes = 0;
-  MojoResult rv = BeginReadDataRaw(source_.get(), &buffer, &num_bytes,
-                                   MOJO_READ_DATA_FLAG_NONE);
-  if (rv == MOJO_RESULT_OK) {
-    client_->OnDataAvailable(buffer, num_bytes);
-    EndReadDataRaw(source_.get(), num_bytes);
-  } else if (rv == MOJO_RESULT_FAILED_PRECONDITION) {
-    client_->OnDataComplete();
-  } else if (rv != MOJO_RESULT_SHOULD_WAIT) {
-    DCHECK(false) << "Unhandled MojoResult: " << rv;
-  }
-}
-
-void DataPipeDrainer::WaitComplete(MojoResult result) {
-  ReadData();
-}
-
-}  // namespace common
-}  // namespace mojo
diff --git a/mojo/common/data_pipe_drainer.h b/mojo/common/data_pipe_drainer.h
deleted file mode 100644
index 5cff820..0000000
--- a/mojo/common/data_pipe_drainer.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_COMMON_DATA_PIPE_DRAINER_H_
-#define MOJO_COMMON_DATA_PIPE_DRAINER_H_
-
-#include <stddef.h>
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "mojo/common/mojo_common_export.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-
-namespace mojo {
-namespace common {
-
-class MOJO_COMMON_EXPORT DataPipeDrainer {
- public:
-  class Client {
-   public:
-    virtual void OnDataAvailable(const void* data, size_t num_bytes) = 0;
-    virtual void OnDataComplete() = 0;
-
-   protected:
-    virtual ~Client() {}
-  };
-
-  DataPipeDrainer(Client*, mojo::ScopedDataPipeConsumerHandle source);
-  ~DataPipeDrainer();
-
- private:
-  void ReadData();
-  void WaitComplete(MojoResult result);
-
-  Client* client_;
-  mojo::ScopedDataPipeConsumerHandle source_;
-  mojo::SimpleWatcher handle_watcher_;
-
-  base::WeakPtrFactory<DataPipeDrainer> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(DataPipeDrainer);
-};
-
-}  // namespace common
-}  // namespace mojo
-
-#endif  // MOJO_COMMON_DATA_PIPE_DRAINER_H_
diff --git a/mojo/common/data_pipe_utils.cc b/mojo/common/data_pipe_utils.cc
deleted file mode 100644
index 9b069b8..0000000
--- a/mojo/common/data_pipe_utils.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/common/data_pipe_utils.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "mojo/public/cpp/system/wait.h"
-
-namespace mojo {
-namespace common {
-namespace {
-
-bool BlockingCopyHelper(ScopedDataPipeConsumerHandle source,
-    const base::Callback<size_t(const void*, uint32_t)>& write_bytes) {
-  for (;;) {
-    const void* buffer;
-    uint32_t num_bytes;
-    MojoResult result = BeginReadDataRaw(
-        source.get(), &buffer, &num_bytes, MOJO_READ_DATA_FLAG_NONE);
-    if (result == MOJO_RESULT_OK) {
-      size_t bytes_written = write_bytes.Run(buffer, num_bytes);
-      result = EndReadDataRaw(source.get(), num_bytes);
-      if (bytes_written < num_bytes || result != MOJO_RESULT_OK)
-        return false;
-    } else if (result == MOJO_RESULT_SHOULD_WAIT) {
-      result = Wait(source.get(), MOJO_HANDLE_SIGNAL_READABLE);
-      if (result != MOJO_RESULT_OK) {
-        // If the producer handle was closed, then treat as EOF.
-        return result == MOJO_RESULT_FAILED_PRECONDITION;
-      }
-    } else if (result == MOJO_RESULT_FAILED_PRECONDITION) {
-      // If the producer handle was closed, then treat as EOF.
-      return true;
-    } else {
-      // Some other error occurred.
-      break;
-    }
-  }
-
-  return false;
-}
-
-size_t CopyToStringHelper(
-    std::string* result, const void* buffer, uint32_t num_bytes) {
-  result->append(static_cast<const char*>(buffer), num_bytes);
-  return num_bytes;
-}
-
-}  // namespace
-
-// TODO(hansmuller): Add a max_size parameter.
-bool BlockingCopyToString(ScopedDataPipeConsumerHandle source,
-                          std::string* result) {
-  CHECK(result);
-  result->clear();
-  return BlockingCopyHelper(std::move(source),
-                            base::Bind(&CopyToStringHelper, result));
-}
-
-bool MOJO_COMMON_EXPORT BlockingCopyFromString(
-    const std::string& source,
-    const ScopedDataPipeProducerHandle& destination) {
-  auto it = source.begin();
-  for (;;) {
-    void* buffer = nullptr;
-    uint32_t buffer_num_bytes = 0;
-    MojoResult result =
-        BeginWriteDataRaw(destination.get(), &buffer, &buffer_num_bytes,
-                          MOJO_WRITE_DATA_FLAG_NONE);
-    if (result == MOJO_RESULT_OK) {
-      char* char_buffer = static_cast<char*>(buffer);
-      uint32_t byte_index = 0;
-      while (it != source.end() && byte_index < buffer_num_bytes) {
-        char_buffer[byte_index++] = *it++;
-      }
-      EndWriteDataRaw(destination.get(), byte_index);
-      if (it == source.end())
-        return true;
-    } else if (result == MOJO_RESULT_SHOULD_WAIT) {
-      result = Wait(destination.get(), MOJO_HANDLE_SIGNAL_WRITABLE);
-      if (result != MOJO_RESULT_OK) {
-        // If the consumer handle was closed, then treat as EOF.
-        return result == MOJO_RESULT_FAILED_PRECONDITION;
-      }
-    } else {
-      // If the consumer handle was closed, then treat as EOF.
-      return result == MOJO_RESULT_FAILED_PRECONDITION;
-    }
-  }
-}
-
-}  // namespace common
-}  // namespace mojo
diff --git a/mojo/common/data_pipe_utils.h b/mojo/common/data_pipe_utils.h
deleted file mode 100644
index a3f7c09..0000000
--- a/mojo/common/data_pipe_utils.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_COMMON_DATA_PIPE_UTILS_H_
-#define MOJO_COMMON_DATA_PIPE_UTILS_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "mojo/common/mojo_common_export.h"
-#include "mojo/public/cpp/system/data_pipe.h"
-
-namespace mojo {
-namespace common {
-
-// Copies the data from |source| into |contents| and returns true on success and
-// false on error.  In case of I/O error, |contents| holds the data that could
-// be read from source before the error occurred.
-bool MOJO_COMMON_EXPORT BlockingCopyToString(
-    ScopedDataPipeConsumerHandle source,
-    std::string* contents);
-
-bool MOJO_COMMON_EXPORT BlockingCopyFromString(
-    const std::string& source,
-    const ScopedDataPipeProducerHandle& destination);
-
-}  // namespace common
-}  // namespace mojo
-
-#endif  // MOJO_COMMON_DATA_PIPE_UTILS_H_
diff --git a/mojo/common/file.mojom b/mojo/common/file.mojom
deleted file mode 100644
index fe22473..0000000
--- a/mojo/common/file.mojom
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-// Corresponds to |base::File| in base/files/file.h
-struct File {
-  handle fd;
-};
diff --git a/mojo/common/file.typemap b/mojo/common/file.typemap
deleted file mode 100644
index 26d4941..0000000
--- a/mojo/common/file.typemap
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/file.mojom"
-public_headers = [ "//base/files/file.h" ]
-traits_headers = [ "//mojo/common/common_custom_types_struct_traits.h" ]
-public_deps = [
-  "//mojo/common:struct_traits",
-]
-
-type_mappings =
-    [ "mojo.common.mojom.File=base::File[move_only,nullable_is_same_type]" ]
diff --git a/mojo/common/file_path.mojom b/mojo/common/file_path.mojom
deleted file mode 100644
index 10ebe05..0000000
--- a/mojo/common/file_path.mojom
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-[Native]
-struct FilePath;
diff --git a/mojo/common/file_path.typemap b/mojo/common/file_path.typemap
deleted file mode 100644
index 66d8c54..0000000
--- a/mojo/common/file_path.typemap
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/file_path.mojom"
-public_headers = [ "//base/files/file_path.h" ]
-traits_headers = [ "//ipc/ipc_message_utils.h" ]
-public_deps = [
-  "//ipc",
-]
-
-type_mappings = [ "mojo.common.mojom.FilePath=base::FilePath" ]
diff --git a/mojo/common/mojo_common_export.h b/mojo/common/mojo_common_export.h
deleted file mode 100644
index 48d21d0..0000000
--- a/mojo/common/mojo_common_export.h
+++ /dev/null
@@ -1,32 +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.
-
-#ifndef MOJO_COMMON_MOJO_COMMON_EXPORT_H_
-#define MOJO_COMMON_MOJO_COMMON_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-
-#if defined(WIN32)
-
-#if defined(MOJO_COMMON_IMPLEMENTATION)
-#define MOJO_COMMON_EXPORT __declspec(dllexport)
-#else
-#define MOJO_COMMON_EXPORT __declspec(dllimport)
-#endif
-
-#else  // !defined(WIN32)
-
-#if defined(MOJO_COMMON_IMPLEMENTATION)
-#define MOJO_COMMON_EXPORT __attribute__((visibility("default")))
-#else
-#define MOJO_COMMON_EXPORT
-#endif
-
-#endif  // defined(WIN32)
-
-#else  // !defined(COMPONENT_BUILD)
-#define MOJO_COMMON_EXPORT
-#endif
-
-#endif  // MOJO_COMMON_MOJO_COMMON_EXPORT_H_
diff --git a/mojo/common/string16.mojom b/mojo/common/string16.mojom
deleted file mode 100644
index 173c867..0000000
--- a/mojo/common/string16.mojom
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-// Corresponds to |base::string16| in base/strings/string16.h
-// Corresponds to |WTF::String| in
-// third_party/WebKit/Source/wtf/text/WTFString.h.
-struct String16 {
-  array<uint16> data;
-};
diff --git a/mojo/common/string16.typemap b/mojo/common/string16.typemap
deleted file mode 100644
index 223de29..0000000
--- a/mojo/common/string16.typemap
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/string16.mojom"
-public_headers = [ "//base/strings/string16.h" ]
-traits_headers = [ "//mojo/common/common_custom_types_struct_traits.h" ]
-public_deps = [
-  "//mojo/common:struct_traits",
-]
-
-type_mappings = [ "mojo.common.mojom.String16=base::string16" ]
diff --git a/mojo/common/struct_traits_unittest.cc b/mojo/common/struct_traits_unittest.cc
deleted file mode 100644
index 5ac4bc9..0000000
--- a/mojo/common/struct_traits_unittest.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_loop.h"
-#include "mojo/common/traits_test_service.mojom.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace common {
-namespace {
-
-class StructTraitsTest : public testing::Test, public mojom::TraitsTestService {
- public:
-  StructTraitsTest() {}
-
- protected:
-  mojom::TraitsTestServicePtr GetTraitsTestProxy() {
-    return traits_test_bindings_.CreateInterfacePtrAndBind(this);
-  }
-
- private:
-  // TraitsTestService:
-  void EchoVersion(const base::Optional<base::Version>& m,
-                   const EchoVersionCallback& callback) override {
-    callback.Run(m);
-  }
-
-  base::MessageLoop loop_;
-  mojo::BindingSet<TraitsTestService> traits_test_bindings_;
-
-  DISALLOW_COPY_AND_ASSIGN(StructTraitsTest);
-};
-
-TEST_F(StructTraitsTest, Version) {
-  const std::string& version_str = "1.2.3.4";
-  base::Version input(version_str);
-  mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
-  base::Optional<base::Version> output;
-  proxy->EchoVersion(input, &output);
-  EXPECT_TRUE(output.has_value());
-  EXPECT_EQ(version_str, output->GetString());
-}
-
-TEST_F(StructTraitsTest, InvalidVersion) {
-  const std::string invalid_version_str;
-  base::Version input(invalid_version_str);
-  mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
-  base::Optional<base::Version> output;
-  proxy->EchoVersion(input, &output);
-  EXPECT_FALSE(output.has_value());
-}
-
-}  // namespace
-}  // namespace common
-}  // namespace mojo
diff --git a/mojo/common/test_common_custom_types.mojom b/mojo/common/test_common_custom_types.mojom
deleted file mode 100644
index 0f13680..0000000
--- a/mojo/common/test_common_custom_types.mojom
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.test;
-
-import "mojo/common/file.mojom";
-import "mojo/common/file_path.mojom";
-import "mojo/common/string16.mojom";
-import "mojo/common/text_direction.mojom";
-import "mojo/common/time.mojom";
-import "mojo/common/unguessable_token.mojom";
-import "mojo/common/values.mojom";
-
-interface TestFilePath {
-  BounceFilePath(mojo.common.mojom.FilePath in)
-      => (mojo.common.mojom.FilePath out);
-};
-
-interface TestUnguessableToken {
-  BounceNonce(mojo.common.mojom.UnguessableToken in)
-      => (mojo.common.mojom.UnguessableToken out);
-};
-
-interface TestTime {
-  BounceTime(mojo.common.mojom.Time time) => (mojo.common.mojom.Time time);
-  BounceTimeDelta(mojo.common.mojom.TimeDelta time_delta)
-      => (mojo.common.mojom.TimeDelta time_delta);
-  BounceTimeTicks(mojo.common.mojom.TimeTicks time_ticks)
-      => (mojo.common.mojom.TimeTicks time_ticks);
-};
-
-interface TestValue {
-  [Sync]
-  BounceDictionaryValue(mojo.common.mojom.DictionaryValue in)
-      => (mojo.common.mojom.DictionaryValue out);
-  [Sync]
-  BounceListValue(mojo.common.mojom.ListValue in)
-      => (mojo.common.mojom.ListValue out);
-  [Sync]
-  BounceValue(mojo.common.mojom.Value? in)
-      => (mojo.common.mojom.Value? out);
-};
-
-interface TestString16 {
-  [Sync]
-  BounceString16(mojo.common.mojom.String16 in)
-      => (mojo.common.mojom.String16 out);
-};
-
-interface TestFile {
-  [Sync]
-  BounceFile(mojo.common.mojom.File? in)
-      => (mojo.common.mojom.File? out);
-};
-
-interface TestTextDirection {
-  [Sync]
-  BounceTextDirection(mojo.common.mojom.TextDirection in)
-      => (mojo.common.mojom.TextDirection out);
-};
diff --git a/mojo/common/text_direction.mojom b/mojo/common/text_direction.mojom
deleted file mode 100644
index 7d65124..0000000
--- a/mojo/common/text_direction.mojom
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-// Corresponds to |base::i18n::TextDirection| in base/i18n/rtl.h
-enum TextDirection {	
-  UNKNOWN_DIRECTION,	
-  RIGHT_TO_LEFT,	
-  LEFT_TO_RIGHT	
-};	
diff --git a/mojo/common/text_direction.typemap b/mojo/common/text_direction.typemap
deleted file mode 100644
index 1f5be8e..0000000
--- a/mojo/common/text_direction.typemap
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/text_direction.mojom"
-public_headers = [ "//base/i18n/rtl.h" ]
-traits_headers = [ "//mojo/common/common_custom_types_struct_traits.h" ]
-public_deps = [
-  "//base:i18n",
-  "//mojo/common:struct_traits",
-]
-type_mappings = [ "mojo.common.mojom.TextDirection=base::i18n::TextDirection" ]
diff --git a/mojo/common/time.mojom b/mojo/common/time.mojom
deleted file mode 100644
index b403bca..0000000
--- a/mojo/common/time.mojom
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-struct Time {
-  // The internal value is expressed in terms of microseconds since a fixed but
-  // intentionally unspecified epoch.
-  int64 internal_value;
-};
-
-struct TimeDelta {
-  int64 microseconds;
-};
-
-struct TimeTicks {
-  // The internal value is expressed in terms of microseconds since a fixed but
-  // intentionally unspecified epoch.
-  int64 internal_value;
-};
diff --git a/mojo/common/time.typemap b/mojo/common/time.typemap
deleted file mode 100644
index 99e9e3a..0000000
--- a/mojo/common/time.typemap
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/time.mojom"
-public_headers = [ "//base/time/time.h" ]
-traits_headers = [
-  "//ipc/ipc_message_utils.h",
-  "//mojo/common/common_custom_types_struct_traits.h",
-]
-public_deps = [
-  "//ipc",
-  "//mojo/common:struct_traits",
-]
-
-type_mappings = [
-  "mojo.common.mojom.Time=base::Time[copyable_pass_by_value]",
-  "mojo.common.mojom.TimeDelta=base::TimeDelta[copyable_pass_by_value]",
-  "mojo.common.mojom.TimeTicks=base::TimeTicks[copyable_pass_by_value]",
-]
diff --git a/mojo/common/time_struct_traits.h b/mojo/common/time_struct_traits.h
deleted file mode 100644
index b480edb..0000000
--- a/mojo/common/time_struct_traits.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_COMMON_TIME_STRUCT_TRAITS_H_
-#define MOJO_COMMON_TIME_STRUCT_TRAITS_H_
-
-#include "base/time/time.h"
-#include "mojo/common/time.mojom-shared.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<common::mojom::TimeDataView, base::Time> {
-  static int64_t internal_value(const base::Time& time) {
-    return time.since_origin().InMicroseconds();
-  }
-
-  static bool Read(common::mojom::TimeDataView data, base::Time* time) {
-    *time =
-        base::Time() + base::TimeDelta::FromMicroseconds(data.internal_value());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<common::mojom::TimeDeltaDataView, base::TimeDelta> {
-  static int64_t microseconds(const base::TimeDelta& delta) {
-    return delta.InMicroseconds();
-  }
-
-  static bool Read(common::mojom::TimeDeltaDataView data,
-                   base::TimeDelta* delta) {
-    *delta = base::TimeDelta::FromMicroseconds(data.microseconds());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<common::mojom::TimeTicksDataView, base::TimeTicks> {
-  static int64_t internal_value(const base::TimeTicks& time) {
-    return time.since_origin().InMicroseconds();
-  }
-
-  static bool Read(common::mojom::TimeTicksDataView data,
-                   base::TimeTicks* time) {
-    *time = base::TimeTicks() +
-            base::TimeDelta::FromMicroseconds(data.internal_value());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_COMMON_TIME_STRUCT_TRAITS_H_
diff --git a/mojo/common/traits_test_service.mojom b/mojo/common/traits_test_service.mojom
deleted file mode 100644
index 7659eea..0000000
--- a/mojo/common/traits_test_service.mojom
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-import "mojo/common/version.mojom";
-
-// All functions on this interface echo their arguments to test StructTraits
-// serialization and deserialization.
-interface TraitsTestService {
-  [Sync]
-  EchoVersion(Version? v) => (Version? pass);
-};
diff --git a/mojo/common/typemaps.gni b/mojo/common/typemaps.gni
deleted file mode 100644
index ae36031..0000000
--- a/mojo/common/typemaps.gni
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-typemaps = [
-  "//mojo/common/file.typemap",
-  "//mojo/common/file_path.typemap",
-  "//mojo/common/string16.typemap",
-  "//mojo/common/text_direction.typemap",
-  "//mojo/common/time.typemap",
-  "//mojo/common/unguessable_token.typemap",
-  "//mojo/common/values.typemap",
-  "//mojo/common/version.typemap",
-]
diff --git a/mojo/common/unguessable_token.mojom b/mojo/common/unguessable_token.mojom
deleted file mode 100644
index 3279717..0000000
--- a/mojo/common/unguessable_token.mojom
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-// Corresponds to |base::UnguessableToken| in base/unguessable_token.h
-struct UnguessableToken {
-  uint64 high;
-  uint64 low;
-};
diff --git a/mojo/common/unguessable_token.typemap b/mojo/common/unguessable_token.typemap
deleted file mode 100644
index ec7b194..0000000
--- a/mojo/common/unguessable_token.typemap
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/unguessable_token.mojom"
-public_headers = [ "//base/unguessable_token.h" ]
-traits_headers = [ "//mojo/common/common_custom_types_struct_traits.h" ]
-public_deps = [
-  "//mojo/common:struct_traits",
-]
-
-type_mappings = [ "mojo.common.mojom.UnguessableToken=base::UnguessableToken" ]
diff --git a/mojo/common/values.mojom b/mojo/common/values.mojom
deleted file mode 100644
index 722198c..0000000
--- a/mojo/common/values.mojom
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-union Value {
-  NullValue? null_value;
-  bool bool_value;
-  int32 int_value;
-  double double_value;
-  string string_value;
-  array<uint8> binary_value;
-  DictionaryValue dictionary_value;
-  ListValue list_value;
-};
-
-struct ListValue {
-  array<Value> values;
-};
-
-struct DictionaryValue {
-  map<string, Value> values;
-};
-
-// An empty struct representing a null base::Value.
-struct NullValue {
-};
-
-// To avoid versioning problems for arc. TODO(sammc): Remove ASAP.
-[Native]
-struct LegacyListValue;
diff --git a/mojo/common/values.typemap b/mojo/common/values.typemap
deleted file mode 100644
index f1f3fc2..0000000
--- a/mojo/common/values.typemap
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/values.mojom"
-public_headers = [ "//base/values.h" ]
-traits_headers = [
-  "//ipc/ipc_message_utils.h",
-  "//mojo/common/values_struct_traits.h",
-]
-public_deps = [
-  "//base",
-  "//ipc",
-]
-sources = [
-  "values_struct_traits.cc",
-  "values_struct_traits.h",
-]
-
-type_mappings = [
-  "mojo.common.mojom.DictionaryValue=std::unique_ptr<base::DictionaryValue>[move_only,nullable_is_same_type]",
-  "mojo.common.mojom.LegacyListValue=base::ListValue[non_copyable_non_movable]",
-  "mojo.common.mojom.ListValue=std::unique_ptr<base::ListValue>[move_only,nullable_is_same_type]",
-  "mojo.common.mojom.Value=std::unique_ptr<base::Value>[move_only,nullable_is_same_type]",
-]
diff --git a/mojo/common/values_struct_traits.cc b/mojo/common/values_struct_traits.cc
deleted file mode 100644
index 6af7a39..0000000
--- a/mojo/common/values_struct_traits.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/ptr_util.h"
-#include "mojo/common/values_struct_traits.h"
-
-namespace mojo {
-
-bool StructTraits<common::mojom::ListValueDataView,
-                  std::unique_ptr<base::ListValue>>::
-    Read(common::mojom::ListValueDataView data,
-         std::unique_ptr<base::ListValue>* value_out) {
-  mojo::ArrayDataView<common::mojom::ValueDataView> view;
-  data.GetValuesDataView(&view);
-
-  auto list_value = base::MakeUnique<base::ListValue>();
-  for (size_t i = 0; i < view.size(); ++i) {
-    std::unique_ptr<base::Value> value;
-    if (!view.Read(i, &value))
-      return false;
-
-    list_value->Append(std::move(value));
-  }
-  *value_out = std::move(list_value);
-  return true;
-}
-
-bool StructTraits<common::mojom::DictionaryValueDataView,
-                  std::unique_ptr<base::DictionaryValue>>::
-    Read(common::mojom::DictionaryValueDataView data,
-         std::unique_ptr<base::DictionaryValue>* value_out) {
-  mojo::MapDataView<mojo::StringDataView, common::mojom::ValueDataView> view;
-  data.GetValuesDataView(&view);
-  auto dictionary_value = base::MakeUnique<base::DictionaryValue>();
-  for (size_t i = 0; i < view.size(); ++i) {
-    base::StringPiece key;
-    std::unique_ptr<base::Value> value;
-    if (!view.keys().Read(i, &key) || !view.values().Read(i, &value))
-      return false;
-
-    dictionary_value->SetWithoutPathExpansion(key, std::move(value));
-  }
-  *value_out = std::move(dictionary_value);
-  return true;
-}
-
-std::unique_ptr<base::DictionaryValue>
-CloneTraits<std::unique_ptr<base::DictionaryValue>, false>::Clone(
-    const std::unique_ptr<base::DictionaryValue>& input) {
-  auto result = base::MakeUnique<base::DictionaryValue>();
-  result->MergeDictionary(input.get());
-  return result;
-}
-
-bool UnionTraits<common::mojom::ValueDataView, std::unique_ptr<base::Value>>::
-    Read(common::mojom::ValueDataView data,
-         std::unique_ptr<base::Value>* value_out) {
-  switch (data.tag()) {
-    case common::mojom::ValueDataView::Tag::NULL_VALUE: {
-      *value_out = base::Value::CreateNullValue();
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::BOOL_VALUE: {
-      *value_out = base::MakeUnique<base::Value>(data.bool_value());
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::INT_VALUE: {
-      *value_out = base::MakeUnique<base::Value>(data.int_value());
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::DOUBLE_VALUE: {
-      *value_out = base::MakeUnique<base::Value>(data.double_value());
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::STRING_VALUE: {
-      base::StringPiece string_value;
-      if (!data.ReadStringValue(&string_value))
-        return false;
-      *value_out = base::MakeUnique<base::Value>(string_value);
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::BINARY_VALUE: {
-      mojo::ArrayDataView<uint8_t> binary_data;
-      data.GetBinaryValueDataView(&binary_data);
-      *value_out = base::BinaryValue::CreateWithCopiedBuffer(
-          reinterpret_cast<const char*>(binary_data.data()),
-          binary_data.size());
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::DICTIONARY_VALUE: {
-      std::unique_ptr<base::DictionaryValue> dictionary_value;
-      if (!data.ReadDictionaryValue(&dictionary_value))
-        return false;
-      *value_out = std::move(dictionary_value);
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::LIST_VALUE: {
-      std::unique_ptr<base::ListValue> list_value;
-      if (!data.ReadListValue(&list_value))
-        return false;
-      *value_out = std::move(list_value);
-      return true;
-    }
-  }
-  return false;
-}
-
-}  // namespace mojo
diff --git a/mojo/common/values_struct_traits.h b/mojo/common/values_struct_traits.h
deleted file mode 100644
index befcf3a..0000000
--- a/mojo/common/values_struct_traits.h
+++ /dev/null
@@ -1,257 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_COMMON_VALUES_STRUCT_TRAITS_H_
-#define MOJO_COMMON_VALUES_STRUCT_TRAITS_H_
-
-#include "base/values.h"
-#include "mojo/common/values.mojom.h"
-#include "mojo/public/cpp/bindings/array_traits.h"
-#include "mojo/public/cpp/bindings/clone_traits.h"
-#include "mojo/public/cpp/bindings/map_traits.h"
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/union_traits.h"
-
-namespace mojo {
-
-template <>
-struct ArrayTraits<base::ListValue> {
-  using Element = std::unique_ptr<base::Value>;
-  using ConstIterator = base::ListValue::const_iterator;
-
-  static size_t GetSize(const base::ListValue& input) {
-    return input.GetSize();
-  }
-
-  static ConstIterator GetBegin(const base::ListValue& input) {
-    return input.begin();
-  }
-
-  static void AdvanceIterator(ConstIterator& iterator) { ++iterator; }
-
-  static const Element& GetValue(ConstIterator& iterator) { return *iterator; }
-};
-
-template <>
-struct StructTraits<common::mojom::ListValueDataView, base::ListValue> {
-  static const base::ListValue& values(const base::ListValue& value) {
-    return value;
-  }
-};
-
-template <>
-struct StructTraits<common::mojom::ListValueDataView,
-                    std::unique_ptr<base::ListValue>> {
-  static bool IsNull(const std::unique_ptr<base::ListValue>& value) {
-    return !value;
-  }
-
-  static void SetToNull(std::unique_ptr<base::ListValue>* value) {
-    value->reset();
-  }
-
-  static const base::ListValue& values(
-      const std::unique_ptr<base::ListValue>& value) {
-    return *value;
-  }
-
-  static bool Read(common::mojom::ListValueDataView data,
-                   std::unique_ptr<base::ListValue>* value);
-};
-
-template <>
-struct MapTraits<base::DictionaryValue> {
-  using Key = std::string;
-  using Value = base::Value;
-  using Iterator = base::DictionaryValue::Iterator;
-
-  static size_t GetSize(const base::DictionaryValue& input) {
-    return input.size();
-  }
-
-  static Iterator GetBegin(const base::DictionaryValue& input) {
-    return Iterator(input);
-  }
-
-  static void AdvanceIterator(Iterator& iterator) { iterator.Advance(); }
-
-  static const Key& GetKey(Iterator& iterator) { return iterator.key(); }
-
-  static const Value& GetValue(Iterator& iterator) { return iterator.value(); }
-};
-
-template <>
-struct StructTraits<common::mojom::DictionaryValueDataView,
-                    base::DictionaryValue> {
-  static const base::DictionaryValue& values(
-      const base::DictionaryValue& value) {
-    return value;
-  }
-};
-
-template <>
-struct StructTraits<common::mojom::DictionaryValueDataView,
-                    std::unique_ptr<base::DictionaryValue>> {
-  static bool IsNull(const std::unique_ptr<base::DictionaryValue>& value) {
-    return !value;
-  }
-
-  static void SetToNull(std::unique_ptr<base::DictionaryValue>* value) {
-    value->reset();
-  }
-
-  static const base::DictionaryValue& values(
-      const std::unique_ptr<base::DictionaryValue>& value) {
-    return *value;
-  }
-  static bool Read(common::mojom::DictionaryValueDataView data,
-                   std::unique_ptr<base::DictionaryValue>* value);
-};
-
-template <>
-struct CloneTraits<std::unique_ptr<base::DictionaryValue>, false> {
-  static std::unique_ptr<base::DictionaryValue> Clone(
-      const std::unique_ptr<base::DictionaryValue>& input);
-};
-
-template <>
-struct UnionTraits<common::mojom::ValueDataView, base::Value> {
-  static common::mojom::ValueDataView::Tag GetTag(const base::Value& data) {
-    switch (data.GetType()) {
-      case base::Value::Type::NONE:
-        return common::mojom::ValueDataView::Tag::NULL_VALUE;
-      case base::Value::Type::BOOLEAN:
-        return common::mojom::ValueDataView::Tag::BOOL_VALUE;
-      case base::Value::Type::INTEGER:
-        return common::mojom::ValueDataView::Tag::INT_VALUE;
-      case base::Value::Type::DOUBLE:
-        return common::mojom::ValueDataView::Tag::DOUBLE_VALUE;
-      case base::Value::Type::STRING:
-        return common::mojom::ValueDataView::Tag::STRING_VALUE;
-      case base::Value::Type::BINARY:
-        return common::mojom::ValueDataView::Tag::BINARY_VALUE;
-      case base::Value::Type::DICTIONARY:
-        return common::mojom::ValueDataView::Tag::DICTIONARY_VALUE;
-      case base::Value::Type::LIST:
-        return common::mojom::ValueDataView::Tag::LIST_VALUE;
-    }
-    NOTREACHED();
-    return common::mojom::ValueDataView::Tag::NULL_VALUE;
-  }
-
-  static common::mojom::NullValuePtr null_value(const base::Value& value) {
-    return common::mojom::NullValuePtr();
-  }
-
-  static bool bool_value(const base::Value& value) {
-    bool bool_value{};
-    if (!value.GetAsBoolean(&bool_value))
-      NOTREACHED();
-    return bool_value;
-  }
-
-  static int32_t int_value(const base::Value& value) {
-    int int_value{};
-    if (!value.GetAsInteger(&int_value))
-      NOTREACHED();
-    return int_value;
-  }
-
-  static double double_value(const base::Value& value) {
-    double double_value{};
-    if (!value.GetAsDouble(&double_value))
-      NOTREACHED();
-    return double_value;
-  }
-
-  static base::StringPiece string_value(const base::Value& value) {
-    base::StringPiece string_piece;
-    if (!value.GetAsString(&string_piece))
-      NOTREACHED();
-    return string_piece;
-  }
-
-  static mojo::ConstCArray<uint8_t> binary_value(const base::Value& value) {
-    const base::BinaryValue* binary_value = nullptr;
-    if (!value.GetAsBinary(&binary_value))
-      NOTREACHED();
-    return mojo::ConstCArray<uint8_t>(
-        binary_value->GetSize(),
-        reinterpret_cast<const uint8_t*>(binary_value->GetBuffer()));
-  }
-
-  static const base::ListValue& list_value(const base::Value& value) {
-    const base::ListValue* list_value = nullptr;
-    if (!value.GetAsList(&list_value))
-      NOTREACHED();
-    return *list_value;
-  }
-  static const base::DictionaryValue& dictionary_value(
-      const base::Value& value) {
-    const base::DictionaryValue* dictionary_value = nullptr;
-    if (!value.GetAsDictionary(&dictionary_value))
-      NOTREACHED();
-    return *dictionary_value;
-  }
-};
-
-template <>
-struct UnionTraits<common::mojom::ValueDataView, std::unique_ptr<base::Value>> {
-  static bool IsNull(const std::unique_ptr<base::Value>& value) {
-    return !value;
-  }
-
-  static void SetToNull(std::unique_ptr<base::Value>* value) { value->reset(); }
-
-  static common::mojom::ValueDataView::Tag GetTag(
-      const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::GetTag(
-        *value);
-  }
-
-  static common::mojom::NullValuePtr null_value(
-      const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::null_value(
-        *value);
-  }
-  static bool bool_value(const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::bool_value(
-        *value);
-  }
-  static int32_t int_value(const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::int_value(
-        *value);
-  }
-  static double double_value(const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::double_value(
-        *value);
-  }
-  static base::StringPiece string_value(
-      const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::string_value(
-        *value);
-  }
-  static mojo::ConstCArray<uint8_t> binary_value(
-      const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::binary_value(
-        *value);
-  }
-  static const base::ListValue& list_value(
-      const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::list_value(
-        *value);
-  }
-  static const base::DictionaryValue& dictionary_value(
-      const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView,
-                       base::Value>::dictionary_value(*value);
-  }
-
-  static bool Read(common::mojom::ValueDataView data,
-                   std::unique_ptr<base::Value>* value);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_COMMON_VALUES_STRUCT_TRAITS_H_
diff --git a/mojo/common/version.mojom b/mojo/common/version.mojom
deleted file mode 100644
index 6ddf6e6..0000000
--- a/mojo/common/version.mojom
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-// Corresponds to |base::Version| in base/version.h
-struct Version {
-  array<uint32> components;
-};
diff --git a/mojo/common/version.typemap b/mojo/common/version.typemap
deleted file mode 100644
index fa7fed9..0000000
--- a/mojo/common/version.typemap
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/version.mojom"
-public_headers = [ "//base/version.h" ]
-traits_headers = [ "//mojo/common/common_custom_types_struct_traits.h" ]
-public_deps = [
-  "//mojo/common:struct_traits",
-]
-
-type_mappings = [ "mojo.common.mojom.Version=base::Version" ]
diff --git a/mojo/edk/DEPS b/mojo/edk/DEPS
deleted file mode 100644
index 77abb21..0000000
--- a/mojo/edk/DEPS
+++ /dev/null
@@ -1,14 +0,0 @@
-include_rules = [
-  # This code is checked into the chromium repo so it's fine to depend on this.
-  "+base",
-  "+crypto",
-  "+build",
-  "+gin",
-  "+native_client/src/public",
-  "+testing",
-  "+third_party/ashmem",
-  "+v8",
-
-  # internal includes.
-  "+mojo",
-]
diff --git a/mojo/edk/embedder/BUILD.gn b/mojo/edk/embedder/BUILD.gn
deleted file mode 100644
index 8105bed..0000000
--- a/mojo/edk/embedder/BUILD.gn
+++ /dev/null
@@ -1,147 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/nacl/config.gni")
-
-source_set("headers") {
-  sources = [
-    "configuration.h",
-    "connection_params.h",
-    "embedder.h",
-    "embedder_internal.h",
-    "named_platform_channel_pair.h",
-    "named_platform_handle.h",
-    "named_platform_handle_utils.h",
-    "pending_process_connection.h",
-    "platform_channel_pair.h",
-    "platform_handle.h",
-    "platform_handle_utils.h",
-    "scoped_platform_handle.h",
-  ]
-
-  public_deps = [
-    "//base",
-    "//mojo/public/cpp/system",
-  ]
-}
-
-source_set("embedder") {
-  # This isn't really a standalone target; it must be linked into the
-  # mojo_system_impl component.
-  visibility = [
-    "//mojo/edk/system",
-    "//components/nacl:nacl",
-  ]
-
-  sources = [
-    "configuration.h",
-    "connection_params.cc",
-    "connection_params.h",
-    "embedder.cc",
-    "embedder.h",
-    "embedder_internal.h",
-    "entrypoints.cc",
-    "entrypoints.h",
-    "pending_process_connection.cc",
-    "scoped_ipc_support.cc",
-    "scoped_ipc_support.h",
-
-    # Test-only code:
-    # TODO(vtl): It's a little unfortunate that these end up in the same
-    # component as non-test-only code. In the static build, this code should
-    # hopefully be dead-stripped.
-    "test_embedder.cc",
-    "test_embedder.h",
-  ]
-
-  defines = [ "MOJO_SYSTEM_IMPL_IMPLEMENTATION" ]
-
-  public_deps = [
-    ":headers",
-    ":platform",
-    "//base",
-    "//mojo/public/cpp/system",
-  ]
-
-  if (!is_nacl) {
-    deps = [
-      "//crypto",
-    ]
-  }
-}
-
-source_set("platform") {
-  # This isn't really a standalone target; it must be linked into the
-  # mojo_system_impl component.
-  visibility = [
-    ":embedder",
-    "//mojo/edk/system",
-  ]
-
-  sources = [
-    "named_platform_channel_pair.h",
-    "named_platform_channel_pair_win.cc",
-    "named_platform_handle.h",
-    "named_platform_handle_utils.h",
-    "named_platform_handle_utils_win.cc",
-    "platform_channel_pair.cc",
-    "platform_channel_pair.h",
-    "platform_channel_pair_posix.cc",
-    "platform_channel_pair_win.cc",
-    "platform_channel_utils_posix.cc",
-    "platform_channel_utils_posix.h",
-    "platform_handle.cc",
-    "platform_handle.h",
-    "platform_handle_utils.h",
-    "platform_handle_utils_posix.cc",
-    "platform_handle_utils_win.cc",
-    "platform_handle_vector.h",
-    "platform_shared_buffer.cc",
-    "platform_shared_buffer.h",
-    "scoped_platform_handle.h",
-  ]
-  if (!is_nacl) {
-    sources += [ "named_platform_handle_utils_posix.cc" ]
-  }
-
-  defines = [ "MOJO_SYSTEM_IMPL_IMPLEMENTATION" ]
-
-  public_deps = [
-    "//mojo/public/cpp/system",
-  ]
-
-  deps = [
-    "//base",
-  ]
-
-  if (is_android) {
-    deps += [ "//third_party/ashmem" ]
-  }
-
-  if (is_nacl && !is_nacl_nonsfi) {
-    sources -= [ "platform_channel_utils_posix.cc" ]
-  }
-}
-
-source_set("embedder_unittests") {
-  testonly = true
-
-  # TODO: Figure out why this visibility check fails on Android.
-  # visibility = [ "//mojo/edk/system:mojo_system_unittests" ]
-
-  sources = [
-    "embedder_unittest.cc",
-    "platform_channel_pair_posix_unittest.cc",
-    "platform_shared_buffer_unittest.cc",
-  ]
-
-  deps = [
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/system",
-    "//mojo/edk/system:test_utils",
-    "//mojo/edk/test:test_support",
-    "//testing/gtest",
-  ]
-}
diff --git a/mojo/edk/embedder/README.md b/mojo/edk/embedder/README.md
deleted file mode 100644
index fc53bec..0000000
--- a/mojo/edk/embedder/README.md
+++ /dev/null
@@ -1,346 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo Embedder Development Kit (EDK)
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-
-The Mojo EDK is a (binary-unstable) API which enables a process to use Mojo both
-internally and for IPC to other Mojo-embedding processes.
-
-Using any of the API surface in `//mojo/edk/embedder` requires (somewhat
-confusingly) a direct dependency on the GN `//mojo/edk/system` target. Despite
-this fact, you should never reference any of the headers in `mojo/edk/system`
-directly, as everything there is considered to be an internal detail of the EDK.
-
-**NOTE:** Unless you are introducing a new binary entry point into the system
-(*e.g.,* a new executable with a new `main()` definition), you probably don't
-need to know anything about the EDK API. Most processes defined in the Chrome
-repo today already fully initialize the EDK so that Mojo's other public APIs
-"just work" out of the box.
-
-## Basic Initialization
-
-In order to use Mojo in a given process, it's necessary to call
-`mojo::edk::Init` exactly once:
-
-```
-#include "mojo/edk/embedder/embedder.h"
-
-int main(int argc, char** argv) {
-  mojo::edk::Init();
-
-  // Now you can create message pipes, write messages, etc
-
-  return 0;
-}
-```
-
-As it happens though, Mojo is less useful without some kind of IPC support as
-well, and that's a second initialization step.
-
-## IPC Initialization
-
-You also need to provide the system with a background TaskRunner on which it can
-watch for inbound I/O from any of the various other processes you will later
-connect to it.
-
-Here we'll just create a new background thread for IPC and let Mojo use that.
-Note that in Chromium, we use the existing "IO thread" in the browser process
-and content child processes.
-
-```
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-
-int main(int argc, char** argv) {
-  mojo::edk::Init();
-
-  base::Thread ipc_thread("ipc!");
-  ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
-
-  // As long as this object is alive, all EDK API surface relevant to IPC
-  // connections is usable and message pipes which span a process boundary will
-  // continue to function.
-  mojo::edk::ScopedIPCSupport ipc_support(
-      ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-
-  return 0;
-}
-```
-
-This process is now fully prepared to use Mojo IPC!
-
-Note that all existing process types in Chromium already perform this setup
-very early during startup.
-
-## Connecting Two Processes
-
-Now suppose you're running a process which has initialized Mojo IPC, and you
-want to launch another process which you know will also initialize Mojo IPC.
-You want to be able to connect Mojo interfaces between these two processes.
-Rejoice, because this section was written just for you.
-
-NOTE: For legacy reasons, some API terminology may refer to concepts of "parent"
-and "child" as a relationship between processes being connected by Mojo. This
-relationship is today completely orthogonal to any notion of process hierarchy
-in the OS, and so use of these APIs is not constrained by an adherence to any
-such hierarchy.
-
-Mojo requires you to bring your own OS pipe to the party, and it will do the
-rest. It also provides a convenient mechanism for creating such pipes, known as
-a `PlatformChannelPair`.
-
-You provide one end of this pipe to the EDK in the local process via
-`PendingProcessConnection` - which can also be used to create cross-process
-message pipes (see the next section) - and you're responsible for getting the
-other end into the remote process.
-
-```
-#include "base/process/process_handle.h"
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/pending_process_connection.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-
-// You write this. It launches a new process, passing the pipe handle
-// encapsulated by |channel| by any means possible (e.g. on Windows or POSIX
-// you may inhert the file descriptor/HANDLE at launch and pass a commandline
-// argument to indicate its numeric value). Returns the handle of the new
-// process.
-base::ProcessHandle LaunchCoolChildProcess(
-    mojo::edk::ScopedPlatformHandle channel);
-
-int main(int argc, char** argv) {
-  mojo::edk::Init();
-
-  base::Thread ipc_thread("ipc!");
-  ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
-
-  mojo::edk::ScopedIPCSupport ipc_support(
-      ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-
-  // This is essentially always an OS pipe (domain socket pair, Windows named
-  // pipe, etc.)
-  mojo::edk::PlatformChannelPair channel;
-
-  // This is a scoper which encapsulates the intent to connect to another
-  // process. It exists because process connection is inherently asynchronous,
-  // things may go wrong, and the lifetime of any associated resources is bound
-  // by the lifetime of this object regardless of success or failure.
-  mojo::edk::PendingProcessConnection child;
-
-  base::ProcessHandle child_handle =
-      LaunchCoolChildProcess(channel.PassClientHandle());
-
-  // At this point it's safe for |child| to go out of scope and nothing will
-  // break.
-  child.Connect(child_handle, channel.PassServerHandle());
-
-  return 0;
-}
-```
-
-The launched process code uses `SetParentPipeHandle` to get connected, and might
-look something like:
-
-```
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-
-// You write this. It acquires the ScopedPlatformHandle that was passed by
-// whomever launched this process (i.e. LaunchCoolChildProcess above).
-mojo::edk::ScopedPlatformHandle GetChannelHandle();
-
-int main(int argc, char** argv) {
-  mojo::edk::Init();
-
-  base::Thread ipc_thread("ipc!");
-  ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
-
-  mojo::edk::ScopedIPCSupport ipc_support(
-      ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-
-  mojo::edk::SetParentPipeHandle(GetChannelHandle());
-
-  return 0;
-}
-```
-
-Now you have IPC initialized between two processes. For some practical examples
-of how this is done, you can dig into the various multiprocess tests in the
-`mojo_system_unittests` test suite.
-
-## Bootstrapping Cross-Process Message Pipes
-
-Having internal Mojo IPC support initialized is pretty useless if you don't have
-any message pipes spanning the process boundary. Fortunately, this is made
-trivial by the EDK: `PendingProcessConnection` has a
-`CreateMessagePipe` method which synthesizes a new solitary message pipe
-endpoint for your immediate use, while also generating a magic token string that
-can be exchanged for the other end of the pipe via
-`mojo::edk::CreateChildMessagePipe`.
-
-The token exchange can be done by the same process (which is sometimes useful),
-or by the process that is eventually connected via `Connect()` on that
-`PendingProcessConnection`. This means that you can effectively pass message
-pipes on the commandline by passing a token string.
-
-We can modify our existing sample code as follows:
-
-```
-#include "base/command_line.h"
-#include "base/process/process_handle.h"
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/pending_process_connection.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "local/foo.mojom.h"  // You provide this
-
-base::ProcessHandle LaunchCoolChildProcess(
-    const base::CommandLine& command_line,
-    mojo::edk::ScopedPlatformHandle channel);
-
-int main(int argc, char** argv) {
-  mojo::edk::Init();
-
-  base::Thread ipc_thread("ipc!");
-  ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
-
-  mojo::edk::ScopedIPCSupport ipc_support(
-      ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-
-  mojo::edk::PlatformChannelPair channel;
-
-  mojo::edk::PendingProcessConnection child;
-
-  base::CommandLine command_line;  // Assume this is appropriately initialized
-
-  // Create a new message pipe with one end being retrievable in the new
-  // process. Note that it doesn't matter whether we call CreateMessagePipe()
-  // before or after Connect(), and we can create as many different pipes as
-  // we like.
-  std::string pipe_token;
-  mojo::ScopedMessagePipeHandle my_pipe = child.CreateMessagePipe(&pipe_token);
-  command_line.AppendSwitchASCII("primordial-pipe", pipe_token);
-
-  base::ProcessHandle child_handle =
-      LaunchCoolChildProcess(command_line, channel.PassClientHandle());
-
-  child.Connect(child_handle, channel.PassServerHandle());
-
-  // We can start using our end of the pipe immediately. Here we assume the
-  // other end will eventually be bound to a local::mojom::Foo implementation,
-  // so we can start making calls on that interface.
-  //
-  // Note that this could even be done before the child process is launched and
-  // it would still work as expected.
-  local::mojom::FooPtr foo;
-  foo.Bind(local::mojom::FooPtrInfo(std::move(my_pipe), 0));
-  foo->DoSomeStuff(42);
-
-  return 0;
-}
-```
-
-and for the launched process:
-
-
-```
-#include "base/command_line.h"
-#include "base/run_loop/run_loop.h"
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "local/foo.mojom.h"  // You provide this
-
-mojo::edk::ScopedPlatformHandle GetChannelHandle();
-
-class FooImpl : local::mojom::Foo {
- public:
-  explicit FooImpl(local::mojom::FooRequest request)
-      : binding_(this, std::move(request)) {}
-  ~FooImpl() override {}
-
-  void DoSomeStuff(int32_t n) override {
-    // ...
-  }
-
- private:
-  mojo::Binding<local::mojom::Foo> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(FooImpl);
-};
-
-int main(int argc, char** argv) {
-  base::CommandLine::Init(argc, argv);
-
-  mojo::edk::Init();
-
-  base::Thread ipc_thread("ipc!");
-  ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
-
-  mojo::edk::ScopedIPCSupport ipc_support(
-      ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-
-  mojo::edk::SetParentPipeHandle(GetChannelHandle());
-
-  mojo::ScopedMessagePipeHandle my_pipe = mojo::edk::CreateChildMessagePipe(
-      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          "primordial-pipe"));
-
-  local::mojom::FooRequest foo_request;
-  foo_request.Bind(std::move(my_pipe));
-  FooImpl impl(std::move(foo_request));
-
-  // Run forever!
-  base::RunLoop().Run();
-
-  return 0;
-}
-```
-
-Note that the above samples assume an interface definition in
-`//local/test.mojom` which would look something like:
-
-```
-module local.mojom;
-
-interface Foo {
-  DoSomeStuff(int32 n);
-};
-```
-
-Once you've bootstrapped your process connection with a real mojom interface,
-you can avoid any further mucking around with EDK APIs or raw message pipe
-handles, as everything beyond this point - including the passing of other
-interface pipes - can be handled eloquently using
-[public bindings APIs](/mojo#High-Level-Bindings-APIs).
-
-## Setting System Properties
-
-The public Mojo C System API exposes a
-[**`MojoGetProperty`**](/mojo/public/c/system#MojoGetProperty) function for
-querying global, embedder-defined property values. These can be set by calling:
-
-```
-mojo::edk::SetProperty(MojoPropertyType type, const void* value)
-```
-
diff --git a/mojo/edk/embedder/configuration.h b/mojo/edk/embedder/configuration.h
deleted file mode 100644
index 1990fb1..0000000
--- a/mojo/edk/embedder/configuration.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_CONFIGURATION_H_
-#define MOJO_EDK_EMBEDDER_CONFIGURATION_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-namespace mojo {
-namespace edk {
-
-// A set of constants that the Mojo system internally uses. These values should
-// be consistent across all processes on the same system.
-//
-// In general, there should be no need to change these values from their
-// defaults. However, if you do change them, you must do so before
-// initialization.
-struct Configuration {
-  // Maximum number of open (Mojo) handles. The default is 1,000,000.
-  //
-  // TODO(vtl): This doesn't count "live" handles, some of which may live in
-  // messages.
-  size_t max_handle_table_size;
-
-  // Maximum number of active memory mappings. The default is 1,000,000.
-  size_t max_mapping_table_sze;
-
-  // Maximum data size of messages sent over message pipes, in bytes. The
-  // default is 4MB.
-  size_t max_message_num_bytes;
-
-  // Maximum number of handles that can be attached to messages sent over
-  // message pipes. The default is 10,000.
-  size_t max_message_num_handles;
-
-  // Maximum capacity of a data pipe, in bytes. The default is 256MB. This value
-  // must fit into a |uint32_t|. WARNING: If you bump it closer to 2^32, you
-  // must audit all the code to check that we don't overflow (2^31 would
-  // definitely be risky; up to 2^30 is probably okay).
-  size_t max_data_pipe_capacity_bytes;
-
-  // Default data pipe capacity, if not specified explicitly in the creation
-  // options. The default is 1MB.
-  size_t default_data_pipe_capacity_bytes;
-
-  // Alignment for the "start" of the data buffer used by data pipes. (The
-  // alignment of elements will depend on this and the element size.)  The
-  // default is 16 bytes.
-  size_t data_pipe_buffer_alignment_bytes;
-
-  // Maximum size of a single shared memory segment, in bytes. The default is
-  // 1GB.
-  //
-  // TODO(vtl): Set this hard limit appropriately (e.g., higher on 64-bit).
-  // (This will also entail some auditing to make sure I'm not messing up my
-  // checks anywhere.)
-  size_t max_shared_memory_num_bytes;
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_CONFIGURATION_H_
diff --git a/mojo/edk/embedder/connection_params.cc b/mojo/edk/embedder/connection_params.cc
deleted file mode 100644
index 9b7ec54..0000000
--- a/mojo/edk/embedder/connection_params.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/connection_params.h"
-
-#include <utility>
-
-namespace mojo {
-namespace edk {
-
-ConnectionParams::ConnectionParams(ScopedPlatformHandle channel)
-    : channel_(std::move(channel)) {}
-
-ConnectionParams::ConnectionParams(ConnectionParams&& param)
-    : channel_(std::move(param.channel_)) {}
-
-ConnectionParams& ConnectionParams::operator=(ConnectionParams&& param) {
-  channel_ = std::move(param.channel_);
-  return *this;
-}
-
-ScopedPlatformHandle ConnectionParams::TakeChannelHandle() {
-  return std::move(channel_);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/connection_params.h b/mojo/edk/embedder/connection_params.h
deleted file mode 100644
index 25ffdde..0000000
--- a/mojo/edk/embedder/connection_params.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_CONNECTION_PARAMS_H_
-#define MOJO_EDK_EMBEDDER_CONNECTION_PARAMS_H_
-
-#include "base/macros.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-class MOJO_SYSTEM_IMPL_EXPORT ConnectionParams {
- public:
-  explicit ConnectionParams(ScopedPlatformHandle channel);
-
-  ConnectionParams(ConnectionParams&& param);
-  ConnectionParams& operator=(ConnectionParams&& param);
-
-  ScopedPlatformHandle TakeChannelHandle();
-
- private:
-  ScopedPlatformHandle channel_;
-
-  DISALLOW_COPY_AND_ASSIGN(ConnectionParams);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_CONNECTION_PARAMS_H_
diff --git a/mojo/edk/embedder/embedder.cc b/mojo/edk/embedder/embedder.cc
deleted file mode 100644
index 0fdda5c..0000000
--- a/mojo/edk/embedder/embedder.cc
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/embedder.h"
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/rand_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/entrypoints.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/node_controller.h"
-
-#if !defined(OS_NACL)
-#include "crypto/random.h"
-#endif
-
-namespace mojo {
-namespace edk {
-
-class Core;
-class PlatformSupport;
-
-namespace internal {
-
-Core* g_core;
-
-Core* GetCore() { return g_core; }
-
-}  // namespace internal
-
-void SetMaxMessageSize(size_t bytes) {
-}
-
-void SetParentPipeHandle(ScopedPlatformHandle pipe) {
-  CHECK(internal::g_core);
-  internal::g_core->InitChild(ConnectionParams(std::move(pipe)));
-}
-
-void SetParentPipeHandleFromCommandLine() {
-  ScopedPlatformHandle platform_channel =
-      PlatformChannelPair::PassClientHandleFromParentProcess(
-          *base::CommandLine::ForCurrentProcess());
-  CHECK(platform_channel.is_valid());
-  SetParentPipeHandle(std::move(platform_channel));
-}
-
-ScopedMessagePipeHandle ConnectToPeerProcess(ScopedPlatformHandle pipe) {
-  return ConnectToPeerProcess(std::move(pipe), GenerateRandomToken());
-}
-
-ScopedMessagePipeHandle ConnectToPeerProcess(ScopedPlatformHandle pipe,
-                                             const std::string& peer_token) {
-  DCHECK(pipe.is_valid());
-  DCHECK(!peer_token.empty());
-  return internal::g_core->ConnectToPeerProcess(std::move(pipe), peer_token);
-}
-
-void ClosePeerConnection(const std::string& peer_token) {
-  return internal::g_core->ClosePeerConnection(peer_token);
-}
-
-void Init() {
-  MojoSystemThunks thunks = MakeSystemThunks();
-  size_t expected_size = MojoEmbedderSetSystemThunks(&thunks);
-  DCHECK_EQ(expected_size, sizeof(thunks));
-
-  internal::g_core = new Core();
-}
-
-void SetDefaultProcessErrorCallback(const ProcessErrorCallback& callback) {
-  internal::g_core->SetDefaultProcessErrorCallback(callback);
-}
-
-MojoResult CreatePlatformHandleWrapper(
-    ScopedPlatformHandle platform_handle,
-    MojoHandle* platform_handle_wrapper_handle) {
-  return internal::g_core->CreatePlatformHandleWrapper(
-      std::move(platform_handle), platform_handle_wrapper_handle);
-}
-
-MojoResult PassWrappedPlatformHandle(MojoHandle platform_handle_wrapper_handle,
-                                     ScopedPlatformHandle* platform_handle) {
-  return internal::g_core->PassWrappedPlatformHandle(
-      platform_handle_wrapper_handle, platform_handle);
-}
-
-MojoResult CreateSharedBufferWrapper(
-    base::SharedMemoryHandle shared_memory_handle,
-    size_t num_bytes,
-    bool read_only,
-    MojoHandle* mojo_wrapper_handle) {
-  return internal::g_core->CreateSharedBufferWrapper(
-      shared_memory_handle, num_bytes, read_only, mojo_wrapper_handle);
-}
-
-MojoResult PassSharedMemoryHandle(
-    MojoHandle mojo_handle,
-    base::SharedMemoryHandle* shared_memory_handle,
-    size_t* num_bytes,
-    bool* read_only) {
-  return internal::g_core->PassSharedMemoryHandle(
-      mojo_handle, shared_memory_handle, num_bytes, read_only);
-}
-
-void InitIPCSupport(scoped_refptr<base::TaskRunner> io_thread_task_runner) {
-  CHECK(internal::g_core);
-  internal::g_core->SetIOTaskRunner(io_thread_task_runner);
-}
-
-scoped_refptr<base::TaskRunner> GetIOTaskRunner() {
-  return internal::g_core->GetNodeController()->io_task_runner();
-}
-
-void ShutdownIPCSupport(const base::Closure& callback) {
-  CHECK(internal::g_core);
-  internal::g_core->RequestShutdown(callback);
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-void SetMachPortProvider(base::PortProvider* port_provider) {
-  DCHECK(port_provider);
-  internal::g_core->SetMachPortProvider(port_provider);
-}
-#endif
-
-ScopedMessagePipeHandle CreateChildMessagePipe(const std::string& token) {
-  return internal::g_core->CreateChildMessagePipe(token);
-}
-
-std::string GenerateRandomToken() {
-  char random_bytes[16];
-#if defined(OS_NACL)
-  // Not secure. For NaCl only!
-  base::RandBytes(random_bytes, 16);
-#else
-  crypto::RandBytes(random_bytes, 16);
-#endif
-  return base::HexEncode(random_bytes, 16);
-}
-
-MojoResult SetProperty(MojoPropertyType type, const void* value) {
-  CHECK(internal::g_core);
-  return internal::g_core->SetProperty(type, value);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/embedder.h b/mojo/edk/embedder/embedder.h
deleted file mode 100644
index 97258e5..0000000
--- a/mojo/edk/embedder/embedder.h
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_EMBEDDER_H_
-#define MOJO_EDK_EMBEDDER_EMBEDDER_H_
-
-#include <stddef.h>
-
-#include <memory>
-#include <string>
-
-#include "base/callback.h"
-#include "base/command_line.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/shared_memory_handle.h"
-#include "base/process/process_handle.h"
-#include "base/task_runner.h"
-#include "mojo/edk/embedder/pending_process_connection.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace base {
-class PortProvider;
-}
-
-namespace mojo {
-namespace edk {
-
-// Basic configuration/initialization ------------------------------------------
-
-// |Init()| sets up the basic Mojo system environment, making the |Mojo...()|
-// functions available and functional. This is never shut down (except in tests
-// -- see test_embedder.h).
-
-// Allows changing the default max message size. Must be called before Init.
-MOJO_SYSTEM_IMPL_EXPORT void SetMaxMessageSize(size_t bytes);
-
-// Should be called as early as possible in a child process with a handle to the
-// other end of a pipe provided in the parent to
-// PendingProcessConnection::Connect.
-MOJO_SYSTEM_IMPL_EXPORT void SetParentPipeHandle(ScopedPlatformHandle pipe);
-
-// Same as above but extracts the pipe handle from the command line. See
-// PlatformChannelPair for details.
-MOJO_SYSTEM_IMPL_EXPORT void SetParentPipeHandleFromCommandLine();
-
-// Called to connect to a peer process. This should be called only if there
-// is no common ancestor for the processes involved within this mojo system.
-// Both processes must call this function, each passing one end of a platform
-// channel. This returns one end of a message pipe to each process.
-MOJO_SYSTEM_IMPL_EXPORT ScopedMessagePipeHandle
-ConnectToPeerProcess(ScopedPlatformHandle pipe);
-
-// Called to connect to a peer process. This should be called only if there
-// is no common ancestor for the processes involved within this mojo system.
-// Both processes must call this function, each passing one end of a platform
-// channel. This returns one end of a message pipe to each process. |peer_token|
-// may be passed to ClosePeerConnection() to close the connection.
-MOJO_SYSTEM_IMPL_EXPORT ScopedMessagePipeHandle
-ConnectToPeerProcess(ScopedPlatformHandle pipe, const std::string& peer_token);
-
-// Closes a connection to a peer process created by ConnectToPeerProcess()
-// where the same |peer_token| was used.
-MOJO_SYSTEM_IMPL_EXPORT void ClosePeerConnection(const std::string& peer_token);
-
-// Must be called first, or just after setting configuration parameters, to
-// initialize the (global, singleton) system.
-MOJO_SYSTEM_IMPL_EXPORT void Init();
-
-// Sets a default callback to invoke when an internal error is reported but
-// cannot be associated with a specific child process.
-MOJO_SYSTEM_IMPL_EXPORT void SetDefaultProcessErrorCallback(
-    const ProcessErrorCallback& callback);
-
-// Basic functions -------------------------------------------------------------
-
-// The functions in this section are available once |Init()| has been called.
-
-// Creates a |MojoHandle| that wraps the given |PlatformHandle| (taking
-// ownership of it). This |MojoHandle| can then, e.g., be passed through message
-// pipes. Note: This takes ownership (and thus closes) |platform_handle| even on
-// failure, which is different from what you'd expect from a Mojo API, but it
-// makes for a more convenient embedder API.
-MOJO_SYSTEM_IMPL_EXPORT MojoResult
-CreatePlatformHandleWrapper(ScopedPlatformHandle platform_handle,
-                            MojoHandle* platform_handle_wrapper_handle);
-
-// Retrieves the |PlatformHandle| that was wrapped into a |MojoHandle| (using
-// |CreatePlatformHandleWrapper()| above). Note that the |MojoHandle| is closed
-// on success.
-MOJO_SYSTEM_IMPL_EXPORT MojoResult
-PassWrappedPlatformHandle(MojoHandle platform_handle_wrapper_handle,
-                          ScopedPlatformHandle* platform_handle);
-
-// Creates a |MojoHandle| that wraps the given |SharedMemoryHandle| (taking
-// ownership of it). |num_bytes| is the size of the shared memory object, and
-// |read_only| is whether the handle is a read-only handle to shared memory.
-// This |MojoHandle| is a Mojo shared buffer and can be manipulated using the
-// shared buffer functions and transferred over a message pipe.
-MOJO_SYSTEM_IMPL_EXPORT MojoResult
-CreateSharedBufferWrapper(base::SharedMemoryHandle shared_memory_handle,
-                          size_t num_bytes,
-                          bool read_only,
-                          MojoHandle* mojo_wrapper_handle);
-
-// Retrieves the underlying |SharedMemoryHandle| from a shared buffer
-// |MojoHandle| and closes the handle. If successful, |num_bytes| will contain
-// the size of the shared memory buffer and |read_only| will contain whether the
-// buffer handle is read-only. Both |num_bytes| and |read_only| may be null.
-// Note: The value of |shared_memory_handle| may be
-// base::SharedMemory::NULLHandle(), even if this function returns success.
-// Callers should perform appropriate checks.
-MOJO_SYSTEM_IMPL_EXPORT MojoResult
-PassSharedMemoryHandle(MojoHandle mojo_handle,
-                       base::SharedMemoryHandle* shared_memory_handle,
-                       size_t* num_bytes,
-                       bool* read_only);
-
-// Initialialization/shutdown for interprocess communication (IPC) -------------
-
-// |InitIPCSupport()| sets up the subsystem for interprocess communication,
-// making the IPC functions (in the following section) available and functional.
-// (This may only be done after |Init()|.)
-//
-// This subsystem may be shut down using |ShutdownIPCSupport()|. None of the IPC
-// functions may be called after this is called.
-//
-// |io_thread_task_runner| should live at least until |ShutdownIPCSupport()|'s
-// callback has been run.
-MOJO_SYSTEM_IMPL_EXPORT void InitIPCSupport(
-    scoped_refptr<base::TaskRunner> io_thread_task_runner);
-
-// Retrieves the TaskRunner used for IPC I/O, as set by InitIPCSupport.
-MOJO_SYSTEM_IMPL_EXPORT scoped_refptr<base::TaskRunner> GetIOTaskRunner();
-
-// Shuts down the subsystem initialized by |InitIPCSupport()|. It be called from
-// any thread and will attempt to complete shutdown on the I/O thread with which
-// the system was initialized. Upon completion, |callback| is invoked on an
-// arbitrary thread.
-MOJO_SYSTEM_IMPL_EXPORT void ShutdownIPCSupport(const base::Closure& callback);
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-// Set the |base::PortProvider| for this process. Can be called on any thread,
-// but must be set in the root process before any Mach ports can be transferred.
-MOJO_SYSTEM_IMPL_EXPORT void SetMachPortProvider(
-    base::PortProvider* port_provider);
-#endif
-
-// Creates a message pipe from a token in a child process. This token must have
-// been acquired by a corresponding call to
-// PendingProcessConnection::CreateMessagePipe.
-MOJO_SYSTEM_IMPL_EXPORT ScopedMessagePipeHandle
-CreateChildMessagePipe(const std::string& token);
-
-// Generates a random ASCII token string for use with various APIs that expect
-// a globally unique token string.
-MOJO_SYSTEM_IMPL_EXPORT std::string GenerateRandomToken();
-
-// Sets system properties that can be read by the MojoGetProperty() API. See the
-// documentation for MojoPropertyType for supported property types and their
-// corresponding value type.
-//
-// Default property values:
-//   |MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED| - true
-MOJO_SYSTEM_IMPL_EXPORT MojoResult SetProperty(MojoPropertyType type,
-                                               const void* value);
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_EMBEDDER_H_
diff --git a/mojo/edk/embedder/embedder_internal.h b/mojo/edk/embedder/embedder_internal.h
deleted file mode 100644
index 7deeca1..0000000
--- a/mojo/edk/embedder/embedder_internal.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This header contains internal details for the *implementation* of the
-// embedder API. It should not be included by any public header (nor by users of
-// the embedder API).
-
-#ifndef MOJO_EDK_EMBEDDER_EMBEDDER_INTERNAL_H_
-#define MOJO_EDK_EMBEDDER_EMBEDDER_INTERNAL_H_
-
-#include <stdint.h>
-
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace base {
-class TaskRunner;
-}
-
-namespace mojo {
-
-namespace edk {
-
-class Broker;
-class Core;
-class ProcessDelegate;
-
-namespace internal {
-
-// Instance of |Broker| to use.
-extern Broker* g_broker;
-
-// Instance of |Core| used by the system functions (|Mojo...()|).
-extern MOJO_SYSTEM_IMPL_EXPORT Core* g_core;
-extern base::TaskRunner* g_delegate_thread_task_runner;
-extern ProcessDelegate* g_process_delegate;
-
-}  // namespace internal
-
-}  // namepace edk
-
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_EMBEDDER_INTERNAL_H_
diff --git a/mojo/edk/embedder/embedder_unittest.cc b/mojo/edk/embedder/embedder_unittest.cc
deleted file mode 100644
index 388b45c..0000000
--- a/mojo/edk/embedder/embedder_unittest.cc
+++ /dev/null
@@ -1,603 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/embedder.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-
-#include <utility>
-
-#include "base/base_paths.h"
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/files/file.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/shared_memory.h"
-#include "base/message_loop/message_loop.h"
-#include "base/path_service.h"
-#include "base/process/process_handle.h"
-#include "base/run_loop.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/test_timeouts.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-#include "mojo/edk/embedder/pending_process_connection.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/embedder/test_embedder.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/core.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-// The multiprocess tests that use these don't compile on iOS.
-#if !defined(OS_IOS)
-const char kHelloWorld[] = "hello world";
-const char kByeWorld[] = "bye world";
-#endif
-
-using EmbedderTest = test::MojoTestBase;
-
-TEST_F(EmbedderTest, ChannelBasic) {
-  MojoHandle server_mp, client_mp;
-  CreateMessagePipe(&server_mp, &client_mp);
-
-  const std::string kHello = "hello";
-
-  // We can write to a message pipe handle immediately.
-  WriteMessage(server_mp, kHello);
-  EXPECT_EQ(kHello, ReadMessage(client_mp));
-
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(server_mp));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(client_mp));
-}
-
-// Verifies that a MP with pending messages to be written can be sent and the
-// pending messages aren't dropped.
-TEST_F(EmbedderTest, SendMessagePipeWithWriteQueue) {
-  MojoHandle server_mp, client_mp;
-  CreateMessagePipe(&server_mp, &client_mp);
-
-  MojoHandle server_mp2, client_mp2;
-  CreateMessagePipe(&server_mp2, &client_mp2);
-
-  static const size_t kNumMessages = 1001;
-  for (size_t i = 1; i <= kNumMessages; i++)
-    WriteMessage(client_mp2, std::string(i, 'A' + (i % 26)));
-
-  // Now send client2.
-  WriteMessageWithHandles(server_mp, "hey", &client_mp2, 1);
-  client_mp2 = MOJO_HANDLE_INVALID;
-
-  // Read client2 just so we can close it later.
-  EXPECT_EQ("hey", ReadMessageWithHandles(client_mp, &client_mp2, 1));
-  EXPECT_NE(MOJO_HANDLE_INVALID, client_mp2);
-
-  // Now verify that all the messages that were written were sent correctly.
-  for (size_t i = 1; i <= kNumMessages; i++)
-    ASSERT_EQ(std::string(i, 'A' + (i % 26)), ReadMessage(server_mp2));
-
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(server_mp2));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(client_mp2));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(server_mp));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(client_mp));
-}
-
-TEST_F(EmbedderTest, ChannelsHandlePassing) {
-  MojoHandle server_mp, client_mp;
-  CreateMessagePipe(&server_mp, &client_mp);
-  EXPECT_NE(server_mp, MOJO_HANDLE_INVALID);
-  EXPECT_NE(client_mp, MOJO_HANDLE_INVALID);
-
-  MojoHandle h0, h1;
-  CreateMessagePipe(&h0, &h1);
-
-  // Write a message to |h0| (attaching nothing).
-  const std::string kHello = "hello";
-  WriteMessage(h0, kHello);
-
-  // Write one message to |server_mp|, attaching |h1|.
-  const std::string kWorld = "world!!!";
-  WriteMessageWithHandles(server_mp, kWorld, &h1, 1);
-  h1 = MOJO_HANDLE_INVALID;
-
-  // Write another message to |h0|.
-  const std::string kFoo = "foo";
-  WriteMessage(h0, kFoo);
-
-  // Wait for |client_mp| to become readable and read a message from it.
-  EXPECT_EQ(kWorld, ReadMessageWithHandles(client_mp, &h1, 1));
-  EXPECT_NE(h1, MOJO_HANDLE_INVALID);
-
-  // Wait for |h1| to become readable and read a message from it.
-  EXPECT_EQ(kHello, ReadMessage(h1));
-
-  // Wait for |h1| to become readable (again) and read its second message.
-  EXPECT_EQ(kFoo, ReadMessage(h1));
-
-  // Write a message to |h1|.
-  const std::string kBarBaz = "barbaz";
-  WriteMessage(h1, kBarBaz);
-
-  // Wait for |h0| to become readable and read a message from it.
-  EXPECT_EQ(kBarBaz, ReadMessage(h0));
-
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(server_mp));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(client_mp));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(h0));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(h1));
-}
-
-TEST_F(EmbedderTest, PipeSetup) {
-  // Ensures that a pending process connection's message pipe can be claimed by
-  // the host process itself.
-  PendingProcessConnection process;
-  std::string pipe_token;
-  ScopedMessagePipeHandle parent_mp = process.CreateMessagePipe(&pipe_token);
-  ScopedMessagePipeHandle child_mp = CreateChildMessagePipe(pipe_token);
-
-  const std::string kHello = "hello";
-  WriteMessage(parent_mp.get().value(), kHello);
-
-  EXPECT_EQ(kHello, ReadMessage(child_mp.get().value()));
-}
-
-TEST_F(EmbedderTest, PipeSetup_LaunchDeath) {
-  PlatformChannelPair pair;
-
-  PendingProcessConnection process;
-  std::string pipe_token;
-  ScopedMessagePipeHandle parent_mp = process.CreateMessagePipe(&pipe_token);
-  process.Connect(base::GetCurrentProcessHandle(),
-                  ConnectionParams(pair.PassServerHandle()));
-
-  // Close the remote end, simulating child death before the child connects to
-  // the reserved port.
-  ignore_result(pair.PassClientHandle());
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(parent_mp.get().value(),
-                                           MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-TEST_F(EmbedderTest, PipeSetup_LaunchFailure) {
-  PlatformChannelPair pair;
-
-  auto process = base::MakeUnique<PendingProcessConnection>();
-  std::string pipe_token;
-  ScopedMessagePipeHandle parent_mp = process->CreateMessagePipe(&pipe_token);
-
-  // Ensure that if a PendingProcessConnection goes away before Connect() is
-  // called, any message pipes associated with it detect peer closure.
-  process.reset();
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(parent_mp.get().value(),
-                                           MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-// The sequence of messages sent is:
-//       server_mp   client_mp   mp0         mp1         mp2         mp3
-//   1.  "hello"
-//   2.              "world!"
-//   3.                          "FOO"
-//   4.  "Bar"+mp1
-//   5.  (close)
-//   6.              (close)
-//   7.                                                              "baz"
-//   8.                                                              (closed)
-//   9.                                      "quux"+mp2
-//  10.                          (close)
-//  11.                                      (wait/cl.)
-//  12.                                                  (wait/cl.)
-
-#if !defined(OS_IOS)
-
-TEST_F(EmbedderTest, MultiprocessChannels) {
-  RUN_CHILD_ON_PIPE(MultiprocessChannelsClient, server_mp)
-    // 1. Write a message to |server_mp| (attaching nothing).
-    WriteMessage(server_mp, "hello");
-
-    // 2. Read a message from |server_mp|.
-    EXPECT_EQ("world!", ReadMessage(server_mp));
-
-    // 3. Create a new message pipe (endpoints |mp0| and |mp1|).
-    MojoHandle mp0, mp1;
-    CreateMessagePipe(&mp0, &mp1);
-
-    // 4. Write something to |mp0|.
-    WriteMessage(mp0, "FOO");
-
-    // 5. Write a message to |server_mp|, attaching |mp1|.
-    WriteMessageWithHandles(server_mp, "Bar", &mp1, 1);
-    mp1 = MOJO_HANDLE_INVALID;
-
-    // 6. Read a message from |mp0|, which should have |mp2| attached.
-    MojoHandle mp2 = MOJO_HANDLE_INVALID;
-    EXPECT_EQ("quux", ReadMessageWithHandles(mp0, &mp2, 1));
-
-    // 7. Read a message from |mp2|.
-    EXPECT_EQ("baz", ReadMessage(mp2));
-
-    // 8. Close |mp0|.
-    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp0));
-
-    // 9. Tell the client to quit.
-    WriteMessage(server_mp, "quit");
-
-    // 10. Wait on |mp2| (which should eventually fail) and then close it.
-    MojoHandleSignalsState state;
-    ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-              WaitForSignals(mp2, MOJO_HANDLE_SIGNAL_READABLE, &state));
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
-
-    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp2));
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MultiprocessChannelsClient, EmbedderTest,
-                                  client_mp) {
-  // 1. Read the first message from |client_mp|.
-  EXPECT_EQ("hello", ReadMessage(client_mp));
-
-  // 2. Write a message to |client_mp| (attaching nothing).
-  WriteMessage(client_mp, "world!");
-
-  // 4. Read a message from |client_mp|, which should have |mp1| attached.
-  MojoHandle mp1;
-  EXPECT_EQ("Bar", ReadMessageWithHandles(client_mp, &mp1, 1));
-
-  // 5. Create a new message pipe (endpoints |mp2| and |mp3|).
-  MojoHandle mp2, mp3;
-  CreateMessagePipe(&mp2, &mp3);
-
-  // 6. Write a message to |mp3|.
-  WriteMessage(mp3, "baz");
-
-  // 7. Close |mp3|.
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp3));
-
-  // 8. Write a message to |mp1|, attaching |mp2|.
-  WriteMessageWithHandles(mp1, "quux", &mp2, 1);
-  mp2 = MOJO_HANDLE_INVALID;
-
-  // 9. Read a message from |mp1|.
-  EXPECT_EQ("FOO", ReadMessage(mp1));
-
-  EXPECT_EQ("quit", ReadMessage(client_mp));
-
-  // 10. Wait on |mp1| (which should eventually fail) and then close it.
-  MojoHandleSignalsState state;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitForSignals(mp1, MOJO_HANDLE_SIGNAL_READABLE, &state));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp1));
-}
-
-TEST_F(EmbedderTest, MultiprocessBaseSharedMemory) {
-  RUN_CHILD_ON_PIPE(MultiprocessSharedMemoryClient, server_mp)
-    // 1. Create a base::SharedMemory object and create a mojo shared buffer
-    // from it.
-    base::SharedMemoryCreateOptions options;
-    options.size = 123;
-    base::SharedMemory shared_memory;
-    ASSERT_TRUE(shared_memory.Create(options));
-    base::SharedMemoryHandle shm_handle = base::SharedMemory::DuplicateHandle(
-        shared_memory.handle());
-    MojoHandle sb1;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              CreateSharedBufferWrapper(shm_handle, 123, false, &sb1));
-
-    // 2. Map |sb1| and write something into it.
-    char* buffer = nullptr;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoMapBuffer(sb1, 0, 123, reinterpret_cast<void**>(&buffer), 0));
-    ASSERT_TRUE(buffer);
-    memcpy(buffer, kHelloWorld, sizeof(kHelloWorld));
-
-    // 3. Duplicate |sb1| into |sb2| and pass to |server_mp|.
-    MojoHandle sb2 = MOJO_HANDLE_INVALID;
-    EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(sb1, 0, &sb2));
-    EXPECT_NE(MOJO_HANDLE_INVALID, sb2);
-    WriteMessageWithHandles(server_mp, "hello", &sb2, 1);
-
-    // 4. Read a message from |server_mp|.
-    EXPECT_EQ("bye", ReadMessage(server_mp));
-
-    // 5. Expect that the contents of the shared buffer have changed.
-    EXPECT_EQ(kByeWorld, std::string(buffer));
-
-    // 6. Map the original base::SharedMemory and expect it contains the
-    // expected value.
-    ASSERT_TRUE(shared_memory.Map(123));
-    EXPECT_EQ(kByeWorld,
-              std::string(static_cast<char*>(shared_memory.memory())));
-
-    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(sb1));
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MultiprocessSharedMemoryClient, EmbedderTest,
-                                  client_mp) {
-  // 1. Read the first message from |client_mp|, which should have |sb1| which
-  // should be a shared buffer handle.
-  MojoHandle sb1;
-  EXPECT_EQ("hello", ReadMessageWithHandles(client_mp, &sb1, 1));
-
-  // 2. Map |sb1|.
-  char* buffer = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(sb1, 0, 123, reinterpret_cast<void**>(&buffer), 0));
-  ASSERT_TRUE(buffer);
-
-  // 3. Ensure |buffer| contains the values we expect.
-  EXPECT_EQ(kHelloWorld, std::string(buffer));
-
-  // 4. Write into |buffer| and send a message back.
-  memcpy(buffer, kByeWorld, sizeof(kByeWorld));
-  WriteMessage(client_mp, "bye");
-
-  // 5. Extract the shared memory handle and ensure we can map it and read the
-  // contents.
-  base::SharedMemoryHandle shm_handle;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            PassSharedMemoryHandle(sb1, &shm_handle, nullptr, nullptr));
-  base::SharedMemory shared_memory(shm_handle, false);
-  ASSERT_TRUE(shared_memory.Map(123));
-  EXPECT_NE(buffer, shared_memory.memory());
-  EXPECT_EQ(kByeWorld, std::string(static_cast<char*>(shared_memory.memory())));
-
-  // 6. Close |sb1|. Should fail because |PassSharedMemoryHandle()| should have
-  // closed the handle.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(sb1));
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-TEST_F(EmbedderTest, MultiprocessMachSharedMemory) {
-  RUN_CHILD_ON_PIPE(MultiprocessSharedMemoryClient, server_mp)
-    // 1. Create a Mach base::SharedMemory object and create a mojo shared
-    // buffer from it.
-    base::SharedMemoryCreateOptions options;
-    options.size = 123;
-    base::SharedMemory shared_memory;
-    ASSERT_TRUE(shared_memory.Create(options));
-    base::SharedMemoryHandle shm_handle = base::SharedMemory::DuplicateHandle(
-        shared_memory.handle());
-    MojoHandle sb1;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              CreateSharedBufferWrapper(shm_handle, 123, false, &sb1));
-
-    // 2. Map |sb1| and write something into it.
-    char* buffer = nullptr;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoMapBuffer(sb1, 0, 123, reinterpret_cast<void**>(&buffer), 0));
-    ASSERT_TRUE(buffer);
-    memcpy(buffer, kHelloWorld, sizeof(kHelloWorld));
-
-    // 3. Duplicate |sb1| into |sb2| and pass to |server_mp|.
-    MojoHandle sb2 = MOJO_HANDLE_INVALID;
-    EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(sb1, 0, &sb2));
-    EXPECT_NE(MOJO_HANDLE_INVALID, sb2);
-    WriteMessageWithHandles(server_mp, "hello", &sb2, 1);
-
-    // 4. Read a message from |server_mp|.
-    EXPECT_EQ("bye", ReadMessage(server_mp));
-
-    // 5. Expect that the contents of the shared buffer have changed.
-    EXPECT_EQ(kByeWorld, std::string(buffer));
-
-    // 6. Map the original base::SharedMemory and expect it contains the
-    // expected value.
-    ASSERT_TRUE(shared_memory.Map(123));
-    EXPECT_EQ(kByeWorld,
-              std::string(static_cast<char*>(shared_memory.memory())));
-
-    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(sb1));
-  END_CHILD()
-}
-
-enum class HandleType {
-  POSIX,
-  MACH,
-  MACH_NULL,
-};
-
-const HandleType kTestHandleTypes[] = {
-  HandleType::MACH,
-  HandleType::MACH_NULL,
-  HandleType::POSIX,
-  HandleType::POSIX,
-  HandleType::MACH,
-};
-
-// Test that we can mix file descriptors and mach port handles.
-TEST_F(EmbedderTest, MultiprocessMixMachAndFds) {
-  const size_t kShmSize = 1234;
-  RUN_CHILD_ON_PIPE(MultiprocessMixMachAndFdsClient, server_mp)
-    // 1. Create fds or Mach objects and mojo handles from them.
-    MojoHandle platform_handles[arraysize(kTestHandleTypes)];
-    for (size_t i = 0; i < arraysize(kTestHandleTypes); i++) {
-      const auto type = kTestHandleTypes[i];
-      ScopedPlatformHandle scoped_handle;
-      if (type == HandleType::POSIX) {
-        // The easiest source of fds is opening /dev/null.
-        base::File file(base::FilePath("/dev/null"),
-                        base::File::FLAG_OPEN | base::File::FLAG_WRITE);
-        ASSERT_TRUE(file.IsValid());
-        scoped_handle.reset(PlatformHandle(file.TakePlatformFile()));
-        EXPECT_EQ(PlatformHandle::Type::POSIX, scoped_handle.get().type);
-      } else if (type == HandleType::MACH_NULL) {
-        scoped_handle.reset(PlatformHandle(
-            static_cast<mach_port_t>(MACH_PORT_NULL)));
-        EXPECT_EQ(PlatformHandle::Type::MACH, scoped_handle.get().type);
-      } else {
-        base::SharedMemoryCreateOptions options;
-        options.size = kShmSize;
-        base::SharedMemory shared_memory;
-        ASSERT_TRUE(shared_memory.Create(options));
-        base::SharedMemoryHandle shm_handle =
-            base::SharedMemory::DuplicateHandle(shared_memory.handle());
-        scoped_handle.reset(PlatformHandle(shm_handle.GetMemoryObject()));
-        EXPECT_EQ(PlatformHandle::Type::MACH, scoped_handle.get().type);
-      }
-      ASSERT_EQ(MOJO_RESULT_OK, CreatePlatformHandleWrapper(
-          std::move(scoped_handle), platform_handles + i));
-    }
-
-    // 2. Send all the handles to the child.
-    WriteMessageWithHandles(server_mp, "hello", platform_handles,
-                            arraysize(kTestHandleTypes));
-
-    // 3. Read a message from |server_mp|.
-    EXPECT_EQ("bye", ReadMessage(server_mp));
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MultiprocessMixMachAndFdsClient, EmbedderTest,
-                                  client_mp) {
-  const int kNumHandles = arraysize(kTestHandleTypes);
-  MojoHandle platform_handles[kNumHandles];
-
-  // 1. Read from |client_mp|, which should have a message containing
-  // |kNumHandles| handles.
-  EXPECT_EQ("hello",
-            ReadMessageWithHandles(client_mp, platform_handles, kNumHandles));
-
-  // 2. Extract each handle, and verify the type.
-  for (int i = 0; i < kNumHandles; i++) {
-    const auto type = kTestHandleTypes[i];
-    ScopedPlatformHandle scoped_handle;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              PassWrappedPlatformHandle(platform_handles[i], &scoped_handle));
-    if (type == HandleType::POSIX) {
-      EXPECT_NE(0, scoped_handle.get().handle);
-      EXPECT_EQ(PlatformHandle::Type::POSIX, scoped_handle.get().type);
-    } else if (type == HandleType::MACH_NULL) {
-      EXPECT_EQ(static_cast<mach_port_t>(MACH_PORT_NULL),
-                scoped_handle.get().port);
-      EXPECT_EQ(PlatformHandle::Type::MACH, scoped_handle.get().type);
-    } else {
-      EXPECT_NE(static_cast<mach_port_t>(MACH_PORT_NULL),
-                scoped_handle.get().port);
-      EXPECT_EQ(PlatformHandle::Type::MACH, scoped_handle.get().type);
-    }
-  }
-
-  // 3. Say bye!
-  WriteMessage(client_mp, "bye");
-}
-
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-// TODO(vtl): Test immediate write & close.
-// TODO(vtl): Test broken-connection cases.
-
-#endif  // !defined(OS_IOS)
-
-NamedPlatformHandle GenerateChannelName() {
-#if defined(OS_POSIX)
-  base::FilePath temp_dir;
-  CHECK(base::PathService::Get(base::DIR_TEMP, &temp_dir));
-  return NamedPlatformHandle(
-      temp_dir.AppendASCII(GenerateRandomToken()).value());
-#else
-  return NamedPlatformHandle(GenerateRandomToken());
-#endif
-}
-
-void CreateClientHandleOnIoThread(const NamedPlatformHandle& named_handle,
-                                  ScopedPlatformHandle* output) {
-  *output = CreateClientHandle(named_handle);
-}
-
-TEST_F(EmbedderTest, ClosePendingPeerConnection) {
-  NamedPlatformHandle named_handle = GenerateChannelName();
-  std::string peer_token = GenerateRandomToken();
-  ScopedMessagePipeHandle server_pipe =
-      ConnectToPeerProcess(CreateServerHandle(named_handle), peer_token);
-  ClosePeerConnection(peer_token);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            Wait(server_pipe.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-  base::MessageLoop message_loop;
-  base::RunLoop run_loop;
-  ScopedPlatformHandle client_handle;
-  // Closing the channel involves posting a task to the IO thread to do the
-  // work. By the time the local message pipe has been observerd as closed,
-  // that task will have been posted. Therefore, a task to create the client
-  // connection should be handled after the channel is closed.
-  GetIOTaskRunner()->PostTaskAndReply(
-      FROM_HERE,
-      base::Bind(&CreateClientHandleOnIoThread, named_handle, &client_handle),
-      run_loop.QuitClosure());
-  run_loop.Run();
-  EXPECT_FALSE(client_handle.is_valid());
-}
-
-#if !defined(OS_IOS)
-
-TEST_F(EmbedderTest, ClosePipeToConnectedPeer) {
-  set_launch_type(LaunchType::PEER);
-  auto& controller = StartClient("ClosePipeToConnectedPeerClient");
-  MojoHandle server_mp = controller.pipe();
-  // 1. Write a message to |server_mp| (attaching nothing).
-  WriteMessage(server_mp, "hello");
-
-  // 2. Read a message from |server_mp|.
-  EXPECT_EQ("world!", ReadMessage(server_mp));
-
-  controller.ClosePeerConnection();
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(server_mp, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  EXPECT_EQ(0, controller.WaitForShutdown());
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ClosePipeToConnectedPeerClient, EmbedderTest,
-                                  client_mp) {
-  // 1. Read the first message from |client_mp|.
-  EXPECT_EQ("hello", ReadMessage(client_mp));
-
-  // 2. Write a message to |client_mp| (attaching nothing).
-  WriteMessage(client_mp, "world!");
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(client_mp, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-TEST_F(EmbedderTest, ClosePipeToConnectingPeer) {
-  set_launch_type(LaunchType::PEER);
-  auto& controller = StartClient("ClosePipeToConnectingPeerClient");
-  controller.ClosePeerConnection();
-
-  MojoHandle server_mp = controller.pipe();
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(server_mp, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  EXPECT_EQ(0, controller.WaitForShutdown());
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ClosePipeToConnectingPeerClient, EmbedderTest,
-                                  client_mp) {
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(client_mp, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-#endif  // !defined(OS_IOS)
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/entrypoints.cc b/mojo/edk/embedder/entrypoints.cc
deleted file mode 100644
index 9081368..0000000
--- a/mojo/edk/embedder/entrypoints.cc
+++ /dev/null
@@ -1,283 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/entrypoints.h"
-
-#include <stdint.h>
-
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/c/system/platform_handle.h"
-
-using mojo::edk::internal::g_core;
-
-// Definitions of the system functions.
-extern "C" {
-
-MojoTimeTicks MojoGetTimeTicksNowImpl() {
-  return g_core->GetTimeTicksNow();
-}
-
-MojoResult MojoCloseImpl(MojoHandle handle) {
-  return g_core->Close(handle);
-}
-
-MojoResult MojoQueryHandleSignalsStateImpl(
-    MojoHandle handle,
-    MojoHandleSignalsState* signals_state) {
-  return g_core->QueryHandleSignalsState(handle, signals_state);
-}
-
-MojoResult MojoCreateWatcherImpl(MojoWatcherCallback callback,
-                                 MojoHandle* watcher_handle) {
-  return g_core->CreateWatcher(callback, watcher_handle);
-}
-
-MojoResult MojoArmWatcherImpl(MojoHandle watcher_handle,
-                              uint32_t* num_ready_contexts,
-                              uintptr_t* ready_contexts,
-                              MojoResult* ready_results,
-                              MojoHandleSignalsState* ready_signals_states) {
-  return g_core->ArmWatcher(watcher_handle, num_ready_contexts, ready_contexts,
-                            ready_results, ready_signals_states);
-}
-
-MojoResult MojoWatchImpl(MojoHandle watcher_handle,
-                         MojoHandle handle,
-                         MojoHandleSignals signals,
-                         uintptr_t context) {
-  return g_core->Watch(watcher_handle, handle, signals, context);
-}
-
-MojoResult MojoCancelWatchImpl(MojoHandle watcher_handle, uintptr_t context) {
-  return g_core->CancelWatch(watcher_handle, context);
-}
-
-MojoResult MojoAllocMessageImpl(uint32_t num_bytes,
-                                const MojoHandle* handles,
-                                uint32_t num_handles,
-                                MojoAllocMessageFlags flags,
-                                MojoMessageHandle* message) {
-  return g_core->AllocMessage(num_bytes, handles, num_handles, flags, message);
-}
-
-MojoResult MojoFreeMessageImpl(MojoMessageHandle message) {
-  return g_core->FreeMessage(message);
-}
-
-MojoResult MojoGetMessageBufferImpl(MojoMessageHandle message, void** buffer) {
-  return g_core->GetMessageBuffer(message, buffer);
-}
-
-MojoResult MojoCreateMessagePipeImpl(
-    const MojoCreateMessagePipeOptions* options,
-    MojoHandle* message_pipe_handle0,
-    MojoHandle* message_pipe_handle1) {
-  return g_core->CreateMessagePipe(options, message_pipe_handle0,
-                                   message_pipe_handle1);
-}
-
-MojoResult MojoWriteMessageImpl(MojoHandle message_pipe_handle,
-                                const void* bytes,
-                                uint32_t num_bytes,
-                                const MojoHandle* handles,
-                                uint32_t num_handles,
-                                MojoWriteMessageFlags flags) {
-  return g_core->WriteMessage(message_pipe_handle, bytes, num_bytes, handles,
-                              num_handles, flags);
-}
-
-MojoResult MojoWriteMessageNewImpl(MojoHandle message_pipe_handle,
-                                   MojoMessageHandle message,
-                                   MojoWriteMessageFlags flags) {
-  return g_core->WriteMessageNew(message_pipe_handle, message, flags);
-}
-
-MojoResult MojoReadMessageImpl(MojoHandle message_pipe_handle,
-                               void* bytes,
-                               uint32_t* num_bytes,
-                               MojoHandle* handles,
-                               uint32_t* num_handles,
-                               MojoReadMessageFlags flags) {
-  return g_core->ReadMessage(
-      message_pipe_handle, bytes, num_bytes, handles, num_handles, flags);
-}
-
-MojoResult MojoReadMessageNewImpl(MojoHandle message_pipe_handle,
-                                  MojoMessageHandle* message,
-                                  uint32_t* num_bytes,
-                                  MojoHandle* handles,
-                                  uint32_t* num_handles,
-                                  MojoReadMessageFlags flags) {
-  return g_core->ReadMessageNew(
-      message_pipe_handle, message, num_bytes, handles, num_handles, flags);
-}
-
-MojoResult MojoFuseMessagePipesImpl(MojoHandle handle0, MojoHandle handle1) {
-  return g_core->FuseMessagePipes(handle0, handle1);
-}
-
-MojoResult MojoCreateDataPipeImpl(const MojoCreateDataPipeOptions* options,
-                                  MojoHandle* data_pipe_producer_handle,
-                                  MojoHandle* data_pipe_consumer_handle) {
-  return g_core->CreateDataPipe(options, data_pipe_producer_handle,
-                                data_pipe_consumer_handle);
-}
-
-MojoResult MojoWriteDataImpl(MojoHandle data_pipe_producer_handle,
-                             const void* elements,
-                             uint32_t* num_elements,
-                             MojoWriteDataFlags flags) {
-  return g_core->WriteData(data_pipe_producer_handle, elements, num_elements,
-                           flags);
-}
-
-MojoResult MojoBeginWriteDataImpl(MojoHandle data_pipe_producer_handle,
-                                  void** buffer,
-                                  uint32_t* buffer_num_elements,
-                                  MojoWriteDataFlags flags) {
-  return g_core->BeginWriteData(data_pipe_producer_handle, buffer,
-                                buffer_num_elements, flags);
-}
-
-MojoResult MojoEndWriteDataImpl(MojoHandle data_pipe_producer_handle,
-                                uint32_t num_elements_written) {
-  return g_core->EndWriteData(data_pipe_producer_handle, num_elements_written);
-}
-
-MojoResult MojoReadDataImpl(MojoHandle data_pipe_consumer_handle,
-                            void* elements,
-                            uint32_t* num_elements,
-                            MojoReadDataFlags flags) {
-  return g_core->ReadData(data_pipe_consumer_handle, elements, num_elements,
-                          flags);
-}
-
-MojoResult MojoBeginReadDataImpl(MojoHandle data_pipe_consumer_handle,
-                                 const void** buffer,
-                                 uint32_t* buffer_num_elements,
-                                 MojoReadDataFlags flags) {
-  return g_core->BeginReadData(data_pipe_consumer_handle, buffer,
-                               buffer_num_elements, flags);
-}
-
-MojoResult MojoEndReadDataImpl(MojoHandle data_pipe_consumer_handle,
-                               uint32_t num_elements_read) {
-  return g_core->EndReadData(data_pipe_consumer_handle, num_elements_read);
-}
-
-MojoResult MojoCreateSharedBufferImpl(
-    const struct MojoCreateSharedBufferOptions* options,
-    uint64_t num_bytes,
-    MojoHandle* shared_buffer_handle) {
-  return g_core->CreateSharedBuffer(options, num_bytes, shared_buffer_handle);
-}
-
-MojoResult MojoDuplicateBufferHandleImpl(
-    MojoHandle buffer_handle,
-    const struct MojoDuplicateBufferHandleOptions* options,
-    MojoHandle* new_buffer_handle) {
-  return g_core->DuplicateBufferHandle(buffer_handle, options,
-                                       new_buffer_handle);
-}
-
-MojoResult MojoMapBufferImpl(MojoHandle buffer_handle,
-                             uint64_t offset,
-                             uint64_t num_bytes,
-                             void** buffer,
-                             MojoMapBufferFlags flags) {
-  return g_core->MapBuffer(buffer_handle, offset, num_bytes, buffer, flags);
-}
-
-MojoResult MojoUnmapBufferImpl(void* buffer) {
-  return g_core->UnmapBuffer(buffer);
-}
-
-MojoResult MojoWrapPlatformHandleImpl(const MojoPlatformHandle* platform_handle,
-                                      MojoHandle* mojo_handle) {
-  return g_core->WrapPlatformHandle(platform_handle, mojo_handle);
-}
-
-MojoResult MojoUnwrapPlatformHandleImpl(MojoHandle mojo_handle,
-                                        MojoPlatformHandle* platform_handle) {
-  return g_core->UnwrapPlatformHandle(mojo_handle, platform_handle);
-}
-
-MojoResult MojoWrapPlatformSharedBufferHandleImpl(
-    const MojoPlatformHandle* platform_handle,
-    size_t num_bytes,
-    MojoPlatformSharedBufferHandleFlags flags,
-    MojoHandle* mojo_handle) {
-  return g_core->WrapPlatformSharedBufferHandle(platform_handle, num_bytes,
-                                                flags, mojo_handle);
-}
-
-MojoResult MojoUnwrapPlatformSharedBufferHandleImpl(
-    MojoHandle mojo_handle,
-    MojoPlatformHandle* platform_handle,
-    size_t* num_bytes,
-    MojoPlatformSharedBufferHandleFlags* flags) {
-  return g_core->UnwrapPlatformSharedBufferHandle(mojo_handle, platform_handle,
-                                                  num_bytes, flags);
-}
-
-MojoResult MojoNotifyBadMessageImpl(MojoMessageHandle message,
-                                    const char* error,
-                                    size_t error_num_bytes) {
-  return g_core->NotifyBadMessage(message, error, error_num_bytes);
-}
-
-MojoResult MojoGetPropertyImpl(MojoPropertyType type, void* value) {
-  return g_core->GetProperty(type, value);
-}
-
-}  // extern "C"
-
-namespace mojo {
-namespace edk {
-
-MojoSystemThunks MakeSystemThunks() {
-  MojoSystemThunks system_thunks = {sizeof(MojoSystemThunks),
-                                    MojoGetTimeTicksNowImpl,
-                                    MojoCloseImpl,
-                                    MojoQueryHandleSignalsStateImpl,
-                                    MojoCreateMessagePipeImpl,
-                                    MojoWriteMessageImpl,
-                                    MojoReadMessageImpl,
-                                    MojoCreateDataPipeImpl,
-                                    MojoWriteDataImpl,
-                                    MojoBeginWriteDataImpl,
-                                    MojoEndWriteDataImpl,
-                                    MojoReadDataImpl,
-                                    MojoBeginReadDataImpl,
-                                    MojoEndReadDataImpl,
-                                    MojoCreateSharedBufferImpl,
-                                    MojoDuplicateBufferHandleImpl,
-                                    MojoMapBufferImpl,
-                                    MojoUnmapBufferImpl,
-                                    MojoCreateWatcherImpl,
-                                    MojoWatchImpl,
-                                    MojoCancelWatchImpl,
-                                    MojoArmWatcherImpl,
-                                    MojoFuseMessagePipesImpl,
-                                    MojoWriteMessageNewImpl,
-                                    MojoReadMessageNewImpl,
-                                    MojoAllocMessageImpl,
-                                    MojoFreeMessageImpl,
-                                    MojoGetMessageBufferImpl,
-                                    MojoWrapPlatformHandleImpl,
-                                    MojoUnwrapPlatformHandleImpl,
-                                    MojoWrapPlatformSharedBufferHandleImpl,
-                                    MojoUnwrapPlatformSharedBufferHandleImpl,
-                                    MojoNotifyBadMessageImpl,
-                                    MojoGetPropertyImpl};
-  return system_thunks;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/entrypoints.h b/mojo/edk/embedder/entrypoints.h
deleted file mode 100644
index 8e448c1..0000000
--- a/mojo/edk/embedder/entrypoints.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_ENTRYPOINTS_H_
-#define MOJO_EDK_EMBEDDER_ENTRYPOINTS_H_
-
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/thunks.h"
-
-namespace mojo {
-namespace edk {
-
-// Creates a MojoSystemThunks struct populated with the EDK's implementation of
-// each function. This may be used by embedders to populate thunks for
-// application loading.
-MOJO_SYSTEM_IMPL_EXPORT MojoSystemThunks MakeSystemThunks();
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_ENTRYPOINTS_H_
diff --git a/mojo/edk/embedder/named_platform_channel_pair.h b/mojo/edk/embedder/named_platform_channel_pair.h
deleted file mode 100644
index 5a83ae3..0000000
--- a/mojo/edk/embedder/named_platform_channel_pair.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_NAMED_PLATFORM_CHANNEL_PAIR_H_
-#define MOJO_EDK_EMBEDDER_NAMED_PLATFORM_CHANNEL_PAIR_H_
-
-#include <string>
-
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace base {
-class CommandLine;
-}
-
-namespace mojo {
-namespace edk {
-
-// This is used to create a named bidirectional pipe to connect new child
-// processes. The resulting server handle should be passed to the EDK, and the
-// child end passed as a pipe name on the command line to the child process. The
-// child process can then retrieve the pipe name from the command line and
-// resolve it into a client handle.
-class MOJO_SYSTEM_IMPL_EXPORT NamedPlatformChannelPair {
- public:
-  struct Options {
-#if defined(OS_WIN)
-    // If non-empty, a security descriptor to use when creating the pipe. If
-    // empty, a default security descriptor will be used. See
-    // kDefaultSecurityDescriptor in named_platform_handle_utils_win.cc.
-    base::string16 security_descriptor;
-#endif
-  };
-
-  NamedPlatformChannelPair(const Options& options = {});
-  ~NamedPlatformChannelPair();
-
-  // Note: It is NOT acceptable to use this handle as a generic pipe channel. It
-  // MUST be passed to PendingProcessConnection::Connect() only.
-  ScopedPlatformHandle PassServerHandle();
-
-  // To be called in the child process, after the parent process called
-  // |PrepareToPassClientHandleToChildProcess()| and launched the child (using
-  // the provided data), to create a client handle connected to the server
-  // handle (in the parent process).
-  static ScopedPlatformHandle PassClientHandleFromParentProcess(
-      const base::CommandLine& command_line);
-
-  // Prepares to pass the client channel to a new child process, to be launched
-  // using |LaunchProcess()| (from base/launch.h). Modifies |*command_line| and
-  // |*handle_passing_info| as needed.
-  // Note: For Windows, this method only works on Vista and later.
-  void PrepareToPassClientHandleToChildProcess(
-      base::CommandLine* command_line) const;
-
-  const NamedPlatformHandle& handle() const { return pipe_handle_; }
-
- private:
-  NamedPlatformHandle pipe_handle_;
-  ScopedPlatformHandle server_handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(NamedPlatformChannelPair);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_NAMED_PLATFORM_CHANNEL_PAIR_H_
diff --git a/mojo/edk/embedder/named_platform_channel_pair_win.cc b/mojo/edk/embedder/named_platform_channel_pair_win.cc
deleted file mode 100644
index 96589ff..0000000
--- a/mojo/edk/embedder/named_platform_channel_pair_win.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/named_platform_channel_pair.h"
-
-#include <windows.h>
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/rand_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/win/windows_version.h"
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-#include "mojo/edk/embedder/platform_handle.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-const char kMojoNamedPlatformChannelPipeSwitch[] =
-    "mojo-named-platform-channel-pipe";
-
-std::wstring GeneratePipeName() {
-  return base::StringPrintf(L"%u.%u.%I64u", GetCurrentProcessId(),
-                            GetCurrentThreadId(), base::RandUint64());
-}
-
-}  // namespace
-
-NamedPlatformChannelPair::NamedPlatformChannelPair(
-    const NamedPlatformChannelPair::Options& options)
-    : pipe_handle_(GeneratePipeName()) {
-  CreateServerHandleOptions server_handle_options;
-  server_handle_options.security_descriptor = options.security_descriptor;
-  server_handle_options.enforce_uniqueness = true;
-  server_handle_ = CreateServerHandle(pipe_handle_, server_handle_options);
-  PCHECK(server_handle_.is_valid());
-}
-
-NamedPlatformChannelPair::~NamedPlatformChannelPair() {}
-
-ScopedPlatformHandle NamedPlatformChannelPair::PassServerHandle() {
-  return std::move(server_handle_);
-}
-
-// static
-ScopedPlatformHandle
-NamedPlatformChannelPair::PassClientHandleFromParentProcess(
-    const base::CommandLine& command_line) {
-  // In order to support passing the pipe name on the command line, the pipe
-  // handle is lazily created from the pipe name when requested.
-  NamedPlatformHandle handle(
-      command_line.GetSwitchValueNative(kMojoNamedPlatformChannelPipeSwitch));
-
-  if (!handle.is_valid())
-    return ScopedPlatformHandle();
-
-  return CreateClientHandle(handle);
-}
-
-void NamedPlatformChannelPair::PrepareToPassClientHandleToChildProcess(
-    base::CommandLine* command_line) const {
-  DCHECK(command_line);
-
-  // Log a warning if the command line already has the switch, but "clobber" it
-  // anyway, since it's reasonably likely that all the switches were just copied
-  // from the parent.
-  LOG_IF(WARNING,
-         command_line->HasSwitch(kMojoNamedPlatformChannelPipeSwitch))
-      << "Child command line already has switch --"
-      << kMojoNamedPlatformChannelPipeSwitch << "="
-      << command_line->GetSwitchValueNative(
-          kMojoNamedPlatformChannelPipeSwitch);
-  // (Any existing switch won't actually be removed from the command line, but
-  // the last one appended takes precedence.)
-  command_line->AppendSwitchNative(kMojoNamedPlatformChannelPipeSwitch,
-                                   pipe_handle_.name);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/named_platform_handle.h b/mojo/edk/embedder/named_platform_handle.h
deleted file mode 100644
index 15ca656..0000000
--- a/mojo/edk/embedder/named_platform_handle.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_H_
-#define MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_H_
-
-#include <string>
-
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build/build_config.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-#if defined(OS_POSIX)
-struct MOJO_SYSTEM_IMPL_EXPORT NamedPlatformHandle {
-  NamedPlatformHandle() {}
-  explicit NamedPlatformHandle(const base::StringPiece& name)
-      : name(name.as_string()) {}
-
-  bool is_valid() const { return !name.empty(); }
-
-  std::string name;
-};
-#elif defined(OS_WIN)
-struct MOJO_SYSTEM_IMPL_EXPORT NamedPlatformHandle {
-  NamedPlatformHandle() {}
-  explicit NamedPlatformHandle(const base::StringPiece& name)
-      : name(base::UTF8ToUTF16(name)) {}
-
-  explicit NamedPlatformHandle(const base::StringPiece16& name)
-      : name(name.as_string()) {}
-
-  bool is_valid() const { return !name.empty(); }
-
-  base::string16 pipe_name() const { return L"\\\\.\\pipe\\mojo." + name; }
-
-  base::string16 name;
-};
-#else
-#error "Platform not yet supported."
-#endif
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_H_
diff --git a/mojo/edk/embedder/named_platform_handle_utils.h b/mojo/edk/embedder/named_platform_handle_utils.h
deleted file mode 100644
index b767ea0..0000000
--- a/mojo/edk/embedder/named_platform_handle_utils.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_UTILS_H_
-#define MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_UTILS_H_
-
-#include "build/build_config.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-#if defined(OS_WIN)
-#include "base/strings/string16.h"
-#endif
-
-namespace mojo {
-namespace edk {
-
-struct NamedPlatformHandle;
-
-#if defined(OS_POSIX)
-
-// The maximum length of the name of a unix domain socket. The standard size on
-// linux is 108, mac is 104. To maintain consistency across platforms we
-// standardize on the smaller value.
-const size_t kMaxSocketNameLength = 104;
-
-#endif
-
-struct CreateServerHandleOptions {
-#if defined(OS_WIN)
-  // If true, creating a server handle will fail if another pipe with the same
-  // name exists.
-  bool enforce_uniqueness = true;
-
-  // If non-empty, a security descriptor to use when creating the pipe. If
-  // empty, a default security descriptor will be used. See
-  // kDefaultSecurityDescriptor in named_platform_handle_utils_win.cc.
-  base::string16 security_descriptor;
-#endif
-};
-
-// Creates a client platform handle from |handle|. This may block until |handle|
-// is ready to receive connections.
-MOJO_SYSTEM_IMPL_EXPORT ScopedPlatformHandle
-CreateClientHandle(const NamedPlatformHandle& handle);
-
-// Creates a server platform handle from |handle|.
-MOJO_SYSTEM_IMPL_EXPORT ScopedPlatformHandle
-CreateServerHandle(const NamedPlatformHandle& handle,
-                   const CreateServerHandleOptions& options = {});
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_UTILS_H_
diff --git a/mojo/edk/embedder/named_platform_handle_utils_posix.cc b/mojo/edk/embedder/named_platform_handle_utils_posix.cc
deleted file mode 100644
index 056f4d6..0000000
--- a/mojo/edk/embedder/named_platform_handle_utils_posix.cc
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-
-#include <errno.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <unistd.h>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/posix/eintr_wrapper.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-// This function fills in |unix_addr| with the appropriate data for the socket,
-// and sets |unix_addr_len| to the length of the data therein.
-// Returns true on success, or false on failure (typically because |handle.name|
-// violated the naming rules).
-bool MakeUnixAddr(const NamedPlatformHandle& handle,
-                  struct sockaddr_un* unix_addr,
-                  size_t* unix_addr_len) {
-  DCHECK(unix_addr);
-  DCHECK(unix_addr_len);
-  DCHECK(handle.is_valid());
-
-  // We reject handle.name.length() == kMaxSocketNameLength to make room for the
-  // NUL terminator at the end of the string.
-  if (handle.name.length() >= kMaxSocketNameLength) {
-    LOG(ERROR) << "Socket name too long: " << handle.name;
-    return false;
-  }
-
-  // Create unix_addr structure.
-  memset(unix_addr, 0, sizeof(struct sockaddr_un));
-  unix_addr->sun_family = AF_UNIX;
-  strncpy(unix_addr->sun_path, handle.name.c_str(), kMaxSocketNameLength);
-  *unix_addr_len =
-      offsetof(struct sockaddr_un, sun_path) + handle.name.length();
-  return true;
-}
-
-// This function creates a unix domain socket, and set it as non-blocking.
-// If successful, this returns a ScopedPlatformHandle containing the socket.
-// Otherwise, this returns an invalid ScopedPlatformHandle.
-ScopedPlatformHandle CreateUnixDomainSocket(bool needs_connection) {
-  // Create the unix domain socket.
-  PlatformHandle socket_handle(socket(AF_UNIX, SOCK_STREAM, 0));
-  socket_handle.needs_connection = needs_connection;
-  ScopedPlatformHandle handle(socket_handle);
-  if (!handle.is_valid()) {
-    PLOG(ERROR) << "Failed to create AF_UNIX socket.";
-    return ScopedPlatformHandle();
-  }
-
-  // Now set it as non-blocking.
-  if (!base::SetNonBlocking(handle.get().handle)) {
-    PLOG(ERROR) << "base::SetNonBlocking() failed " << handle.get().handle;
-    return ScopedPlatformHandle();
-  }
-  return handle;
-}
-
-}  // namespace
-
-ScopedPlatformHandle CreateClientHandle(
-    const NamedPlatformHandle& named_handle) {
-  if (!named_handle.is_valid())
-    return ScopedPlatformHandle();
-
-  struct sockaddr_un unix_addr;
-  size_t unix_addr_len;
-  if (!MakeUnixAddr(named_handle, &unix_addr, &unix_addr_len))
-    return ScopedPlatformHandle();
-
-  ScopedPlatformHandle handle = CreateUnixDomainSocket(false);
-  if (!handle.is_valid())
-    return ScopedPlatformHandle();
-
-  if (HANDLE_EINTR(connect(handle.get().handle,
-                           reinterpret_cast<sockaddr*>(&unix_addr),
-                           unix_addr_len)) < 0) {
-    PLOG(ERROR) << "connect " << named_handle.name;
-    return ScopedPlatformHandle();
-  }
-
-  return handle;
-}
-
-ScopedPlatformHandle CreateServerHandle(
-    const NamedPlatformHandle& named_handle,
-    const CreateServerHandleOptions& options) {
-  if (!named_handle.is_valid())
-    return ScopedPlatformHandle();
-
-  // Make sure the path we need exists.
-  base::FilePath socket_dir = base::FilePath(named_handle.name).DirName();
-  if (!base::CreateDirectory(socket_dir)) {
-    LOG(ERROR) << "Couldn't create directory: " << socket_dir.value();
-    return ScopedPlatformHandle();
-  }
-
-  // Delete any old FS instances.
-  if (unlink(named_handle.name.c_str()) < 0 && errno != ENOENT) {
-    PLOG(ERROR) << "unlink " << named_handle.name;
-    return ScopedPlatformHandle();
-  }
-
-  struct sockaddr_un unix_addr;
-  size_t unix_addr_len;
-  if (!MakeUnixAddr(named_handle, &unix_addr, &unix_addr_len))
-    return ScopedPlatformHandle();
-
-  ScopedPlatformHandle handle = CreateUnixDomainSocket(true);
-  if (!handle.is_valid())
-    return ScopedPlatformHandle();
-
-  // Bind the socket.
-  if (bind(handle.get().handle, reinterpret_cast<const sockaddr*>(&unix_addr),
-           unix_addr_len) < 0) {
-    PLOG(ERROR) << "bind " << named_handle.name;
-    return ScopedPlatformHandle();
-  }
-
-  // Start listening on the socket.
-  if (listen(handle.get().handle, SOMAXCONN) < 0) {
-    PLOG(ERROR) << "listen " << named_handle.name;
-    unlink(named_handle.name.c_str());
-    return ScopedPlatformHandle();
-  }
-  return handle;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/named_platform_handle_utils_win.cc b/mojo/edk/embedder/named_platform_handle_utils_win.cc
deleted file mode 100644
index a145847..0000000
--- a/mojo/edk/embedder/named_platform_handle_utils_win.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-
-#include <sddl.h>
-#include <windows.h>
-
-#include <memory>
-
-#include "base/logging.h"
-#include "base/win/windows_version.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-// A DACL to grant:
-// GA = Generic All
-// access to:
-// SY = LOCAL_SYSTEM
-// BA = BUILTIN_ADMINISTRATORS
-// OW = OWNER_RIGHTS
-constexpr base::char16 kDefaultSecurityDescriptor[] =
-    L"D:(A;;GA;;;SY)(A;;GA;;;BA)(A;;GA;;;OW)";
-
-}  // namespace
-
-ScopedPlatformHandle CreateClientHandle(
-    const NamedPlatformHandle& named_handle) {
-  if (!named_handle.is_valid())
-    return ScopedPlatformHandle();
-
-  base::string16 pipe_name = named_handle.pipe_name();
-
-  // Note: This may block.
-  if (!WaitNamedPipeW(pipe_name.c_str(), NMPWAIT_USE_DEFAULT_WAIT))
-    return ScopedPlatformHandle();
-
-  const DWORD kDesiredAccess = GENERIC_READ | GENERIC_WRITE;
-  // The SECURITY_ANONYMOUS flag means that the server side cannot impersonate
-  // the client.
-  const DWORD kFlags =
-      SECURITY_SQOS_PRESENT | SECURITY_ANONYMOUS | FILE_FLAG_OVERLAPPED;
-  ScopedPlatformHandle handle(
-      PlatformHandle(CreateFileW(pipe_name.c_str(), kDesiredAccess,
-                                 0,  // No sharing.
-                                 nullptr, OPEN_EXISTING, kFlags,
-                                 nullptr)));  // No template file.
-  // The server may have stopped accepting a connection between the
-  // WaitNamedPipe() and CreateFile(). If this occurs, an invalid handle is
-  // returned.
-  DPLOG_IF(ERROR, !handle.is_valid())
-      << "Named pipe " << named_handle.pipe_name()
-      << " could not be opened after WaitNamedPipe succeeded";
-  return handle;
-}
-
-ScopedPlatformHandle CreateServerHandle(
-    const NamedPlatformHandle& named_handle,
-    const CreateServerHandleOptions& options) {
-  if (!named_handle.is_valid())
-    return ScopedPlatformHandle();
-
-  PSECURITY_DESCRIPTOR security_desc = nullptr;
-  ULONG security_desc_len = 0;
-  PCHECK(ConvertStringSecurityDescriptorToSecurityDescriptor(
-      options.security_descriptor.empty() ? kDefaultSecurityDescriptor
-                                          : options.security_descriptor.c_str(),
-      SDDL_REVISION_1, &security_desc, &security_desc_len));
-  std::unique_ptr<void, decltype(::LocalFree)*> p(security_desc, ::LocalFree);
-  SECURITY_ATTRIBUTES security_attributes = {sizeof(SECURITY_ATTRIBUTES),
-                                             security_desc, FALSE};
-
-  const DWORD kOpenMode = options.enforce_uniqueness
-                              ? PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED |
-                                    FILE_FLAG_FIRST_PIPE_INSTANCE
-                              : PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED;
-  const DWORD kPipeMode =
-      PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_REJECT_REMOTE_CLIENTS;
-  PlatformHandle handle(
-      CreateNamedPipeW(named_handle.pipe_name().c_str(), kOpenMode, kPipeMode,
-                       options.enforce_uniqueness ? 1 : 255,  // Max instances.
-                       4096,  // Out buffer size.
-                       4096,  // In buffer size.
-                       5000,  // Timeout in milliseconds.
-                       &security_attributes));
-  handle.needs_connection = true;
-  return ScopedPlatformHandle(handle);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/pending_process_connection.cc b/mojo/edk/embedder/pending_process_connection.cc
deleted file mode 100644
index d6be76e..0000000
--- a/mojo/edk/embedder/pending_process_connection.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/pending_process_connection.h"
-
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/core.h"
-
-namespace mojo {
-namespace edk {
-
-PendingProcessConnection::PendingProcessConnection()
-    : process_token_(GenerateRandomToken()) {
-  DCHECK(internal::g_core);
-}
-
-PendingProcessConnection::~PendingProcessConnection() {
-  if (has_message_pipes_ && !connected_) {
-    DCHECK(internal::g_core);
-    internal::g_core->ChildLaunchFailed(process_token_);
-  }
-}
-
-ScopedMessagePipeHandle PendingProcessConnection::CreateMessagePipe(
-    std::string* token) {
-  has_message_pipes_ = true;
-  DCHECK(internal::g_core);
-  *token = GenerateRandomToken();
-  return internal::g_core->CreateParentMessagePipe(*token, process_token_);
-}
-
-void PendingProcessConnection::Connect(
-    base::ProcessHandle process,
-    ConnectionParams connection_params,
-    const ProcessErrorCallback& error_callback) {
-  // It's now safe to avoid cleanup in the destructor, as the lifetime of any
-  // associated resources is effectively bound to the |channel| passed to
-  // AddChild() below.
-  DCHECK(!connected_);
-  connected_ = true;
-
-  DCHECK(internal::g_core);
-  internal::g_core->AddChild(process, std::move(connection_params),
-                             process_token_, error_callback);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/pending_process_connection.h b/mojo/edk/embedder/pending_process_connection.h
deleted file mode 100644
index ca18227..0000000
--- a/mojo/edk/embedder/pending_process_connection.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_PENDING_PROCESS_CONNECTION_H_
-#define MOJO_EDK_EMBEDDER_PENDING_PROCESS_CONNECTION_H_
-
-#include <string>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/process/process_handle.h"
-#include "mojo/edk/embedder/connection_params.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace mojo {
-namespace edk {
-
-using ProcessErrorCallback = base::Callback<void(const std::string& error)>;
-
-// Represents a potential connection to an external process. Use this object
-// to make other processes reachable from this one via Mojo IPC. Typical usage
-// might look something like:
-//
-//     PendingProcessConnection connection;
-//
-//     std::string pipe_token;
-//     ScopedMessagePipeHandle pipe = connection.CreateMessagePipe(&pipe_token);
-//
-//     // New pipes to the process are fully functional and can be used right
-//     // away, even if the process doesn't exist yet.
-//     GoDoSomethingInteresting(std::move(pipe));
-//
-//     ScopedPlatformChannelPair channel;
-//
-//     // Give the pipe token to the child process via command-line.
-//     child_command_line.AppendSwitchASCII("yer-pipe", pipe_token);
-//
-//     // Magic child process launcher which gives one end of the pipe to the
-//     // new process.
-//     LaunchProcess(child_command_line, channel.PassClientHandle());
-//
-//     // Some time later...
-//     connection.Connect(new_process, channel.PassServerHandle());
-//
-// If at any point during the above process, |connection| is destroyed before
-// Connect() can be called, |pipe| will imminently behave as if its peer has
-// been closed.
-//
-// Otherwise, if the remote process in this example eventually calls:
-//
-//     mojo::edk::SetParentPipeHandle(std::move(client_channel_handle));
-//
-//     std::string token = command_line.GetSwitchValueASCII("yer-pipe");
-//     ScopedMessagePipeHandle pipe = mojo::edk::CreateChildMessagePipe(token);
-//
-// it will be connected to this process, and its |pipe| will be connected to
-// this process's |pipe|.
-//
-// If the remote process exits or otherwise closes its client channel handle
-// before calling CreateChildMessagePipe for a given message pipe token,
-// this process's end of the corresponding message pipe will imminently behave
-// as if its peer has been closed.
-//
-class MOJO_SYSTEM_IMPL_EXPORT PendingProcessConnection {
- public:
-  PendingProcessConnection();
-  ~PendingProcessConnection();
-
-  // Creates a message pipe associated with a new globally unique string value
-  // which will be placed in |*token|.
-  //
-  // The other end of the new pipe is obtainable in the remote process (or in
-  // this process, to facilitate "single-process mode" in some applications) by
-  // passing the new |*token| value to mojo::edk::CreateChildMessagePipe. It's
-  // the caller's responsibility to communicate the value of |*token| to the
-  // remote process by any means available, e.g. a command-line argument on
-  // process launch, or some other out-of-band communication channel for an
-  // existing process.
-  //
-  // NOTES: This may be called any number of times to create multiple message
-  // pipes to the same remote process. This call ALWAYS succeeds, returning
-  // a valid message pipe handle and populating |*token| with a new unique
-  // string value.
-  ScopedMessagePipeHandle CreateMessagePipe(std::string* token);
-
-  // Connects to the process. This must be called at most once, with the process
-  // handle in |process|.
-  //
-  // |connection_param| contains the platform handle of an OS pipe which can be
-  // used to communicate with the connected process. The other end of that pipe
-  // must ultimately be passed to mojo::edk::SetParentPipeHandle in the remote
-  // process, and getting that end of the pipe into the other process is the
-  // embedder's responsibility.
-  //
-  // If this method is not called by the time the PendingProcessConnection is
-  // destroyed, it's assumed that the process is unavailable (e.g. process
-  // launch failed or the process has otherwise been terminated early), and
-  // any associated resources, such as remote endpoints of messages pipes
-  // created by CreateMessagePipe above) will be cleaned up at that time.
-  void Connect(
-      base::ProcessHandle process,
-      ConnectionParams connection_params,
-      const ProcessErrorCallback& error_callback = ProcessErrorCallback());
-
- private:
-  // A GUID representing a potential new process to be connected to this one.
-  const std::string process_token_;
-
-  // Indicates whether this object has been used to create new message pipes.
-  bool has_message_pipes_ = false;
-
-  // Indicates whether Connect() has been called yet.
-  bool connected_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(PendingProcessConnection);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PENDING_PROCESS_CONNECTION_H_
diff --git a/mojo/edk/embedder/platform_channel_pair.cc b/mojo/edk/embedder/platform_channel_pair.cc
deleted file mode 100644
index ee1905a..0000000
--- a/mojo/edk/embedder/platform_channel_pair.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/platform_channel_pair.h"
-
-#include <utility>
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace edk {
-
-const char PlatformChannelPair::kMojoPlatformChannelHandleSwitch[] =
-    "mojo-platform-channel-handle";
-
-PlatformChannelPair::~PlatformChannelPair() {
-}
-
-ScopedPlatformHandle PlatformChannelPair::PassServerHandle() {
-  return std::move(server_handle_);
-}
-
-ScopedPlatformHandle PlatformChannelPair::PassClientHandle() {
-  return std::move(client_handle_);
-}
-
-void PlatformChannelPair::ChildProcessLaunched() {
-  DCHECK(client_handle_.is_valid());
-  client_handle_.reset();
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_channel_pair.h b/mojo/edk/embedder/platform_channel_pair.h
deleted file mode 100644
index 9c93f76..0000000
--- a/mojo/edk/embedder/platform_channel_pair.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_PLATFORM_CHANNEL_PAIR_H_
-#define MOJO_EDK_EMBEDDER_PLATFORM_CHANNEL_PAIR_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/process/launch.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace base {
-class CommandLine;
-}
-
-namespace mojo {
-namespace edk {
-
-// It would be nice to refactor base/process/launch.h to have a more platform-
-// independent way of representing handles that are passed to child processes.
-#if defined(OS_WIN)
-using HandlePassingInformation = base::HandlesToInheritVector;
-#elif defined(OS_POSIX)
-using HandlePassingInformation = base::FileHandleMappingVector;
-#else
-#error "Unsupported."
-#endif
-
-// This is used to create a pair of |PlatformHandle|s that are connected by a
-// suitable (platform-specific) bidirectional "pipe" (e.g., socket on POSIX,
-// named pipe on Windows). The resulting handles can then be used in the same
-// process (e.g., in tests) or between processes. (The "server" handle is the
-// one that will be used in the process that created the pair, whereas the
-// "client" handle is the one that will be used in a different process.)
-//
-// This class provides facilities for passing the client handle to a child
-// process. The parent should call |PrepareToPassClientHandlelToChildProcess()|
-// to get the data needed to do this, spawn the child using that data, and then
-// call |ChildProcessLaunched()|. Note that on Windows this facility (will) only
-// work on Vista and later (TODO(vtl)).
-//
-// Note: |PlatformChannelPair()|, |PassClientHandleFromParentProcess()| and
-// |PrepareToPassClientHandleToChildProcess()| have platform-specific
-// implementations.
-//
-// Note: On POSIX platforms, to write to the "pipe", use
-// |PlatformChannel{Write,Writev}()| (from platform_channel_utils_posix.h)
-// instead of |write()|, |writev()|, etc. Otherwise, you have to worry about
-// platform differences in suppressing |SIGPIPE|.
-class MOJO_SYSTEM_IMPL_EXPORT PlatformChannelPair {
- public:
-  static const char kMojoPlatformChannelHandleSwitch[];
-
-  // If |client_is_blocking| is true, then the client handle only supports
-  // blocking reads and writes. The default is nonblocking.
-  PlatformChannelPair(bool client_is_blocking = false);
-  ~PlatformChannelPair();
-
-  ScopedPlatformHandle PassServerHandle();
-
-  // For in-process use (e.g., in tests or to pass over another channel).
-  ScopedPlatformHandle PassClientHandle();
-
-  // To be called in the child process, after the parent process called
-  // |PrepareToPassClientHandleToChildProcess()| and launched the child (using
-  // the provided data), to create a client handle connected to the server
-  // handle (in the parent process).
-  // TODO(jcivelli): remove the command_line param. http://crbug.com/670106
-  static ScopedPlatformHandle PassClientHandleFromParentProcess(
-      const base::CommandLine& command_line);
-
-  // Like above, but gets the handle from the passed in string.
-  static ScopedPlatformHandle PassClientHandleFromParentProcessFromString(
-      const std::string& value);
-
-  // Prepares to pass the client channel to a new child process, to be launched
-  // using |LaunchProcess()| (from base/launch.h). Modifies |*command_line| and
-  // |*handle_passing_info| as needed.
-  // Note: For Windows, this method only works on Vista and later.
-  void PrepareToPassClientHandleToChildProcess(
-      base::CommandLine* command_line,
-      HandlePassingInformation* handle_passing_info) const;
-
-  // Like above, but returns a string instead of changing the command line.
-  std::string PrepareToPassClientHandleToChildProcessAsString(
-      HandlePassingInformation* handle_passing_info) const;
-
-  // To be called once the child process has been successfully launched, to do
-  // any cleanup necessary.
-  void ChildProcessLaunched();
-
- private:
-  ScopedPlatformHandle server_handle_;
-  ScopedPlatformHandle client_handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(PlatformChannelPair);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PLATFORM_CHANNEL_PAIR_H_
diff --git a/mojo/edk/embedder/platform_channel_pair_posix.cc b/mojo/edk/embedder/platform_channel_pair_posix.cc
deleted file mode 100644
index fe9f8f5..0000000
--- a/mojo/edk/embedder/platform_channel_pair_posix.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/platform_channel_pair.h"
-
-#include <fcntl.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <limits>
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/posix/global_descriptors.h"
-#include "base/rand_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/platform_handle.h"
-
-#if !defined(OS_NACL_SFI)
-#include <sys/socket.h>
-#else
-#include "native_client/src/public/imc_syscalls.h"
-#endif
-
-#if !defined(SO_PEEK_OFF)
-#define SO_PEEK_OFF 42
-#endif
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-#if defined(OS_ANDROID) || defined(__ANDROID__)
-enum {
-  // Leave room for any other descriptors defined in content for example.
-  // TODO(jcivelli): consider changing base::GlobalDescriptors to generate a
-  //   key when setting the file descriptor (http://crbug.com/676442).
-  kAndroidClientHandleDescriptor =
-      base::GlobalDescriptors::kBaseDescriptor + 10000,
-};
-#else
-bool IsTargetDescriptorUsed(
-    const base::FileHandleMappingVector& file_handle_mapping,
-    int target_fd) {
-  for (size_t i = 0; i < file_handle_mapping.size(); i++) {
-    if (file_handle_mapping[i].second == target_fd)
-      return true;
-  }
-  return false;
-}
-#endif
-
-}  // namespace
-
-PlatformChannelPair::PlatformChannelPair(bool client_is_blocking) {
-  // Create the Unix domain socket.
-  int fds[2];
-  // TODO(vtl): Maybe fail gracefully if |socketpair()| fails.
-
-#if defined(OS_NACL_SFI)
-  PCHECK(imc_socketpair(fds) == 0);
-#else
-  PCHECK(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == 0);
-
-  // Set the ends to nonblocking.
-  PCHECK(fcntl(fds[0], F_SETFL, O_NONBLOCK) == 0);
-  if (!client_is_blocking)
-    PCHECK(fcntl(fds[1], F_SETFL, O_NONBLOCK) == 0);
-
-#if defined(OS_MACOSX)
-  // This turns off |SIGPIPE| when writing to a closed socket (causing it to
-  // fail with |EPIPE| instead). On Linux, we have to use |send...()| with
-  // |MSG_NOSIGNAL| -- which is not supported on Mac -- instead.
-  int no_sigpipe = 1;
-  PCHECK(setsockopt(fds[0], SOL_SOCKET, SO_NOSIGPIPE, &no_sigpipe,
-                    sizeof(no_sigpipe)) == 0);
-  PCHECK(setsockopt(fds[1], SOL_SOCKET, SO_NOSIGPIPE, &no_sigpipe,
-                    sizeof(no_sigpipe)) == 0);
-#endif  // defined(OS_MACOSX)
-#endif  // defined(OS_NACL_SFI)
-
-  server_handle_.reset(PlatformHandle(fds[0]));
-  DCHECK(server_handle_.is_valid());
-  client_handle_.reset(PlatformHandle(fds[1]));
-  DCHECK(client_handle_.is_valid());
-}
-
-// static
-ScopedPlatformHandle PlatformChannelPair::PassClientHandleFromParentProcess(
-    const base::CommandLine& command_line) {
-  std::string client_fd_string =
-      command_line.GetSwitchValueASCII(kMojoPlatformChannelHandleSwitch);
-  return PassClientHandleFromParentProcessFromString(client_fd_string);
-}
-
-ScopedPlatformHandle
-PlatformChannelPair::PassClientHandleFromParentProcessFromString(
-    const std::string& value) {
-  int client_fd = -1;
-#if defined(OS_ANDROID) || defined(__ANDROID__)
-  base::GlobalDescriptors::Key key = -1;
-  if (value.empty() || !base::StringToUint(value, &key)) {
-    LOG(ERROR) << "Missing or invalid --" << kMojoPlatformChannelHandleSwitch;
-    return ScopedPlatformHandle();
-  }
-  client_fd = base::GlobalDescriptors::GetInstance()->Get(key);
-#else
-  if (value.empty() ||
-      !base::StringToInt(value, &client_fd) ||
-      client_fd < base::GlobalDescriptors::kBaseDescriptor) {
-    LOG(ERROR) << "Missing or invalid --" << kMojoPlatformChannelHandleSwitch;
-    return ScopedPlatformHandle();
-  }
-#endif
-  return ScopedPlatformHandle(PlatformHandle(client_fd));
-}
-
-void PlatformChannelPair::PrepareToPassClientHandleToChildProcess(
-    base::CommandLine* command_line,
-    base::FileHandleMappingVector* handle_passing_info) const {
-  DCHECK(command_line);
-
-  // Log a warning if the command line already has the switch, but "clobber" it
-  // anyway, since it's reasonably likely that all the switches were just copied
-  // from the parent.
-  LOG_IF(WARNING, command_line->HasSwitch(kMojoPlatformChannelHandleSwitch))
-      << "Child command line already has switch --"
-      << kMojoPlatformChannelHandleSwitch << "="
-      << command_line->GetSwitchValueASCII(kMojoPlatformChannelHandleSwitch);
-  // (Any existing switch won't actually be removed from the command line, but
-  // the last one appended takes precedence.)
-  command_line->AppendSwitchASCII(
-      kMojoPlatformChannelHandleSwitch,
-      PrepareToPassClientHandleToChildProcessAsString(handle_passing_info));
-}
-
-std::string
-PlatformChannelPair::PrepareToPassClientHandleToChildProcessAsString(
-      HandlePassingInformation* handle_passing_info) const {
-#if defined(OS_ANDROID) || defined(__ANDROID__)
-  int fd = client_handle_.get().handle;
-  handle_passing_info->push_back(
-      std::pair<int, int>(fd, kAndroidClientHandleDescriptor));
-  return base::UintToString(kAndroidClientHandleDescriptor);
-#else
-  DCHECK(handle_passing_info);
-  // This is an arbitrary sanity check. (Note that this guarantees that the loop
-  // below will terminate sanely.)
-  CHECK_LT(handle_passing_info->size(), 1000u);
-
-  DCHECK(client_handle_.is_valid());
-
-  // Find a suitable FD to map our client handle to in the child process.
-  // This has quadratic time complexity in the size of |*handle_passing_info|,
-  // but |*handle_passing_info| should be very small (usually/often empty).
-  int target_fd = base::GlobalDescriptors::kBaseDescriptor;
-  while (IsTargetDescriptorUsed(*handle_passing_info, target_fd))
-    target_fd++;
-
-  handle_passing_info->push_back(
-      std::pair<int, int>(client_handle_.get().handle, target_fd));
-  return base::IntToString(target_fd);
-#endif
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_channel_pair_posix_unittest.cc b/mojo/edk/embedder/platform_channel_pair_posix_unittest.cc
deleted file mode 100644
index a3fd275..0000000
--- a/mojo/edk/embedder/platform_channel_pair_posix_unittest.cc
+++ /dev/null
@@ -1,261 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/platform_channel_pair.h"
-
-#include <errno.h>
-#include <poll.h>
-#include <signal.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <unistd.h>
-#include <deque>
-#include <utility>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/edk/embedder/platform_channel_utils_posix.h"
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/test/test_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-void WaitReadable(PlatformHandle h) {
-  struct pollfd pfds = {};
-  pfds.fd = h.handle;
-  pfds.events = POLLIN;
-  CHECK_EQ(poll(&pfds, 1, -1), 1);
-}
-
-class PlatformChannelPairPosixTest : public testing::Test {
- public:
-  PlatformChannelPairPosixTest() {}
-  ~PlatformChannelPairPosixTest() override {}
-
-  void SetUp() override {
-    // Make sure |SIGPIPE| isn't being ignored.
-    struct sigaction action = {};
-    action.sa_handler = SIG_DFL;
-    ASSERT_EQ(0, sigaction(SIGPIPE, &action, &old_action_));
-  }
-
-  void TearDown() override {
-    // Restore the |SIGPIPE| handler.
-    ASSERT_EQ(0, sigaction(SIGPIPE, &old_action_, nullptr));
-  }
-
- private:
-  struct sigaction old_action_;
-
-  DISALLOW_COPY_AND_ASSIGN(PlatformChannelPairPosixTest);
-};
-
-TEST_F(PlatformChannelPairPosixTest, NoSigPipe) {
-  PlatformChannelPair channel_pair;
-  ScopedPlatformHandle server_handle = channel_pair.PassServerHandle();
-  ScopedPlatformHandle client_handle = channel_pair.PassClientHandle();
-
-  // Write to the client.
-  static const char kHello[] = "hello";
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(kHello)),
-            write(client_handle.get().handle, kHello, sizeof(kHello)));
-
-  // Close the client.
-  client_handle.reset();
-
-  // Read from the server; this should be okay.
-  char buffer[100] = {};
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(kHello)),
-            read(server_handle.get().handle, buffer, sizeof(buffer)));
-  EXPECT_STREQ(kHello, buffer);
-
-  // Try reading again.
-  ssize_t result = read(server_handle.get().handle, buffer, sizeof(buffer));
-  // We should probably get zero (for "end of file"), but -1 would also be okay.
-  EXPECT_TRUE(result == 0 || result == -1);
-  if (result == -1)
-    PLOG(WARNING) << "read (expected 0 for EOF)";
-
-  // Test our replacement for |write()|/|send()|.
-  result = PlatformChannelWrite(server_handle.get(), kHello, sizeof(kHello));
-  EXPECT_EQ(-1, result);
-  if (errno != EPIPE)
-    PLOG(WARNING) << "write (expected EPIPE)";
-
-  // Test our replacement for |writev()|/|sendv()|.
-  struct iovec iov[2] = {{const_cast<char*>(kHello), sizeof(kHello)},
-                         {const_cast<char*>(kHello), sizeof(kHello)}};
-  result = PlatformChannelWritev(server_handle.get(), iov, 2);
-  EXPECT_EQ(-1, result);
-  if (errno != EPIPE)
-    PLOG(WARNING) << "write (expected EPIPE)";
-}
-
-TEST_F(PlatformChannelPairPosixTest, SendReceiveData) {
-  PlatformChannelPair channel_pair;
-  ScopedPlatformHandle server_handle = channel_pair.PassServerHandle();
-  ScopedPlatformHandle client_handle = channel_pair.PassClientHandle();
-
-  for (size_t i = 0; i < 10; i++) {
-    std::string send_string(1 << i, 'A' + i);
-
-    EXPECT_EQ(static_cast<ssize_t>(send_string.size()),
-              PlatformChannelWrite(server_handle.get(), send_string.data(),
-                                   send_string.size()));
-
-    WaitReadable(client_handle.get());
-
-    char buf[10000] = {};
-    std::deque<PlatformHandle> received_handles;
-    ssize_t result = PlatformChannelRecvmsg(client_handle.get(), buf,
-                                            sizeof(buf), &received_handles);
-    EXPECT_EQ(static_cast<ssize_t>(send_string.size()), result);
-    EXPECT_EQ(send_string, std::string(buf, static_cast<size_t>(result)));
-    EXPECT_TRUE(received_handles.empty());
-  }
-}
-
-TEST_F(PlatformChannelPairPosixTest, SendReceiveFDs) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  static const char kHello[] = "hello";
-
-  PlatformChannelPair channel_pair;
-  ScopedPlatformHandle server_handle = channel_pair.PassServerHandle();
-  ScopedPlatformHandle client_handle = channel_pair.PassClientHandle();
-
-// Reduce the number of FDs opened on OS X to avoid test flake.
-#if defined(OS_MACOSX)
-  const size_t kNumHandlesToSend = kPlatformChannelMaxNumHandles / 2;
-#else
-  const size_t kNumHandlesToSend = kPlatformChannelMaxNumHandles;
-#endif
-
-  for (size_t i = 1; i < kNumHandlesToSend; i++) {
-    // Make |i| files, with the j-th file consisting of j copies of the digit
-    // |c|.
-    const char c = '0' + (i % 10);
-    ScopedPlatformHandleVectorPtr platform_handles(new PlatformHandleVector);
-    for (size_t j = 1; j <= i; j++) {
-      base::FilePath unused;
-      base::ScopedFILE fp(
-          base::CreateAndOpenTemporaryFileInDir(temp_dir.GetPath(), &unused));
-      ASSERT_TRUE(fp);
-      ASSERT_EQ(j, fwrite(std::string(j, c).data(), 1, j, fp.get()));
-      platform_handles->push_back(
-          test::PlatformHandleFromFILE(std::move(fp)).release());
-      ASSERT_TRUE(platform_handles->back().is_valid());
-    }
-
-    // Send the FDs (+ "hello").
-    struct iovec iov = {const_cast<char*>(kHello), sizeof(kHello)};
-    // We assume that the |sendmsg()| actually sends all the data.
-    EXPECT_EQ(static_cast<ssize_t>(sizeof(kHello)),
-              PlatformChannelSendmsgWithHandles(server_handle.get(), &iov, 1,
-                                                &platform_handles->at(0),
-                                                platform_handles->size()));
-
-    WaitReadable(client_handle.get());
-
-    char buf[10000] = {};
-    std::deque<PlatformHandle> received_handles;
-    // We assume that the |recvmsg()| actually reads all the data.
-    EXPECT_EQ(static_cast<ssize_t>(sizeof(kHello)),
-              PlatformChannelRecvmsg(client_handle.get(), buf, sizeof(buf),
-                                     &received_handles));
-    EXPECT_STREQ(kHello, buf);
-    EXPECT_EQ(i, received_handles.size());
-
-    for (size_t j = 0; !received_handles.empty(); j++) {
-      base::ScopedFILE fp(test::FILEFromPlatformHandle(
-          ScopedPlatformHandle(received_handles.front()), "rb"));
-      received_handles.pop_front();
-      ASSERT_TRUE(fp);
-      rewind(fp.get());
-      char read_buf[kNumHandlesToSend];
-      size_t bytes_read = fread(read_buf, 1, sizeof(read_buf), fp.get());
-      EXPECT_EQ(j + 1, bytes_read);
-      EXPECT_EQ(std::string(j + 1, c), std::string(read_buf, bytes_read));
-    }
-  }
-}
-
-TEST_F(PlatformChannelPairPosixTest, AppendReceivedFDs) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  static const char kHello[] = "hello";
-
-  PlatformChannelPair channel_pair;
-  ScopedPlatformHandle server_handle = channel_pair.PassServerHandle();
-  ScopedPlatformHandle client_handle = channel_pair.PassClientHandle();
-
-  const std::string file_contents("hello world");
-
-  {
-    base::FilePath unused;
-    base::ScopedFILE fp(
-        base::CreateAndOpenTemporaryFileInDir(temp_dir.GetPath(), &unused));
-    ASSERT_TRUE(fp);
-    ASSERT_EQ(file_contents.size(),
-              fwrite(file_contents.data(), 1, file_contents.size(), fp.get()));
-    ScopedPlatformHandleVectorPtr platform_handles(new PlatformHandleVector);
-    platform_handles->push_back(
-        test::PlatformHandleFromFILE(std::move(fp)).release());
-    ASSERT_TRUE(platform_handles->back().is_valid());
-
-    // Send the FD (+ "hello").
-    struct iovec iov = {const_cast<char*>(kHello), sizeof(kHello)};
-    // We assume that the |sendmsg()| actually sends all the data.
-    EXPECT_EQ(static_cast<ssize_t>(sizeof(kHello)),
-              PlatformChannelSendmsgWithHandles(server_handle.get(), &iov, 1,
-                                                &platform_handles->at(0),
-                                                platform_handles->size()));
-  }
-
-  WaitReadable(client_handle.get());
-
-  // Start with an invalid handle in the deque.
-  std::deque<PlatformHandle> received_handles;
-  received_handles.push_back(PlatformHandle());
-
-  char buf[100] = {};
-  // We assume that the |recvmsg()| actually reads all the data.
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(kHello)),
-            PlatformChannelRecvmsg(client_handle.get(), buf, sizeof(buf),
-                                   &received_handles));
-  EXPECT_STREQ(kHello, buf);
-  ASSERT_EQ(2u, received_handles.size());
-  EXPECT_FALSE(received_handles[0].is_valid());
-  EXPECT_TRUE(received_handles[1].is_valid());
-
-  {
-    base::ScopedFILE fp(test::FILEFromPlatformHandle(
-        ScopedPlatformHandle(received_handles[1]), "rb"));
-    received_handles[1] = PlatformHandle();
-    ASSERT_TRUE(fp);
-    rewind(fp.get());
-    char read_buf[100];
-    size_t bytes_read = fread(read_buf, 1, sizeof(read_buf), fp.get());
-    EXPECT_EQ(file_contents.size(), bytes_read);
-    EXPECT_EQ(file_contents, std::string(read_buf, bytes_read));
-  }
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_channel_pair_win.cc b/mojo/edk/embedder/platform_channel_pair_win.cc
deleted file mode 100644
index f523ade..0000000
--- a/mojo/edk/embedder/platform_channel_pair_win.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/platform_channel_pair.h"
-
-#include <windows.h>
-
-#include <string>
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/rand_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/win/windows_version.h"
-#include "mojo/edk/embedder/platform_handle.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-std::wstring GeneratePipeName() {
-  return base::StringPrintf(L"\\\\.\\pipe\\mojo.%u.%u.%I64u",
-                            GetCurrentProcessId(), GetCurrentThreadId(),
-                            base::RandUint64());
-}
-
-}  // namespace
-
-PlatformChannelPair::PlatformChannelPair(bool client_is_blocking) {
-  std::wstring pipe_name = GeneratePipeName();
-
-  DWORD kOpenMode =
-      PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE;
-  const DWORD kPipeMode = PIPE_TYPE_BYTE | PIPE_READMODE_BYTE;
-  server_handle_.reset(PlatformHandle(
-      CreateNamedPipeW(pipe_name.c_str(), kOpenMode, kPipeMode,
-                       1,           // Max instances.
-                       4096,        // Out buffer size.
-                       4096,        // In buffer size.
-                       5000,        // Timeout in milliseconds.
-                       nullptr)));  // Default security descriptor.
-  PCHECK(server_handle_.is_valid());
-
-  const DWORD kDesiredAccess = GENERIC_READ | GENERIC_WRITE;
-  // The SECURITY_ANONYMOUS flag means that the server side cannot impersonate
-  // the client.
-  DWORD kFlags = SECURITY_SQOS_PRESENT | SECURITY_ANONYMOUS;
-  if (!client_is_blocking)
-    kFlags |= FILE_FLAG_OVERLAPPED;
-  // Allow the handle to be inherited by child processes.
-  SECURITY_ATTRIBUTES security_attributes = {
-      sizeof(SECURITY_ATTRIBUTES), nullptr, TRUE};
-  client_handle_.reset(
-      PlatformHandle(CreateFileW(pipe_name.c_str(), kDesiredAccess,
-                                 0,  // No sharing.
-                                 &security_attributes, OPEN_EXISTING, kFlags,
-                                 nullptr)));  // No template file.
-  PCHECK(client_handle_.is_valid());
-
-  // Since a client has connected, ConnectNamedPipe() should return zero and
-  // GetLastError() should return ERROR_PIPE_CONNECTED.
-  CHECK(!ConnectNamedPipe(server_handle_.get().handle, nullptr));
-  PCHECK(GetLastError() == ERROR_PIPE_CONNECTED);
-}
-
-// static
-ScopedPlatformHandle PlatformChannelPair::PassClientHandleFromParentProcess(
-    const base::CommandLine& command_line) {
-  std::string client_handle_string =
-      command_line.GetSwitchValueASCII(kMojoPlatformChannelHandleSwitch);
-  return PassClientHandleFromParentProcessFromString(client_handle_string);
-}
-
-ScopedPlatformHandle
-PlatformChannelPair::PassClientHandleFromParentProcessFromString(
-    const std::string& value) {
-  int client_handle_value = 0;
-  if (value.empty() ||
-      !base::StringToInt(value, &client_handle_value)) {
-    LOG(ERROR) << "Missing or invalid --" << kMojoPlatformChannelHandleSwitch;
-    return ScopedPlatformHandle();
-  }
-
-  return ScopedPlatformHandle(
-      PlatformHandle(LongToHandle(client_handle_value)));
-}
-
-void PlatformChannelPair::PrepareToPassClientHandleToChildProcess(
-    base::CommandLine* command_line,
-    base::HandlesToInheritVector* handle_passing_info) const {
-  DCHECK(command_line);
-
-  // Log a warning if the command line already has the switch, but "clobber" it
-  // anyway, since it's reasonably likely that all the switches were just copied
-  // from the parent.
-  LOG_IF(WARNING, command_line->HasSwitch(kMojoPlatformChannelHandleSwitch))
-      << "Child command line already has switch --"
-      << kMojoPlatformChannelHandleSwitch << "="
-      << command_line->GetSwitchValueASCII(kMojoPlatformChannelHandleSwitch);
-  // (Any existing switch won't actually be removed from the command line, but
-  // the last one appended takes precedence.)
-  command_line->AppendSwitchASCII(
-      kMojoPlatformChannelHandleSwitch,
-      PrepareToPassClientHandleToChildProcessAsString(handle_passing_info));
-}
-
-std::string
-PlatformChannelPair::PrepareToPassClientHandleToChildProcessAsString(
-    HandlePassingInformation* handle_passing_info) const {
-  DCHECK(handle_passing_info);
-  DCHECK(client_handle_.is_valid());
-
-  if (base::win::GetVersion() >= base::win::VERSION_VISTA)
-    handle_passing_info->push_back(client_handle_.get().handle);
-
-  return base::IntToString(HandleToLong(client_handle_.get().handle));
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_channel_utils_posix.cc b/mojo/edk/embedder/platform_channel_utils_posix.cc
deleted file mode 100644
index 689b6ee..0000000
--- a/mojo/edk/embedder/platform_channel_utils_posix.cc
+++ /dev/null
@@ -1,282 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/platform_channel_utils_posix.h"
-
-#include <stddef.h>
-#include <sys/socket.h>
-#include <unistd.h>
-
-#include <utility>
-
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/posix/eintr_wrapper.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-
-#if !defined(OS_NACL)
-#include <sys/uio.h>
-#endif
-
-#if !defined(SO_PEEK_OFF)
-#define SO_PEEK_OFF 42
-#endif
-
-namespace mojo {
-namespace edk {
-namespace {
-
-#if !defined(OS_NACL)
-bool IsRecoverableError() {
-  return errno == ECONNABORTED || errno == EMFILE || errno == ENFILE ||
-         errno == ENOMEM || errno == ENOBUFS;
-}
-
-bool GetPeerEuid(PlatformHandle handle, uid_t* peer_euid) {
-  DCHECK(peer_euid);
-#if defined(OS_MACOSX) || defined(OS_OPENBSD) || defined(OS_FREEBSD)
-  uid_t socket_euid;
-  gid_t socket_gid;
-  if (getpeereid(handle.handle, &socket_euid, &socket_gid) < 0) {
-    PLOG(ERROR) << "getpeereid " << handle.handle;
-    return false;
-  }
-  *peer_euid = socket_euid;
-  return true;
-#else
-  struct ucred cred;
-  socklen_t cred_len = sizeof(cred);
-  if (getsockopt(handle.handle, SOL_SOCKET, SO_PEERCRED, &cred, &cred_len) <
-      0) {
-    PLOG(ERROR) << "getsockopt " << handle.handle;
-    return false;
-  }
-  if (static_cast<unsigned>(cred_len) < sizeof(cred)) {
-    NOTREACHED() << "Truncated ucred from SO_PEERCRED?";
-    return false;
-  }
-  *peer_euid = cred.uid;
-  return true;
-#endif
-}
-
-bool IsPeerAuthorized(PlatformHandle peer_handle) {
-  uid_t peer_euid;
-  if (!GetPeerEuid(peer_handle, &peer_euid))
-    return false;
-  if (peer_euid != geteuid()) {
-    DLOG(ERROR) << "Client euid is not authorised";
-    return false;
-  }
-  return true;
-}
-#endif  // !defined(OS_NACL)
-
-}  // namespace
-
-// On Linux, |SIGPIPE| is suppressed by passing |MSG_NOSIGNAL| to
-// |send()|/|sendmsg()|. (There is no way of suppressing |SIGPIPE| on
-// |write()|/|writev().) On Mac, |SIGPIPE| is suppressed by setting the
-// |SO_NOSIGPIPE| option on the socket.
-//
-// Performance notes:
-//  - On Linux, we have to use |send()|/|sendmsg()| rather than
-//    |write()|/|writev()| in order to suppress |SIGPIPE|. This is okay, since
-//    |send()| is (slightly) faster than |write()| (!), while |sendmsg()| is
-//    quite comparable to |writev()|.
-//  - On Mac, we may use |write()|/|writev()|. Here, |write()| is considerably
-//    faster than |send()|, whereas |sendmsg()| is quite comparable to
-//    |writev()|.
-//  - On both platforms, an appropriate |sendmsg()|/|writev()| is considerably
-//    faster than two |send()|s/|write()|s.
-//  - Relative numbers (minimum real times from 10 runs) for one |write()| of
-//    1032 bytes, one |send()| of 1032 bytes, one |writev()| of 32+1000 bytes,
-//    one |sendmsg()| of 32+1000 bytes, two |write()|s of 32 and 1000 bytes, two
-//    |send()|s of 32 and 1000 bytes:
-//    - Linux: 0.81 s, 0.77 s, 0.87 s, 0.89 s, 1.31 s, 1.22 s
-//    - Mac: 2.21 s, 2.91 s, 2.98 s, 3.08 s, 3.59 s, 4.74 s
-
-// Flags to use with calling |send()| or |sendmsg()| (see above).
-#if defined(OS_MACOSX)
-const int kSendFlags = 0;
-#else
-const int kSendFlags = MSG_NOSIGNAL;
-#endif
-
-ssize_t PlatformChannelWrite(PlatformHandle h,
-                             const void* bytes,
-                             size_t num_bytes) {
-  DCHECK(h.is_valid());
-  DCHECK(bytes);
-  DCHECK_GT(num_bytes, 0u);
-
-#if defined(OS_MACOSX) || defined(OS_NACL_NONSFI)
-  // send() is not available under NaCl-nonsfi.
-  return HANDLE_EINTR(write(h.handle, bytes, num_bytes));
-#else
-  return send(h.handle, bytes, num_bytes, kSendFlags);
-#endif
-}
-
-ssize_t PlatformChannelWritev(PlatformHandle h,
-                              struct iovec* iov,
-                              size_t num_iov) {
-  DCHECK(h.is_valid());
-  DCHECK(iov);
-  DCHECK_GT(num_iov, 0u);
-
-#if defined(OS_MACOSX)
-  return HANDLE_EINTR(writev(h.handle, iov, static_cast<int>(num_iov)));
-#else
-  struct msghdr msg = {};
-  msg.msg_iov = iov;
-  msg.msg_iovlen = num_iov;
-  return HANDLE_EINTR(sendmsg(h.handle, &msg, kSendFlags));
-#endif
-}
-
-ssize_t PlatformChannelSendmsgWithHandles(PlatformHandle h,
-                                          struct iovec* iov,
-                                          size_t num_iov,
-                                          PlatformHandle* platform_handles,
-                                          size_t num_platform_handles) {
-  DCHECK(iov);
-  DCHECK_GT(num_iov, 0u);
-  DCHECK(platform_handles);
-  DCHECK_GT(num_platform_handles, 0u);
-  DCHECK_LE(num_platform_handles, kPlatformChannelMaxNumHandles);
-
-  char cmsg_buf[CMSG_SPACE(kPlatformChannelMaxNumHandles * sizeof(int))];
-  struct msghdr msg = {};
-  msg.msg_iov = iov;
-  msg.msg_iovlen = num_iov;
-  msg.msg_control = cmsg_buf;
-  msg.msg_controllen = CMSG_LEN(num_platform_handles * sizeof(int));
-  struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
-  cmsg->cmsg_level = SOL_SOCKET;
-  cmsg->cmsg_type = SCM_RIGHTS;
-  cmsg->cmsg_len = CMSG_LEN(num_platform_handles * sizeof(int));
-  for (size_t i = 0; i < num_platform_handles; i++) {
-    DCHECK(platform_handles[i].is_valid());
-    reinterpret_cast<int*>(CMSG_DATA(cmsg))[i] = platform_handles[i].handle;
-  }
-
-  return HANDLE_EINTR(sendmsg(h.handle, &msg, kSendFlags));
-}
-
-bool PlatformChannelSendHandles(PlatformHandle h,
-                                PlatformHandle* handles,
-                                size_t num_handles) {
-  DCHECK(handles);
-  DCHECK_GT(num_handles, 0u);
-  DCHECK_LE(num_handles, kPlatformChannelMaxNumHandles);
-
-  // Note: |sendmsg()| fails on Mac if we don't write at least one character.
-  struct iovec iov = {const_cast<char*>(""), 1};
-  char cmsg_buf[CMSG_SPACE(kPlatformChannelMaxNumHandles * sizeof(int))];
-  struct msghdr msg = {};
-  msg.msg_iov = &iov;
-  msg.msg_iovlen = 1;
-  msg.msg_control = cmsg_buf;
-  msg.msg_controllen = CMSG_LEN(num_handles * sizeof(int));
-  struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
-  cmsg->cmsg_level = SOL_SOCKET;
-  cmsg->cmsg_type = SCM_RIGHTS;
-  cmsg->cmsg_len = CMSG_LEN(num_handles * sizeof(int));
-  for (size_t i = 0; i < num_handles; i++) {
-    DCHECK(handles[i].is_valid());
-    reinterpret_cast<int*>(CMSG_DATA(cmsg))[i] = handles[i].handle;
-  }
-
-  ssize_t result = HANDLE_EINTR(sendmsg(h.handle, &msg, kSendFlags));
-  if (result < 1) {
-    DCHECK_EQ(result, -1);
-    return false;
-  }
-
-  for (size_t i = 0; i < num_handles; i++)
-    handles[i].CloseIfNecessary();
-  return true;
-}
-
-ssize_t PlatformChannelRecvmsg(PlatformHandle h,
-                               void* buf,
-                               size_t num_bytes,
-                               std::deque<PlatformHandle>* platform_handles,
-                               bool block) {
-  DCHECK(buf);
-  DCHECK_GT(num_bytes, 0u);
-  DCHECK(platform_handles);
-
-  struct iovec iov = {buf, num_bytes};
-  char cmsg_buf[CMSG_SPACE(kPlatformChannelMaxNumHandles * sizeof(int))];
-  struct msghdr msg = {};
-  msg.msg_iov = &iov;
-  msg.msg_iovlen = 1;
-  msg.msg_control = cmsg_buf;
-  msg.msg_controllen = sizeof(cmsg_buf);
-
-  ssize_t result =
-      HANDLE_EINTR(recvmsg(h.handle, &msg, block ? 0 : MSG_DONTWAIT));
-  if (result < 0)
-    return result;
-
-  // Success; no control messages.
-  if (msg.msg_controllen == 0)
-    return result;
-
-  DCHECK(!(msg.msg_flags & MSG_CTRUNC));
-
-  for (cmsghdr* cmsg = CMSG_FIRSTHDR(&msg); cmsg;
-       cmsg = CMSG_NXTHDR(&msg, cmsg)) {
-    if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) {
-      size_t payload_length = cmsg->cmsg_len - CMSG_LEN(0);
-      DCHECK_EQ(payload_length % sizeof(int), 0u);
-      size_t num_fds = payload_length / sizeof(int);
-      const int* fds = reinterpret_cast<int*>(CMSG_DATA(cmsg));
-      for (size_t i = 0; i < num_fds; i++) {
-        platform_handles->push_back(PlatformHandle(fds[i]));
-        DCHECK(platform_handles->back().is_valid());
-      }
-    }
-  }
-
-  return result;
-}
-
-bool ServerAcceptConnection(PlatformHandle server_handle,
-                            ScopedPlatformHandle* connection_handle,
-                            bool check_peer_user) {
-  DCHECK(server_handle.is_valid());
-  connection_handle->reset();
-#if defined(OS_NACL)
-  NOTREACHED();
-  return false;
-#else
-  ScopedPlatformHandle accept_handle(
-      PlatformHandle(HANDLE_EINTR(accept(server_handle.handle, NULL, 0))));
-  if (!accept_handle.is_valid())
-    return IsRecoverableError();
-
-  // Verify that the IPC channel peer is running as the same user.
-  if (check_peer_user && !IsPeerAuthorized(accept_handle.get())) {
-    return true;
-  }
-
-  if (!base::SetNonBlocking(accept_handle.get().handle)) {
-    PLOG(ERROR) << "base::SetNonBlocking() failed "
-                << accept_handle.get().handle;
-    // It's safe to keep listening on |server_handle| even if the attempt to set
-    // O_NONBLOCK failed on the client fd.
-    return true;
-  }
-
-  *connection_handle = std::move(accept_handle);
-  return true;
-#endif  // defined(OS_NACL)
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_channel_utils_posix.h b/mojo/edk/embedder/platform_channel_utils_posix.h
deleted file mode 100644
index 23cfa92..0000000
--- a/mojo/edk/embedder/platform_channel_utils_posix.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_PLATFORM_CHANNEL_UTILS_POSIX_H_
-#define MOJO_EDK_EMBEDDER_PLATFORM_CHANNEL_UTILS_POSIX_H_
-
-#include <stddef.h>
-#include <sys/types.h>  // For |ssize_t|.
-
-#include <deque>
-#include <memory>
-
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-struct iovec;  // Declared in <sys/uio.h>.
-
-namespace mojo {
-namespace edk {
-class ScopedPlatformHandle;
-
-// The maximum number of handles that can be sent "at once" using
-// |PlatformChannelSendmsgWithHandles()|. This must be less than the Linux
-// kernel's SCM_MAX_FD which is 253.
-const size_t kPlatformChannelMaxNumHandles = 128;
-
-// Use these to write to a socket created using |PlatformChannelPair| (or
-// equivalent). These are like |write()| and |writev()|, but handle |EINTR| and
-// never raise |SIGPIPE|. (Note: On Mac, the suppression of |SIGPIPE| is set up
-// by |PlatformChannelPair|.)
-MOJO_SYSTEM_IMPL_EXPORT ssize_t
-PlatformChannelWrite(PlatformHandle h, const void* bytes, size_t num_bytes);
-MOJO_SYSTEM_IMPL_EXPORT ssize_t
-PlatformChannelWritev(PlatformHandle h, struct iovec* iov, size_t num_iov);
-
-// Writes data, and the given set of |PlatformHandle|s (i.e., file descriptors)
-// over the Unix domain socket given by |h| (e.g., created using
-// |PlatformChannelPair()|). All the handles must be valid, and there must be at
-// least one and at most |kPlatformChannelMaxNumHandles| handles. The return
-// value is as for |sendmsg()|, namely -1 on failure and otherwise the number of
-// bytes of data sent on success (note that this may not be all the data
-// specified by |iov|). (The handles are not closed, regardless of success or
-// failure.)
-MOJO_SYSTEM_IMPL_EXPORT ssize_t
-PlatformChannelSendmsgWithHandles(PlatformHandle h,
-                                  struct iovec* iov,
-                                  size_t num_iov,
-                                  PlatformHandle* platform_handles,
-                                  size_t num_platform_handles);
-
-// TODO(vtl): Remove this once I've switched things over to
-// |PlatformChannelSendmsgWithHandles()|.
-// Sends |PlatformHandle|s (i.e., file descriptors) over the Unix domain socket
-// (e.g., created using PlatformChannelPair|). (These will be sent in a single
-// message having one null byte of data and one control message header with all
-// the file descriptors.) All of the handles must be valid, and there must be at
-// most |kPlatformChannelMaxNumHandles| (and at least one handle). Returns true
-// on success, in which case it closes all the handles.
-MOJO_SYSTEM_IMPL_EXPORT bool PlatformChannelSendHandles(PlatformHandle h,
-                                                        PlatformHandle* handles,
-                                                        size_t num_handles);
-
-// Wrapper around |recvmsg()|, which will extract any attached file descriptors
-// (in the control message) to |PlatformHandle|s (and append them to
-// |platform_handles|). (This also handles |EINTR|.)
-MOJO_SYSTEM_IMPL_EXPORT ssize_t
-PlatformChannelRecvmsg(PlatformHandle h,
-                       void* buf,
-                       size_t num_bytes,
-                       std::deque<PlatformHandle>* platform_handles,
-                       bool block = false);
-
-// Returns false if |server_handle| encounters an unrecoverable error.
-// Returns true if it's valid to keep listening on |server_handle|. In this
-// case, it's possible that a connection wasn't successfully established; then,
-// |connection_handle| will be invalid. If |check_peer_user| is True, the
-// connection will be rejected if the peer is running as a different user.
-MOJO_SYSTEM_IMPL_EXPORT bool ServerAcceptConnection(
-    PlatformHandle server_handle,
-    ScopedPlatformHandle* connection_handle,
-    bool check_peer_user = true);
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PLATFORM_CHANNEL_UTILS_POSIX_H_
diff --git a/mojo/edk/embedder/platform_handle.cc b/mojo/edk/embedder/platform_handle.cc
deleted file mode 100644
index b6b2cd2..0000000
--- a/mojo/edk/embedder/platform_handle.cc
+++ /dev/null
@@ -1,74 +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.
-
-#include "mojo/edk/embedder/platform_handle.h"
-
-#include "build/build_config.h"
-#if defined(OS_POSIX)
-#include <unistd.h>
-#elif defined(OS_WIN)
-#include <windows.h>
-#else
-#error "Platform not yet supported."
-#endif
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace edk {
-
-void PlatformHandle::CloseIfNecessary() {
-  if (!is_valid())
-    return;
-
-#if defined(OS_POSIX)
-  if (type == Type::POSIX) {
-    bool success = (close(handle) == 0);
-    DPCHECK(success);
-    handle = -1;
-  }
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  else if (type == Type::MACH) {
-    kern_return_t rv = mach_port_deallocate(mach_task_self(), port);
-    DPCHECK(rv == KERN_SUCCESS);
-    port = MACH_PORT_NULL;
-  }
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-#elif defined(OS_WIN)
-  if (owning_process != base::GetCurrentProcessHandle()) {
-    // This handle may have been duplicated to a new target process but not yet
-    // sent there. In this case CloseHandle should NOT be called. From MSDN
-    // documentation for DuplicateHandle[1]:
-    //
-    //    Normally the target process closes a duplicated handle when that
-    //    process is finished using the handle. To close a duplicated handle
-    //    from the source process, call DuplicateHandle with the following
-    //    parameters:
-    //
-    //    * Set hSourceProcessHandle to the target process from the
-    //      call that created the handle.
-    //    * Set hSourceHandle to the duplicated handle to close.
-    //    * Set lpTargetHandle to NULL.
-    //    * Set dwOptions to DUPLICATE_CLOSE_SOURCE.
-    //
-    // [1] https://msdn.microsoft.com/en-us/library/windows/desktop/ms724251
-    //
-    // NOTE: It's possible for this operation to fail if the owning process
-    // was terminated or is in the process of being terminated. Either way,
-    // there is nothing we can reasonably do about failure, so we ignore it.
-    DuplicateHandle(owning_process, handle, NULL, &handle, 0, FALSE,
-                    DUPLICATE_CLOSE_SOURCE);
-    return;
-  }
-
-  bool success = !!CloseHandle(handle);
-  DPCHECK(success);
-  handle = INVALID_HANDLE_VALUE;
-#else
-#error "Platform not yet supported."
-#endif
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_handle.h b/mojo/edk/embedder/platform_handle.h
deleted file mode 100644
index 4866e75..0000000
--- a/mojo/edk/embedder/platform_handle.h
+++ /dev/null
@@ -1,90 +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.
-
-#ifndef MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_H_
-#define MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_H_
-
-#include "build/build_config.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-
-#include "base/process/process_handle.h"
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-#include <mach/mach.h>
-#endif
-
-namespace mojo {
-namespace edk {
-
-#if defined(OS_POSIX)
-struct MOJO_SYSTEM_IMPL_EXPORT PlatformHandle {
-  PlatformHandle() {}
-  explicit PlatformHandle(int handle) : handle(handle) {}
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  explicit PlatformHandle(mach_port_t port)
-      : type(Type::MACH), port(port) {}
-#endif
-
-  void CloseIfNecessary();
-
-  bool is_valid() const {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    if (type == Type::MACH || type == Type::MACH_NAME)
-      return port != MACH_PORT_NULL;
-#endif
-    return handle != -1;
-  }
-
-  enum class Type {
-    POSIX,
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    MACH,
-    // MACH_NAME isn't a real Mach port. But rather the "name" of one that can
-    // be resolved to a real port later. This distinction is needed so that the
-    // "port" doesn't try to be closed if CloseIfNecessary() is called. Having
-    // this also allows us to do checks in other places.
-    MACH_NAME,
-#endif
-  };
-  Type type = Type::POSIX;
-
-  int handle = -1;
-
-  // A POSIX handle may be a listen handle that can accept a connection.
-  bool needs_connection = false;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  mach_port_t port = MACH_PORT_NULL;
-#endif
-};
-#elif defined(OS_WIN)
-struct MOJO_SYSTEM_IMPL_EXPORT PlatformHandle {
-  PlatformHandle() : PlatformHandle(INVALID_HANDLE_VALUE) {}
-  explicit PlatformHandle(HANDLE handle)
-      : handle(handle), owning_process(base::GetCurrentProcessHandle()) {}
-
-  void CloseIfNecessary();
-
-  bool is_valid() const { return handle != INVALID_HANDLE_VALUE; }
-
-  HANDLE handle;
-
-  // A Windows HANDLE may be duplicated to another process but not yet sent to
-  // that process. This tracks the handle's owning process.
-  base::ProcessHandle owning_process;
-
-  // A Windows HANDLE may be an unconnected named pipe. In this case, we need to
-  // wait for a connection before communicating on the pipe.
-  bool needs_connection = false;
-};
-#else
-#error "Platform not yet supported."
-#endif
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_H_
diff --git a/mojo/edk/embedder/platform_handle_utils.h b/mojo/edk/embedder/platform_handle_utils.h
deleted file mode 100644
index fa683e4..0000000
--- a/mojo/edk/embedder/platform_handle_utils.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_UTILS_H_
-#define MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_UTILS_H_
-
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-// Closes all the |PlatformHandle|s in the given container.
-template <typename PlatformHandleContainer>
-MOJO_SYSTEM_IMPL_EXPORT inline void CloseAllPlatformHandles(
-    PlatformHandleContainer* platform_handles) {
-  for (typename PlatformHandleContainer::iterator it =
-           platform_handles->begin();
-       it != platform_handles->end(); ++it)
-    it->CloseIfNecessary();
-}
-
-// Duplicates the given |PlatformHandle| (which must be valid). (Returns an
-// invalid |ScopedPlatformHandle| on failure.)
-MOJO_SYSTEM_IMPL_EXPORT ScopedPlatformHandle
-DuplicatePlatformHandle(PlatformHandle platform_handle);
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_UTILS_H_
diff --git a/mojo/edk/embedder/platform_handle_utils_posix.cc b/mojo/edk/embedder/platform_handle_utils_posix.cc
deleted file mode 100644
index 5604f96..0000000
--- a/mojo/edk/embedder/platform_handle_utils_posix.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/platform_handle_utils.h"
-
-#include <unistd.h>
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace edk {
-
-ScopedPlatformHandle DuplicatePlatformHandle(PlatformHandle platform_handle) {
-  DCHECK(platform_handle.is_valid());
-  // Note that |dup()| returns -1 on error (which is exactly the value we use
-  // for invalid |PlatformHandle| FDs).
-  PlatformHandle duped(dup(platform_handle.handle));
-  duped.needs_connection = platform_handle.needs_connection;
-  return ScopedPlatformHandle(duped);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_handle_utils_win.cc b/mojo/edk/embedder/platform_handle_utils_win.cc
deleted file mode 100644
index 32ed49a..0000000
--- a/mojo/edk/embedder/platform_handle_utils_win.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/platform_handle_utils.h"
-
-#include <windows.h>
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace edk {
-
-ScopedPlatformHandle DuplicatePlatformHandle(PlatformHandle platform_handle) {
-  DCHECK(platform_handle.is_valid());
-
-  HANDLE new_handle;
-  CHECK_NE(platform_handle.handle, INVALID_HANDLE_VALUE);
-  if (!DuplicateHandle(GetCurrentProcess(), platform_handle.handle,
-                       GetCurrentProcess(), &new_handle, 0, TRUE,
-                       DUPLICATE_SAME_ACCESS))
-    return ScopedPlatformHandle();
-  DCHECK_NE(new_handle, INVALID_HANDLE_VALUE);
-  return ScopedPlatformHandle(PlatformHandle(new_handle));
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_handle_vector.h b/mojo/edk/embedder/platform_handle_vector.h
deleted file mode 100644
index 9892b23..0000000
--- a/mojo/edk/embedder/platform_handle_vector.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_VECTOR_H_
-#define MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_VECTOR_H_
-
-#include <memory>
-#include <vector>
-
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/embedder/platform_handle_utils.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-using PlatformHandleVector = std::vector<PlatformHandle>;
-
-// A deleter (for use with |scoped_ptr|) which closes all handles and then
-// |delete|s the |PlatformHandleVector|.
-struct MOJO_SYSTEM_IMPL_EXPORT PlatformHandleVectorDeleter {
-  void operator()(PlatformHandleVector* platform_handles) const {
-    CloseAllPlatformHandles(platform_handles);
-    delete platform_handles;
-  }
-};
-
-using ScopedPlatformHandleVectorPtr =
-    std::unique_ptr<PlatformHandleVector, PlatformHandleVectorDeleter>;
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_VECTOR_H_
diff --git a/mojo/edk/embedder/platform_shared_buffer.cc b/mojo/edk/embedder/platform_shared_buffer.cc
deleted file mode 100644
index 58af44d..0000000
--- a/mojo/edk/embedder/platform_shared_buffer.cc
+++ /dev/null
@@ -1,325 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-
-#include <stddef.h>
-
-#include <utility>
-
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/shared_memory.h"
-#include "base/process/process_handle.h"
-#include "base/sys_info.h"
-#include "mojo/edk/embedder/platform_handle_utils.h"
-
-#if defined(OS_NACL)
-// For getpagesize() on NaCl.
-#include <unistd.h>
-#endif
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-// Takes ownership of |memory_handle|.
-ScopedPlatformHandle SharedMemoryToPlatformHandle(
-    base::SharedMemoryHandle memory_handle) {
-#if defined(OS_POSIX) && !(defined(OS_MACOSX) && !defined(OS_IOS))
-  return ScopedPlatformHandle(PlatformHandle(memory_handle.fd));
-#elif defined(OS_WIN)
-  return ScopedPlatformHandle(PlatformHandle(memory_handle.GetHandle()));
-#else
-  return ScopedPlatformHandle(PlatformHandle(memory_handle.GetMemoryObject()));
-#endif
-}
-
-}  // namespace
-
-// static
-PlatformSharedBuffer* PlatformSharedBuffer::Create(size_t num_bytes) {
-  DCHECK_GT(num_bytes, 0u);
-
-  PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes, false);
-  if (!rv->Init()) {
-    // We can't just delete it directly, due to the "in destructor" (debug)
-    // check.
-    scoped_refptr<PlatformSharedBuffer> deleter(rv);
-    return nullptr;
-  }
-
-  return rv;
-}
-
-// static
-PlatformSharedBuffer* PlatformSharedBuffer::CreateFromPlatformHandle(
-    size_t num_bytes,
-    bool read_only,
-    ScopedPlatformHandle platform_handle) {
-  DCHECK_GT(num_bytes, 0u);
-
-  PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes, read_only);
-  if (!rv->InitFromPlatformHandle(std::move(platform_handle))) {
-    // We can't just delete it directly, due to the "in destructor" (debug)
-    // check.
-    scoped_refptr<PlatformSharedBuffer> deleter(rv);
-    return nullptr;
-  }
-
-  return rv;
-}
-
-// static
-PlatformSharedBuffer* PlatformSharedBuffer::CreateFromPlatformHandlePair(
-    size_t num_bytes,
-    ScopedPlatformHandle rw_platform_handle,
-    ScopedPlatformHandle ro_platform_handle) {
-  DCHECK_GT(num_bytes, 0u);
-  DCHECK(rw_platform_handle.is_valid());
-  DCHECK(ro_platform_handle.is_valid());
-
-  PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes, false);
-  if (!rv->InitFromPlatformHandlePair(std::move(rw_platform_handle),
-                                      std::move(ro_platform_handle))) {
-    // We can't just delete it directly, due to the "in destructor" (debug)
-    // check.
-    scoped_refptr<PlatformSharedBuffer> deleter(rv);
-    return nullptr;
-  }
-
-  return rv;
-}
-
-// static
-PlatformSharedBuffer* PlatformSharedBuffer::CreateFromSharedMemoryHandle(
-    size_t num_bytes,
-    bool read_only,
-    base::SharedMemoryHandle handle) {
-  DCHECK_GT(num_bytes, 0u);
-
-  PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes, read_only);
-  rv->InitFromSharedMemoryHandle(handle);
-
-  return rv;
-}
-
-size_t PlatformSharedBuffer::GetNumBytes() const {
-  return num_bytes_;
-}
-
-bool PlatformSharedBuffer::IsReadOnly() const {
-  return read_only_;
-}
-
-std::unique_ptr<PlatformSharedBufferMapping> PlatformSharedBuffer::Map(
-    size_t offset,
-    size_t length) {
-  if (!IsValidMap(offset, length))
-    return nullptr;
-
-  return MapNoCheck(offset, length);
-}
-
-bool PlatformSharedBuffer::IsValidMap(size_t offset, size_t length) {
-  if (offset > num_bytes_ || length == 0)
-    return false;
-
-  // Note: This is an overflow-safe check of |offset + length > num_bytes_|
-  // (that |num_bytes >= offset| is verified above).
-  if (length > num_bytes_ - offset)
-    return false;
-
-  return true;
-}
-
-std::unique_ptr<PlatformSharedBufferMapping> PlatformSharedBuffer::MapNoCheck(
-    size_t offset,
-    size_t length) {
-  DCHECK(IsValidMap(offset, length));
-  DCHECK(shared_memory_);
-  base::SharedMemoryHandle handle;
-  {
-    base::AutoLock locker(lock_);
-    handle = base::SharedMemory::DuplicateHandle(shared_memory_->handle());
-  }
-  if (handle == base::SharedMemory::NULLHandle())
-    return nullptr;
-
-  std::unique_ptr<PlatformSharedBufferMapping> mapping(
-      new PlatformSharedBufferMapping(handle, read_only_, offset, length));
-  if (mapping->Map())
-    return base::WrapUnique(mapping.release());
-
-  return nullptr;
-}
-
-ScopedPlatformHandle PlatformSharedBuffer::DuplicatePlatformHandle() {
-  DCHECK(shared_memory_);
-  base::SharedMemoryHandle handle;
-  {
-    base::AutoLock locker(lock_);
-    handle = base::SharedMemory::DuplicateHandle(shared_memory_->handle());
-  }
-  if (handle == base::SharedMemory::NULLHandle())
-    return ScopedPlatformHandle();
-
-  return SharedMemoryToPlatformHandle(handle);
-}
-
-ScopedPlatformHandle PlatformSharedBuffer::PassPlatformHandle() {
-  DCHECK(HasOneRef());
-
-  // The only way to pass a handle from base::SharedMemory is to duplicate it
-  // and close the original.
-  ScopedPlatformHandle handle = DuplicatePlatformHandle();
-
-  base::AutoLock locker(lock_);
-  shared_memory_->Close();
-  return handle;
-}
-
-base::SharedMemoryHandle PlatformSharedBuffer::DuplicateSharedMemoryHandle() {
-  DCHECK(shared_memory_);
-
-  base::AutoLock locker(lock_);
-  return base::SharedMemory::DuplicateHandle(shared_memory_->handle());
-}
-
-PlatformSharedBuffer* PlatformSharedBuffer::CreateReadOnlyDuplicate() {
-  DCHECK(shared_memory_);
-
-  if (ro_shared_memory_) {
-    base::AutoLock locker(lock_);
-    base::SharedMemoryHandle handle;
-    handle = base::SharedMemory::DuplicateHandle(ro_shared_memory_->handle());
-    if (handle == base::SharedMemory::NULLHandle())
-      return nullptr;
-    return CreateFromSharedMemoryHandle(num_bytes_, true, handle);
-  }
-
-  base::SharedMemoryHandle handle;
-  bool success;
-  {
-    base::AutoLock locker(lock_);
-    success = shared_memory_->ShareReadOnlyToProcess(
-        base::GetCurrentProcessHandle(), &handle);
-  }
-  if (!success || handle == base::SharedMemory::NULLHandle())
-      return nullptr;
-
-  return CreateFromSharedMemoryHandle(num_bytes_, true, handle);
-}
-
-PlatformSharedBuffer::PlatformSharedBuffer(size_t num_bytes, bool read_only)
-    : num_bytes_(num_bytes), read_only_(read_only) {}
-
-PlatformSharedBuffer::~PlatformSharedBuffer() {}
-
-bool PlatformSharedBuffer::Init() {
-  DCHECK(!shared_memory_);
-  DCHECK(!read_only_);
-
-  base::SharedMemoryCreateOptions options;
-  options.size = num_bytes_;
-  // By default, we can share as read-only.
-  options.share_read_only = true;
-
-  shared_memory_.reset(new base::SharedMemory);
-  return shared_memory_->Create(options);
-}
-
-bool PlatformSharedBuffer::InitFromPlatformHandle(
-    ScopedPlatformHandle platform_handle) {
-  DCHECK(!shared_memory_);
-
-#if defined(OS_WIN)
-  base::SharedMemoryHandle handle(platform_handle.release().handle,
-                                  base::GetCurrentProcId());
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  base::SharedMemoryHandle handle;
-  handle = base::SharedMemoryHandle(platform_handle.release().port, num_bytes_,
-                                    base::GetCurrentProcId());
-#else
-  base::SharedMemoryHandle handle(platform_handle.release().handle, false);
-#endif
-
-  shared_memory_.reset(new base::SharedMemory(handle, read_only_));
-  return true;
-}
-
-bool PlatformSharedBuffer::InitFromPlatformHandlePair(
-    ScopedPlatformHandle rw_platform_handle,
-    ScopedPlatformHandle ro_platform_handle) {
-#if defined(OS_MACOSX)
-  NOTREACHED();
-  return false;
-#else  // defined(OS_MACOSX)
-
-#if defined(OS_WIN)
-  base::SharedMemoryHandle handle(rw_platform_handle.release().handle,
-                                  base::GetCurrentProcId());
-  base::SharedMemoryHandle ro_handle(ro_platform_handle.release().handle,
-                                     base::GetCurrentProcId());
-#else  // defined(OS_WIN)
-  base::SharedMemoryHandle handle(rw_platform_handle.release().handle, false);
-  base::SharedMemoryHandle ro_handle(ro_platform_handle.release().handle,
-                                     false);
-#endif  // defined(OS_WIN)
-
-  DCHECK(!shared_memory_);
-  shared_memory_.reset(new base::SharedMemory(handle, false));
-  ro_shared_memory_.reset(new base::SharedMemory(ro_handle, true));
-  return true;
-
-#endif  // defined(OS_MACOSX)
-}
-
-void PlatformSharedBuffer::InitFromSharedMemoryHandle(
-    base::SharedMemoryHandle handle) {
-  DCHECK(!shared_memory_);
-
-  shared_memory_.reset(new base::SharedMemory(handle, read_only_));
-}
-
-PlatformSharedBufferMapping::~PlatformSharedBufferMapping() {
-  Unmap();
-}
-
-void* PlatformSharedBufferMapping::GetBase() const {
-  return base_;
-}
-
-size_t PlatformSharedBufferMapping::GetLength() const {
-  return length_;
-}
-
-bool PlatformSharedBufferMapping::Map() {
-  // Mojo shared buffers can be mapped at any offset. However,
-  // base::SharedMemory must be mapped at a page boundary. So calculate what the
-  // nearest whole page offset is, and build a mapping that's offset from that.
-#if defined(OS_NACL)
-  // base::SysInfo isn't available under NaCl.
-  size_t page_size = getpagesize();
-#else
-  size_t page_size = base::SysInfo::VMAllocationGranularity();
-#endif
-  size_t offset_rounding = offset_ % page_size;
-  size_t real_offset = offset_ - offset_rounding;
-  size_t real_length = length_ + offset_rounding;
-
-  if (!shared_memory_.MapAt(static_cast<off_t>(real_offset), real_length))
-    return false;
-
-  base_ = static_cast<char*>(shared_memory_.memory()) + offset_rounding;
-  return true;
-}
-
-void PlatformSharedBufferMapping::Unmap() {
-  shared_memory_.Unmap();
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_shared_buffer.h b/mojo/edk/embedder/platform_shared_buffer.h
deleted file mode 100644
index 45be723..0000000
--- a/mojo/edk/embedder/platform_shared_buffer.h
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_PLATFORM_SHARED_BUFFER_H_
-#define MOJO_EDK_EMBEDDER_PLATFORM_SHARED_BUFFER_H_
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/shared_memory.h"
-#include "base/memory/shared_memory_handle.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-class PlatformSharedBufferMapping;
-
-// |PlatformSharedBuffer| is a thread-safe, ref-counted wrapper around
-// OS-specific shared memory. It has the following features:
-//   - A |PlatformSharedBuffer| simply represents a piece of shared memory that
-//     *may* be mapped and *may* be shared to another process.
-//   - A single |PlatformSharedBuffer| may be mapped multiple times. The
-//     lifetime of the mapping (owned by |PlatformSharedBufferMapping|) is
-//     separate from the lifetime of the |PlatformSharedBuffer|.
-//   - Sizes/offsets (of the shared memory and mappings) are arbitrary, and not
-//     restricted by page size. However, more memory may actually be mapped than
-//     requested.
-class MOJO_SYSTEM_IMPL_EXPORT PlatformSharedBuffer
-    : public base::RefCountedThreadSafe<PlatformSharedBuffer> {
- public:
-  // Creates a shared buffer of size |num_bytes| bytes (initially zero-filled).
-  // |num_bytes| must be nonzero. Returns null on failure.
-  static PlatformSharedBuffer* Create(size_t num_bytes);
-
-  // Creates a shared buffer of size |num_bytes| from the existing platform
-  // handle |platform_handle|. Returns null on failure.
-  static PlatformSharedBuffer* CreateFromPlatformHandle(
-      size_t num_bytes,
-      bool read_only,
-      ScopedPlatformHandle platform_handle);
-
-  // Creates a shared buffer of size |num_bytes| from the existing pair of
-  // read/write and read-only handles |rw_platform_handle| and
-  // |ro_platform_handle|. Returns null on failure.
-  static PlatformSharedBuffer* CreateFromPlatformHandlePair(
-      size_t num_bytes,
-      ScopedPlatformHandle rw_platform_handle,
-      ScopedPlatformHandle ro_platform_handle);
-
-  // Creates a shared buffer of size |num_bytes| from the existing shared memory
-  // handle |handle|.
-  static PlatformSharedBuffer* CreateFromSharedMemoryHandle(
-      size_t num_bytes,
-      bool read_only,
-      base::SharedMemoryHandle handle);
-
-  // Gets the size of shared buffer (in number of bytes).
-  size_t GetNumBytes() const;
-
-  // Returns whether this shared buffer is read-only.
-  bool IsReadOnly() const;
-
-  // Maps (some) of the shared buffer into memory; [|offset|, |offset + length|]
-  // must be contained in [0, |num_bytes|], and |length| must be at least 1.
-  // Returns null on failure.
-  std::unique_ptr<PlatformSharedBufferMapping> Map(size_t offset,
-                                                   size_t length);
-
-  // Checks if |offset| and |length| are valid arguments.
-  bool IsValidMap(size_t offset, size_t length);
-
-  // Like |Map()|, but doesn't check its arguments (which should have been
-  // preflighted using |IsValidMap()|).
-  std::unique_ptr<PlatformSharedBufferMapping> MapNoCheck(size_t offset,
-                                                          size_t length);
-
-  // Duplicates the underlying platform handle and passes it to the caller.
-  ScopedPlatformHandle DuplicatePlatformHandle();
-
-  // Duplicates the underlying shared memory handle and passes it to the caller.
-  base::SharedMemoryHandle DuplicateSharedMemoryHandle();
-
-  // Passes the underlying platform handle to the caller. This should only be
-  // called if there's a unique reference to this object (owned by the caller).
-  // After calling this, this object should no longer be used, but should only
-  // be disposed of.
-  ScopedPlatformHandle PassPlatformHandle();
-
-  // Create and return a read-only duplicate of this shared buffer. If this
-  // shared buffer isn't capable of returning a read-only duplicate, then
-  // nullptr will be returned.
-  PlatformSharedBuffer* CreateReadOnlyDuplicate();
-
- private:
-  friend class base::RefCountedThreadSafe<PlatformSharedBuffer>;
-
-  PlatformSharedBuffer(size_t num_bytes, bool read_only);
-  ~PlatformSharedBuffer();
-
-  // This is called by |Create()| before this object is given to anyone.
-  bool Init();
-
-  // This is like |Init()|, but for |CreateFromPlatformHandle()|. (Note: It
-  // should verify that |platform_handle| is an appropriate handle for the
-  // claimed |num_bytes_|.)
-  bool InitFromPlatformHandle(ScopedPlatformHandle platform_handle);
-
-  bool InitFromPlatformHandlePair(ScopedPlatformHandle rw_platform_handle,
-                                  ScopedPlatformHandle ro_platform_handle);
-
-  void InitFromSharedMemoryHandle(base::SharedMemoryHandle handle);
-
-  const size_t num_bytes_;
-  const bool read_only_;
-
-  base::Lock lock_;
-  std::unique_ptr<base::SharedMemory> shared_memory_;
-
-  // A separate read-only shared memory for platforms that need it (i.e. Linux
-  // with sync broker).
-  std::unique_ptr<base::SharedMemory> ro_shared_memory_;
-
-  DISALLOW_COPY_AND_ASSIGN(PlatformSharedBuffer);
-};
-
-// A mapping of a |PlatformSharedBuffer| (compararable to a "file view" in
-// Windows); see above. Created by |PlatformSharedBuffer::Map()|. Automatically
-// unmaps memory on destruction.
-//
-// Mappings are NOT thread-safe.
-//
-// Note: This is an entirely separate class (instead of
-// |PlatformSharedBuffer::Mapping|) so that it can be forward-declared.
-class MOJO_SYSTEM_IMPL_EXPORT PlatformSharedBufferMapping {
- public:
-  ~PlatformSharedBufferMapping();
-
-  void* GetBase() const;
-  size_t GetLength() const;
-
- private:
-  friend class PlatformSharedBuffer;
-
-  PlatformSharedBufferMapping(base::SharedMemoryHandle handle,
-                              bool read_only,
-                              size_t offset,
-                              size_t length)
-      : offset_(offset),
-        length_(length),
-        base_(nullptr),
-        shared_memory_(handle, read_only) {}
-
-  bool Map();
-  void Unmap();
-
-  const size_t offset_;
-  const size_t length_;
-  void* base_;
-
-  // Since mapping life cycles are separate from PlatformSharedBuffer and a
-  // buffer can be mapped multiple times, we have our own SharedMemory object
-  // created from a duplicate handle.
-  base::SharedMemory shared_memory_;
-
-  DISALLOW_COPY_AND_ASSIGN(PlatformSharedBufferMapping);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PLATFORM_SHARED_BUFFER_H_
diff --git a/mojo/edk/embedder/platform_shared_buffer_unittest.cc b/mojo/edk/embedder/platform_shared_buffer_unittest.cc
deleted file mode 100644
index f1593f0..0000000
--- a/mojo/edk/embedder/platform_shared_buffer_unittest.cc
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-
-#include <stddef.h>
-
-#include <limits>
-#include <memory>
-
-#include "base/memory/ref_counted.h"
-#include "base/memory/shared_memory.h"
-#include "base/sys_info.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
-namespace mojo {
-namespace edk {
-namespace {
-
-TEST(PlatformSharedBufferTest, Basic) {
-  const size_t kNumInts = 100;
-  const size_t kNumBytes = kNumInts * sizeof(int);
-  // A fudge so that we're not just writing zero bytes 75% of the time.
-  const int kFudge = 1234567890;
-
-  // Make some memory.
-  scoped_refptr<PlatformSharedBuffer> buffer(
-      PlatformSharedBuffer::Create(kNumBytes));
-  ASSERT_TRUE(buffer);
-
-  // Map it all, scribble some stuff, and then unmap it.
-  {
-    EXPECT_TRUE(buffer->IsValidMap(0, kNumBytes));
-    std::unique_ptr<PlatformSharedBufferMapping> mapping(
-        buffer->Map(0, kNumBytes));
-    ASSERT_TRUE(mapping);
-    ASSERT_TRUE(mapping->GetBase());
-    int* stuff = static_cast<int*>(mapping->GetBase());
-    for (size_t i = 0; i < kNumInts; i++)
-      stuff[i] = static_cast<int>(i) + kFudge;
-  }
-
-  // Map it all again, check that our scribbling is still there, then do a
-  // partial mapping and scribble on that, check that everything is coherent,
-  // unmap the first mapping, scribble on some of the second mapping, and then
-  // unmap it.
-  {
-    ASSERT_TRUE(buffer->IsValidMap(0, kNumBytes));
-    // Use |MapNoCheck()| this time.
-    std::unique_ptr<PlatformSharedBufferMapping> mapping1(
-        buffer->MapNoCheck(0, kNumBytes));
-    ASSERT_TRUE(mapping1);
-    ASSERT_TRUE(mapping1->GetBase());
-    int* stuff1 = static_cast<int*>(mapping1->GetBase());
-    for (size_t i = 0; i < kNumInts; i++)
-      EXPECT_EQ(static_cast<int>(i) + kFudge, stuff1[i]) << i;
-
-    std::unique_ptr<PlatformSharedBufferMapping> mapping2(
-        buffer->Map((kNumInts / 2) * sizeof(int), 2 * sizeof(int)));
-    ASSERT_TRUE(mapping2);
-    ASSERT_TRUE(mapping2->GetBase());
-    int* stuff2 = static_cast<int*>(mapping2->GetBase());
-    EXPECT_EQ(static_cast<int>(kNumInts / 2) + kFudge, stuff2[0]);
-    EXPECT_EQ(static_cast<int>(kNumInts / 2) + 1 + kFudge, stuff2[1]);
-
-    stuff2[0] = 123;
-    stuff2[1] = 456;
-    EXPECT_EQ(123, stuff1[kNumInts / 2]);
-    EXPECT_EQ(456, stuff1[kNumInts / 2 + 1]);
-
-    mapping1.reset();
-
-    EXPECT_EQ(123, stuff2[0]);
-    EXPECT_EQ(456, stuff2[1]);
-    stuff2[1] = 789;
-  }
-
-  // Do another partial mapping and check that everything is the way we expect
-  // it to be.
-  {
-    EXPECT_TRUE(buffer->IsValidMap(sizeof(int), kNumBytes - sizeof(int)));
-    std::unique_ptr<PlatformSharedBufferMapping> mapping(
-        buffer->Map(sizeof(int), kNumBytes - sizeof(int)));
-    ASSERT_TRUE(mapping);
-    ASSERT_TRUE(mapping->GetBase());
-    int* stuff = static_cast<int*>(mapping->GetBase());
-
-    for (size_t j = 0; j < kNumInts - 1; j++) {
-      int i = static_cast<int>(j) + 1;
-      if (i == kNumInts / 2) {
-        EXPECT_EQ(123, stuff[j]);
-      } else if (i == kNumInts / 2 + 1) {
-        EXPECT_EQ(789, stuff[j]);
-      } else {
-        EXPECT_EQ(i + kFudge, stuff[j]) << i;
-      }
-    }
-  }
-}
-
-// TODO(vtl): Bigger buffers.
-
-TEST(PlatformSharedBufferTest, InvalidMappings) {
-  scoped_refptr<PlatformSharedBuffer> buffer(PlatformSharedBuffer::Create(100));
-  ASSERT_TRUE(buffer);
-
-  // Zero length not allowed.
-  EXPECT_FALSE(buffer->Map(0, 0));
-  EXPECT_FALSE(buffer->IsValidMap(0, 0));
-
-  // Okay:
-  EXPECT_TRUE(buffer->Map(0, 100));
-  EXPECT_TRUE(buffer->IsValidMap(0, 100));
-  // Offset + length too big.
-  EXPECT_FALSE(buffer->Map(0, 101));
-  EXPECT_FALSE(buffer->IsValidMap(0, 101));
-  EXPECT_FALSE(buffer->Map(1, 100));
-  EXPECT_FALSE(buffer->IsValidMap(1, 100));
-
-  // Okay:
-  EXPECT_TRUE(buffer->Map(50, 50));
-  EXPECT_TRUE(buffer->IsValidMap(50, 50));
-  // Offset + length too big.
-  EXPECT_FALSE(buffer->Map(50, 51));
-  EXPECT_FALSE(buffer->IsValidMap(50, 51));
-  EXPECT_FALSE(buffer->Map(51, 50));
-  EXPECT_FALSE(buffer->IsValidMap(51, 50));
-}
-
-TEST(PlatformSharedBufferTest, TooBig) {
-  // If |size_t| is 32-bit, it's quite possible/likely that |Create()| succeeds
-  // (since it only involves creating a 4 GB file).
-  size_t max_size = std::numeric_limits<size_t>::max();
-  if (base::SysInfo::AmountOfVirtualMemory() &&
-      max_size > static_cast<size_t>(base::SysInfo::AmountOfVirtualMemory()))
-    max_size = static_cast<size_t>(base::SysInfo::AmountOfVirtualMemory());
-  scoped_refptr<PlatformSharedBuffer> buffer(
-      PlatformSharedBuffer::Create(max_size));
-  // But, assuming |sizeof(size_t) == sizeof(void*)|, mapping all of it should
-  // always fail.
-  if (buffer)
-    EXPECT_FALSE(buffer->Map(0, max_size));
-}
-
-// Tests that separate mappings get distinct addresses.
-// Note: It's not inconceivable that the OS could ref-count identical mappings
-// and reuse the same address, in which case we'd have to be more careful about
-// using the address as the key for unmapping.
-TEST(PlatformSharedBufferTest, MappingsDistinct) {
-  scoped_refptr<PlatformSharedBuffer> buffer(PlatformSharedBuffer::Create(100));
-  std::unique_ptr<PlatformSharedBufferMapping> mapping1(buffer->Map(0, 100));
-  std::unique_ptr<PlatformSharedBufferMapping> mapping2(buffer->Map(0, 100));
-  EXPECT_NE(mapping1->GetBase(), mapping2->GetBase());
-}
-
-TEST(PlatformSharedBufferTest, BufferZeroInitialized) {
-  static const size_t kSizes[] = {10, 100, 1000, 10000, 100000};
-  for (size_t i = 0; i < arraysize(kSizes); i++) {
-    scoped_refptr<PlatformSharedBuffer> buffer(
-        PlatformSharedBuffer::Create(kSizes[i]));
-    std::unique_ptr<PlatformSharedBufferMapping> mapping(
-        buffer->Map(0, kSizes[i]));
-    for (size_t j = 0; j < kSizes[i]; j++) {
-      // "Assert" instead of "expect" so we don't spam the output with thousands
-      // of failures if we fail.
-      ASSERT_EQ('\0', static_cast<char*>(mapping->GetBase())[j])
-          << "size " << kSizes[i] << ", offset " << j;
-    }
-  }
-}
-
-TEST(PlatformSharedBufferTest, MappingsOutliveBuffer) {
-  std::unique_ptr<PlatformSharedBufferMapping> mapping1;
-  std::unique_ptr<PlatformSharedBufferMapping> mapping2;
-
-  {
-    scoped_refptr<PlatformSharedBuffer> buffer(
-        PlatformSharedBuffer::Create(100));
-    mapping1 = buffer->Map(0, 100);
-    mapping2 = buffer->Map(50, 50);
-    static_cast<char*>(mapping1->GetBase())[50] = 'x';
-  }
-
-  EXPECT_EQ('x', static_cast<char*>(mapping2->GetBase())[0]);
-
-  static_cast<char*>(mapping2->GetBase())[1] = 'y';
-  EXPECT_EQ('y', static_cast<char*>(mapping1->GetBase())[51]);
-}
-
-TEST(PlatformSharedBufferTest, FromSharedMemoryHandle) {
-  const size_t kBufferSize = 1234;
-  base::SharedMemoryCreateOptions options;
-  options.size = kBufferSize;
-  base::SharedMemory shared_memory;
-  ASSERT_TRUE(shared_memory.Create(options));
-  ASSERT_TRUE(shared_memory.Map(kBufferSize));
-
-  base::SharedMemoryHandle shm_handle =
-      base::SharedMemory::DuplicateHandle(shared_memory.handle());
-  scoped_refptr<PlatformSharedBuffer> simple_buffer(
-      PlatformSharedBuffer::CreateFromSharedMemoryHandle(
-          kBufferSize, false /* read_only */, shm_handle));
-  ASSERT_TRUE(simple_buffer);
-
-  std::unique_ptr<PlatformSharedBufferMapping> mapping =
-      simple_buffer->Map(0, kBufferSize);
-  ASSERT_TRUE(mapping);
-
-  const int kOffset = 123;
-  char* base_memory = static_cast<char*>(shared_memory.memory());
-  char* mojo_memory = static_cast<char*>(mapping->GetBase());
-  base_memory[kOffset] = 0;
-  EXPECT_EQ(0, mojo_memory[kOffset]);
-  base_memory[kOffset] = 'a';
-  EXPECT_EQ('a', mojo_memory[kOffset]);
-  mojo_memory[kOffset] = 'z';
-  EXPECT_EQ('z', base_memory[kOffset]);
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/scoped_ipc_support.cc b/mojo/edk/embedder/scoped_ipc_support.cc
deleted file mode 100644
index f67210a..0000000
--- a/mojo/edk/embedder/scoped_ipc_support.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2015 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 "mojo/edk/embedder/scoped_ipc_support.h"
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread_restrictions.h"
-#include "mojo/edk/embedder/embedder.h"
-
-namespace mojo {
-namespace edk {
-
-ScopedIPCSupport::ScopedIPCSupport(
-    scoped_refptr<base::TaskRunner> io_thread_task_runner,
-    ShutdownPolicy shutdown_policy) : shutdown_policy_(shutdown_policy) {
-  InitIPCSupport(io_thread_task_runner);
-}
-
-ScopedIPCSupport::~ScopedIPCSupport() {
-  if (shutdown_policy_ == ShutdownPolicy::FAST) {
-    ShutdownIPCSupport(base::Bind(&base::DoNothing));
-    return;
-  }
-
-  base::WaitableEvent shutdown_event(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  ShutdownIPCSupport(base::Bind(&base::WaitableEvent::Signal,
-                                base::Unretained(&shutdown_event)));
-
-  base::ThreadRestrictions::ScopedAllowWait allow_io;
-  shutdown_event.Wait();
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/scoped_ipc_support.h b/mojo/edk/embedder/scoped_ipc_support.h
deleted file mode 100644
index 22d8e50..0000000
--- a/mojo/edk/embedder/scoped_ipc_support.h
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2015 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 MOJO_EDK_EMBEDDER_SCOPED_IPC_SUPPORT_H_
-#define MOJO_EDK_EMBEDDER_SCOPED_IPC_SUPPORT_H_
-
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace base {
-class TaskRunner;
-}
-
-namespace mojo {
-namespace edk {
-
-// A simple class that calls |InitIPCSupport()| on construction and
-// |ShutdownIPCSupport()| on destruction, blocking the destructor on clean IPC
-// shutdown completion.
-class MOJO_SYSTEM_IMPL_EXPORT ScopedIPCSupport {
- public:
-  // ShutdownPolicy is a type for specifying the desired Mojo IPC support
-  // shutdown behavior used during ScopedIPCSupport destruction.
-  //
-  // What follows is a quick overview of why shutdown behavior is interesting
-  // and how you might decide which behavior is right for your use case.
-  //
-  // BACKGROUND
-  // ==========
-  //
-  // In order to facilitate efficient and reliable transfer of Mojo message pipe
-  // endpoints across process boundaries, the underlying model for a message
-  // pipe is actually a self-collapsing cycle of "ports." See
-  // //mojo/edk/system/ports for gritty implementation details.
-  //
-  // Ports are essentially globally unique identifiers used for system-wide
-  // message routing. Every message pipe consists of at least two such ports:
-  // the pipe's two concrete endpoints.
-  //
-  // When a message pipe endpoint is transferred over another message pipe, that
-  // endpoint's port (which subsequently exists only internally with no
-  // publicly-reachable handle) enters a transient proxying state for the
-  // remainder of its lifetime. Once sufficient information has been
-  // proagated throughout the system and this proxying port can be safely
-  // bypassed, it is garbage-collected.
-  //
-  // If a process is terminated while hosting any active proxy ports, this
-  // will necessarily break the message pipe(s) to which those ports belong.
-  //
-  // WHEN TO USE CLEAN SHUTDOWN
-  // ==========================
-  //
-  // Consider three processes, A, B, and C. Suppose A creates a message pipe,
-  // sending one end to B and the other to C. For some brief period of time,
-  // messages sent by B or C over this pipe may be proxied through A.
-  //
-  // If A is suddenly terminated, there may be no way for B's messages to reach
-  // C (and vice versa), since the message pipe state may not have been fully
-  // propagated to all concerned processes in the system. As such, both B and C
-  // may have no choice but to signal peer closure on their respective ends of
-  // the pipe, and thus the pipe may be broken despite a lack of intent by
-  // either B or C.
-  //
-  // This can also happen if A creates a pipe and passes one end to B, who then
-  // passes it along to C. B may temporarily proxy messages for this pipe
-  // between A and C, and B's sudden demise will in turn beget the pipe's
-  // own sudden demise.
-  //
-  // In situations where these sort of arrangements may occur, potentially
-  // proxying processes must ensure they are shut down cleanly in order to avoid
-  // flaky system behavior.
-  //
-  // WHEN TO USE FAST SHUTDOWN
-  // =========================
-  //
-  // As a general rule of thumb, if your process never creates a message pipe
-  // where both ends are passed to other processes, or never forwards a pipe
-  // endpoint from one process to another, fast shutdown is safe. Satisfaction
-  // of these constraints can be difficult to prove though, so clean shutdown is
-  // a safe default choice.
-  //
-  // Content renderer processes are a good example of a case where fast shutdown
-  // is safe, because as a matter of security and stability, a renderer cannot
-  // be trusted to do any proxying on behalf of two other processes anyway.
-  //
-  // There are other practical scenarios where fast shutdown is safe even if
-  // the process may have live proxies. For example, content's browser process
-  // is treated as a sort of master process in the system, in the sense that if
-  // the browser is terminated, no other part of the system is expected to
-  // continue normal operation anyway. In this case the side-effects of fast
-  // shutdown are irrelevant, so fast shutdown is preferred.
-  enum class ShutdownPolicy {
-    // Clean shutdown. This causes the ScopedIPCSupport destructor to *block*
-    // the calling thread until clean shutdown is complete. See explanation
-    // above for details.
-    CLEAN,
-
-    // Fast shutdown. In this case a cheap best-effort attempt is made to
-    // shut down the IPC system, but no effort is made to wait for its
-    // completion. See explanation above for details.
-    FAST,
-  };
-
-  ScopedIPCSupport(scoped_refptr<base::TaskRunner> io_thread_task_runner,
-                   ShutdownPolicy shutdown_policy);
-  ~ScopedIPCSupport();
-
- private:
-  const ShutdownPolicy shutdown_policy_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedIPCSupport);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_SCOPED_IPC_SUPPORT_H_
diff --git a/mojo/edk/embedder/scoped_platform_handle.h b/mojo/edk/embedder/scoped_platform_handle.h
deleted file mode 100644
index 15b80ea..0000000
--- a/mojo/edk/embedder/scoped_platform_handle.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_SCOPED_PLATFORM_HANDLE_H_
-#define MOJO_EDK_EMBEDDER_SCOPED_PLATFORM_HANDLE_H_
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/macros.h"
-
-namespace mojo {
-namespace edk {
-
-class MOJO_SYSTEM_IMPL_EXPORT ScopedPlatformHandle {
- public:
-  ScopedPlatformHandle() {}
-  explicit ScopedPlatformHandle(PlatformHandle handle) : handle_(handle) {}
-  ~ScopedPlatformHandle() { handle_.CloseIfNecessary(); }
-
-  // Move-only constructor and operator=.
-  ScopedPlatformHandle(ScopedPlatformHandle&& other)
-      : handle_(other.release()) {}
-
-  ScopedPlatformHandle& operator=(ScopedPlatformHandle&& other) {
-    if (this != &other)
-      handle_ = other.release();
-    return *this;
-  }
-
-  const PlatformHandle& get() const { return handle_; }
-
-  void swap(ScopedPlatformHandle& other) {
-    PlatformHandle temp = handle_;
-    handle_ = other.handle_;
-    other.handle_ = temp;
-  }
-
-  PlatformHandle release() WARN_UNUSED_RESULT {
-    PlatformHandle rv = handle_;
-    handle_ = PlatformHandle();
-    return rv;
-  }
-
-  void reset(PlatformHandle handle = PlatformHandle()) {
-    handle_.CloseIfNecessary();
-    handle_ = handle;
-  }
-
-  bool is_valid() const { return handle_.is_valid(); }
-
- private:
-  PlatformHandle handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedPlatformHandle);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_SCOPED_PLATFORM_HANDLE_H_
diff --git a/mojo/edk/embedder/test_embedder.cc b/mojo/edk/embedder/test_embedder.cc
deleted file mode 100644
index 9658010..0000000
--- a/mojo/edk/embedder/test_embedder.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/test_embedder.h"
-
-#include <memory>
-
-#include "base/logging.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/handle_table.h"
-
-namespace mojo {
-
-namespace edk {
-namespace internal {
-
-bool ShutdownCheckNoLeaks(Core* core) {
-  std::vector<MojoHandle> leaked_handles;
-  core->GetActiveHandlesForTest(&leaked_handles);
-  if (leaked_handles.empty())
-    return true;
-  for (auto handle : leaked_handles)
-    LOG(ERROR) << "Mojo embedder shutdown: Leaking handle " << handle;
-  return false;
-}
-
-}  // namespace internal
-
-namespace test {
-
-bool Shutdown() {
-  CHECK(internal::g_core);
-  bool rv = internal::ShutdownCheckNoLeaks(internal::g_core);
-  delete internal::g_core;
-  internal::g_core = nullptr;
-
-  return rv;
-}
-
-}  // namespace test
-}  // namespace edk
-
-}  // namespace mojo
diff --git a/mojo/edk/embedder/test_embedder.h b/mojo/edk/embedder/test_embedder.h
deleted file mode 100644
index c64ba17..0000000
--- a/mojo/edk/embedder/test_embedder.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_TEST_EMBEDDER_H_
-#define MOJO_EDK_EMBEDDER_TEST_EMBEDDER_H_
-
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-// This shuts down the global, singleton instance. (Note: "Real" embedders are
-// not expected to ever shut down this instance. This |Shutdown()| function will
-// do more work to ensure that tests don't leak, etc.) Returns true if there
-// were no problems, false if there were leaks -- i.e., handles still open -- or
-// any other problems.
-//
-// Note: It is up to the caller to ensure that there are not outstanding
-// callbacks from |CreateChannel()| before calling this.
-MOJO_SYSTEM_IMPL_EXPORT bool Shutdown();
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_TEST_EMBEDDER_H_
diff --git a/mojo/edk/js/BUILD.gn b/mojo/edk/js/BUILD.gn
deleted file mode 100644
index fc1e03c..0000000
--- a/mojo/edk/js/BUILD.gn
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-component("js") {
-  sources = [
-    "core.cc",
-    "core.h",
-    "drain_data.cc",
-    "drain_data.h",
-    "handle.cc",
-    "handle.h",
-    "handle_close_observer.h",
-    "js_export.h",
-    "mojo_runner_delegate.cc",
-    "mojo_runner_delegate.h",
-    "support.cc",
-    "support.h",
-    "threading.cc",
-    "threading.h",
-    "waiting_callback.cc",
-    "waiting_callback.h",
-  ]
-
-  public_deps = [
-    "//base",
-    "//gin",
-    "//v8",
-  ]
-
-  deps = [
-    "//mojo/public/cpp/system",
-  ]
-  defines = [ "MOJO_JS_IMPLEMENTATION" ]
-}
diff --git a/mojo/edk/js/core.cc b/mojo/edk/js/core.cc
deleted file mode 100644
index baccc4c..0000000
--- a/mojo/edk/js/core.cc
+++ /dev/null
@@ -1,454 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/js/core.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "gin/arguments.h"
-#include "gin/array_buffer.h"
-#include "gin/converter.h"
-#include "gin/dictionary.h"
-#include "gin/function_template.h"
-#include "gin/handle.h"
-#include "gin/object_template_builder.h"
-#include "gin/per_isolate_data.h"
-#include "gin/public/wrapper_info.h"
-#include "gin/wrappable.h"
-#include "mojo/edk/js/drain_data.h"
-#include "mojo/edk/js/handle.h"
-#include "mojo/public/cpp/system/wait.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-namespace {
-
-MojoResult CloseHandle(gin::Handle<HandleWrapper> handle) {
-  if (!handle->get().is_valid())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  handle->Close();
-  return MOJO_RESULT_OK;
-}
-
-gin::Dictionary QueryHandleSignalsState(const gin::Arguments& args,
-                                        mojo::Handle handle) {
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  if (!handle.is_valid()) {
-    dictionary.Set("result", MOJO_RESULT_INVALID_ARGUMENT);
-  } else {
-    HandleSignalsState state = handle.QuerySignalsState();
-    dictionary.Set("result", MOJO_RESULT_OK);
-    dictionary.Set("satisfiedSignals", state.satisfied_signals);
-    dictionary.Set("satisfiableSignals", state.satisfiable_signals);
-  }
-  return dictionary;
-}
-
-gin::Dictionary WaitHandle(const gin::Arguments& args,
-                           mojo::Handle handle,
-                           MojoHandleSignals signals) {
-  v8::Isolate* isolate = args.isolate();
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(isolate);
-
-  MojoHandleSignalsState signals_state;
-  MojoResult result = Wait(handle, signals, &signals_state);
-  dictionary.Set("result", result);
-
-  if (result != MOJO_RESULT_OK && result != MOJO_RESULT_FAILED_PRECONDITION) {
-    dictionary.Set("signalsState", v8::Null(isolate).As<v8::Value>());
-  } else {
-    gin::Dictionary signalsStateDict = gin::Dictionary::CreateEmpty(isolate);
-    signalsStateDict.Set("satisfiedSignals", signals_state.satisfied_signals);
-    signalsStateDict.Set("satisfiableSignals",
-                         signals_state.satisfiable_signals);
-    dictionary.Set("signalsState", signalsStateDict);
-  }
-
-  return dictionary;
-}
-
-gin::Dictionary CreateMessagePipe(const gin::Arguments& args) {
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  dictionary.Set("result", MOJO_RESULT_INVALID_ARGUMENT);
-
-  MojoHandle handle0 = MOJO_HANDLE_INVALID;
-  MojoHandle handle1 = MOJO_HANDLE_INVALID;
-  MojoResult result = MOJO_RESULT_OK;
-
-  v8::Handle<v8::Value> options_value = args.PeekNext();
-  if (options_value.IsEmpty() || options_value->IsNull() ||
-      options_value->IsUndefined()) {
-    result = MojoCreateMessagePipe(NULL, &handle0, &handle1);
-  } else if (options_value->IsObject()) {
-    gin::Dictionary options_dict(args.isolate(), options_value->ToObject());
-    MojoCreateMessagePipeOptions options;
-    // For future struct_size, we can probably infer that from the presence of
-    // properties in options_dict. For now, it's always 8.
-    options.struct_size = 8;
-    // Ideally these would be optional. But the interface makes it hard to
-    // typecheck them then.
-    if (!options_dict.Get("flags", &options.flags)) {
-      return dictionary;
-    }
-
-    result = MojoCreateMessagePipe(&options, &handle0, &handle1);
-  } else {
-      return dictionary;
-  }
-
-  CHECK_EQ(MOJO_RESULT_OK, result);
-
-  dictionary.Set("result", result);
-  dictionary.Set("handle0", mojo::Handle(handle0));
-  dictionary.Set("handle1", mojo::Handle(handle1));
-  return dictionary;
-}
-
-MojoResult WriteMessage(
-    mojo::Handle handle,
-    const gin::ArrayBufferView& buffer,
-    const std::vector<gin::Handle<HandleWrapper> >& handles,
-    MojoWriteMessageFlags flags) {
-  std::vector<MojoHandle> raw_handles(handles.size());
-  for (size_t i = 0; i < handles.size(); ++i)
-    raw_handles[i] = handles[i]->get().value();
-  MojoResult rv = MojoWriteMessage(handle.value(),
-                          buffer.bytes(),
-                          static_cast<uint32_t>(buffer.num_bytes()),
-                          raw_handles.empty() ? NULL : &raw_handles[0],
-                          static_cast<uint32_t>(raw_handles.size()),
-                          flags);
-  // MojoWriteMessage takes ownership of the handles, so release them here.
-  for (size_t i = 0; i < handles.size(); ++i)
-    ignore_result(handles[i]->release());
-
-  return rv;
-}
-
-gin::Dictionary ReadMessage(const gin::Arguments& args,
-                            mojo::Handle handle,
-                            MojoReadMessageFlags flags) {
-  uint32_t num_bytes = 0;
-  uint32_t num_handles = 0;
-  MojoResult result = MojoReadMessage(
-      handle.value(), NULL, &num_bytes, NULL, &num_handles, flags);
-  if (result != MOJO_RESULT_RESOURCE_EXHAUSTED) {
-    gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-    dictionary.Set("result", result);
-    return dictionary;
-  }
-
-  v8::Handle<v8::ArrayBuffer> array_buffer =
-      v8::ArrayBuffer::New(args.isolate(), num_bytes);
-  std::vector<mojo::Handle> handles(num_handles);
-
-  gin::ArrayBuffer buffer;
-  ConvertFromV8(args.isolate(), array_buffer, &buffer);
-  CHECK(buffer.num_bytes() == num_bytes);
-
-  result = MojoReadMessage(handle.value(),
-                           buffer.bytes(),
-                           &num_bytes,
-                           handles.empty() ? NULL :
-                               reinterpret_cast<MojoHandle*>(&handles[0]),
-                           &num_handles,
-                           flags);
-
-  CHECK(buffer.num_bytes() == num_bytes);
-  CHECK(handles.size() == num_handles);
-
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  dictionary.Set("result", result);
-  dictionary.Set("buffer", array_buffer);
-  dictionary.Set("handles", handles);
-  return dictionary;
-}
-
-gin::Dictionary CreateDataPipe(const gin::Arguments& args) {
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  dictionary.Set("result", MOJO_RESULT_INVALID_ARGUMENT);
-
-  MojoHandle producer_handle = MOJO_HANDLE_INVALID;
-  MojoHandle consumer_handle = MOJO_HANDLE_INVALID;
-  MojoResult result = MOJO_RESULT_OK;
-
-  v8::Handle<v8::Value> options_value = args.PeekNext();
-  if (options_value.IsEmpty() || options_value->IsNull() ||
-      options_value->IsUndefined()) {
-    result = MojoCreateDataPipe(NULL, &producer_handle, &consumer_handle);
-  } else if (options_value->IsObject()) {
-    gin::Dictionary options_dict(args.isolate(), options_value->ToObject());
-    MojoCreateDataPipeOptions options;
-    // For future struct_size, we can probably infer that from the presence of
-    // properties in options_dict. For now, it's always 16.
-    options.struct_size = 16;
-    // Ideally these would be optional. But the interface makes it hard to
-    // typecheck them then.
-    if (!options_dict.Get("flags", &options.flags) ||
-        !options_dict.Get("elementNumBytes", &options.element_num_bytes) ||
-        !options_dict.Get("capacityNumBytes", &options.capacity_num_bytes)) {
-      return dictionary;
-    }
-
-    result = MojoCreateDataPipe(&options, &producer_handle, &consumer_handle);
-  } else {
-    return dictionary;
-  }
-
-  CHECK_EQ(MOJO_RESULT_OK, result);
-
-  dictionary.Set("result", result);
-  dictionary.Set("producerHandle", mojo::Handle(producer_handle));
-  dictionary.Set("consumerHandle", mojo::Handle(consumer_handle));
-  return dictionary;
-}
-
-gin::Dictionary WriteData(const gin::Arguments& args,
-                          mojo::Handle handle,
-                          const gin::ArrayBufferView& buffer,
-                          MojoWriteDataFlags flags) {
-  uint32_t num_bytes = static_cast<uint32_t>(buffer.num_bytes());
-  MojoResult result =
-      MojoWriteData(handle.value(), buffer.bytes(), &num_bytes, flags);
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  dictionary.Set("result", result);
-  dictionary.Set("numBytes", num_bytes);
-  return dictionary;
-}
-
-gin::Dictionary ReadData(const gin::Arguments& args,
-                         mojo::Handle handle,
-                         MojoReadDataFlags flags) {
-  uint32_t num_bytes = 0;
-  MojoResult result = MojoReadData(
-      handle.value(), NULL, &num_bytes, MOJO_READ_DATA_FLAG_QUERY);
-  if (result != MOJO_RESULT_OK) {
-    gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-    dictionary.Set("result", result);
-    return dictionary;
-  }
-
-  v8::Handle<v8::ArrayBuffer> array_buffer =
-      v8::ArrayBuffer::New(args.isolate(), num_bytes);
-  gin::ArrayBuffer buffer;
-  ConvertFromV8(args.isolate(), array_buffer, &buffer);
-  CHECK_EQ(num_bytes, buffer.num_bytes());
-
-  result = MojoReadData(handle.value(), buffer.bytes(), &num_bytes, flags);
-  CHECK_EQ(num_bytes, buffer.num_bytes());
-
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  dictionary.Set("result", result);
-  dictionary.Set("buffer", array_buffer);
-  return dictionary;
-}
-
-// Asynchronously read all of the data available for the specified data pipe
-// consumer handle until the remote handle is closed or an error occurs. A
-// Promise is returned whose settled value is an object like this:
-// {result: core.RESULT_OK, buffer: dataArrayBuffer}. If the read failed,
-// then the Promise is rejected, the result will be the actual error code,
-// and the buffer will contain whatever was read before the error occurred.
-// The drainData data pipe handle argument is closed automatically.
-
-v8::Handle<v8::Value> DoDrainData(gin::Arguments* args,
-                                  gin::Handle<HandleWrapper> handle) {
-  return (new DrainData(args->isolate(), handle->release()))->GetPromise();
-}
-
-bool IsHandle(gin::Arguments* args, v8::Handle<v8::Value> val) {
-  gin::Handle<mojo::edk::js::HandleWrapper> ignore_handle;
-  return gin::Converter<gin::Handle<mojo::edk::js::HandleWrapper>>::FromV8(
-      args->isolate(), val, &ignore_handle);
-}
-
-gin::Dictionary CreateSharedBuffer(const gin::Arguments& args,
-                                   uint64_t num_bytes,
-                                   MojoCreateSharedBufferOptionsFlags flags) {
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  MojoHandle handle = MOJO_HANDLE_INVALID;
-  MojoCreateSharedBufferOptions options;
-  // The |flags| is mandatory parameter for CreateSharedBuffer, and it will
-  // be always initialized in MojoCreateSharedBufferOptions struct. For
-  // forward compatibility, set struct_size to be 8 bytes (struct_size + flags),
-  // so that validator will only check the field that is set.
-  options.struct_size = 8;
-  options.flags = flags;
-  MojoResult result = MojoCreateSharedBuffer(&options, num_bytes, &handle);
-  if (result != MOJO_RESULT_OK) {
-    dictionary.Set("result", result);
-    return dictionary;
-  }
-
-  dictionary.Set("result", result);
-  dictionary.Set("handle", mojo::Handle(handle));
-
-  return dictionary;
-}
-
-gin::Dictionary DuplicateBufferHandle(
-    const gin::Arguments& args,
-    mojo::Handle handle,
-    MojoDuplicateBufferHandleOptionsFlags flags) {
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  MojoHandle duped = MOJO_HANDLE_INVALID;
-  MojoDuplicateBufferHandleOptions options;
-  // The |flags| is mandatory parameter for DuplicateBufferHandle, and it will
-  // be always initialized in MojoDuplicateBufferHandleOptions struct. For
-  // forward compatibility, set struct_size to be 8 bytes (struct_size + flags),
-  // so that validator will only check the field that is set.
-  options.struct_size = 8;
-  options.flags = flags;
-  MojoResult result =
-      MojoDuplicateBufferHandle(handle.value(), &options, &duped);
-  if (result != MOJO_RESULT_OK) {
-    dictionary.Set("result", result);
-    return dictionary;
-  }
-
-  dictionary.Set("result", result);
-  dictionary.Set("handle", mojo::Handle(duped));
-
-  return dictionary;
-}
-
-gin::Dictionary MapBuffer(const gin::Arguments& args,
-                          mojo::Handle handle,
-                          uint64_t offset,
-                          uint64_t num_bytes,
-                          MojoMapBufferFlags flags) {
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  void* data = nullptr;
-  MojoResult result =
-      MojoMapBuffer(handle.value(), offset, num_bytes, &data, flags);
-  if (result != MOJO_RESULT_OK) {
-    dictionary.Set("result", result);
-    return dictionary;
-  }
-
-  v8::Handle<v8::ArrayBuffer> array_buffer =
-      v8::ArrayBuffer::New(args.isolate(), data, num_bytes);
-
-  dictionary.Set("result", result);
-  dictionary.Set("buffer", array_buffer);
-
-  return dictionary;
-}
-
-MojoResult UnmapBuffer(const gin::Arguments& args,
-                       const v8::Handle<v8::ArrayBuffer>& buffer) {
-  // Buffer must be external, created by MapBuffer
-  if (!buffer->IsExternal())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return MojoUnmapBuffer(buffer->GetContents().Data());
-}
-
-gin::WrapperInfo g_wrapper_info = { gin::kEmbedderNativeGin };
-
-}  // namespace
-
-const char Core::kModuleName[] = "mojo/public/js/core";
-
-v8::Local<v8::Value> Core::GetModule(v8::Isolate* isolate) {
-  gin::PerIsolateData* data = gin::PerIsolateData::From(isolate);
-  v8::Local<v8::ObjectTemplate> templ = data->GetObjectTemplate(
-      &g_wrapper_info);
-
-  if (templ.IsEmpty()) {
-    templ =
-        gin::ObjectTemplateBuilder(isolate)
-            // TODO(mpcomplete): Should these just be methods on the JS Handle
-            // object?
-            .SetMethod("close", CloseHandle)
-            .SetMethod("queryHandleSignalsState", QueryHandleSignalsState)
-            .SetMethod("wait", WaitHandle)
-            .SetMethod("createMessagePipe", CreateMessagePipe)
-            .SetMethod("writeMessage", WriteMessage)
-            .SetMethod("readMessage", ReadMessage)
-            .SetMethod("createDataPipe", CreateDataPipe)
-            .SetMethod("writeData", WriteData)
-            .SetMethod("readData", ReadData)
-            .SetMethod("drainData", DoDrainData)
-            .SetMethod("isHandle", IsHandle)
-            .SetMethod("createSharedBuffer", CreateSharedBuffer)
-            .SetMethod("duplicateBufferHandle", DuplicateBufferHandle)
-            .SetMethod("mapBuffer", MapBuffer)
-            .SetMethod("unmapBuffer", UnmapBuffer)
-
-            .SetValue("RESULT_OK", MOJO_RESULT_OK)
-            .SetValue("RESULT_CANCELLED", MOJO_RESULT_CANCELLED)
-            .SetValue("RESULT_UNKNOWN", MOJO_RESULT_UNKNOWN)
-            .SetValue("RESULT_INVALID_ARGUMENT", MOJO_RESULT_INVALID_ARGUMENT)
-            .SetValue("RESULT_DEADLINE_EXCEEDED", MOJO_RESULT_DEADLINE_EXCEEDED)
-            .SetValue("RESULT_NOT_FOUND", MOJO_RESULT_NOT_FOUND)
-            .SetValue("RESULT_ALREADY_EXISTS", MOJO_RESULT_ALREADY_EXISTS)
-            .SetValue("RESULT_PERMISSION_DENIED", MOJO_RESULT_PERMISSION_DENIED)
-            .SetValue("RESULT_RESOURCE_EXHAUSTED",
-                      MOJO_RESULT_RESOURCE_EXHAUSTED)
-            .SetValue("RESULT_FAILED_PRECONDITION",
-                      MOJO_RESULT_FAILED_PRECONDITION)
-            .SetValue("RESULT_ABORTED", MOJO_RESULT_ABORTED)
-            .SetValue("RESULT_OUT_OF_RANGE", MOJO_RESULT_OUT_OF_RANGE)
-            .SetValue("RESULT_UNIMPLEMENTED", MOJO_RESULT_UNIMPLEMENTED)
-            .SetValue("RESULT_INTERNAL", MOJO_RESULT_INTERNAL)
-            .SetValue("RESULT_UNAVAILABLE", MOJO_RESULT_UNAVAILABLE)
-            .SetValue("RESULT_DATA_LOSS", MOJO_RESULT_DATA_LOSS)
-            .SetValue("RESULT_BUSY", MOJO_RESULT_BUSY)
-            .SetValue("RESULT_SHOULD_WAIT", MOJO_RESULT_SHOULD_WAIT)
-
-            .SetValue("HANDLE_SIGNAL_NONE", MOJO_HANDLE_SIGNAL_NONE)
-            .SetValue("HANDLE_SIGNAL_READABLE", MOJO_HANDLE_SIGNAL_READABLE)
-            .SetValue("HANDLE_SIGNAL_WRITABLE", MOJO_HANDLE_SIGNAL_WRITABLE)
-            .SetValue("HANDLE_SIGNAL_PEER_CLOSED",
-                      MOJO_HANDLE_SIGNAL_PEER_CLOSED)
-
-            .SetValue("CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE",
-                      MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE)
-
-            .SetValue("WRITE_MESSAGE_FLAG_NONE", MOJO_WRITE_MESSAGE_FLAG_NONE)
-
-            .SetValue("READ_MESSAGE_FLAG_NONE", MOJO_READ_MESSAGE_FLAG_NONE)
-            .SetValue("READ_MESSAGE_FLAG_MAY_DISCARD",
-                      MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)
-
-            .SetValue("CREATE_DATA_PIPE_OPTIONS_FLAG_NONE",
-                      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE)
-
-            .SetValue("WRITE_DATA_FLAG_NONE", MOJO_WRITE_DATA_FLAG_NONE)
-            .SetValue("WRITE_DATA_FLAG_ALL_OR_NONE",
-                      MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)
-
-            .SetValue("READ_DATA_FLAG_NONE", MOJO_READ_DATA_FLAG_NONE)
-            .SetValue("READ_DATA_FLAG_ALL_OR_NONE",
-                      MOJO_READ_DATA_FLAG_ALL_OR_NONE)
-            .SetValue("READ_DATA_FLAG_DISCARD", MOJO_READ_DATA_FLAG_DISCARD)
-            .SetValue("READ_DATA_FLAG_QUERY", MOJO_READ_DATA_FLAG_QUERY)
-            .SetValue("READ_DATA_FLAG_PEEK", MOJO_READ_DATA_FLAG_PEEK)
-            .SetValue("CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE",
-                      MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE)
-
-            .SetValue("DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE",
-                      MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE)
-
-            .SetValue("DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY",
-                      MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY)
-
-            .SetValue("MAP_BUFFER_FLAG_NONE", MOJO_MAP_BUFFER_FLAG_NONE)
-            .Build();
-
-    data->SetObjectTemplate(&g_wrapper_info, templ);
-  }
-
-  return templ->NewInstance();
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/core.h b/mojo/edk/js/core.h
deleted file mode 100644
index 97ef5df..0000000
--- a/mojo/edk/js/core.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_JS_CORE_H_
-#define MOJO_EDK_JS_CORE_H_
-
-#include "mojo/edk/js/js_export.h"
-#include "v8/include/v8.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class MOJO_JS_EXPORT Core {
- public:
-  static const char kModuleName[];
-  static v8::Local<v8::Value> GetModule(v8::Isolate* isolate);
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_CORE_H_
diff --git a/mojo/edk/js/drain_data.cc b/mojo/edk/js/drain_data.cc
deleted file mode 100644
index 334ced3..0000000
--- a/mojo/edk/js/drain_data.cc
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/js/drain_data.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/bind.h"
-#include "base/memory/ptr_util.h"
-#include "gin/array_buffer.h"
-#include "gin/converter.h"
-#include "gin/dictionary.h"
-#include "gin/per_context_data.h"
-#include "gin/per_isolate_data.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-DrainData::DrainData(v8::Isolate* isolate, mojo::Handle handle)
-    : isolate_(isolate),
-      handle_(DataPipeConsumerHandle(handle.value())),
-      handle_watcher_(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC) {
-  v8::Handle<v8::Context> context(isolate_->GetCurrentContext());
-  runner_ = gin::PerContextData::From(context)->runner()->GetWeakPtr();
-
-  WaitForData();
-}
-
-v8::Handle<v8::Value> DrainData::GetPromise() {
-  CHECK(resolver_.IsEmpty());
-  v8::Handle<v8::Promise::Resolver> resolver(
-      v8::Promise::Resolver::New(isolate_));
-  resolver_.Reset(isolate_, resolver);
-  return resolver->GetPromise();
-}
-
-DrainData::~DrainData() {
-  resolver_.Reset();
-}
-
-void DrainData::WaitForData() {
-  handle_watcher_.Watch(
-      handle_.get(), MOJO_HANDLE_SIGNAL_READABLE,
-      base::Bind(&DrainData::DataReady, base::Unretained(this)));
-}
-
-void DrainData::DataReady(MojoResult result) {
-  if (result != MOJO_RESULT_OK) {
-    DeliverData(result);
-    return;
-  }
-  while (result == MOJO_RESULT_OK) {
-    result = ReadData();
-    if (result == MOJO_RESULT_SHOULD_WAIT)
-      WaitForData();
-    else if (result != MOJO_RESULT_OK)
-      DeliverData(result);
-  }
-}
-
-MojoResult DrainData::ReadData() {
-  const void* buffer;
-  uint32_t num_bytes = 0;
-  MojoResult result = BeginReadDataRaw(
-      handle_.get(), &buffer, &num_bytes, MOJO_READ_DATA_FLAG_NONE);
-  if (result != MOJO_RESULT_OK)
-    return result;
-  const char* p = static_cast<const char*>(buffer);
-  data_buffers_.push_back(base::MakeUnique<DataBuffer>(p, p + num_bytes));
-  return EndReadDataRaw(handle_.get(), num_bytes);
-}
-
-void DrainData::DeliverData(MojoResult result) {
-  if (!runner_) {
-    delete this;
-    return;
-  }
-
-  size_t total_bytes = 0;
-  for (unsigned i = 0; i < data_buffers_.size(); i++)
-    total_bytes += data_buffers_[i]->size();
-
-  // Create a total_bytes length ArrayBuffer return value.
-  gin::Runner::Scope scope(runner_.get());
-  v8::Handle<v8::ArrayBuffer> array_buffer =
-      v8::ArrayBuffer::New(isolate_, total_bytes);
-  gin::ArrayBuffer buffer;
-  ConvertFromV8(isolate_, array_buffer, &buffer);
-  CHECK_EQ(total_bytes, buffer.num_bytes());
-
-  // Copy the data_buffers into the ArrayBuffer.
-  char* array_buffer_ptr = static_cast<char*>(buffer.bytes());
-  size_t offset = 0;
-  for (size_t i = 0; i < data_buffers_.size(); i++) {
-    size_t num_bytes = data_buffers_[i]->size();
-    if (num_bytes == 0)
-      continue;
-    const char* data_buffer_ptr = &((*data_buffers_[i])[0]);
-    memcpy(array_buffer_ptr + offset, data_buffer_ptr, num_bytes);
-    offset += num_bytes;
-  }
-
-  // The "settled" value of the promise always includes all of the data
-  // that was read before either an error occurred or the remote pipe handle
-  // was closed. The latter is indicated by MOJO_RESULT_FAILED_PRECONDITION.
-
-  v8::Handle<v8::Promise::Resolver> resolver(
-      v8::Local<v8::Promise::Resolver>::New(isolate_, resolver_));
-
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(isolate_);
-  dictionary.Set("result", result);
-  dictionary.Set("buffer", array_buffer);
-  v8::Handle<v8::Value> settled_value(ConvertToV8(isolate_, dictionary));
-
-  if (result == MOJO_RESULT_FAILED_PRECONDITION)
-    resolver->Resolve(settled_value);
-  else
-    resolver->Reject(settled_value);
-
-  delete this;
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/drain_data.h b/mojo/edk/js/drain_data.h
deleted file mode 100644
index 42da90f..0000000
--- a/mojo/edk/js/drain_data.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_JS_DRAIN_DATA_H_
-#define MOJO_EDK_JS_DRAIN_DATA_H_
-
-#include <memory>
-#include <vector>
-
-#include "gin/runner.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-#include "v8/include/v8.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-// This class is the implementation of the Mojo JavaScript core module's
-// drainData() method. It is not intended to be used directly. The caller
-// allocates a DrainData on the heap and returns GetPromise() to JS. The
-// implementation deletes itself after reading as much data as possible
-// and rejecting or resolving the Promise.
-
-class DrainData {
- public:
-  // Starts waiting for data on the specified data pipe consumer handle.
-  // See WaitForData(). The constructor does not block.
-  DrainData(v8::Isolate* isolate, mojo::Handle handle);
-
-  // Returns a Promise that will be settled when no more data can be read.
-  // Should be called just once on a newly allocated DrainData object.
-  v8::Handle<v8::Value> GetPromise();
-
- private:
-  ~DrainData();
-
-  // Waits for data to be available. DataReady() will be notified.
-  void WaitForData();
-
-  // Use ReadData() to read whatever is availble now on handle_ and save
-  // it in data_buffers_.
-  void DataReady(MojoResult result);
-  MojoResult ReadData();
-
-  // When the remote data pipe handle is closed, or an error occurs, deliver
-  // all of the buffered data to the JS Promise and then delete this.
-  void DeliverData(MojoResult result);
-
-  using DataBuffer = std::vector<char>;
-
-  v8::Isolate* isolate_;
-  ScopedDataPipeConsumerHandle handle_;
-  SimpleWatcher handle_watcher_;
-  base::WeakPtr<gin::Runner> runner_;
-  v8::UniquePersistent<v8::Promise::Resolver> resolver_;
-  std::vector<std::unique_ptr<DataBuffer>> data_buffers_;
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_DRAIN_DATA_H_
diff --git a/mojo/edk/js/handle.cc b/mojo/edk/js/handle.cc
deleted file mode 100644
index 7da8e9f..0000000
--- a/mojo/edk/js/handle.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/js/handle.h"
-
-#include "mojo/edk/js/handle_close_observer.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-gin::WrapperInfo HandleWrapper::kWrapperInfo = { gin::kEmbedderNativeGin };
-
-HandleWrapper::HandleWrapper(MojoHandle handle)
-    : handle_(mojo::Handle(handle)) {
-}
-
-HandleWrapper::~HandleWrapper() {
-  NotifyCloseObservers();
-}
-
-void HandleWrapper::Close() {
-  NotifyCloseObservers();
-  handle_.reset();
-}
-
-void HandleWrapper::AddCloseObserver(HandleCloseObserver* observer) {
-  close_observers_.AddObserver(observer);
-}
-
-void HandleWrapper::RemoveCloseObserver(HandleCloseObserver* observer) {
-  close_observers_.RemoveObserver(observer);
-}
-
-void HandleWrapper::NotifyCloseObservers() {
-  if (!handle_.is_valid())
-    return;
-
-  for (auto& observer : close_observers_)
-    observer.OnWillCloseHandle();
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-namespace gin {
-
-v8::Handle<v8::Value> Converter<mojo::Handle>::ToV8(v8::Isolate* isolate,
-                                                    const mojo::Handle& val) {
-  if (!val.is_valid())
-    return v8::Null(isolate);
-  return mojo::edk::js::HandleWrapper::Create(isolate, val.value()).ToV8();
-}
-
-bool Converter<mojo::Handle>::FromV8(v8::Isolate* isolate,
-                                     v8::Handle<v8::Value> val,
-                                     mojo::Handle* out) {
-  if (val->IsNull()) {
-    *out = mojo::Handle();
-    return true;
-  }
-
-  gin::Handle<mojo::edk::js::HandleWrapper> handle;
-  if (!Converter<gin::Handle<mojo::edk::js::HandleWrapper>>::FromV8(
-          isolate, val, &handle))
-    return false;
-
-  *out = handle->get();
-  return true;
-}
-
-v8::Handle<v8::Value> Converter<mojo::MessagePipeHandle>::ToV8(
-    v8::Isolate* isolate, mojo::MessagePipeHandle val) {
-  return Converter<mojo::Handle>::ToV8(isolate, val);
-}
-
-bool Converter<mojo::MessagePipeHandle>::FromV8(v8::Isolate* isolate,
-                                                v8::Handle<v8::Value> val,
-                                                mojo::MessagePipeHandle* out) {
-  return Converter<mojo::Handle>::FromV8(isolate, val, out);
-}
-
-}  // namespace gin
diff --git a/mojo/edk/js/handle.h b/mojo/edk/js/handle.h
deleted file mode 100644
index 60652ed..0000000
--- a/mojo/edk/js/handle.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_JS_HANDLE_H_
-#define MOJO_EDK_JS_HANDLE_H_
-
-#include <stdint.h>
-
-#include "base/observer_list.h"
-#include "gin/converter.h"
-#include "gin/handle.h"
-#include "gin/wrappable.h"
-#include "mojo/edk/js/js_export.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class HandleCloseObserver;
-
-// Wrapper for mojo Handles exposed to JavaScript. This ensures the Handle
-// is Closed when its JS object is garbage collected.
-class MOJO_JS_EXPORT HandleWrapper : public gin::Wrappable<HandleWrapper> {
- public:
-  static gin::WrapperInfo kWrapperInfo;
-
-  static gin::Handle<HandleWrapper> Create(v8::Isolate* isolate,
-                                           MojoHandle handle) {
-    return gin::CreateHandle(isolate, new HandleWrapper(handle));
-  }
-
-  mojo::Handle get() const { return handle_.get(); }
-  mojo::Handle release() { return handle_.release(); }
-  void Close();
-
-  void AddCloseObserver(HandleCloseObserver* observer);
-  void RemoveCloseObserver(HandleCloseObserver* observer);
-
- protected:
-  HandleWrapper(MojoHandle handle);
-  ~HandleWrapper() override;
-  void NotifyCloseObservers();
-
-  mojo::ScopedHandle handle_;
-  base::ObserverList<HandleCloseObserver> close_observers_;
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-namespace gin {
-
-// Note: It's important to use this converter rather than the one for
-// MojoHandle, since that will do a simple int32_t conversion. It's unfortunate
-// there's no way to prevent against accidental use.
-// TODO(mpcomplete): define converters for all Handle subtypes.
-template <>
-struct MOJO_JS_EXPORT Converter<mojo::Handle> {
-  static v8::Handle<v8::Value> ToV8(v8::Isolate* isolate,
-                                    const mojo::Handle& val);
-  static bool FromV8(v8::Isolate* isolate, v8::Handle<v8::Value> val,
-                     mojo::Handle* out);
-};
-
-template <>
-struct MOJO_JS_EXPORT Converter<mojo::MessagePipeHandle> {
-  static v8::Handle<v8::Value> ToV8(v8::Isolate* isolate,
-                                    mojo::MessagePipeHandle val);
-  static bool FromV8(v8::Isolate* isolate,
-                     v8::Handle<v8::Value> val,
-                     mojo::MessagePipeHandle* out);
-};
-
-// We need to specialize the normal gin::Handle converter in order to handle
-// converting |null| to a wrapper for an empty mojo::Handle.
-template <>
-struct MOJO_JS_EXPORT Converter<gin::Handle<mojo::edk::js::HandleWrapper>> {
-  static v8::Handle<v8::Value> ToV8(
-      v8::Isolate* isolate,
-      const gin::Handle<mojo::edk::js::HandleWrapper>& val) {
-    return val.ToV8();
-  }
-
-  static bool FromV8(v8::Isolate* isolate,
-                     v8::Handle<v8::Value> val,
-                     gin::Handle<mojo::edk::js::HandleWrapper>* out) {
-    if (val->IsNull()) {
-      *out = mojo::edk::js::HandleWrapper::Create(isolate, MOJO_HANDLE_INVALID);
-      return true;
-    }
-
-    mojo::edk::js::HandleWrapper* object = NULL;
-    if (!Converter<mojo::edk::js::HandleWrapper*>::FromV8(isolate, val,
-                                                          &object)) {
-      return false;
-    }
-    *out = gin::Handle<mojo::edk::js::HandleWrapper>(val, object);
-    return true;
-  }
-};
-
-}  // namespace gin
-
-#endif  // MOJO_EDK_JS_HANDLE_H_
diff --git a/mojo/edk/js/handle_close_observer.h b/mojo/edk/js/handle_close_observer.h
deleted file mode 100644
index c7b935e..0000000
--- a/mojo/edk/js/handle_close_observer.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_JS_HANDLE_CLOSE_OBSERVER_H_
-#define MOJO_EDK_JS_HANDLE_CLOSE_OBSERVER_H_
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class HandleCloseObserver {
- public:
-  virtual void OnWillCloseHandle() = 0;
-
- protected:
-  virtual ~HandleCloseObserver() {}
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_HANDLE_CLOSE_OBSERVER_H_
diff --git a/mojo/edk/js/handle_unittest.cc b/mojo/edk/js/handle_unittest.cc
deleted file mode 100644
index dd2562f..0000000
--- a/mojo/edk/js/handle_unittest.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/macros.h"
-#include "mojo/edk/js/handle.h"
-#include "mojo/edk/js/handle_close_observer.h"
-#include "mojo/public/cpp/system/core.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class HandleWrapperTest : public testing::Test,
-                          public HandleCloseObserver {
- public:
-  HandleWrapperTest() : closes_observed_(0) {}
-
-  void OnWillCloseHandle() override { closes_observed_++; }
-
- protected:
-  int closes_observed_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(HandleWrapperTest);
-};
-
-class TestHandleWrapper : public HandleWrapper {
- public:
-  explicit TestHandleWrapper(MojoHandle handle) : HandleWrapper(handle) {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestHandleWrapper);
-};
-
-// Test that calling Close() on a HandleWrapper for an invalid handle does not
-// notify observers.
-TEST_F(HandleWrapperTest, CloseWithInvalidHandle) {
-  {
-    TestHandleWrapper wrapper(MOJO_HANDLE_INVALID);
-    wrapper.AddCloseObserver(this);
-    ASSERT_EQ(0, closes_observed_);
-    wrapper.Close();
-    EXPECT_EQ(0, closes_observed_);
-  }
-  EXPECT_EQ(0, closes_observed_);
-}
-
-// Test that destroying a HandleWrapper for an invalid handle does not notify
-// observers.
-TEST_F(HandleWrapperTest, DestroyWithInvalidHandle) {
-  {
-    TestHandleWrapper wrapper(MOJO_HANDLE_INVALID);
-    wrapper.AddCloseObserver(this);
-    ASSERT_EQ(0, closes_observed_);
-  }
-  EXPECT_EQ(0, closes_observed_);
-}
-
-// Test that calling Close on a HandleWrapper for a valid handle notifies
-// observers once.
-TEST_F(HandleWrapperTest, CloseWithValidHandle) {
-  {
-    mojo::MessagePipe pipe;
-    TestHandleWrapper wrapper(pipe.handle0.release().value());
-    wrapper.AddCloseObserver(this);
-    ASSERT_EQ(0, closes_observed_);
-    wrapper.Close();
-    EXPECT_EQ(1, closes_observed_);
-    // Check that calling close again doesn't notify observers.
-    wrapper.Close();
-    EXPECT_EQ(1, closes_observed_);
-  }
-  // Check that destroying a closed HandleWrapper doesn't notify observers.
-  EXPECT_EQ(1, closes_observed_);
-}
-
-// Test that destroying a HandleWrapper for a valid handle notifies observers.
-TEST_F(HandleWrapperTest, DestroyWithValidHandle) {
-  {
-    mojo::MessagePipe pipe;
-    TestHandleWrapper wrapper(pipe.handle0.release().value());
-    wrapper.AddCloseObserver(this);
-    ASSERT_EQ(0, closes_observed_);
-  }
-  EXPECT_EQ(1, closes_observed_);
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/js_export.h b/mojo/edk/js/js_export.h
deleted file mode 100644
index 179113c..0000000
--- a/mojo/edk/js/js_export.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_JS_JS_EXPORT_H_
-#define MOJO_EDK_JS_JS_EXPORT_H_
-
-// Defines MOJO_JS_EXPORT so that functionality implemented by //mojo/edk/js can
-// be exported to consumers.
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(MOJO_JS_IMPLEMENTATION)
-#define MOJO_JS_EXPORT __declspec(dllexport)
-#else
-#define MOJO_JS_EXPORT __declspec(dllimport)
-#endif  // defined(MOJO_JS_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-#if defined(MOJO_JS_IMPLEMENTATION)
-#define MOJO_JS_EXPORT __attribute__((visibility("default")))
-#else
-#define MOJO_JS_EXPORT
-#endif
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define MOJO_JS_EXPORT
-#endif
-
-#endif  // MOJO_EDK_JS_JS_EXPORT_H_
diff --git a/mojo/edk/js/mojo_runner_delegate.cc b/mojo/edk/js/mojo_runner_delegate.cc
deleted file mode 100644
index dda0b2c..0000000
--- a/mojo/edk/js/mojo_runner_delegate.cc
+++ /dev/null
@@ -1,80 +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.
-
-#include "mojo/edk/js/mojo_runner_delegate.h"
-
-#include "base/bind.h"
-#include "base/path_service.h"
-#include "gin/converter.h"
-#include "gin/modules/console.h"
-#include "gin/modules/module_registry.h"
-#include "gin/modules/timer.h"
-#include "gin/try_catch.h"
-#include "mojo/edk/js/core.h"
-#include "mojo/edk/js/handle.h"
-#include "mojo/edk/js/support.h"
-#include "mojo/edk/js/threading.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-namespace {
-
-// TODO(abarth): Rather than loading these modules from the file system, we
-// should load them from the network via Mojo IPC.
-std::vector<base::FilePath> GetModuleSearchPaths() {
-  std::vector<base::FilePath> search_paths(2);
-  PathService::Get(base::DIR_SOURCE_ROOT, &search_paths[0]);
-  PathService::Get(base::DIR_EXE, &search_paths[1]);
-  search_paths[1] = search_paths[1].AppendASCII("gen");
-  return search_paths;
-}
-
-void StartCallback(base::WeakPtr<gin::Runner> runner,
-                   MojoHandle pipe,
-                   v8::Handle<v8::Value> module) {
-  v8::Isolate* isolate = runner->GetContextHolder()->isolate();
-  v8::Handle<v8::Function> start;
-  CHECK(gin::ConvertFromV8(isolate, module, &start));
-
-  v8::Handle<v8::Value> args[] = {
-      gin::ConvertToV8(isolate, Handle(pipe)) };
-  runner->Call(start, runner->global(), 1, args);
-}
-
-}  // namespace
-
-MojoRunnerDelegate::MojoRunnerDelegate()
-    : ModuleRunnerDelegate(GetModuleSearchPaths()) {
-  AddBuiltinModule(gin::Console::kModuleName, gin::Console::GetModule);
-  AddBuiltinModule(gin::TimerModule::kName, gin::TimerModule::GetModule);
-  AddBuiltinModule(Core::kModuleName, Core::GetModule);
-  AddBuiltinModule(Support::kModuleName, Support::GetModule);
-  AddBuiltinModule(Threading::kModuleName, Threading::GetModule);
-}
-
-MojoRunnerDelegate::~MojoRunnerDelegate() {
-}
-
-void MojoRunnerDelegate::Start(gin::Runner* runner,
-                               MojoHandle pipe,
-                               const std::string& module) {
-  gin::Runner::Scope scope(runner);
-  gin::ModuleRegistry* registry =
-      gin::ModuleRegistry::From(runner->GetContextHolder()->context());
-  registry->LoadModule(runner->GetContextHolder()->isolate(), module,
-                       base::Bind(StartCallback, runner->GetWeakPtr(), pipe));
-  AttemptToLoadMoreModules(runner);
-}
-
-void MojoRunnerDelegate::UnhandledException(gin::ShellRunner* runner,
-                                            gin::TryCatch& try_catch) {
-  gin::ModuleRunnerDelegate::UnhandledException(runner, try_catch);
-  LOG(ERROR) << try_catch.GetStackTrace();
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/mojo_runner_delegate.h b/mojo/edk/js/mojo_runner_delegate.h
deleted file mode 100644
index 9ab325c..0000000
--- a/mojo/edk/js/mojo_runner_delegate.h
+++ /dev/null
@@ -1,36 +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.
-
-#ifndef MOJO_EDK_JS_MOJO_RUNNER_DELEGATE_H_
-#define MOJO_EDK_JS_MOJO_RUNNER_DELEGATE_H_
-
-#include "base/macros.h"
-#include "gin/modules/module_runner_delegate.h"
-#include "mojo/edk/js/js_export.h"
-#include "mojo/public/c/system/core.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class MOJO_JS_EXPORT MojoRunnerDelegate : public gin::ModuleRunnerDelegate {
- public:
-  MojoRunnerDelegate();
-  ~MojoRunnerDelegate() override;
-
-  void Start(gin::Runner* runner, MojoHandle pipe, const std::string& module);
-
- private:
-  // From ModuleRunnerDelegate:
-  void UnhandledException(gin::ShellRunner* runner,
-                          gin::TryCatch& try_catch) override;
-
-  DISALLOW_COPY_AND_ASSIGN(MojoRunnerDelegate);
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_MOJO_RUNNER_DELEGATE_H_
diff --git a/mojo/edk/js/support.cc b/mojo/edk/js/support.cc
deleted file mode 100644
index 404cb9b..0000000
--- a/mojo/edk/js/support.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/js/support.h"
-
-#include "base/bind.h"
-#include "gin/arguments.h"
-#include "gin/converter.h"
-#include "gin/function_template.h"
-#include "gin/object_template_builder.h"
-#include "gin/per_isolate_data.h"
-#include "gin/public/wrapper_info.h"
-#include "gin/wrappable.h"
-#include "mojo/edk/js/handle.h"
-#include "mojo/edk/js/waiting_callback.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-namespace {
-
-WaitingCallback* AsyncWait(const gin::Arguments& args,
-                           gin::Handle<HandleWrapper> handle,
-                           MojoHandleSignals signals,
-                           v8::Handle<v8::Function> callback) {
-  return WaitingCallback::Create(
-      args.isolate(), callback, handle, signals, true /* one_shot */).get();
-}
-
-void CancelWait(WaitingCallback* waiting_callback) {
-  waiting_callback->Cancel();
-}
-
-WaitingCallback* Watch(const gin::Arguments& args,
-                       gin::Handle<HandleWrapper> handle,
-                       MojoHandleSignals signals,
-                       v8::Handle<v8::Function> callback) {
-  return WaitingCallback::Create(
-      args.isolate(), callback, handle, signals, false /* one_shot */).get();
-}
-
-void CancelWatch(WaitingCallback* waiting_callback) {
-  waiting_callback->Cancel();
-}
-
-gin::WrapperInfo g_wrapper_info = { gin::kEmbedderNativeGin };
-
-}  // namespace
-
-const char Support::kModuleName[] = "mojo/public/js/support";
-
-v8::Local<v8::Value> Support::GetModule(v8::Isolate* isolate) {
-  gin::PerIsolateData* data = gin::PerIsolateData::From(isolate);
-  v8::Local<v8::ObjectTemplate> templ = data->GetObjectTemplate(
-      &g_wrapper_info);
-
-  if (templ.IsEmpty()) {
-    templ = gin::ObjectTemplateBuilder(isolate)
-                // TODO(rockot): Remove asyncWait and cancelWait.
-                .SetMethod("asyncWait", AsyncWait)
-                .SetMethod("cancelWait", CancelWait)
-                .SetMethod("watch", Watch)
-                .SetMethod("cancelWatch", CancelWatch)
-                .Build();
-
-    data->SetObjectTemplate(&g_wrapper_info, templ);
-  }
-
-  return templ->NewInstance();
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/support.h b/mojo/edk/js/support.h
deleted file mode 100644
index 551f5ac..0000000
--- a/mojo/edk/js/support.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_JS_SUPPORT_H_
-#define MOJO_EDK_JS_SUPPORT_H_
-
-#include "mojo/edk/js/js_export.h"
-#include "v8/include/v8.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class MOJO_JS_EXPORT Support {
- public:
-  static const char kModuleName[];
-  static v8::Local<v8::Value> GetModule(v8::Isolate* isolate);
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_SUPPORT_H_
diff --git a/mojo/edk/js/tests/BUILD.gn b/mojo/edk/js/tests/BUILD.gn
deleted file mode 100644
index f56c4b9..0000000
--- a/mojo/edk/js/tests/BUILD.gn
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-import("//testing/test.gni")
-
-# TODO(hansmuller): The organization of tests in this directory is weird:
-#   * Really, js_unittests tests public stuff, so that should live in public
-#     and be reworked as some sort of apptest.
-#   * Both js_unittests and js_integration_tests should auto-generate their
-#     tests somehow. The .cc files are just test runner stubs, including
-#     explicit lists of .js files.
-
-group("tests") {
-  testonly = true
-  deps = [
-    ":mojo_js_integration_tests",
-    ":mojo_js_unittests",
-  ]
-}
-
-test("mojo_js_integration_tests") {
-  deps = [
-    ":js_to_cpp_bindings",
-    "//gin:gin_test",
-    "//mojo/common",
-    "//mojo/edk/js",
-    "//mojo/edk/test:run_all_unittests",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/system",
-    "//mojo/public/js:bindings",
-  ]
-
-  sources = [
-    "js_to_cpp_tests.cc",
-  ]
-
-  data = [
-    "js_to_cpp_tests.js",
-  ]
-
-  configs += [ "//v8:external_startup_data" ]
-}
-
-mojom("js_to_cpp_bindings") {
-  sources = [
-    "js_to_cpp.mojom",
-  ]
-}
-
-test("mojo_js_unittests") {
-  deps = [
-    "//base",
-    "//gin:gin_test",
-    "//mojo/edk/js",
-    "//mojo/edk/test:run_all_unittests",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/system",
-    "//mojo/public/interfaces/bindings/tests:test_interfaces",
-    "//mojo/public/js:tests",
-  ]
-
-  sources = [
-    "//mojo/edk/js/handle_unittest.cc",
-    "run_js_unittests.cc",
-  ]
-}
diff --git a/mojo/edk/js/tests/js_to_cpp.mojom b/mojo/edk/js/tests/js_to_cpp.mojom
deleted file mode 100644
index 688b22b..0000000
--- a/mojo/edk/js/tests/js_to_cpp.mojom
+++ /dev/null
@@ -1,54 +0,0 @@
-module js_to_cpp;
-
-// This struct encompasses all of the basic types, so that they
-// may be sent from C++ to JS and back for validation.
-struct EchoArgs {
-  int64 si64;
-  int32 si32;
-  int16 si16;
-  int8  si8;
-  uint64 ui64;
-  uint32 ui32;
-  uint16 ui16;
-  uint8  ui8;
-  float float_val;
-  float float_inf;
-  float float_nan;
-  double double_val;
-  double double_inf;
-  double double_nan;
-  string? name;
-  array<string>? string_array;
-  handle<message_pipe>? message_handle;
-  handle<data_pipe_consumer>? data_handle;
-};
-
-struct EchoArgsList {
-  EchoArgsList? next;
-  EchoArgs? item;
-};
-
-// Note: For messages which control test flow, pick numbers that are unlikely
-// to be hit as a result of our deliberate corruption of response messages.
-interface CppSide {
-  // Sent for all tests to notify that the JS side is now ready.
-  StartTest@88888888();
-
-  // Indicates end for echo, bit-flip, and back-pointer tests.
-  TestFinished@99999999();
-
-  // Responses from specific tests.
-  PingResponse();
-  EchoResponse(EchoArgsList list);
-  BitFlipResponse(EchoArgsList arg);
-  BackPointerResponse(EchoArgsList arg);
-};
-
-interface JsSide {
-  SetCppSide(CppSide cpp);
-
-  Ping();
-  Echo(int32 numIterations, EchoArgs arg);
-  BitFlip(EchoArgs arg);
-  BackPointer(EchoArgs arg);
-};
diff --git a/mojo/edk/js/tests/js_to_cpp_tests.cc b/mojo/edk/js/tests/js_to_cpp_tests.cc
deleted file mode 100644
index b6b74e3..0000000
--- a/mojo/edk/js/tests/js_to_cpp_tests.cc
+++ /dev/null
@@ -1,455 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <string>
-#include <utility>
-
-#include "base/at_exit.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "gin/array_buffer.h"
-#include "gin/public/isolate_holder.h"
-#include "gin/v8_initializer.h"
-#include "mojo/common/data_pipe_utils.h"
-#include "mojo/edk/js/mojo_runner_delegate.h"
-#include "mojo/edk/js/tests/js_to_cpp.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-// Global value updated by some checks to prevent compilers from optimizing
-// reads out of existence.
-uint32_t g_waste_accumulator = 0;
-
-namespace {
-
-// Negative numbers with different values in each byte, the last of
-// which can survive promotion to double and back.
-const int8_t kExpectedInt8Value = -65;
-const int16_t kExpectedInt16Value = -16961;
-const int32_t kExpectedInt32Value = -1145258561;
-const int64_t kExpectedInt64Value = -77263311946305LL;
-
-// Positive numbers with different values in each byte, the last of
-// which can survive promotion to double and back.
-const uint8_t kExpectedUInt8Value = 65;
-const uint16_t kExpectedUInt16Value = 16961;
-const uint32_t kExpectedUInt32Value = 1145258561;
-const uint64_t kExpectedUInt64Value = 77263311946305LL;
-
-// Double/float values, including special case constants.
-const double kExpectedDoubleVal = 3.14159265358979323846;
-const double kExpectedDoubleInf = std::numeric_limits<double>::infinity();
-const double kExpectedDoubleNan = std::numeric_limits<double>::quiet_NaN();
-const float kExpectedFloatVal = static_cast<float>(kExpectedDoubleVal);
-const float kExpectedFloatInf = std::numeric_limits<float>::infinity();
-const float kExpectedFloatNan = std::numeric_limits<float>::quiet_NaN();
-
-// NaN has the property that it is not equal to itself.
-#define EXPECT_NAN(x) EXPECT_NE(x, x)
-
-void CheckDataPipe(ScopedDataPipeConsumerHandle data_pipe_handle) {
-  std::string buffer;
-  bool result = common::BlockingCopyToString(std::move(data_pipe_handle),
-                                             &buffer);
-  EXPECT_TRUE(result);
-  EXPECT_EQ(64u, buffer.size());
-  for (int i = 0; i < 64; ++i) {
-    EXPECT_EQ(i, buffer[i]);
-  }
-}
-
-void CheckMessagePipe(MessagePipeHandle message_pipe_handle) {
-  unsigned char buffer[100];
-  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  MojoResult result = Wait(message_pipe_handle, MOJO_HANDLE_SIGNAL_READABLE);
-  EXPECT_EQ(MOJO_RESULT_OK, result);
-  result = ReadMessageRaw(
-      message_pipe_handle, buffer, &buffer_size, 0, 0, 0);
-  EXPECT_EQ(MOJO_RESULT_OK, result);
-  EXPECT_EQ(64u, buffer_size);
-  for (int i = 0; i < 64; ++i) {
-    EXPECT_EQ(255 - i, buffer[i]);
-  }
-}
-
-js_to_cpp::EchoArgsPtr BuildSampleEchoArgs() {
-  js_to_cpp::EchoArgsPtr args(js_to_cpp::EchoArgs::New());
-  args->si64 = kExpectedInt64Value;
-  args->si32 = kExpectedInt32Value;
-  args->si16 = kExpectedInt16Value;
-  args->si8 = kExpectedInt8Value;
-  args->ui64 = kExpectedUInt64Value;
-  args->ui32 = kExpectedUInt32Value;
-  args->ui16 = kExpectedUInt16Value;
-  args->ui8 = kExpectedUInt8Value;
-  args->float_val = kExpectedFloatVal;
-  args->float_inf = kExpectedFloatInf;
-  args->float_nan = kExpectedFloatNan;
-  args->double_val = kExpectedDoubleVal;
-  args->double_inf = kExpectedDoubleInf;
-  args->double_nan = kExpectedDoubleNan;
-  args->name.emplace("coming");
-  args->string_array.emplace(3);
-  (*args->string_array)[0] = "one";
-  (*args->string_array)[1] = "two";
-  (*args->string_array)[2] = "three";
-  return args;
-}
-
-void CheckSampleEchoArgs(js_to_cpp::EchoArgsPtr arg) {
-  EXPECT_EQ(kExpectedInt64Value, arg->si64);
-  EXPECT_EQ(kExpectedInt32Value, arg->si32);
-  EXPECT_EQ(kExpectedInt16Value, arg->si16);
-  EXPECT_EQ(kExpectedInt8Value, arg->si8);
-  EXPECT_EQ(kExpectedUInt64Value, arg->ui64);
-  EXPECT_EQ(kExpectedUInt32Value, arg->ui32);
-  EXPECT_EQ(kExpectedUInt16Value, arg->ui16);
-  EXPECT_EQ(kExpectedUInt8Value, arg->ui8);
-  EXPECT_EQ(kExpectedFloatVal, arg->float_val);
-  EXPECT_EQ(kExpectedFloatInf, arg->float_inf);
-  EXPECT_NAN(arg->float_nan);
-  EXPECT_EQ(kExpectedDoubleVal, arg->double_val);
-  EXPECT_EQ(kExpectedDoubleInf, arg->double_inf);
-  EXPECT_NAN(arg->double_nan);
-  EXPECT_EQ(std::string("coming"), *arg->name);
-  EXPECT_EQ(std::string("one"), (*arg->string_array)[0]);
-  EXPECT_EQ(std::string("two"), (*arg->string_array)[1]);
-  EXPECT_EQ(std::string("three"), (*arg->string_array)[2]);
-  CheckDataPipe(std::move(arg->data_handle));
-  CheckMessagePipe(arg->message_handle.get());
-}
-
-void CheckSampleEchoArgsList(const js_to_cpp::EchoArgsListPtr& list) {
-  if (list.is_null())
-    return;
-  CheckSampleEchoArgs(std::move(list->item));
-  CheckSampleEchoArgsList(list->next);
-}
-
-// More forgiving checks are needed in the face of potentially corrupt
-// messages. The values don't matter so long as all accesses are within
-// bounds.
-void CheckCorruptedString(const std::string& arg) {
-  for (size_t i = 0; i < arg.size(); ++i)
-    g_waste_accumulator += arg[i];
-}
-
-void CheckCorruptedString(const base::Optional<std::string>& arg) {
-  if (!arg)
-    return;
-  CheckCorruptedString(*arg);
-}
-
-void CheckCorruptedStringArray(
-    const base::Optional<std::vector<std::string>>& string_array) {
-  if (!string_array)
-    return;
-  for (size_t i = 0; i < string_array->size(); ++i)
-    CheckCorruptedString((*string_array)[i]);
-}
-
-void CheckCorruptedDataPipe(MojoHandle data_pipe_handle) {
-  unsigned char buffer[100];
-  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  MojoResult result = MojoReadData(
-      data_pipe_handle, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE);
-  if (result != MOJO_RESULT_OK)
-    return;
-  for (uint32_t i = 0; i < buffer_size; ++i)
-    g_waste_accumulator += buffer[i];
-}
-
-void CheckCorruptedMessagePipe(MojoHandle message_pipe_handle) {
-  unsigned char buffer[100];
-  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  MojoResult result = MojoReadMessage(
-      message_pipe_handle, buffer, &buffer_size, 0, 0, 0);
-  if (result != MOJO_RESULT_OK)
-    return;
-  for (uint32_t i = 0; i < buffer_size; ++i)
-    g_waste_accumulator += buffer[i];
-}
-
-void CheckCorruptedEchoArgs(const js_to_cpp::EchoArgsPtr& arg) {
-  if (arg.is_null())
-    return;
-  CheckCorruptedString(arg->name);
-  CheckCorruptedStringArray(arg->string_array);
-  if (arg->data_handle.is_valid())
-    CheckCorruptedDataPipe(arg->data_handle.get().value());
-  if (arg->message_handle.is_valid())
-    CheckCorruptedMessagePipe(arg->message_handle.get().value());
-}
-
-void CheckCorruptedEchoArgsList(const js_to_cpp::EchoArgsListPtr& list) {
-  if (list.is_null())
-    return;
-  CheckCorruptedEchoArgs(list->item);
-  CheckCorruptedEchoArgsList(list->next);
-}
-
-// Base Provider implementation class. It's expected that tests subclass and
-// override the appropriate Provider functions. When test is done quit the
-// run_loop().
-class CppSideConnection : public js_to_cpp::CppSide {
- public:
-  CppSideConnection()
-      : run_loop_(nullptr),
-        js_side_(nullptr),
-        mishandled_messages_(0),
-        binding_(this) {}
-  ~CppSideConnection() override {}
-
-  void set_run_loop(base::RunLoop* run_loop) { run_loop_ = run_loop; }
-  base::RunLoop* run_loop() { return run_loop_; }
-
-  void set_js_side(js_to_cpp::JsSide* js_side) { js_side_ = js_side; }
-  js_to_cpp::JsSide* js_side() { return js_side_; }
-
-  void Bind(InterfaceRequest<js_to_cpp::CppSide> request) {
-    binding_.Bind(std::move(request));
-    // Keep the pipe open even after validation errors.
-    binding_.EnableTestingMode();
-  }
-
-  // js_to_cpp::CppSide:
-  void StartTest() override { NOTREACHED(); }
-
-  void TestFinished() override { NOTREACHED(); }
-
-  void PingResponse() override { mishandled_messages_ += 1; }
-
-  void EchoResponse(js_to_cpp::EchoArgsListPtr list) override {
-    mishandled_messages_ += 1;
-  }
-
-  void BitFlipResponse(js_to_cpp::EchoArgsListPtr list) override {
-    mishandled_messages_ += 1;
-  }
-
-  void BackPointerResponse(js_to_cpp::EchoArgsListPtr list) override {
-    mishandled_messages_ += 1;
-  }
-
- protected:
-  base::RunLoop* run_loop_;
-  js_to_cpp::JsSide* js_side_;
-  int mishandled_messages_;
-  mojo::Binding<js_to_cpp::CppSide> binding_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CppSideConnection);
-};
-
-// Trivial test to verify a message sent from JS is received.
-class PingCppSideConnection : public CppSideConnection {
- public:
-  PingCppSideConnection() : got_message_(false) {}
-  ~PingCppSideConnection() override {}
-
-  // js_to_cpp::CppSide:
-  void StartTest() override { js_side_->Ping(); }
-
-  void PingResponse() override {
-    got_message_ = true;
-    run_loop()->Quit();
-  }
-
-  bool DidSucceed() {
-    return got_message_ && !mishandled_messages_;
-  }
-
- private:
-  bool got_message_;
-  DISALLOW_COPY_AND_ASSIGN(PingCppSideConnection);
-};
-
-// Test that parameters are passed with correct values.
-class EchoCppSideConnection : public CppSideConnection {
- public:
-  EchoCppSideConnection() :
-      message_count_(0),
-      termination_seen_(false) {
-  }
-  ~EchoCppSideConnection() override {}
-
-  // js_to_cpp::CppSide:
-  void StartTest() override {
-    js_side_->Echo(kExpectedMessageCount, BuildSampleEchoArgs());
-  }
-
-  void EchoResponse(js_to_cpp::EchoArgsListPtr list) override {
-    const js_to_cpp::EchoArgsPtr& special_arg = list->item;
-    message_count_ += 1;
-    EXPECT_EQ(-1, special_arg->si64);
-    EXPECT_EQ(-1, special_arg->si32);
-    EXPECT_EQ(-1, special_arg->si16);
-    EXPECT_EQ(-1, special_arg->si8);
-    EXPECT_EQ(std::string("going"), *special_arg->name);
-    CheckSampleEchoArgsList(list->next);
-  }
-
-  void TestFinished() override {
-    termination_seen_ = true;
-    run_loop()->Quit();
-  }
-
-  bool DidSucceed() {
-    return termination_seen_ &&
-        !mishandled_messages_ &&
-        message_count_ == kExpectedMessageCount;
-  }
-
- private:
-  static const int kExpectedMessageCount = 10;
-  int message_count_;
-  bool termination_seen_;
-  DISALLOW_COPY_AND_ASSIGN(EchoCppSideConnection);
-};
-
-// Test that corrupted messages don't wreak havoc.
-class BitFlipCppSideConnection : public CppSideConnection {
- public:
-  BitFlipCppSideConnection() : termination_seen_(false) {}
-  ~BitFlipCppSideConnection() override {}
-
-  // js_to_cpp::CppSide:
-  void StartTest() override { js_side_->BitFlip(BuildSampleEchoArgs()); }
-
-  void BitFlipResponse(js_to_cpp::EchoArgsListPtr list) override {
-    CheckCorruptedEchoArgsList(list);
-  }
-
-  void TestFinished() override {
-    termination_seen_ = true;
-    run_loop()->Quit();
-  }
-
-  bool DidSucceed() {
-    return termination_seen_;
-  }
-
- private:
-  bool termination_seen_;
-  DISALLOW_COPY_AND_ASSIGN(BitFlipCppSideConnection);
-};
-
-// Test that severely random messages don't wreak havoc.
-class BackPointerCppSideConnection : public CppSideConnection {
- public:
-  BackPointerCppSideConnection() : termination_seen_(false) {}
-  ~BackPointerCppSideConnection() override {}
-
-  // js_to_cpp::CppSide:
-  void StartTest() override { js_side_->BackPointer(BuildSampleEchoArgs()); }
-
-  void BackPointerResponse(js_to_cpp::EchoArgsListPtr list) override {
-    CheckCorruptedEchoArgsList(list);
-  }
-
-  void TestFinished() override {
-    termination_seen_ = true;
-    run_loop()->Quit();
-  }
-
-  bool DidSucceed() {
-    return termination_seen_;
-  }
-
- private:
-  bool termination_seen_;
-  DISALLOW_COPY_AND_ASSIGN(BackPointerCppSideConnection);
-};
-
-}  // namespace
-
-class JsToCppTest : public testing::Test {
- public:
-  JsToCppTest() {}
-
-  void RunTest(const std::string& test, CppSideConnection* cpp_side) {
-    cpp_side->set_run_loop(&run_loop_);
-
-    js_to_cpp::JsSidePtr js_side;
-    auto js_side_proxy = MakeRequest(&js_side);
-
-    cpp_side->set_js_side(js_side.get());
-    js_to_cpp::CppSidePtr cpp_side_ptr;
-    cpp_side->Bind(MakeRequest(&cpp_side_ptr));
-
-    js_side->SetCppSide(std::move(cpp_side_ptr));
-
-#ifdef V8_USE_EXTERNAL_STARTUP_DATA
-    gin::V8Initializer::LoadV8Snapshot();
-    gin::V8Initializer::LoadV8Natives();
-#endif
-
-    gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
-                                   gin::IsolateHolder::kStableV8Extras,
-                                   gin::ArrayBufferAllocator::SharedInstance());
-    gin::IsolateHolder instance(base::ThreadTaskRunnerHandle::Get());
-    MojoRunnerDelegate delegate;
-    gin::ShellRunner runner(&delegate, instance.isolate());
-    delegate.Start(&runner, js_side_proxy.PassMessagePipe().release().value(),
-                   test);
-
-    run_loop_.Run();
-  }
-
- private:
-  base::ShadowingAtExitManager at_exit_;
-  base::MessageLoop loop;
-  base::RunLoop run_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(JsToCppTest);
-};
-
-TEST_F(JsToCppTest, Ping) {
-  PingCppSideConnection cpp_side_connection;
-  RunTest("mojo/edk/js/tests/js_to_cpp_tests", &cpp_side_connection);
-  EXPECT_TRUE(cpp_side_connection.DidSucceed());
-}
-
-TEST_F(JsToCppTest, Echo) {
-  EchoCppSideConnection cpp_side_connection;
-  RunTest("mojo/edk/js/tests/js_to_cpp_tests", &cpp_side_connection);
-  EXPECT_TRUE(cpp_side_connection.DidSucceed());
-}
-
-TEST_F(JsToCppTest, BitFlip) {
-  // These tests generate a lot of expected validation errors. Suppress logging.
-  mojo::internal::ScopedSuppressValidationErrorLoggingForTests log_suppression;
-
-  BitFlipCppSideConnection cpp_side_connection;
-  RunTest("mojo/edk/js/tests/js_to_cpp_tests", &cpp_side_connection);
-  EXPECT_TRUE(cpp_side_connection.DidSucceed());
-}
-
-TEST_F(JsToCppTest, BackPointer) {
-  // These tests generate a lot of expected validation errors. Suppress logging.
-  mojo::internal::ScopedSuppressValidationErrorLoggingForTests log_suppression;
-
-  BackPointerCppSideConnection cpp_side_connection;
-  RunTest("mojo/edk/js/tests/js_to_cpp_tests", &cpp_side_connection);
-  EXPECT_TRUE(cpp_side_connection.DidSucceed());
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/tests/js_to_cpp_tests.js b/mojo/edk/js/tests/js_to_cpp_tests.js
deleted file mode 100644
index 6b69fca..0000000
--- a/mojo/edk/js/tests/js_to_cpp_tests.js
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define('mojo/edk/js/tests/js_to_cpp_tests', [
-  'console',
-  'mojo/edk/js/tests/js_to_cpp.mojom',
-  'mojo/public/js/bindings',
-  'mojo/public/js/connector',
-  'mojo/public/js/core',
-], function (console, jsToCpp, bindings, connector, core) {
-  var retainedJsSide;
-  var retainedJsSideStub;
-  var sampleData;
-  var sampleMessage;
-  var BAD_VALUE = 13;
-  var DATA_PIPE_PARAMS = {
-    flags: core.CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,
-    elementNumBytes: 1,
-    capacityNumBytes: 64
-  };
-
-  function JsSideConnection() {
-    this.binding = new bindings.Binding(jsToCpp.JsSide, this);
-  }
-
-  JsSideConnection.prototype.setCppSide = function(cppSide) {
-    this.cppSide_ = cppSide;
-    this.cppSide_.startTest();
-  };
-
-  JsSideConnection.prototype.ping = function (arg) {
-    this.cppSide_.pingResponse();
-  };
-
-  JsSideConnection.prototype.echo = function (numIterations, arg) {
-    var dataPipe1;
-    var dataPipe2;
-    var i;
-    var messagePipe1;
-    var messagePipe2;
-    var specialArg;
-
-    // Ensure expected negative values are negative.
-    if (arg.si64 > 0)
-      arg.si64 = BAD_VALUE;
-
-    if (arg.si32 > 0)
-      arg.si32 = BAD_VALUE;
-
-    if (arg.si16 > 0)
-      arg.si16 = BAD_VALUE;
-
-    if (arg.si8 > 0)
-      arg.si8 = BAD_VALUE;
-
-    for (i = 0; i < numIterations; ++i) {
-      dataPipe1 = core.createDataPipe(DATA_PIPE_PARAMS);
-      dataPipe2 = core.createDataPipe(DATA_PIPE_PARAMS);
-      messagePipe1 = core.createMessagePipe();
-      messagePipe2 = core.createMessagePipe();
-
-      arg.data_handle = dataPipe1.consumerHandle;
-      arg.message_handle = messagePipe1.handle1;
-
-      specialArg = new jsToCpp.EchoArgs();
-      specialArg.si64 = -1;
-      specialArg.si32 = -1;
-      specialArg.si16 = -1;
-      specialArg.si8 = -1;
-      specialArg.name = 'going';
-      specialArg.data_handle = dataPipe2.consumerHandle;
-      specialArg.message_handle = messagePipe2.handle1;
-
-      writeDataPipe(dataPipe1, sampleData);
-      writeDataPipe(dataPipe2, sampleData);
-      writeMessagePipe(messagePipe1, sampleMessage);
-      writeMessagePipe(messagePipe2, sampleMessage);
-
-      this.cppSide_.echoResponse(createEchoArgsList(specialArg, arg));
-
-      core.close(dataPipe1.producerHandle);
-      core.close(dataPipe2.producerHandle);
-      core.close(messagePipe1.handle0);
-      core.close(messagePipe2.handle0);
-    }
-    this.cppSide_.testFinished();
-  };
-
-  JsSideConnection.prototype.bitFlip = function (arg) {
-    var iteration = 0;
-    var dataPipe;
-    var messagePipe;
-    var proto = connector.Connector.prototype;
-    var stopSignalled = false;
-
-    proto.realAccept = proto.accept;
-    proto.accept = function (message) {
-      var offset = iteration / 8;
-      var mask;
-      var value;
-      if (offset < message.buffer.arrayBuffer.byteLength) {
-        mask = 1 << (iteration % 8);
-        value = message.buffer.getUint8(offset) ^ mask;
-        message.buffer.setUint8(offset, value);
-        return this.realAccept(message);
-      }
-      stopSignalled = true;
-      return false;
-    };
-
-    while (!stopSignalled) {
-      dataPipe = core.createDataPipe(DATA_PIPE_PARAMS);
-      messagePipe = core.createMessagePipe();
-      writeDataPipe(dataPipe, sampleData);
-      writeMessagePipe(messagePipe, sampleMessage);
-      arg.data_handle = dataPipe.consumerHandle;
-      arg.message_handle = messagePipe.handle1;
-
-      this.cppSide_.bitFlipResponse(createEchoArgsList(arg));
-
-      core.close(dataPipe.producerHandle);
-      core.close(messagePipe.handle0);
-      iteration += 1;
-    }
-
-    proto.accept = proto.realAccept;
-    proto.realAccept = null;
-    this.cppSide_.testFinished();
-  };
-
-  JsSideConnection.prototype.backPointer = function (arg) {
-    var iteration = 0;
-    var dataPipe;
-    var messagePipe;
-    var proto = connector.Connector.prototype;
-    var stopSignalled = false;
-
-    proto.realAccept = proto.accept;
-    proto.accept = function (message) {
-      var delta = 8 * (1 + iteration % 32);
-      var offset = 8 * ((iteration / 32) | 0);
-      if (offset < message.buffer.arrayBuffer.byteLength - 4) {
-        message.buffer.dataView.setUint32(offset, 0x100000000 - delta, true);
-        message.buffer.dataView.setUint32(offset + 4, 0xffffffff, true);
-        return this.realAccept(message);
-      }
-      stopSignalled = true;
-      return false;
-    };
-
-    while (!stopSignalled) {
-      dataPipe = core.createDataPipe(DATA_PIPE_PARAMS);
-      messagePipe = core.createMessagePipe();
-      writeDataPipe(dataPipe, sampleData);
-      writeMessagePipe(messagePipe, sampleMessage);
-      arg.data_handle = dataPipe.consumerHandle;
-      arg.message_handle = messagePipe.handle1;
-
-      this.cppSide_.backPointerResponse(createEchoArgsList(arg));
-
-      core.close(dataPipe.producerHandle);
-      core.close(messagePipe.handle0);
-      iteration += 1;
-    }
-
-    proto.accept = proto.realAccept;
-    proto.realAccept = null;
-    this.cppSide_.testFinished();
-  };
-
-  function writeDataPipe(pipe, data) {
-    var writeResult = core.writeData(
-      pipe.producerHandle, data, core.WRITE_DATA_FLAG_ALL_OR_NONE);
-
-    if (writeResult.result != core.RESULT_OK) {
-      console.log('ERROR: Data pipe write result was ' + writeResult.result);
-      return false;
-    }
-    if (writeResult.numBytes != data.length) {
-      console.log('ERROR: Data pipe write length was ' + writeResult.numBytes);
-      return false;
-    }
-    return true;
-  }
-
-  function writeMessagePipe(pipe, arrayBuffer) {
-    var result = core.writeMessage(pipe.handle0, arrayBuffer, [], 0);
-    if (result != core.RESULT_OK) {
-      console.log('ERROR: Message pipe write result was ' + result);
-      return false;
-    }
-    return true;
-  }
-
-  function createEchoArgsListElement(item, next) {
-    var list = new jsToCpp.EchoArgsList();
-    list.item = item;
-    list.next = next;
-    return list;
-  }
-
-  function createEchoArgsList() {
-    var genuineArray = Array.prototype.slice.call(arguments);
-    return genuineArray.reduceRight(function (previous, current) {
-      return createEchoArgsListElement(current, previous);
-    }, null);
-  }
-
-  return function(jsSideRequestHandle) {
-    var i;
-    sampleData = new Uint8Array(DATA_PIPE_PARAMS.capacityNumBytes);
-    for (i = 0; i < sampleData.length; ++i) {
-      sampleData[i] = i;
-    }
-    sampleMessage = new Uint8Array(DATA_PIPE_PARAMS.capacityNumBytes);
-    for (i = 0; i < sampleMessage.length; ++i) {
-      sampleMessage[i] = 255 - i;
-    }
-    retainedJsSide = new JsSideConnection;
-    retainedJsSide.binding.bind(jsSideRequestHandle);
-  };
-});
diff --git a/mojo/edk/js/tests/run_js_unittests.cc b/mojo/edk/js/tests/run_js_unittests.cc
deleted file mode 100644
index 13e796b..0000000
--- a/mojo/edk/js/tests/run_js_unittests.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/path_service.h"
-#include "gin/modules/console.h"
-#include "gin/modules/module_registry.h"
-#include "gin/modules/timer.h"
-#include "gin/test/file_runner.h"
-#include "gin/test/gtest.h"
-#include "mojo/edk/js/core.h"
-#include "mojo/edk/js/support.h"
-#include "mojo/edk/js/threading.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-namespace {
-
-class TestRunnerDelegate : public gin::FileRunnerDelegate {
- public:
-  TestRunnerDelegate() {
-    AddBuiltinModule(gin::Console::kModuleName, gin::Console::GetModule);
-    AddBuiltinModule(gin::TimerModule::kName, gin::TimerModule::GetModule);
-    AddBuiltinModule(Core::kModuleName, Core::GetModule);
-    AddBuiltinModule(Threading::kModuleName, Threading::GetModule);
-    AddBuiltinModule(Support::kModuleName, Support::GetModule);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestRunnerDelegate);
-};
-
-void RunTest(std::string test, bool run_until_idle) {
-  base::FilePath path;
-  PathService::Get(base::DIR_SOURCE_ROOT, &path);
-  path = path.AppendASCII("mojo")
-             .AppendASCII("public")
-             .AppendASCII("js")
-             .AppendASCII("tests")
-             .AppendASCII(test);
-  TestRunnerDelegate delegate;
-  gin::RunTestFromFile(path, &delegate, run_until_idle);
-}
-
-// TODO(abarth): Should we autogenerate these stubs from GYP?
-TEST(JSTest, Core) {
-  RunTest("core_unittest.js", true);
-}
-
-TEST(JSTest, Validation) {
-  RunTest("validation_unittest.js", true);
-}
-
-}  // namespace
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/threading.cc b/mojo/edk/js/threading.cc
deleted file mode 100644
index db9f12d..0000000
--- a/mojo/edk/js/threading.cc
+++ /dev/null
@@ -1,49 +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.
-
-#include "mojo/edk/js/threading.h"
-
-#include "base/message_loop/message_loop.h"
-#include "gin/object_template_builder.h"
-#include "gin/per_isolate_data.h"
-#include "mojo/edk/js/handle.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-namespace {
-
-void Quit() {
-  base::MessageLoop::current()->QuitNow();
-}
-
-gin::WrapperInfo g_wrapper_info = { gin::kEmbedderNativeGin };
-
-}  // namespace
-
-const char Threading::kModuleName[] = "mojo/public/js/threading";
-
-v8::Local<v8::Value> Threading::GetModule(v8::Isolate* isolate) {
-  gin::PerIsolateData* data = gin::PerIsolateData::From(isolate);
-  v8::Local<v8::ObjectTemplate> templ = data->GetObjectTemplate(
-      &g_wrapper_info);
-
-  if (templ.IsEmpty()) {
-    templ = gin::ObjectTemplateBuilder(isolate)
-        .SetMethod("quit", Quit)
-        .Build();
-
-    data->SetObjectTemplate(&g_wrapper_info, templ);
-  }
-
-  return templ->NewInstance();
-}
-
-Threading::Threading() {
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/threading.h b/mojo/edk/js/threading.h
deleted file mode 100644
index 653d076..0000000
--- a/mojo/edk/js/threading.h
+++ /dev/null
@@ -1,28 +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.
-
-#ifndef MOJO_EDK_JS_THREADING_H_
-#define MOJO_EDK_JS_THREADING_H_
-
-#include "gin/public/wrapper_info.h"
-#include "mojo/edk/js/js_export.h"
-#include "v8/include/v8.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class MOJO_JS_EXPORT Threading {
- public:
-  static const char kModuleName[];
-  static v8::Local<v8::Value> GetModule(v8::Isolate* isolate);
- private:
-  Threading();
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_THREADING_H_
diff --git a/mojo/edk/js/waiting_callback.cc b/mojo/edk/js/waiting_callback.cc
deleted file mode 100644
index 6ad4bd0..0000000
--- a/mojo/edk/js/waiting_callback.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/js/waiting_callback.h"
-
-#include "base/bind.h"
-#include "base/message_loop/message_loop.h"
-#include "gin/per_context_data.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-namespace {
-
-v8::Handle<v8::Private> GetHiddenPropertyName(v8::Isolate* isolate) {
-  return v8::Private::ForApi(
-      isolate, gin::StringToV8(isolate, "::mojo::js::WaitingCallback"));
-}
-
-}  // namespace
-
-gin::WrapperInfo WaitingCallback::kWrapperInfo = { gin::kEmbedderNativeGin };
-
-// static
-gin::Handle<WaitingCallback> WaitingCallback::Create(
-    v8::Isolate* isolate,
-    v8::Handle<v8::Function> callback,
-    gin::Handle<HandleWrapper> handle_wrapper,
-    MojoHandleSignals signals,
-    bool one_shot) {
-  gin::Handle<WaitingCallback> waiting_callback = gin::CreateHandle(
-      isolate, new WaitingCallback(isolate, callback, one_shot));
-  MojoResult result = waiting_callback->watcher_.Watch(
-      handle_wrapper->get(), signals,
-      base::Bind(&WaitingCallback::OnHandleReady,
-                 base::Unretained(waiting_callback.get())));
-
-  // The signals may already be unsatisfiable.
-  if (result == MOJO_RESULT_FAILED_PRECONDITION)
-    waiting_callback->OnHandleReady(MOJO_RESULT_FAILED_PRECONDITION);
-
-  return waiting_callback;
-}
-
-void WaitingCallback::Cancel() {
-  if (watcher_.IsWatching())
-    watcher_.Cancel();
-}
-
-WaitingCallback::WaitingCallback(v8::Isolate* isolate,
-                                 v8::Handle<v8::Function> callback,
-                                 bool one_shot)
-    : one_shot_(one_shot),
-      watcher_(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC),
-      weak_factory_(this) {
-  v8::Handle<v8::Context> context = isolate->GetCurrentContext();
-  runner_ = gin::PerContextData::From(context)->runner()->GetWeakPtr();
-  GetWrapper(isolate)
-      ->SetPrivate(context, GetHiddenPropertyName(isolate), callback)
-      .FromJust();
-}
-
-WaitingCallback::~WaitingCallback() {
-  Cancel();
-}
-
-void WaitingCallback::OnHandleReady(MojoResult result) {
-  if (!runner_)
-    return;
-
-  gin::Runner::Scope scope(runner_.get());
-  v8::Isolate* isolate = runner_->GetContextHolder()->isolate();
-
-  v8::Handle<v8::Value> hidden_value =
-      GetWrapper(isolate)
-          ->GetPrivate(runner_->GetContextHolder()->context(),
-                       GetHiddenPropertyName(isolate))
-          .ToLocalChecked();
-  v8::Handle<v8::Function> callback;
-  CHECK(gin::ConvertFromV8(isolate, hidden_value, &callback));
-
-  v8::Handle<v8::Value> args[] = { gin::ConvertToV8(isolate, result) };
-  runner_->Call(callback, runner_->global(), 1, args);
-
-  if (one_shot_ || result == MOJO_RESULT_CANCELLED) {
-    runner_.reset();
-    Cancel();
-  }
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/waiting_callback.h b/mojo/edk/js/waiting_callback.h
deleted file mode 100644
index f97b389..0000000
--- a/mojo/edk/js/waiting_callback.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_JS_WAITING_CALLBACK_H_
-#define MOJO_EDK_JS_WAITING_CALLBACK_H_
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "gin/handle.h"
-#include "gin/runner.h"
-#include "gin/wrappable.h"
-#include "mojo/edk/js/handle.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class WaitingCallback : public gin::Wrappable<WaitingCallback> {
- public:
-  static gin::WrapperInfo kWrapperInfo;
-
-  // Creates a new WaitingCallback.
-  //
-  // If |one_shot| is true, the callback will only ever be called at most once.
-  // If false, the callback may be called any number of times until the
-  // WaitingCallback is explicitly cancelled.
-  static gin::Handle<WaitingCallback> Create(
-      v8::Isolate* isolate,
-      v8::Handle<v8::Function> callback,
-      gin::Handle<HandleWrapper> handle_wrapper,
-      MojoHandleSignals signals,
-      bool one_shot);
-
-  // Cancels the callback. Does nothing if a callback is not pending. This is
-  // implicitly invoked from the destructor but can be explicitly invoked as
-  // necessary.
-  void Cancel();
-
- private:
-  WaitingCallback(v8::Isolate* isolate,
-                  v8::Handle<v8::Function> callback,
-                  bool one_shot);
-  ~WaitingCallback() override;
-
-  // Callback from the Watcher.
-  void OnHandleReady(MojoResult result);
-
-  // Indicates whether this is a one-shot callback or not. If so, it uses the
-  // deprecated HandleWatcher to wait for signals; otherwise it uses the new
-  // system Watcher API.
-  const bool one_shot_;
-
-  base::WeakPtr<gin::Runner> runner_;
-  SimpleWatcher watcher_;
-  base::WeakPtrFactory<WaitingCallback> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(WaitingCallback);
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_WAITING_CALLBACK_H_
diff --git a/mojo/edk/system/BUILD.gn b/mojo/edk/system/BUILD.gn
deleted file mode 100644
index a68cd44..0000000
--- a/mojo/edk/system/BUILD.gn
+++ /dev/null
@@ -1,205 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/nacl/config.gni")
-import("//testing/test.gni")
-import("../../../mojo/public/tools/bindings/mojom.gni")
-
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-component("system") {
-  output_name = "mojo_system_impl"
-
-  sources = [
-    "atomic_flag.h",
-    "broker.h",
-    "broker_host.cc",
-    "broker_host.h",
-    "broker_posix.cc",
-    "broker_win.cc",
-    "channel.cc",
-    "channel.h",
-    "channel_posix.cc",
-    "channel_win.cc",
-    "configuration.cc",
-    "configuration.h",
-    "core.cc",
-    "core.h",
-    "data_pipe_consumer_dispatcher.cc",
-    "data_pipe_consumer_dispatcher.h",
-    "data_pipe_control_message.cc",
-    "data_pipe_control_message.h",
-    "data_pipe_producer_dispatcher.cc",
-    "data_pipe_producer_dispatcher.h",
-    "dispatcher.cc",
-    "dispatcher.h",
-    "handle_signals_state.h",
-    "handle_table.cc",
-    "handle_table.h",
-    "mapping_table.cc",
-    "mapping_table.h",
-    "message_for_transit.cc",
-    "message_for_transit.h",
-    "message_pipe_dispatcher.cc",
-    "message_pipe_dispatcher.h",
-    "node_channel.cc",
-    "node_channel.h",
-    "node_controller.cc",
-    "node_controller.h",
-    "options_validation.h",
-    "platform_handle_dispatcher.cc",
-    "platform_handle_dispatcher.h",
-    "ports_message.cc",
-    "ports_message.h",
-    "request_context.cc",
-    "request_context.h",
-    "shared_buffer_dispatcher.cc",
-    "shared_buffer_dispatcher.h",
-    "watch.cc",
-    "watch.h",
-    "watcher_dispatcher.cc",
-    "watcher_dispatcher.h",
-    "watcher_set.cc",
-    "watcher_set.h",
-  ]
-
-  defines = [ "MOJO_SYSTEM_IMPL_IMPLEMENTATION" ]
-
-  public_deps = [
-    "//mojo/edk/embedder",
-    "//mojo/edk/embedder:platform",
-    "//mojo/edk/system/ports",
-    "//mojo/public/c/system",
-    "//mojo/public/cpp/system",
-  ]
-
-  deps = [
-    "//base",
-  ]
-
-  if (!is_nacl) {
-    deps += [ "//crypto" ]
-  }
-
-  if (is_win) {
-    cflags = [ "/wd4324" ]  # Structure was padded due to __declspec(align()),
-                            # which is uninteresting.
-  }
-
-  if (is_mac && !is_ios) {
-    sources += [
-      "mach_port_relay.cc",
-      "mach_port_relay.h",
-    ]
-  }
-
-  if (is_nacl && !is_nacl_nonsfi) {
-    sources -= [
-      "broker_host.cc",
-      "broker_posix.cc",
-      "channel_posix.cc",
-    ]
-  }
-
-  # Use target_os == "chromeos" instead of is_chromeos because we need to
-  # build NaCl targets (i.e. IRT) for ChromeOS the same as the rest of ChromeOS.
-  if (is_android || target_os == "chromeos") {
-    defines += [ "MOJO_EDK_LEGACY_PROTOCOL" ]
-  }
-
-  allow_circular_includes_from = [ "//mojo/edk/embedder" ]
-}
-
-group("tests") {
-  testonly = true
-  deps = [
-    ":mojo_system_unittests",
-  ]
-
-  if (!is_ios) {
-    deps += [ ":mojo_message_pipe_perftests" ]
-  }
-}
-
-source_set("test_utils") {
-  testonly = true
-
-  sources = [
-    "test_utils.cc",
-    "test_utils.h",
-  ]
-
-  public_deps = [
-    "//mojo/public/c/system",
-    "//mojo/public/cpp/system",
-  ]
-
-  deps = [
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/test:test_support",
-    "//testing/gtest:gtest",
-  ]
-}
-
-test("mojo_system_unittests") {
-  sources = [
-    "channel_unittest.cc",
-    "core_test_base.cc",
-    "core_test_base.h",
-    "core_unittest.cc",
-    "message_pipe_unittest.cc",
-    "options_validation_unittest.cc",
-    "platform_handle_dispatcher_unittest.cc",
-    "shared_buffer_dispatcher_unittest.cc",
-    "shared_buffer_unittest.cc",
-    "signals_unittest.cc",
-    "watcher_unittest.cc",
-  ]
-
-  if (!is_ios) {
-    sources += [
-      "data_pipe_unittest.cc",
-      "multiprocess_message_pipe_unittest.cc",
-      "platform_wrapper_unittest.cc",
-    ]
-  }
-
-  deps = [
-    ":test_utils",
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/embedder:embedder_unittests",
-    "//mojo/edk/system",
-    "//mojo/edk/system/ports:tests",
-    "//mojo/edk/test:run_all_unittests",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/system",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-
-  allow_circular_includes_from = [ "//mojo/edk/embedder:embedder_unittests" ]
-}
-
-if (!is_ios) {
-  test("mojo_message_pipe_perftests") {
-    sources = [
-      "message_pipe_perftest.cc",
-    ]
-
-    deps = [
-      ":test_utils",
-      "//base",
-      "//base/test:test_support",
-      "//mojo/edk/system",
-      "//mojo/edk/test:run_all_perftests",
-      "//mojo/edk/test:test_support",
-      "//testing/gtest",
-    ]
-  }
-}
diff --git a/mojo/edk/system/atomic_flag.h b/mojo/edk/system/atomic_flag.h
deleted file mode 100644
index 6bdcfaa..0000000
--- a/mojo/edk/system/atomic_flag.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_ATOMIC_FLAG_H_
-#define MOJO_EDK_SYSTEM_ATOMIC_FLAG_H_
-
-#include "base/atomicops.h"
-#include "base/macros.h"
-
-namespace mojo {
-namespace edk {
-
-// AtomicFlag is a boolean flag that can be set and tested atomically. It is
-// intended to be used to fast-path checks where the common case would normally
-// release the governing mutex immediately after checking.
-//
-// Example usage:
-// void DoFoo(Bar* bar) {
-//   AutoLock l(lock_);
-//   queue_.push_back(bar);
-//   flag_.Set(true);
-// }
-//
-// void Baz() {
-//   if (!flag_)  // Assume this is the common case.
-//     return;
-//
-//   AutoLock l(lock_);
-//   ... drain queue_ ...
-//   flag_.Set(false);
-// }
-class AtomicFlag {
- public:
-  AtomicFlag() : flag_(0) {}
-  ~AtomicFlag() {}
-
-  void Set(bool value) {
-    base::subtle::Release_Store(&flag_, value ? 1 : 0);
-  }
-
-  bool Get() const {
-    return base::subtle::Acquire_Load(&flag_) ? true : false;
-  }
-
-  operator const bool() const { return Get(); }
-
- private:
-  base::subtle::Atomic32 flag_;
-
-  DISALLOW_COPY_AND_ASSIGN(AtomicFlag);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_ATOMIC_FLAG_H_
diff --git a/mojo/edk/system/broker.h b/mojo/edk/system/broker.h
deleted file mode 100644
index 1577972..0000000
--- a/mojo/edk/system/broker.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_BROKER_H_
-#define MOJO_EDK_SYSTEM_BROKER_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-
-namespace mojo {
-namespace edk {
-
-class PlatformSharedBuffer;
-
-// The Broker is a channel to the parent process, which allows synchronous IPCs.
-class Broker {
- public:
-  // Note: This is blocking, and will wait for the first message over
-  // |platform_handle|.
-  explicit Broker(ScopedPlatformHandle platform_handle);
-  ~Broker();
-
-  // Returns the platform handle that should be used to establish a NodeChannel
-  // to the parent process.
-  ScopedPlatformHandle GetParentPlatformHandle();
-
-  // Request a shared buffer from the parent process. Blocks the current thread.
-  scoped_refptr<PlatformSharedBuffer> GetSharedBuffer(size_t num_bytes);
-
- private:
-  // Handle to the parent process, used for synchronous IPCs.
-  ScopedPlatformHandle sync_channel_;
-
-  // Handle to the parent process which is recieved in the first first message
-  // over |sync_channel_|.
-  ScopedPlatformHandle parent_channel_;
-
-  // Lock to only allow one sync message at a time. This avoids having to deal
-  // with message ordering since we can only have one request at a time
-  // in-flight.
-  base::Lock lock_;
-
-  DISALLOW_COPY_AND_ASSIGN(Broker);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_BROKER_H_
diff --git a/mojo/edk/system/broker_host.cc b/mojo/edk/system/broker_host.cc
deleted file mode 100644
index 6096034..0000000
--- a/mojo/edk/system/broker_host.cc
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/broker_host.h"
-
-#include <utility>
-
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/edk/embedder/named_platform_channel_pair.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/broker_messages.h"
-
-namespace mojo {
-namespace edk {
-
-BrokerHost::BrokerHost(base::ProcessHandle client_process,
-                       ScopedPlatformHandle platform_handle)
-#if defined(OS_WIN)
-    : client_process_(client_process)
-#endif
-{
-  CHECK(platform_handle.is_valid());
-
-  base::MessageLoop::current()->AddDestructionObserver(this);
-
-  channel_ = Channel::Create(this, ConnectionParams(std::move(platform_handle)),
-                             base::ThreadTaskRunnerHandle::Get());
-  channel_->Start();
-}
-
-BrokerHost::~BrokerHost() {
-  // We're always destroyed on the creation thread, which is the IO thread.
-  base::MessageLoop::current()->RemoveDestructionObserver(this);
-
-  if (channel_)
-    channel_->ShutDown();
-}
-
-bool BrokerHost::PrepareHandlesForClient(PlatformHandleVector* handles) {
-#if defined(OS_WIN)
-  if (!Channel::Message::RewriteHandles(
-      base::GetCurrentProcessHandle(), client_process_, handles)) {
-    // NOTE: We only log an error here. We do not signal a logical error or
-    // prevent any message from being sent. The client should handle unexpected
-    // invalid handles appropriately.
-    DLOG(ERROR) << "Failed to rewrite one or more handles to broker client.";
-    return false;
-  }
-#endif
-  return true;
-}
-
-bool BrokerHost::SendChannel(ScopedPlatformHandle handle) {
-  CHECK(handle.is_valid());
-  CHECK(channel_);
-
-#if defined(OS_WIN)
-  InitData* data;
-  Channel::MessagePtr message =
-      CreateBrokerMessage(BrokerMessageType::INIT, 1, 0, &data);
-  data->pipe_name_length = 0;
-#else
-  Channel::MessagePtr message =
-      CreateBrokerMessage(BrokerMessageType::INIT, 1, nullptr);
-#endif
-  ScopedPlatformHandleVectorPtr handles;
-  handles.reset(new PlatformHandleVector(1));
-  handles->at(0) = handle.release();
-
-  // This may legitimately fail on Windows if the client process is in another
-  // session, e.g., is an elevated process.
-  if (!PrepareHandlesForClient(handles.get()))
-    return false;
-
-   message->SetHandles(std::move(handles));
-  channel_->Write(std::move(message));
-  return true;
-}
-
-#if defined(OS_WIN)
-
-void BrokerHost::SendNamedChannel(const base::StringPiece16& pipe_name) {
-  InitData* data;
-  base::char16* name_data;
-  Channel::MessagePtr message = CreateBrokerMessage(
-      BrokerMessageType::INIT, 0, sizeof(*name_data) * pipe_name.length(),
-      &data, reinterpret_cast<void**>(&name_data));
-  data->pipe_name_length = static_cast<uint32_t>(pipe_name.length());
-  std::copy(pipe_name.begin(), pipe_name.end(), name_data);
-  channel_->Write(std::move(message));
-}
-
-#endif  // defined(OS_WIN)
-
-void BrokerHost::OnBufferRequest(uint32_t num_bytes) {
-  scoped_refptr<PlatformSharedBuffer> read_only_buffer;
-  scoped_refptr<PlatformSharedBuffer> buffer =
-      PlatformSharedBuffer::Create(num_bytes);
-  if (buffer)
-    read_only_buffer = buffer->CreateReadOnlyDuplicate();
-  if (!read_only_buffer)
-    buffer = nullptr;
-
-  Channel::MessagePtr message = CreateBrokerMessage(
-      BrokerMessageType::BUFFER_RESPONSE, buffer ? 2 : 0, nullptr);
-  if (buffer) {
-    ScopedPlatformHandleVectorPtr handles;
-    handles.reset(new PlatformHandleVector(2));
-    handles->at(0) = buffer->PassPlatformHandle().release();
-    handles->at(1) = read_only_buffer->PassPlatformHandle().release();
-    PrepareHandlesForClient(handles.get());
-    message->SetHandles(std::move(handles));
-  }
-
-  channel_->Write(std::move(message));
-}
-
-void BrokerHost::OnChannelMessage(const void* payload,
-                                  size_t payload_size,
-                                  ScopedPlatformHandleVectorPtr handles) {
-  if (payload_size < sizeof(BrokerMessageHeader))
-    return;
-
-  const BrokerMessageHeader* header =
-      static_cast<const BrokerMessageHeader*>(payload);
-  switch (header->type) {
-    case BrokerMessageType::BUFFER_REQUEST:
-      if (payload_size ==
-            sizeof(BrokerMessageHeader) + sizeof(BufferRequestData)) {
-        const BufferRequestData* request =
-            reinterpret_cast<const BufferRequestData*>(header + 1);
-        OnBufferRequest(request->size);
-      }
-      break;
-
-    default:
-      LOG(ERROR) << "Unexpected broker message type: " << header->type;
-      break;
-  }
-}
-
-void BrokerHost::OnChannelError() { delete this; }
-
-void BrokerHost::WillDestroyCurrentMessageLoop() { delete this; }
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/broker_host.h b/mojo/edk/system/broker_host.h
deleted file mode 100644
index a7995d2..0000000
--- a/mojo/edk/system/broker_host.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_BROKER_HOST_H_
-#define MOJO_EDK_SYSTEM_BROKER_HOST_H_
-
-#include <stdint.h>
-
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/process/process_handle.h"
-#include "base/strings/string_piece.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/channel.h"
-
-namespace mojo {
-namespace edk {
-
-// The BrokerHost is a channel to the child process, which services synchronous
-// IPCs.
-class BrokerHost : public Channel::Delegate,
-                   public base::MessageLoop::DestructionObserver {
- public:
-  BrokerHost(base::ProcessHandle client_process, ScopedPlatformHandle handle);
-
-  // Send |handle| to the child, to be used to establish a NodeChannel to us.
-  bool SendChannel(ScopedPlatformHandle handle);
-
-#if defined(OS_WIN)
-  // Sends a named channel to the child. Like above, but for named pipes.
-  void SendNamedChannel(const base::StringPiece16& pipe_name);
-#endif
-
- private:
-  ~BrokerHost() override;
-
-  bool PrepareHandlesForClient(PlatformHandleVector* handles);
-
-  // Channel::Delegate:
-  void OnChannelMessage(const void* payload,
-                        size_t payload_size,
-                        ScopedPlatformHandleVectorPtr handles) override;
-  void OnChannelError() override;
-
-  // base::MessageLoop::DestructionObserver:
-  void WillDestroyCurrentMessageLoop() override;
-
-  void OnBufferRequest(uint32_t num_bytes);
-
-#if defined(OS_WIN)
-  base::ProcessHandle client_process_;
-#endif
-
-  scoped_refptr<Channel> channel_;
-
-  DISALLOW_COPY_AND_ASSIGN(BrokerHost);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_BROKER_HOST_H_
diff --git a/mojo/edk/system/broker_messages.h b/mojo/edk/system/broker_messages.h
deleted file mode 100644
index 0f0dd9d..0000000
--- a/mojo/edk/system/broker_messages.h
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_BROKER_MESSAGES_H_
-#define MOJO_EDK_SYSTEM_BROKER_MESSAGES_H_
-
-#include "mojo/edk/system/channel.h"
-
-namespace mojo {
-namespace edk {
-
-#pragma pack(push, 1)
-
-enum BrokerMessageType : uint32_t {
-  INIT,
-  BUFFER_REQUEST,
-  BUFFER_RESPONSE,
-};
-
-struct BrokerMessageHeader {
-  BrokerMessageType type;
-  uint32_t padding;
-};
-
-static_assert(IsAlignedForChannelMessage(sizeof(BrokerMessageHeader)),
-              "Invalid header size.");
-
-struct BufferRequestData {
-  uint32_t size;
-};
-
-#if defined(OS_WIN)
-struct InitData {
-  // NOTE: InitData in the payload is followed by string16 data with exactly
-  // |pipe_name_length| wide characters (i.e., |pipe_name_length|*2 bytes.)
-  // This applies to Windows only.
-  uint32_t pipe_name_length;
-};
-#endif
-
-#pragma pack(pop)
-
-template <typename T>
-inline Channel::MessagePtr CreateBrokerMessage(
-    BrokerMessageType type,
-    size_t num_handles,
-    size_t extra_data_size,
-    T** out_message_data,
-    void** out_extra_data = nullptr) {
-  const size_t message_size = sizeof(BrokerMessageHeader) +
-      sizeof(**out_message_data) + extra_data_size;
-  Channel::MessagePtr message(new Channel::Message(message_size, num_handles));
-  BrokerMessageHeader* header =
-      reinterpret_cast<BrokerMessageHeader*>(message->mutable_payload());
-  header->type = type;
-  header->padding = 0;
-  *out_message_data = reinterpret_cast<T*>(header + 1);
-  if (out_extra_data)
-    *out_extra_data = *out_message_data + 1;
-  return message;
-}
-
-inline Channel::MessagePtr CreateBrokerMessage(
-    BrokerMessageType type,
-    size_t num_handles,
-    std::nullptr_t** dummy_out_data) {
-  Channel::MessagePtr message(
-      new Channel::Message(sizeof(BrokerMessageHeader), num_handles));
-  BrokerMessageHeader* header =
-      reinterpret_cast<BrokerMessageHeader*>(message->mutable_payload());
-  header->type = type;
-  header->padding = 0;
-  return message;
-}
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_BROKER_MESSAGES_H_
diff --git a/mojo/edk/system/broker_posix.cc b/mojo/edk/system/broker_posix.cc
deleted file mode 100644
index 8742f70..0000000
--- a/mojo/edk/system/broker_posix.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/broker.h"
-
-#include <fcntl.h>
-#include <unistd.h>
-
-#include <utility>
-
-#include "base/logging.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/platform_channel_utils_posix.h"
-#include "mojo/edk/embedder/platform_handle_utils.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/broker_messages.h"
-#include "mojo/edk/system/channel.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-bool WaitForBrokerMessage(PlatformHandle platform_handle,
-                          BrokerMessageType expected_type,
-                          size_t expected_num_handles,
-                          std::deque<PlatformHandle>* incoming_handles) {
-  Channel::MessagePtr message(
-      new Channel::Message(sizeof(BrokerMessageHeader), expected_num_handles));
-  std::deque<PlatformHandle> incoming_platform_handles;
-  ssize_t read_result = PlatformChannelRecvmsg(
-      platform_handle, const_cast<void*>(message->data()),
-      message->data_num_bytes(), &incoming_platform_handles, true /* block */);
-  bool error = false;
-  if (read_result < 0) {
-    PLOG(ERROR) << "Recvmsg error";
-    error = true;
-  } else if (static_cast<size_t>(read_result) != message->data_num_bytes()) {
-    LOG(ERROR) << "Invalid node channel message";
-    error = true;
-  } else if (incoming_platform_handles.size() != expected_num_handles) {
-    LOG(ERROR) << "Received unexpected number of handles";
-    error = true;
-  }
-
-  if (!error) {
-    const BrokerMessageHeader* header =
-        reinterpret_cast<const BrokerMessageHeader*>(message->payload());
-    if (header->type != expected_type) {
-      LOG(ERROR) << "Unexpected message";
-      error = true;
-    }
-  }
-
-  if (error) {
-    CloseAllPlatformHandles(&incoming_platform_handles);
-  } else {
-    if (incoming_handles)
-      incoming_handles->swap(incoming_platform_handles);
-  }
-  return !error;
-}
-
-}  // namespace
-
-Broker::Broker(ScopedPlatformHandle platform_handle)
-    : sync_channel_(std::move(platform_handle)) {
-  CHECK(sync_channel_.is_valid());
-
-  // Mark the channel as blocking.
-  int flags = fcntl(sync_channel_.get().handle, F_GETFL);
-  PCHECK(flags != -1);
-  flags = fcntl(sync_channel_.get().handle, F_SETFL, flags & ~O_NONBLOCK);
-  PCHECK(flags != -1);
-
-  // Wait for the first message, which should contain a handle.
-  std::deque<PlatformHandle> incoming_platform_handles;
-  if (WaitForBrokerMessage(sync_channel_.get(), BrokerMessageType::INIT, 1,
-                           &incoming_platform_handles)) {
-    parent_channel_ = ScopedPlatformHandle(incoming_platform_handles.front());
-  }
-}
-
-Broker::~Broker() = default;
-
-ScopedPlatformHandle Broker::GetParentPlatformHandle() {
-  return std::move(parent_channel_);
-}
-
-scoped_refptr<PlatformSharedBuffer> Broker::GetSharedBuffer(size_t num_bytes) {
-  base::AutoLock lock(lock_);
-
-  BufferRequestData* buffer_request;
-  Channel::MessagePtr out_message = CreateBrokerMessage(
-      BrokerMessageType::BUFFER_REQUEST, 0, 0, &buffer_request);
-  buffer_request->size = num_bytes;
-  ssize_t write_result = PlatformChannelWrite(
-      sync_channel_.get(), out_message->data(), out_message->data_num_bytes());
-  if (write_result < 0) {
-    PLOG(ERROR) << "Error sending sync broker message";
-    return nullptr;
-  } else if (static_cast<size_t>(write_result) !=
-             out_message->data_num_bytes()) {
-    LOG(ERROR) << "Error sending complete broker message";
-    return nullptr;
-  }
-
-  std::deque<PlatformHandle> incoming_platform_handles;
-  if (WaitForBrokerMessage(sync_channel_.get(),
-                           BrokerMessageType::BUFFER_RESPONSE, 2,
-                           &incoming_platform_handles)) {
-    ScopedPlatformHandle rw_handle(incoming_platform_handles.front());
-    incoming_platform_handles.pop_front();
-    ScopedPlatformHandle ro_handle(incoming_platform_handles.front());
-    return PlatformSharedBuffer::CreateFromPlatformHandlePair(
-        num_bytes, std::move(rw_handle), std::move(ro_handle));
-  }
-
-  return nullptr;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/broker_win.cc b/mojo/edk/system/broker_win.cc
deleted file mode 100644
index 063282c..0000000
--- a/mojo/edk/system/broker_win.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <windows.h>
-
-#include <limits>
-#include <utility>
-
-#include "base/debug/alias.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/strings/string_piece.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/broker.h"
-#include "mojo/edk/system/broker_messages.h"
-#include "mojo/edk/system/channel.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-// 256 bytes should be enough for anyone!
-const size_t kMaxBrokerMessageSize = 256;
-
-bool TakeHandlesFromBrokerMessage(Channel::Message* message,
-                                  size_t num_handles,
-                                  ScopedPlatformHandle* out_handles) {
-  if (message->num_handles() != num_handles) {
-    DLOG(ERROR) << "Received unexpected number of handles in broker message";
-    return false;
-  }
-
-  ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-  DCHECK(handles);
-  DCHECK_EQ(handles->size(), num_handles);
-  DCHECK(out_handles);
-
-  for (size_t i = 0; i < num_handles; ++i)
-    out_handles[i] = ScopedPlatformHandle((*handles)[i]);
-  handles->clear();
-  return true;
-}
-
-Channel::MessagePtr WaitForBrokerMessage(PlatformHandle platform_handle,
-                                         BrokerMessageType expected_type) {
-  char buffer[kMaxBrokerMessageSize];
-  DWORD bytes_read = 0;
-  BOOL result = ::ReadFile(platform_handle.handle, buffer,
-                           kMaxBrokerMessageSize, &bytes_read, nullptr);
-  if (!result) {
-    // The pipe may be broken if the browser side has been closed, e.g. during
-    // browser shutdown. In that case the ReadFile call will fail and we
-    // shouldn't continue waiting.
-    PLOG(ERROR) << "Error reading broker pipe";
-    return nullptr;
-  }
-
-  Channel::MessagePtr message =
-      Channel::Message::Deserialize(buffer, static_cast<size_t>(bytes_read));
-  if (!message || message->payload_size() < sizeof(BrokerMessageHeader)) {
-    LOG(ERROR) << "Invalid broker message";
-
-    base::debug::Alias(&buffer[0]);
-    base::debug::Alias(&bytes_read);
-    base::debug::Alias(message.get());
-    CHECK(false);
-    return nullptr;
-  }
-
-  const BrokerMessageHeader* header =
-      reinterpret_cast<const BrokerMessageHeader*>(message->payload());
-  if (header->type != expected_type) {
-    LOG(ERROR) << "Unexpected broker message type";
-
-    base::debug::Alias(&buffer[0]);
-    base::debug::Alias(&bytes_read);
-    base::debug::Alias(message.get());
-    CHECK(false);
-    return nullptr;
-  }
-
-  return message;
-}
-
-}  // namespace
-
-Broker::Broker(ScopedPlatformHandle handle) : sync_channel_(std::move(handle)) {
-  CHECK(sync_channel_.is_valid());
-  Channel::MessagePtr message =
-      WaitForBrokerMessage(sync_channel_.get(), BrokerMessageType::INIT);
-
-  // If we fail to read a message (broken pipe), just return early. The parent
-  // handle will be null and callers must handle this gracefully.
-  if (!message)
-    return;
-
-  if (!TakeHandlesFromBrokerMessage(message.get(), 1, &parent_channel_)) {
-    // If the message has no handles, we expect it to carry pipe name instead.
-    const BrokerMessageHeader* header =
-        static_cast<const BrokerMessageHeader*>(message->payload());
-    CHECK_GE(message->payload_size(),
-             sizeof(BrokerMessageHeader) + sizeof(InitData));
-    const InitData* data = reinterpret_cast<const InitData*>(header + 1);
-    CHECK_EQ(message->payload_size(),
-             sizeof(BrokerMessageHeader) + sizeof(InitData) +
-             data->pipe_name_length * sizeof(base::char16));
-    const base::char16* name_data =
-        reinterpret_cast<const base::char16*>(data + 1);
-    CHECK(data->pipe_name_length);
-    parent_channel_ = CreateClientHandle(NamedPlatformHandle(
-        base::StringPiece16(name_data, data->pipe_name_length)));
-  }
-}
-
-Broker::~Broker() {}
-
-ScopedPlatformHandle Broker::GetParentPlatformHandle() {
-  return std::move(parent_channel_);
-}
-
-scoped_refptr<PlatformSharedBuffer> Broker::GetSharedBuffer(size_t num_bytes) {
-  base::AutoLock lock(lock_);
-  BufferRequestData* buffer_request;
-  Channel::MessagePtr out_message = CreateBrokerMessage(
-      BrokerMessageType::BUFFER_REQUEST, 0, 0, &buffer_request);
-  buffer_request->size = base::checked_cast<uint32_t>(num_bytes);
-  DWORD bytes_written = 0;
-  BOOL result = ::WriteFile(sync_channel_.get().handle, out_message->data(),
-                            static_cast<DWORD>(out_message->data_num_bytes()),
-                            &bytes_written, nullptr);
-  if (!result ||
-      static_cast<size_t>(bytes_written) != out_message->data_num_bytes()) {
-    LOG(ERROR) << "Error sending sync broker message";
-    return nullptr;
-  }
-
-  ScopedPlatformHandle handles[2];
-  Channel::MessagePtr response = WaitForBrokerMessage(
-      sync_channel_.get(), BrokerMessageType::BUFFER_RESPONSE);
-  if (response &&
-      TakeHandlesFromBrokerMessage(response.get(), 2, &handles[0])) {
-    return PlatformSharedBuffer::CreateFromPlatformHandlePair(
-        num_bytes, std::move(handles[0]), std::move(handles[1]));
-  }
-
-  return nullptr;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/channel.cc b/mojo/edk/system/channel.cc
deleted file mode 100644
index 8a44d36..0000000
--- a/mojo/edk/system/channel.cc
+++ /dev/null
@@ -1,683 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/channel.h"
-
-#include <stddef.h>
-#include <string.h>
-
-#include <algorithm>
-#include <limits>
-#include <utility>
-
-#include "base/macros.h"
-#include "base/memory/aligned_memory.h"
-#include "base/process/process_handle.h"
-#include "mojo/edk/embedder/platform_handle.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "base/mac/mach_logging.h"
-#elif defined(OS_WIN)
-#include "base/win/win_util.h"
-#endif
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-static_assert(
-    IsAlignedForChannelMessage(sizeof(Channel::Message::LegacyHeader)),
-    "Invalid LegacyHeader size.");
-
-static_assert(IsAlignedForChannelMessage(sizeof(Channel::Message::Header)),
-              "Invalid Header size.");
-
-static_assert(sizeof(Channel::Message::LegacyHeader) == 8,
-              "LegacyHeader must be 8 bytes on ChromeOS and Android");
-
-static_assert(offsetof(Channel::Message::LegacyHeader, num_bytes) ==
-                  offsetof(Channel::Message::Header, num_bytes),
-              "num_bytes should be at the same offset in both Header structs.");
-static_assert(offsetof(Channel::Message::LegacyHeader, message_type) ==
-                  offsetof(Channel::Message::Header, message_type),
-              "message_type should be at the same offset in both Header "
-              "structs.");
-
-}  // namespace
-
-const size_t kReadBufferSize = 4096;
-const size_t kMaxUnusedReadBufferCapacity = 4096;
-const size_t kMaxChannelMessageSize = 256 * 1024 * 1024;
-const size_t kMaxAttachedHandles = 128;
-
-Channel::Message::Message(size_t payload_size, size_t max_handles)
-#if defined(MOJO_EDK_LEGACY_PROTOCOL)
-    : Message(payload_size, max_handles, MessageType::NORMAL_LEGACY) {
-}
-#else
-    : Message(payload_size, max_handles, MessageType::NORMAL) {
-}
-#endif
-
-Channel::Message::Message(size_t payload_size,
-                          size_t max_handles,
-                          MessageType message_type)
-    : max_handles_(max_handles) {
-  DCHECK_LE(max_handles_, kMaxAttachedHandles);
-
-  const bool is_legacy_message = (message_type == MessageType::NORMAL_LEGACY);
-  size_t extra_header_size = 0;
-#if defined(OS_WIN)
-  // On Windows we serialize HANDLEs into the extra header space.
-  extra_header_size = max_handles_ * sizeof(HandleEntry);
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  // On OSX, some of the platform handles may be mach ports, which are
-  // serialised into the message buffer. Since there could be a mix of fds and
-  // mach ports, we store the mach ports as an <index, port> pair (of uint32_t),
-  // so that the original ordering of handles can be re-created.
-  if (max_handles) {
-    extra_header_size =
-        sizeof(MachPortsExtraHeader) + (max_handles * sizeof(MachPortsEntry));
-  }
-#endif
-  // Pad extra header data to be aliged to |kChannelMessageAlignment| bytes.
-  if (!IsAlignedForChannelMessage(extra_header_size)) {
-    extra_header_size += kChannelMessageAlignment -
-                         (extra_header_size % kChannelMessageAlignment);
-  }
-  DCHECK(IsAlignedForChannelMessage(extra_header_size));
-  const size_t header_size =
-      is_legacy_message ? sizeof(LegacyHeader) : sizeof(Header);
-  DCHECK(extra_header_size == 0 || !is_legacy_message);
-
-  size_ = header_size + extra_header_size + payload_size;
-  data_ = static_cast<char*>(base::AlignedAlloc(size_,
-                                                kChannelMessageAlignment));
-  // Only zero out the header and not the payload. Since the payload is going to
-  // be memcpy'd, zeroing the payload is unnecessary work and a significant
-  // performance issue when dealing with large messages. Any sanitizer errors
-  // complaining about an uninitialized read in the payload area should be
-  // treated as an error and fixed.
-  memset(data_, 0, header_size + extra_header_size);
-
-  DCHECK_LE(size_, std::numeric_limits<uint32_t>::max());
-  legacy_header()->num_bytes = static_cast<uint32_t>(size_);
-
-  DCHECK_LE(header_size + extra_header_size,
-            std::numeric_limits<uint16_t>::max());
-  legacy_header()->message_type = message_type;
-
-  if (is_legacy_message) {
-    legacy_header()->num_handles = static_cast<uint16_t>(max_handles);
-  } else {
-    header()->num_header_bytes =
-        static_cast<uint16_t>(header_size + extra_header_size);
-  }
-
-  if (max_handles_ > 0) {
-#if defined(OS_WIN)
-    handles_ = reinterpret_cast<HandleEntry*>(mutable_extra_header());
-    // Initialize all handles to invalid values.
-    for (size_t i = 0; i < max_handles_; ++i)
-      handles_[i].handle = base::win::HandleToUint32(INVALID_HANDLE_VALUE);
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-    mach_ports_header_ =
-        reinterpret_cast<MachPortsExtraHeader*>(mutable_extra_header());
-    mach_ports_header_->num_ports = 0;
-    // Initialize all handles to invalid values.
-    for (size_t i = 0; i < max_handles_; ++i) {
-      mach_ports_header_->entries[i] =
-          {0, static_cast<uint32_t>(MACH_PORT_NULL)};
-    }
-#endif
-  }
-}
-
-Channel::Message::~Message() {
-  base::AlignedFree(data_);
-}
-
-// static
-Channel::MessagePtr Channel::Message::Deserialize(const void* data,
-                                                  size_t data_num_bytes) {
-  if (data_num_bytes < sizeof(LegacyHeader))
-    return nullptr;
-
-  const LegacyHeader* legacy_header =
-      reinterpret_cast<const LegacyHeader*>(data);
-  if (legacy_header->num_bytes != data_num_bytes) {
-    DLOG(ERROR) << "Decoding invalid message: " << legacy_header->num_bytes
-                << " != " << data_num_bytes;
-    return nullptr;
-  }
-
-  const Header* header = nullptr;
-  if (legacy_header->message_type == MessageType::NORMAL)
-    header = reinterpret_cast<const Header*>(data);
-
-  uint32_t extra_header_size = 0;
-  size_t payload_size = 0;
-  const char* payload = nullptr;
-  if (!header) {
-    payload_size = data_num_bytes - sizeof(LegacyHeader);
-    payload = static_cast<const char*>(data) + sizeof(LegacyHeader);
-  } else {
-    if (header->num_bytes < header->num_header_bytes ||
-        header->num_header_bytes < sizeof(Header)) {
-      DLOG(ERROR) << "Decoding invalid message: " << header->num_bytes << " < "
-                  << header->num_header_bytes;
-      return nullptr;
-    }
-    extra_header_size = header->num_header_bytes - sizeof(Header);
-    payload_size = data_num_bytes - header->num_header_bytes;
-    payload = static_cast<const char*>(data) + header->num_header_bytes;
-  }
-
-#if defined(OS_WIN)
-  uint32_t max_handles = extra_header_size / sizeof(HandleEntry);
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  if (extra_header_size > 0 &&
-      extra_header_size < sizeof(MachPortsExtraHeader)) {
-    DLOG(ERROR) << "Decoding invalid message: " << extra_header_size << " < "
-                << sizeof(MachPortsExtraHeader);
-    return nullptr;
-  }
-  uint32_t max_handles =
-      extra_header_size == 0
-          ? 0
-          : (extra_header_size - sizeof(MachPortsExtraHeader)) /
-                sizeof(MachPortsEntry);
-#else
-  const uint32_t max_handles = 0;
-#endif  // defined(OS_WIN)
-
-  const uint16_t num_handles =
-      header ? header->num_handles : legacy_header->num_handles;
-  if (num_handles > max_handles || max_handles > kMaxAttachedHandles) {
-    DLOG(ERROR) << "Decoding invalid message: " << num_handles << " > "
-                << max_handles;
-    return nullptr;
-  }
-
-  MessagePtr message(
-      new Message(payload_size, max_handles, legacy_header->message_type));
-  DCHECK_EQ(message->data_num_bytes(), data_num_bytes);
-
-  // Copy all payload bytes.
-  if (payload_size)
-    memcpy(message->mutable_payload(), payload, payload_size);
-
-  if (header) {
-    DCHECK_EQ(message->extra_header_size(), extra_header_size);
-    DCHECK_EQ(message->header()->num_header_bytes, header->num_header_bytes);
-
-    if (message->extra_header_size()) {
-      // Copy extra header bytes.
-      memcpy(message->mutable_extra_header(),
-             static_cast<const char*>(data) + sizeof(Header),
-             message->extra_header_size());
-    }
-    message->header()->num_handles = header->num_handles;
-  } else {
-    message->legacy_header()->num_handles = legacy_header->num_handles;
-  }
-
-#if defined(OS_WIN)
-  ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector(num_handles));
-  for (size_t i = 0; i < num_handles; i++) {
-    (*handles)[i].handle =
-        base::win::Uint32ToHandle(message->handles_[i].handle);
-  }
-  message->SetHandles(std::move(handles));
-#endif
-
-  return message;
-}
-
-const void* Channel::Message::extra_header() const {
-  DCHECK(!is_legacy_message());
-  return data_ + sizeof(Header);
-}
-
-void* Channel::Message::mutable_extra_header() {
-  DCHECK(!is_legacy_message());
-  return data_ + sizeof(Header);
-}
-
-size_t Channel::Message::extra_header_size() const {
-  return header()->num_header_bytes - sizeof(Header);
-}
-
-void* Channel::Message::mutable_payload() {
-  if (is_legacy_message())
-    return static_cast<void*>(legacy_header() + 1);
-  return data_ + header()->num_header_bytes;
-}
-
-const void* Channel::Message::payload() const {
-  if (is_legacy_message())
-    return static_cast<const void*>(legacy_header() + 1);
-  return data_ + header()->num_header_bytes;
-}
-
-size_t Channel::Message::payload_size() const {
-  if (is_legacy_message())
-    return legacy_header()->num_bytes - sizeof(LegacyHeader);
-  return size_ - header()->num_header_bytes;
-}
-
-size_t Channel::Message::num_handles() const {
-  return is_legacy_message() ? legacy_header()->num_handles
-                             : header()->num_handles;
-}
-
-bool Channel::Message::has_handles() const {
-  return (is_legacy_message() ? legacy_header()->num_handles
-                              : header()->num_handles) > 0;
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-bool Channel::Message::has_mach_ports() const {
-  if (!has_handles())
-    return false;
-
-  for (const auto& handle : (*handle_vector_)) {
-    if (handle.type == PlatformHandle::Type::MACH ||
-        handle.type == PlatformHandle::Type::MACH_NAME) {
-      return true;
-    }
-  }
-  return false;
-}
-#endif
-
-bool Channel::Message::is_legacy_message() const {
-  return legacy_header()->message_type == MessageType::NORMAL_LEGACY;
-}
-
-Channel::Message::LegacyHeader* Channel::Message::legacy_header() const {
-  return reinterpret_cast<LegacyHeader*>(data_);
-}
-
-Channel::Message::Header* Channel::Message::header() const {
-  DCHECK(!is_legacy_message());
-  return reinterpret_cast<Header*>(data_);
-}
-
-void Channel::Message::SetHandles(ScopedPlatformHandleVectorPtr new_handles) {
-  if (is_legacy_message()) {
-    // Old semantics for ChromeOS and Android
-    if (legacy_header()->num_handles == 0) {
-      CHECK(!new_handles || new_handles->size() == 0);
-      return;
-    }
-    CHECK(new_handles && new_handles->size() == legacy_header()->num_handles);
-    std::swap(handle_vector_, new_handles);
-    return;
-  }
-
-  if (max_handles_ == 0) {
-    CHECK(!new_handles || new_handles->size() == 0);
-    return;
-  }
-
-  CHECK(new_handles && new_handles->size() <= max_handles_);
-  header()->num_handles = static_cast<uint16_t>(new_handles->size());
-  std::swap(handle_vector_, new_handles);
-#if defined(OS_WIN)
-  memset(handles_, 0, extra_header_size());
-  for (size_t i = 0; i < handle_vector_->size(); i++)
-    handles_[i].handle = base::win::HandleToUint32((*handle_vector_)[i].handle);
-#endif  // defined(OS_WIN)
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  size_t mach_port_index = 0;
-  if (mach_ports_header_) {
-    for (size_t i = 0; i < max_handles_; ++i) {
-      mach_ports_header_->entries[i] =
-          {0, static_cast<uint32_t>(MACH_PORT_NULL)};
-    }
-    for (size_t i = 0; i < handle_vector_->size(); i++) {
-      if ((*handle_vector_)[i].type == PlatformHandle::Type::MACH ||
-          (*handle_vector_)[i].type == PlatformHandle::Type::MACH_NAME) {
-        mach_port_t port = (*handle_vector_)[i].port;
-        mach_ports_header_->entries[mach_port_index].index = i;
-        mach_ports_header_->entries[mach_port_index].mach_port = port;
-        mach_port_index++;
-      }
-    }
-    mach_ports_header_->num_ports = static_cast<uint16_t>(mach_port_index);
-  }
-#endif
-}
-
-ScopedPlatformHandleVectorPtr Channel::Message::TakeHandles() {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  if (mach_ports_header_) {
-    for (size_t i = 0; i < max_handles_; ++i) {
-      mach_ports_header_->entries[i] =
-          {0, static_cast<uint32_t>(MACH_PORT_NULL)};
-    }
-    mach_ports_header_->num_ports = 0;
-  }
-#endif
-  if (is_legacy_message())
-    legacy_header()->num_handles = 0;
-  else
-    header()->num_handles = 0;
-  return std::move(handle_vector_);
-}
-
-ScopedPlatformHandleVectorPtr Channel::Message::TakeHandlesForTransport() {
-#if defined(OS_WIN)
-  // Not necessary on Windows.
-  NOTREACHED();
-  return nullptr;
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  if (handle_vector_) {
-    for (auto it = handle_vector_->begin(); it != handle_vector_->end(); ) {
-      if (it->type == PlatformHandle::Type::MACH ||
-          it->type == PlatformHandle::Type::MACH_NAME) {
-        // For Mach port names, we can can just leak them. They're not real
-        // ports anyways. For real ports, they're leaked because this is a child
-        // process and the remote process will take ownership.
-        it = handle_vector_->erase(it);
-      } else {
-        ++it;
-      }
-    }
-  }
-  return std::move(handle_vector_);
-#else
-  return std::move(handle_vector_);
-#endif
-}
-
-#if defined(OS_WIN)
-// static
-bool Channel::Message::RewriteHandles(base::ProcessHandle from_process,
-                                      base::ProcessHandle to_process,
-                                      PlatformHandleVector* handles) {
-  bool success = true;
-  for (size_t i = 0; i < handles->size(); ++i) {
-    if (!(*handles)[i].is_valid()) {
-      DLOG(ERROR) << "Refusing to duplicate invalid handle.";
-      continue;
-    }
-    DCHECK_EQ((*handles)[i].owning_process, from_process);
-    BOOL result = DuplicateHandle(
-        from_process, (*handles)[i].handle, to_process,
-        &(*handles)[i].handle, 0, FALSE,
-        DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
-    if (result) {
-      (*handles)[i].owning_process = to_process;
-    } else {
-      success = false;
-
-      // If handle duplication fails, the source handle will already be closed
-      // due to DUPLICATE_CLOSE_SOURCE. Replace the handle in the message with
-      // an invalid handle.
-      (*handles)[i].handle = INVALID_HANDLE_VALUE;
-      (*handles)[i].owning_process = base::GetCurrentProcessHandle();
-    }
-  }
-  return success;
-}
-#endif
-
-// Helper class for managing a Channel's read buffer allocations. This maintains
-// a single contiguous buffer with the layout:
-//
-//   [discarded bytes][occupied bytes][unoccupied bytes]
-//
-// The Reserve() method ensures that a certain capacity of unoccupied bytes are
-// available. It does not claim that capacity and only allocates new capacity
-// when strictly necessary.
-//
-// Claim() marks unoccupied bytes as occupied.
-//
-// Discard() marks occupied bytes as discarded, signifying that their contents
-// can be forgotten or overwritten.
-//
-// Realign() moves occupied bytes to the front of the buffer so that those
-// occupied bytes are properly aligned.
-//
-// The most common Channel behavior in practice should result in very few
-// allocations and copies, as memory is claimed and discarded shortly after
-// being reserved, and future reservations will immediately reuse discarded
-// memory.
-class Channel::ReadBuffer {
- public:
-  ReadBuffer() {
-    size_ = kReadBufferSize;
-    data_ = static_cast<char*>(base::AlignedAlloc(size_,
-                                                  kChannelMessageAlignment));
-  }
-
-  ~ReadBuffer() {
-    DCHECK(data_);
-    base::AlignedFree(data_);
-  }
-
-  const char* occupied_bytes() const { return data_ + num_discarded_bytes_; }
-
-  size_t num_occupied_bytes() const {
-    return num_occupied_bytes_ - num_discarded_bytes_;
-  }
-
-  // Ensures the ReadBuffer has enough contiguous space allocated to hold
-  // |num_bytes| more bytes; returns the address of the first available byte.
-  char* Reserve(size_t num_bytes) {
-    if (num_occupied_bytes_ + num_bytes > size_) {
-      size_ = std::max(size_ * 2, num_occupied_bytes_ + num_bytes);
-      void* new_data = base::AlignedAlloc(size_, kChannelMessageAlignment);
-      memcpy(new_data, data_, num_occupied_bytes_);
-      base::AlignedFree(data_);
-      data_ = static_cast<char*>(new_data);
-    }
-
-    return data_ + num_occupied_bytes_;
-  }
-
-  // Marks the first |num_bytes| unoccupied bytes as occupied.
-  void Claim(size_t num_bytes) {
-    DCHECK_LE(num_occupied_bytes_ + num_bytes, size_);
-    num_occupied_bytes_ += num_bytes;
-  }
-
-  // Marks the first |num_bytes| occupied bytes as discarded. This may result in
-  // shrinkage of the internal buffer, and it is not safe to assume the result
-  // of a previous Reserve() call is still valid after this.
-  void Discard(size_t num_bytes) {
-    DCHECK_LE(num_discarded_bytes_ + num_bytes, num_occupied_bytes_);
-    num_discarded_bytes_ += num_bytes;
-
-    if (num_discarded_bytes_ == num_occupied_bytes_) {
-      // We can just reuse the buffer from the beginning in this common case.
-      num_discarded_bytes_ = 0;
-      num_occupied_bytes_ = 0;
-    }
-
-    if (num_discarded_bytes_ > kMaxUnusedReadBufferCapacity) {
-      // In the uncommon case that we have a lot of discarded data at the
-      // front of the buffer, simply move remaining data to a smaller buffer.
-      size_t num_preserved_bytes = num_occupied_bytes_ - num_discarded_bytes_;
-      size_ = std::max(num_preserved_bytes, kReadBufferSize);
-      char* new_data = static_cast<char*>(
-          base::AlignedAlloc(size_, kChannelMessageAlignment));
-      memcpy(new_data, data_ + num_discarded_bytes_, num_preserved_bytes);
-      base::AlignedFree(data_);
-      data_ = new_data;
-      num_discarded_bytes_ = 0;
-      num_occupied_bytes_ = num_preserved_bytes;
-    }
-
-    if (num_occupied_bytes_ == 0 && size_ > kMaxUnusedReadBufferCapacity) {
-      // Opportunistically shrink the read buffer back down to a small size if
-      // it's grown very large. We only do this if there are no remaining
-      // unconsumed bytes in the buffer to avoid copies in most the common
-      // cases.
-      size_ = kMaxUnusedReadBufferCapacity;
-      base::AlignedFree(data_);
-      data_ = static_cast<char*>(
-          base::AlignedAlloc(size_, kChannelMessageAlignment));
-    }
-  }
-
-  void Realign() {
-    size_t num_bytes = num_occupied_bytes();
-    memmove(data_, occupied_bytes(), num_bytes);
-    num_discarded_bytes_ = 0;
-    num_occupied_bytes_ = num_bytes;
-  }
-
- private:
-  char* data_ = nullptr;
-
-  // The total size of the allocated buffer.
-  size_t size_ = 0;
-
-  // The number of discarded bytes at the beginning of the allocated buffer.
-  size_t num_discarded_bytes_ = 0;
-
-  // The total number of occupied bytes, including discarded bytes.
-  size_t num_occupied_bytes_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(ReadBuffer);
-};
-
-Channel::Channel(Delegate* delegate)
-    : delegate_(delegate), read_buffer_(new ReadBuffer) {
-}
-
-Channel::~Channel() {
-}
-
-void Channel::ShutDown() {
-  delegate_ = nullptr;
-  ShutDownImpl();
-}
-
-char* Channel::GetReadBuffer(size_t *buffer_capacity) {
-  DCHECK(read_buffer_);
-  size_t required_capacity = *buffer_capacity;
-  if (!required_capacity)
-    required_capacity = kReadBufferSize;
-
-  *buffer_capacity = required_capacity;
-  return read_buffer_->Reserve(required_capacity);
-}
-
-bool Channel::OnReadComplete(size_t bytes_read, size_t *next_read_size_hint) {
-  bool did_dispatch_message = false;
-  read_buffer_->Claim(bytes_read);
-  while (read_buffer_->num_occupied_bytes() >= sizeof(Message::LegacyHeader)) {
-    // Ensure the occupied data is properly aligned. If it isn't, a SIGBUS could
-    // happen on architectures that don't allow misaligned words access (i.e.
-    // anything other than x86). Only re-align when necessary to avoid copies.
-    if (!IsAlignedForChannelMessage(
-            reinterpret_cast<uintptr_t>(read_buffer_->occupied_bytes()))) {
-      read_buffer_->Realign();
-    }
-
-    // We have at least enough data available for a LegacyHeader.
-    const Message::LegacyHeader* legacy_header =
-        reinterpret_cast<const Message::LegacyHeader*>(
-            read_buffer_->occupied_bytes());
-
-    if (legacy_header->num_bytes < sizeof(Message::LegacyHeader) ||
-        legacy_header->num_bytes > kMaxChannelMessageSize) {
-      LOG(ERROR) << "Invalid message size: " << legacy_header->num_bytes;
-      return false;
-    }
-
-    if (read_buffer_->num_occupied_bytes() < legacy_header->num_bytes) {
-      // Not enough data available to read the full message. Hint to the
-      // implementation that it should try reading the full size of the message.
-      *next_read_size_hint =
-          legacy_header->num_bytes - read_buffer_->num_occupied_bytes();
-      return true;
-    }
-
-    const Message::Header* header = nullptr;
-    if (legacy_header->message_type != Message::MessageType::NORMAL_LEGACY) {
-      header = reinterpret_cast<const Message::Header*>(legacy_header);
-    }
-
-    size_t extra_header_size = 0;
-    const void* extra_header = nullptr;
-    size_t payload_size = 0;
-    void* payload = nullptr;
-    if (header) {
-      if (header->num_header_bytes < sizeof(Message::Header) ||
-          header->num_header_bytes > header->num_bytes) {
-        LOG(ERROR) << "Invalid message header size: "
-                   << header->num_header_bytes;
-        return false;
-      }
-      extra_header_size = header->num_header_bytes - sizeof(Message::Header);
-      extra_header = extra_header_size ? header + 1 : nullptr;
-      payload_size = header->num_bytes - header->num_header_bytes;
-      payload = payload_size
-                    ? reinterpret_cast<Message::Header*>(
-                          const_cast<char*>(read_buffer_->occupied_bytes()) +
-                          header->num_header_bytes)
-                    : nullptr;
-    } else {
-      payload_size = legacy_header->num_bytes - sizeof(Message::LegacyHeader);
-      payload = payload_size
-                    ? const_cast<Message::LegacyHeader*>(&legacy_header[1])
-                    : nullptr;
-    }
-
-    const uint16_t num_handles =
-        header ? header->num_handles : legacy_header->num_handles;
-    ScopedPlatformHandleVectorPtr handles;
-    if (num_handles > 0) {
-      if (!GetReadPlatformHandles(num_handles, extra_header, extra_header_size,
-                                  &handles)) {
-        return false;
-      }
-
-      if (!handles) {
-        // Not enough handles available for this message.
-        break;
-      }
-    }
-
-    // We've got a complete message! Dispatch it and try another.
-    if (legacy_header->message_type != Message::MessageType::NORMAL_LEGACY &&
-        legacy_header->message_type != Message::MessageType::NORMAL) {
-      if (!OnControlMessage(legacy_header->message_type, payload, payload_size,
-                            std::move(handles))) {
-        return false;
-      }
-      did_dispatch_message = true;
-    } else if (delegate_) {
-      delegate_->OnChannelMessage(payload, payload_size, std::move(handles));
-      did_dispatch_message = true;
-    }
-
-    read_buffer_->Discard(legacy_header->num_bytes);
-  }
-
-  *next_read_size_hint = did_dispatch_message ? 0 : kReadBufferSize;
-  return true;
-}
-
-void Channel::OnError() {
-  if (delegate_)
-    delegate_->OnChannelError();
-}
-
-bool Channel::OnControlMessage(Message::MessageType message_type,
-                               const void* payload,
-                               size_t payload_size,
-                               ScopedPlatformHandleVectorPtr handles) {
-  return false;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/channel.h b/mojo/edk/system/channel.h
deleted file mode 100644
index 33a510c..0000000
--- a/mojo/edk/system/channel.h
+++ /dev/null
@@ -1,303 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_CHANNEL_H_
-#define MOJO_EDK_SYSTEM_CHANNEL_H_
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/process/process_handle.h"
-#include "base/task_runner.h"
-#include "mojo/edk/embedder/connection_params.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-
-namespace mojo {
-namespace edk {
-
-const size_t kChannelMessageAlignment = 8;
-
-constexpr bool IsAlignedForChannelMessage(size_t n) {
-  return n % kChannelMessageAlignment == 0;
-}
-
-// Channel provides a thread-safe interface to read and write arbitrary
-// delimited messages over an underlying I/O channel, optionally transferring
-// one or more platform handles in the process.
-class MOJO_SYSTEM_IMPL_EXPORT Channel
-    : public base::RefCountedThreadSafe<Channel> {
- public:
-  struct Message;
-
-  using MessagePtr = std::unique_ptr<Message>;
-
-  // A message to be written to a channel.
-  struct MOJO_SYSTEM_IMPL_EXPORT Message {
-    enum class MessageType : uint16_t {
-      // An old format normal message, that uses the LegacyHeader.
-      // Only used on Android and ChromeOS.
-      // TODO(jcivelli): remove legacy support when Arc++ has updated to Mojo
-      //                 with normal versioned messages. crbug.com/695645
-      NORMAL_LEGACY = 0,
-#if defined(OS_MACOSX)
-      // A control message containing handles to echo back.
-      HANDLES_SENT,
-      // A control message containing handles that can now be closed.
-      HANDLES_SENT_ACK,
-#endif
-      // A normal message that uses Header and can contain extra header values.
-      NORMAL,
-    };
-
-#pragma pack(push, 1)
-    // Old message wire format for ChromeOS and Android, used by NORMAL_LEGACY
-    // messages.
-    struct LegacyHeader {
-      // Message size in bytes, including the header.
-      uint32_t num_bytes;
-
-      // Number of attached handles.
-      uint16_t num_handles;
-
-      MessageType message_type;
-    };
-
-    // Header used by NORMAL messages.
-    // To preserve backward compatibility with LegacyHeader, the num_bytes and
-    // message_type field must be at the same offset as in LegacyHeader.
-    struct Header {
-      // Message size in bytes, including the header.
-      uint32_t num_bytes;
-
-      // Total size of header, including extra header data (i.e. HANDLEs on
-      // windows).
-      uint16_t num_header_bytes;
-
-      MessageType message_type;
-
-      // Number of attached handles. May be less than the reserved handle
-      // storage size in this message on platforms that serialise handles as
-      // data (i.e. HANDLEs on Windows, Mach ports on OSX).
-      uint16_t num_handles;
-
-      char padding[6];
-    };
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    struct MachPortsEntry {
-      // Index of Mach port in the original vector of PlatformHandles.
-      uint16_t index;
-
-      // Mach port name.
-      uint32_t mach_port;
-      static_assert(sizeof(mach_port_t) <= sizeof(uint32_t),
-                    "mach_port_t must be no larger than uint32_t");
-    };
-    static_assert(sizeof(MachPortsEntry) == 6,
-                  "sizeof(MachPortsEntry) must be 6 bytes");
-
-    // Structure of the extra header field when present on OSX.
-    struct MachPortsExtraHeader {
-      // Actual number of Mach ports encoded in the extra header.
-      uint16_t num_ports;
-
-      // Array of encoded Mach ports. If |num_ports| > 0, |entries[0]| through
-      // to |entries[num_ports-1]| inclusive are valid.
-      MachPortsEntry entries[0];
-    };
-    static_assert(sizeof(MachPortsExtraHeader) == 2,
-                  "sizeof(MachPortsExtraHeader) must be 2 bytes");
-#elif defined(OS_WIN)
-    struct HandleEntry {
-      // The windows HANDLE. HANDLEs are guaranteed to fit inside 32-bits.
-      // See: https://msdn.microsoft.com/en-us/library/aa384203(VS.85).aspx
-      uint32_t handle;
-    };
-    static_assert(sizeof(HandleEntry) == 4,
-                  "sizeof(HandleEntry) must be 4 bytes");
-#endif
-#pragma pack(pop)
-
-    // Allocates and owns a buffer for message data with enough capacity for
-    // |payload_size| bytes plus a header, plus |max_handles| platform handles.
-    Message(size_t payload_size, size_t max_handles);
-    Message(size_t payload_size, size_t max_handles, MessageType message_type);
-    ~Message();
-
-    // Constructs a Message from serialized message data.
-    static MessagePtr Deserialize(const void* data, size_t data_num_bytes);
-
-    const void* data() const { return data_; }
-    size_t data_num_bytes() const { return size_; }
-
-    const void* extra_header() const;
-    void* mutable_extra_header();
-    size_t extra_header_size() const;
-
-    void* mutable_payload();
-    const void* payload() const;
-    size_t payload_size() const;
-
-    size_t num_handles() const;
-    bool has_handles() const;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    bool has_mach_ports() const;
-#endif
-
-    bool is_legacy_message() const;
-    LegacyHeader* legacy_header() const;
-    Header* header() const;
-
-    // Note: SetHandles() and TakeHandles() invalidate any previous value of
-    // handles().
-    void SetHandles(ScopedPlatformHandleVectorPtr new_handles);
-    ScopedPlatformHandleVectorPtr TakeHandles();
-    // Version of TakeHandles that returns a vector of platform handles suitable
-    // for transfer over an underlying OS mechanism. i.e. file descriptors over
-    // a unix domain socket. Any handle that cannot be transferred this way,
-    // such as Mach ports, will be removed.
-    ScopedPlatformHandleVectorPtr TakeHandlesForTransport();
-
-#if defined(OS_WIN)
-    // Prepares the handles in this message for use in a different process.
-    // Upon calling this the handles should belong to |from_process|; after the
-    // call they'll belong to |to_process|. The source handles are always
-    // closed by this call. Returns false iff one or more handles failed
-    // duplication.
-    static bool RewriteHandles(base::ProcessHandle from_process,
-                               base::ProcessHandle to_process,
-                               PlatformHandleVector* handles);
-#endif
-
-    void SetVersionForTest(uint16_t version_number);
-
-   private:
-    size_t size_ = 0;
-    size_t max_handles_ = 0;
-    char* data_ = nullptr;
-
-    ScopedPlatformHandleVectorPtr handle_vector_;
-
-#if defined(OS_WIN)
-    // On Windows, handles are serialised into the extra header section.
-    HandleEntry* handles_ = nullptr;
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-    // On OSX, handles are serialised into the extra header section.
-    MachPortsExtraHeader* mach_ports_header_ = nullptr;
-#endif
-
-    DISALLOW_COPY_AND_ASSIGN(Message);
-  };
-
-  // Delegate methods are called from the I/O task runner with which the Channel
-  // was created (see Channel::Create).
-  class Delegate {
-   public:
-    virtual ~Delegate() {}
-
-    // Notify of a received message. |payload| is not owned and must not be
-    // retained; it will be null if |payload_size| is 0. |handles| are
-    // transferred to the callee.
-    virtual void OnChannelMessage(const void* payload,
-                                  size_t payload_size,
-                                  ScopedPlatformHandleVectorPtr handles) = 0;
-
-    // Notify that an error has occured and the Channel will cease operation.
-    virtual void OnChannelError() = 0;
-  };
-
-  // Creates a new Channel around a |platform_handle|, taking ownership of the
-  // handle. All I/O on the handle will be performed on |io_task_runner|.
-  // Note that ShutDown() MUST be called on the Channel some time before
-  // |delegate| is destroyed.
-  static scoped_refptr<Channel> Create(
-      Delegate* delegate,
-      ConnectionParams connection_params,
-      scoped_refptr<base::TaskRunner> io_task_runner);
-
-  // Request that the channel be shut down. This should always be called before
-  // releasing the last reference to a Channel to ensure that it's cleaned up
-  // on its I/O task runner's thread.
-  //
-  // Delegate methods will no longer be invoked after this call.
-  void ShutDown();
-
-  // Begin processing I/O events. Delegate methods must only be invoked after
-  // this call.
-  virtual void Start() = 0;
-
-  // Stop processing I/O events.
-  virtual void ShutDownImpl() = 0;
-
-  // Queues an outgoing message on the Channel. This message will either
-  // eventually be written or will fail to write and trigger
-  // Delegate::OnChannelError.
-  virtual void Write(MessagePtr message) = 0;
-
-  // Causes the platform handle to leak when this channel is shut down instead
-  // of closing it.
-  virtual void LeakHandle() = 0;
-
- protected:
-  explicit Channel(Delegate* delegate);
-  virtual ~Channel();
-
-  // Called by the implementation when it wants somewhere to stick data.
-  // |*buffer_capacity| may be set by the caller to indicate the desired buffer
-  // size. If 0, a sane default size will be used instead.
-  //
-  // Returns the address of a buffer which can be written to, and indicates its
-  // actual capacity in |*buffer_capacity|.
-  char* GetReadBuffer(size_t* buffer_capacity);
-
-  // Called by the implementation when new data is available in the read
-  // buffer. Returns false to indicate an error. Upon success,
-  // |*next_read_size_hint| will be set to a recommended size for the next
-  // read done by the implementation.
-  bool OnReadComplete(size_t bytes_read, size_t* next_read_size_hint);
-
-  // Called by the implementation when something goes horribly wrong. It is NOT
-  // OK to call this synchronously from any public interface methods.
-  void OnError();
-
-  // Retrieves the set of platform handles read for a given message.
-  // |extra_header| and |extra_header_size| correspond to the extra header data.
-  // Depending on the Channel implementation, this body may encode platform
-  // handles, or handles may be stored and managed elsewhere by the
-  // implementation.
-  //
-  // Returns |false| on unrecoverable error (i.e. the Channel should be closed).
-  // Returns |true| otherwise. Note that it is possible on some platforms for an
-  // insufficient number of handles to be available when this call is made, but
-  // this is not necessarily an error condition. In such cases this returns
-  // |true| but |*handles| will also be reset to null.
-  virtual bool GetReadPlatformHandles(
-      size_t num_handles,
-      const void* extra_header,
-      size_t extra_header_size,
-      ScopedPlatformHandleVectorPtr* handles) = 0;
-
-  // Handles a received control message. Returns |true| if the message is
-  // accepted, or |false| otherwise.
-  virtual bool OnControlMessage(Message::MessageType message_type,
-                                const void* payload,
-                                size_t payload_size,
-                                ScopedPlatformHandleVectorPtr handles);
-
- private:
-  friend class base::RefCountedThreadSafe<Channel>;
-
-  class ReadBuffer;
-
-  Delegate* delegate_;
-  const std::unique_ptr<ReadBuffer> read_buffer_;
-
-  DISALLOW_COPY_AND_ASSIGN(Channel);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_CHANNEL_H_
diff --git a/mojo/edk/system/channel_posix.cc b/mojo/edk/system/channel_posix.cc
deleted file mode 100644
index 8b4ca7f..0000000
--- a/mojo/edk/system/channel_posix.cc
+++ /dev/null
@@ -1,572 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/channel.h"
-
-#include <errno.h>
-#include <sys/socket.h>
-
-#include <algorithm>
-#include <deque>
-#include <limits>
-#include <memory>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/synchronization/lock.h"
-#include "base/task_runner.h"
-#include "mojo/edk/embedder/platform_channel_utils_posix.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-
-#if !defined(OS_NACL)
-#include <sys/uio.h>
-#endif
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-const size_t kMaxBatchReadCapacity = 256 * 1024;
-
-// A view over a Channel::Message object. The write queue uses these since
-// large messages may need to be sent in chunks.
-class MessageView {
- public:
-  // Owns |message|. |offset| indexes the first unsent byte in the message.
-  MessageView(Channel::MessagePtr message, size_t offset)
-      : message_(std::move(message)),
-        offset_(offset),
-        handles_(message_->TakeHandlesForTransport()) {
-    DCHECK_GT(message_->data_num_bytes(), offset_);
-  }
-
-  MessageView(MessageView&& other) { *this = std::move(other); }
-
-  MessageView& operator=(MessageView&& other) {
-    message_ = std::move(other.message_);
-    offset_ = other.offset_;
-    handles_ = std::move(other.handles_);
-    return *this;
-  }
-
-  ~MessageView() {}
-
-  const void* data() const {
-    return static_cast<const char*>(message_->data()) + offset_;
-  }
-
-  size_t data_num_bytes() const { return message_->data_num_bytes() - offset_; }
-
-  size_t data_offset() const { return offset_; }
-  void advance_data_offset(size_t num_bytes) {
-    DCHECK_GT(message_->data_num_bytes(), offset_ + num_bytes);
-    offset_ += num_bytes;
-  }
-
-  ScopedPlatformHandleVectorPtr TakeHandles() { return std::move(handles_); }
-  Channel::MessagePtr TakeMessage() { return std::move(message_); }
-
-  void SetHandles(ScopedPlatformHandleVectorPtr handles) {
-    handles_ = std::move(handles);
-  }
-
- private:
-  Channel::MessagePtr message_;
-  size_t offset_;
-  ScopedPlatformHandleVectorPtr handles_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageView);
-};
-
-class ChannelPosix : public Channel,
-                     public base::MessageLoop::DestructionObserver,
-                     public base::MessageLoopForIO::Watcher {
- public:
-  ChannelPosix(Delegate* delegate,
-               ConnectionParams connection_params,
-               scoped_refptr<base::TaskRunner> io_task_runner)
-      : Channel(delegate),
-        self_(this),
-        handle_(connection_params.TakeChannelHandle()),
-        io_task_runner_(io_task_runner)
-#if defined(OS_MACOSX)
-        ,
-        handles_to_close_(new PlatformHandleVector)
-#endif
-  {
-    CHECK(handle_.is_valid());
-  }
-
-  void Start() override {
-    if (io_task_runner_->RunsTasksOnCurrentThread()) {
-      StartOnIOThread();
-    } else {
-      io_task_runner_->PostTask(
-          FROM_HERE, base::Bind(&ChannelPosix::StartOnIOThread, this));
-    }
-  }
-
-  void ShutDownImpl() override {
-    // Always shut down asynchronously when called through the public interface.
-    io_task_runner_->PostTask(
-        FROM_HERE, base::Bind(&ChannelPosix::ShutDownOnIOThread, this));
-  }
-
-  void Write(MessagePtr message) override {
-    bool write_error = false;
-    {
-      base::AutoLock lock(write_lock_);
-      if (reject_writes_)
-        return;
-      if (outgoing_messages_.empty()) {
-        if (!WriteNoLock(MessageView(std::move(message), 0)))
-          reject_writes_ = write_error = true;
-      } else {
-        outgoing_messages_.emplace_back(std::move(message), 0);
-      }
-    }
-    if (write_error) {
-      // Do not synchronously invoke OnError(). Write() may have been called by
-      // the delegate and we don't want to re-enter it.
-      io_task_runner_->PostTask(FROM_HERE,
-                                base::Bind(&ChannelPosix::OnError, this));
-    }
-  }
-
-  void LeakHandle() override {
-    DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-    leak_handle_ = true;
-  }
-
-  bool GetReadPlatformHandles(
-      size_t num_handles,
-      const void* extra_header,
-      size_t extra_header_size,
-      ScopedPlatformHandleVectorPtr* handles) override {
-    if (num_handles > std::numeric_limits<uint16_t>::max())
-      return false;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    // On OSX, we can have mach ports which are located in the extra header
-    // section.
-    using MachPortsEntry = Channel::Message::MachPortsEntry;
-    using MachPortsExtraHeader = Channel::Message::MachPortsExtraHeader;
-    CHECK(extra_header_size >=
-          sizeof(MachPortsExtraHeader) + num_handles * sizeof(MachPortsEntry));
-    const MachPortsExtraHeader* mach_ports_header =
-        reinterpret_cast<const MachPortsExtraHeader*>(extra_header);
-    size_t num_mach_ports = mach_ports_header->num_ports;
-    CHECK(num_mach_ports <= num_handles);
-    if (incoming_platform_handles_.size() + num_mach_ports < num_handles) {
-      handles->reset();
-      return true;
-    }
-
-    handles->reset(new PlatformHandleVector(num_handles));
-    const MachPortsEntry* mach_ports = mach_ports_header->entries;
-    for (size_t i = 0, mach_port_index = 0; i < num_handles; ++i) {
-      if (mach_port_index < num_mach_ports &&
-          mach_ports[mach_port_index].index == i) {
-        (*handles)->at(i) = PlatformHandle(
-            static_cast<mach_port_t>(mach_ports[mach_port_index].mach_port));
-        CHECK((*handles)->at(i).type == PlatformHandle::Type::MACH);
-        // These are actually just Mach port names until they're resolved from
-        // the remote process.
-        (*handles)->at(i).type = PlatformHandle::Type::MACH_NAME;
-        mach_port_index++;
-      } else {
-        CHECK(!incoming_platform_handles_.empty());
-        (*handles)->at(i) = incoming_platform_handles_.front();
-        incoming_platform_handles_.pop_front();
-      }
-    }
-#else
-    if (incoming_platform_handles_.size() < num_handles) {
-      handles->reset();
-      return true;
-    }
-
-    handles->reset(new PlatformHandleVector(num_handles));
-    for (size_t i = 0; i < num_handles; ++i) {
-      (*handles)->at(i) = incoming_platform_handles_.front();
-      incoming_platform_handles_.pop_front();
-    }
-#endif
-
-    return true;
-  }
-
- private:
-  ~ChannelPosix() override {
-    DCHECK(!read_watcher_);
-    DCHECK(!write_watcher_);
-    for (auto handle : incoming_platform_handles_)
-      handle.CloseIfNecessary();
-  }
-
-  void StartOnIOThread() {
-    DCHECK(!read_watcher_);
-    DCHECK(!write_watcher_);
-    read_watcher_.reset(
-        new base::MessageLoopForIO::FileDescriptorWatcher(FROM_HERE));
-    base::MessageLoop::current()->AddDestructionObserver(this);
-    if (handle_.get().needs_connection) {
-      base::MessageLoopForIO::current()->WatchFileDescriptor(
-          handle_.get().handle, false /* persistent */,
-          base::MessageLoopForIO::WATCH_READ, read_watcher_.get(), this);
-    } else {
-      write_watcher_.reset(
-          new base::MessageLoopForIO::FileDescriptorWatcher(FROM_HERE));
-      base::MessageLoopForIO::current()->WatchFileDescriptor(
-          handle_.get().handle, true /* persistent */,
-          base::MessageLoopForIO::WATCH_READ, read_watcher_.get(), this);
-      base::AutoLock lock(write_lock_);
-      FlushOutgoingMessagesNoLock();
-    }
-  }
-
-  void WaitForWriteOnIOThread() {
-    base::AutoLock lock(write_lock_);
-    WaitForWriteOnIOThreadNoLock();
-  }
-
-  void WaitForWriteOnIOThreadNoLock() {
-    if (pending_write_)
-      return;
-    if (!write_watcher_)
-      return;
-    if (io_task_runner_->RunsTasksOnCurrentThread()) {
-      pending_write_ = true;
-      base::MessageLoopForIO::current()->WatchFileDescriptor(
-          handle_.get().handle, false /* persistent */,
-          base::MessageLoopForIO::WATCH_WRITE, write_watcher_.get(), this);
-    } else {
-      io_task_runner_->PostTask(
-          FROM_HERE, base::Bind(&ChannelPosix::WaitForWriteOnIOThread, this));
-    }
-  }
-
-  void ShutDownOnIOThread() {
-    base::MessageLoop::current()->RemoveDestructionObserver(this);
-
-    read_watcher_.reset();
-    write_watcher_.reset();
-    if (leak_handle_)
-      ignore_result(handle_.release());
-    handle_.reset();
-#if defined(OS_MACOSX)
-    handles_to_close_.reset();
-#endif
-
-    // May destroy the |this| if it was the last reference.
-    self_ = nullptr;
-  }
-
-  // base::MessageLoop::DestructionObserver:
-  void WillDestroyCurrentMessageLoop() override {
-    DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-    if (self_)
-      ShutDownOnIOThread();
-  }
-
-  // base::MessageLoopForIO::Watcher:
-  void OnFileCanReadWithoutBlocking(int fd) override {
-    CHECK_EQ(fd, handle_.get().handle);
-    if (handle_.get().needs_connection) {
-#if !defined(OS_NACL)
-      read_watcher_.reset();
-      base::MessageLoop::current()->RemoveDestructionObserver(this);
-
-      ScopedPlatformHandle accept_fd;
-      ServerAcceptConnection(handle_.get(), &accept_fd);
-      if (!accept_fd.is_valid()) {
-        OnError();
-        return;
-      }
-      handle_ = std::move(accept_fd);
-      StartOnIOThread();
-#else
-      NOTREACHED();
-#endif
-      return;
-    }
-
-    bool read_error = false;
-    size_t next_read_size = 0;
-    size_t buffer_capacity = 0;
-    size_t total_bytes_read = 0;
-    size_t bytes_read = 0;
-    do {
-      buffer_capacity = next_read_size;
-      char* buffer = GetReadBuffer(&buffer_capacity);
-      DCHECK_GT(buffer_capacity, 0u);
-
-      ssize_t read_result = PlatformChannelRecvmsg(
-          handle_.get(),
-          buffer,
-          buffer_capacity,
-          &incoming_platform_handles_);
-
-      if (read_result > 0) {
-        bytes_read = static_cast<size_t>(read_result);
-        total_bytes_read += bytes_read;
-        if (!OnReadComplete(bytes_read, &next_read_size)) {
-          read_error = true;
-          break;
-        }
-      } else if (read_result == 0 ||
-                 (errno != EAGAIN && errno != EWOULDBLOCK)) {
-        read_error = true;
-        break;
-      }
-    } while (bytes_read == buffer_capacity &&
-             total_bytes_read < kMaxBatchReadCapacity &&
-             next_read_size > 0);
-    if (read_error) {
-      // Stop receiving read notifications.
-      read_watcher_.reset();
-
-      OnError();
-    }
-  }
-
-  void OnFileCanWriteWithoutBlocking(int fd) override {
-    bool write_error = false;
-    {
-      base::AutoLock lock(write_lock_);
-      pending_write_ = false;
-      if (!FlushOutgoingMessagesNoLock())
-        reject_writes_ = write_error = true;
-    }
-    if (write_error)
-      OnError();
-  }
-
-  // Attempts to write a message directly to the channel. If the full message
-  // cannot be written, it's queued and a wait is initiated to write the message
-  // ASAP on the I/O thread.
-  bool WriteNoLock(MessageView message_view) {
-    if (handle_.get().needs_connection) {
-      outgoing_messages_.emplace_front(std::move(message_view));
-      return true;
-    }
-    size_t bytes_written = 0;
-    do {
-      message_view.advance_data_offset(bytes_written);
-
-      ssize_t result;
-      ScopedPlatformHandleVectorPtr handles = message_view.TakeHandles();
-      if (handles && handles->size()) {
-        iovec iov = {
-          const_cast<void*>(message_view.data()),
-          message_view.data_num_bytes()
-        };
-        // TODO: Handle lots of handles.
-        result = PlatformChannelSendmsgWithHandles(
-            handle_.get(), &iov, 1, handles->data(), handles->size());
-        if (result >= 0) {
-#if defined(OS_MACOSX)
-          // There is a bug on OSX which makes it dangerous to close
-          // a file descriptor while it is in transit. So instead we
-          // store the file descriptor in a set and send a message to
-          // the recipient, which is queued AFTER the message that
-          // sent the FD. The recipient will reply to the message,
-          // letting us know that it is now safe to close the file
-          // descriptor. For more information, see:
-          // http://crbug.com/298276
-          std::vector<int> fds;
-          for (auto& handle : *handles)
-            fds.push_back(handle.handle);
-          {
-            base::AutoLock l(handles_to_close_lock_);
-            for (auto& handle : *handles)
-              handles_to_close_->push_back(handle);
-          }
-          MessagePtr fds_message(
-              new Channel::Message(sizeof(fds[0]) * fds.size(), 0,
-                                   Message::MessageType::HANDLES_SENT));
-          memcpy(fds_message->mutable_payload(), fds.data(),
-                 sizeof(fds[0]) * fds.size());
-          outgoing_messages_.emplace_back(std::move(fds_message), 0);
-          handles->clear();
-#else
-          handles.reset();
-#endif  // defined(OS_MACOSX)
-        }
-      } else {
-        result = PlatformChannelWrite(handle_.get(), message_view.data(),
-                                      message_view.data_num_bytes());
-      }
-
-      if (result < 0) {
-        if (errno != EAGAIN && errno != EWOULDBLOCK
-#if defined(OS_MACOSX)
-            // On OS X if sendmsg() is trying to send fds between processes and
-            // there isn't enough room in the output buffer to send the fd
-            // structure over atomically then EMSGSIZE is returned.
-            //
-            // EMSGSIZE presents a problem since the system APIs can only call
-            // us when there's room in the socket buffer and not when there is
-            // "enough" room.
-            //
-            // The current behavior is to return to the event loop when EMSGSIZE
-            // is received and hopefull service another FD.  This is however
-            // still technically a busy wait since the event loop will call us
-            // right back until the receiver has read enough data to allow
-            // passing the FD over atomically.
-            && errno != EMSGSIZE
-#endif
-            ) {
-          return false;
-        }
-        message_view.SetHandles(std::move(handles));
-        outgoing_messages_.emplace_front(std::move(message_view));
-        WaitForWriteOnIOThreadNoLock();
-        return true;
-      }
-
-      bytes_written = static_cast<size_t>(result);
-    } while (bytes_written < message_view.data_num_bytes());
-
-    return FlushOutgoingMessagesNoLock();
-  }
-
-  bool FlushOutgoingMessagesNoLock() {
-    std::deque<MessageView> messages;
-    std::swap(outgoing_messages_, messages);
-
-    while (!messages.empty()) {
-      if (!WriteNoLock(std::move(messages.front())))
-        return false;
-
-      messages.pop_front();
-      if (!outgoing_messages_.empty()) {
-        // The message was requeued by WriteNoLock(), so we have to wait for
-        // pipe to become writable again. Repopulate the message queue and exit.
-        // If sending the message triggered any control messages, they may be
-        // in |outgoing_messages_| in addition to or instead of the message
-        // being sent.
-        std::swap(messages, outgoing_messages_);
-        while (!messages.empty()) {
-          outgoing_messages_.push_front(std::move(messages.back()));
-          messages.pop_back();
-        }
-        return true;
-      }
-    }
-
-    return true;
-  }
-
-#if defined(OS_MACOSX)
-  bool OnControlMessage(Message::MessageType message_type,
-                        const void* payload,
-                        size_t payload_size,
-                        ScopedPlatformHandleVectorPtr handles) override {
-    switch (message_type) {
-      case Message::MessageType::HANDLES_SENT: {
-        if (payload_size == 0)
-          break;
-        MessagePtr message(new Channel::Message(
-            payload_size, 0, Message::MessageType::HANDLES_SENT_ACK));
-        memcpy(message->mutable_payload(), payload, payload_size);
-        Write(std::move(message));
-        return true;
-      }
-
-      case Message::MessageType::HANDLES_SENT_ACK: {
-        size_t num_fds = payload_size / sizeof(int);
-        if (num_fds == 0 || payload_size % sizeof(int) != 0)
-          break;
-
-        const int* fds = reinterpret_cast<const int*>(payload);
-        if (!CloseHandles(fds, num_fds))
-          break;
-        return true;
-      }
-
-      default:
-        break;
-    }
-
-    return false;
-  }
-
-  // Closes handles referenced by |fds|. Returns false if |num_fds| is 0, or if
-  // |fds| does not match a sequence of handles in |handles_to_close_|.
-  bool CloseHandles(const int* fds, size_t num_fds) {
-    base::AutoLock l(handles_to_close_lock_);
-    if (!num_fds)
-      return false;
-
-    auto start =
-        std::find_if(handles_to_close_->begin(), handles_to_close_->end(),
-                     [&fds](const PlatformHandle& handle) {
-                       return handle.handle == fds[0];
-                     });
-    if (start == handles_to_close_->end())
-      return false;
-
-    auto it = start;
-    size_t i = 0;
-    // The FDs in the message should match a sequence of handles in
-    // |handles_to_close_|.
-    for (; i < num_fds && it != handles_to_close_->end(); i++, ++it) {
-      if (it->handle != fds[i])
-        return false;
-
-      it->CloseIfNecessary();
-    }
-    if (i != num_fds)
-      return false;
-
-    handles_to_close_->erase(start, it);
-    return true;
-  }
-#endif  // defined(OS_MACOSX)
-
-  // Keeps the Channel alive at least until explicit shutdown on the IO thread.
-  scoped_refptr<Channel> self_;
-
-  ScopedPlatformHandle handle_;
-  scoped_refptr<base::TaskRunner> io_task_runner_;
-
-  // These watchers must only be accessed on the IO thread.
-  std::unique_ptr<base::MessageLoopForIO::FileDescriptorWatcher> read_watcher_;
-  std::unique_ptr<base::MessageLoopForIO::FileDescriptorWatcher> write_watcher_;
-
-  std::deque<PlatformHandle> incoming_platform_handles_;
-
-  // Protects |pending_write_| and |outgoing_messages_|.
-  base::Lock write_lock_;
-  bool pending_write_ = false;
-  bool reject_writes_ = false;
-  std::deque<MessageView> outgoing_messages_;
-
-  bool leak_handle_ = false;
-
-#if defined(OS_MACOSX)
-  base::Lock handles_to_close_lock_;
-  ScopedPlatformHandleVectorPtr handles_to_close_;
-#endif
-
-  DISALLOW_COPY_AND_ASSIGN(ChannelPosix);
-};
-
-}  // namespace
-
-// static
-scoped_refptr<Channel> Channel::Create(
-    Delegate* delegate,
-    ConnectionParams connection_params,
-    scoped_refptr<base::TaskRunner> io_task_runner) {
-  return new ChannelPosix(delegate, std::move(connection_params),
-                          io_task_runner);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/channel_unittest.cc b/mojo/edk/system/channel_unittest.cc
deleted file mode 100644
index ce2c804..0000000
--- a/mojo/edk/system/channel_unittest.cc
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/channel.h"
-#include "base/memory/ptr_util.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-class TestChannel : public Channel {
- public:
-  TestChannel(Channel::Delegate* delegate) : Channel(delegate) {}
-
-  char* GetReadBufferTest(size_t* buffer_capacity) {
-    return GetReadBuffer(buffer_capacity);
-  }
-
-  bool OnReadCompleteTest(size_t bytes_read, size_t* next_read_size_hint) {
-    return OnReadComplete(bytes_read, next_read_size_hint);
-  }
-
-  MOCK_METHOD4(GetReadPlatformHandles,
-               bool(size_t num_handles,
-                    const void* extra_header,
-                    size_t extra_header_size,
-                    ScopedPlatformHandleVectorPtr* handles));
-  MOCK_METHOD0(Start, void());
-  MOCK_METHOD0(ShutDownImpl, void());
-  MOCK_METHOD0(LeakHandle, void());
-
-  void Write(MessagePtr message) {}
-
- protected:
-  ~TestChannel() override {}
-};
-
-// Not using GMock as I don't think it supports movable types.
-class MockChannelDelegate : public Channel::Delegate {
- public:
-  MockChannelDelegate() {}
-
-  size_t GetReceivedPayloadSize() const { return payload_size_; }
-
-  const void* GetReceivedPayload() const { return payload_.get(); }
-
- protected:
-  void OnChannelMessage(const void* payload,
-                        size_t payload_size,
-                        ScopedPlatformHandleVectorPtr handles) override {
-    payload_.reset(new char[payload_size]);
-    memcpy(payload_.get(), payload, payload_size);
-    payload_size_ = payload_size;
-  }
-
-  // Notify that an error has occured and the Channel will cease operation.
-  void OnChannelError() override {}
-
- private:
-  size_t payload_size_ = 0;
-  std::unique_ptr<char[]> payload_;
-};
-
-Channel::MessagePtr CreateDefaultMessage(bool legacy_message) {
-  const size_t payload_size = 100;
-  Channel::MessagePtr message = base::MakeUnique<Channel::Message>(
-      payload_size, 0,
-      legacy_message ? Channel::Message::MessageType::NORMAL_LEGACY
-                     : Channel::Message::MessageType::NORMAL);
-  char* payload = static_cast<char*>(message->mutable_payload());
-  for (size_t i = 0; i < payload_size; i++) {
-    payload[i] = static_cast<char>(i);
-  }
-  return message;
-}
-
-void TestMemoryEqual(const void* data1,
-                     size_t data1_size,
-                     const void* data2,
-                     size_t data2_size) {
-  ASSERT_EQ(data1_size, data2_size);
-  const unsigned char* data1_char = static_cast<const unsigned char*>(data1);
-  const unsigned char* data2_char = static_cast<const unsigned char*>(data2);
-  for (size_t i = 0; i < data1_size; i++) {
-    // ASSERT so we don't log tons of errors if the data is different.
-    ASSERT_EQ(data1_char[i], data2_char[i]);
-  }
-}
-
-void TestMessagesAreEqual(Channel::Message* message1,
-                          Channel::Message* message2,
-                          bool legacy_messages) {
-  // If any of the message is null, this is probably not what you wanted to
-  // test.
-  ASSERT_NE(nullptr, message1);
-  ASSERT_NE(nullptr, message2);
-
-  ASSERT_EQ(message1->payload_size(), message2->payload_size());
-  EXPECT_EQ(message1->has_handles(), message2->has_handles());
-
-  TestMemoryEqual(message1->payload(), message1->payload_size(),
-                  message2->payload(), message2->payload_size());
-
-  if (legacy_messages)
-    return;
-
-  ASSERT_EQ(message1->extra_header_size(), message2->extra_header_size());
-  TestMemoryEqual(message1->extra_header(), message1->extra_header_size(),
-                  message2->extra_header(), message2->extra_header_size());
-}
-
-TEST(ChannelTest, LegacyMessageDeserialization) {
-  Channel::MessagePtr message = CreateDefaultMessage(true /* legacy_message */);
-  Channel::MessagePtr deserialized_message =
-      Channel::Message::Deserialize(message->data(), message->data_num_bytes());
-  TestMessagesAreEqual(message.get(), deserialized_message.get(),
-                       true /* legacy_message */);
-}
-
-TEST(ChannelTest, NonLegacyMessageDeserialization) {
-  Channel::MessagePtr message =
-      CreateDefaultMessage(false /* legacy_message */);
-  Channel::MessagePtr deserialized_message =
-      Channel::Message::Deserialize(message->data(), message->data_num_bytes());
-  TestMessagesAreEqual(message.get(), deserialized_message.get(),
-                       false /* legacy_message */);
-}
-
-TEST(ChannelTest, OnReadLegacyMessage) {
-  size_t buffer_size = 100 * 1024;
-  Channel::MessagePtr message = CreateDefaultMessage(true /* legacy_message */);
-
-  MockChannelDelegate channel_delegate;
-  scoped_refptr<TestChannel> channel = new TestChannel(&channel_delegate);
-  char* read_buffer = channel->GetReadBufferTest(&buffer_size);
-  ASSERT_LT(message->data_num_bytes(),
-            buffer_size);  // Bad test. Increase buffer
-                           // size.
-  memcpy(read_buffer, message->data(), message->data_num_bytes());
-
-  size_t next_read_size_hint = 0;
-  EXPECT_TRUE(channel->OnReadCompleteTest(message->data_num_bytes(),
-                                          &next_read_size_hint));
-
-  TestMemoryEqual(message->payload(), message->payload_size(),
-                  channel_delegate.GetReceivedPayload(),
-                  channel_delegate.GetReceivedPayloadSize());
-}
-
-TEST(ChannelTest, OnReadNonLegacyMessage) {
-  size_t buffer_size = 100 * 1024;
-  Channel::MessagePtr message =
-      CreateDefaultMessage(false /* legacy_message */);
-
-  MockChannelDelegate channel_delegate;
-  scoped_refptr<TestChannel> channel = new TestChannel(&channel_delegate);
-  char* read_buffer = channel->GetReadBufferTest(&buffer_size);
-  ASSERT_LT(message->data_num_bytes(),
-            buffer_size);  // Bad test. Increase buffer
-                           // size.
-  memcpy(read_buffer, message->data(), message->data_num_bytes());
-
-  size_t next_read_size_hint = 0;
-  EXPECT_TRUE(channel->OnReadCompleteTest(message->data_num_bytes(),
-                                          &next_read_size_hint));
-
-  TestMemoryEqual(message->payload(), message->payload_size(),
-                  channel_delegate.GetReceivedPayload(),
-                  channel_delegate.GetReceivedPayloadSize());
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/channel_win.cc b/mojo/edk/system/channel_win.cc
deleted file mode 100644
index c15df16..0000000
--- a/mojo/edk/system/channel_win.cc
+++ /dev/null
@@ -1,360 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/channel.h"
-
-#include <stdint.h>
-#include <windows.h>
-
-#include <algorithm>
-#include <deque>
-#include <limits>
-#include <memory>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/synchronization/lock.h"
-#include "base/task_runner.h"
-#include "base/win/win_util.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-// A view over a Channel::Message object. The write queue uses these since
-// large messages may need to be sent in chunks.
-class MessageView {
- public:
-  // Owns |message|. |offset| indexes the first unsent byte in the message.
-  MessageView(Channel::MessagePtr message, size_t offset)
-      : message_(std::move(message)),
-        offset_(offset) {
-    DCHECK_GT(message_->data_num_bytes(), offset_);
-  }
-
-  MessageView(MessageView&& other) { *this = std::move(other); }
-
-  MessageView& operator=(MessageView&& other) {
-    message_ = std::move(other.message_);
-    offset_ = other.offset_;
-    return *this;
-  }
-
-  ~MessageView() {}
-
-  const void* data() const {
-    return static_cast<const char*>(message_->data()) + offset_;
-  }
-
-  size_t data_num_bytes() const { return message_->data_num_bytes() - offset_; }
-
-  size_t data_offset() const { return offset_; }
-  void advance_data_offset(size_t num_bytes) {
-    DCHECK_GE(message_->data_num_bytes(), offset_ + num_bytes);
-    offset_ += num_bytes;
-  }
-
-  Channel::MessagePtr TakeChannelMessage() { return std::move(message_); }
-
- private:
-  Channel::MessagePtr message_;
-  size_t offset_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageView);
-};
-
-class ChannelWin : public Channel,
-                   public base::MessageLoop::DestructionObserver,
-                   public base::MessageLoopForIO::IOHandler {
- public:
-  ChannelWin(Delegate* delegate,
-             ScopedPlatformHandle handle,
-             scoped_refptr<base::TaskRunner> io_task_runner)
-      : Channel(delegate),
-        self_(this),
-        handle_(std::move(handle)),
-        io_task_runner_(io_task_runner) {
-    CHECK(handle_.is_valid());
-
-    wait_for_connect_ = handle_.get().needs_connection;
-  }
-
-  void Start() override {
-    io_task_runner_->PostTask(
-        FROM_HERE, base::Bind(&ChannelWin::StartOnIOThread, this));
-  }
-
-  void ShutDownImpl() override {
-    // Always shut down asynchronously when called through the public interface.
-    io_task_runner_->PostTask(
-        FROM_HERE, base::Bind(&ChannelWin::ShutDownOnIOThread, this));
-  }
-
-  void Write(MessagePtr message) override {
-    bool write_error = false;
-    {
-      base::AutoLock lock(write_lock_);
-      if (reject_writes_)
-        return;
-
-      bool write_now = !delay_writes_ && outgoing_messages_.empty();
-      outgoing_messages_.emplace_back(std::move(message), 0);
-
-      if (write_now && !WriteNoLock(outgoing_messages_.front()))
-        reject_writes_ = write_error = true;
-    }
-    if (write_error) {
-      // Do not synchronously invoke OnError(). Write() may have been called by
-      // the delegate and we don't want to re-enter it.
-      io_task_runner_->PostTask(FROM_HERE,
-                                base::Bind(&ChannelWin::OnError, this));
-    }
-  }
-
-  void LeakHandle() override {
-    DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-    leak_handle_ = true;
-  }
-
-  bool GetReadPlatformHandles(
-      size_t num_handles,
-      const void* extra_header,
-      size_t extra_header_size,
-      ScopedPlatformHandleVectorPtr* handles) override {
-    if (num_handles > std::numeric_limits<uint16_t>::max())
-      return false;
-    using HandleEntry = Channel::Message::HandleEntry;
-    size_t handles_size = sizeof(HandleEntry) * num_handles;
-    if (handles_size > extra_header_size)
-      return false;
-    DCHECK(extra_header);
-    handles->reset(new PlatformHandleVector(num_handles));
-    const HandleEntry* extra_header_handles =
-        reinterpret_cast<const HandleEntry*>(extra_header);
-    for (size_t i = 0; i < num_handles; i++) {
-      (*handles)->at(i).handle =
-          base::win::Uint32ToHandle(extra_header_handles[i].handle);
-    }
-    return true;
-  }
-
- private:
-  // May run on any thread.
-  ~ChannelWin() override {}
-
-  void StartOnIOThread() {
-    base::MessageLoop::current()->AddDestructionObserver(this);
-    base::MessageLoopForIO::current()->RegisterIOHandler(
-        handle_.get().handle, this);
-
-    if (wait_for_connect_) {
-      BOOL ok = ConnectNamedPipe(handle_.get().handle,
-                                 &connect_context_.overlapped);
-      if (ok) {
-        PLOG(ERROR) << "Unexpected success while waiting for pipe connection";
-        OnError();
-        return;
-      }
-
-      const DWORD err = GetLastError();
-      switch (err) {
-        case ERROR_PIPE_CONNECTED:
-          wait_for_connect_ = false;
-          break;
-        case ERROR_IO_PENDING:
-          AddRef();
-          return;
-        case ERROR_NO_DATA:
-          OnError();
-          return;
-      }
-    }
-
-    // Now that we have registered our IOHandler, we can start writing.
-    {
-      base::AutoLock lock(write_lock_);
-      if (delay_writes_) {
-        delay_writes_ = false;
-        WriteNextNoLock();
-      }
-    }
-
-    // Keep this alive in case we synchronously run shutdown.
-    scoped_refptr<ChannelWin> keep_alive(this);
-    ReadMore(0);
-  }
-
-  void ShutDownOnIOThread() {
-    base::MessageLoop::current()->RemoveDestructionObserver(this);
-
-    // BUG(crbug.com/583525): This function is expected to be called once, and
-    // |handle_| should be valid at this point.
-    CHECK(handle_.is_valid());
-    CancelIo(handle_.get().handle);
-    if (leak_handle_)
-      ignore_result(handle_.release());
-    handle_.reset();
-
-    // May destroy the |this| if it was the last reference.
-    self_ = nullptr;
-  }
-
-  // base::MessageLoop::DestructionObserver:
-  void WillDestroyCurrentMessageLoop() override {
-    DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-    if (self_)
-      ShutDownOnIOThread();
-  }
-
-  // base::MessageLoop::IOHandler:
-  void OnIOCompleted(base::MessageLoopForIO::IOContext* context,
-                     DWORD bytes_transfered,
-                     DWORD error) override {
-    if (error != ERROR_SUCCESS) {
-      OnError();
-    } else if (context == &connect_context_) {
-      DCHECK(wait_for_connect_);
-      wait_for_connect_ = false;
-      ReadMore(0);
-
-      base::AutoLock lock(write_lock_);
-      if (delay_writes_) {
-        delay_writes_ = false;
-        WriteNextNoLock();
-      }
-    } else if (context == &read_context_) {
-      OnReadDone(static_cast<size_t>(bytes_transfered));
-    } else {
-      CHECK(context == &write_context_);
-      OnWriteDone(static_cast<size_t>(bytes_transfered));
-    }
-    Release();  // Balancing reference taken after ReadFile / WriteFile.
-  }
-
-  void OnReadDone(size_t bytes_read) {
-    if (bytes_read > 0) {
-      size_t next_read_size = 0;
-      if (OnReadComplete(bytes_read, &next_read_size)) {
-        ReadMore(next_read_size);
-      } else {
-        OnError();
-      }
-    } else if (bytes_read == 0) {
-      OnError();
-    }
-  }
-
-  void OnWriteDone(size_t bytes_written) {
-    if (bytes_written == 0)
-      return;
-
-    bool write_error = false;
-    {
-      base::AutoLock lock(write_lock_);
-
-      DCHECK(!outgoing_messages_.empty());
-
-      MessageView& message_view = outgoing_messages_.front();
-      message_view.advance_data_offset(bytes_written);
-      if (message_view.data_num_bytes() == 0) {
-        Channel::MessagePtr message = message_view.TakeChannelMessage();
-        outgoing_messages_.pop_front();
-
-        // Clear any handles so they don't get closed on destruction.
-        ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-        if (handles)
-          handles->clear();
-      }
-
-      if (!WriteNextNoLock())
-        reject_writes_ = write_error = true;
-    }
-    if (write_error)
-      OnError();
-  }
-
-  void ReadMore(size_t next_read_size_hint) {
-    size_t buffer_capacity = next_read_size_hint;
-    char* buffer = GetReadBuffer(&buffer_capacity);
-    DCHECK_GT(buffer_capacity, 0u);
-
-    BOOL ok = ReadFile(handle_.get().handle,
-                       buffer,
-                       static_cast<DWORD>(buffer_capacity),
-                       NULL,
-                       &read_context_.overlapped);
-
-    if (ok || GetLastError() == ERROR_IO_PENDING) {
-      AddRef();  // Will be balanced in OnIOCompleted
-    } else {
-      OnError();
-    }
-  }
-
-  // Attempts to write a message directly to the channel. If the full message
-  // cannot be written, it's queued and a wait is initiated to write the message
-  // ASAP on the I/O thread.
-  bool WriteNoLock(const MessageView& message_view) {
-    BOOL ok = WriteFile(handle_.get().handle,
-                        message_view.data(),
-                        static_cast<DWORD>(message_view.data_num_bytes()),
-                        NULL,
-                        &write_context_.overlapped);
-
-    if (ok || GetLastError() == ERROR_IO_PENDING) {
-      AddRef();  // Will be balanced in OnIOCompleted.
-      return true;
-    }
-    return false;
-  }
-
-  bool WriteNextNoLock() {
-    if (outgoing_messages_.empty())
-      return true;
-    return WriteNoLock(outgoing_messages_.front());
-  }
-
-  // Keeps the Channel alive at least until explicit shutdown on the IO thread.
-  scoped_refptr<Channel> self_;
-
-  ScopedPlatformHandle handle_;
-  scoped_refptr<base::TaskRunner> io_task_runner_;
-
-  base::MessageLoopForIO::IOContext connect_context_;
-  base::MessageLoopForIO::IOContext read_context_;
-  base::MessageLoopForIO::IOContext write_context_;
-
-  // Protects |reject_writes_| and |outgoing_messages_|.
-  base::Lock write_lock_;
-
-  bool delay_writes_ = true;
-
-  bool reject_writes_ = false;
-  std::deque<MessageView> outgoing_messages_;
-
-  bool wait_for_connect_;
-
-  bool leak_handle_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(ChannelWin);
-};
-
-}  // namespace
-
-// static
-scoped_refptr<Channel> Channel::Create(
-    Delegate* delegate,
-    ConnectionParams connection_params,
-    scoped_refptr<base::TaskRunner> io_task_runner) {
-  return new ChannelWin(delegate, connection_params.TakeChannelHandle(),
-                        io_task_runner);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/configuration.cc b/mojo/edk/system/configuration.cc
deleted file mode 100644
index f5eb2b8..0000000
--- a/mojo/edk/system/configuration.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/configuration.h"
-
-namespace mojo {
-namespace edk {
-namespace internal {
-
-// These default values should be synced with the documentation in
-// mojo/edk/embedder/configuration.h.
-Configuration g_configuration = {
-    1000000,              // max_handle_table_size
-    1000000,              // max_mapping_table_sze
-    4 * 1024 * 1024,      // max_message_num_bytes
-    10000,                // max_message_num_handles
-    256 * 1024 * 1024,    // max_data_pipe_capacity_bytes
-    1024 * 1024,          // default_data_pipe_capacity_bytes
-    16,                   // data_pipe_buffer_alignment_bytes
-    1024 * 1024 * 1024};  // max_shared_memory_num_bytes
-
-}  // namespace internal
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/configuration.h b/mojo/edk/system/configuration.h
deleted file mode 100644
index 038835f..0000000
--- a/mojo/edk/system/configuration.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_CONFIGURATION_H_
-#define MOJO_EDK_SYSTEM_CONFIGURATION_H_
-
-#include "mojo/edk/embedder/configuration.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-namespace internal {
-MOJO_SYSTEM_IMPL_EXPORT extern Configuration g_configuration;
-}  // namespace internal
-
-MOJO_SYSTEM_IMPL_EXPORT inline const Configuration& GetConfiguration() {
-  return internal::g_configuration;
-}
-
-MOJO_SYSTEM_IMPL_EXPORT inline Configuration* GetMutableConfiguration() {
-  return &internal::g_configuration;
-}
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_CONFIGURATION_H_
diff --git a/mojo/edk/system/core.cc b/mojo/edk/system/core.cc
deleted file mode 100644
index 360e8c3..0000000
--- a/mojo/edk/system/core.cc
+++ /dev/null
@@ -1,1019 +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.
-
-#include "mojo/edk/system/core.h"
-
-#include <string.h>
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/containers/stack_container.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/rand_util.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/data_pipe_consumer_dispatcher.h"
-#include "mojo/edk/system/data_pipe_producer_dispatcher.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/message_for_transit.h"
-#include "mojo/edk/system/message_pipe_dispatcher.h"
-#include "mojo/edk/system/platform_handle_dispatcher.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/node.h"
-#include "mojo/edk/system/request_context.h"
-#include "mojo/edk/system/shared_buffer_dispatcher.h"
-#include "mojo/edk/system/watcher_dispatcher.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-// This is an unnecessarily large limit that is relatively easy to enforce.
-const uint32_t kMaxHandlesPerMessage = 1024 * 1024;
-
-// TODO(rockot): Maybe we could negotiate a debugging pipe ID for cross-process
-// pipes too; for now we just use a constant. This only affects bootstrap pipes.
-const uint64_t kUnknownPipeIdForDebug = 0x7f7f7f7f7f7f7f7fUL;
-
-MojoResult MojoPlatformHandleToScopedPlatformHandle(
-    const MojoPlatformHandle* platform_handle,
-    ScopedPlatformHandle* out_handle) {
-  if (platform_handle->struct_size != sizeof(MojoPlatformHandle))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (platform_handle->type == MOJO_PLATFORM_HANDLE_TYPE_INVALID) {
-    out_handle->reset();
-    return MOJO_RESULT_OK;
-  }
-
-  PlatformHandle handle;
-  switch (platform_handle->type) {
-#if defined(OS_POSIX)
-    case MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR:
-      handle.handle = static_cast<int>(platform_handle->value);
-      break;
-#endif
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    case MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT:
-      handle.type = PlatformHandle::Type::MACH;
-      handle.port = static_cast<mach_port_t>(platform_handle->value);
-      break;
-#endif
-
-#if defined(OS_WIN)
-    case MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE:
-      handle.handle = reinterpret_cast<HANDLE>(platform_handle->value);
-      break;
-#endif
-
-    default:
-      return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-
-  out_handle->reset(handle);
-  return MOJO_RESULT_OK;
-}
-
-MojoResult ScopedPlatformHandleToMojoPlatformHandle(
-    ScopedPlatformHandle handle,
-    MojoPlatformHandle* platform_handle) {
-  if (platform_handle->struct_size != sizeof(MojoPlatformHandle))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (!handle.is_valid()) {
-    platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_INVALID;
-    return MOJO_RESULT_OK;
-  }
-
-#if defined(OS_POSIX)
-  switch (handle.get().type) {
-    case PlatformHandle::Type::POSIX:
-      platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
-      platform_handle->value = static_cast<uint64_t>(handle.release().handle);
-      break;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    case PlatformHandle::Type::MACH:
-      platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT;
-      platform_handle->value = static_cast<uint64_t>(handle.release().port);
-      break;
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-    default:
-      return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-#elif defined(OS_WIN)
-  platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE;
-  platform_handle->value = reinterpret_cast<uint64_t>(handle.release().handle);
-#endif  // defined(OS_WIN)
-
-  return MOJO_RESULT_OK;
-}
-
-}  // namespace
-
-Core::Core() {}
-
-Core::~Core() {
-  if (node_controller_ && node_controller_->io_task_runner()) {
-    // If this races with IO thread shutdown the callback will be dropped and
-    // the NodeController will be shutdown on this thread anyway, which is also
-    // just fine.
-    scoped_refptr<base::TaskRunner> io_task_runner =
-        node_controller_->io_task_runner();
-    io_task_runner->PostTask(FROM_HERE,
-                             base::Bind(&Core::PassNodeControllerToIOThread,
-                                        base::Passed(&node_controller_)));
-  }
-}
-
-void Core::SetIOTaskRunner(scoped_refptr<base::TaskRunner> io_task_runner) {
-  GetNodeController()->SetIOTaskRunner(io_task_runner);
-}
-
-NodeController* Core::GetNodeController() {
-  base::AutoLock lock(node_controller_lock_);
-  if (!node_controller_)
-    node_controller_.reset(new NodeController(this));
-  return node_controller_.get();
-}
-
-scoped_refptr<Dispatcher> Core::GetDispatcher(MojoHandle handle) {
-  base::AutoLock lock(handles_lock_);
-  return handles_.GetDispatcher(handle);
-}
-
-void Core::SetDefaultProcessErrorCallback(
-    const ProcessErrorCallback& callback) {
-  default_process_error_callback_ = callback;
-}
-
-void Core::AddChild(base::ProcessHandle process_handle,
-                    ConnectionParams connection_params,
-                    const std::string& child_token,
-                    const ProcessErrorCallback& process_error_callback) {
-  GetNodeController()->ConnectToChild(process_handle,
-                                      std::move(connection_params), child_token,
-                                      process_error_callback);
-}
-
-void Core::ChildLaunchFailed(const std::string& child_token) {
-  RequestContext request_context;
-  GetNodeController()->CloseChildPorts(child_token);
-}
-
-ScopedMessagePipeHandle Core::ConnectToPeerProcess(
-    ScopedPlatformHandle pipe_handle,
-    const std::string& peer_token) {
-  RequestContext request_context;
-  ports::PortRef port0, port1;
-  GetNodeController()->node()->CreatePortPair(&port0, &port1);
-  MojoHandle handle = AddDispatcher(new MessagePipeDispatcher(
-      GetNodeController(), port0, kUnknownPipeIdForDebug, 0));
-  ConnectionParams connection_params(std::move(pipe_handle));
-  GetNodeController()->ConnectToPeer(std::move(connection_params), port1,
-                                     peer_token);
-  return ScopedMessagePipeHandle(MessagePipeHandle(handle));
-}
-
-void Core::ClosePeerConnection(const std::string& peer_token) {
-  GetNodeController()->ClosePeerConnection(peer_token);
-}
-
-void Core::InitChild(ConnectionParams connection_params) {
-  GetNodeController()->ConnectToParent(std::move(connection_params));
-}
-
-void Core::SetMachPortProvider(base::PortProvider* port_provider) {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  GetNodeController()->CreateMachPortRelay(port_provider);
-#endif
-}
-
-MojoHandle Core::AddDispatcher(scoped_refptr<Dispatcher> dispatcher) {
-  base::AutoLock lock(handles_lock_);
-  return handles_.AddDispatcher(dispatcher);
-}
-
-bool Core::AddDispatchersFromTransit(
-    const std::vector<Dispatcher::DispatcherInTransit>& dispatchers,
-    MojoHandle* handles) {
-  bool failed = false;
-  {
-    base::AutoLock lock(handles_lock_);
-    if (!handles_.AddDispatchersFromTransit(dispatchers, handles))
-      failed = true;
-  }
-  if (failed) {
-    for (auto d : dispatchers)
-      d.dispatcher->Close();
-    return false;
-  }
-  return true;
-}
-
-MojoResult Core::CreatePlatformHandleWrapper(
-    ScopedPlatformHandle platform_handle,
-    MojoHandle* wrapper_handle) {
-  MojoHandle h = AddDispatcher(
-      PlatformHandleDispatcher::Create(std::move(platform_handle)));
-  if (h == MOJO_HANDLE_INVALID)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  *wrapper_handle = h;
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::PassWrappedPlatformHandle(
-    MojoHandle wrapper_handle,
-    ScopedPlatformHandle* platform_handle) {
-  base::AutoLock lock(handles_lock_);
-  scoped_refptr<Dispatcher> d;
-  MojoResult result = handles_.GetAndRemoveDispatcher(wrapper_handle, &d);
-  if (result != MOJO_RESULT_OK)
-    return result;
-  if (d->GetType() == Dispatcher::Type::PLATFORM_HANDLE) {
-    PlatformHandleDispatcher* phd =
-        static_cast<PlatformHandleDispatcher*>(d.get());
-    *platform_handle = phd->PassPlatformHandle();
-  } else {
-    result = MOJO_RESULT_INVALID_ARGUMENT;
-  }
-  d->Close();
-  return result;
-}
-
-MojoResult Core::CreateSharedBufferWrapper(
-    base::SharedMemoryHandle shared_memory_handle,
-    size_t num_bytes,
-    bool read_only,
-    MojoHandle* mojo_wrapper_handle) {
-  DCHECK(num_bytes);
-  scoped_refptr<PlatformSharedBuffer> platform_buffer =
-      PlatformSharedBuffer::CreateFromSharedMemoryHandle(num_bytes, read_only,
-                                                         shared_memory_handle);
-  if (!platform_buffer)
-    return MOJO_RESULT_UNKNOWN;
-
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  MojoResult result = SharedBufferDispatcher::CreateFromPlatformSharedBuffer(
-      platform_buffer, &dispatcher);
-  if (result != MOJO_RESULT_OK)
-    return result;
-  MojoHandle h = AddDispatcher(dispatcher);
-  if (h == MOJO_HANDLE_INVALID)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  *mojo_wrapper_handle = h;
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::PassSharedMemoryHandle(
-    MojoHandle mojo_handle,
-    base::SharedMemoryHandle* shared_memory_handle,
-    size_t* num_bytes,
-    bool* read_only) {
-  if (!shared_memory_handle)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  scoped_refptr<Dispatcher> dispatcher;
-  MojoResult result = MOJO_RESULT_OK;
-  {
-    base::AutoLock lock(handles_lock_);
-    // Get the dispatcher and check it before removing it from the handle table
-    // to ensure that the dispatcher is of the correct type. This ensures we
-    // don't close and remove the wrong type of dispatcher.
-    dispatcher = handles_.GetDispatcher(mojo_handle);
-    if (!dispatcher || dispatcher->GetType() != Dispatcher::Type::SHARED_BUFFER)
-      return MOJO_RESULT_INVALID_ARGUMENT;
-
-    result = handles_.GetAndRemoveDispatcher(mojo_handle, &dispatcher);
-    if (result != MOJO_RESULT_OK)
-      return result;
-  }
-
-  SharedBufferDispatcher* shm_dispatcher =
-      static_cast<SharedBufferDispatcher*>(dispatcher.get());
-  scoped_refptr<PlatformSharedBuffer> platform_shared_buffer =
-      shm_dispatcher->PassPlatformSharedBuffer();
-
-  if (!platform_shared_buffer)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (num_bytes)
-    *num_bytes = platform_shared_buffer->GetNumBytes();
-  if (read_only)
-    *read_only = platform_shared_buffer->IsReadOnly();
-  *shared_memory_handle = platform_shared_buffer->DuplicateSharedMemoryHandle();
-
-  shm_dispatcher->Close();
-  return result;
-}
-
-void Core::RequestShutdown(const base::Closure& callback) {
-  GetNodeController()->RequestShutdown(callback);
-}
-
-ScopedMessagePipeHandle Core::CreateParentMessagePipe(
-    const std::string& token, const std::string& child_token) {
-  RequestContext request_context;
-  ports::PortRef port0, port1;
-  GetNodeController()->node()->CreatePortPair(&port0, &port1);
-  MojoHandle handle = AddDispatcher(
-      new MessagePipeDispatcher(GetNodeController(), port0,
-                                kUnknownPipeIdForDebug, 0));
-  GetNodeController()->ReservePort(token, port1, child_token);
-  return ScopedMessagePipeHandle(MessagePipeHandle(handle));
-}
-
-ScopedMessagePipeHandle Core::CreateChildMessagePipe(const std::string& token) {
-  RequestContext request_context;
-  ports::PortRef port0, port1;
-  GetNodeController()->node()->CreatePortPair(&port0, &port1);
-  MojoHandle handle = AddDispatcher(
-      new MessagePipeDispatcher(GetNodeController(), port0,
-                                kUnknownPipeIdForDebug, 1));
-  GetNodeController()->MergePortIntoParent(token, port1);
-  return ScopedMessagePipeHandle(MessagePipeHandle(handle));
-}
-
-MojoResult Core::SetProperty(MojoPropertyType type, const void* value) {
-  base::AutoLock locker(property_lock_);
-  switch (type) {
-    case MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED:
-      property_sync_call_allowed_ = *static_cast<const bool*>(value);
-      return MOJO_RESULT_OK;
-    default:
-      return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-}
-
-MojoTimeTicks Core::GetTimeTicksNow() {
-  return base::TimeTicks::Now().ToInternalValue();
-}
-
-MojoResult Core::Close(MojoHandle handle) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher;
-  {
-    base::AutoLock lock(handles_lock_);
-    MojoResult rv = handles_.GetAndRemoveDispatcher(handle, &dispatcher);
-    if (rv != MOJO_RESULT_OK)
-      return rv;
-  }
-  dispatcher->Close();
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::QueryHandleSignalsState(
-    MojoHandle handle,
-    MojoHandleSignalsState* signals_state) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher = GetDispatcher(handle);
-  if (!dispatcher || !signals_state)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  *signals_state = dispatcher->GetHandleSignalsState();
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::CreateWatcher(MojoWatcherCallback callback,
-                               MojoHandle* watcher_handle) {
-  RequestContext request_context;
-  if (!watcher_handle)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  *watcher_handle = AddDispatcher(new WatcherDispatcher(callback));
-  if (*watcher_handle == MOJO_HANDLE_INVALID)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::Watch(MojoHandle watcher_handle,
-                       MojoHandle handle,
-                       MojoHandleSignals signals,
-                       uintptr_t context) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> watcher = GetDispatcher(watcher_handle);
-  if (!watcher || watcher->GetType() != Dispatcher::Type::WATCHER)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  scoped_refptr<Dispatcher> dispatcher = GetDispatcher(handle);
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watcher->WatchDispatcher(dispatcher, signals, context);
-}
-
-MojoResult Core::CancelWatch(MojoHandle watcher_handle, uintptr_t context) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> watcher = GetDispatcher(watcher_handle);
-  if (!watcher || watcher->GetType() != Dispatcher::Type::WATCHER)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watcher->CancelWatch(context);
-}
-
-MojoResult Core::ArmWatcher(MojoHandle watcher_handle,
-                            uint32_t* num_ready_contexts,
-                            uintptr_t* ready_contexts,
-                            MojoResult* ready_results,
-                            MojoHandleSignalsState* ready_signals_states) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> watcher = GetDispatcher(watcher_handle);
-  if (!watcher || watcher->GetType() != Dispatcher::Type::WATCHER)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watcher->Arm(num_ready_contexts, ready_contexts, ready_results,
-                      ready_signals_states);
-}
-
-MojoResult Core::AllocMessage(uint32_t num_bytes,
-                              const MojoHandle* handles,
-                              uint32_t num_handles,
-                              MojoAllocMessageFlags flags,
-                              MojoMessageHandle* message) {
-  if (!message)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (num_handles == 0) {  // Fast path: no handles.
-    std::unique_ptr<MessageForTransit> msg;
-    MojoResult rv = MessageForTransit::Create(&msg, num_bytes, nullptr, 0);
-    if (rv != MOJO_RESULT_OK)
-      return rv;
-
-    *message = reinterpret_cast<MojoMessageHandle>(msg.release());
-    return MOJO_RESULT_OK;
-  }
-
-  if (!handles)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (num_handles > kMaxHandlesPerMessage)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  std::vector<Dispatcher::DispatcherInTransit> dispatchers;
-  {
-    base::AutoLock lock(handles_lock_);
-    MojoResult rv = handles_.BeginTransit(handles, num_handles, &dispatchers);
-    if (rv != MOJO_RESULT_OK) {
-      handles_.CancelTransit(dispatchers);
-      return rv;
-    }
-  }
-  DCHECK_EQ(num_handles, dispatchers.size());
-
-  std::unique_ptr<MessageForTransit> msg;
-  MojoResult rv = MessageForTransit::Create(
-      &msg, num_bytes, dispatchers.data(), num_handles);
-
-  {
-    base::AutoLock lock(handles_lock_);
-    if (rv == MOJO_RESULT_OK) {
-      handles_.CompleteTransitAndClose(dispatchers);
-      *message = reinterpret_cast<MojoMessageHandle>(msg.release());
-    } else {
-      handles_.CancelTransit(dispatchers);
-    }
-  }
-
-  return rv;
-}
-
-MojoResult Core::FreeMessage(MojoMessageHandle message) {
-  if (!message)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  delete reinterpret_cast<MessageForTransit*>(message);
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::GetMessageBuffer(MojoMessageHandle message, void** buffer) {
-  if (!message)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  *buffer = reinterpret_cast<MessageForTransit*>(message)->mutable_bytes();
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::GetProperty(MojoPropertyType type, void* value) {
-  base::AutoLock locker(property_lock_);
-  switch (type) {
-    case MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED:
-      *static_cast<bool*>(value) = property_sync_call_allowed_;
-      return MOJO_RESULT_OK;
-    default:
-      return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-}
-
-MojoResult Core::CreateMessagePipe(
-    const MojoCreateMessagePipeOptions* options,
-    MojoHandle* message_pipe_handle0,
-    MojoHandle* message_pipe_handle1) {
-  RequestContext request_context;
-  ports::PortRef port0, port1;
-  GetNodeController()->node()->CreatePortPair(&port0, &port1);
-
-  CHECK(message_pipe_handle0);
-  CHECK(message_pipe_handle1);
-
-  uint64_t pipe_id = base::RandUint64();
-
-  *message_pipe_handle0 = AddDispatcher(
-      new MessagePipeDispatcher(GetNodeController(), port0, pipe_id, 0));
-  if (*message_pipe_handle0 == MOJO_HANDLE_INVALID)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  *message_pipe_handle1 = AddDispatcher(
-      new MessagePipeDispatcher(GetNodeController(), port1, pipe_id, 1));
-  if (*message_pipe_handle1 == MOJO_HANDLE_INVALID) {
-    scoped_refptr<Dispatcher> unused;
-    unused->Close();
-
-    base::AutoLock lock(handles_lock_);
-    handles_.GetAndRemoveDispatcher(*message_pipe_handle0, &unused);
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::WriteMessage(MojoHandle message_pipe_handle,
-                              const void* bytes,
-                              uint32_t num_bytes,
-                              const MojoHandle* handles,
-                              uint32_t num_handles,
-                              MojoWriteMessageFlags flags) {
-  if (num_bytes && !bytes)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  MojoMessageHandle message;
-  MojoResult rv = AllocMessage(num_bytes, handles, num_handles,
-                               MOJO_ALLOC_MESSAGE_FLAG_NONE, &message);
-  if (rv != MOJO_RESULT_OK)
-    return rv;
-
-  if (num_bytes) {
-    void* buffer = nullptr;
-    rv = GetMessageBuffer(message, &buffer);
-    DCHECK_EQ(rv, MOJO_RESULT_OK);
-    memcpy(buffer, bytes, num_bytes);
-  }
-
-  return WriteMessageNew(message_pipe_handle, message, flags);
-}
-
-MojoResult Core::WriteMessageNew(MojoHandle message_pipe_handle,
-                                 MojoMessageHandle message,
-                                 MojoWriteMessageFlags flags) {
-  RequestContext request_context;
-  std::unique_ptr<MessageForTransit> message_for_transit(
-      reinterpret_cast<MessageForTransit*>(message));
-  auto dispatcher = GetDispatcher(message_pipe_handle);
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->WriteMessage(std::move(message_for_transit), flags);
-}
-
-MojoResult Core::ReadMessage(MojoHandle message_pipe_handle,
-                             void* bytes,
-                             uint32_t* num_bytes,
-                             MojoHandle* handles,
-                             uint32_t* num_handles,
-                             MojoReadMessageFlags flags) {
-  CHECK((!num_handles || !*num_handles || handles) &&
-        (!num_bytes || !*num_bytes || bytes));
-  RequestContext request_context;
-  auto dispatcher = GetDispatcher(message_pipe_handle);
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  std::unique_ptr<MessageForTransit> message;
-  MojoResult rv =
-      dispatcher->ReadMessage(&message, num_bytes, handles, num_handles, flags,
-                              false /* ignore_num_bytes */);
-  if (rv != MOJO_RESULT_OK)
-    return rv;
-
-  if (message && message->num_bytes())
-    memcpy(bytes, message->bytes(), message->num_bytes());
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::ReadMessageNew(MojoHandle message_pipe_handle,
-                                MojoMessageHandle* message,
-                                uint32_t* num_bytes,
-                                MojoHandle* handles,
-                                uint32_t* num_handles,
-                                MojoReadMessageFlags flags) {
-  CHECK(message);
-  CHECK(!num_handles || !*num_handles || handles);
-  RequestContext request_context;
-  auto dispatcher = GetDispatcher(message_pipe_handle);
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  std::unique_ptr<MessageForTransit> msg;
-  MojoResult rv =
-      dispatcher->ReadMessage(&msg, num_bytes, handles, num_handles, flags,
-                              true /* ignore_num_bytes */);
-  if (rv != MOJO_RESULT_OK)
-    return rv;
-  *message = reinterpret_cast<MojoMessageHandle>(msg.release());
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::FuseMessagePipes(MojoHandle handle0, MojoHandle handle1) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher0;
-  scoped_refptr<Dispatcher> dispatcher1;
-
-  bool valid_handles = true;
-  {
-    base::AutoLock lock(handles_lock_);
-    MojoResult result0 = handles_.GetAndRemoveDispatcher(handle0, &dispatcher0);
-    MojoResult result1 = handles_.GetAndRemoveDispatcher(handle1, &dispatcher1);
-    if (result0 != MOJO_RESULT_OK || result1 != MOJO_RESULT_OK ||
-        dispatcher0->GetType() != Dispatcher::Type::MESSAGE_PIPE ||
-        dispatcher1->GetType() != Dispatcher::Type::MESSAGE_PIPE)
-      valid_handles = false;
-  }
-
-  if (!valid_handles) {
-    if (dispatcher0)
-      dispatcher0->Close();
-    if (dispatcher1)
-      dispatcher1->Close();
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-
-  MessagePipeDispatcher* mpd0 =
-      static_cast<MessagePipeDispatcher*>(dispatcher0.get());
-  MessagePipeDispatcher* mpd1 =
-      static_cast<MessagePipeDispatcher*>(dispatcher1.get());
-
-  if (!mpd0->Fuse(mpd1))
-    return MOJO_RESULT_FAILED_PRECONDITION;
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::NotifyBadMessage(MojoMessageHandle message,
-                                  const char* error,
-                                  size_t error_num_bytes) {
-  if (!message)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  const PortsMessage& ports_message =
-      reinterpret_cast<MessageForTransit*>(message)->ports_message();
-  if (ports_message.source_node() == ports::kInvalidNodeName) {
-    DVLOG(1) << "Received invalid message from unknown node.";
-    if (!default_process_error_callback_.is_null())
-      default_process_error_callback_.Run(std::string(error, error_num_bytes));
-    return MOJO_RESULT_OK;
-  }
-
-  GetNodeController()->NotifyBadMessageFrom(
-      ports_message.source_node(), std::string(error, error_num_bytes));
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::CreateDataPipe(
-    const MojoCreateDataPipeOptions* options,
-    MojoHandle* data_pipe_producer_handle,
-    MojoHandle* data_pipe_consumer_handle) {
-  RequestContext request_context;
-  if (options && options->struct_size != sizeof(MojoCreateDataPipeOptions))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  MojoCreateDataPipeOptions create_options;
-  create_options.struct_size = sizeof(MojoCreateDataPipeOptions);
-  create_options.flags = options ? options->flags : 0;
-  create_options.element_num_bytes = options ? options->element_num_bytes : 1;
-  // TODO(rockot): Use Configuration to get default data pipe capacity.
-  create_options.capacity_num_bytes =
-      options && options->capacity_num_bytes ? options->capacity_num_bytes
-                                             : 64 * 1024;
-
-  // TODO(rockot): Broker through the parent when necessary.
-  scoped_refptr<PlatformSharedBuffer> ring_buffer =
-      GetNodeController()->CreateSharedBuffer(
-          create_options.capacity_num_bytes);
-  if (!ring_buffer)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  ports::PortRef port0, port1;
-  GetNodeController()->node()->CreatePortPair(&port0, &port1);
-
-  CHECK(data_pipe_producer_handle);
-  CHECK(data_pipe_consumer_handle);
-
-  uint64_t pipe_id = base::RandUint64();
-
-  scoped_refptr<Dispatcher> producer = new DataPipeProducerDispatcher(
-      GetNodeController(), port0, ring_buffer, create_options,
-      true /* initialized */, pipe_id);
-  scoped_refptr<Dispatcher> consumer = new DataPipeConsumerDispatcher(
-      GetNodeController(), port1, ring_buffer, create_options,
-      true /* initialized */, pipe_id);
-
-  *data_pipe_producer_handle = AddDispatcher(producer);
-  *data_pipe_consumer_handle = AddDispatcher(consumer);
-  if (*data_pipe_producer_handle == MOJO_HANDLE_INVALID ||
-      *data_pipe_consumer_handle == MOJO_HANDLE_INVALID) {
-    if (*data_pipe_producer_handle != MOJO_HANDLE_INVALID) {
-      scoped_refptr<Dispatcher> unused;
-      base::AutoLock lock(handles_lock_);
-      handles_.GetAndRemoveDispatcher(*data_pipe_producer_handle, &unused);
-    }
-    producer->Close();
-    consumer->Close();
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::WriteData(MojoHandle data_pipe_producer_handle,
-                           const void* elements,
-                           uint32_t* num_bytes,
-                           MojoWriteDataFlags flags) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(
-      GetDispatcher(data_pipe_producer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->WriteData(elements, num_bytes, flags);
-}
-
-MojoResult Core::BeginWriteData(MojoHandle data_pipe_producer_handle,
-                                void** buffer,
-                                uint32_t* buffer_num_bytes,
-                                MojoWriteDataFlags flags) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(
-      GetDispatcher(data_pipe_producer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->BeginWriteData(buffer, buffer_num_bytes, flags);
-}
-
-MojoResult Core::EndWriteData(MojoHandle data_pipe_producer_handle,
-                              uint32_t num_bytes_written) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(
-      GetDispatcher(data_pipe_producer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->EndWriteData(num_bytes_written);
-}
-
-MojoResult Core::ReadData(MojoHandle data_pipe_consumer_handle,
-                          void* elements,
-                          uint32_t* num_bytes,
-                          MojoReadDataFlags flags) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(
-      GetDispatcher(data_pipe_consumer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->ReadData(elements, num_bytes, flags);
-}
-
-MojoResult Core::BeginReadData(MojoHandle data_pipe_consumer_handle,
-                               const void** buffer,
-                               uint32_t* buffer_num_bytes,
-                               MojoReadDataFlags flags) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(
-      GetDispatcher(data_pipe_consumer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->BeginReadData(buffer, buffer_num_bytes, flags);
-}
-
-MojoResult Core::EndReadData(MojoHandle data_pipe_consumer_handle,
-                             uint32_t num_bytes_read) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(
-      GetDispatcher(data_pipe_consumer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->EndReadData(num_bytes_read);
-}
-
-MojoResult Core::CreateSharedBuffer(
-    const MojoCreateSharedBufferOptions* options,
-    uint64_t num_bytes,
-    MojoHandle* shared_buffer_handle) {
-  RequestContext request_context;
-  MojoCreateSharedBufferOptions validated_options = {};
-  MojoResult result = SharedBufferDispatcher::ValidateCreateOptions(
-      options, &validated_options);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  result = SharedBufferDispatcher::Create(
-      validated_options, GetNodeController(), num_bytes, &dispatcher);
-  if (result != MOJO_RESULT_OK) {
-    DCHECK(!dispatcher);
-    return result;
-  }
-
-  *shared_buffer_handle = AddDispatcher(dispatcher);
-  if (*shared_buffer_handle == MOJO_HANDLE_INVALID) {
-    LOG(ERROR) << "Handle table full";
-    dispatcher->Close();
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::DuplicateBufferHandle(
-    MojoHandle buffer_handle,
-    const MojoDuplicateBufferHandleOptions* options,
-    MojoHandle* new_buffer_handle) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(GetDispatcher(buffer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  // Don't verify |options| here; that's the dispatcher's job.
-  scoped_refptr<Dispatcher> new_dispatcher;
-  MojoResult result =
-      dispatcher->DuplicateBufferHandle(options, &new_dispatcher);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  *new_buffer_handle = AddDispatcher(new_dispatcher);
-  if (*new_buffer_handle == MOJO_HANDLE_INVALID) {
-    LOG(ERROR) << "Handle table full";
-    dispatcher->Close();
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::MapBuffer(MojoHandle buffer_handle,
-                           uint64_t offset,
-                           uint64_t num_bytes,
-                           void** buffer,
-                           MojoMapBufferFlags flags) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(GetDispatcher(buffer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  std::unique_ptr<PlatformSharedBufferMapping> mapping;
-  MojoResult result = dispatcher->MapBuffer(offset, num_bytes, flags, &mapping);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  DCHECK(mapping);
-  void* address = mapping->GetBase();
-  {
-    base::AutoLock locker(mapping_table_lock_);
-    result = mapping_table_.AddMapping(std::move(mapping));
-  }
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  *buffer = address;
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::UnmapBuffer(void* buffer) {
-  RequestContext request_context;
-  base::AutoLock lock(mapping_table_lock_);
-  return mapping_table_.RemoveMapping(buffer);
-}
-
-MojoResult Core::WrapPlatformHandle(const MojoPlatformHandle* platform_handle,
-                                    MojoHandle* mojo_handle) {
-  ScopedPlatformHandle handle;
-  MojoResult result = MojoPlatformHandleToScopedPlatformHandle(platform_handle,
-                                                               &handle);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  return CreatePlatformHandleWrapper(std::move(handle), mojo_handle);
-}
-
-MojoResult Core::UnwrapPlatformHandle(MojoHandle mojo_handle,
-                                      MojoPlatformHandle* platform_handle) {
-  ScopedPlatformHandle handle;
-  MojoResult result = PassWrappedPlatformHandle(mojo_handle, &handle);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  return ScopedPlatformHandleToMojoPlatformHandle(std::move(handle),
-                                                  platform_handle);
-}
-
-MojoResult Core::WrapPlatformSharedBufferHandle(
-    const MojoPlatformHandle* platform_handle,
-    size_t size,
-    MojoPlatformSharedBufferHandleFlags flags,
-    MojoHandle* mojo_handle) {
-  DCHECK(size);
-  ScopedPlatformHandle handle;
-  MojoResult result = MojoPlatformHandleToScopedPlatformHandle(platform_handle,
-                                                               &handle);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  bool read_only = flags & MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY;
-  scoped_refptr<PlatformSharedBuffer> platform_buffer =
-      PlatformSharedBuffer::CreateFromPlatformHandle(size, read_only,
-                                                     std::move(handle));
-  if (!platform_buffer)
-    return MOJO_RESULT_UNKNOWN;
-
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  result = SharedBufferDispatcher::CreateFromPlatformSharedBuffer(
-      platform_buffer, &dispatcher);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  MojoHandle h = AddDispatcher(dispatcher);
-  if (h == MOJO_HANDLE_INVALID) {
-    dispatcher->Close();
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  *mojo_handle = h;
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::UnwrapPlatformSharedBufferHandle(
-    MojoHandle mojo_handle,
-    MojoPlatformHandle* platform_handle,
-    size_t* size,
-    MojoPlatformSharedBufferHandleFlags* flags) {
-  scoped_refptr<Dispatcher> dispatcher;
-  MojoResult result = MOJO_RESULT_OK;
-  {
-    base::AutoLock lock(handles_lock_);
-    result = handles_.GetAndRemoveDispatcher(mojo_handle, &dispatcher);
-    if (result != MOJO_RESULT_OK)
-      return result;
-  }
-
-  if (dispatcher->GetType() != Dispatcher::Type::SHARED_BUFFER) {
-    dispatcher->Close();
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-
-  SharedBufferDispatcher* shm_dispatcher =
-      static_cast<SharedBufferDispatcher*>(dispatcher.get());
-  scoped_refptr<PlatformSharedBuffer> platform_shared_buffer =
-      shm_dispatcher->PassPlatformSharedBuffer();
-  CHECK(platform_shared_buffer);
-
-  CHECK(size);
-  *size = platform_shared_buffer->GetNumBytes();
-
-  CHECK(flags);
-  *flags = MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE;
-  if (platform_shared_buffer->IsReadOnly())
-    *flags |= MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY;
-
-  ScopedPlatformHandle handle = platform_shared_buffer->PassPlatformHandle();
-  return ScopedPlatformHandleToMojoPlatformHandle(std::move(handle),
-                                                  platform_handle);
-}
-
-void Core::GetActiveHandlesForTest(std::vector<MojoHandle>* handles) {
-  base::AutoLock lock(handles_lock_);
-  handles_.GetActiveHandlesForTest(handles);
-}
-
-// static
-void Core::PassNodeControllerToIOThread(
-    std::unique_ptr<NodeController> node_controller) {
-  // It's OK to leak this reference. At this point we know the IO loop is still
-  // running, and we know the NodeController will observe its eventual
-  // destruction. This tells the NodeController to delete itself when that
-  // happens.
-  node_controller.release()->DestroyOnIOThreadShutdown();
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/core.h b/mojo/edk/system/core.h
deleted file mode 100644
index 1f6d865..0000000
--- a/mojo/edk/system/core.h
+++ /dev/null
@@ -1,297 +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.
-
-#ifndef MOJO_EDK_SYSTEM_CORE_H_
-#define MOJO_EDK_SYSTEM_CORE_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/shared_memory_handle.h"
-#include "base/synchronization/lock.h"
-#include "base/task_runner.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/handle_table.h"
-#include "mojo/edk/system/mapping_table.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/c/system/platform_handle.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/c/system/watcher.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace base {
-class PortProvider;
-}
-
-namespace mojo {
-namespace edk {
-
-// |Core| is an object that implements the Mojo system calls. All public methods
-// are thread-safe.
-class MOJO_SYSTEM_IMPL_EXPORT Core {
- public:
-  Core();
-  virtual ~Core();
-
-  // Called exactly once, shortly after construction, and before any other
-  // methods are called on this object.
-  void SetIOTaskRunner(scoped_refptr<base::TaskRunner> io_task_runner);
-
-  // Retrieves the NodeController for the current process.
-  NodeController* GetNodeController();
-
-  scoped_refptr<Dispatcher> GetDispatcher(MojoHandle handle);
-
-  void SetDefaultProcessErrorCallback(const ProcessErrorCallback& callback);
-
-  // Called in the parent process any time a new child is launched.
-  void AddChild(base::ProcessHandle process_handle,
-                ConnectionParams connection_params,
-                const std::string& child_token,
-                const ProcessErrorCallback& process_error_callback);
-
-  // Called in the parent process when a child process fails to launch.
-  void ChildLaunchFailed(const std::string& child_token);
-
-  // Called to connect to a peer process. This should be called only if there
-  // is no common ancestor for the processes involved within this mojo system.
-  // Both processes must call this function, each passing one end of a platform
-  // channel. This returns one end of a message pipe to each process.
-  ScopedMessagePipeHandle ConnectToPeerProcess(ScopedPlatformHandle pipe_handle,
-                                               const std::string& peer_token);
-  void ClosePeerConnection(const std::string& peer_token);
-
-  // Called in a child process exactly once during early initialization.
-  void InitChild(ConnectionParams connection_params);
-
-  // Creates a message pipe endpoint associated with |token|, which a child
-  // holding the token can later locate and connect to.
-  ScopedMessagePipeHandle CreateParentMessagePipe(
-      const std::string& token, const std::string& child_token);
-
-  // Creates a message pipe endpoint and connects it to a pipe the parent has
-  // associated with |token|.
-  ScopedMessagePipeHandle CreateChildMessagePipe(const std::string& token);
-
-  // Sets the mach port provider for this process.
-  void SetMachPortProvider(base::PortProvider* port_provider);
-
-  MojoHandle AddDispatcher(scoped_refptr<Dispatcher> dispatcher);
-
-  // Adds new dispatchers for non-message-pipe handles received in a message.
-  // |dispatchers| and |handles| should be the same size.
-  bool AddDispatchersFromTransit(
-      const std::vector<Dispatcher::DispatcherInTransit>& dispatchers,
-      MojoHandle* handles);
-
-  // See "mojo/edk/embedder/embedder.h" for more information on these functions.
-  MojoResult CreatePlatformHandleWrapper(ScopedPlatformHandle platform_handle,
-                                         MojoHandle* wrapper_handle);
-
-  MojoResult PassWrappedPlatformHandle(MojoHandle wrapper_handle,
-                                       ScopedPlatformHandle* platform_handle);
-
-  MojoResult CreateSharedBufferWrapper(
-      base::SharedMemoryHandle shared_memory_handle,
-      size_t num_bytes,
-      bool read_only,
-      MojoHandle* mojo_wrapper_handle);
-
-  MojoResult PassSharedMemoryHandle(
-      MojoHandle mojo_handle,
-      base::SharedMemoryHandle* shared_memory_handle,
-      size_t* num_bytes,
-      bool* read_only);
-
-  // Requests that the EDK tear itself down. |callback| will be called once
-  // the shutdown process is complete. Note that |callback| is always called
-  // asynchronously on the calling thread if said thread is running a message
-  // loop, and the calling thread must continue running a MessageLoop at least
-  // until the callback is called. If there is no running loop, the |callback|
-  // may be called from any thread. Beware!
-  void RequestShutdown(const base::Closure& callback);
-
-  MojoResult SetProperty(MojoPropertyType type, const void* value);
-
-  // ---------------------------------------------------------------------------
-
-  // The following methods are essentially implementations of the Mojo Core
-  // functions of the Mojo API, with the C interface translated to C++ by
-  // "mojo/edk/embedder/entrypoints.cc". The best way to understand the contract
-  // of these methods is to look at the header files defining the corresponding
-  // API functions, referenced below.
-
-  // These methods correspond to the API functions defined in
-  // "mojo/public/c/system/functions.h":
-  MojoTimeTicks GetTimeTicksNow();
-  MojoResult Close(MojoHandle handle);
-  MojoResult QueryHandleSignalsState(MojoHandle handle,
-                                     MojoHandleSignalsState* signals_state);
-  MojoResult CreateWatcher(MojoWatcherCallback callback,
-                           MojoHandle* watcher_handle);
-  MojoResult Watch(MojoHandle watcher_handle,
-                   MojoHandle handle,
-                   MojoHandleSignals signals,
-                   uintptr_t context);
-  MojoResult CancelWatch(MojoHandle watcher_handle, uintptr_t context);
-  MojoResult ArmWatcher(MojoHandle watcher_handle,
-                        uint32_t* num_ready_contexts,
-                        uintptr_t* ready_contexts,
-                        MojoResult* ready_results,
-                        MojoHandleSignalsState* ready_signals_states);
-  MojoResult AllocMessage(uint32_t num_bytes,
-                          const MojoHandle* handles,
-                          uint32_t num_handles,
-                          MojoAllocMessageFlags flags,
-                          MojoMessageHandle* message);
-  MojoResult FreeMessage(MojoMessageHandle message);
-  MojoResult GetMessageBuffer(MojoMessageHandle message, void** buffer);
-  MojoResult GetProperty(MojoPropertyType type, void* value);
-
-  // These methods correspond to the API functions defined in
-  // "mojo/public/c/system/message_pipe.h":
-  MojoResult CreateMessagePipe(
-      const MojoCreateMessagePipeOptions* options,
-      MojoHandle* message_pipe_handle0,
-      MojoHandle* message_pipe_handle1);
-  MojoResult WriteMessage(MojoHandle message_pipe_handle,
-                          const void* bytes,
-                          uint32_t num_bytes,
-                          const MojoHandle* handles,
-                          uint32_t num_handles,
-                          MojoWriteMessageFlags flags);
-  MojoResult WriteMessageNew(MojoHandle message_pipe_handle,
-                             MojoMessageHandle message,
-                             MojoWriteMessageFlags flags);
-  MojoResult ReadMessage(MojoHandle message_pipe_handle,
-                         void* bytes,
-                         uint32_t* num_bytes,
-                         MojoHandle* handles,
-                         uint32_t* num_handles,
-                         MojoReadMessageFlags flags);
-  MojoResult ReadMessageNew(MojoHandle message_pipe_handle,
-                            MojoMessageHandle* message,
-                            uint32_t* num_bytes,
-                            MojoHandle* handles,
-                            uint32_t* num_handles,
-                            MojoReadMessageFlags flags);
-  MojoResult FuseMessagePipes(MojoHandle handle0, MojoHandle handle1);
-  MojoResult NotifyBadMessage(MojoMessageHandle message,
-                              const char* error,
-                              size_t error_num_bytes);
-
-  // These methods correspond to the API functions defined in
-  // "mojo/public/c/system/data_pipe.h":
-  MojoResult CreateDataPipe(
-      const MojoCreateDataPipeOptions* options,
-      MojoHandle* data_pipe_producer_handle,
-      MojoHandle* data_pipe_consumer_handle);
-  MojoResult WriteData(MojoHandle data_pipe_producer_handle,
-                       const void* elements,
-                       uint32_t* num_bytes,
-                       MojoWriteDataFlags flags);
-  MojoResult BeginWriteData(MojoHandle data_pipe_producer_handle,
-                            void** buffer,
-                            uint32_t* buffer_num_bytes,
-                            MojoWriteDataFlags flags);
-  MojoResult EndWriteData(MojoHandle data_pipe_producer_handle,
-                          uint32_t num_bytes_written);
-  MojoResult ReadData(MojoHandle data_pipe_consumer_handle,
-                      void* elements,
-                      uint32_t* num_bytes,
-                      MojoReadDataFlags flags);
-  MojoResult BeginReadData(MojoHandle data_pipe_consumer_handle,
-                           const void** buffer,
-                           uint32_t* buffer_num_bytes,
-                           MojoReadDataFlags flags);
-  MojoResult EndReadData(MojoHandle data_pipe_consumer_handle,
-                         uint32_t num_bytes_read);
-
-  // These methods correspond to the API functions defined in
-  // "mojo/public/c/system/buffer.h":
-  MojoResult CreateSharedBuffer(
-      const MojoCreateSharedBufferOptions* options,
-      uint64_t num_bytes,
-      MojoHandle* shared_buffer_handle);
-  MojoResult DuplicateBufferHandle(
-      MojoHandle buffer_handle,
-      const MojoDuplicateBufferHandleOptions* options,
-      MojoHandle* new_buffer_handle);
-  MojoResult MapBuffer(MojoHandle buffer_handle,
-                       uint64_t offset,
-                       uint64_t num_bytes,
-                       void** buffer,
-                       MojoMapBufferFlags flags);
-  MojoResult UnmapBuffer(void* buffer);
-
-  // These methods correspond to the API functions defined in
-  // "mojo/public/c/system/platform_handle.h".
-  MojoResult WrapPlatformHandle(const MojoPlatformHandle* platform_handle,
-                                MojoHandle* mojo_handle);
-  MojoResult UnwrapPlatformHandle(MojoHandle mojo_handle,
-                                  MojoPlatformHandle* platform_handle);
-  MojoResult WrapPlatformSharedBufferHandle(
-      const MojoPlatformHandle* platform_handle,
-      size_t size,
-      MojoPlatformSharedBufferHandleFlags flags,
-      MojoHandle* mojo_handle);
-  MojoResult UnwrapPlatformSharedBufferHandle(
-      MojoHandle mojo_handle,
-      MojoPlatformHandle* platform_handle,
-      size_t* size,
-      MojoPlatformSharedBufferHandleFlags* flags);
-
-  void GetActiveHandlesForTest(std::vector<MojoHandle>* handles);
-
- private:
-  // Used to pass ownership of our NodeController over to the IO thread in the
-  // event that we're torn down before said thread.
-  static void PassNodeControllerToIOThread(
-      std::unique_ptr<NodeController> node_controller);
-
-  // Guards node_controller_.
-  //
-  // TODO(rockot): Consider removing this. It's only needed because we
-  // initialize node_controller_ lazily and that may happen on any thread.
-  // Otherwise it's effectively const and shouldn't need to be guarded.
-  //
-  // We can get rid of lazy initialization if we defer Mojo initialization far
-  // enough that zygotes don't do it. The zygote can't create a NodeController.
-  base::Lock node_controller_lock_;
-
-  // This is lazily initialized on first access. Always use GetNodeController()
-  // to access it.
-  std::unique_ptr<NodeController> node_controller_;
-
-  // The default callback to invoke, if any, when a process error is reported
-  // but cannot be associated with a specific process.
-  ProcessErrorCallback default_process_error_callback_;
-
-  base::Lock handles_lock_;
-  HandleTable handles_;
-
-  base::Lock mapping_table_lock_;  // Protects |mapping_table_|.
-  MappingTable mapping_table_;
-
-  base::Lock property_lock_;
-  // Properties that can be read using the MojoGetProperty() API.
-  bool property_sync_call_allowed_ = true;
-
-  DISALLOW_COPY_AND_ASSIGN(Core);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_CORE_H_
diff --git a/mojo/edk/system/core_test_base.cc b/mojo/edk/system/core_test_base.cc
deleted file mode 100644
index 7751612..0000000
--- a/mojo/edk/system/core_test_base.cc
+++ /dev/null
@@ -1,272 +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.
-
-#include "mojo/edk/system/core_test_base.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <vector>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/message_for_transit.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-namespace {
-
-// MockDispatcher --------------------------------------------------------------
-
-class MockDispatcher : public Dispatcher {
- public:
-  static scoped_refptr<MockDispatcher> Create(
-      CoreTestBase::MockHandleInfo* info) {
-    return make_scoped_refptr(new MockDispatcher(info));
-  }
-
-  // Dispatcher:
-  Type GetType() const override { return Type::UNKNOWN; }
-
-  MojoResult Close() override {
-    info_->IncrementCloseCallCount();
-    return MOJO_RESULT_OK;
-  }
-
-  MojoResult WriteMessage(
-      std::unique_ptr<MessageForTransit> message,
-      MojoWriteMessageFlags /*flags*/) override {
-    info_->IncrementWriteMessageCallCount();
-
-    if (message->num_bytes() > GetConfiguration().max_message_num_bytes)
-      return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-    if (message->num_handles())
-      return MOJO_RESULT_UNIMPLEMENTED;
-
-    return MOJO_RESULT_OK;
-  }
-
-  MojoResult ReadMessage(std::unique_ptr<MessageForTransit>* message,
-                         uint32_t* num_bytes,
-                         MojoHandle* handle,
-                         uint32_t* num_handles,
-                         MojoReadMessageFlags /*flags*/,
-                         bool ignore_num_bytes) override {
-    info_->IncrementReadMessageCallCount();
-
-    if (num_handles)
-      *num_handles = 1;
-
-    return MOJO_RESULT_OK;
-  }
-
-  MojoResult WriteData(const void* elements,
-                       uint32_t* num_bytes,
-                       MojoWriteDataFlags flags) override {
-    info_->IncrementWriteDataCallCount();
-    return MOJO_RESULT_UNIMPLEMENTED;
-  }
-
-  MojoResult BeginWriteData(void** buffer,
-                            uint32_t* buffer_num_bytes,
-                            MojoWriteDataFlags flags) override {
-    info_->IncrementBeginWriteDataCallCount();
-    return MOJO_RESULT_UNIMPLEMENTED;
-  }
-
-  MojoResult EndWriteData(uint32_t num_bytes_written) override {
-    info_->IncrementEndWriteDataCallCount();
-    return MOJO_RESULT_UNIMPLEMENTED;
-  }
-
-  MojoResult ReadData(void* elements,
-                      uint32_t* num_bytes,
-                      MojoReadDataFlags flags) override {
-    info_->IncrementReadDataCallCount();
-    return MOJO_RESULT_UNIMPLEMENTED;
-  }
-
-  MojoResult BeginReadData(const void** buffer,
-                           uint32_t* buffer_num_bytes,
-                           MojoReadDataFlags flags) override {
-    info_->IncrementBeginReadDataCallCount();
-    return MOJO_RESULT_UNIMPLEMENTED;
-  }
-
-  MojoResult EndReadData(uint32_t num_bytes_read) override {
-    info_->IncrementEndReadDataCallCount();
-    return MOJO_RESULT_UNIMPLEMENTED;
-  }
-
- private:
-  explicit MockDispatcher(CoreTestBase::MockHandleInfo* info) : info_(info) {
-    CHECK(info_);
-    info_->IncrementCtorCallCount();
-  }
-
-  ~MockDispatcher() override { info_->IncrementDtorCallCount(); }
-
-  CoreTestBase::MockHandleInfo* const info_;
-
-  DISALLOW_COPY_AND_ASSIGN(MockDispatcher);
-};
-
-}  // namespace
-
-// CoreTestBase ----------------------------------------------------------------
-
-CoreTestBase::CoreTestBase() {
-}
-
-CoreTestBase::~CoreTestBase() {
-}
-
-MojoHandle CoreTestBase::CreateMockHandle(CoreTestBase::MockHandleInfo* info) {
-  scoped_refptr<MockDispatcher> dispatcher = MockDispatcher::Create(info);
-  return core()->AddDispatcher(dispatcher);
-}
-
-Core* CoreTestBase::core() {
-  return mojo::edk::internal::g_core;
-}
-
-// CoreTestBase_MockHandleInfo -------------------------------------------------
-
-CoreTestBase_MockHandleInfo::CoreTestBase_MockHandleInfo()
-    : ctor_call_count_(0),
-      dtor_call_count_(0),
-      close_call_count_(0),
-      write_message_call_count_(0),
-      read_message_call_count_(0),
-      write_data_call_count_(0),
-      begin_write_data_call_count_(0),
-      end_write_data_call_count_(0),
-      read_data_call_count_(0),
-      begin_read_data_call_count_(0),
-      end_read_data_call_count_(0) {}
-
-CoreTestBase_MockHandleInfo::~CoreTestBase_MockHandleInfo() {
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetCtorCallCount() const {
-  base::AutoLock locker(lock_);
-  return ctor_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetDtorCallCount() const {
-  base::AutoLock locker(lock_);
-  return dtor_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetCloseCallCount() const {
-  base::AutoLock locker(lock_);
-  return close_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetWriteMessageCallCount() const {
-  base::AutoLock locker(lock_);
-  return write_message_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetReadMessageCallCount() const {
-  base::AutoLock locker(lock_);
-  return read_message_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetWriteDataCallCount() const {
-  base::AutoLock locker(lock_);
-  return write_data_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetBeginWriteDataCallCount() const {
-  base::AutoLock locker(lock_);
-  return begin_write_data_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetEndWriteDataCallCount() const {
-  base::AutoLock locker(lock_);
-  return end_write_data_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetReadDataCallCount() const {
-  base::AutoLock locker(lock_);
-  return read_data_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetBeginReadDataCallCount() const {
-  base::AutoLock locker(lock_);
-  return begin_read_data_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetEndReadDataCallCount() const {
-  base::AutoLock locker(lock_);
-  return end_read_data_call_count_;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementCtorCallCount() {
-  base::AutoLock locker(lock_);
-  ctor_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementDtorCallCount() {
-  base::AutoLock locker(lock_);
-  dtor_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementCloseCallCount() {
-  base::AutoLock locker(lock_);
-  close_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementWriteMessageCallCount() {
-  base::AutoLock locker(lock_);
-  write_message_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementReadMessageCallCount() {
-  base::AutoLock locker(lock_);
-  read_message_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementWriteDataCallCount() {
-  base::AutoLock locker(lock_);
-  write_data_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementBeginWriteDataCallCount() {
-  base::AutoLock locker(lock_);
-  begin_write_data_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementEndWriteDataCallCount() {
-  base::AutoLock locker(lock_);
-  end_write_data_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementReadDataCallCount() {
-  base::AutoLock locker(lock_);
-  read_data_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementBeginReadDataCallCount() {
-  base::AutoLock locker(lock_);
-  begin_read_data_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementEndReadDataCallCount() {
-  base::AutoLock locker(lock_);
-  end_read_data_call_count_++;
-}
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/core_test_base.h b/mojo/edk/system/core_test_base.h
deleted file mode 100644
index 3d156e3..0000000
--- a/mojo/edk/system/core_test_base.h
+++ /dev/null
@@ -1,94 +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.
-
-#ifndef MOJO_EDK_SYSTEM_CORE_TEST_BASE_H_
-#define MOJO_EDK_SYSTEM_CORE_TEST_BASE_H_
-
-#include <stddef.h>
-
-#include "base/macros.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/public/c/system/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-
-class Core;
-
-namespace test {
-
-class CoreTestBase_MockHandleInfo;
-
-class CoreTestBase : public testing::Test {
- public:
-  using MockHandleInfo = CoreTestBase_MockHandleInfo;
-
-  CoreTestBase();
-  ~CoreTestBase() override;
-
- protected:
-  // |info| must remain alive until the returned handle is closed.
-  MojoHandle CreateMockHandle(MockHandleInfo* info);
-
-  Core* core();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CoreTestBase);
-};
-
-class CoreTestBase_MockHandleInfo {
- public:
-  CoreTestBase_MockHandleInfo();
-  ~CoreTestBase_MockHandleInfo();
-
-  unsigned GetCtorCallCount() const;
-  unsigned GetDtorCallCount() const;
-  unsigned GetCloseCallCount() const;
-  unsigned GetWriteMessageCallCount() const;
-  unsigned GetReadMessageCallCount() const;
-  unsigned GetWriteDataCallCount() const;
-  unsigned GetBeginWriteDataCallCount() const;
-  unsigned GetEndWriteDataCallCount() const;
-  unsigned GetReadDataCallCount() const;
-  unsigned GetBeginReadDataCallCount() const;
-  unsigned GetEndReadDataCallCount() const;
-
-  // For use by |MockDispatcher|:
-  void IncrementCtorCallCount();
-  void IncrementDtorCallCount();
-  void IncrementCloseCallCount();
-  void IncrementWriteMessageCallCount();
-  void IncrementReadMessageCallCount();
-  void IncrementWriteDataCallCount();
-  void IncrementBeginWriteDataCallCount();
-  void IncrementEndWriteDataCallCount();
-  void IncrementReadDataCallCount();
-  void IncrementBeginReadDataCallCount();
-  void IncrementEndReadDataCallCount();
-
- private:
-  mutable base::Lock lock_;  // Protects the following members.
-  unsigned ctor_call_count_;
-  unsigned dtor_call_count_;
-  unsigned close_call_count_;
-  unsigned write_message_call_count_;
-  unsigned read_message_call_count_;
-  unsigned write_data_call_count_;
-  unsigned begin_write_data_call_count_;
-  unsigned end_write_data_call_count_;
-  unsigned read_data_call_count_;
-  unsigned begin_read_data_call_count_;
-  unsigned end_read_data_call_count_;
-
-  DISALLOW_COPY_AND_ASSIGN(CoreTestBase_MockHandleInfo);
-};
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_CORE_TEST_BASE_H_
diff --git a/mojo/edk/system/core_unittest.cc b/mojo/edk/system/core_unittest.cc
deleted file mode 100644
index 0d60b48..0000000
--- a/mojo/edk/system/core_unittest.cc
+++ /dev/null
@@ -1,971 +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.
-
-#include "mojo/edk/system/core.h"
-
-#include <stdint.h>
-
-#include <limits>
-
-#include "base/bind.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/core_test_base.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/public/cpp/system/wait.h"
-
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
-namespace mojo {
-namespace edk {
-namespace {
-
-const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u};
-const MojoHandleSignalsState kFullMojoHandleSignalsState = {~0u, ~0u};
-const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE |
-                                      MOJO_HANDLE_SIGNAL_WRITABLE |
-                                      MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-
-using CoreTest = test::CoreTestBase;
-
-TEST_F(CoreTest, GetTimeTicksNow) {
-  const MojoTimeTicks start = core()->GetTimeTicksNow();
-  ASSERT_NE(static_cast<MojoTimeTicks>(0), start)
-      << "GetTimeTicksNow should return nonzero value";
-  test::Sleep(test::DeadlineFromMilliseconds(15));
-  const MojoTimeTicks finish = core()->GetTimeTicksNow();
-  // Allow for some fuzz in sleep.
-  ASSERT_GE((finish - start), static_cast<MojoTimeTicks>(8000))
-      << "Sleeping should result in increasing time ticks";
-}
-
-TEST_F(CoreTest, Basic) {
-  MockHandleInfo info;
-
-  ASSERT_EQ(0u, info.GetCtorCallCount());
-  MojoHandle h = CreateMockHandle(&info);
-  ASSERT_EQ(1u, info.GetCtorCallCount());
-  ASSERT_NE(h, MOJO_HANDLE_INVALID);
-
-  ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h, nullptr, 0, nullptr, 0,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(1u, info.GetWriteMessageCallCount());
-
-  ASSERT_EQ(0u, info.GetReadMessageCallCount());
-  uint32_t num_bytes = 0;
-  ASSERT_EQ(
-      MOJO_RESULT_OK,
-      core()->ReadMessage(h, nullptr, &num_bytes, nullptr, nullptr,
-                          MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(1u, info.GetReadMessageCallCount());
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(h, nullptr, nullptr, nullptr, nullptr,
-                                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(2u, info.GetReadMessageCallCount());
-
-  ASSERT_EQ(0u, info.GetWriteDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-            core()->WriteData(h, nullptr, nullptr, MOJO_WRITE_DATA_FLAG_NONE));
-  ASSERT_EQ(1u, info.GetWriteDataCallCount());
-
-  ASSERT_EQ(0u, info.GetBeginWriteDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-            core()->BeginWriteData(h, nullptr, nullptr,
-                                   MOJO_WRITE_DATA_FLAG_NONE));
-  ASSERT_EQ(1u, info.GetBeginWriteDataCallCount());
-
-  ASSERT_EQ(0u, info.GetEndWriteDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndWriteData(h, 0));
-  ASSERT_EQ(1u, info.GetEndWriteDataCallCount());
-
-  ASSERT_EQ(0u, info.GetReadDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-            core()->ReadData(h, nullptr, nullptr, MOJO_READ_DATA_FLAG_NONE));
-  ASSERT_EQ(1u, info.GetReadDataCallCount());
-
-  ASSERT_EQ(0u, info.GetBeginReadDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-            core()->BeginReadData(h, nullptr, nullptr,
-                                  MOJO_READ_DATA_FLAG_NONE));
-  ASSERT_EQ(1u, info.GetBeginReadDataCallCount());
-
-  ASSERT_EQ(0u, info.GetEndReadDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndReadData(h, 0));
-  ASSERT_EQ(1u, info.GetEndReadDataCallCount());
-
-  ASSERT_EQ(0u, info.GetDtorCallCount());
-  ASSERT_EQ(0u, info.GetCloseCallCount());
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h));
-  ASSERT_EQ(1u, info.GetCloseCallCount());
-  ASSERT_EQ(1u, info.GetDtorCallCount());
-}
-
-TEST_F(CoreTest, InvalidArguments) {
-  // |Close()|:
-  {
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(MOJO_HANDLE_INVALID));
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(10));
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(1000000000));
-
-    // Test a double-close.
-    MockHandleInfo info;
-    MojoHandle h = CreateMockHandle(&info);
-    ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h));
-    ASSERT_EQ(1u, info.GetCloseCallCount());
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h));
-    ASSERT_EQ(1u, info.GetCloseCallCount());
-  }
-
-  // |CreateMessagePipe()|: Nothing to check (apart from things that cause
-  // death).
-
-  // |WriteMessage()|:
-  // Only check arguments checked by |Core|, namely |handle|, |handles|, and
-  // |num_handles|.
-  {
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              core()->WriteMessage(MOJO_HANDLE_INVALID, nullptr, 0,
-                                   nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    MockHandleInfo info;
-    MojoHandle h = CreateMockHandle(&info);
-    MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
-
-    // Huge handle count (implausibly big on some systems -- more than can be
-    // stored in a 32-bit address space).
-    // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or
-    // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or
-    // not.
-    ASSERT_NE(
-        MOJO_RESULT_OK,
-        core()->WriteMessage(h, nullptr, 0, handles,
-                             std::numeric_limits<uint32_t>::max(),
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    // Null |bytes| with non-zero message size.
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              core()->WriteMessage(h, nullptr, 1, nullptr, 0,
-                                   MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    // Null |handles| with non-zero handle count.
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              core()->WriteMessage(h, nullptr, 0, nullptr, 1,
-                                   MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    // Huge handle count (plausibly big).
-    ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-              core()->WriteMessage(
-                  h, nullptr, 0, handles,
-                  std::numeric_limits<uint32_t>::max() / sizeof(handles[0]),
-                  MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    // Invalid handle in |handles|.
-    ASSERT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        core()->WriteMessage(h, nullptr, 0, handles, 1,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    // Two invalid handles in |handles|.
-    ASSERT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        core()->WriteMessage(h, nullptr, 0, handles, 2,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    // Can't send a handle over itself. Note that this will also cause |h| to be
-    // closed.
-    handles[0] = h;
-    ASSERT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        core()->WriteMessage(h, nullptr, 0, handles, 1,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    h = CreateMockHandle(&info);
-
-    MockHandleInfo info2;
-
-    // This is "okay", but |MockDispatcher| doesn't implement it.
-    handles[0] = CreateMockHandle(&info2);
-    ASSERT_EQ(
-        MOJO_RESULT_UNIMPLEMENTED,
-        core()->WriteMessage(h, nullptr, 0, handles, 1,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(1u, info.GetWriteMessageCallCount());
-
-    // One of the |handles| is still invalid.
-    handles[0] = CreateMockHandle(&info2);
-    ASSERT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        core()->WriteMessage(h, nullptr, 0, handles, 2,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(1u, info.GetWriteMessageCallCount());
-
-    // One of the |handles| is the same as |h|. Both handles are closed.
-    handles[0] = CreateMockHandle(&info2);
-    handles[1] = h;
-    ASSERT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        core()->WriteMessage(h, nullptr, 0, handles, 2,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(1u, info.GetWriteMessageCallCount());
-
-    h = CreateMockHandle(&info);
-
-    // Can't send a handle twice in the same message.
-    handles[0] = CreateMockHandle(&info2);
-    handles[1] = handles[0];
-    ASSERT_EQ(
-        MOJO_RESULT_BUSY,
-        core()->WriteMessage(h, nullptr, 0, handles, 2,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(1u, info.GetWriteMessageCallCount());
-
-    ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h));
-  }
-
-  // |ReadMessage()|:
-  // Only check arguments checked by |Core|, namely |handle|, |handles|, and
-  // |num_handles|.
-  {
-    ASSERT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        core()->ReadMessage(MOJO_HANDLE_INVALID, nullptr, nullptr, nullptr,
-                            nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
-
-    MockHandleInfo info;
-    MojoHandle h = CreateMockHandle(&info);
-
-    // Okay.
-    uint32_t handle_count = 0;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              core()->ReadMessage(
-                  h, nullptr, nullptr, nullptr, &handle_count,
-                  MOJO_READ_MESSAGE_FLAG_NONE));
-    // Checked by |Core|, shouldn't go through to the dispatcher.
-    ASSERT_EQ(1u, info.GetReadMessageCallCount());
-
-    ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h));
-  }
-}
-
-// These test invalid arguments that should cause death if we're being paranoid
-// about checking arguments (which we would want to do if, e.g., we were in a
-// true "kernel" situation, but we might not want to do otherwise for
-// performance reasons). Probably blatant errors like passing in null pointers
-// (for required pointer arguments) will still cause death, but perhaps not
-// predictably.
-TEST_F(CoreTest, InvalidArgumentsDeath) {
-#if defined(OFFICIAL_BUILD)
-  const char kMemoryCheckFailedRegex[] = "";
-#else
-  const char kMemoryCheckFailedRegex[] = "Check failed";
-#endif
-
-  // |CreateMessagePipe()|:
-  {
-    MojoHandle h;
-    ASSERT_DEATH_IF_SUPPORTED(
-        core()->CreateMessagePipe(nullptr, nullptr, nullptr),
-        kMemoryCheckFailedRegex);
-    ASSERT_DEATH_IF_SUPPORTED(
-        core()->CreateMessagePipe(nullptr, &h, nullptr),
-        kMemoryCheckFailedRegex);
-    ASSERT_DEATH_IF_SUPPORTED(
-        core()->CreateMessagePipe(nullptr, nullptr, &h),
-        kMemoryCheckFailedRegex);
-  }
-
-  // |ReadMessage()|:
-  // Only check arguments checked by |Core|, namely |handle|, |handles|, and
-  // |num_handles|.
-  {
-    MockHandleInfo info;
-    MojoHandle h = CreateMockHandle(&info);
-
-    uint32_t handle_count = 1;
-    ASSERT_DEATH_IF_SUPPORTED(
-        core()->ReadMessage(h, nullptr, nullptr, nullptr, &handle_count,
-                            MOJO_READ_MESSAGE_FLAG_NONE),
-        kMemoryCheckFailedRegex);
-
-    ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h));
-  }
-}
-
-TEST_F(CoreTest, MessagePipe) {
-  MojoHandle h[2];
-  MojoHandleSignalsState hss[2];
-
-  ASSERT_EQ(MOJO_RESULT_OK, core()->CreateMessagePipe(nullptr, &h[0], &h[1]));
-  // Should get two distinct, valid handles.
-  ASSERT_NE(h[0], MOJO_HANDLE_INVALID);
-  ASSERT_NE(h[1], MOJO_HANDLE_INVALID);
-  ASSERT_NE(h[0], h[1]);
-
-  // Neither should be readable.
-  hss[0] = kEmptyMojoHandleSignalsState;
-  hss[1] = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(h[0], &hss[0]));
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(h[1], &hss[1]));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss[0].satisfiable_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss[1].satisfiable_signals);
-
-  // Try to read anyway.
-  char buffer[1] = {'a'};
-  uint32_t buffer_size = 1;
-  ASSERT_EQ(
-      MOJO_RESULT_SHOULD_WAIT,
-      core()->ReadMessage(h[0], buffer, &buffer_size, nullptr, nullptr,
-                          MOJO_READ_MESSAGE_FLAG_NONE));
-  // Check that it left its inputs alone.
-  ASSERT_EQ('a', buffer[0]);
-  ASSERT_EQ(1u, buffer_size);
-
-  // Write to |h[1]|.
-  buffer[0] = 'b';
-  ASSERT_EQ(
-      MOJO_RESULT_OK,
-      core()->WriteMessage(h[1], buffer, 1, nullptr, 0,
-                           MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // Wait for |h[0]| to become readable.
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h[0]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss[0]));
-
-  // Read from |h[0]|.
-  // First, get only the size.
-  buffer_size = 0;
-  ASSERT_EQ(
-      MOJO_RESULT_RESOURCE_EXHAUSTED,
-      core()->ReadMessage(h[0], nullptr, &buffer_size, nullptr, nullptr,
-                          MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(1u, buffer_size);
-  // Then actually read it.
-  buffer[0] = 'c';
-  buffer_size = 1;
-  ASSERT_EQ(
-      MOJO_RESULT_OK,
-      core()->ReadMessage(h[0], buffer, &buffer_size, nullptr, nullptr,
-                          MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ('b', buffer[0]);
-  ASSERT_EQ(1u, buffer_size);
-
-  // |h[0]| should no longer be readable.
-  hss[0] = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(h[0], &hss[0]));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss[0].satisfiable_signals);
-
-  // Write to |h[0]|.
-  buffer[0] = 'd';
-  ASSERT_EQ(
-      MOJO_RESULT_OK,
-      core()->WriteMessage(h[0], buffer, 1, nullptr, 0,
-                           MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // Close |h[0]|.
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h[0]));
-
-  // Wait for |h[1]| to learn about the other end's closure.
-  EXPECT_EQ(
-      MOJO_RESULT_OK,
-      mojo::Wait(mojo::Handle(h[1]), MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss[1]));
-
-  // Check that |h[1]| is no longer writable (and will never be).
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss[1].satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss[1].satisfiable_signals);
-
-  // Check that |h[1]| is still readable (for the moment).
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss[1].satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss[1].satisfiable_signals);
-
-  // Discard a message from |h[1]|.
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            core()->ReadMessage(h[1], nullptr, nullptr, nullptr, nullptr,
-                                MOJO_READ_MESSAGE_FLAG_MAY_DISCARD));
-
-  // |h[1]| is no longer readable (and will never be).
-  hss[1] = kFullMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(h[1], &hss[1]));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss[1].satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss[1].satisfiable_signals);
-
-  // Try writing to |h[1]|.
-  buffer[0] = 'e';
-  ASSERT_EQ(
-      MOJO_RESULT_FAILED_PRECONDITION,
-      core()->WriteMessage(h[1], buffer, 1, nullptr, 0,
-                           MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h[1]));
-}
-
-// Tests passing a message pipe handle.
-TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) {
-  const char kHello[] = "hello";
-  const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
-  const char kWorld[] = "world!!!";
-  const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
-  char buffer[100];
-  const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
-  uint32_t num_bytes;
-  MojoHandle handles[10];
-  uint32_t num_handles;
-  MojoHandleSignalsState hss;
-  MojoHandle h_received;
-
-  MojoHandle h_passing[2];
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateMessagePipe(nullptr, &h_passing[0], &h_passing[1]));
-
-  // Make sure that |h_passing[]| work properly.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize, nullptr, 0,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passing[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kHelloSize, num_bytes);
-  ASSERT_STREQ(kHello, buffer);
-  ASSERT_EQ(0u, num_handles);
-
-  // Make sure that you can't pass either of the message pipe's handles over
-  // itself.
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize,
-                                 &h_passing[0], 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateMessagePipe(nullptr, &h_passing[0], &h_passing[1]));
-
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize,
-                                 &h_passing[1], 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateMessagePipe(nullptr, &h_passing[0], &h_passing[1]));
-
-  MojoHandle h_passed[2];
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateMessagePipe(nullptr, &h_passed[0], &h_passed[1]));
-
-  // Make sure that |h_passed[]| work properly.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passed[0], kHello, kHelloSize, nullptr, 0,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  ASSERT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passed[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passed[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kHelloSize, num_bytes);
-  ASSERT_STREQ(kHello, buffer);
-  ASSERT_EQ(0u, num_handles);
-
-  // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passing[0], kWorld, kWorldSize,
-                                 &h_passed[1], 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  ASSERT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passing[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kWorldSize, num_bytes);
-  ASSERT_STREQ(kWorld, buffer);
-  ASSERT_EQ(1u, num_handles);
-  h_received = handles[0];
-  ASSERT_NE(h_received, MOJO_HANDLE_INVALID);
-  ASSERT_NE(h_received, h_passing[0]);
-  ASSERT_NE(h_received, h_passing[1]);
-  ASSERT_NE(h_received, h_passed[0]);
-
-  // Note: We rely on the Mojo system not re-using handle values very often.
-  ASSERT_NE(h_received, h_passed[1]);
-
-  // |h_passed[1]| should no longer be valid; check that trying to close it
-  // fails. See above note.
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1]));
-
-  // Write to |h_passed[0]|. Should receive on |h_received|.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passed[0], kHello, kHelloSize, nullptr, 0,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  ASSERT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_received),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_received, buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kHelloSize, num_bytes);
-  ASSERT_STREQ(kHello, buffer);
-  ASSERT_EQ(0u, num_handles);
-
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1]));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h_received));
-}
-
-TEST_F(CoreTest, DataPipe) {
-  MojoHandle ph, ch;  // p is for producer and c is for consumer.
-  MojoHandleSignalsState hss;
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateDataPipe(nullptr, &ph, &ch));
-  // Should get two distinct, valid handles.
-  ASSERT_NE(ph, MOJO_HANDLE_INVALID);
-  ASSERT_NE(ch, MOJO_HANDLE_INVALID);
-  ASSERT_NE(ph, ch);
-
-  // Producer should be never-readable, but already writable.
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(ph, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Consumer should be never-writable, and not yet readable.
-  hss = kFullMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(ch, &hss));
-  EXPECT_EQ(0u, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Write.
-  signed char elements[2] = {'A', 'B'};
-  uint32_t num_bytes = 2u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteData(ph, elements, &num_bytes,
-                              MOJO_WRITE_DATA_FLAG_NONE));
-  ASSERT_EQ(2u, num_bytes);
-
-  // Wait for the data to arrive to the consumer.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            mojo::Wait(mojo::Handle(ch), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-
-  // Consumer should now be readable.
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(ch, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Peek one character.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = 1u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadData(
-                ch, elements, &num_bytes,
-                MOJO_READ_DATA_FLAG_NONE | MOJO_READ_DATA_FLAG_PEEK));
-  ASSERT_EQ('A', elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Read one character.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = 1u;
-  ASSERT_EQ(MOJO_RESULT_OK, core()->ReadData(ch, elements, &num_bytes,
-                                             MOJO_READ_DATA_FLAG_NONE));
-  ASSERT_EQ('A', elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Two-phase write.
-  void* write_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->BeginWriteData(ph, &write_ptr, &num_bytes,
-                                   MOJO_WRITE_DATA_FLAG_NONE));
-  // We count on the default options providing a decent buffer size.
-  ASSERT_GE(num_bytes, 3u);
-
-  // Trying to do a normal write during a two-phase write should fail.
-  elements[0] = 'X';
-  num_bytes = 1u;
-  ASSERT_EQ(MOJO_RESULT_BUSY,
-            core()->WriteData(ph, elements, &num_bytes,
-                              MOJO_WRITE_DATA_FLAG_NONE));
-
-  // Actually write the data, and complete it now.
-  static_cast<char*>(write_ptr)[0] = 'C';
-  static_cast<char*>(write_ptr)[1] = 'D';
-  static_cast<char*>(write_ptr)[2] = 'E';
-  ASSERT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u));
-
-  // Wait for the data to arrive to the consumer.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            mojo::Wait(mojo::Handle(ch), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-
-  // Query how much data we have.
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadData(ch, nullptr, &num_bytes,
-                             MOJO_READ_DATA_FLAG_QUERY));
-  ASSERT_GE(num_bytes, 1u);
-
-  // Try to query with peek. Should fail.
-  num_bytes = 0;
-  ASSERT_EQ(
-      MOJO_RESULT_INVALID_ARGUMENT,
-      core()->ReadData(ch, nullptr, &num_bytes,
-                       MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Try to discard ten characters, in all-or-none mode. Should fail.
-  num_bytes = 10;
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            core()->ReadData(
-                ch, nullptr, &num_bytes,
-                MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-  // Try to discard two characters, in peek mode. Should fail.
-  num_bytes = 2;
-  ASSERT_EQ(
-      MOJO_RESULT_INVALID_ARGUMENT,
-      core()->ReadData(ch, nullptr, &num_bytes,
-                       MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK));
-
-  // Discard a character.
-  num_bytes = 1;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadData(
-                ch, nullptr, &num_bytes,
-                MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-  // Ensure the 3 bytes were read.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            mojo::Wait(mojo::Handle(ch), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-
-  // Try a two-phase read of the remaining three bytes with peek. Should fail.
-  const void* read_ptr = nullptr;
-  num_bytes = 3;
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            core()->BeginReadData(ch, &read_ptr, &num_bytes,
-                                  MOJO_READ_DATA_FLAG_PEEK));
-
-  // Read the remaining two characters, in two-phase mode (all-or-none).
-  num_bytes = 3;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->BeginReadData(ch, &read_ptr, &num_bytes,
-                                  MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-  // Note: Count on still being able to do the contiguous read here.
-  ASSERT_EQ(3u, num_bytes);
-
-  // Discarding right now should fail.
-  num_bytes = 1;
-  ASSERT_EQ(MOJO_RESULT_BUSY,
-            core()->ReadData(ch, nullptr, &num_bytes,
-                             MOJO_READ_DATA_FLAG_DISCARD));
-
-  // Actually check our data and end the two-phase read.
-  ASSERT_EQ('C', static_cast<const char*>(read_ptr)[0]);
-  ASSERT_EQ('D', static_cast<const char*>(read_ptr)[1]);
-  ASSERT_EQ('E', static_cast<const char*>(read_ptr)[2]);
-  ASSERT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 3u));
-
-  // Consumer should now be no longer readable.
-  hss = kFullMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(ch, &hss));
-  EXPECT_EQ(0u, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // TODO(vtl): More.
-
-  // Close the producer.
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(ph));
-
-  // Wait for this to get to the consumer.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            mojo::Wait(mojo::Handle(ch), MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-
-  // The consumer should now be never-readable.
-  hss = kFullMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(ch, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(ch));
-}
-
-// Tests passing data pipe producer and consumer handles.
-TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
-  const char kHello[] = "hello";
-  const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
-  const char kWorld[] = "world!!!";
-  const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
-  char buffer[100];
-  const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
-  uint32_t num_bytes;
-  MojoHandle handles[10];
-  uint32_t num_handles;
-  MojoHandleSignalsState hss;
-
-  MojoHandle h_passing[2];
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateMessagePipe(nullptr, &h_passing[0], &h_passing[1]));
-
-  MojoHandle ph, ch;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateDataPipe(nullptr, &ph, &ch));
-
-  // Send |ch| from |h_passing[0]| to |h_passing[1]|.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize, &ch, 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  ASSERT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passing[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kHelloSize, num_bytes);
-  ASSERT_STREQ(kHello, buffer);
-  ASSERT_EQ(1u, num_handles);
-  MojoHandle ch_received = handles[0];
-  ASSERT_NE(ch_received, MOJO_HANDLE_INVALID);
-  ASSERT_NE(ch_received, h_passing[0]);
-  ASSERT_NE(ch_received, h_passing[1]);
-  ASSERT_NE(ch_received, ph);
-
-  // Note: We rely on the Mojo system not re-using handle values very often.
-  ASSERT_NE(ch_received, ch);
-
-  // |ch| should no longer be valid; check that trying to close it fails. See
-  // above note.
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch));
-
-  // Write to |ph|. Should receive on |ch_received|.
-  num_bytes = kWorldSize;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteData(ph, kWorld, &num_bytes,
-                              MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(ch_received),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadData(ch_received, buffer, &num_bytes,
-                             MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kWorldSize, num_bytes);
-  ASSERT_STREQ(kWorld, buffer);
-
-  // Now pass |ph| in the same direction.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passing[0], kWorld, kWorldSize, &ph, 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  ASSERT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passing[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kWorldSize, num_bytes);
-  ASSERT_STREQ(kWorld, buffer);
-  ASSERT_EQ(1u, num_handles);
-  MojoHandle ph_received = handles[0];
-  ASSERT_NE(ph_received, MOJO_HANDLE_INVALID);
-  ASSERT_NE(ph_received, h_passing[0]);
-  ASSERT_NE(ph_received, h_passing[1]);
-  ASSERT_NE(ph_received, ch_received);
-
-  // Again, rely on the Mojo system not re-using handle values very often.
-  ASSERT_NE(ph_received, ph);
-
-  // |ph| should no longer be valid; check that trying to close it fails. See
-  // above note.
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph));
-
-  // Write to |ph_received|. Should receive on |ch_received|.
-  num_bytes = kHelloSize;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteData(ph_received, kHello, &num_bytes,
-                              MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(ch_received),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadData(ch_received, buffer, &num_bytes,
-                             MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kHelloSize, num_bytes);
-  ASSERT_STREQ(kHello, buffer);
-
-  ph = ph_received;
-  ph_received = MOJO_HANDLE_INVALID;
-  ch = ch_received;
-  ch_received = MOJO_HANDLE_INVALID;
-
-  // Make sure that |ph| can't be sent if it's in a two-phase write.
-  void* write_ptr = nullptr;
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->BeginWriteData(ph, &write_ptr, &num_bytes,
-                                   MOJO_WRITE_DATA_FLAG_NONE));
-  ASSERT_GE(num_bytes, 1u);
-  ASSERT_EQ(MOJO_RESULT_BUSY,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize, &ph, 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // But |ch| can, even if |ph| is in a two-phase write.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize, &ch, 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  ch = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE));
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passing[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kHelloSize, num_bytes);
-  ASSERT_STREQ(kHello, buffer);
-  ASSERT_EQ(1u, num_handles);
-  ch = handles[0];
-  ASSERT_NE(ch, MOJO_HANDLE_INVALID);
-
-  // Complete the two-phase write.
-  static_cast<char*>(write_ptr)[0] = 'x';
-  ASSERT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1));
-
-  // Wait for |ch| to be readable.
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            mojo::Wait(mojo::Handle(ch), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Make sure that |ch| can't be sent if it's in a two-phase read.
-  const void* read_ptr = nullptr;
-  num_bytes = 1;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->BeginReadData(ch, &read_ptr, &num_bytes,
-                                  MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-  ASSERT_EQ(MOJO_RESULT_BUSY,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize, &ch, 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // But |ph| can, even if |ch| is in a two-phase read.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passing[0], kWorld, kWorldSize, &ph, 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  ph = MOJO_HANDLE_INVALID;
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passing[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kWorldSize, num_bytes);
-  ASSERT_STREQ(kWorld, buffer);
-  ASSERT_EQ(1u, num_handles);
-  ph = handles[0];
-  ASSERT_NE(ph, MOJO_HANDLE_INVALID);
-
-  // Complete the two-phase read.
-  ASSERT_EQ('x', static_cast<const char*>(read_ptr)[0]);
-  ASSERT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 1));
-
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1]));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(ph));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(ch));
-}
-
-struct TestAsyncWaiter {
-  TestAsyncWaiter() : result(MOJO_RESULT_UNKNOWN) {}
-
-  void Awake(MojoResult r) { result = r; }
-
-  MojoResult result;
-};
-
-// TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|.
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_consumer_dispatcher.cc b/mojo/edk/system/data_pipe_consumer_dispatcher.cc
deleted file mode 100644
index f338732..0000000
--- a/mojo/edk/system/data_pipe_consumer_dispatcher.cc
+++ /dev/null
@@ -1,562 +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.
-
-#include "mojo/edk/system/data_pipe_consumer_dispatcher.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <limits>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/data_pipe_control_message.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/ports_message.h"
-#include "mojo/edk/system/request_context.h"
-#include "mojo/public/c/system/data_pipe.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-const uint8_t kFlagPeerClosed = 0x01;
-
-#pragma pack(push, 1)
-
-struct SerializedState {
-  MojoCreateDataPipeOptions options;
-  uint64_t pipe_id;
-  uint32_t read_offset;
-  uint32_t bytes_available;
-  uint8_t flags;
-  char padding[7];
-};
-
-static_assert(sizeof(SerializedState) % 8 == 0,
-              "Invalid SerializedState size.");
-
-#pragma pack(pop)
-
-}  // namespace
-
-// A PortObserver which forwards to a DataPipeConsumerDispatcher. This owns a
-// reference to the dispatcher to ensure it lives as long as the observed port.
-class DataPipeConsumerDispatcher::PortObserverThunk
-    : public NodeController::PortObserver {
- public:
-  explicit PortObserverThunk(
-      scoped_refptr<DataPipeConsumerDispatcher> dispatcher)
-      : dispatcher_(dispatcher) {}
-
- private:
-  ~PortObserverThunk() override {}
-
-  // NodeController::PortObserver:
-  void OnPortStatusChanged() override { dispatcher_->OnPortStatusChanged(); }
-
-  scoped_refptr<DataPipeConsumerDispatcher> dispatcher_;
-
-  DISALLOW_COPY_AND_ASSIGN(PortObserverThunk);
-};
-
-DataPipeConsumerDispatcher::DataPipeConsumerDispatcher(
-    NodeController* node_controller,
-    const ports::PortRef& control_port,
-    scoped_refptr<PlatformSharedBuffer> shared_ring_buffer,
-    const MojoCreateDataPipeOptions& options,
-    bool initialized,
-    uint64_t pipe_id)
-    : options_(options),
-      node_controller_(node_controller),
-      control_port_(control_port),
-      pipe_id_(pipe_id),
-      watchers_(this),
-      shared_ring_buffer_(shared_ring_buffer) {
-  if (initialized) {
-    base::AutoLock lock(lock_);
-    InitializeNoLock();
-  }
-}
-
-Dispatcher::Type DataPipeConsumerDispatcher::GetType() const {
-  return Type::DATA_PIPE_CONSUMER;
-}
-
-MojoResult DataPipeConsumerDispatcher::Close() {
-  base::AutoLock lock(lock_);
-  DVLOG(1) << "Closing data pipe consumer " << pipe_id_;
-  return CloseNoLock();
-}
-
-MojoResult DataPipeConsumerDispatcher::ReadData(void* elements,
-                                                uint32_t* num_bytes,
-                                                MojoReadDataFlags flags) {
-  base::AutoLock lock(lock_);
-
-  if (!shared_ring_buffer_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (in_two_phase_read_)
-    return MOJO_RESULT_BUSY;
-
-  const bool had_new_data = new_data_available_;
-  new_data_available_ = false;
-
-  if ((flags & MOJO_READ_DATA_FLAG_QUERY)) {
-    if ((flags & MOJO_READ_DATA_FLAG_PEEK) ||
-        (flags & MOJO_READ_DATA_FLAG_DISCARD))
-      return MOJO_RESULT_INVALID_ARGUMENT;
-    DCHECK(!(flags & MOJO_READ_DATA_FLAG_DISCARD));  // Handled above.
-    DVLOG_IF(2, elements)
-        << "Query mode: ignoring non-null |elements|";
-    *num_bytes = static_cast<uint32_t>(bytes_available_);
-
-    if (had_new_data)
-      watchers_.NotifyState(GetHandleSignalsStateNoLock());
-    return MOJO_RESULT_OK;
-  }
-
-  bool discard = false;
-  if ((flags & MOJO_READ_DATA_FLAG_DISCARD)) {
-    // These flags are mutally exclusive.
-    if (flags & MOJO_READ_DATA_FLAG_PEEK)
-      return MOJO_RESULT_INVALID_ARGUMENT;
-    DVLOG_IF(2, elements)
-        << "Discard mode: ignoring non-null |elements|";
-    discard = true;
-  }
-
-  uint32_t max_num_bytes_to_read = *num_bytes;
-  if (max_num_bytes_to_read % options_.element_num_bytes != 0)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  bool all_or_none = flags & MOJO_READ_DATA_FLAG_ALL_OR_NONE;
-  uint32_t min_num_bytes_to_read =
-      all_or_none ? max_num_bytes_to_read : 0;
-
-  if (min_num_bytes_to_read > bytes_available_) {
-    if (had_new_data)
-      watchers_.NotifyState(GetHandleSignalsStateNoLock());
-    return peer_closed_ ? MOJO_RESULT_FAILED_PRECONDITION
-                        : MOJO_RESULT_OUT_OF_RANGE;
-  }
-
-  uint32_t bytes_to_read = std::min(max_num_bytes_to_read, bytes_available_);
-  if (bytes_to_read == 0) {
-    if (had_new_data)
-      watchers_.NotifyState(GetHandleSignalsStateNoLock());
-    return peer_closed_ ? MOJO_RESULT_FAILED_PRECONDITION
-                        : MOJO_RESULT_SHOULD_WAIT;
-  }
-
-  if (!discard) {
-    uint8_t* data = static_cast<uint8_t*>(ring_buffer_mapping_->GetBase());
-    CHECK(data);
-
-    uint8_t* destination = static_cast<uint8_t*>(elements);
-    CHECK(destination);
-
-    DCHECK_LE(read_offset_, options_.capacity_num_bytes);
-    uint32_t tail_bytes_to_copy =
-        std::min(options_.capacity_num_bytes - read_offset_, bytes_to_read);
-    uint32_t head_bytes_to_copy = bytes_to_read - tail_bytes_to_copy;
-    if (tail_bytes_to_copy > 0)
-      memcpy(destination, data + read_offset_, tail_bytes_to_copy);
-    if (head_bytes_to_copy > 0)
-      memcpy(destination + tail_bytes_to_copy, data, head_bytes_to_copy);
-  }
-  *num_bytes = bytes_to_read;
-
-  bool peek = !!(flags & MOJO_READ_DATA_FLAG_PEEK);
-  if (discard || !peek) {
-    read_offset_ = (read_offset_ + bytes_to_read) % options_.capacity_num_bytes;
-    bytes_available_ -= bytes_to_read;
-
-    base::AutoUnlock unlock(lock_);
-    NotifyRead(bytes_to_read);
-  }
-
-  // We may have just read the last available data and thus changed the signals
-  // state.
-  watchers_.NotifyState(GetHandleSignalsStateNoLock());
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult DataPipeConsumerDispatcher::BeginReadData(const void** buffer,
-                                                     uint32_t* buffer_num_bytes,
-                                                     MojoReadDataFlags flags) {
-  base::AutoLock lock(lock_);
-  if (!shared_ring_buffer_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (in_two_phase_read_)
-    return MOJO_RESULT_BUSY;
-
-  // These flags may not be used in two-phase mode.
-  if ((flags & MOJO_READ_DATA_FLAG_DISCARD) ||
-      (flags & MOJO_READ_DATA_FLAG_QUERY) ||
-      (flags & MOJO_READ_DATA_FLAG_PEEK))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  const bool had_new_data = new_data_available_;
-  new_data_available_ = false;
-
-  if (bytes_available_ == 0) {
-    if (had_new_data)
-      watchers_.NotifyState(GetHandleSignalsStateNoLock());
-    return peer_closed_ ? MOJO_RESULT_FAILED_PRECONDITION
-                        : MOJO_RESULT_SHOULD_WAIT;
-  }
-
-  DCHECK_LT(read_offset_, options_.capacity_num_bytes);
-  uint32_t bytes_to_read = std::min(bytes_available_,
-                                    options_.capacity_num_bytes - read_offset_);
-
-  CHECK(ring_buffer_mapping_);
-  uint8_t* data = static_cast<uint8_t*>(ring_buffer_mapping_->GetBase());
-  CHECK(data);
-
-  in_two_phase_read_ = true;
-  *buffer = data + read_offset_;
-  *buffer_num_bytes = bytes_to_read;
-  two_phase_max_bytes_read_ = bytes_to_read;
-
-  if (had_new_data)
-    watchers_.NotifyState(GetHandleSignalsStateNoLock());
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult DataPipeConsumerDispatcher::EndReadData(uint32_t num_bytes_read) {
-  base::AutoLock lock(lock_);
-  if (!in_two_phase_read_)
-    return MOJO_RESULT_FAILED_PRECONDITION;
-
-  if (in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  CHECK(shared_ring_buffer_);
-
-  MojoResult rv;
-  if (num_bytes_read > two_phase_max_bytes_read_ ||
-      num_bytes_read % options_.element_num_bytes != 0) {
-    rv = MOJO_RESULT_INVALID_ARGUMENT;
-  } else {
-    rv = MOJO_RESULT_OK;
-    read_offset_ =
-        (read_offset_ + num_bytes_read) % options_.capacity_num_bytes;
-
-    DCHECK_GE(bytes_available_, num_bytes_read);
-    bytes_available_ -= num_bytes_read;
-
-    base::AutoUnlock unlock(lock_);
-    NotifyRead(num_bytes_read);
-  }
-
-  in_two_phase_read_ = false;
-  two_phase_max_bytes_read_ = 0;
-
-  watchers_.NotifyState(GetHandleSignalsStateNoLock());
-
-  return rv;
-}
-
-HandleSignalsState DataPipeConsumerDispatcher::GetHandleSignalsState() const {
-  base::AutoLock lock(lock_);
-  return GetHandleSignalsStateNoLock();
-}
-
-MojoResult DataPipeConsumerDispatcher::AddWatcherRef(
-    const scoped_refptr<WatcherDispatcher>& watcher,
-    uintptr_t context) {
-  base::AutoLock lock(lock_);
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watchers_.Add(watcher, context, GetHandleSignalsStateNoLock());
-}
-
-MojoResult DataPipeConsumerDispatcher::RemoveWatcherRef(
-    WatcherDispatcher* watcher,
-    uintptr_t context) {
-  base::AutoLock lock(lock_);
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watchers_.Remove(watcher, context);
-}
-
-void DataPipeConsumerDispatcher::StartSerialize(uint32_t* num_bytes,
-                                                uint32_t* num_ports,
-                                                uint32_t* num_handles) {
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  *num_bytes = static_cast<uint32_t>(sizeof(SerializedState));
-  *num_ports = 1;
-  *num_handles = 1;
-}
-
-bool DataPipeConsumerDispatcher::EndSerialize(
-    void* destination,
-    ports::PortName* ports,
-    PlatformHandle* platform_handles) {
-  SerializedState* state = static_cast<SerializedState*>(destination);
-  memcpy(&state->options, &options_, sizeof(MojoCreateDataPipeOptions));
-  memset(state->padding, 0, sizeof(state->padding));
-
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  state->pipe_id = pipe_id_;
-  state->read_offset = read_offset_;
-  state->bytes_available = bytes_available_;
-  state->flags = peer_closed_ ? kFlagPeerClosed : 0;
-
-  ports[0] = control_port_.name();
-
-  buffer_handle_for_transit_ = shared_ring_buffer_->DuplicatePlatformHandle();
-  platform_handles[0] = buffer_handle_for_transit_.get();
-
-  return true;
-}
-
-bool DataPipeConsumerDispatcher::BeginTransit() {
-  base::AutoLock lock(lock_);
-  if (in_transit_)
-    return false;
-  in_transit_ = !in_two_phase_read_;
-  return in_transit_;
-}
-
-void DataPipeConsumerDispatcher::CompleteTransitAndClose() {
-  node_controller_->SetPortObserver(control_port_, nullptr);
-
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  in_transit_ = false;
-  transferred_ = true;
-  ignore_result(buffer_handle_for_transit_.release());
-  CloseNoLock();
-}
-
-void DataPipeConsumerDispatcher::CancelTransit() {
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  in_transit_ = false;
-  buffer_handle_for_transit_.reset();
-  UpdateSignalsStateNoLock();
-}
-
-// static
-scoped_refptr<DataPipeConsumerDispatcher>
-DataPipeConsumerDispatcher::Deserialize(const void* data,
-                                        size_t num_bytes,
-                                        const ports::PortName* ports,
-                                        size_t num_ports,
-                                        PlatformHandle* handles,
-                                        size_t num_handles) {
-  if (num_ports != 1 || num_handles != 1 ||
-      num_bytes != sizeof(SerializedState)) {
-    return nullptr;
-  }
-
-  const SerializedState* state = static_cast<const SerializedState*>(data);
-
-  NodeController* node_controller = internal::g_core->GetNodeController();
-  ports::PortRef port;
-  if (node_controller->node()->GetPort(ports[0], &port) != ports::OK)
-    return nullptr;
-
-  PlatformHandle buffer_handle;
-  std::swap(buffer_handle, handles[0]);
-  scoped_refptr<PlatformSharedBuffer> ring_buffer =
-      PlatformSharedBuffer::CreateFromPlatformHandle(
-          state->options.capacity_num_bytes,
-          false /* read_only */,
-          ScopedPlatformHandle(buffer_handle));
-  if (!ring_buffer) {
-    DLOG(ERROR) << "Failed to deserialize shared buffer handle.";
-    return nullptr;
-  }
-
-  scoped_refptr<DataPipeConsumerDispatcher> dispatcher =
-      new DataPipeConsumerDispatcher(node_controller, port, ring_buffer,
-                                     state->options, false /* initialized */,
-                                     state->pipe_id);
-
-  {
-    base::AutoLock lock(dispatcher->lock_);
-    dispatcher->read_offset_ = state->read_offset;
-    dispatcher->bytes_available_ = state->bytes_available;
-    dispatcher->new_data_available_ = state->bytes_available > 0;
-    dispatcher->peer_closed_ = state->flags & kFlagPeerClosed;
-    dispatcher->InitializeNoLock();
-    dispatcher->UpdateSignalsStateNoLock();
-  }
-
-  return dispatcher;
-}
-
-DataPipeConsumerDispatcher::~DataPipeConsumerDispatcher() {
-  DCHECK(is_closed_ && !shared_ring_buffer_ && !ring_buffer_mapping_ &&
-         !in_transit_);
-}
-
-void DataPipeConsumerDispatcher::InitializeNoLock() {
-  lock_.AssertAcquired();
-
-  if (shared_ring_buffer_) {
-    DCHECK(!ring_buffer_mapping_);
-    ring_buffer_mapping_ =
-        shared_ring_buffer_->Map(0, options_.capacity_num_bytes);
-    if (!ring_buffer_mapping_) {
-      DLOG(ERROR) << "Failed to map shared buffer.";
-      shared_ring_buffer_ = nullptr;
-    }
-  }
-
-  base::AutoUnlock unlock(lock_);
-  node_controller_->SetPortObserver(
-      control_port_,
-      make_scoped_refptr(new PortObserverThunk(this)));
-}
-
-MojoResult DataPipeConsumerDispatcher::CloseNoLock() {
-  lock_.AssertAcquired();
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  is_closed_ = true;
-  ring_buffer_mapping_.reset();
-  shared_ring_buffer_ = nullptr;
-
-  watchers_.NotifyClosed();
-  if (!transferred_) {
-    base::AutoUnlock unlock(lock_);
-    node_controller_->ClosePort(control_port_);
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-HandleSignalsState
-DataPipeConsumerDispatcher::GetHandleSignalsStateNoLock() const {
-  lock_.AssertAcquired();
-
-  HandleSignalsState rv;
-  if (shared_ring_buffer_ && bytes_available_) {
-    if (!in_two_phase_read_) {
-      rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-      if (new_data_available_)
-        rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE;
-    }
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-  } else if (!peer_closed_ && shared_ring_buffer_) {
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-  }
-
-  if (shared_ring_buffer_) {
-    if (new_data_available_ || !peer_closed_)
-      rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE;
-  }
-
-  if (peer_closed_)
-    rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-  rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-
-  return rv;
-}
-
-void DataPipeConsumerDispatcher::NotifyRead(uint32_t num_bytes) {
-  DVLOG(1) << "Data pipe consumer " << pipe_id_ << " notifying peer: "
-           << num_bytes << " bytes read. [control_port="
-           << control_port_.name() << "]";
-
-  SendDataPipeControlMessage(node_controller_, control_port_,
-                             DataPipeCommand::DATA_WAS_READ, num_bytes);
-}
-
-void DataPipeConsumerDispatcher::OnPortStatusChanged() {
-  DCHECK(RequestContext::current());
-
-  base::AutoLock lock(lock_);
-
-  // We stop observing the control port as soon it's transferred, but this can
-  // race with events which are raised right before that happens. This is fine
-  // to ignore.
-  if (transferred_)
-    return;
-
-  DVLOG(1) << "Control port status changed for data pipe producer " << pipe_id_;
-
-  UpdateSignalsStateNoLock();
-}
-
-void DataPipeConsumerDispatcher::UpdateSignalsStateNoLock() {
-  lock_.AssertAcquired();
-
-  bool was_peer_closed = peer_closed_;
-  size_t previous_bytes_available = bytes_available_;
-
-  ports::PortStatus port_status;
-  int rv = node_controller_->node()->GetStatus(control_port_, &port_status);
-  if (rv != ports::OK || !port_status.receiving_messages) {
-    DVLOG(1) << "Data pipe consumer " << pipe_id_ << " is aware of peer closure"
-             << " [control_port=" << control_port_.name() << "]";
-    peer_closed_ = true;
-  } else if (rv == ports::OK && port_status.has_messages && !in_transit_) {
-    ports::ScopedMessage message;
-    do {
-      int rv = node_controller_->node()->GetMessage(
-          control_port_, &message, nullptr);
-      if (rv != ports::OK)
-        peer_closed_ = true;
-      if (message) {
-        if (message->num_payload_bytes() < sizeof(DataPipeControlMessage)) {
-          peer_closed_ = true;
-          break;
-        }
-
-        const DataPipeControlMessage* m =
-            static_cast<const DataPipeControlMessage*>(
-                message->payload_bytes());
-
-        if (m->command != DataPipeCommand::DATA_WAS_WRITTEN) {
-          DLOG(ERROR) << "Unexpected control message from producer.";
-          peer_closed_ = true;
-          break;
-        }
-
-        if (static_cast<size_t>(bytes_available_) + m->num_bytes >
-              options_.capacity_num_bytes) {
-          DLOG(ERROR) << "Producer claims to have written too many bytes.";
-          peer_closed_ = true;
-          break;
-        }
-
-        DVLOG(1) << "Data pipe consumer " << pipe_id_ << " is aware that "
-                 << m->num_bytes << " bytes were written. [control_port="
-                 << control_port_.name() << "]";
-
-        bytes_available_ += m->num_bytes;
-      }
-    } while (message);
-  }
-
-  bool has_new_data = bytes_available_ != previous_bytes_available;
-  if (has_new_data)
-    new_data_available_ = true;
-
-  if (peer_closed_ != was_peer_closed || has_new_data)
-    watchers_.NotifyState(GetHandleSignalsStateNoLock());
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_consumer_dispatcher.h b/mojo/edk/system/data_pipe_consumer_dispatcher.h
deleted file mode 100644
index 120c7a3..0000000
--- a/mojo/edk/system/data_pipe_consumer_dispatcher.h
+++ /dev/null
@@ -1,123 +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.
-
-#ifndef MOJO_EDK_SYSTEM_DATA_PIPE_CONSUMER_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_DATA_PIPE_CONSUMER_DISPATCHER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/edk/system/watcher_set.h"
-
-namespace mojo {
-namespace edk {
-
-class NodeController;
-
-// This is the Dispatcher implementation for the consumer handle for data
-// pipes created by the Mojo primitive MojoCreateDataPipe(). This class is
-// thread-safe.
-class MOJO_SYSTEM_IMPL_EXPORT DataPipeConsumerDispatcher final
-    : public Dispatcher {
- public:
-  DataPipeConsumerDispatcher(
-      NodeController* node_controller,
-      const ports::PortRef& control_port,
-      scoped_refptr<PlatformSharedBuffer> shared_ring_buffer,
-      const MojoCreateDataPipeOptions& options,
-      bool initialized,
-      uint64_t pipe_id);
-
-  // Dispatcher:
-  Type GetType() const override;
-  MojoResult Close() override;
-  MojoResult ReadData(void* elements,
-                      uint32_t* num_bytes,
-                      MojoReadDataFlags flags) override;
-  MojoResult BeginReadData(const void** buffer,
-                           uint32_t* buffer_num_bytes,
-                           MojoReadDataFlags flags) override;
-  MojoResult EndReadData(uint32_t num_bytes_read) override;
-  HandleSignalsState GetHandleSignalsState() const override;
-  MojoResult AddWatcherRef(const scoped_refptr<WatcherDispatcher>& watcher,
-                           uintptr_t context) override;
-  MojoResult RemoveWatcherRef(WatcherDispatcher* watcher,
-                              uintptr_t context) override;
-  void StartSerialize(uint32_t* num_bytes,
-                      uint32_t* num_ports,
-                      uint32_t* num_handles) override;
-  bool EndSerialize(void* destination,
-                    ports::PortName* ports,
-                    PlatformHandle* handles) override;
-  bool BeginTransit() override;
-  void CompleteTransitAndClose() override;
-  void CancelTransit() override;
-
-  static scoped_refptr<DataPipeConsumerDispatcher>
-  Deserialize(const void* data,
-              size_t num_bytes,
-              const ports::PortName* ports,
-              size_t num_ports,
-              PlatformHandle* handles,
-              size_t num_handles);
-
- private:
-  class PortObserverThunk;
-  friend class PortObserverThunk;
-
-  ~DataPipeConsumerDispatcher() override;
-
-  void InitializeNoLock();
-  MojoResult CloseNoLock();
-  HandleSignalsState GetHandleSignalsStateNoLock() const;
-  void NotifyRead(uint32_t num_bytes);
-  void OnPortStatusChanged();
-  void UpdateSignalsStateNoLock();
-
-  const MojoCreateDataPipeOptions options_;
-  NodeController* const node_controller_;
-  const ports::PortRef control_port_;
-  const uint64_t pipe_id_;
-
-  // Guards access to the fields below.
-  mutable base::Lock lock_;
-
-  WatcherSet watchers_;
-
-  scoped_refptr<PlatformSharedBuffer> shared_ring_buffer_;
-  std::unique_ptr<PlatformSharedBufferMapping> ring_buffer_mapping_;
-  ScopedPlatformHandle buffer_handle_for_transit_;
-
-  bool in_two_phase_read_ = false;
-  uint32_t two_phase_max_bytes_read_ = 0;
-
-  bool in_transit_ = false;
-  bool is_closed_ = false;
-  bool peer_closed_ = false;
-  bool transferred_ = false;
-
-  uint32_t read_offset_ = 0;
-  uint32_t bytes_available_ = 0;
-
-  // Indicates whether any new data is available since the last read attempt.
-  bool new_data_available_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(DataPipeConsumerDispatcher);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_DATA_PIPE_CONSUMER_DISPATCHER_H_
diff --git a/mojo/edk/system/data_pipe_control_message.cc b/mojo/edk/system/data_pipe_control_message.cc
deleted file mode 100644
index 23873b8..0000000
--- a/mojo/edk/system/data_pipe_control_message.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/data_pipe_control_message.h"
-
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/ports_message.h"
-
-namespace mojo {
-namespace edk {
-
-void SendDataPipeControlMessage(NodeController* node_controller,
-                                const ports::PortRef& port,
-                                DataPipeCommand command,
-                                uint32_t num_bytes) {
-  std::unique_ptr<PortsMessage> message =
-      PortsMessage::NewUserMessage(sizeof(DataPipeControlMessage), 0, 0);
-  CHECK(message);
-
-  DataPipeControlMessage* data =
-      static_cast<DataPipeControlMessage*>(message->mutable_payload_bytes());
-  data->command = command;
-  data->num_bytes = num_bytes;
-
-  int rv = node_controller->SendMessage(port, std::move(message));
-  if (rv != ports::OK && rv != ports::ERROR_PORT_PEER_CLOSED) {
-    DLOG(ERROR) << "Unexpected failure sending data pipe control message: "
-                << rv;
-  }
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_control_message.h b/mojo/edk/system/data_pipe_control_message.h
deleted file mode 100644
index ec84ea3..0000000
--- a/mojo/edk/system/data_pipe_control_message.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_DATA_PIPE_CONTROL_MESSAGE_H_
-#define MOJO_EDK_SYSTEM_DATA_PIPE_CONTROL_MESSAGE_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/public/c/system/macros.h"
-
-namespace mojo {
-namespace edk {
-
-class NodeController;
-
-enum DataPipeCommand : uint32_t {
-  // Signal to the consumer that new data is available.
-  DATA_WAS_WRITTEN,
-
-  // Signal to the producer that data has been consumed.
-  DATA_WAS_READ,
-};
-
-// Message header for messages sent over a data pipe control port.
-struct MOJO_ALIGNAS(8) DataPipeControlMessage {
-  DataPipeCommand command;
-  uint32_t num_bytes;
-};
-
-void SendDataPipeControlMessage(NodeController* node_controller,
-                                const ports::PortRef& port,
-                                DataPipeCommand command,
-                                uint32_t num_bytes);
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_DATA_PIPE_CONTROL_MESSAGE_H_
diff --git a/mojo/edk/system/data_pipe_producer_dispatcher.cc b/mojo/edk/system/data_pipe_producer_dispatcher.cc
deleted file mode 100644
index b0102a6..0000000
--- a/mojo/edk/system/data_pipe_producer_dispatcher.cc
+++ /dev/null
@@ -1,507 +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.
-
-#include "mojo/edk/system/data_pipe_producer_dispatcher.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/data_pipe_control_message.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/ports_message.h"
-#include "mojo/edk/system/request_context.h"
-#include "mojo/public/c/system/data_pipe.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-const uint8_t kFlagPeerClosed = 0x01;
-
-#pragma pack(push, 1)
-
-struct SerializedState {
-  MojoCreateDataPipeOptions options;
-  uint64_t pipe_id;
-  uint32_t write_offset;
-  uint32_t available_capacity;
-  uint8_t flags;
-  char padding[7];
-};
-
-static_assert(sizeof(SerializedState) % 8 == 0,
-              "Invalid SerializedState size.");
-
-#pragma pack(pop)
-
-}  // namespace
-
-// A PortObserver which forwards to a DataPipeProducerDispatcher. This owns a
-// reference to the dispatcher to ensure it lives as long as the observed port.
-class DataPipeProducerDispatcher::PortObserverThunk
-    : public NodeController::PortObserver {
- public:
-  explicit PortObserverThunk(
-      scoped_refptr<DataPipeProducerDispatcher> dispatcher)
-      : dispatcher_(dispatcher) {}
-
- private:
-  ~PortObserverThunk() override {}
-
-  // NodeController::PortObserver:
-  void OnPortStatusChanged() override { dispatcher_->OnPortStatusChanged(); }
-
-  scoped_refptr<DataPipeProducerDispatcher> dispatcher_;
-
-  DISALLOW_COPY_AND_ASSIGN(PortObserverThunk);
-};
-
-DataPipeProducerDispatcher::DataPipeProducerDispatcher(
-    NodeController* node_controller,
-    const ports::PortRef& control_port,
-    scoped_refptr<PlatformSharedBuffer> shared_ring_buffer,
-    const MojoCreateDataPipeOptions& options,
-    bool initialized,
-    uint64_t pipe_id)
-    : options_(options),
-      node_controller_(node_controller),
-      control_port_(control_port),
-      pipe_id_(pipe_id),
-      watchers_(this),
-      shared_ring_buffer_(shared_ring_buffer),
-      available_capacity_(options_.capacity_num_bytes) {
-  if (initialized) {
-    base::AutoLock lock(lock_);
-    InitializeNoLock();
-  }
-}
-
-Dispatcher::Type DataPipeProducerDispatcher::GetType() const {
-  return Type::DATA_PIPE_PRODUCER;
-}
-
-MojoResult DataPipeProducerDispatcher::Close() {
-  base::AutoLock lock(lock_);
-  DVLOG(1) << "Closing data pipe producer " << pipe_id_;
-  return CloseNoLock();
-}
-
-MojoResult DataPipeProducerDispatcher::WriteData(const void* elements,
-                                                 uint32_t* num_bytes,
-                                                 MojoWriteDataFlags flags) {
-  base::AutoLock lock(lock_);
-  if (!shared_ring_buffer_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (in_two_phase_write_)
-    return MOJO_RESULT_BUSY;
-
-  if (peer_closed_)
-    return MOJO_RESULT_FAILED_PRECONDITION;
-
-  if (*num_bytes % options_.element_num_bytes != 0)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  if (*num_bytes == 0)
-    return MOJO_RESULT_OK;  // Nothing to do.
-
-  if ((flags & MOJO_WRITE_DATA_FLAG_ALL_OR_NONE) &&
-      (*num_bytes > available_capacity_)) {
-    // Don't return "should wait" since you can't wait for a specified amount of
-    // data.
-    return MOJO_RESULT_OUT_OF_RANGE;
-  }
-
-  DCHECK_LE(available_capacity_, options_.capacity_num_bytes);
-  uint32_t num_bytes_to_write = std::min(*num_bytes, available_capacity_);
-  if (num_bytes_to_write == 0)
-    return MOJO_RESULT_SHOULD_WAIT;
-
-  *num_bytes = num_bytes_to_write;
-
-  CHECK(ring_buffer_mapping_);
-  uint8_t* data = static_cast<uint8_t*>(ring_buffer_mapping_->GetBase());
-  CHECK(data);
-
-  const uint8_t* source = static_cast<const uint8_t*>(elements);
-  CHECK(source);
-
-  DCHECK_LE(write_offset_, options_.capacity_num_bytes);
-  uint32_t tail_bytes_to_write =
-      std::min(options_.capacity_num_bytes - write_offset_,
-               num_bytes_to_write);
-  uint32_t head_bytes_to_write = num_bytes_to_write - tail_bytes_to_write;
-
-  DCHECK_GT(tail_bytes_to_write, 0u);
-  memcpy(data + write_offset_, source, tail_bytes_to_write);
-  if (head_bytes_to_write > 0)
-    memcpy(data, source + tail_bytes_to_write, head_bytes_to_write);
-
-  DCHECK_LE(num_bytes_to_write, available_capacity_);
-  available_capacity_ -= num_bytes_to_write;
-  write_offset_ = (write_offset_ + num_bytes_to_write) %
-      options_.capacity_num_bytes;
-
-  watchers_.NotifyState(GetHandleSignalsStateNoLock());
-
-  base::AutoUnlock unlock(lock_);
-  NotifyWrite(num_bytes_to_write);
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult DataPipeProducerDispatcher::BeginWriteData(
-    void** buffer,
-    uint32_t* buffer_num_bytes,
-    MojoWriteDataFlags flags) {
-  base::AutoLock lock(lock_);
-  if (!shared_ring_buffer_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  // These flags may not be used in two-phase mode.
-  if (flags & MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (in_two_phase_write_)
-    return MOJO_RESULT_BUSY;
-  if (peer_closed_)
-    return MOJO_RESULT_FAILED_PRECONDITION;
-
-  if (available_capacity_ == 0) {
-    return peer_closed_ ? MOJO_RESULT_FAILED_PRECONDITION
-                        : MOJO_RESULT_SHOULD_WAIT;
-  }
-
-  in_two_phase_write_ = true;
-  *buffer_num_bytes = std::min(options_.capacity_num_bytes - write_offset_,
-                               available_capacity_);
-  DCHECK_GT(*buffer_num_bytes, 0u);
-
-  CHECK(ring_buffer_mapping_);
-  uint8_t* data = static_cast<uint8_t*>(ring_buffer_mapping_->GetBase());
-  *buffer = data + write_offset_;
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult DataPipeProducerDispatcher::EndWriteData(
-    uint32_t num_bytes_written) {
-  base::AutoLock lock(lock_);
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (!in_two_phase_write_)
-    return MOJO_RESULT_FAILED_PRECONDITION;
-
-  DCHECK(shared_ring_buffer_);
-  DCHECK(ring_buffer_mapping_);
-
-  // Note: Allow successful completion of the two-phase write even if the other
-  // side has been closed.
-  MojoResult rv = MOJO_RESULT_OK;
-  if (num_bytes_written > available_capacity_ ||
-      num_bytes_written % options_.element_num_bytes != 0 ||
-      write_offset_ + num_bytes_written > options_.capacity_num_bytes) {
-    rv = MOJO_RESULT_INVALID_ARGUMENT;
-  } else {
-    DCHECK_LE(num_bytes_written + write_offset_, options_.capacity_num_bytes);
-    available_capacity_ -= num_bytes_written;
-    write_offset_ = (write_offset_ + num_bytes_written) %
-        options_.capacity_num_bytes;
-
-    base::AutoUnlock unlock(lock_);
-    NotifyWrite(num_bytes_written);
-  }
-
-  in_two_phase_write_ = false;
-
-  // If we're now writable, we *became* writable (since we weren't writable
-  // during the two-phase write), so notify watchers.
-  watchers_.NotifyState(GetHandleSignalsStateNoLock());
-
-  return rv;
-}
-
-HandleSignalsState DataPipeProducerDispatcher::GetHandleSignalsState() const {
-  base::AutoLock lock(lock_);
-  return GetHandleSignalsStateNoLock();
-}
-
-MojoResult DataPipeProducerDispatcher::AddWatcherRef(
-    const scoped_refptr<WatcherDispatcher>& watcher,
-    uintptr_t context) {
-  base::AutoLock lock(lock_);
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watchers_.Add(watcher, context, GetHandleSignalsStateNoLock());
-}
-
-MojoResult DataPipeProducerDispatcher::RemoveWatcherRef(
-    WatcherDispatcher* watcher,
-    uintptr_t context) {
-  base::AutoLock lock(lock_);
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watchers_.Remove(watcher, context);
-}
-
-void DataPipeProducerDispatcher::StartSerialize(uint32_t* num_bytes,
-                                                uint32_t* num_ports,
-                                                uint32_t* num_handles) {
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  *num_bytes = sizeof(SerializedState);
-  *num_ports = 1;
-  *num_handles = 1;
-}
-
-bool DataPipeProducerDispatcher::EndSerialize(
-    void* destination,
-    ports::PortName* ports,
-    PlatformHandle* platform_handles) {
-  SerializedState* state = static_cast<SerializedState*>(destination);
-  memcpy(&state->options, &options_, sizeof(MojoCreateDataPipeOptions));
-  memset(state->padding, 0, sizeof(state->padding));
-
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  state->pipe_id = pipe_id_;
-  state->write_offset = write_offset_;
-  state->available_capacity = available_capacity_;
-  state->flags = peer_closed_ ? kFlagPeerClosed : 0;
-
-  ports[0] = control_port_.name();
-
-  buffer_handle_for_transit_ = shared_ring_buffer_->DuplicatePlatformHandle();
-  platform_handles[0] = buffer_handle_for_transit_.get();
-
-  return true;
-}
-
-bool DataPipeProducerDispatcher::BeginTransit() {
-  base::AutoLock lock(lock_);
-  if (in_transit_)
-    return false;
-  in_transit_ = !in_two_phase_write_;
-  return in_transit_;
-}
-
-void DataPipeProducerDispatcher::CompleteTransitAndClose() {
-  node_controller_->SetPortObserver(control_port_, nullptr);
-
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  transferred_ = true;
-  in_transit_ = false;
-  ignore_result(buffer_handle_for_transit_.release());
-  CloseNoLock();
-}
-
-void DataPipeProducerDispatcher::CancelTransit() {
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  in_transit_ = false;
-  buffer_handle_for_transit_.reset();
-
-  HandleSignalsState state = GetHandleSignalsStateNoLock();
-  watchers_.NotifyState(state);
-}
-
-// static
-scoped_refptr<DataPipeProducerDispatcher>
-DataPipeProducerDispatcher::Deserialize(const void* data,
-                                        size_t num_bytes,
-                                        const ports::PortName* ports,
-                                        size_t num_ports,
-                                        PlatformHandle* handles,
-                                        size_t num_handles) {
-  if (num_ports != 1 || num_handles != 1 ||
-      num_bytes != sizeof(SerializedState)) {
-    return nullptr;
-  }
-
-  const SerializedState* state = static_cast<const SerializedState*>(data);
-
-  NodeController* node_controller = internal::g_core->GetNodeController();
-  ports::PortRef port;
-  if (node_controller->node()->GetPort(ports[0], &port) != ports::OK)
-    return nullptr;
-
-  PlatformHandle buffer_handle;
-  std::swap(buffer_handle, handles[0]);
-  scoped_refptr<PlatformSharedBuffer> ring_buffer =
-      PlatformSharedBuffer::CreateFromPlatformHandle(
-          state->options.capacity_num_bytes,
-          false /* read_only */,
-          ScopedPlatformHandle(buffer_handle));
-  if (!ring_buffer) {
-    DLOG(ERROR) << "Failed to deserialize shared buffer handle.";
-    return nullptr;
-  }
-
-  scoped_refptr<DataPipeProducerDispatcher> dispatcher =
-      new DataPipeProducerDispatcher(node_controller, port, ring_buffer,
-                                     state->options, false /* initialized */,
-                                     state->pipe_id);
-
-  {
-    base::AutoLock lock(dispatcher->lock_);
-    dispatcher->write_offset_ = state->write_offset;
-    dispatcher->available_capacity_ = state->available_capacity;
-    dispatcher->peer_closed_ = state->flags & kFlagPeerClosed;
-    dispatcher->InitializeNoLock();
-    dispatcher->UpdateSignalsStateNoLock();
-  }
-
-  return dispatcher;
-}
-
-DataPipeProducerDispatcher::~DataPipeProducerDispatcher() {
-  DCHECK(is_closed_ && !in_transit_ && !shared_ring_buffer_ &&
-         !ring_buffer_mapping_);
-}
-
-void DataPipeProducerDispatcher::InitializeNoLock() {
-  lock_.AssertAcquired();
-
-  if (shared_ring_buffer_) {
-    ring_buffer_mapping_ =
-        shared_ring_buffer_->Map(0, options_.capacity_num_bytes);
-    if (!ring_buffer_mapping_) {
-      DLOG(ERROR) << "Failed to map shared buffer.";
-      shared_ring_buffer_ = nullptr;
-    }
-  }
-
-  base::AutoUnlock unlock(lock_);
-  node_controller_->SetPortObserver(
-      control_port_,
-      make_scoped_refptr(new PortObserverThunk(this)));
-}
-
-MojoResult DataPipeProducerDispatcher::CloseNoLock() {
-  lock_.AssertAcquired();
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  is_closed_ = true;
-  ring_buffer_mapping_.reset();
-  shared_ring_buffer_ = nullptr;
-
-  watchers_.NotifyClosed();
-  if (!transferred_) {
-    base::AutoUnlock unlock(lock_);
-    node_controller_->ClosePort(control_port_);
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-HandleSignalsState DataPipeProducerDispatcher::GetHandleSignalsStateNoLock()
-    const {
-  lock_.AssertAcquired();
-  HandleSignalsState rv;
-  if (!peer_closed_) {
-    if (!in_two_phase_write_ && shared_ring_buffer_ && available_capacity_ > 0)
-      rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_WRITABLE;
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_WRITABLE;
-  } else {
-    rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-  }
-  rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-  return rv;
-}
-
-void DataPipeProducerDispatcher::NotifyWrite(uint32_t num_bytes) {
-  DVLOG(1) << "Data pipe producer " << pipe_id_ << " notifying peer: "
-           << num_bytes << " bytes written. [control_port="
-           << control_port_.name() << "]";
-
-  SendDataPipeControlMessage(node_controller_, control_port_,
-                             DataPipeCommand::DATA_WAS_WRITTEN, num_bytes);
-}
-
-void DataPipeProducerDispatcher::OnPortStatusChanged() {
-  DCHECK(RequestContext::current());
-
-  base::AutoLock lock(lock_);
-
-  // We stop observing the control port as soon it's transferred, but this can
-  // race with events which are raised right before that happens. This is fine
-  // to ignore.
-  if (transferred_)
-    return;
-
-  DVLOG(1) << "Control port status changed for data pipe producer " << pipe_id_;
-
-  UpdateSignalsStateNoLock();
-}
-
-void DataPipeProducerDispatcher::UpdateSignalsStateNoLock() {
-  lock_.AssertAcquired();
-
-  bool was_peer_closed = peer_closed_;
-  size_t previous_capacity = available_capacity_;
-
-  ports::PortStatus port_status;
-  int rv = node_controller_->node()->GetStatus(control_port_, &port_status);
-  if (rv != ports::OK || !port_status.receiving_messages) {
-    DVLOG(1) << "Data pipe producer " << pipe_id_ << " is aware of peer closure"
-             << " [control_port=" << control_port_.name() << "]";
-    peer_closed_ = true;
-  } else if (rv == ports::OK && port_status.has_messages && !in_transit_) {
-    ports::ScopedMessage message;
-    do {
-      int rv = node_controller_->node()->GetMessage(
-          control_port_, &message, nullptr);
-      if (rv != ports::OK)
-        peer_closed_ = true;
-      if (message) {
-        if (message->num_payload_bytes() < sizeof(DataPipeControlMessage)) {
-          peer_closed_ = true;
-          break;
-        }
-
-        const DataPipeControlMessage* m =
-            static_cast<const DataPipeControlMessage*>(
-                message->payload_bytes());
-
-        if (m->command != DataPipeCommand::DATA_WAS_READ) {
-          DLOG(ERROR) << "Unexpected message from consumer.";
-          peer_closed_ = true;
-          break;
-        }
-
-        if (static_cast<size_t>(available_capacity_) + m->num_bytes >
-              options_.capacity_num_bytes) {
-          DLOG(ERROR) << "Consumer claims to have read too many bytes.";
-          break;
-        }
-
-        DVLOG(1) << "Data pipe producer " << pipe_id_ << " is aware that "
-                 << m->num_bytes << " bytes were read. [control_port="
-                 << control_port_.name() << "]";
-
-        available_capacity_ += m->num_bytes;
-      }
-    } while (message);
-  }
-
-  if (peer_closed_ != was_peer_closed ||
-      available_capacity_ != previous_capacity) {
-    watchers_.NotifyState(GetHandleSignalsStateNoLock());
-  }
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_producer_dispatcher.h b/mojo/edk/system/data_pipe_producer_dispatcher.h
deleted file mode 100644
index 1eddd5d..0000000
--- a/mojo/edk/system/data_pipe_producer_dispatcher.h
+++ /dev/null
@@ -1,123 +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.
-
-#ifndef MOJO_EDK_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/edk/system/watcher_set.h"
-
-namespace mojo {
-namespace edk {
-
-struct DataPipeControlMessage;
-class NodeController;
-
-// This is the Dispatcher implementation for the producer handle for data
-// pipes created by the Mojo primitive MojoCreateDataPipe(). This class is
-// thread-safe.
-class MOJO_SYSTEM_IMPL_EXPORT DataPipeProducerDispatcher final
-    : public Dispatcher {
- public:
-  DataPipeProducerDispatcher(
-      NodeController* node_controller,
-      const ports::PortRef& port,
-      scoped_refptr<PlatformSharedBuffer> shared_ring_buffer,
-      const MojoCreateDataPipeOptions& options,
-      bool initialized,
-      uint64_t pipe_id);
-
-  // Dispatcher:
-  Type GetType() const override;
-  MojoResult Close() override;
-  MojoResult WriteData(const void* elements,
-                       uint32_t* num_bytes,
-                       MojoReadDataFlags flags) override;
-  MojoResult BeginWriteData(void** buffer,
-                            uint32_t* buffer_num_bytes,
-                            MojoWriteDataFlags flags) override;
-  MojoResult EndWriteData(uint32_t num_bytes_written) override;
-  HandleSignalsState GetHandleSignalsState() const override;
-  MojoResult AddWatcherRef(const scoped_refptr<WatcherDispatcher>& watcher,
-                           uintptr_t context) override;
-  MojoResult RemoveWatcherRef(WatcherDispatcher* watcher,
-                              uintptr_t context) override;
-  void StartSerialize(uint32_t* num_bytes,
-                      uint32_t* num_ports,
-                      uint32_t* num_handles) override;
-  bool EndSerialize(void* destination,
-                    ports::PortName* ports,
-                    PlatformHandle* handles) override;
-  bool BeginTransit() override;
-  void CompleteTransitAndClose() override;
-  void CancelTransit() override;
-
-  static scoped_refptr<DataPipeProducerDispatcher>
-  Deserialize(const void* data,
-              size_t num_bytes,
-              const ports::PortName* ports,
-              size_t num_ports,
-              PlatformHandle* handles,
-              size_t num_handles);
-
- private:
-  class PortObserverThunk;
-  friend class PortObserverThunk;
-
-  ~DataPipeProducerDispatcher() override;
-
-  void OnSharedBufferCreated(const scoped_refptr<PlatformSharedBuffer>& buffer);
-  void InitializeNoLock();
-  MojoResult CloseNoLock();
-  HandleSignalsState GetHandleSignalsStateNoLock() const;
-  void NotifyWrite(uint32_t num_bytes);
-  void OnPortStatusChanged();
-  void UpdateSignalsStateNoLock();
-  bool ProcessMessageNoLock(const DataPipeControlMessage& message,
-                            ScopedPlatformHandleVectorPtr handles);
-
-  const MojoCreateDataPipeOptions options_;
-  NodeController* const node_controller_;
-  const ports::PortRef control_port_;
-  const uint64_t pipe_id_;
-
-  // Guards access to the fields below.
-  mutable base::Lock lock_;
-
-  WatcherSet watchers_;
-
-  bool buffer_requested_ = false;
-
-  scoped_refptr<PlatformSharedBuffer> shared_ring_buffer_;
-  std::unique_ptr<PlatformSharedBufferMapping> ring_buffer_mapping_;
-  ScopedPlatformHandle buffer_handle_for_transit_;
-
-  bool in_transit_ = false;
-  bool is_closed_ = false;
-  bool peer_closed_ = false;
-  bool transferred_ = false;
-  bool in_two_phase_write_ = false;
-
-  uint32_t write_offset_ = 0;
-  uint32_t available_capacity_;
-
-  DISALLOW_COPY_AND_ASSIGN(DataPipeProducerDispatcher);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_
diff --git a/mojo/edk/system/data_pipe_unittest.cc b/mojo/edk/system/data_pipe_unittest.cc
deleted file mode 100644
index 79c1f75..0000000
--- a/mojo/edk/system/data_pipe_unittest.cc
+++ /dev/null
@@ -1,2034 +0,0 @@
-// Copyright 2015 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 <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-const uint32_t kSizeOfOptions =
-    static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions));
-
-// In various places, we have to poll (since, e.g., we can't yet wait for a
-// certain amount of data to be available). This is the maximum number of
-// iterations (separated by a short sleep).
-// TODO(vtl): Get rid of this.
-const size_t kMaxPoll = 100;
-
-// Used in Multiprocess test.
-const size_t kMultiprocessCapacity = 37;
-const char kMultiprocessTestData[] = "hello i'm a string that is 36 bytes";
-const int kMultiprocessMaxIter = 5;
-
-// TODO(rockot): There are many uses of ASSERT where EXPECT would be more
-// appropriate. Fix this.
-
-class DataPipeTest : public test::MojoTestBase {
- public:
-  DataPipeTest() : producer_(MOJO_HANDLE_INVALID),
-                   consumer_(MOJO_HANDLE_INVALID) {}
-
-  ~DataPipeTest() override {
-    if (producer_ != MOJO_HANDLE_INVALID)
-      CHECK_EQ(MOJO_RESULT_OK, MojoClose(producer_));
-    if (consumer_ != MOJO_HANDLE_INVALID)
-      CHECK_EQ(MOJO_RESULT_OK, MojoClose(consumer_));
-  }
-
-  MojoResult Create(const MojoCreateDataPipeOptions* options) {
-    return MojoCreateDataPipe(options, &producer_, &consumer_);
-  }
-
-  MojoResult WriteData(const void* elements,
-                       uint32_t* num_bytes,
-                       bool all_or_none = false) {
-    return MojoWriteData(producer_, elements, num_bytes,
-                         all_or_none ? MOJO_WRITE_DATA_FLAG_ALL_OR_NONE
-                                     : MOJO_WRITE_DATA_FLAG_NONE);
-  }
-
-  MojoResult ReadData(void* elements,
-                      uint32_t* num_bytes,
-                      bool all_or_none = false,
-                      bool peek = false) {
-    MojoReadDataFlags flags = MOJO_READ_DATA_FLAG_NONE;
-    if (all_or_none)
-      flags |= MOJO_READ_DATA_FLAG_ALL_OR_NONE;
-    if (peek)
-      flags |= MOJO_READ_DATA_FLAG_PEEK;
-    return MojoReadData(consumer_, elements, num_bytes, flags);
-  }
-
-  MojoResult QueryData(uint32_t* num_bytes) {
-    return MojoReadData(consumer_, nullptr, num_bytes,
-                        MOJO_READ_DATA_FLAG_QUERY);
-  }
-
-  MojoResult DiscardData(uint32_t* num_bytes, bool all_or_none = false) {
-    MojoReadDataFlags flags = MOJO_READ_DATA_FLAG_DISCARD;
-    if (all_or_none)
-      flags |= MOJO_READ_DATA_FLAG_ALL_OR_NONE;
-    return MojoReadData(consumer_, nullptr, num_bytes, flags);
-  }
-
-  MojoResult BeginReadData(const void** elements,
-                           uint32_t* num_bytes,
-                           bool all_or_none = false) {
-    MojoReadDataFlags flags = MOJO_READ_DATA_FLAG_NONE;
-    if (all_or_none)
-      flags |= MOJO_READ_DATA_FLAG_ALL_OR_NONE;
-    return MojoBeginReadData(consumer_, elements, num_bytes, flags);
-  }
-
-  MojoResult EndReadData(uint32_t num_bytes_read) {
-    return MojoEndReadData(consumer_, num_bytes_read);
-  }
-
-  MojoResult BeginWriteData(void** elements,
-                            uint32_t* num_bytes,
-                            bool all_or_none = false) {
-    MojoReadDataFlags flags = MOJO_WRITE_DATA_FLAG_NONE;
-    if (all_or_none)
-      flags |= MOJO_WRITE_DATA_FLAG_ALL_OR_NONE;
-    return MojoBeginWriteData(producer_, elements, num_bytes, flags);
-  }
-
-  MojoResult EndWriteData(uint32_t num_bytes_written) {
-    return MojoEndWriteData(producer_, num_bytes_written);
-  }
-
-  MojoResult CloseProducer() {
-    MojoResult rv = MojoClose(producer_);
-    producer_ = MOJO_HANDLE_INVALID;
-    return rv;
-  }
-
-  MojoResult CloseConsumer() {
-    MojoResult rv = MojoClose(consumer_);
-    consumer_ = MOJO_HANDLE_INVALID;
-    return rv;
-  }
-
-  MojoHandle producer_, consumer_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(DataPipeTest);
-};
-
-TEST_F(DataPipeTest, Basic) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-
-  // We can write to a data pipe handle immediately.
-  int32_t elements[10] = {};
-  uint32_t num_bytes = 0;
-
-  num_bytes =
-      static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0]));
-
-  elements[0] = 123;
-  elements[1] = 456;
-  num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(&elements[0], &num_bytes));
-
-  // Now wait for the other side to become readable.
-  MojoHandleSignalsState state;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            state.satisfied_signals);
-
-  elements[0] = -1;
-  elements[1] = -1;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(&elements[0], &num_bytes));
-  ASSERT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes);
-  ASSERT_EQ(elements[0], 123);
-  ASSERT_EQ(elements[1], 456);
-}
-
-// Tests creation of data pipes with various (valid) options.
-TEST_F(DataPipeTest, CreateAndMaybeTransfer) {
-  MojoCreateDataPipeOptions test_options[] = {
-      // Default options.
-      {},
-      // Trivial element size, non-default capacity.
-      {kSizeOfOptions,                           // |struct_size|.
-       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-       1,                                        // |element_num_bytes|.
-       1000},                                    // |capacity_num_bytes|.
-      // Nontrivial element size, non-default capacity.
-      {kSizeOfOptions,                           // |struct_size|.
-       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-       4,                                        // |element_num_bytes|.
-       4000},                                    // |capacity_num_bytes|.
-      // Nontrivial element size, default capacity.
-      {kSizeOfOptions,                           // |struct_size|.
-       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-       100,                                      // |element_num_bytes|.
-       0}                                        // |capacity_num_bytes|.
-  };
-  for (size_t i = 0; i < arraysize(test_options); i++) {
-    MojoHandle producer_handle, consumer_handle;
-    MojoCreateDataPipeOptions* options =
-        i ? &test_options[i] : nullptr;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoCreateDataPipe(options, &producer_handle, &consumer_handle));
-    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(producer_handle));
-    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(consumer_handle));
-  }
-}
-
-TEST_F(DataPipeTest, SimpleReadWrite) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  int32_t elements[10] = {};
-  uint32_t num_bytes = 0;
-
-  // Try reading; nothing there yet.
-  num_bytes =
-      static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadData(elements, &num_bytes));
-
-  // Query; nothing there yet.
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Discard; nothing there yet.
-  num_bytes = static_cast<uint32_t>(5u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, DiscardData(&num_bytes));
-
-  // Read with invalid |num_bytes|.
-  num_bytes = sizeof(elements[0]) + 1;
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, ReadData(elements, &num_bytes));
-
-  // Write two elements.
-  elements[0] = 123;
-  elements[1] = 456;
-  num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes));
-  // It should have written everything (even without "all or none").
-  ASSERT_EQ(2u * sizeof(elements[0]), num_bytes);
-
-  // Wait.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Query.
-  // TODO(vtl): It's theoretically possible (though not with the current
-  // implementation/configured limits) that not all the data has arrived yet.
-  // (The theoretically-correct assertion here is that |num_bytes| is |1 * ...|
-  // or |2 * ...|.)
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(2 * sizeof(elements[0]), num_bytes);
-
-  // Read one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes));
-  ASSERT_EQ(1u * sizeof(elements[0]), num_bytes);
-  ASSERT_EQ(123, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Query.
-  // TODO(vtl): See previous TODO. (If we got 2 elements there, however, we
-  // should get 1 here.)
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(1 * sizeof(elements[0]), num_bytes);
-
-  // Peek one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, false, true));
-  ASSERT_EQ(1u * sizeof(elements[0]), num_bytes);
-  ASSERT_EQ(456, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Query. Still has 1 element remaining.
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(1 * sizeof(elements[0]), num_bytes);
-
-  // Try to read two elements, with "all or none".
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            ReadData(elements, &num_bytes, true, false));
-  ASSERT_EQ(-1, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Try to read two elements, without "all or none".
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, false, false));
-  ASSERT_EQ(1u * sizeof(elements[0]), num_bytes);
-  ASSERT_EQ(456, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Query.
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-}
-
-// Note: The "basic" waiting tests test that the "wait states" are correct in
-// various situations; they don't test that waiters are properly awoken on state
-// changes. (For that, we need to use multiple threads.)
-TEST_F(DataPipeTest, BasicProducerWaiting) {
-  // Note: We take advantage of the fact that current for current
-  // implementations capacities are strict maximums. This is not guaranteed by
-  // the API.
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      2 * sizeof(int32_t)                       // |capacity_num_bytes|.
-  };
-  Create(&options);
-  MojoHandleSignalsState hss;
-
-  // Never readable. Already writable.
-  hss = GetSignalsState(producer_);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Write two elements.
-  int32_t elements[2] = {123, 456};
-  uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes, true));
-  ASSERT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes);
-
-  // Wait for data to become available to the consumer.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Peek one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, true, true));
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-  ASSERT_EQ(123, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Read one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, true, false));
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-  ASSERT_EQ(123, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Try writing, using a two-phase write.
-  void* buffer = nullptr;
-  num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&buffer, &num_bytes));
-  EXPECT_TRUE(buffer);
-  ASSERT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(elements[0])));
-
-  static_cast<int32_t*>(buffer)[0] = 789;
-  ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(static_cast<uint32_t>(
-                                         1u * sizeof(elements[0]))));
-
-  // Read one element, using a two-phase read.
-  const void* read_buffer = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginReadData(&read_buffer, &num_bytes, false));
-  EXPECT_TRUE(read_buffer);
-  // The two-phase read should be able to read at least one element.
-  ASSERT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(elements[0])));
-  ASSERT_EQ(456, static_cast<const int32_t*>(read_buffer)[0]);
-  ASSERT_EQ(MOJO_RESULT_OK, EndReadData(static_cast<uint32_t>(
-                                        1u * sizeof(elements[0]))));
-
-  // Write one element.
-  elements[0] = 123;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes));
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-
-  // Close the consumer.
-  CloseConsumer();
-
-  // It should now be never-writable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(producer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-}
-
-TEST_F(DataPipeTest, PeerClosedProducerWaiting) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      2 * sizeof(int32_t)                       // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Close the consumer.
-  CloseConsumer();
-
-  // It should be signaled.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(producer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-}
-
-TEST_F(DataPipeTest, PeerClosedConsumerWaiting) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      2 * sizeof(int32_t)                       // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Close the producer.
-  CloseProducer();
-
-  // It should be signaled.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-}
-
-TEST_F(DataPipeTest, BasicConsumerWaiting) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Never writable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
-  EXPECT_EQ(0u, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Write two elements.
-  int32_t elements[2] = {123, 456};
-  uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes, true));
-
-  // Wait for readability.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Discard one element.
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, DiscardData(&num_bytes, true));
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-
-  // Should still be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Peek one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, true, true));
-  ASSERT_EQ(456, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Should still be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Read one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, true));
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-  ASSERT_EQ(456, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Write one element.
-  elements[0] = 789;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes, true));
-
-  // Waiting should now succeed.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Close the producer.
-  CloseProducer();
-
-  // Should still be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_TRUE(hss.satisfied_signals & (MOJO_HANDLE_SIGNAL_READABLE |
-                                       MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Wait for the peer closed signal.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Read one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, true));
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-  ASSERT_EQ(789, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Should be never-readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-}
-
-TEST_F(DataPipeTest, ConsumerNewDataReadable) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-  EXPECT_EQ(MOJO_RESULT_OK, Create(&options));
-
-  int32_t elements[2] = {123, 456};
-  uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  EXPECT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes, true));
-
-  // The consumer handle should appear to be readable and have new data.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE));
-  EXPECT_TRUE(GetSignalsState(consumer_).satisfied_signals &
-              MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE);
-
-  // Now try to read a minimum of 6 elements.
-  int32_t read_elements[6];
-  uint32_t num_read_bytes = sizeof(read_elements);
-  EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            MojoReadData(consumer_, read_elements, &num_read_bytes,
-                         MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-  // The consumer should still appear to be readable but not with new data.
-  EXPECT_TRUE(GetSignalsState(consumer_).satisfied_signals &
-              MOJO_HANDLE_SIGNAL_READABLE);
-  EXPECT_FALSE(GetSignalsState(consumer_).satisfied_signals &
-               MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE);
-
-  // Write four more elements.
-  EXPECT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes, true));
-  EXPECT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes, true));
-
-  // The consumer handle should once again appear to be readable.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE));
-
-  // Try again to read a minimum of 6 elements. Should succeed this time.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadData(consumer_, read_elements, &num_read_bytes,
-                         MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-  // And now the consumer is unreadable.
-  EXPECT_FALSE(GetSignalsState(consumer_).satisfied_signals &
-               MOJO_HANDLE_SIGNAL_READABLE);
-  EXPECT_FALSE(GetSignalsState(consumer_).satisfied_signals &
-               MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE);
-}
-
-// Test with two-phase APIs and also closing the producer with an active
-// consumer waiter.
-TEST_F(DataPipeTest, ConsumerWaitingTwoPhase) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Write two elements.
-  int32_t* elements = nullptr;
-  void* buffer = nullptr;
-  // Request room for three (but we'll only write two).
-  uint32_t num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&buffer, &num_bytes, false));
-  EXPECT_TRUE(buffer);
-  EXPECT_GE(num_bytes, static_cast<uint32_t>(3u * sizeof(elements[0])));
-  elements = static_cast<int32_t*>(buffer);
-  elements[0] = 123;
-  elements[1] = 456;
-  ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(2u * sizeof(elements[0])));
-
-  // Wait for readability.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Read one element.
-  // Request two in all-or-none mode, but only read one.
-  const void* read_buffer = nullptr;
-  num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_buffer, &num_bytes, true));
-  EXPECT_TRUE(read_buffer);
-  ASSERT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes);
-  const int32_t* read_elements = static_cast<const int32_t*>(read_buffer);
-  ASSERT_EQ(123, read_elements[0]);
-  ASSERT_EQ(MOJO_RESULT_OK, EndReadData(1u * sizeof(elements[0])));
-
-  // Should still be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Read one element.
-  // Request three, but not in all-or-none mode.
-  read_buffer = nullptr;
-  num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_buffer, &num_bytes));
-  EXPECT_TRUE(read_buffer);
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-  read_elements = static_cast<const int32_t*>(read_buffer);
-  ASSERT_EQ(456, read_elements[0]);
-  ASSERT_EQ(MOJO_RESULT_OK, EndReadData(1u * sizeof(elements[0])));
-
-  // Close the producer.
-  CloseProducer();
-
-  // Should be never-readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-}
-
-// Tests that data pipes aren't writable/readable during two-phase writes/reads.
-TEST_F(DataPipeTest, BasicTwoPhaseWaiting) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // It should be writable.
-  hss = GetSignalsState(producer_);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
-  void* write_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_ptr, &num_bytes));
-  EXPECT_TRUE(write_ptr);
-  EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
-
-  // At this point, it shouldn't be writable.
-  hss = GetSignalsState(producer_);
-  ASSERT_EQ(0u, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // It shouldn't be readable yet either (we'll wait later).
-  hss = GetSignalsState(consumer_);
-  ASSERT_EQ(0u, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  static_cast<int32_t*>(write_ptr)[0] = 123;
-  ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(1u * sizeof(int32_t)));
-
-  // It should immediately be writable again.
-  hss = GetSignalsState(producer_);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // It should become readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Start another two-phase write and check that it's readable even in the
-  // middle of it.
-  num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
-  write_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_ptr, &num_bytes));
-  EXPECT_TRUE(write_ptr);
-  EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
-
-  // It should be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // End the two-phase write without writing anything.
-  ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(0u));
-
-  // Start a two-phase read.
-  num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
-  const void* read_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_ptr, &num_bytes));
-  EXPECT_TRUE(read_ptr);
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes);
-
-  // At this point, it should still be writable.
-  hss = GetSignalsState(producer_);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // But not readable.
-  hss = GetSignalsState(consumer_);
-  ASSERT_EQ(0u, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // End the two-phase read without reading anything.
-  ASSERT_EQ(MOJO_RESULT_OK, EndReadData(0u));
-
-  // It should be readable again.
-  hss = GetSignalsState(consumer_);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-}
-
-void Seq(int32_t start, size_t count, int32_t* out) {
-  for (size_t i = 0; i < count; i++)
-    out[i] = start + static_cast<int32_t>(i);
-}
-
-TEST_F(DataPipeTest, AllOrNone) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      10 * sizeof(int32_t)                      // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Try writing more than the total capacity of the pipe.
-  uint32_t num_bytes = 20u * sizeof(int32_t);
-  int32_t buffer[100];
-  Seq(0, arraysize(buffer), buffer);
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE, WriteData(buffer, &num_bytes, true));
-
-  // Should still be empty.
-  num_bytes = ~0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Write some data.
-  num_bytes = 5u * sizeof(int32_t);
-  Seq(100, arraysize(buffer), buffer);
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(buffer, &num_bytes, true));
-  ASSERT_EQ(5u * sizeof(int32_t), num_bytes);
-
-  // Wait for data.
-  // TODO(vtl): There's no real guarantee that all the data will become
-  // available at once (except that in current implementations, with reasonable
-  // limits, it will). Eventually, we'll be able to wait for a specified amount
-  // of data to become available.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Half full.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(5u * sizeof(int32_t), num_bytes);
-
-  // Try writing more than the available capacity of the pipe, but less than the
-  // total capacity.
-  num_bytes = 6u * sizeof(int32_t);
-  Seq(200, arraysize(buffer), buffer);
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE, WriteData(buffer, &num_bytes, true));
-
-  // Try reading too much.
-  num_bytes = 11u * sizeof(int32_t);
-  memset(buffer, 0xab, sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE, ReadData(buffer, &num_bytes, true));
-  int32_t expected_buffer[100];
-  memset(expected_buffer, 0xab, sizeof(expected_buffer));
-  ASSERT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
-
-  // Try discarding too much.
-  num_bytes = 11u * sizeof(int32_t);
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE, DiscardData(&num_bytes, true));
-
-  // Just a little.
-  num_bytes = 2u * sizeof(int32_t);
-  Seq(300, arraysize(buffer), buffer);
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(buffer, &num_bytes, true));
-  ASSERT_EQ(2u * sizeof(int32_t), num_bytes);
-
-  // Just right.
-  num_bytes = 3u * sizeof(int32_t);
-  Seq(400, arraysize(buffer), buffer);
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(buffer, &num_bytes, true));
-  ASSERT_EQ(3u * sizeof(int32_t), num_bytes);
-
-  // TODO(vtl): Hack (see also the TODO above): We can't currently wait for a
-  // specified amount of data to be available, so poll.
-  for (size_t i = 0; i < kMaxPoll; i++) {
-    num_bytes = 0u;
-    ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-    if (num_bytes >= 10u * sizeof(int32_t))
-      break;
-
-    test::Sleep(test::EpsilonDeadline());
-  }
-  ASSERT_EQ(10u * sizeof(int32_t), num_bytes);
-
-  // Read half.
-  num_bytes = 5u * sizeof(int32_t);
-  memset(buffer, 0xab, sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(buffer, &num_bytes, true));
-  ASSERT_EQ(5u * sizeof(int32_t), num_bytes);
-  memset(expected_buffer, 0xab, sizeof(expected_buffer));
-  Seq(100, 5, expected_buffer);
-  ASSERT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
-
-  // Try reading too much again.
-  num_bytes = 6u * sizeof(int32_t);
-  memset(buffer, 0xab, sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE, ReadData(buffer, &num_bytes, true));
-  memset(expected_buffer, 0xab, sizeof(expected_buffer));
-  ASSERT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
-
-  // Try discarding too much again.
-  num_bytes = 6u * sizeof(int32_t);
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE, DiscardData(&num_bytes, true));
-
-  // Discard a little.
-  num_bytes = 2u * sizeof(int32_t);
-  ASSERT_EQ(MOJO_RESULT_OK, DiscardData(&num_bytes, true));
-  ASSERT_EQ(2u * sizeof(int32_t), num_bytes);
-
-  // Three left.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(3u * sizeof(int32_t), num_bytes);
-
-  // Close the producer, then test producer-closed cases.
-  CloseProducer();
-
-  // Wait.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Try reading too much; "failed precondition" since the producer is closed.
-  num_bytes = 4u * sizeof(int32_t);
-  memset(buffer, 0xab, sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            ReadData(buffer, &num_bytes, true));
-  memset(expected_buffer, 0xab, sizeof(expected_buffer));
-  ASSERT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
-
-  // Try discarding too much; "failed precondition" again.
-  num_bytes = 4u * sizeof(int32_t);
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, DiscardData(&num_bytes, true));
-
-  // Read a little.
-  num_bytes = 2u * sizeof(int32_t);
-  memset(buffer, 0xab, sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(buffer, &num_bytes, true));
-  ASSERT_EQ(2u * sizeof(int32_t), num_bytes);
-  memset(expected_buffer, 0xab, sizeof(expected_buffer));
-  Seq(400, 2, expected_buffer);
-  ASSERT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
-
-  // Discard the remaining element.
-  num_bytes = 1u * sizeof(int32_t);
-  ASSERT_EQ(MOJO_RESULT_OK, DiscardData(&num_bytes, true));
-  ASSERT_EQ(1u * sizeof(int32_t), num_bytes);
-
-  // Empty again.
-  num_bytes = ~0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-}
-
-// Tests that |ProducerWriteData()| and |ConsumerReadData()| writes and reads,
-// respectively, as much as possible, even if it may have to "wrap around" the
-// internal circular buffer. (Note that the two-phase write and read need not do
-// this.)
-TEST_F(DataPipeTest, WrapAround) {
-  unsigned char test_data[1000];
-  for (size_t i = 0; i < arraysize(test_data); i++)
-    test_data[i] = static_cast<unsigned char>(i);
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      100u                                      // |capacity_num_bytes|.
-  };
-
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Write 20 bytes.
-  uint32_t num_bytes = 20u;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(&test_data[0], &num_bytes, true));
-  ASSERT_EQ(20u, num_bytes);
-
-  // Wait for data.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_TRUE(hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Read 10 bytes.
-  unsigned char read_buffer[1000] = {0};
-  num_bytes = 10u;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(read_buffer, &num_bytes, true));
-  ASSERT_EQ(10u, num_bytes);
-  ASSERT_EQ(0, memcmp(read_buffer, &test_data[0], 10u));
-
-  // Check that a two-phase write can now only write (at most) 80 bytes. (This
-  // checks an implementation detail; this behavior is not guaranteed.)
-  void* write_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginWriteData(&write_buffer_ptr, &num_bytes, false));
-  EXPECT_TRUE(write_buffer_ptr);
-  ASSERT_EQ(80u, num_bytes);
-  ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(0));
-
-  size_t total_num_bytes = 0;
-  while (total_num_bytes < 90) {
-    // Wait to write.
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(producer_, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
-    ASSERT_EQ(hss.satisfied_signals, MOJO_HANDLE_SIGNAL_WRITABLE);
-    ASSERT_EQ(hss.satisfiable_signals,
-              MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-    // Write as much as we can.
-    num_bytes = 100;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WriteData(&test_data[20 + total_num_bytes], &num_bytes, false));
-    total_num_bytes += num_bytes;
-  }
-
-  ASSERT_EQ(90u, total_num_bytes);
-
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(100u, num_bytes);
-
-  // Check that a two-phase read can now only read (at most) 90 bytes. (This
-  // checks an implementation detail; this behavior is not guaranteed.)
-  const void* read_buffer_ptr = nullptr;
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_buffer_ptr, &num_bytes, false));
-  EXPECT_TRUE(read_buffer_ptr);
-  ASSERT_EQ(90u, num_bytes);
-  ASSERT_EQ(MOJO_RESULT_OK, EndReadData(0));
-
-  // Read as much as possible. We should read 100 bytes.
-  num_bytes = static_cast<uint32_t>(arraysize(read_buffer) *
-                                    sizeof(read_buffer[0]));
-  memset(read_buffer, 0, num_bytes);
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(read_buffer, &num_bytes));
-  ASSERT_EQ(100u, num_bytes);
-  ASSERT_EQ(0, memcmp(read_buffer, &test_data[10], 100u));
-}
-
-// Tests the behavior of writing (simple and two-phase), closing the producer,
-// then reading (simple and two-phase).
-TEST_F(DataPipeTest, WriteCloseProducerRead) {
-  const char kTestData[] = "hello world";
-  const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-
-  // Write some data, so we'll have something to read.
-  uint32_t num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kTestData, &num_bytes, false));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Write it again, so we'll have something left over.
-  num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kTestData, &num_bytes, false));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Start two-phase write.
-  void* write_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginWriteData(&write_buffer_ptr, &num_bytes, false));
-  EXPECT_TRUE(write_buffer_ptr);
-  EXPECT_GT(num_bytes, 0u);
-
-  // TODO(vtl): (See corresponding TODO in TwoPhaseAllOrNone.)
-  for (size_t i = 0; i < kMaxPoll; i++) {
-    num_bytes = 0u;
-    ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-    if (num_bytes >= 2u * kTestDataSize)
-      break;
-
-    test::Sleep(test::EpsilonDeadline());
-  }
-  ASSERT_EQ(2u * kTestDataSize, num_bytes);
-
-  // Start two-phase read.
-  const void* read_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginReadData(&read_buffer_ptr, &num_bytes));
-  EXPECT_TRUE(read_buffer_ptr);
-  ASSERT_EQ(2u * kTestDataSize, num_bytes);
-
-  // Close the producer.
-  CloseProducer();
-
-  // The consumer can finish its two-phase read.
-  ASSERT_EQ(0, memcmp(read_buffer_ptr, kTestData, kTestDataSize));
-  ASSERT_EQ(MOJO_RESULT_OK, EndReadData(kTestDataSize));
-
-  // And start another.
-  read_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginReadData(&read_buffer_ptr, &num_bytes));
-  EXPECT_TRUE(read_buffer_ptr);
-  ASSERT_EQ(kTestDataSize, num_bytes);
-}
-
-
-// Tests the behavior of interrupting a two-phase read and write by closing the
-// consumer.
-TEST_F(DataPipeTest, TwoPhaseWriteReadCloseConsumer) {
-  const char kTestData[] = "hello world";
-  const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Write some data, so we'll have something to read.
-  uint32_t num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kTestData, &num_bytes));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Start two-phase write.
-  void* write_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_buffer_ptr, &num_bytes));
-  EXPECT_TRUE(write_buffer_ptr);
-  ASSERT_GT(num_bytes, kTestDataSize);
-
-  // Wait for data.
-  // TODO(vtl): (See corresponding TODO in AllOrNone.)
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Start two-phase read.
-  const void* read_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_buffer_ptr, &num_bytes));
-  EXPECT_TRUE(read_buffer_ptr);
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Close the consumer.
-  CloseConsumer();
-
-  // Wait for producer to know that the consumer is closed.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(producer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-
-  // Actually write some data. (Note: Premature freeing of the buffer would
-  // probably only be detected under ASAN or similar.)
-  memcpy(write_buffer_ptr, kTestData, kTestDataSize);
-  // Note: Even though the consumer has been closed, ending the two-phase
-  // write will report success.
-  ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(kTestDataSize));
-
-  // But trying to write should result in failure.
-  num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, WriteData(kTestData, &num_bytes));
-
-  // As will trying to start another two-phase write.
-  write_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            BeginWriteData(&write_buffer_ptr, &num_bytes));
-}
-
-// Tests the behavior of "interrupting" a two-phase write by closing both the
-// producer and the consumer.
-TEST_F(DataPipeTest, TwoPhaseWriteCloseBoth) {
-  const uint32_t kTestDataSize = 15u;
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-
-  // Start two-phase write.
-  void* write_buffer_ptr = nullptr;
-  uint32_t num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_buffer_ptr, &num_bytes));
-  EXPECT_TRUE(write_buffer_ptr);
-  ASSERT_GT(num_bytes, kTestDataSize);
-}
-
-// Tests the behavior of writing, closing the producer, and then reading (with
-// and without data remaining).
-TEST_F(DataPipeTest, WriteCloseProducerReadNoData) {
-  const char kTestData[] = "hello world";
-  const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Write some data, so we'll have something to read.
-  uint32_t num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kTestData, &num_bytes));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Close the producer.
-  CloseProducer();
-
-  // Wait. (Note that once the consumer knows that the producer is closed, it
-  // must also know about all the data that was sent.)
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Peek that data.
-  char buffer[1000];
-  num_bytes = static_cast<uint32_t>(sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(buffer, &num_bytes, false, true));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-  ASSERT_EQ(0, memcmp(buffer, kTestData, kTestDataSize));
-
-  // Read that data.
-  memset(buffer, 0, 1000);
-  num_bytes = static_cast<uint32_t>(sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(buffer, &num_bytes));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-  ASSERT_EQ(0, memcmp(buffer, kTestData, kTestDataSize));
-
-  // A second read should fail.
-  num_bytes = static_cast<uint32_t>(sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, ReadData(buffer, &num_bytes));
-
-  // A two-phase read should also fail.
-  const void* read_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            BeginReadData(&read_buffer_ptr, &num_bytes));
-
-  // Ditto for discard.
-  num_bytes = 10u;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, DiscardData(&num_bytes));
-}
-
-// Test that during a two phase read the memory stays valid even if more data
-// comes in.
-TEST_F(DataPipeTest, TwoPhaseReadMemoryStable) {
-  const char kTestData[] = "hello world";
-  const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Write some data.
-  uint32_t num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kTestData, &num_bytes));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Wait for the data.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Begin a two-phase read.
-  const void* read_buffer_ptr = nullptr;
-  uint32_t read_buffer_size = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_buffer_ptr, &read_buffer_size));
-
-  // Write more data.
-  const char kExtraData[] = "bye world";
-  const uint32_t kExtraDataSize = static_cast<uint32_t>(sizeof(kExtraData));
-  num_bytes = kExtraDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kExtraData, &num_bytes));
-  ASSERT_EQ(kExtraDataSize, num_bytes);
-
-  // Close the producer.
-  CloseProducer();
-
-  // Wait. (Note that once the consumer knows that the producer is closed, it
-  // must also have received the extra data).
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Read the two phase memory to check it's still valid.
-  ASSERT_EQ(0, memcmp(read_buffer_ptr, kTestData, kTestDataSize));
-  EndReadData(read_buffer_size);
-}
-
-// Test that two-phase reads/writes behave correctly when given invalid
-// arguments.
-TEST_F(DataPipeTest, TwoPhaseMoreInvalidArguments) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      10 * sizeof(int32_t)                      // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // No data.
-  uint32_t num_bytes = 1000u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Try "ending" a two-phase write when one isn't active.
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            EndWriteData(1u * sizeof(int32_t)));
-
-  // Wait a bit, to make sure that if a signal were (incorrectly) sent, it'd
-  // have time to propagate.
-  test::Sleep(test::EpsilonDeadline());
-
-  // Still no data.
-  num_bytes = 1000u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Try ending a two-phase write with an invalid amount (too much).
-  num_bytes = 0u;
-  void* write_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_ptr, &num_bytes));
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            EndWriteData(num_bytes + static_cast<uint32_t>(sizeof(int32_t))));
-
-  // But the two-phase write still ended.
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, EndWriteData(0u));
-
-  // Wait a bit (as above).
-  test::Sleep(test::EpsilonDeadline());
-
-  // Still no data.
-  num_bytes = 1000u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Try ending a two-phase write with an invalid amount (not a multiple of the
-  // element size).
-  num_bytes = 0u;
-  write_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_ptr, &num_bytes));
-  EXPECT_GE(num_bytes, 1u);
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, EndWriteData(1u));
-
-  // But the two-phase write still ended.
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, EndWriteData(0u));
-
-  // Wait a bit (as above).
-  test::Sleep(test::EpsilonDeadline());
-
-  // Still no data.
-  num_bytes = 1000u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Now write some data, so we'll be able to try reading.
-  int32_t element = 123;
-  num_bytes = 1u * sizeof(int32_t);
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(&element, &num_bytes));
-
-  // Wait for data.
-  // TODO(vtl): (See corresponding TODO in AllOrNone.)
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // One element available.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(1u * sizeof(int32_t), num_bytes);
-
-  // Try "ending" a two-phase read when one isn't active.
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, EndReadData(1u * sizeof(int32_t)));
-
-  // Still one element available.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(1u * sizeof(int32_t), num_bytes);
-
-  // Try ending a two-phase read with an invalid amount (too much).
-  num_bytes = 0u;
-  const void* read_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_ptr, &num_bytes));
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            EndReadData(num_bytes + static_cast<uint32_t>(sizeof(int32_t))));
-
-  // Still one element available.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(1u * sizeof(int32_t), num_bytes);
-
-  // Try ending a two-phase read with an invalid amount (not a multiple of the
-  // element size).
-  num_bytes = 0u;
-  read_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_ptr, &num_bytes));
-  ASSERT_EQ(1u * sizeof(int32_t), num_bytes);
-  ASSERT_EQ(123, static_cast<const int32_t*>(read_ptr)[0]);
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, EndReadData(1u));
-
-  // Still one element available.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(1u * sizeof(int32_t), num_bytes);
-}
-
-// Test that a producer can be sent over a MP.
-TEST_F(DataPipeTest, SendProducer) {
-  const char kTestData[] = "hello world";
-  const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Write some data.
-  uint32_t num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kTestData, &num_bytes));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Wait for the data.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Check the data.
-  const void* read_buffer = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginReadData(&read_buffer, &num_bytes, false));
-  ASSERT_EQ(0, memcmp(read_buffer, kTestData, kTestDataSize));
-  EndReadData(num_bytes);
-
-  // Now send the producer over a MP so that it's serialized.
-  MojoHandle pipe0, pipe1;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoCreateMessagePipe(nullptr, &pipe0, &pipe1));
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(pipe0, nullptr, 0, &producer_, 1,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-  producer_ = MOJO_HANDLE_INVALID;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  uint32_t num_handles = 1;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(pipe1, nullptr, 0, &producer_, &num_handles,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(num_handles, 1u);
-
-  // Write more data.
-  const char kExtraData[] = "bye world";
-  const uint32_t kExtraDataSize = static_cast<uint32_t>(sizeof(kExtraData));
-  num_bytes = kExtraDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kExtraData, &num_bytes));
-  ASSERT_EQ(kExtraDataSize, num_bytes);
-
-  // Wait for it.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Check the second write.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginReadData(&read_buffer, &num_bytes, false));
-  ASSERT_EQ(0, memcmp(read_buffer, kExtraData, kExtraDataSize));
-  EndReadData(num_bytes);
-
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(pipe0));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(pipe1));
-}
-
-// Ensures that if a data pipe consumer whose producer has closed is passed over
-// a message pipe, the deserialized dispatcher is also marked as having a closed
-// peer.
-TEST_F(DataPipeTest, ConsumerWithClosedProducerSent) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-
-  // We can write to a data pipe handle immediately.
-  int32_t data = 123;
-  uint32_t num_bytes = sizeof(data);
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(&data, &num_bytes));
-  ASSERT_EQ(MOJO_RESULT_OK, CloseProducer());
-
-  // Now wait for the other side to become readable and to see the peer closed.
-  MojoHandleSignalsState state;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            state.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            state.satisfiable_signals);
-
-  // Now send the consumer over a MP so that it's serialized.
-  MojoHandle pipe0, pipe1;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoCreateMessagePipe(nullptr, &pipe0, &pipe1));
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(pipe0, nullptr, 0, &consumer_, 1,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-  consumer_ = MOJO_HANDLE_INVALID;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1, MOJO_HANDLE_SIGNAL_READABLE, &state));
-  uint32_t num_handles = 1;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(pipe1, nullptr, 0, &consumer_, &num_handles,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(num_handles, 1u);
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            state.satisfiable_signals);
-
-  int32_t read_data;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(&read_data, &num_bytes));
-  ASSERT_EQ(sizeof(read_data), num_bytes);
-  ASSERT_EQ(data, read_data);
-
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(pipe0));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(pipe1));
-}
-
-bool WriteAllData(MojoHandle producer,
-                  const void* elements,
-                  uint32_t num_bytes) {
-  for (size_t i = 0; i < kMaxPoll; i++) {
-    // Write as much data as we can.
-    uint32_t write_bytes = num_bytes;
-    MojoResult result = MojoWriteData(producer, elements, &write_bytes,
-                                      MOJO_WRITE_DATA_FLAG_NONE);
-    if (result == MOJO_RESULT_OK) {
-      num_bytes -= write_bytes;
-      elements = static_cast<const uint8_t*>(elements) + write_bytes;
-      if (num_bytes == 0)
-        return true;
-    } else {
-      EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, result);
-    }
-
-    MojoHandleSignalsState hss = MojoHandleSignalsState();
-    EXPECT_EQ(MOJO_RESULT_OK, test::MojoTestBase::WaitForSignals(
-                                  producer, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
-    EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-    EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-              hss.satisfiable_signals);
-  }
-
-  return false;
-}
-
-// If |expect_empty| is true, expect |consumer| to be empty after reading.
-bool ReadAllData(MojoHandle consumer,
-                 void* elements,
-                 uint32_t num_bytes,
-                 bool expect_empty) {
-  for (size_t i = 0; i < kMaxPoll; i++) {
-    // Read as much data as we can.
-    uint32_t read_bytes = num_bytes;
-    MojoResult result =
-        MojoReadData(consumer, elements, &read_bytes, MOJO_READ_DATA_FLAG_NONE);
-    if (result == MOJO_RESULT_OK) {
-      num_bytes -= read_bytes;
-      elements = static_cast<uint8_t*>(elements) + read_bytes;
-      if (num_bytes == 0) {
-        if (expect_empty) {
-          // Expect no more data.
-          test::Sleep(test::TinyDeadline());
-          MojoReadData(consumer, nullptr, &num_bytes,
-                       MOJO_READ_DATA_FLAG_QUERY);
-          EXPECT_EQ(0u, num_bytes);
-        }
-        return true;
-      }
-    } else {
-      EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, result);
-    }
-
-    MojoHandleSignalsState hss = MojoHandleSignalsState();
-    EXPECT_EQ(MOJO_RESULT_OK, test::MojoTestBase::WaitForSignals(
-                                  consumer, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    // Peer could have become closed while we're still waiting for data.
-    EXPECT_TRUE(MOJO_HANDLE_SIGNAL_READABLE & hss.satisfied_signals);
-    EXPECT_TRUE(hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE);
-    EXPECT_TRUE(hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-  }
-
-  return num_bytes == 0;
-}
-
-#if !defined(OS_IOS)
-
-TEST_F(DataPipeTest, Multiprocess) {
-  const uint32_t kTestDataSize =
-      static_cast<uint32_t>(sizeof(kMultiprocessTestData));
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1,                                        // |element_num_bytes|.
-      kMultiprocessCapacity                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-
-  RUN_CHILD_ON_PIPE(MultiprocessClient, server_mp)
-    // Send some data before serialising and sending the data pipe over.
-    // This is the first write so we don't need to use WriteAllData.
-    uint32_t num_bytes = kTestDataSize;
-    ASSERT_EQ(MOJO_RESULT_OK, WriteData(kMultiprocessTestData, &num_bytes,
-                                        MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
-    ASSERT_EQ(kTestDataSize, num_bytes);
-
-    // Send child process the data pipe.
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(server_mp, nullptr, 0, &consumer_, 1,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Send a bunch of data of varying sizes.
-    uint8_t buffer[100];
-    int seq = 0;
-    for (int i = 0; i < kMultiprocessMaxIter; ++i) {
-      for (uint32_t size = 1; size <= kMultiprocessCapacity; size++) {
-        for (unsigned int j = 0; j < size; ++j)
-          buffer[j] = seq + j;
-        EXPECT_TRUE(WriteAllData(producer_, buffer, size));
-        seq += size;
-      }
-    }
-
-    // Write the test string in again.
-    ASSERT_TRUE(WriteAllData(producer_, kMultiprocessTestData, kTestDataSize));
-
-    // Swap ends.
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(server_mp, nullptr, 0, &producer_, 1,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Receive the consumer from the other side.
-    producer_ = MOJO_HANDLE_INVALID;
-    MojoHandleSignalsState hss = MojoHandleSignalsState();
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(server_mp, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    MojoHandle handles[2];
-    uint32_t num_handles = arraysize(handles);
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoReadMessage(server_mp, nullptr, 0, handles, &num_handles,
-                              MOJO_READ_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(1u, num_handles);
-    consumer_ = handles[0];
-
-    // Read the test string twice. Once for when we sent it, and once for the
-    // other end sending it.
-    for (int i = 0; i < 2; ++i) {
-      EXPECT_TRUE(ReadAllData(consumer_, buffer, kTestDataSize, i == 1));
-      EXPECT_EQ(0, memcmp(buffer, kMultiprocessTestData, kTestDataSize));
-    }
-
-    WriteMessage(server_mp, "quit");
-
-    // Don't have to close the consumer here because it will be done for us.
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MultiprocessClient, DataPipeTest, client_mp) {
-  const uint32_t kTestDataSize =
-      static_cast<uint32_t>(sizeof(kMultiprocessTestData));
-
-  // Receive the data pipe from the other side.
-  MojoHandle consumer = MOJO_HANDLE_INVALID;
-  MojoHandleSignalsState hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(client_mp, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  MojoHandle handles[2];
-  uint32_t num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(client_mp, nullptr, 0, handles, &num_handles,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(1u, num_handles);
-  consumer = handles[0];
-
-  // Read the initial string that was sent.
-  int32_t buffer[100];
-  EXPECT_TRUE(ReadAllData(consumer, buffer, kTestDataSize, false));
-  EXPECT_EQ(0, memcmp(buffer, kMultiprocessTestData, kTestDataSize));
-
-  // Receive the main data and check it is correct.
-  int seq = 0;
-  uint8_t expected_buffer[100];
-  for (int i = 0; i < kMultiprocessMaxIter; ++i) {
-    for (uint32_t size = 1; size <= kMultiprocessCapacity; ++size) {
-      for (unsigned int j = 0; j < size; ++j)
-        expected_buffer[j] = seq + j;
-      EXPECT_TRUE(ReadAllData(consumer, buffer, size, false));
-      EXPECT_EQ(0, memcmp(buffer, expected_buffer, size));
-
-      seq += size;
-    }
-  }
-
-  // Swap ends.
-  ASSERT_EQ(MOJO_RESULT_OK, MojoWriteMessage(client_mp, nullptr, 0, &consumer,
-                                             1, MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // Receive the producer from the other side.
-  MojoHandle producer = MOJO_HANDLE_INVALID;
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(client_mp, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(client_mp, nullptr, 0, handles, &num_handles,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(1u, num_handles);
-  producer = handles[0];
-
-  // Write the test string one more time.
-  EXPECT_TRUE(WriteAllData(producer, kMultiprocessTestData, kTestDataSize));
-
-  // We swapped ends, so close the producer.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-
-  // Wait to receive a "quit" message before exiting.
-  EXPECT_EQ("quit", ReadMessage(client_mp));
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(WriteAndCloseProducer, DataPipeTest, h) {
-  MojoHandle p;
-  std::string message = ReadMessageWithHandles(h, &p, 1);
-
-  // Write some data to the producer and close it.
-  uint32_t num_bytes = static_cast<uint32_t>(message.size());
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(p, message.data(), &num_bytes,
-                                          MOJO_WRITE_DATA_FLAG_NONE));
-  EXPECT_EQ(num_bytes, static_cast<uint32_t>(message.size()));
-
-  // Close the producer before quitting.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(p));
-
-  // Wait for a quit message.
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReadAndCloseConsumer, DataPipeTest, h) {
-  MojoHandle c;
-  std::string expected_message = ReadMessageWithHandles(h, &c, 1);
-
-  // Wait for the consumer to become readable.
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(c, MOJO_HANDLE_SIGNAL_READABLE));
-
-  // Drain the consumer and expect to find the given message.
-  uint32_t num_bytes = static_cast<uint32_t>(expected_message.size());
-  std::vector<char> bytes(expected_message.size());
-  EXPECT_EQ(MOJO_RESULT_OK, MojoReadData(c, bytes.data(), &num_bytes,
-                                         MOJO_READ_DATA_FLAG_NONE));
-  EXPECT_EQ(num_bytes, static_cast<uint32_t>(bytes.size()));
-
-  std::string message(bytes.data(), bytes.size());
-  EXPECT_EQ(expected_message, message);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(c));
-
-  // Wait for a quit message.
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_F(DataPipeTest, SendConsumerAndCloseProducer) {
-  // Create a new data pipe.
-  MojoHandle p, c;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &p ,&c));
-
-  RUN_CHILD_ON_PIPE(WriteAndCloseProducer, producer_client)
-    RUN_CHILD_ON_PIPE(ReadAndCloseConsumer, consumer_client)
-      const std::string kMessage = "Hello, world!";
-      WriteMessageWithHandles(producer_client, kMessage, &p, 1);
-      WriteMessageWithHandles(consumer_client, kMessage, &c, 1);
-
-      WriteMessage(consumer_client, "quit");
-    END_CHILD()
-
-    WriteMessage(producer_client, "quit");
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateAndWrite, DataPipeTest, h) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1,                                        // |element_num_bytes|.
-      kMultiprocessCapacity                     // |capacity_num_bytes|.
-  };
-
-  MojoHandle p, c;
-  ASSERT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(&options, &p, &c));
-
-  const std::string kMessage = "Hello, world!";
-  WriteMessageWithHandles(h, kMessage, &c, 1);
-
-  // Write some data to the producer and close it.
-  uint32_t num_bytes = static_cast<uint32_t>(kMessage.size());
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(p, kMessage.data(), &num_bytes,
-                                          MOJO_WRITE_DATA_FLAG_NONE));
-  EXPECT_EQ(num_bytes, static_cast<uint32_t>(kMessage.size()));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(p));
-
-  // Wait for a quit message.
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_F(DataPipeTest, CreateInChild) {
-  RUN_CHILD_ON_PIPE(CreateAndWrite, child)
-    MojoHandle c;
-    std::string expected_message = ReadMessageWithHandles(child, &c, 1);
-
-    // Wait for the consumer to become readable.
-    EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(c, MOJO_HANDLE_SIGNAL_READABLE));
-
-    // Drain the consumer and expect to find the given message.
-    uint32_t num_bytes = static_cast<uint32_t>(expected_message.size());
-    std::vector<char> bytes(expected_message.size());
-    EXPECT_EQ(MOJO_RESULT_OK, MojoReadData(c, bytes.data(), &num_bytes,
-                                           MOJO_READ_DATA_FLAG_NONE));
-    EXPECT_EQ(num_bytes, static_cast<uint32_t>(bytes.size()));
-
-    std::string message(bytes.data(), bytes.size());
-    EXPECT_EQ(expected_message, message);
-
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(c));
-    WriteMessage(child, "quit");
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(DataPipeStatusChangeInTransitClient,
-                                  DataPipeTest, parent) {
-  // This test verifies that peer closure is detectable through various
-  // mechanisms when it races with handle transfer.
-
-  MojoHandle handles[6];
-  EXPECT_EQ("o_O", ReadMessageWithHandles(parent, handles, 6));
-  MojoHandle* producers = &handles[0];
-  MojoHandle* consumers = &handles[3];
-
-  // Wait on producer 0
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(producers[0], MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  // Wait on consumer 0
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumers[0], MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  base::MessageLoop message_loop;
-
-  // Wait on producer 1 and consumer 1 using SimpleWatchers.
-  {
-    base::RunLoop run_loop;
-    int count = 0;
-    auto callback = base::Bind(
-        [] (base::RunLoop* loop, int* count, MojoResult result) {
-          EXPECT_EQ(MOJO_RESULT_OK, result);
-          if (++*count == 2)
-            loop->Quit();
-        },
-        &run_loop, &count);
-    SimpleWatcher producer_watcher(FROM_HERE,
-                                   SimpleWatcher::ArmingPolicy::AUTOMATIC);
-    SimpleWatcher consumer_watcher(FROM_HERE,
-                                   SimpleWatcher::ArmingPolicy::AUTOMATIC);
-    producer_watcher.Watch(Handle(producers[1]), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-                           callback);
-    consumer_watcher.Watch(Handle(consumers[1]), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-                           callback);
-    run_loop.Run();
-    EXPECT_EQ(2, count);
-  }
-
-  // Wait on producer 2 by polling with MojoWriteData.
-  MojoResult result;
-  do {
-    uint32_t num_bytes = 0;
-    result = MojoWriteData(
-        producers[2], nullptr, &num_bytes, MOJO_WRITE_DATA_FLAG_NONE);
-  } while (result == MOJO_RESULT_OK);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-
-  // Wait on consumer 2 by polling with MojoReadData.
-  do {
-    char byte;
-    uint32_t num_bytes = 1;
-    result = MojoReadData(
-        consumers[2], &byte, &num_bytes, MOJO_READ_DATA_FLAG_NONE);
-  } while (result == MOJO_RESULT_SHOULD_WAIT);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-
-  for (size_t i = 0; i < 6; ++i)
-    CloseHandle(handles[i]);
-}
-
-TEST_F(DataPipeTest, StatusChangeInTransit) {
-  MojoHandle producers[6];
-  MojoHandle consumers[6];
-  for (size_t i = 0; i < 6; ++i)
-    CreateDataPipe(&producers[i], &consumers[i], 1);
-
-  RUN_CHILD_ON_PIPE(DataPipeStatusChangeInTransitClient, child)
-    MojoHandle handles[] = { producers[0], producers[1], producers[2],
-                             consumers[3], consumers[4], consumers[5] };
-
-    // Send 3 producers and 3 consumers, and let their transfer race with their
-    // peers' closure.
-    WriteMessageWithHandles(child, "o_O", handles, 6);
-
-    for (size_t i = 0; i < 3; ++i)
-      CloseHandle(consumers[i]);
-    for (size_t i = 3; i < 6; ++i)
-      CloseHandle(producers[i]);
-  END_CHILD()
-}
-
-#endif  // !defined(OS_IOS)
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/dispatcher.cc b/mojo/edk/system/dispatcher.cc
deleted file mode 100644
index 7cdbe91..0000000
--- a/mojo/edk/system/dispatcher.cc
+++ /dev/null
@@ -1,198 +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.
-
-#include "mojo/edk/system/dispatcher.h"
-
-#include "base/logging.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/data_pipe_consumer_dispatcher.h"
-#include "mojo/edk/system/data_pipe_producer_dispatcher.h"
-#include "mojo/edk/system/message_pipe_dispatcher.h"
-#include "mojo/edk/system/platform_handle_dispatcher.h"
-#include "mojo/edk/system/shared_buffer_dispatcher.h"
-
-namespace mojo {
-namespace edk {
-
-Dispatcher::DispatcherInTransit::DispatcherInTransit() {}
-
-Dispatcher::DispatcherInTransit::DispatcherInTransit(
-    const DispatcherInTransit& other) = default;
-
-Dispatcher::DispatcherInTransit::~DispatcherInTransit() {}
-
-MojoResult Dispatcher::WatchDispatcher(scoped_refptr<Dispatcher> dispatcher,
-                                       MojoHandleSignals signals,
-                                       uintptr_t context) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::CancelWatch(uintptr_t context) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::Arm(uint32_t* num_ready_contexts,
-                           uintptr_t* ready_contexts,
-                           MojoResult* ready_results,
-                           MojoHandleSignalsState* ready_signals_states) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::WriteMessage(std::unique_ptr<MessageForTransit> message,
-                                    MojoWriteMessageFlags flags) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::ReadMessage(std::unique_ptr<MessageForTransit>* message,
-                                   uint32_t* num_bytes,
-                                   MojoHandle* handles,
-                                   uint32_t* num_handles,
-                                   MojoReadMessageFlags flags,
-                                   bool read_any_size) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::DuplicateBufferHandle(
-    const MojoDuplicateBufferHandleOptions* options,
-    scoped_refptr<Dispatcher>* new_dispatcher) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::MapBuffer(
-    uint64_t offset,
-    uint64_t num_bytes,
-    MojoMapBufferFlags flags,
-    std::unique_ptr<PlatformSharedBufferMapping>* mapping) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::ReadData(void* elements,
-                                uint32_t* num_bytes,
-                                MojoReadDataFlags flags) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::BeginReadData(const void** buffer,
-                                     uint32_t* buffer_num_bytes,
-                                     MojoReadDataFlags flags) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::EndReadData(uint32_t num_bytes_read) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::WriteData(const void* elements,
-                                 uint32_t* num_bytes,
-                                 MojoWriteDataFlags flags) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::BeginWriteData(void** buffer,
-                                      uint32_t* buffer_num_bytes,
-                                      MojoWriteDataFlags flags) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::EndWriteData(uint32_t num_bytes_written) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::AddWaitingDispatcher(
-    const scoped_refptr<Dispatcher>& dispatcher,
-    MojoHandleSignals signals,
-    uintptr_t context) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::RemoveWaitingDispatcher(
-    const scoped_refptr<Dispatcher>& dispatcher) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::GetReadyDispatchers(uint32_t* count,
-                                           DispatcherVector* dispatchers,
-                                           MojoResult* results,
-                                           uintptr_t* contexts) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-HandleSignalsState Dispatcher::GetHandleSignalsState() const {
-  return HandleSignalsState();
-}
-
-MojoResult Dispatcher::AddWatcherRef(
-    const scoped_refptr<WatcherDispatcher>& watcher,
-    uintptr_t context) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::RemoveWatcherRef(WatcherDispatcher* watcher,
-                                        uintptr_t context) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-void Dispatcher::StartSerialize(uint32_t* num_bytes,
-                                uint32_t* num_ports,
-                                uint32_t* num_platform_handles) {
-  *num_bytes = 0;
-  *num_ports = 0;
-  *num_platform_handles = 0;
-}
-
-bool Dispatcher::EndSerialize(void* destination,
-                              ports::PortName* ports,
-                              PlatformHandle* handles) {
-  LOG(ERROR) << "Attempting to serialize a non-transferrable dispatcher.";
-  return true;
-}
-
-bool Dispatcher::BeginTransit() { return true; }
-
-void Dispatcher::CompleteTransitAndClose() {}
-
-void Dispatcher::CancelTransit() {}
-
-// static
-scoped_refptr<Dispatcher> Dispatcher::Deserialize(
-    Type type,
-    const void* bytes,
-    size_t num_bytes,
-    const ports::PortName* ports,
-    size_t num_ports,
-    PlatformHandle* platform_handles,
-    size_t num_platform_handles) {
-  switch (type) {
-    case Type::MESSAGE_PIPE:
-      return MessagePipeDispatcher::Deserialize(
-          bytes, num_bytes, ports, num_ports, platform_handles,
-          num_platform_handles);
-    case Type::SHARED_BUFFER:
-      return SharedBufferDispatcher::Deserialize(
-          bytes, num_bytes, ports, num_ports, platform_handles,
-          num_platform_handles);
-    case Type::DATA_PIPE_CONSUMER:
-      return DataPipeConsumerDispatcher::Deserialize(
-          bytes, num_bytes, ports, num_ports, platform_handles,
-          num_platform_handles);
-    case Type::DATA_PIPE_PRODUCER:
-      return DataPipeProducerDispatcher::Deserialize(
-          bytes, num_bytes, ports, num_ports, platform_handles,
-          num_platform_handles);
-    case Type::PLATFORM_HANDLE:
-      return PlatformHandleDispatcher::Deserialize(
-          bytes, num_bytes, ports, num_ports, platform_handles,
-          num_platform_handles);
-    default:
-      LOG(ERROR) << "Deserializing invalid dispatcher type.";
-      return nullptr;
-  }
-}
-
-Dispatcher::Dispatcher() {}
-
-Dispatcher::~Dispatcher() {}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/dispatcher.h b/mojo/edk/system/dispatcher.h
deleted file mode 100644
index db1f1f1..0000000
--- a/mojo/edk/system/dispatcher.h
+++ /dev/null
@@ -1,245 +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.
-
-#ifndef MOJO_EDK_SYSTEM_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_DISPATCHER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <ostream>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/edk/system/watch.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-namespace edk {
-
-class Dispatcher;
-class MessageForTransit;
-
-using DispatcherVector = std::vector<scoped_refptr<Dispatcher>>;
-
-// A |Dispatcher| implements Mojo EDK calls that are associated with a
-// particular MojoHandle.
-class MOJO_SYSTEM_IMPL_EXPORT Dispatcher
-    : public base::RefCountedThreadSafe<Dispatcher> {
- public:
-  struct DispatcherInTransit {
-    DispatcherInTransit();
-    DispatcherInTransit(const DispatcherInTransit& other);
-    ~DispatcherInTransit();
-
-    scoped_refptr<Dispatcher> dispatcher;
-    MojoHandle local_handle;
-  };
-
-  enum class Type {
-    UNKNOWN = 0,
-    MESSAGE_PIPE,
-    DATA_PIPE_PRODUCER,
-    DATA_PIPE_CONSUMER,
-    SHARED_BUFFER,
-    WATCHER,
-
-    // "Private" types (not exposed via the public interface):
-    PLATFORM_HANDLE = -1,
-  };
-
-  // All Dispatchers must minimally implement these methods.
-
-  virtual Type GetType() const = 0;
-  virtual MojoResult Close() = 0;
-
-  ///////////// Watcher API ////////////////////
-
-  virtual MojoResult WatchDispatcher(scoped_refptr<Dispatcher> dispatcher,
-                                     MojoHandleSignals signals,
-                                     uintptr_t context);
-  virtual MojoResult CancelWatch(uintptr_t context);
-  virtual MojoResult Arm(uint32_t* num_ready_contexts,
-                         uintptr_t* ready_contexts,
-                         MojoResult* ready_results,
-                         MojoHandleSignalsState* ready_signals_states);
-
-  ///////////// Message pipe API /////////////
-
-  virtual MojoResult WriteMessage(std::unique_ptr<MessageForTransit> message,
-                                  MojoWriteMessageFlags flags);
-
-  virtual MojoResult ReadMessage(std::unique_ptr<MessageForTransit>* message,
-                                 uint32_t* num_bytes,
-                                 MojoHandle* handles,
-                                 uint32_t* num_handles,
-                                 MojoReadMessageFlags flags,
-                                 bool read_any_size);
-
-  ///////////// Shared buffer API /////////////
-
-  // |options| may be null. |new_dispatcher| must not be null, but
-  // |*new_dispatcher| should be null (and will contain the dispatcher for the
-  // new handle on success).
-  virtual MojoResult DuplicateBufferHandle(
-      const MojoDuplicateBufferHandleOptions* options,
-      scoped_refptr<Dispatcher>* new_dispatcher);
-
-  virtual MojoResult MapBuffer(
-      uint64_t offset,
-      uint64_t num_bytes,
-      MojoMapBufferFlags flags,
-      std::unique_ptr<PlatformSharedBufferMapping>* mapping);
-
-  ///////////// Data pipe consumer API /////////////
-
-  virtual MojoResult ReadData(void* elements,
-                              uint32_t* num_bytes,
-                              MojoReadDataFlags flags);
-
-  virtual MojoResult BeginReadData(const void** buffer,
-                                   uint32_t* buffer_num_bytes,
-                                   MojoReadDataFlags flags);
-
-  virtual MojoResult EndReadData(uint32_t num_bytes_read);
-
-  ///////////// Data pipe producer API /////////////
-
-  virtual MojoResult WriteData(const void* elements,
-                               uint32_t* num_bytes,
-                               MojoWriteDataFlags flags);
-
-  virtual MojoResult BeginWriteData(void** buffer,
-                                    uint32_t* buffer_num_bytes,
-                                    MojoWriteDataFlags flags);
-
-  virtual MojoResult EndWriteData(uint32_t num_bytes_written);
-
-  ///////////// Wait set API /////////////
-
-  // Adds a dispatcher to wait on. When the dispatcher satisfies |signals|, it
-  // will be returned in the next call to |GetReadyDispatchers()|. If
-  // |dispatcher| has been added, it must be removed before adding again,
-  // otherwise |MOJO_RESULT_ALREADY_EXISTS| will be returned.
-  virtual MojoResult AddWaitingDispatcher(
-      const scoped_refptr<Dispatcher>& dispatcher,
-      MojoHandleSignals signals,
-      uintptr_t context);
-
-  // Removes a dispatcher to wait on. If |dispatcher| has not been added,
-  // |MOJO_RESULT_NOT_FOUND| will be returned.
-  virtual MojoResult RemoveWaitingDispatcher(
-      const scoped_refptr<Dispatcher>& dispatcher);
-
-  // Returns a set of ready dispatchers. |*count| is the maximum number of
-  // dispatchers to return, and will contain the number of dispatchers returned
-  // in |dispatchers| on completion.
-  virtual MojoResult GetReadyDispatchers(uint32_t* count,
-                                         DispatcherVector* dispatchers,
-                                         MojoResult* results,
-                                         uintptr_t* contexts);
-
-  ///////////// General-purpose API for all handle types /////////
-
-  // Gets the current handle signals state. (The default implementation simply
-  // returns a default-constructed |HandleSignalsState|, i.e., no signals
-  // satisfied or satisfiable.) Note: The state is subject to change from other
-  // threads.
-  virtual HandleSignalsState GetHandleSignalsState() const;
-
-  // Adds a WatcherDispatcher reference to this dispatcher, to be notified of
-  // all subsequent changes to handle state including signal changes or closure.
-  // The reference is associated with a |context| for disambiguation of
-  // removals.
-  virtual MojoResult AddWatcherRef(
-      const scoped_refptr<WatcherDispatcher>& watcher,
-      uintptr_t context);
-
-  // Removes a WatcherDispatcher reference from this dispatcher.
-  virtual MojoResult RemoveWatcherRef(WatcherDispatcher* watcher,
-                                      uintptr_t context);
-
-  // Informs the caller of the total serialized size (in bytes) and the total
-  // number of platform handles and ports needed to transfer this dispatcher
-  // across a message pipe.
-  //
-  // Must eventually be followed by a call to EndSerializeAndClose(). Note that
-  // StartSerialize() and EndSerialize() are always called in sequence, and
-  // only between calls to BeginTransit() and either (but not both)
-  // CompleteTransitAndClose() or CancelTransit().
-  //
-  // For this reason it is IMPERATIVE that the implementation ensure a
-  // consistent serializable state between BeginTransit() and
-  // CompleteTransitAndClose()/CancelTransit().
-  virtual void StartSerialize(uint32_t* num_bytes,
-                              uint32_t* num_ports,
-                              uint32_t* num_platform_handles);
-
-  // Serializes this dispatcher into |destination|, |ports|, and |handles|.
-  // Returns true iff successful, false otherwise. In either case the dispatcher
-  // will close.
-  //
-  // NOTE: Transit MAY still fail after this call returns. Implementations
-  // should not assume PlatformHandle ownership has transferred until
-  // CompleteTransitAndClose() is called. In other words, if CancelTransit() is
-  // called, the implementation should retain its PlatformHandles in working
-  // condition.
-  virtual bool EndSerialize(void* destination,
-                            ports::PortName* ports,
-                            PlatformHandle* handles);
-
-  // Does whatever is necessary to begin transit of the dispatcher.  This
-  // should return |true| if transit is OK, or false if the underlying resource
-  // is deemed busy by the implementation.
-  virtual bool BeginTransit();
-
-  // Does whatever is necessary to complete transit of the dispatcher, including
-  // closure. This is only called upon successfully transmitting an outgoing
-  // message containing this serialized dispatcher.
-  virtual void CompleteTransitAndClose();
-
-  // Does whatever is necessary to cancel transit of the dispatcher. The
-  // dispatcher should remain in a working state and resume normal operation.
-  virtual void CancelTransit();
-
-  // Deserializes a specific dispatcher type from an incoming message.
-  static scoped_refptr<Dispatcher> Deserialize(
-      Type type,
-      const void* bytes,
-      size_t num_bytes,
-      const ports::PortName* ports,
-      size_t num_ports,
-      PlatformHandle* platform_handles,
-      size_t num_platform_handles);
-
- protected:
-  friend class base::RefCountedThreadSafe<Dispatcher>;
-
-  Dispatcher();
-  virtual ~Dispatcher();
-
-  DISALLOW_COPY_AND_ASSIGN(Dispatcher);
-};
-
-// So logging macros and |DCHECK_EQ()|, etc. work.
-MOJO_SYSTEM_IMPL_EXPORT inline std::ostream& operator<<(std::ostream& out,
-                                                        Dispatcher::Type type) {
-  return out << static_cast<int>(type);
-}
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_DISPATCHER_H_
diff --git a/mojo/edk/system/handle_signals_state.h b/mojo/edk/system/handle_signals_state.h
deleted file mode 100644
index f241278..0000000
--- a/mojo/edk/system/handle_signals_state.h
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_HANDLE_SIGNALS_STATE_H_
-#define MOJO_EDK_SYSTEM_HANDLE_SIGNALS_STATE_H_
-
-#include "mojo/public/cpp/system/handle_signals_state.h"
-
-// TODO(rockot): Remove this header and use the C++ system library type
-// directly inside the EDK.
-
-#endif  // MOJO_EDK_SYSTEM_HANDLE_SIGNALS_STATE_H_
diff --git a/mojo/edk/system/handle_table.cc b/mojo/edk/system/handle_table.cc
deleted file mode 100644
index b570793..0000000
--- a/mojo/edk/system/handle_table.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/handle_table.h"
-
-#include <stdint.h>
-
-#include <limits>
-
-namespace mojo {
-namespace edk {
-
-HandleTable::HandleTable() {}
-
-HandleTable::~HandleTable() {}
-
-MojoHandle HandleTable::AddDispatcher(scoped_refptr<Dispatcher> dispatcher) {
-  // Oops, we're out of handles.
-  if (next_available_handle_ == MOJO_HANDLE_INVALID)
-    return MOJO_HANDLE_INVALID;
-
-  MojoHandle handle = next_available_handle_++;
-  auto result =
-      handles_.insert(std::make_pair(handle, Entry(std::move(dispatcher))));
-  DCHECK(result.second);
-
-  return handle;
-}
-
-bool HandleTable::AddDispatchersFromTransit(
-    const std::vector<Dispatcher::DispatcherInTransit>& dispatchers,
-    MojoHandle* handles) {
-  // Oops, we're out of handles.
-  if (next_available_handle_ == MOJO_HANDLE_INVALID)
-    return false;
-
-  DCHECK_LE(dispatchers.size(), std::numeric_limits<uint32_t>::max());
-  // If this insertion would cause handle overflow, we're out of handles.
-  if (next_available_handle_ + dispatchers.size() < next_available_handle_)
-    return false;
-
-  for (size_t i = 0; i < dispatchers.size(); ++i) {
-    MojoHandle handle = next_available_handle_++;
-    auto result = handles_.insert(
-        std::make_pair(handle, Entry(dispatchers[i].dispatcher)));
-    DCHECK(result.second);
-    handles[i] = handle;
-  }
-
-  return true;
-}
-
-scoped_refptr<Dispatcher> HandleTable::GetDispatcher(MojoHandle handle) const {
-  auto it = handles_.find(handle);
-  if (it == handles_.end())
-    return nullptr;
-  return it->second.dispatcher;
-}
-
-MojoResult HandleTable::GetAndRemoveDispatcher(
-    MojoHandle handle,
-    scoped_refptr<Dispatcher>* dispatcher) {
-  auto it = handles_.find(handle);
-  if (it == handles_.end())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  if (it->second.busy)
-    return MOJO_RESULT_BUSY;
-
-  *dispatcher = std::move(it->second.dispatcher);
-  handles_.erase(it);
-  return MOJO_RESULT_OK;
-}
-
-MojoResult HandleTable::BeginTransit(
-    const MojoHandle* handles,
-    uint32_t num_handles,
-    std::vector<Dispatcher::DispatcherInTransit>* dispatchers) {
-  dispatchers->clear();
-  dispatchers->reserve(num_handles);
-  for (size_t i = 0; i < num_handles; ++i) {
-    auto it = handles_.find(handles[i]);
-    if (it == handles_.end())
-      return MOJO_RESULT_INVALID_ARGUMENT;
-    if (it->second.busy)
-      return MOJO_RESULT_BUSY;
-
-    Dispatcher::DispatcherInTransit d;
-    d.local_handle = handles[i];
-    d.dispatcher = it->second.dispatcher;
-    if (!d.dispatcher->BeginTransit())
-      return MOJO_RESULT_BUSY;
-    it->second.busy = true;
-    dispatchers->push_back(d);
-  }
-  return MOJO_RESULT_OK;
-}
-
-void HandleTable::CompleteTransitAndClose(
-    const std::vector<Dispatcher::DispatcherInTransit>& dispatchers) {
-  for (const auto& dispatcher : dispatchers) {
-    auto it = handles_.find(dispatcher.local_handle);
-    DCHECK(it != handles_.end() && it->second.busy);
-    handles_.erase(it);
-    dispatcher.dispatcher->CompleteTransitAndClose();
-  }
-}
-
-void HandleTable::CancelTransit(
-    const std::vector<Dispatcher::DispatcherInTransit>& dispatchers) {
-  for (const auto& dispatcher : dispatchers) {
-    auto it = handles_.find(dispatcher.local_handle);
-    DCHECK(it != handles_.end() && it->second.busy);
-    it->second.busy = false;
-    dispatcher.dispatcher->CancelTransit();
-  }
-}
-
-void HandleTable::GetActiveHandlesForTest(std::vector<MojoHandle>* handles) {
-  handles->clear();
-  for (const auto& entry : handles_)
-    handles->push_back(entry.first);
-}
-
-HandleTable::Entry::Entry() {}
-
-HandleTable::Entry::Entry(scoped_refptr<Dispatcher> dispatcher)
-    : dispatcher(std::move(dispatcher)) {}
-
-HandleTable::Entry::Entry(const Entry& other) = default;
-
-HandleTable::Entry::~Entry() {}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/handle_table.h b/mojo/edk/system/handle_table.h
deleted file mode 100644
index 882d540..0000000
--- a/mojo/edk/system/handle_table.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_HANDLE_TABLE_H_
-#define MOJO_EDK_SYSTEM_HANDLE_TABLE_H_
-
-#include <stdint.h>
-
-#include <vector>
-
-#include "base/containers/hash_tables.h"
-#include "base/macros.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-namespace edk {
-
-class HandleTable {
- public:
-  HandleTable();
-  ~HandleTable();
-
-  MojoHandle AddDispatcher(scoped_refptr<Dispatcher> dispatcher);
-
-  // Inserts multiple dispatchers received from message transit, populating
-  // |handles| with their newly allocated handles. Returns |true| on success.
-  bool AddDispatchersFromTransit(
-      const std::vector<Dispatcher::DispatcherInTransit>& dispatchers,
-      MojoHandle* handles);
-
-  scoped_refptr<Dispatcher> GetDispatcher(MojoHandle handle) const;
-  MojoResult GetAndRemoveDispatcher(MojoHandle,
-                                    scoped_refptr<Dispatcher>* dispatcher);
-
-  // Marks handles as busy and populates |dispatchers|. Returns MOJO_RESULT_BUSY
-  // if any of the handles are already in transit; MOJO_RESULT_INVALID_ARGUMENT
-  // if any of the handles are invalid; or MOJO_RESULT_OK if successful.
-  MojoResult BeginTransit(
-      const MojoHandle* handles,
-      uint32_t num_handles,
-      std::vector<Dispatcher::DispatcherInTransit>* dispatchers);
-
-  void CompleteTransitAndClose(
-      const std::vector<Dispatcher::DispatcherInTransit>& dispatchers);
-  void CancelTransit(
-      const std::vector<Dispatcher::DispatcherInTransit>& dispatchers);
-
-  void GetActiveHandlesForTest(std::vector<MojoHandle> *handles);
-
- private:
-  struct Entry {
-   Entry();
-   explicit Entry(scoped_refptr<Dispatcher> dispatcher);
-   Entry(const Entry& other);
-   ~Entry();
-
-   scoped_refptr<Dispatcher> dispatcher;
-   bool busy = false;
-  };
-
-  using HandleMap = base::hash_map<MojoHandle, Entry>;
-
-  HandleMap handles_;
-
-  uint32_t next_available_handle_ = 1;
-
-  DISALLOW_COPY_AND_ASSIGN(HandleTable);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_HANDLE_TABLE_H_
diff --git a/mojo/edk/system/mach_port_relay.cc b/mojo/edk/system/mach_port_relay.cc
deleted file mode 100644
index f05cf22..0000000
--- a/mojo/edk/system/mach_port_relay.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/mach_port_relay.h"
-
-#include <mach/mach.h>
-
-#include <utility>
-
-#include "base/logging.h"
-#include "base/mac/mach_port_util.h"
-#include "base/mac/scoped_mach_port.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/process/process.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-// Errors that can occur in the broker (privileged parent) process.
-// These match tools/metrics/histograms.xml.
-// This enum is append-only.
-enum class BrokerUMAError : int {
-  SUCCESS = 0,
-  // Couldn't get a task port for the process with a given pid.
-  ERROR_TASK_FOR_PID = 1,
-  // Couldn't make a port with receive rights in the destination process.
-  ERROR_MAKE_RECEIVE_PORT = 2,
-  // Couldn't change the attributes of a Mach port.
-  ERROR_SET_ATTRIBUTES = 3,
-  // Couldn't extract a right from the destination.
-  ERROR_EXTRACT_DEST_RIGHT = 4,
-  // Couldn't send a Mach port in a call to mach_msg().
-  ERROR_SEND_MACH_PORT = 5,
-  // Couldn't extract a right from the source.
-  ERROR_EXTRACT_SOURCE_RIGHT = 6,
-  ERROR_MAX
-};
-
-// Errors that can occur in a child process.
-// These match tools/metrics/histograms.xml.
-// This enum is append-only.
-enum class ChildUMAError : int {
-  SUCCESS = 0,
-  // An error occurred while trying to receive a Mach port with mach_msg().
-  ERROR_RECEIVE_MACH_MESSAGE = 1,
-  ERROR_MAX
-};
-
-void ReportBrokerError(BrokerUMAError error) {
-  UMA_HISTOGRAM_ENUMERATION("Mojo.MachPortRelay.BrokerError",
-                            static_cast<int>(error),
-                            static_cast<int>(BrokerUMAError::ERROR_MAX));
-}
-
-void ReportChildError(ChildUMAError error) {
-  UMA_HISTOGRAM_ENUMERATION("Mojo.MachPortRelay.ChildError",
-                            static_cast<int>(error),
-                            static_cast<int>(ChildUMAError::ERROR_MAX));
-}
-
-}  // namespace
-
-// static
-bool MachPortRelay::ReceivePorts(PlatformHandleVector* handles) {
-  DCHECK(handles);
-
-  for (size_t i = 0; i < handles->size(); i++) {
-    PlatformHandle* handle = handles->data() + i;
-    DCHECK(handle->type != PlatformHandle::Type::MACH);
-    if (handle->type != PlatformHandle::Type::MACH_NAME)
-      continue;
-
-    if (handle->port == MACH_PORT_NULL) {
-      handle->type = PlatformHandle::Type::MACH;
-      continue;
-    }
-
-    base::mac::ScopedMachReceiveRight message_port(handle->port);
-    base::mac::ScopedMachSendRight received_port(
-        base::ReceiveMachPort(message_port.get()));
-    if (received_port.get() == MACH_PORT_NULL) {
-      ReportChildError(ChildUMAError::ERROR_RECEIVE_MACH_MESSAGE);
-      handle->port = MACH_PORT_NULL;
-      LOG(ERROR) << "Error receiving mach port";
-      return false;
-    }
-
-    ReportChildError(ChildUMAError::SUCCESS);
-    handle->port = received_port.release();
-    handle->type = PlatformHandle::Type::MACH;
-  }
-
-  return true;
-}
-
-MachPortRelay::MachPortRelay(base::PortProvider* port_provider)
-    : port_provider_(port_provider) {
-  DCHECK(port_provider);
-  port_provider_->AddObserver(this);
-}
-
-MachPortRelay::~MachPortRelay() {
-  port_provider_->RemoveObserver(this);
-}
-
-bool MachPortRelay::SendPortsToProcess(Channel::Message* message,
-                                       base::ProcessHandle process) {
-  DCHECK(message);
-  mach_port_t task_port = port_provider_->TaskForPid(process);
-  if (task_port == MACH_PORT_NULL) {
-    // Callers check the port provider for the task port before calling this
-    // function, in order to queue pending messages. Therefore, if this fails,
-    // it should be considered a genuine, bona fide, electrified, six-car error.
-    ReportBrokerError(BrokerUMAError::ERROR_TASK_FOR_PID);
-    return false;
-  }
-
-  size_t num_sent = 0;
-  bool error = false;
-  ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-  // Message should have handles, otherwise there's no point in calling this
-  // function.
-  DCHECK(handles);
-  for (size_t i = 0; i < handles->size(); i++) {
-    PlatformHandle* handle = &(*handles)[i];
-    DCHECK(handle->type != PlatformHandle::Type::MACH_NAME);
-    if (handle->type != PlatformHandle::Type::MACH)
-      continue;
-
-    if (handle->port == MACH_PORT_NULL) {
-      handle->type = PlatformHandle::Type::MACH_NAME;
-      num_sent++;
-      continue;
-    }
-
-    mach_port_name_t intermediate_port;
-    base::MachCreateError error_code;
-    intermediate_port = base::CreateIntermediateMachPort(
-        task_port, base::mac::ScopedMachSendRight(handle->port), &error_code);
-    if (intermediate_port == MACH_PORT_NULL) {
-      BrokerUMAError uma_error;
-      switch (error_code) {
-        case base::MachCreateError::ERROR_MAKE_RECEIVE_PORT:
-          uma_error = BrokerUMAError::ERROR_MAKE_RECEIVE_PORT;
-          break;
-        case base::MachCreateError::ERROR_SET_ATTRIBUTES:
-          uma_error = BrokerUMAError::ERROR_SET_ATTRIBUTES;
-          break;
-        case base::MachCreateError::ERROR_EXTRACT_DEST_RIGHT:
-          uma_error = BrokerUMAError::ERROR_EXTRACT_DEST_RIGHT;
-          break;
-        case base::MachCreateError::ERROR_SEND_MACH_PORT:
-          uma_error = BrokerUMAError::ERROR_SEND_MACH_PORT;
-          break;
-      }
-      ReportBrokerError(uma_error);
-      handle->port = MACH_PORT_NULL;
-      error = true;
-      break;
-    }
-
-    ReportBrokerError(BrokerUMAError::SUCCESS);
-    handle->port = intermediate_port;
-    handle->type = PlatformHandle::Type::MACH_NAME;
-    num_sent++;
-  }
-  DCHECK(error || num_sent);
-  message->SetHandles(std::move(handles));
-
-  return !error;
-}
-
-bool MachPortRelay::ExtractPortRights(Channel::Message* message,
-                                      base::ProcessHandle process) {
-  DCHECK(message);
-
-  mach_port_t task_port = port_provider_->TaskForPid(process);
-  if (task_port == MACH_PORT_NULL) {
-    ReportBrokerError(BrokerUMAError::ERROR_TASK_FOR_PID);
-    return false;
-  }
-
-  size_t num_received = 0;
-  bool error = false;
-  ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-  // Message should have handles, otherwise there's no point in calling this
-  // function.
-  DCHECK(handles);
-  for (size_t i = 0; i < handles->size(); i++) {
-    PlatformHandle* handle = handles->data() + i;
-    DCHECK(handle->type != PlatformHandle::Type::MACH);
-    if (handle->type != PlatformHandle::Type::MACH_NAME)
-      continue;
-
-    if (handle->port == MACH_PORT_NULL) {
-      handle->type = PlatformHandle::Type::MACH;
-      num_received++;
-      continue;
-    }
-
-    mach_port_t extracted_right = MACH_PORT_NULL;
-    mach_msg_type_name_t extracted_right_type;
-    kern_return_t kr =
-        mach_port_extract_right(task_port, handle->port,
-                                MACH_MSG_TYPE_MOVE_SEND,
-                                &extracted_right, &extracted_right_type);
-    if (kr != KERN_SUCCESS) {
-      ReportBrokerError(BrokerUMAError::ERROR_EXTRACT_SOURCE_RIGHT);
-      error = true;
-      break;
-    }
-
-    ReportBrokerError(BrokerUMAError::SUCCESS);
-    DCHECK_EQ(static_cast<mach_msg_type_name_t>(MACH_MSG_TYPE_PORT_SEND),
-              extracted_right_type);
-    handle->port = extracted_right;
-    handle->type = PlatformHandle::Type::MACH;
-    num_received++;
-  }
-  DCHECK(error || num_received);
-  message->SetHandles(std::move(handles));
-
-  return !error;
-}
-
-void MachPortRelay::AddObserver(Observer* observer) {
-  base::AutoLock locker(observers_lock_);
-  bool inserted = observers_.insert(observer).second;
-  DCHECK(inserted);
-}
-
-void MachPortRelay::RemoveObserver(Observer* observer) {
-  base::AutoLock locker(observers_lock_);
-  observers_.erase(observer);
-}
-
-void MachPortRelay::OnReceivedTaskPort(base::ProcessHandle process) {
-  base::AutoLock locker(observers_lock_);
-  for (auto* observer : observers_)
-    observer->OnProcessReady(process);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/mach_port_relay.h b/mojo/edk/system/mach_port_relay.h
deleted file mode 100644
index 87bc56c..0000000
--- a/mojo/edk/system/mach_port_relay.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_MACH_PORT_RELAY_H_
-#define MOJO_EDK_SYSTEM_MACH_PORT_RELAY_H_
-
-#include <set>
-
-#include "base/macros.h"
-#include "base/process/port_provider_mac.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/channel.h"
-
-namespace mojo {
-namespace edk {
-
-// The MachPortRelay is used by a privileged process, usually the root process,
-// to manipulate Mach ports in a child process. Ports can be added to and
-// extracted from a child process that has registered itself with the
-// |base::PortProvider| used by this class.
-class MachPortRelay : public base::PortProvider::Observer {
- public:
-  class Observer {
-   public:
-    // Called by the MachPortRelay to notify observers that a new process is
-    // ready for Mach ports to be sent/received. There are no guarantees about
-    // the thread this is called on, including the presence of a MessageLoop.
-    // Implementations must not call AddObserver() or RemoveObserver() during
-    // this function, as doing so will deadlock.
-    virtual void OnProcessReady(base::ProcessHandle process) = 0;
-  };
-
-  // Used by a child process to receive Mach ports from a sender (privileged)
-  // process. Each Mach port in |handles| is interpreted as an intermediate Mach
-  // port. It replaces each Mach port with the final Mach port received from the
-  // intermediate port. This method takes ownership of the intermediate Mach
-  // port and gives ownership of the final Mach port to the caller. Any handles
-  // that are not Mach ports will remain unchanged, and the number and ordering
-  // of handles is preserved.
-  // Returns |false| on failure and there is no guarantee about whether a Mach
-  // port is intermediate or final.
-  //
-  // See SendPortsToProcess() for the definition of intermediate and final Mach
-  // ports.
-  static bool ReceivePorts(PlatformHandleVector* handles);
-
-  explicit MachPortRelay(base::PortProvider* port_provider);
-  ~MachPortRelay() override;
-
-  // Sends the Mach ports attached to |message| to |process|.
-  // For each Mach port attached to |message|, a new Mach port, the intermediate
-  // port, is created in |process|. The message's Mach port is then sent over
-  // this intermediate port and the message is modified to refer to the name of
-  // the intermediate port. The Mach port received over the intermediate port in
-  // the child is referred to as the final Mach port.
-  // Returns |false| on failure and |message| may contain a mix of actual Mach
-  // ports and names.
-  bool SendPortsToProcess(Channel::Message* message,
-                          base::ProcessHandle process);
-
-  // Extracts the Mach ports attached to |message| from |process|.
-  // Any Mach ports attached to |message| are names and not actual Mach ports
-  // that are valid in this process. For each of those Mach port names, a send
-  // right is extracted from |process| and the port name is replaced with the
-  // send right.
-  // Returns |false| on failure and |message| may contain a mix of actual Mach
-  // ports and names.
-  bool ExtractPortRights(Channel::Message* message,
-                         base::ProcessHandle process);
-
-  // Observer interface.
-  void AddObserver(Observer* observer);
-  void RemoveObserver(Observer* observer);
-
-  base::PortProvider* port_provider() const { return port_provider_; }
-
- private:
-  // base::PortProvider::Observer implementation.
-  void OnReceivedTaskPort(base::ProcessHandle process) override;
-
-  base::PortProvider* const port_provider_;
-
-  base::Lock observers_lock_;
-  std::set<Observer*> observers_;
-
-  DISALLOW_COPY_AND_ASSIGN(MachPortRelay);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_MACH_PORT_RELAY_H_
diff --git a/mojo/edk/system/mapping_table.cc b/mojo/edk/system/mapping_table.cc
deleted file mode 100644
index 8509443..0000000
--- a/mojo/edk/system/mapping_table.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/mapping_table.h"
-
-#include "base/logging.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/configuration.h"
-
-namespace mojo {
-namespace edk {
-
-MappingTable::MappingTable() {
-}
-
-MappingTable::~MappingTable() {
-  // This should usually not be reached (the only instance should be owned by
-  // the singleton |Core|, which lives forever), except in tests.
-}
-
-MojoResult MappingTable::AddMapping(
-    std::unique_ptr<PlatformSharedBufferMapping> mapping) {
-  DCHECK(mapping);
-
-  if (address_to_mapping_map_.size() >=
-      GetConfiguration().max_mapping_table_sze)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  void* address = mapping->GetBase();
-  DCHECK(address_to_mapping_map_.find(address) ==
-         address_to_mapping_map_.end());
-  address_to_mapping_map_[address] = mapping.release();
-  return MOJO_RESULT_OK;
-}
-
-MojoResult MappingTable::RemoveMapping(void* address) {
-  AddressToMappingMap::iterator it = address_to_mapping_map_.find(address);
-  if (it == address_to_mapping_map_.end())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  PlatformSharedBufferMapping* mapping_to_delete = it->second;
-  address_to_mapping_map_.erase(it);
-  delete mapping_to_delete;
-  return MOJO_RESULT_OK;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/mapping_table.h b/mojo/edk/system/mapping_table.h
deleted file mode 100644
index 00167e3..0000000
--- a/mojo/edk/system/mapping_table.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_MAPPING_TABLE_H_
-#define MOJO_EDK_SYSTEM_MAPPING_TABLE_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/containers/hash_tables.h"
-#include "base/macros.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-
-namespace edk {
-class Core;
-class PlatformSharedBufferMapping;
-
-// Test-only function (defined/used in embedder/test_embedder.cc). Declared here
-// so it can be friended.
-namespace internal {
-bool ShutdownCheckNoLeaks(Core*);
-}
-
-// This class provides the (global) table of memory mappings (owned by |Core|),
-// which maps mapping base addresses to |PlatformSharedBufferMapping|s.
-//
-// This class is NOT thread-safe; locking is left to |Core|.
-class MOJO_SYSTEM_IMPL_EXPORT MappingTable {
- public:
-  MappingTable();
-  ~MappingTable();
-
-  // Tries to add a mapping. (Takes ownership of the mapping in all cases; on
-  // failure, it will be destroyed.)
-  MojoResult AddMapping(std::unique_ptr<PlatformSharedBufferMapping> mapping);
-  MojoResult RemoveMapping(void* address);
-
- private:
-  friend bool internal::ShutdownCheckNoLeaks(Core*);
-
-  using AddressToMappingMap =
-      base::hash_map<void*, PlatformSharedBufferMapping*>;
-  AddressToMappingMap address_to_mapping_map_;
-
-  DISALLOW_COPY_AND_ASSIGN(MappingTable);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_MAPPING_TABLE_H_
diff --git a/mojo/edk/system/message_for_transit.cc b/mojo/edk/system/message_for_transit.cc
deleted file mode 100644
index 26658e1..0000000
--- a/mojo/edk/system/message_for_transit.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/message_for_transit.h"
-
-#include <vector>
-
-#include "mojo/edk/embedder/platform_handle_vector.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-static_assert(sizeof(MessageForTransit::MessageHeader) % 8 == 0,
-              "Invalid MessageHeader size.");
-static_assert(sizeof(MessageForTransit::DispatcherHeader) % 8 == 0,
-              "Invalid DispatcherHeader size.");
-
-}  // namespace
-
-MessageForTransit::~MessageForTransit() {}
-
-// static
-MojoResult MessageForTransit::Create(
-    std::unique_ptr<MessageForTransit>* message,
-    uint32_t num_bytes,
-    const Dispatcher::DispatcherInTransit* dispatchers,
-    uint32_t num_dispatchers) {
-  // A structure for retaining information about every Dispatcher that will be
-  // sent with this message.
-  struct DispatcherInfo {
-    uint32_t num_bytes;
-    uint32_t num_ports;
-    uint32_t num_handles;
-  };
-
-  // This is only the base header size. It will grow as we accumulate the
-  // size of serialized state for each dispatcher.
-  size_t header_size = sizeof(MessageHeader) +
-      num_dispatchers * sizeof(DispatcherHeader);
-  size_t num_ports = 0;
-  size_t num_handles = 0;
-
-  std::vector<DispatcherInfo> dispatcher_info(num_dispatchers);
-  for (size_t i = 0; i < num_dispatchers; ++i) {
-    Dispatcher* d = dispatchers[i].dispatcher.get();
-    d->StartSerialize(&dispatcher_info[i].num_bytes,
-                      &dispatcher_info[i].num_ports,
-                      &dispatcher_info[i].num_handles);
-    header_size += dispatcher_info[i].num_bytes;
-    num_ports += dispatcher_info[i].num_ports;
-    num_handles += dispatcher_info[i].num_handles;
-  }
-
-  // We now have enough information to fully allocate the message storage.
-  std::unique_ptr<PortsMessage> msg = PortsMessage::NewUserMessage(
-      header_size + num_bytes, num_ports, num_handles);
-  if (!msg)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  // Populate the message header with information about serialized dispatchers.
-  //
-  // The front of the message is always a MessageHeader followed by a
-  // DispatcherHeader for each dispatcher to be sent.
-  MessageHeader* header =
-      static_cast<MessageHeader*>(msg->mutable_payload_bytes());
-  DispatcherHeader* dispatcher_headers =
-      reinterpret_cast<DispatcherHeader*>(header + 1);
-
-  // Serialized dispatcher state immediately follows the series of
-  // DispatcherHeaders.
-  char* dispatcher_data =
-      reinterpret_cast<char*>(dispatcher_headers + num_dispatchers);
-
-  header->num_dispatchers = num_dispatchers;
-
-  // |header_size| is the total number of bytes preceding the message payload,
-  // including all dispatcher headers and serialized dispatcher state.
-  DCHECK_LE(header_size, std::numeric_limits<uint32_t>::max());
-  header->header_size = static_cast<uint32_t>(header_size);
-
-  if (num_dispatchers > 0) {
-    ScopedPlatformHandleVectorPtr handles(
-        new PlatformHandleVector(num_handles));
-    size_t port_index = 0;
-    size_t handle_index = 0;
-    bool fail = false;
-    for (size_t i = 0; i < num_dispatchers; ++i) {
-      Dispatcher* d = dispatchers[i].dispatcher.get();
-      DispatcherHeader* dh = &dispatcher_headers[i];
-      const DispatcherInfo& info = dispatcher_info[i];
-
-      // Fill in the header for this dispatcher.
-      dh->type = static_cast<int32_t>(d->GetType());
-      dh->num_bytes = info.num_bytes;
-      dh->num_ports = info.num_ports;
-      dh->num_platform_handles = info.num_handles;
-
-      // Fill in serialized state, ports, and platform handles. We'll cancel
-      // the send if the dispatcher implementation rejects for some reason.
-      if (!d->EndSerialize(static_cast<void*>(dispatcher_data),
-                           msg->mutable_ports() + port_index,
-                           handles->data() + handle_index)) {
-        fail = true;
-        break;
-      }
-
-      dispatcher_data += info.num_bytes;
-      port_index += info.num_ports;
-      handle_index += info.num_handles;
-    }
-
-    if (fail) {
-      // Release any platform handles we've accumulated. Their dispatchers
-      // retain ownership when message creation fails, so these are not actually
-      // leaking.
-      handles->clear();
-      return MOJO_RESULT_INVALID_ARGUMENT;
-    }
-
-    // Take ownership of all the handles and move them into message storage.
-    msg->SetHandles(std::move(handles));
-  }
-
-  message->reset(new MessageForTransit(std::move(msg)));
-  return MOJO_RESULT_OK;
-}
-
-MessageForTransit::MessageForTransit(std::unique_ptr<PortsMessage> message)
-    : message_(std::move(message)) {
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/message_for_transit.h b/mojo/edk/system/message_for_transit.h
deleted file mode 100644
index 6103a77..0000000
--- a/mojo/edk/system/message_for_transit.h
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_MESSAGE_FOR_TRANSIT_H_
-#define MOJO_EDK_SYSTEM_MESSAGE_FOR_TRANSIT_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/ports_message.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-// MessageForTransit holds onto a PortsMessage which may be sent via
-// |MojoWriteMessage()| or which may have been received on a pipe endpoint.
-// Instances of this class are exposed to Mojo system API consumers via the
-// opaque pointers used with |MojoCreateMessage()|, |MojoDestroyMessage()|,
-// |MojoWriteMessageNew()|, and |MojoReadMessageNew()|.
-class MOJO_SYSTEM_IMPL_EXPORT MessageForTransit {
- public:
-#pragma pack(push, 1)
-  // Header attached to every message.
-  struct MessageHeader {
-    // The number of serialized dispatchers included in this header.
-    uint32_t num_dispatchers;
-
-    // Total size of the header, including serialized dispatcher data.
-    uint32_t header_size;
-  };
-
-  // Header for each dispatcher in a message, immediately following the message
-  // header.
-  struct DispatcherHeader {
-    // The type of the dispatcher, correpsonding to the Dispatcher::Type enum.
-    int32_t type;
-
-    // The size of the serialized dispatcher, not including this header.
-    uint32_t num_bytes;
-
-    // The number of ports needed to deserialize this dispatcher.
-    uint32_t num_ports;
-
-    // The number of platform handles needed to deserialize this dispatcher.
-    uint32_t num_platform_handles;
-  };
-#pragma pack(pop)
-
-  ~MessageForTransit();
-
-  // A static constructor for building outbound messages.
-  static MojoResult Create(
-      std::unique_ptr<MessageForTransit>* message,
-      uint32_t num_bytes,
-      const Dispatcher::DispatcherInTransit* dispatchers,
-      uint32_t num_dispatchers);
-
-  // A static constructor for wrapping inbound messages.
-  static std::unique_ptr<MessageForTransit> WrapPortsMessage(
-      std::unique_ptr<PortsMessage> message) {
-    return base::WrapUnique(new MessageForTransit(std::move(message)));
-  }
-
-  const void* bytes() const {
-    DCHECK(message_);
-    return static_cast<const void*>(
-        static_cast<const char*>(message_->payload_bytes()) +
-            header()->header_size);
-  }
-
-  void* mutable_bytes() {
-    DCHECK(message_);
-    return static_cast<void*>(
-        static_cast<char*>(message_->mutable_payload_bytes()) +
-            header()->header_size);
-  }
-
-  size_t num_bytes() const {
-    size_t header_size = header()->header_size;
-    DCHECK_GE(message_->num_payload_bytes(), header_size);
-    return message_->num_payload_bytes() - header_size;
-  }
-
-  size_t num_handles() const { return header()->num_dispatchers; }
-
-  const PortsMessage& ports_message() const { return *message_; }
-
-  std::unique_ptr<PortsMessage> TakePortsMessage() {
-    return std::move(message_);
-  }
-
- private:
-  explicit MessageForTransit(std::unique_ptr<PortsMessage> message);
-
-  const MessageForTransit::MessageHeader* header() const {
-    DCHECK(message_);
-    return static_cast<const MessageForTransit::MessageHeader*>(
-        message_->payload_bytes());
-  }
-
-  std::unique_ptr<PortsMessage> message_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageForTransit);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_MESSAGE_FOR_TRANSIT_H_
diff --git a/mojo/edk/system/message_pipe_dispatcher.cc b/mojo/edk/system/message_pipe_dispatcher.cc
deleted file mode 100644
index 1db56c0..0000000
--- a/mojo/edk/system/message_pipe_dispatcher.cc
+++ /dev/null
@@ -1,554 +0,0 @@
-// Copyright 2015 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 "mojo/edk/system/message_pipe_dispatcher.h"
-
-#include <limits>
-#include <memory>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/message_for_transit.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/ports/message_filter.h"
-#include "mojo/edk/system/ports_message.h"
-#include "mojo/edk/system/request_context.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-using DispatcherHeader = MessageForTransit::DispatcherHeader;
-using MessageHeader = MessageForTransit::MessageHeader;
-
-#pragma pack(push, 1)
-
-struct SerializedState {
-  uint64_t pipe_id;
-  int8_t endpoint;
-  char padding[7];
-};
-
-static_assert(sizeof(SerializedState) % 8 == 0,
-              "Invalid SerializedState size.");
-
-#pragma pack(pop)
-
-}  // namespace
-
-// A PortObserver which forwards to a MessagePipeDispatcher. This owns a
-// reference to the MPD to ensure it lives as long as the observed port.
-class MessagePipeDispatcher::PortObserverThunk
-    : public NodeController::PortObserver {
- public:
-  explicit PortObserverThunk(scoped_refptr<MessagePipeDispatcher> dispatcher)
-      : dispatcher_(dispatcher) {}
-
- private:
-  ~PortObserverThunk() override {}
-
-  // NodeController::PortObserver:
-  void OnPortStatusChanged() override { dispatcher_->OnPortStatusChanged(); }
-
-  scoped_refptr<MessagePipeDispatcher> dispatcher_;
-
-  DISALLOW_COPY_AND_ASSIGN(PortObserverThunk);
-};
-
-// A MessageFilter used by ReadMessage to determine whether a message should
-// actually be consumed yet.
-class ReadMessageFilter : public ports::MessageFilter {
- public:
-  // Creates a new ReadMessageFilter which captures and potentially modifies
-  // various (unowned) local state within MessagePipeDispatcher::ReadMessage.
-  ReadMessageFilter(bool read_any_size,
-                    bool may_discard,
-                    uint32_t* num_bytes,
-                    uint32_t* num_handles,
-                    bool* no_space,
-                    bool* invalid_message)
-      : read_any_size_(read_any_size),
-        may_discard_(may_discard),
-        num_bytes_(num_bytes),
-        num_handles_(num_handles),
-        no_space_(no_space),
-        invalid_message_(invalid_message) {}
-
-  ~ReadMessageFilter() override {}
-
-  // ports::MessageFilter:
-  bool Match(const ports::Message& m) override {
-    const PortsMessage& message = static_cast<const PortsMessage&>(m);
-    if (message.num_payload_bytes() < sizeof(MessageHeader)) {
-      *invalid_message_ = true;
-      return true;
-    }
-
-    const MessageHeader* header =
-        static_cast<const MessageHeader*>(message.payload_bytes());
-    if (header->header_size > message.num_payload_bytes()) {
-      *invalid_message_ = true;
-      return true;
-    }
-
-    uint32_t bytes_to_read = 0;
-    uint32_t bytes_available =
-        static_cast<uint32_t>(message.num_payload_bytes()) -
-        header->header_size;
-    if (num_bytes_) {
-      bytes_to_read = std::min(*num_bytes_, bytes_available);
-      *num_bytes_ = bytes_available;
-    }
-
-    uint32_t handles_to_read = 0;
-    uint32_t handles_available = header->num_dispatchers;
-    if (num_handles_) {
-      handles_to_read = std::min(*num_handles_, handles_available);
-      *num_handles_ = handles_available;
-    }
-
-    if (handles_to_read < handles_available ||
-        (!read_any_size_ && bytes_to_read < bytes_available)) {
-      *no_space_ = true;
-      return may_discard_;
-    }
-
-    return true;
-  }
-
- private:
-  const bool read_any_size_;
-  const bool may_discard_;
-  uint32_t* const num_bytes_;
-  uint32_t* const num_handles_;
-  bool* const no_space_;
-  bool* const invalid_message_;
-
-  DISALLOW_COPY_AND_ASSIGN(ReadMessageFilter);
-};
-
-#if DCHECK_IS_ON()
-
-// A MessageFilter which never matches a message. Used to peek at the size of
-// the next available message on a port, for debug logging only.
-class PeekSizeMessageFilter : public ports::MessageFilter {
- public:
-  PeekSizeMessageFilter() {}
-  ~PeekSizeMessageFilter() override {}
-
-  // ports::MessageFilter:
-  bool Match(const ports::Message& message) override {
-    message_size_ = message.num_payload_bytes();
-    return false;
-  }
-
-  size_t message_size() const { return message_size_; }
-
- private:
-  size_t message_size_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(PeekSizeMessageFilter);
-};
-
-#endif  // DCHECK_IS_ON()
-
-MessagePipeDispatcher::MessagePipeDispatcher(NodeController* node_controller,
-                                             const ports::PortRef& port,
-                                             uint64_t pipe_id,
-                                             int endpoint)
-    : node_controller_(node_controller),
-      port_(port),
-      pipe_id_(pipe_id),
-      endpoint_(endpoint),
-      watchers_(this) {
-  DVLOG(2) << "Creating new MessagePipeDispatcher for port " << port.name()
-           << " [pipe_id=" << pipe_id << "; endpoint=" << endpoint << "]";
-
-  node_controller_->SetPortObserver(
-      port_,
-      make_scoped_refptr(new PortObserverThunk(this)));
-}
-
-bool MessagePipeDispatcher::Fuse(MessagePipeDispatcher* other) {
-  node_controller_->SetPortObserver(port_, nullptr);
-  node_controller_->SetPortObserver(other->port_, nullptr);
-
-  ports::PortRef port0;
-  {
-    base::AutoLock lock(signal_lock_);
-    port0 = port_;
-    port_closed_.Set(true);
-    watchers_.NotifyClosed();
-  }
-
-  ports::PortRef port1;
-  {
-    base::AutoLock lock(other->signal_lock_);
-    port1 = other->port_;
-    other->port_closed_.Set(true);
-    other->watchers_.NotifyClosed();
-  }
-
-  // Both ports are always closed by this call.
-  int rv = node_controller_->MergeLocalPorts(port0, port1);
-  return rv == ports::OK;
-}
-
-Dispatcher::Type MessagePipeDispatcher::GetType() const {
-  return Type::MESSAGE_PIPE;
-}
-
-MojoResult MessagePipeDispatcher::Close() {
-  base::AutoLock lock(signal_lock_);
-  DVLOG(2) << "Closing message pipe " << pipe_id_ << " endpoint " << endpoint_
-           << " [port=" << port_.name() << "]";
-  return CloseNoLock();
-}
-
-MojoResult MessagePipeDispatcher::WriteMessage(
-    std::unique_ptr<MessageForTransit> message,
-    MojoWriteMessageFlags flags) {
-  if (port_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  size_t num_bytes = message->num_bytes();
-  int rv = node_controller_->SendMessage(port_, message->TakePortsMessage());
-
-  DVLOG(4) << "Sent message on pipe " << pipe_id_ << " endpoint " << endpoint_
-           << " [port=" << port_.name() << "; rv=" << rv
-           << "; num_bytes=" << num_bytes << "]";
-
-  if (rv != ports::OK) {
-    if (rv == ports::ERROR_PORT_UNKNOWN ||
-        rv == ports::ERROR_PORT_STATE_UNEXPECTED ||
-        rv == ports::ERROR_PORT_CANNOT_SEND_PEER) {
-      return MOJO_RESULT_INVALID_ARGUMENT;
-    } else if (rv == ports::ERROR_PORT_PEER_CLOSED) {
-      return MOJO_RESULT_FAILED_PRECONDITION;
-    }
-
-    NOTREACHED();
-    return MOJO_RESULT_UNKNOWN;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult MessagePipeDispatcher::ReadMessage(
-    std::unique_ptr<MessageForTransit>* message,
-    uint32_t* num_bytes,
-    MojoHandle* handles,
-    uint32_t* num_handles,
-    MojoReadMessageFlags flags,
-    bool read_any_size) {
-  // We can't read from a port that's closed or in transit!
-  if (port_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  bool no_space = false;
-  bool may_discard = flags & MOJO_READ_MESSAGE_FLAG_MAY_DISCARD;
-  bool invalid_message = false;
-
-  // Grab a message if the provided handles buffer is large enough. If the input
-  // |num_bytes| is provided and |read_any_size| is false, we also ensure
-  // that it specifies a size at least as large as the next available payload.
-  //
-  // If |read_any_size| is true, the input value of |*num_bytes| is ignored.
-  // This flag exists to support both new and old API behavior.
-
-  ports::ScopedMessage ports_message;
-  ReadMessageFilter filter(read_any_size, may_discard, num_bytes, num_handles,
-                           &no_space, &invalid_message);
-  int rv = node_controller_->node()->GetMessage(port_, &ports_message, &filter);
-
-  if (invalid_message)
-    return MOJO_RESULT_UNKNOWN;
-
-  if (rv != ports::OK && rv != ports::ERROR_PORT_PEER_CLOSED) {
-    if (rv == ports::ERROR_PORT_UNKNOWN ||
-        rv == ports::ERROR_PORT_STATE_UNEXPECTED)
-      return MOJO_RESULT_INVALID_ARGUMENT;
-
-    NOTREACHED();
-    return MOJO_RESULT_UNKNOWN;  // TODO: Add a better error code here?
-  }
-
-  if (no_space) {
-    if (may_discard) {
-      // May have been the last message on the pipe. Need to update signals just
-      // in case.
-      base::AutoLock lock(signal_lock_);
-      watchers_.NotifyState(GetHandleSignalsStateNoLock());
-    }
-    // |*num_handles| (and/or |*num_bytes| if |read_any_size| is false) wasn't
-    // sufficient to hold this message's data. The message will still be in
-    // queue unless MOJO_READ_MESSAGE_FLAG_MAY_DISCARD was set.
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  if (!ports_message) {
-    // No message was available in queue.
-
-    if (rv == ports::OK)
-      return MOJO_RESULT_SHOULD_WAIT;
-
-    // Peer is closed and there are no more messages to read.
-    DCHECK_EQ(rv, ports::ERROR_PORT_PEER_CLOSED);
-    return MOJO_RESULT_FAILED_PRECONDITION;
-  }
-
-  // Alright! We have a message and the caller has provided sufficient storage
-  // in which to receive it.
-
-  {
-    // We need to update anyone watching our signals in case that was the last
-    // available message.
-    base::AutoLock lock(signal_lock_);
-    watchers_.NotifyState(GetHandleSignalsStateNoLock());
-  }
-
-  std::unique_ptr<PortsMessage> msg(
-      static_cast<PortsMessage*>(ports_message.release()));
-
-  const MessageHeader* header =
-      static_cast<const MessageHeader*>(msg->payload_bytes());
-  const DispatcherHeader* dispatcher_headers =
-      reinterpret_cast<const DispatcherHeader*>(header + 1);
-
-  if (header->num_dispatchers > std::numeric_limits<uint16_t>::max())
-    return MOJO_RESULT_UNKNOWN;
-
-  // Deserialize dispatchers.
-  if (header->num_dispatchers > 0) {
-    CHECK(handles);
-    std::vector<DispatcherInTransit> dispatchers(header->num_dispatchers);
-    size_t data_payload_index = sizeof(MessageHeader) +
-        header->num_dispatchers * sizeof(DispatcherHeader);
-    if (data_payload_index > header->header_size)
-      return MOJO_RESULT_UNKNOWN;
-    const char* dispatcher_data = reinterpret_cast<const char*>(
-        dispatcher_headers + header->num_dispatchers);
-    size_t port_index = 0;
-    size_t platform_handle_index = 0;
-    ScopedPlatformHandleVectorPtr msg_handles = msg->TakeHandles();
-    const size_t num_msg_handles = msg_handles ? msg_handles->size() : 0;
-    for (size_t i = 0; i < header->num_dispatchers; ++i) {
-      const DispatcherHeader& dh = dispatcher_headers[i];
-      Type type = static_cast<Type>(dh.type);
-
-      size_t next_payload_index = data_payload_index + dh.num_bytes;
-      if (msg->num_payload_bytes() < next_payload_index ||
-          next_payload_index < data_payload_index) {
-        return MOJO_RESULT_UNKNOWN;
-      }
-
-      size_t next_port_index = port_index + dh.num_ports;
-      if (msg->num_ports() < next_port_index || next_port_index < port_index)
-        return MOJO_RESULT_UNKNOWN;
-
-      size_t next_platform_handle_index =
-          platform_handle_index + dh.num_platform_handles;
-      if (num_msg_handles < next_platform_handle_index ||
-          next_platform_handle_index < platform_handle_index) {
-        return MOJO_RESULT_UNKNOWN;
-      }
-
-      PlatformHandle* out_handles =
-          num_msg_handles ? msg_handles->data() + platform_handle_index
-                          : nullptr;
-      dispatchers[i].dispatcher = Dispatcher::Deserialize(
-          type, dispatcher_data, dh.num_bytes, msg->ports() + port_index,
-          dh.num_ports, out_handles, dh.num_platform_handles);
-      if (!dispatchers[i].dispatcher)
-        return MOJO_RESULT_UNKNOWN;
-
-      dispatcher_data += dh.num_bytes;
-      data_payload_index = next_payload_index;
-      port_index = next_port_index;
-      platform_handle_index = next_platform_handle_index;
-    }
-
-    if (!node_controller_->core()->AddDispatchersFromTransit(dispatchers,
-                                                             handles))
-      return MOJO_RESULT_UNKNOWN;
-  }
-
-  CHECK(msg);
-  *message = MessageForTransit::WrapPortsMessage(std::move(msg));
-  return MOJO_RESULT_OK;
-}
-
-HandleSignalsState
-MessagePipeDispatcher::GetHandleSignalsState() const {
-  base::AutoLock lock(signal_lock_);
-  return GetHandleSignalsStateNoLock();
-}
-
-MojoResult MessagePipeDispatcher::AddWatcherRef(
-    const scoped_refptr<WatcherDispatcher>& watcher,
-    uintptr_t context) {
-  base::AutoLock lock(signal_lock_);
-  if (port_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watchers_.Add(watcher, context, GetHandleSignalsStateNoLock());
-}
-
-MojoResult MessagePipeDispatcher::RemoveWatcherRef(WatcherDispatcher* watcher,
-                                                   uintptr_t context) {
-  base::AutoLock lock(signal_lock_);
-  if (port_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watchers_.Remove(watcher, context);
-}
-
-void MessagePipeDispatcher::StartSerialize(uint32_t* num_bytes,
-                                           uint32_t* num_ports,
-                                           uint32_t* num_handles) {
-  *num_bytes = static_cast<uint32_t>(sizeof(SerializedState));
-  *num_ports = 1;
-  *num_handles = 0;
-}
-
-bool MessagePipeDispatcher::EndSerialize(void* destination,
-                                         ports::PortName* ports,
-                                         PlatformHandle* handles) {
-  SerializedState* state = static_cast<SerializedState*>(destination);
-  state->pipe_id = pipe_id_;
-  state->endpoint = static_cast<int8_t>(endpoint_);
-  memset(state->padding, 0, sizeof(state->padding));
-  ports[0] = port_.name();
-  return true;
-}
-
-bool MessagePipeDispatcher::BeginTransit() {
-  base::AutoLock lock(signal_lock_);
-  if (in_transit_ || port_closed_)
-    return false;
-  in_transit_.Set(true);
-  return in_transit_;
-}
-
-void MessagePipeDispatcher::CompleteTransitAndClose() {
-  node_controller_->SetPortObserver(port_, nullptr);
-
-  base::AutoLock lock(signal_lock_);
-  port_transferred_ = true;
-  in_transit_.Set(false);
-  CloseNoLock();
-}
-
-void MessagePipeDispatcher::CancelTransit() {
-  base::AutoLock lock(signal_lock_);
-  in_transit_.Set(false);
-
-  // Something may have happened while we were waiting for potential transit.
-  watchers_.NotifyState(GetHandleSignalsStateNoLock());
-}
-
-// static
-scoped_refptr<Dispatcher> MessagePipeDispatcher::Deserialize(
-    const void* data,
-    size_t num_bytes,
-    const ports::PortName* ports,
-    size_t num_ports,
-    PlatformHandle* handles,
-    size_t num_handles) {
-  if (num_ports != 1 || num_handles || num_bytes != sizeof(SerializedState))
-    return nullptr;
-
-  const SerializedState* state = static_cast<const SerializedState*>(data);
-
-  ports::PortRef port;
-  CHECK_EQ(
-      ports::OK,
-      internal::g_core->GetNodeController()->node()->GetPort(ports[0], &port));
-
-  return new MessagePipeDispatcher(internal::g_core->GetNodeController(), port,
-                                   state->pipe_id, state->endpoint);
-}
-
-MessagePipeDispatcher::~MessagePipeDispatcher() {
-  DCHECK(port_closed_ && !in_transit_);
-}
-
-MojoResult MessagePipeDispatcher::CloseNoLock() {
-  signal_lock_.AssertAcquired();
-  if (port_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  port_closed_.Set(true);
-  watchers_.NotifyClosed();
-
-  if (!port_transferred_) {
-    base::AutoUnlock unlock(signal_lock_);
-    node_controller_->ClosePort(port_);
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-HandleSignalsState MessagePipeDispatcher::GetHandleSignalsStateNoLock() const {
-  HandleSignalsState rv;
-
-  ports::PortStatus port_status;
-  if (node_controller_->node()->GetStatus(port_, &port_status) != ports::OK) {
-    CHECK(in_transit_ || port_transferred_ || port_closed_);
-    return HandleSignalsState();
-  }
-
-  if (port_status.has_messages) {
-    rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-  }
-  if (port_status.receiving_messages)
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-  if (!port_status.peer_closed) {
-    rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_WRITABLE;
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_WRITABLE;
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-  } else {
-    rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-  }
-  rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-  return rv;
-}
-
-void MessagePipeDispatcher::OnPortStatusChanged() {
-  DCHECK(RequestContext::current());
-
-  base::AutoLock lock(signal_lock_);
-
-  // We stop observing our port as soon as it's transferred, but this can race
-  // with events which are raised right before that happens. This is fine to
-  // ignore.
-  if (port_transferred_)
-    return;
-
-#if DCHECK_IS_ON()
-  ports::PortStatus port_status;
-  if (node_controller_->node()->GetStatus(port_, &port_status) == ports::OK) {
-    if (port_status.has_messages) {
-      ports::ScopedMessage unused;
-      PeekSizeMessageFilter filter;
-      node_controller_->node()->GetMessage(port_, &unused, &filter);
-      DVLOG(4) << "New message detected on message pipe " << pipe_id_
-               << " endpoint " << endpoint_ << " [port=" << port_.name()
-               << "; size=" << filter.message_size() << "]";
-    }
-    if (port_status.peer_closed) {
-      DVLOG(2) << "Peer closure detected on message pipe " << pipe_id_
-               << " endpoint " << endpoint_ << " [port=" << port_.name() << "]";
-    }
-  }
-#endif
-
-  watchers_.NotifyState(GetHandleSignalsStateNoLock());
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/message_pipe_dispatcher.h b/mojo/edk/system/message_pipe_dispatcher.h
deleted file mode 100644
index 574ad66..0000000
--- a/mojo/edk/system/message_pipe_dispatcher.h
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2015 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 MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <queue>
-
-#include "base/macros.h"
-#include "mojo/edk/system/atomic_flag.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/message_for_transit.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/watcher_set.h"
-
-namespace mojo {
-namespace edk {
-
-class NodeController;
-
-class MessagePipeDispatcher : public Dispatcher {
- public:
-  // Constructs a MessagePipeDispatcher permanently tied to a specific port.
-  // |connected| must indicate the state of the port at construction time; if
-  // the port is initialized with a peer, |connected| must be true. Otherwise it
-  // must be false.
-  //
-  // A MessagePipeDispatcher may not be transferred while in a disconnected
-  // state, and one can never return to a disconnected once connected.
-  //
-  // |pipe_id| is a unique identifier which can be used to track pipe endpoints
-  // as they're passed around. |endpoint| is either 0 or 1 and again is only
-  // used for tracking pipes (one side is always 0, the other is always 1.)
-  MessagePipeDispatcher(NodeController* node_controller,
-                        const ports::PortRef& port,
-                        uint64_t pipe_id,
-                        int endpoint);
-
-  // Fuses this pipe with |other|. Returns |true| on success or |false| on
-  // failure. Regardless of the return value, both dispatchers are closed by
-  // this call.
-  bool Fuse(MessagePipeDispatcher* other);
-
-  // Dispatcher:
-  Type GetType() const override;
-  MojoResult Close() override;
-  MojoResult WriteMessage(std::unique_ptr<MessageForTransit> message,
-                          MojoWriteMessageFlags flags) override;
-  MojoResult ReadMessage(std::unique_ptr<MessageForTransit>* message,
-                         uint32_t* num_bytes,
-                         MojoHandle* handles,
-                         uint32_t* num_handles,
-                         MojoReadMessageFlags flags,
-                         bool read_any_size) override;
-  HandleSignalsState GetHandleSignalsState() const override;
-  MojoResult AddWatcherRef(const scoped_refptr<WatcherDispatcher>& watcher,
-                           uintptr_t context) override;
-  MojoResult RemoveWatcherRef(WatcherDispatcher* watcher,
-                              uintptr_t context) override;
-  void StartSerialize(uint32_t* num_bytes,
-                      uint32_t* num_ports,
-                      uint32_t* num_handles) override;
-  bool EndSerialize(void* destination,
-                    ports::PortName* ports,
-                    PlatformHandle* handles) override;
-  bool BeginTransit() override;
-  void CompleteTransitAndClose() override;
-  void CancelTransit() override;
-
-  static scoped_refptr<Dispatcher> Deserialize(
-      const void* data,
-      size_t num_bytes,
-      const ports::PortName* ports,
-      size_t num_ports,
-      PlatformHandle* handles,
-      size_t num_handles);
-
- private:
-  class PortObserverThunk;
-  friend class PortObserverThunk;
-
-  ~MessagePipeDispatcher() override;
-
-  MojoResult CloseNoLock();
-  HandleSignalsState GetHandleSignalsStateNoLock() const;
-  void OnPortStatusChanged();
-
-  // These are safe to access from any thread without locking.
-  NodeController* const node_controller_;
-  const ports::PortRef port_;
-  const uint64_t pipe_id_;
-  const int endpoint_;
-
-  // Guards access to all the fields below.
-  mutable base::Lock signal_lock_;
-
-  // This is not the same is |port_transferred_|. It's only held true between
-  // BeginTransit() and Complete/CancelTransit().
-  AtomicFlag in_transit_;
-
-  bool port_transferred_ = false;
-  AtomicFlag port_closed_;
-  WatcherSet watchers_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessagePipeDispatcher);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_
diff --git a/mojo/edk/system/message_pipe_perftest.cc b/mojo/edk/system/message_pipe_perftest.cc
deleted file mode 100644
index 9866c47..0000000
--- a/mojo/edk/system/message_pipe_perftest.cc
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/perf_time_logger.h"
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/edk/test/test_utils.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-class MessagePipePerfTest : public test::MojoTestBase {
- public:
-  MessagePipePerfTest() : message_count_(0), message_size_(0) {}
-
-  void SetUpMeasurement(int message_count, size_t message_size) {
-    message_count_ = message_count;
-    message_size_ = message_size;
-    payload_ = std::string(message_size, '*');
-    read_buffer_.resize(message_size * 2);
-  }
-
- protected:
-  void WriteWaitThenRead(MojoHandle mp) {
-    CHECK_EQ(MojoWriteMessage(mp, payload_.data(),
-                              static_cast<uint32_t>(payload_.size()), nullptr,
-                              0, MOJO_WRITE_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    HandleSignalsState hss;
-    CHECK_EQ(WaitForSignals(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss),
-             MOJO_RESULT_OK);
-    uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer_.size());
-    CHECK_EQ(MojoReadMessage(mp, &read_buffer_[0], &read_buffer_size, nullptr,
-                             nullptr, MOJO_READ_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    CHECK_EQ(read_buffer_size, static_cast<uint32_t>(payload_.size()));
-  }
-
-  void SendQuitMessage(MojoHandle mp) {
-    CHECK_EQ(MojoWriteMessage(mp, "", 0, nullptr, 0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-  }
-
-  void Measure(MojoHandle mp) {
-    // Have one ping-pong to ensure channel being established.
-    WriteWaitThenRead(mp);
-
-    std::string test_name =
-        base::StringPrintf("IPC_Perf_%dx_%u", message_count_,
-                           static_cast<unsigned>(message_size_));
-    base::PerfTimeLogger logger(test_name.c_str());
-
-    for (int i = 0; i < message_count_; ++i)
-      WriteWaitThenRead(mp);
-
-    logger.Done();
-  }
-
- protected:
-  void RunPingPongServer(MojoHandle mp) {
-    // This values are set to align with one at ipc_pertests.cc for comparison.
-    const size_t kMsgSize[5] = {12, 144, 1728, 20736, 248832};
-    const int kMessageCount[5] = {50000, 50000, 50000, 12000, 1000};
-
-    for (size_t i = 0; i < 5; i++) {
-      SetUpMeasurement(kMessageCount[i], kMsgSize[i]);
-      Measure(mp);
-    }
-
-    SendQuitMessage(mp);
-  }
-
-  static int RunPingPongClient(MojoHandle mp) {
-    std::string buffer(1000000, '\0');
-    int rv = 0;
-    while (true) {
-      // Wait for our end of the message pipe to be readable.
-      HandleSignalsState hss;
-      MojoResult result = WaitForSignals(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss);
-      if (result != MOJO_RESULT_OK) {
-        rv = result;
-        break;
-      }
-
-      uint32_t read_size = static_cast<uint32_t>(buffer.size());
-      CHECK_EQ(MojoReadMessage(mp, &buffer[0],
-                               &read_size, nullptr,
-                               0, MOJO_READ_MESSAGE_FLAG_NONE),
-               MOJO_RESULT_OK);
-
-      // Empty message indicates quit.
-      if (read_size == 0)
-        break;
-
-      CHECK_EQ(MojoWriteMessage(mp, &buffer[0],
-                                read_size,
-                                nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE),
-               MOJO_RESULT_OK);
-    }
-
-    return rv;
-  }
-
- private:
-  int message_count_;
-  size_t message_size_;
-  std::string payload_;
-  std::string read_buffer_;
-  std::unique_ptr<base::PerfTimeLogger> perf_logger_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessagePipePerfTest);
-};
-
-TEST_F(MessagePipePerfTest, PingPong) {
-  MojoHandle server_handle, client_handle;
-  CreateMessagePipe(&server_handle, &client_handle);
-
-  base::Thread client_thread("PingPongClient");
-  client_thread.Start();
-  client_thread.task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(base::IgnoreResult(&RunPingPongClient), client_handle));
-
-  RunPingPongServer(server_handle);
-}
-
-// For each message received, sends a reply message with the same contents
-// repeated twice, until the other end is closed or it receives "quitquitquit"
-// (which it doesn't reply to). It'll return the number of messages received,
-// not including any "quitquitquit" message, modulo 100.
-DEFINE_TEST_CLIENT_WITH_PIPE(PingPongClient, MessagePipePerfTest, h) {
-  return RunPingPongClient(h);
-}
-
-// Repeatedly sends messages as previous one got replied by the child.
-// Waits for the child to close its end before quitting once specified
-// number of messages has been sent.
-TEST_F(MessagePipePerfTest, MultiprocessPingPong) {
-  RUN_CHILD_ON_PIPE(PingPongClient, h)
-    RunPingPongServer(h);
-  END_CHILD()
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/message_pipe_unittest.cc b/mojo/edk/system/message_pipe_unittest.cc
deleted file mode 100644
index e6f1ff6..0000000
--- a/mojo/edk/system/message_pipe_unittest.cc
+++ /dev/null
@@ -1,699 +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.
-
-#include <stdint.h>
-#include <string.h>
-
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/core.h"
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE |
-                                      MOJO_HANDLE_SIGNAL_WRITABLE |
-                                      MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-static const char kHelloWorld[] = "hello world";
-
-class MessagePipeTest : public test::MojoTestBase {
- public:
-  MessagePipeTest() {
-    CHECK_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe0_, &pipe1_));
-  }
-
-  ~MessagePipeTest() override {
-    if (pipe0_ != MOJO_HANDLE_INVALID)
-      CHECK_EQ(MOJO_RESULT_OK, MojoClose(pipe0_));
-    if (pipe1_ != MOJO_HANDLE_INVALID)
-      CHECK_EQ(MOJO_RESULT_OK, MojoClose(pipe1_));
-  }
-
-  MojoResult WriteMessage(MojoHandle message_pipe_handle,
-                          const void* bytes,
-                          uint32_t num_bytes) {
-    return MojoWriteMessage(message_pipe_handle, bytes, num_bytes, nullptr, 0,
-                            MOJO_WRITE_MESSAGE_FLAG_NONE);
-  }
-
-  MojoResult ReadMessage(MojoHandle message_pipe_handle,
-                         void* bytes,
-                         uint32_t* num_bytes,
-                         bool may_discard = false) {
-    return MojoReadMessage(message_pipe_handle, bytes, num_bytes, nullptr, 0,
-                           may_discard ? MOJO_READ_MESSAGE_FLAG_MAY_DISCARD :
-                                         MOJO_READ_MESSAGE_FLAG_NONE);
-  }
-
-  MojoHandle pipe0_, pipe1_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MessagePipeTest);
-};
-
-using FuseMessagePipeTest = test::MojoTestBase;
-
-TEST_F(MessagePipeTest, WriteData) {
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WriteMessage(pipe0_, kHelloWorld, sizeof(kHelloWorld)));
-}
-
-// Tests:
-//  - only default flags
-//  - reading messages from a port
-//    - when there are no/one/two messages available for that port
-//    - with buffer size 0 (and null buffer) -- should get size
-//    - with too-small buffer -- should get size
-//    - also verify that buffers aren't modified when/where they shouldn't be
-//  - writing messages to a port
-//    - in the obvious scenarios (as above)
-//    - to a port that's been closed
-//  - writing a message to a port, closing the other (would be the source) port,
-//    and reading it
-TEST_F(MessagePipeTest, Basic) {
-  int32_t buffer[2];
-  const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
-  uint32_t buffer_size;
-
-  // Nothing to read yet on port 0.
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe0_, buffer, &buffer_size));
-  ASSERT_EQ(kBufferSize, buffer_size);
-  ASSERT_EQ(123, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  // Ditto for port 1.
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe1_, buffer, &buffer_size));
-
-  // Write from port 1 (to port 0).
-  buffer[0] = 789012345;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
-
-  MojoHandleSignalsState state;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Read from port 0.
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe0_, buffer, &buffer_size));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-  ASSERT_EQ(789012345, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  // Read again from port 0 -- it should be empty.
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe0_, buffer, &buffer_size));
-
-  // Write two messages from port 0 (to port 1).
-  buffer[0] = 123456789;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0])));
-  buffer[0] = 234567890;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0])));
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Read from port 1 with buffer size 0 (should get the size of next message).
-  // Also test that giving a null buffer is okay when the buffer size is 0.
-  buffer_size = 0;
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            ReadMessage(pipe1_, nullptr, &buffer_size));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-
-  // Read from port 1 with buffer size 1 (too small; should get the size of next
-  // message).
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = 1;
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            ReadMessage(pipe1_, buffer, &buffer_size));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-  ASSERT_EQ(123, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  // Read from port 1.
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-  ASSERT_EQ(123456789, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Read again from port 1.
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-  ASSERT_EQ(234567890, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  // Read again from port 1 -- it should be empty.
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe1_, buffer, &buffer_size));
-
-  // Write from port 0 (to port 1).
-  buffer[0] = 345678901;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0])));
-
-  // Close port 0.
-  MojoClose(pipe0_);
-  pipe0_ = MOJO_HANDLE_INVALID;
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &state));
-
-  // Try to write from port 1 (to port 0).
-  buffer[0] = 456789012;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
-
-  // Read from port 1; should still get message (even though port 0 was closed).
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-  ASSERT_EQ(345678901, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  // Read again from port 1 -- it should be empty (and port 0 is closed).
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            ReadMessage(pipe1_, buffer, &buffer_size));
-}
-
-TEST_F(MessagePipeTest, CloseWithQueuedIncomingMessages) {
-  int32_t buffer[1];
-  const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
-  uint32_t buffer_size;
-
-  // Write some messages from port 1 (to port 0).
-  for (int32_t i = 0; i < 5; i++) {
-    buffer[0] = i;
-    ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, kBufferSize));
-  }
-
-  MojoHandleSignalsState state;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Port 0 shouldn't be empty.
-  buffer_size = 0;
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            ReadMessage(pipe0_, nullptr, &buffer_size));
-  ASSERT_EQ(kBufferSize, buffer_size);
-
-  // Close port 0 first, which should have outstanding (incoming) messages.
-  MojoClose(pipe0_);
-  MojoClose(pipe1_);
-  pipe0_ = pipe1_ = MOJO_HANDLE_INVALID;
-}
-
-TEST_F(MessagePipeTest, DiscardMode) {
-  int32_t buffer[2];
-  const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
-  uint32_t buffer_size;
-
-  // Write from port 1 (to port 0).
-  buffer[0] = 789012345;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
-
-  MojoHandleSignalsState state;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Read/discard from port 0 (no buffer); get size.
-  buffer_size = 0;
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            ReadMessage(pipe0_, nullptr, &buffer_size, true));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-
-  // Read again from port 0 -- it should be empty.
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            ReadMessage(pipe0_, buffer, &buffer_size, true));
-
-  // Write from port 1 (to port 0).
-  buffer[0] = 890123456;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Read from port 0 (buffer big enough).
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe0_, buffer, &buffer_size, true));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-  ASSERT_EQ(890123456, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  // Read again from port 0 -- it should be empty.
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            ReadMessage(pipe0_, buffer, &buffer_size, true));
-
-  // Write from port 1 (to port 0).
-  buffer[0] = 901234567;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Read/discard from port 0 (buffer too small); get size.
-  buffer_size = 1;
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            ReadMessage(pipe0_, buffer, &buffer_size, true));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-
-  // Read again from port 0 -- it should be empty.
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            ReadMessage(pipe0_, buffer, &buffer_size, true));
-
-  // Write from port 1 (to port 0).
-  buffer[0] = 123456789;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Discard from port 0.
-  buffer_size = 1;
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            ReadMessage(pipe0_, nullptr, 0, true));
-
-  // Read again from port 0 -- it should be empty.
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            ReadMessage(pipe0_, buffer, &buffer_size, true));
-}
-
-TEST_F(MessagePipeTest, BasicWaiting) {
-  MojoHandleSignalsState hss;
-
-  int32_t buffer[1];
-  const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
-  uint32_t buffer_size;
-
-  // Always writable (until the other port is closed). Not yet readable. Peer
-  // not closed.
-  hss = GetSignalsState(pipe0_);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  hss = MojoHandleSignalsState();
-
-  // Write from port 0 (to port 1), to make port 1 readable.
-  buffer[0] = 123456789;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, kBufferSize));
-
-  // Port 1 should already be readable now.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  // ... and still writable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-
-  // Close port 0.
-  MojoClose(pipe0_);
-  pipe0_ = MOJO_HANDLE_INVALID;
-
-  // Port 1 should be signaled with peer closed.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Port 1 should not be writable.
-  hss = MojoHandleSignalsState();
-
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // But it should still be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Read from port 1.
-  buffer[0] = 0;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
-  ASSERT_EQ(123456789, buffer[0]);
-
-  // Now port 1 should no longer be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-}
-
-TEST_F(MessagePipeTest, InvalidMessageObjects) {
-  // null message
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoFreeMessage(MOJO_MESSAGE_HANDLE_INVALID));
-
-  // null message
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoGetMessageBuffer(MOJO_MESSAGE_HANDLE_INVALID, nullptr));
-
-  // Non-zero num_handles with null handles array.
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoAllocMessage(0, nullptr, 1, MOJO_ALLOC_MESSAGE_FLAG_NONE,
-                             nullptr));
-}
-
-TEST_F(MessagePipeTest, AllocAndFreeMessage) {
-  const std::string kMessage = "Hello, world.";
-  MojoMessageHandle message = MOJO_MESSAGE_HANDLE_INVALID;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoAllocMessage(static_cast<uint32_t>(kMessage.size()), nullptr, 0,
-                             MOJO_ALLOC_MESSAGE_FLAG_NONE, &message));
-  ASSERT_NE(MOJO_MESSAGE_HANDLE_INVALID, message);
-  ASSERT_EQ(MOJO_RESULT_OK, MojoFreeMessage(message));
-}
-
-TEST_F(MessagePipeTest, WriteAndReadMessageObject) {
-  const std::string kMessage = "Hello, world.";
-  MojoMessageHandle message = MOJO_MESSAGE_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoAllocMessage(static_cast<uint32_t>(kMessage.size()), nullptr, 0,
-                             MOJO_ALLOC_MESSAGE_FLAG_NONE, &message));
-  ASSERT_NE(MOJO_MESSAGE_HANDLE_INVALID, message);
-
-  void* buffer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoGetMessageBuffer(message, &buffer));
-  ASSERT_TRUE(buffer);
-  memcpy(buffer, kMessage.data(), kMessage.size());
-
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessageNew(a, message, MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(b, MOJO_HANDLE_SIGNAL_READABLE));
-  uint32_t num_bytes = 0;
-  uint32_t num_handles = 0;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadMessageNew(b, &message, &num_bytes, nullptr, &num_handles,
-                               MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_NE(MOJO_MESSAGE_HANDLE_INVALID, message);
-  EXPECT_EQ(static_cast<uint32_t>(kMessage.size()), num_bytes);
-  EXPECT_EQ(0u, num_handles);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoGetMessageBuffer(message, &buffer));
-  ASSERT_TRUE(buffer);
-
-  EXPECT_EQ(0, strncmp(static_cast<const char*>(buffer), kMessage.data(),
-                       num_bytes));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFreeMessage(message));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-}
-
-#if !defined(OS_IOS)
-
-const size_t kPingPongHandlesPerIteration = 50;
-const size_t kPingPongIterations = 500;
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(HandlePingPong, MessagePipeTest, h) {
-  // Waits for a handle to become readable and writes it back to the sender.
-  for (size_t i = 0; i < kPingPongIterations; i++) {
-    MojoHandle handles[kPingPongHandlesPerIteration];
-    ReadMessageWithHandles(h, handles, kPingPongHandlesPerIteration);
-    WriteMessageWithHandles(h, "", handles, kPingPongHandlesPerIteration);
-  }
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE));
-  char msg[4];
-  uint32_t num_bytes = 4;
-  EXPECT_EQ(MOJO_RESULT_OK, ReadMessage(h, msg, &num_bytes));
-}
-
-// This test is flaky: http://crbug.com/585784
-TEST_F(MessagePipeTest, DISABLED_DataPipeConsumerHandlePingPong) {
-  MojoHandle p, c[kPingPongHandlesPerIteration];
-  for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i) {
-    EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &p, &c[i]));
-    MojoClose(p);
-  }
-
-  RUN_CHILD_ON_PIPE(HandlePingPong, h)
-    for (size_t i = 0; i < kPingPongIterations; i++) {
-      WriteMessageWithHandles(h, "", c, kPingPongHandlesPerIteration);
-      ReadMessageWithHandles(h, c, kPingPongHandlesPerIteration);
-    }
-    WriteMessage(h, "quit", 4);
-  END_CHILD()
-  for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i)
-    MojoClose(c[i]);
-}
-
-// This test is flaky: http://crbug.com/585784
-TEST_F(MessagePipeTest, DISABLED_DataPipeProducerHandlePingPong) {
-  MojoHandle p[kPingPongHandlesPerIteration], c;
-  for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i) {
-    EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &p[i], &c));
-    MojoClose(c);
-  }
-
-  RUN_CHILD_ON_PIPE(HandlePingPong, h)
-    for (size_t i = 0; i < kPingPongIterations; i++) {
-      WriteMessageWithHandles(h, "", p, kPingPongHandlesPerIteration);
-      ReadMessageWithHandles(h, p, kPingPongHandlesPerIteration);
-    }
-    WriteMessage(h, "quit", 4);
-  END_CHILD()
-  for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i)
-    MojoClose(p[i]);
-}
-
-TEST_F(MessagePipeTest, SharedBufferHandlePingPong) {
-  MojoHandle buffers[kPingPongHandlesPerIteration];
-  for (size_t i = 0; i <kPingPongHandlesPerIteration; ++i)
-    EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(nullptr, 1, &buffers[i]));
-
-  RUN_CHILD_ON_PIPE(HandlePingPong, h)
-    for (size_t i = 0; i < kPingPongIterations; i++) {
-      WriteMessageWithHandles(h, "", buffers, kPingPongHandlesPerIteration);
-      ReadMessageWithHandles(h, buffers, kPingPongHandlesPerIteration);
-    }
-    WriteMessage(h, "quit", 4);
-  END_CHILD()
-  for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i)
-    MojoClose(buffers[i]);
-}
-
-#endif  // !defined(OS_IOS)
-
-TEST_F(FuseMessagePipeTest, Basic) {
-  // Test that we can fuse pipes and they still work.
-
-  MojoHandle a, b, c, d;
-  CreateMessagePipe(&a, &b);
-  CreateMessagePipe(&c, &d);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
-
-  // Handles b and c should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
-
-  const std::string kTestMessage1 = "Hello, world!";
-  const std::string kTestMessage2 = "Goodbye, world!";
-
-  WriteMessage(a, kTestMessage1);
-  EXPECT_EQ(kTestMessage1, ReadMessage(d));
-
-  WriteMessage(d, kTestMessage2);
-  EXPECT_EQ(kTestMessage2, ReadMessage(a));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(FuseMessagePipeTest, FuseAfterPeerWrite) {
-  // Test that messages written before fusion are eventually delivered.
-
-  MojoHandle a, b, c, d;
-  CreateMessagePipe(&a, &b);
-  CreateMessagePipe(&c, &d);
-
-  const std::string kTestMessage1 = "Hello, world!";
-  const std::string kTestMessage2 = "Goodbye, world!";
-  WriteMessage(a, kTestMessage1);
-  WriteMessage(d, kTestMessage2);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
-
-  // Handles b and c should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
-
-  EXPECT_EQ(kTestMessage1, ReadMessage(d));
-  EXPECT_EQ(kTestMessage2, ReadMessage(a));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(FuseMessagePipeTest, NoFuseAfterWrite) {
-  // Test that a pipe endpoint which has been written to cannot be fused.
-
-  MojoHandle a, b, c, d;
-  CreateMessagePipe(&a, &b);
-  CreateMessagePipe(&c, &d);
-
-  WriteMessage(b, "shouldn't have done that!");
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, MojoFuseMessagePipes(b, c));
-
-  // Handles b and c should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(FuseMessagePipeTest, NoFuseSelf) {
-  // Test that a pipe's own endpoints can't be fused together.
-
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, MojoFuseMessagePipes(a, b));
-
-  // Handles a and b should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
-}
-
-TEST_F(FuseMessagePipeTest, FuseInvalidArguments) {
-  MojoHandle a, b, c, d;
-  CreateMessagePipe(&a, &b);
-  CreateMessagePipe(&c, &d);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-
-  // Can't fuse an invalid handle.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoFuseMessagePipes(b, c));
-
-  // Handle c should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
-
-  // Can't fuse a non-message pipe handle.
-  MojoHandle e, f;
-  CreateDataPipe(&e, &f, 16);
-
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoFuseMessagePipes(e, d));
-
-  // Handles d and e should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(d));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(e));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(f));
-}
-
-TEST_F(FuseMessagePipeTest, FuseAfterPeerClosure) {
-  // Test that peer closure prior to fusion can still be detected after fusion.
-
-  MojoHandle a, b, c, d;
-  CreateMessagePipe(&a, &b);
-  CreateMessagePipe(&c, &d);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
-
-  // Handles b and c should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(d, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(FuseMessagePipeTest, FuseAfterPeerWriteAndClosure) {
-  // Test that peer write and closure prior to fusion still results in the
-  // both message arrival and awareness of peer closure.
-
-  MojoHandle a, b, c, d;
-  CreateMessagePipe(&a, &b);
-  CreateMessagePipe(&c, &d);
-
-  const std::string kTestMessage = "ayyy lmao";
-  WriteMessage(a, kTestMessage);
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
-
-  // Handles b and c should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
-
-  EXPECT_EQ(kTestMessage, ReadMessage(d));
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(d, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(MessagePipeTest, ClosePipesStressTest) {
-  // Stress test to exercise https://crbug.com/665869.
-  const size_t kNumPipes = 100000;
-  for (size_t i = 0; i < kNumPipes; ++i) {
-    MojoHandle a, b;
-    CreateMessagePipe(&a, &b);
-    MojoClose(a);
-    MojoClose(b);
-  }
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/multiprocess_message_pipe_unittest.cc b/mojo/edk/system/multiprocess_message_pipe_unittest.cc
deleted file mode 100644
index 37248d1..0000000
--- a/mojo/edk/system/multiprocess_message_pipe_unittest.cc
+++ /dev/null
@@ -1,1366 +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.
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/containers/hash_tables.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/strings/string_split.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/edk/test/test_utils.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-
-namespace mojo {
-namespace edk {
-namespace {
-
-class MultiprocessMessagePipeTest : public test::MojoTestBase {
- protected:
-  // Convenience class for tests which will control command-driven children.
-  // See the CommandDrivenClient definition below.
-  class CommandDrivenClientController {
-   public:
-    explicit CommandDrivenClientController(MojoHandle h) : h_(h) {}
-
-    void Send(const std::string& command) {
-      WriteMessage(h_, command);
-      EXPECT_EQ("ok", ReadMessage(h_));
-    }
-
-    void SendHandle(const std::string& name, MojoHandle p) {
-      WriteMessageWithHandles(h_, "take:" + name, &p, 1);
-      EXPECT_EQ("ok", ReadMessage(h_));
-    }
-
-    MojoHandle RetrieveHandle(const std::string& name) {
-      WriteMessage(h_, "return:" + name);
-      MojoHandle p;
-      EXPECT_EQ("ok", ReadMessageWithHandles(h_, &p, 1));
-      return p;
-    }
-
-    void Exit() { WriteMessage(h_, "exit"); }
-
-   private:
-    MojoHandle h_;
-  };
-};
-
-class MultiprocessMessagePipeTestWithPeerSupport
-    : public MultiprocessMessagePipeTest,
-      public testing::WithParamInterface<test::MojoTestBase::LaunchType> {
- protected:
-  void SetUp() override {
-    test::MojoTestBase::SetUp();
-    set_launch_type(GetParam());
-  }
-};
-
-// For each message received, sends a reply message with the same contents
-// repeated twice, until the other end is closed or it receives "quitquitquit"
-// (which it doesn't reply to). It'll return the number of messages received,
-// not including any "quitquitquit" message, modulo 100.
-DEFINE_TEST_CLIENT_WITH_PIPE(EchoEcho, MultiprocessMessagePipeTest, h) {
-  const std::string quitquitquit("quitquitquit");
-  int rv = 0;
-  for (;; rv = (rv + 1) % 100) {
-    // Wait for our end of the message pipe to be readable.
-    HandleSignalsState hss;
-    MojoResult result = WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss);
-    if (result != MOJO_RESULT_OK) {
-      // It was closed, probably.
-      CHECK_EQ(result, MOJO_RESULT_FAILED_PRECONDITION);
-      CHECK_EQ(hss.satisfied_signals, MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-      CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-      break;
-    } else {
-      CHECK((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-      CHECK((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-    }
-
-    std::string read_buffer(1000, '\0');
-    uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-    CHECK_EQ(MojoReadMessage(h, &read_buffer[0],
-                             &read_buffer_size, nullptr,
-                             0, MOJO_READ_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    read_buffer.resize(read_buffer_size);
-    VLOG(2) << "Child got: " << read_buffer;
-
-    if (read_buffer == quitquitquit) {
-      VLOG(2) << "Child quitting.";
-      break;
-    }
-
-    std::string write_buffer = read_buffer + read_buffer;
-    CHECK_EQ(MojoWriteMessage(h, write_buffer.data(),
-                              static_cast<uint32_t>(write_buffer.size()),
-                              nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-  }
-
-  return rv;
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, Basic) {
-  RUN_CHILD_ON_PIPE(EchoEcho, h)
-    std::string hello("hello");
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, hello.data(),
-                               static_cast<uint32_t>(hello.size()), nullptr, 0u,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    // The child may or may not have closed its end of the message pipe and died
-    // (and we may or may not know it yet), so our end may or may not appear as
-    // writable.
-    EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-    EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-
-    std::string read_buffer(1000, '\0');
-    uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-    CHECK_EQ(MojoReadMessage(h, &read_buffer[0],
-                             &read_buffer_size, nullptr, 0,
-                             MOJO_READ_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    read_buffer.resize(read_buffer_size);
-    VLOG(2) << "Parent got: " << read_buffer;
-    ASSERT_EQ(hello + hello, read_buffer);
-
-    std::string quitquitquit("quitquitquit");
-    CHECK_EQ(MojoWriteMessage(h, quitquitquit.data(),
-                              static_cast<uint32_t>(quitquitquit.size()),
-                              nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-  END_CHILD_AND_EXPECT_EXIT_CODE(1 % 100);
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, QueueMessages) {
-  static const size_t kNumMessages = 1001;
-  RUN_CHILD_ON_PIPE(EchoEcho, h)
-    for (size_t i = 0; i < kNumMessages; i++) {
-      std::string write_buffer(i, 'A' + (i % 26));
-      ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, write_buffer.data(),
-                               static_cast<uint32_t>(write_buffer.size()),
-                               nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE));
-    }
-
-    for (size_t i = 0; i < kNumMessages; i++) {
-      HandleSignalsState hss;
-      ASSERT_EQ(MOJO_RESULT_OK,
-                WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-      // The child may or may not have closed its end of the message pipe and
-      // died (and we may or may not know it yet), so our end may or may not
-      // appear as writable.
-      ASSERT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-      ASSERT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-
-      std::string read_buffer(kNumMessages * 2, '\0');
-      uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-      ASSERT_EQ(MojoReadMessage(h, &read_buffer[0],
-                                &read_buffer_size, nullptr, 0,
-                                MOJO_READ_MESSAGE_FLAG_NONE),
-               MOJO_RESULT_OK);
-      read_buffer.resize(read_buffer_size);
-
-      ASSERT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer);
-    }
-
-    const std::string quitquitquit("quitquitquit");
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, quitquitquit.data(),
-                               static_cast<uint32_t>(quitquitquit.size()),
-                               nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for it to become readable, which should fail (since we sent
-    // "quitquitquit").
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-              WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-  END_CHILD_AND_EXPECT_EXIT_CODE(static_cast<int>(kNumMessages % 100));
-}
-
-DEFINE_TEST_CLIENT_WITH_PIPE(CheckSharedBuffer, MultiprocessMessagePipeTest,
-                             h) {
-  // Wait for the first message from our parent.
-  HandleSignalsState hss;
-  CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  // In this test, the parent definitely doesn't close its end of the message
-  // pipe before we do.
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                    MOJO_HANDLE_SIGNAL_WRITABLE |
-                                    MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  // It should have a shared buffer.
-  std::string read_buffer(100, '\0');
-  uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
-  MojoHandle handles[10];
-  uint32_t num_handlers = arraysize(handles);  // Maximum number to receive
-  CHECK_EQ(MojoReadMessage(h, &read_buffer[0],
-                           &num_bytes, &handles[0],
-                           &num_handlers, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  read_buffer.resize(num_bytes);
-  CHECK_EQ(read_buffer, std::string("go 1"));
-  CHECK_EQ(num_handlers, 1u);
-
-  // Make a mapping.
-  void* buffer;
-  CHECK_EQ(MojoMapBuffer(handles[0], 0, 100, &buffer,
-                         MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE),
-           MOJO_RESULT_OK);
-
-  // Write some stuff to the shared buffer.
-  static const char kHello[] = "hello";
-  memcpy(buffer, kHello, sizeof(kHello));
-
-  // We should be able to close the dispatcher now.
-  MojoClose(handles[0]);
-
-  // And send a message to signal that we've written stuff.
-  const std::string go2("go 2");
-  CHECK_EQ(MojoWriteMessage(h, go2.data(),
-                            static_cast<uint32_t>(go2.size()), nullptr, 0u,
-                            MOJO_WRITE_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-
-  // Now wait for our parent to send us a message.
-  hss = HandleSignalsState();
-  CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                        MOJO_HANDLE_SIGNAL_WRITABLE |
-                                        MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  read_buffer = std::string(100, '\0');
-  num_bytes = static_cast<uint32_t>(read_buffer.size());
-  CHECK_EQ(MojoReadMessage(h, &read_buffer[0], &num_bytes,
-                           nullptr, 0, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  read_buffer.resize(num_bytes);
-  CHECK_EQ(read_buffer, std::string("go 3"));
-
-  // It should have written something to the shared buffer.
-  static const char kWorld[] = "world!!!";
-  CHECK_EQ(memcmp(buffer, kWorld, sizeof(kWorld)), 0);
-
-  // And we're done.
-
-  return 0;
-}
-
-TEST_F(MultiprocessMessagePipeTest, SharedBufferPassing) {
-  RUN_CHILD_ON_PIPE(CheckSharedBuffer, h)
-    // Make a shared buffer.
-    MojoCreateSharedBufferOptions options;
-    options.struct_size = sizeof(options);
-    options.flags = MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
-
-    MojoHandle shared_buffer;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoCreateSharedBuffer(&options, 100, &shared_buffer));
-
-    // Send the shared buffer.
-    const std::string go1("go 1");
-
-    MojoHandle duplicated_shared_buffer;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoDuplicateBufferHandle(
-                  shared_buffer,
-                  nullptr,
-                  &duplicated_shared_buffer));
-    MojoHandle handles[1];
-    handles[0] = duplicated_shared_buffer;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, &go1[0],
-                               static_cast<uint32_t>(go1.size()), &handles[0],
-                               arraysize(handles),
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for a message from the child.
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-    EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-
-    std::string read_buffer(100, '\0');
-    uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoReadMessage(h, &read_buffer[0],
-                              &num_bytes, nullptr, 0,
-                              MOJO_READ_MESSAGE_FLAG_NONE));
-    read_buffer.resize(num_bytes);
-    ASSERT_EQ(std::string("go 2"), read_buffer);
-
-    // After we get it, the child should have written something to the shared
-    // buffer.
-    static const char kHello[] = "hello";
-    void* buffer;
-    CHECK_EQ(MojoMapBuffer(shared_buffer, 0, 100, &buffer,
-                           MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE),
-             MOJO_RESULT_OK);
-    ASSERT_EQ(0, memcmp(buffer, kHello, sizeof(kHello)));
-
-    // Now we'll write some stuff to the shared buffer.
-    static const char kWorld[] = "world!!!";
-    memcpy(buffer, kWorld, sizeof(kWorld));
-
-    // And send a message to signal that we've written stuff.
-    const std::string go3("go 3");
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, &go3[0],
-                               static_cast<uint32_t>(go3.size()), nullptr, 0u,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for |h| to become readable, which should fail.
-    hss = HandleSignalsState();
-    ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-              WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_WITH_PIPE(CheckPlatformHandleFile,
-                             MultiprocessMessagePipeTest, h) {
-  HandleSignalsState hss;
-  CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                        MOJO_HANDLE_SIGNAL_WRITABLE |
-                                        MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  std::string read_buffer(100, '\0');
-  uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
-  MojoHandle handles[255];  // Maximum number to receive.
-  uint32_t num_handlers = arraysize(handles);
-
-  CHECK_EQ(MojoReadMessage(h, &read_buffer[0],
-                           &num_bytes, &handles[0],
-                           &num_handlers, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-
-  read_buffer.resize(num_bytes);
-  char hello[32];
-  int num_handles = 0;
-  sscanf(read_buffer.c_str(), "%s %d", hello, &num_handles);
-  CHECK_EQ(std::string("hello"), std::string(hello));
-  CHECK_GT(num_handles, 0);
-
-  for (int i = 0; i < num_handles; ++i) {
-    ScopedPlatformHandle h;
-    CHECK_EQ(PassWrappedPlatformHandle(handles[i], &h), MOJO_RESULT_OK);
-    CHECK(h.is_valid());
-    MojoClose(handles[i]);
-
-    base::ScopedFILE fp(test::FILEFromPlatformHandle(std::move(h), "r"));
-    CHECK(fp);
-    std::string fread_buffer(100, '\0');
-    size_t bytes_read =
-        fread(&fread_buffer[0], 1, fread_buffer.size(), fp.get());
-    fread_buffer.resize(bytes_read);
-    CHECK_EQ(fread_buffer, "world");
-  }
-
-  return 0;
-}
-
-class MultiprocessMessagePipeTestWithPipeCount
-    : public MultiprocessMessagePipeTest,
-      public testing::WithParamInterface<size_t> {};
-
-TEST_P(MultiprocessMessagePipeTestWithPipeCount, PlatformHandlePassing) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  RUN_CHILD_ON_PIPE(CheckPlatformHandleFile, h)
-    std::vector<MojoHandle> handles;
-
-    size_t pipe_count = GetParam();
-    for (size_t i = 0; i < pipe_count; ++i) {
-      base::FilePath unused;
-      base::ScopedFILE fp(
-          CreateAndOpenTemporaryFileInDir(temp_dir.GetPath(), &unused));
-      const std::string world("world");
-      CHECK_EQ(fwrite(&world[0], 1, world.size(), fp.get()), world.size());
-      fflush(fp.get());
-      rewind(fp.get());
-      MojoHandle handle;
-      ASSERT_EQ(
-          CreatePlatformHandleWrapper(
-              ScopedPlatformHandle(test::PlatformHandleFromFILE(std::move(fp))),
-              &handle),
-          MOJO_RESULT_OK);
-      handles.push_back(handle);
-    }
-
-    char message[128];
-    snprintf(message, sizeof(message), "hello %d",
-             static_cast<int>(pipe_count));
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, message,
-                               static_cast<uint32_t>(strlen(message)),
-                               &handles[0],
-                               static_cast<uint32_t>(handles.size()),
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for it to become readable, which should fail.
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-              WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-  END_CHILD()
-}
-
-// Android multi-process tests are not executing the new process. This is flaky.
-#if !defined(OS_ANDROID)
-INSTANTIATE_TEST_CASE_P(PipeCount,
-                        MultiprocessMessagePipeTestWithPipeCount,
-                        // TODO(rockot): Re-enable the 140-pipe case when
-                        // ChannelPosix has support for sending lots of handles.
-                        testing::Values(1u, 128u /*, 140u*/));
-#endif
-
-DEFINE_TEST_CLIENT_WITH_PIPE(CheckMessagePipe, MultiprocessMessagePipeTest, h) {
-  // Wait for the first message from our parent.
-  HandleSignalsState hss;
-  CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  // In this test, the parent definitely doesn't close its end of the message
-  // pipe before we do.
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                    MOJO_HANDLE_SIGNAL_WRITABLE |
-                                    MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  // It should have a message pipe.
-  MojoHandle handles[10];
-  uint32_t num_handlers = arraysize(handles);
-  CHECK_EQ(MojoReadMessage(h, nullptr,
-                           nullptr, &handles[0],
-                           &num_handlers, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(num_handlers, 1u);
-
-  // Read data from the received message pipe.
-  CHECK_EQ(WaitForSignals(handles[0], MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                    MOJO_HANDLE_SIGNAL_WRITABLE |
-                                    MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  std::string read_buffer(100, '\0');
-  uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-  CHECK_EQ(MojoReadMessage(handles[0], &read_buffer[0],
-                           &read_buffer_size, nullptr,
-                           0, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  read_buffer.resize(read_buffer_size);
-  CHECK_EQ(read_buffer, std::string("hello"));
-
-  // Now write some data into the message pipe.
-  std::string write_buffer = "world";
-  CHECK_EQ(MojoWriteMessage(handles[0], write_buffer.data(),
-                            static_cast<uint32_t>(write_buffer.size()), nullptr,
-                            0u, MOJO_WRITE_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  MojoClose(handles[0]);
-  return 0;
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, MessagePipePassing) {
-  RUN_CHILD_ON_PIPE(CheckMessagePipe, h)
-    MojoCreateSharedBufferOptions options;
-    options.struct_size = sizeof(options);
-    options.flags = MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
-
-    MojoHandle mp1, mp2;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoCreateMessagePipe(nullptr, &mp1, &mp2));
-
-    // Write a string into one end of the new message pipe and send the other
-    // end.
-    const std::string hello("hello");
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(mp1, &hello[0],
-                               static_cast<uint32_t>(hello.size()), nullptr, 0,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, nullptr, 0, &mp2, 1,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for a message from the child.
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(mp1, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-    EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-
-    std::string read_buffer(100, '\0');
-    uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-    CHECK_EQ(MojoReadMessage(mp1, &read_buffer[0],
-                             &read_buffer_size, nullptr,
-                             0, MOJO_READ_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    read_buffer.resize(read_buffer_size);
-    CHECK_EQ(read_buffer, std::string("world"));
-
-    MojoClose(mp1);
-  END_CHILD()
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, MessagePipeTwoPassing) {
-  RUN_CHILD_ON_PIPE(CheckMessagePipe, h)
-    MojoHandle mp1, mp2;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoCreateMessagePipe(nullptr, &mp2, &mp1));
-
-    // Write a string into one end of the new message pipe and send the other
-    // end.
-    const std::string hello("hello");
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(mp1, &hello[0],
-                               static_cast<uint32_t>(hello.size()), nullptr, 0u,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, nullptr, 0u, &mp2, 1u,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for a message from the child.
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(mp1, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-    EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-
-    std::string read_buffer(100, '\0');
-    uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-    CHECK_EQ(MojoReadMessage(mp1, &read_buffer[0],
-                             &read_buffer_size, nullptr,
-                             0, MOJO_READ_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    read_buffer.resize(read_buffer_size);
-    CHECK_EQ(read_buffer, std::string("world"));
-  END_CHILD();
-}
-
-DEFINE_TEST_CLIENT_WITH_PIPE(DataPipeConsumer, MultiprocessMessagePipeTest, h) {
-  // Wait for the first message from our parent.
-  HandleSignalsState hss;
-  CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  // In this test, the parent definitely doesn't close its end of the message
-  // pipe before we do.
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                    MOJO_HANDLE_SIGNAL_WRITABLE |
-                                    MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  // It should have a message pipe.
-  MojoHandle handles[10];
-  uint32_t num_handlers = arraysize(handles);
-  CHECK_EQ(MojoReadMessage(h, nullptr,
-                           nullptr, &handles[0],
-                           &num_handlers, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(num_handlers, 1u);
-
-  // Read data from the received message pipe.
-  CHECK_EQ(WaitForSignals(handles[0], MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                    MOJO_HANDLE_SIGNAL_WRITABLE |
-                                    MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  std::string read_buffer(100, '\0');
-  uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-  CHECK_EQ(MojoReadMessage(handles[0], &read_buffer[0],
-                           &read_buffer_size, nullptr,
-                           0, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  read_buffer.resize(read_buffer_size);
-  CHECK_EQ(read_buffer, std::string("hello"));
-
-  // Now write some data into the message pipe.
-  std::string write_buffer = "world";
-  CHECK_EQ(MojoWriteMessage(handles[0], write_buffer.data(),
-                            static_cast<uint32_t>(write_buffer.size()),
-                            nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE),
-            MOJO_RESULT_OK);
-  MojoClose(handles[0]);
-  return 0;
-}
-
-TEST_F(MultiprocessMessagePipeTest, DataPipeConsumer) {
-  RUN_CHILD_ON_PIPE(DataPipeConsumer, h)
-    MojoCreateSharedBufferOptions options;
-    options.struct_size = sizeof(options);
-    options.flags = MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
-
-    MojoHandle mp1, mp2;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoCreateMessagePipe(nullptr, &mp2, &mp1));
-
-    // Write a string into one end of the new message pipe and send the other
-    // end.
-    const std::string hello("hello");
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(mp1, &hello[0],
-                               static_cast<uint32_t>(hello.size()), nullptr, 0u,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, nullptr, 0, &mp2, 1u,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for a message from the child.
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(mp1, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-    EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-
-    std::string read_buffer(100, '\0');
-    uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-    CHECK_EQ(MojoReadMessage(mp1, &read_buffer[0],
-                             &read_buffer_size, nullptr,
-                             0, MOJO_READ_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    read_buffer.resize(read_buffer_size);
-    CHECK_EQ(read_buffer, std::string("world"));
-
-    MojoClose(mp1);
-  END_CHILD();
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, CreateMessagePipe) {
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-  VerifyTransmission(p0, p1, std::string(10 * 1024 * 1024, 'a'));
-  VerifyTransmission(p1, p0, std::string(10 * 1024 * 1024, 'e'));
-
-  CloseHandle(p0);
-  CloseHandle(p1);
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, PassMessagePipeLocal) {
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-  VerifyTransmission(p0, p1, "testing testing");
-  VerifyTransmission(p1, p0, "one two three");
-
-  MojoHandle p2, p3;
-
-  CreateMessagePipe(&p2, &p3);
-  VerifyTransmission(p2, p3, "testing testing");
-  VerifyTransmission(p3, p2, "one two three");
-
-  // Pass p2 over p0 to p1.
-  const std::string message = "ceci n'est pas une pipe";
-  WriteMessageWithHandles(p0, message, &p2, 1);
-  EXPECT_EQ(message, ReadMessageWithHandles(p1, &p2, 1));
-
-  CloseHandle(p0);
-  CloseHandle(p1);
-
-  // Verify that the received handle (now in p2) still works.
-  VerifyTransmission(p2, p3, "Easy come, easy go; will you let me go?");
-  VerifyTransmission(p3, p2, "Bismillah! NO! We will not let you go!");
-
-  CloseHandle(p2);
-  CloseHandle(p3);
-}
-
-// Echos the primordial channel until "exit".
-DEFINE_TEST_CLIENT_WITH_PIPE(ChannelEchoClient, MultiprocessMessagePipeTest,
-                             h) {
-  for (;;) {
-    std::string message = ReadMessage(h);
-    if (message == "exit")
-      break;
-    WriteMessage(h, message);
-  }
-  return 0;
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, MultiprocessChannelPipe) {
-  RUN_CHILD_ON_PIPE(ChannelEchoClient, h)
-    VerifyEcho(h, "in an interstellar burst");
-    VerifyEcho(h, "i am back to save the universe");
-    VerifyEcho(h, std::string(10 * 1024 * 1024, 'o'));
-
-    WriteMessage(h, "exit");
-  END_CHILD()
-}
-
-// Receives a pipe handle from the primordial channel and echos on it until
-// "exit". Used to test simple pipe transfer across processes via channels.
-DEFINE_TEST_CLIENT_WITH_PIPE(EchoServiceClient, MultiprocessMessagePipeTest,
-                             h) {
-  MojoHandle p;
-  ReadMessageWithHandles(h, &p, 1);
-  for (;;) {
-    std::string message = ReadMessage(p);
-    if (message == "exit")
-      break;
-    WriteMessage(p, message);
-  }
-  return 0;
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport,
-       PassMessagePipeCrossProcess) {
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-  RUN_CHILD_ON_PIPE(EchoServiceClient, h)
-
-    // Pass one end of the pipe to the other process.
-    WriteMessageWithHandles(h, "here take this", &p1, 1);
-
-    VerifyEcho(p0, "and you may ask yourself");
-    VerifyEcho(p0, "where does that highway go?");
-    VerifyEcho(p0, std::string(20 * 1024 * 1024, 'i'));
-
-    WriteMessage(p0, "exit");
-  END_CHILD()
-  CloseHandle(p0);
-}
-
-// Receives a pipe handle from the primordial channel and reads new handles
-// from it. Each read handle establishes a new echo channel.
-DEFINE_TEST_CLIENT_WITH_PIPE(EchoServiceFactoryClient,
-                             MultiprocessMessagePipeTest, h) {
-  MojoHandle p;
-  ReadMessageWithHandles(h, &p, 1);
-
-  std::vector<Handle> handles(2);
-  handles[0] = Handle(h);
-  handles[1] = Handle(p);
-  std::vector<MojoHandleSignals> signals(2, MOJO_HANDLE_SIGNAL_READABLE);
-  for (;;) {
-    size_t index;
-    CHECK_EQ(
-        mojo::WaitMany(handles.data(), signals.data(), handles.size(), &index),
-        MOJO_RESULT_OK);
-    DCHECK_LE(index, handles.size());
-    if (index == 0) {
-      // If data is available on the first pipe, it should be an exit command.
-      EXPECT_EQ(std::string("exit"), ReadMessage(h));
-      break;
-    } else if (index == 1) {
-      // If the second pipe, it should be a new handle requesting echo service.
-      MojoHandle echo_request;
-      ReadMessageWithHandles(p, &echo_request, 1);
-      handles.push_back(Handle(echo_request));
-      signals.push_back(MOJO_HANDLE_SIGNAL_READABLE);
-    } else {
-      // Otherwise it was one of our established echo pipes. Echo!
-      WriteMessage(handles[index].value(), ReadMessage(handles[index].value()));
-    }
-  }
-
-  for (size_t i = 1; i < handles.size(); ++i)
-    CloseHandle(handles[i].value());
-
-  return 0;
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport,
-       PassMoarMessagePipesCrossProcess) {
-  MojoHandle echo_factory_proxy, echo_factory_request;
-  CreateMessagePipe(&echo_factory_proxy, &echo_factory_request);
-
-  MojoHandle echo_proxy_a, echo_request_a;
-  CreateMessagePipe(&echo_proxy_a, &echo_request_a);
-
-  MojoHandle echo_proxy_b, echo_request_b;
-  CreateMessagePipe(&echo_proxy_b, &echo_request_b);
-
-  MojoHandle echo_proxy_c, echo_request_c;
-  CreateMessagePipe(&echo_proxy_c, &echo_request_c);
-
-  RUN_CHILD_ON_PIPE(EchoServiceFactoryClient, h)
-    WriteMessageWithHandles(
-        h, "gief factory naow plz", &echo_factory_request, 1);
-
-    WriteMessageWithHandles(echo_factory_proxy, "give me an echo service plz!",
-                           &echo_request_a, 1);
-    WriteMessageWithHandles(echo_factory_proxy, "give me one too!",
-                           &echo_request_b, 1);
-
-    VerifyEcho(echo_proxy_a, "i came here for an argument");
-    VerifyEcho(echo_proxy_a, "shut your festering gob");
-    VerifyEcho(echo_proxy_a, "mumble mumble mumble");
-
-    VerifyEcho(echo_proxy_b, "wubalubadubdub");
-    VerifyEcho(echo_proxy_b, "wubalubadubdub");
-
-    WriteMessageWithHandles(echo_factory_proxy, "hook me up also thanks",
-                           &echo_request_c, 1);
-
-    VerifyEcho(echo_proxy_a, "the frobinators taste like frobinators");
-    VerifyEcho(echo_proxy_b, "beep bop boop");
-    VerifyEcho(echo_proxy_c, "zzzzzzzzzzzzzzzzzzzzzzzzzz");
-
-    WriteMessage(h, "exit");
-  END_CHILD()
-
-  CloseHandle(echo_factory_proxy);
-  CloseHandle(echo_proxy_a);
-  CloseHandle(echo_proxy_b);
-  CloseHandle(echo_proxy_c);
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport,
-       ChannelPipesWithMultipleChildren) {
-  RUN_CHILD_ON_PIPE(ChannelEchoClient, a)
-    RUN_CHILD_ON_PIPE(ChannelEchoClient, b)
-      VerifyEcho(a, "hello child 0");
-      VerifyEcho(b, "hello child 1");
-
-      WriteMessage(a, "exit");
-      WriteMessage(b, "exit");
-    END_CHILD()
-  END_CHILD()
-}
-
-// Reads and turns a pipe handle some number of times to create lots of
-// transient proxies.
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(PingPongPipeClient,
-                                  MultiprocessMessagePipeTest, h) {
-  const size_t kNumBounces = 50;
-  MojoHandle p0, p1;
-  ReadMessageWithHandles(h, &p0, 1);
-  ReadMessageWithHandles(h, &p1, 1);
-  for (size_t i = 0; i < kNumBounces; ++i) {
-    WriteMessageWithHandles(h, "", &p1, 1);
-    ReadMessageWithHandles(h, &p1, 1);
-  }
-  WriteMessageWithHandles(h, "", &p0, 1);
-  WriteMessage(p1, "bye");
-  MojoClose(p1);
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, PingPongPipe) {
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-
-  RUN_CHILD_ON_PIPE(PingPongPipeClient, h)
-    const size_t kNumBounces = 50;
-    WriteMessageWithHandles(h, "", &p0, 1);
-    WriteMessageWithHandles(h, "", &p1, 1);
-    for (size_t i = 0; i < kNumBounces; ++i) {
-      ReadMessageWithHandles(h, &p1, 1);
-      WriteMessageWithHandles(h, "", &p1, 1);
-    }
-    ReadMessageWithHandles(h, &p0, 1);
-    WriteMessage(h, "quit");
-  END_CHILD()
-
-  EXPECT_EQ("bye", ReadMessage(p0));
-
-  // We should still be able to observe peer closure from the other end.
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(p0, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-// Parses commands from the parent pipe and does whatever it's asked to do.
-DEFINE_TEST_CLIENT_WITH_PIPE(CommandDrivenClient, MultiprocessMessagePipeTest,
-                             h) {
-  base::hash_map<std::string, MojoHandle> named_pipes;
-  for (;;) {
-    MojoHandle p;
-    auto parts = base::SplitString(ReadMessageWithOptionalHandle(h, &p), ":",
-                                   base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-    CHECK(!parts.empty());
-    std::string command = parts[0];
-    if (command == "take") {
-      // Take a pipe.
-      CHECK_EQ(parts.size(), 2u);
-      CHECK_NE(p, MOJO_HANDLE_INVALID);
-      named_pipes[parts[1]] = p;
-      WriteMessage(h, "ok");
-    } else if (command == "return") {
-      // Return a pipe.
-      CHECK_EQ(parts.size(), 2u);
-      CHECK_EQ(p, MOJO_HANDLE_INVALID);
-      p = named_pipes[parts[1]];
-      CHECK_NE(p, MOJO_HANDLE_INVALID);
-      named_pipes.erase(parts[1]);
-      WriteMessageWithHandles(h, "ok", &p, 1);
-    } else if (command == "say") {
-      // Say something to a named pipe.
-      CHECK_EQ(parts.size(), 3u);
-      CHECK_EQ(p, MOJO_HANDLE_INVALID);
-      p = named_pipes[parts[1]];
-      CHECK_NE(p, MOJO_HANDLE_INVALID);
-      CHECK(!parts[2].empty());
-      WriteMessage(p, parts[2]);
-      WriteMessage(h, "ok");
-    } else if (command == "hear") {
-      // Expect to read something from a named pipe.
-      CHECK_EQ(parts.size(), 3u);
-      CHECK_EQ(p, MOJO_HANDLE_INVALID);
-      p = named_pipes[parts[1]];
-      CHECK_NE(p, MOJO_HANDLE_INVALID);
-      CHECK(!parts[2].empty());
-      CHECK_EQ(parts[2], ReadMessage(p));
-      WriteMessage(h, "ok");
-    } else if (command == "pass") {
-      // Pass one named pipe over another named pipe.
-      CHECK_EQ(parts.size(), 3u);
-      CHECK_EQ(p, MOJO_HANDLE_INVALID);
-      p = named_pipes[parts[1]];
-      MojoHandle carrier = named_pipes[parts[2]];
-      CHECK_NE(p, MOJO_HANDLE_INVALID);
-      CHECK_NE(carrier, MOJO_HANDLE_INVALID);
-      named_pipes.erase(parts[1]);
-      WriteMessageWithHandles(carrier, "got a pipe for ya", &p, 1);
-      WriteMessage(h, "ok");
-    } else if (command == "catch") {
-      // Expect to receive one named pipe from another named pipe.
-      CHECK_EQ(parts.size(), 3u);
-      CHECK_EQ(p, MOJO_HANDLE_INVALID);
-      MojoHandle carrier = named_pipes[parts[2]];
-      CHECK_NE(carrier, MOJO_HANDLE_INVALID);
-      ReadMessageWithHandles(carrier, &p, 1);
-      CHECK_NE(p, MOJO_HANDLE_INVALID);
-      named_pipes[parts[1]] = p;
-      WriteMessage(h, "ok");
-    } else if (command == "exit") {
-      CHECK_EQ(parts.size(), 1u);
-      break;
-    }
-  }
-
-  for (auto& pipe : named_pipes)
-    CloseHandle(pipe.second);
-
-  return 0;
-}
-
-TEST_F(MultiprocessMessagePipeTest, ChildToChildPipes) {
-  RUN_CHILD_ON_PIPE(CommandDrivenClient, h0)
-    RUN_CHILD_ON_PIPE(CommandDrivenClient, h1)
-      CommandDrivenClientController a(h0);
-      CommandDrivenClientController b(h1);
-
-      // Create a pipe and pass each end to a different client.
-      MojoHandle p0, p1;
-      CreateMessagePipe(&p0, &p1);
-      a.SendHandle("x", p0);
-      b.SendHandle("y", p1);
-
-      // Make sure they can talk.
-      a.Send("say:x:hello");
-      b.Send("hear:y:hello");
-
-      b.Send("say:y:i love multiprocess pipes!");
-      a.Send("hear:x:i love multiprocess pipes!");
-
-      a.Exit();
-      b.Exit();
-    END_CHILD()
-  END_CHILD()
-}
-
-TEST_F(MultiprocessMessagePipeTest, MoreChildToChildPipes) {
-  RUN_CHILD_ON_PIPE(CommandDrivenClient, h0)
-    RUN_CHILD_ON_PIPE(CommandDrivenClient, h1)
-      RUN_CHILD_ON_PIPE(CommandDrivenClient, h2)
-        RUN_CHILD_ON_PIPE(CommandDrivenClient, h3)
-          CommandDrivenClientController a(h0), b(h1), c(h2), d(h3);
-
-          // Connect a to b and c to d
-
-          MojoHandle p0, p1;
-
-          CreateMessagePipe(&p0, &p1);
-          a.SendHandle("b_pipe", p0);
-          b.SendHandle("a_pipe", p1);
-
-          MojoHandle p2, p3;
-
-          CreateMessagePipe(&p2, &p3);
-          c.SendHandle("d_pipe", p2);
-          d.SendHandle("c_pipe", p3);
-
-          // Connect b to c via a and d
-          MojoHandle p4, p5;
-          CreateMessagePipe(&p4, &p5);
-          a.SendHandle("d_pipe", p4);
-          d.SendHandle("a_pipe", p5);
-
-          // Have |a| pass its new |d|-pipe to |b|. It will eventually connect
-          // to |c|.
-          a.Send("pass:d_pipe:b_pipe");
-          b.Send("catch:c_pipe:a_pipe");
-
-          // Have |d| pass its new |a|-pipe to |c|. It will now be connected to
-          // |b|.
-          d.Send("pass:a_pipe:c_pipe");
-          c.Send("catch:b_pipe:d_pipe");
-
-          // Make sure b and c and talk.
-          b.Send("say:c_pipe:it's a beautiful day");
-          c.Send("hear:b_pipe:it's a beautiful day");
-
-          // Create x and y and have b and c exchange them.
-          MojoHandle x, y;
-          CreateMessagePipe(&x, &y);
-          b.SendHandle("x", x);
-          c.SendHandle("y", y);
-          b.Send("pass:x:c_pipe");
-          c.Send("pass:y:b_pipe");
-          b.Send("catch:y:c_pipe");
-          c.Send("catch:x:b_pipe");
-
-          // Make sure the pipe still works in both directions.
-          b.Send("say:y:hello");
-          c.Send("hear:x:hello");
-          c.Send("say:x:goodbye");
-          b.Send("hear:y:goodbye");
-
-          // Take both pipes back.
-          y = c.RetrieveHandle("x");
-          x = b.RetrieveHandle("y");
-
-          VerifyTransmission(x, y, "still works");
-          VerifyTransmission(y, x, "in both directions");
-
-          CloseHandle(x);
-          CloseHandle(y);
-
-          a.Exit();
-          b.Exit();
-          c.Exit();
-          d.Exit();
-        END_CHILD()
-      END_CHILD()
-    END_CHILD()
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceivePipeWithClosedPeer,
-                                  MultiprocessMessagePipeTest, h) {
-  MojoHandle p;
-  EXPECT_EQ("foo", ReadMessageWithHandles(h, &p, 1));
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(p, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, SendPipeThenClosePeer) {
-  RUN_CHILD_ON_PIPE(ReceivePipeWithClosedPeer, h)
-    MojoHandle a, b;
-    CreateMessagePipe(&a, &b);
-
-    // Send |a| and immediately close |b|. The child should observe closure.
-    WriteMessageWithHandles(h, "foo", &a, 1);
-    MojoClose(b);
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(SendOtherChildPipeWithClosedPeer,
-                                  MultiprocessMessagePipeTest, h) {
-  // Create a new pipe and send one end to the parent, who will connect it to
-  // a client running ReceivePipeWithClosedPeerFromOtherChild.
-  MojoHandle application_proxy, application_request;
-  CreateMessagePipe(&application_proxy, &application_request);
-  WriteMessageWithHandles(h, "c2a plz", &application_request, 1);
-
-  // Create another pipe and send one end to the remote "application".
-  MojoHandle service_proxy, service_request;
-  CreateMessagePipe(&service_proxy, &service_request);
-  WriteMessageWithHandles(application_proxy, "c2s lol", &service_request, 1);
-
-  // Immediately close the service proxy. The "application" should detect this.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(service_proxy));
-
-  // Wait for quit.
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceivePipeWithClosedPeerFromOtherChild,
-                                  MultiprocessMessagePipeTest, h) {
-  // Receive a pipe from the parent. This is akin to an "application request".
-  MojoHandle application_client;
-  EXPECT_EQ("c2a", ReadMessageWithHandles(h, &application_client, 1));
-
-  // Receive a pipe from the "application" "client".
-  MojoHandle service_client;
-  EXPECT_EQ("c2s lol",
-            ReadMessageWithHandles(application_client, &service_client, 1));
-
-  // Wait for the service client to signal closure.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(service_client, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(service_client));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(application_client));
-}
-
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_SendPipeWithClosedPeerBetweenChildren \
-    DISABLED_SendPipeWithClosedPeerBetweenChildren
-#else
-#define MAYBE_SendPipeWithClosedPeerBetweenChildren \
-    SendPipeWithClosedPeerBetweenChildren
-#endif
-TEST_F(MultiprocessMessagePipeTest,
-       MAYBE_SendPipeWithClosedPeerBetweenChildren) {
-  RUN_CHILD_ON_PIPE(SendOtherChildPipeWithClosedPeer, kid_a)
-    RUN_CHILD_ON_PIPE(ReceivePipeWithClosedPeerFromOtherChild, kid_b)
-      // Receive an "application request" from the first child and forward it
-      // to the second child.
-      MojoHandle application_request;
-      EXPECT_EQ("c2a plz",
-                ReadMessageWithHandles(kid_a, &application_request, 1));
-
-      WriteMessageWithHandles(kid_b, "c2a", &application_request, 1);
-    END_CHILD()
-
-    WriteMessage(kid_a, "quit");
-  END_CHILD()
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, SendClosePeerSend) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle c, d;
-  CreateMessagePipe(&c, &d);
-
-  // Send |a| over |c|, immediately close |b|, then send |a| back over |d|.
-  WriteMessageWithHandles(c, "foo", &a, 1);
-  EXPECT_EQ("foo", ReadMessageWithHandles(d, &a, 1));
-  WriteMessageWithHandles(d, "bar", &a, 1);
-  EXPECT_EQ("bar", ReadMessageWithHandles(c, &a, 1));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-
-  // We should be able to detect peer closure on |a|.
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(a, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(WriteCloseSendPeerClient,
-                                  MultiprocessMessagePipeTest, h) {
-  MojoHandle pipe[2];
-  EXPECT_EQ("foo", ReadMessageWithHandles(h, pipe, 2));
-
-  // Write some messages to the first endpoint and then close it.
-  WriteMessage(pipe[0], "baz");
-  WriteMessage(pipe[0], "qux");
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(pipe[0]));
-
-  MojoHandle c, d;
-  CreateMessagePipe(&c, &d);
-
-  // Pass the orphaned endpoint over another pipe before passing it back to
-  // the parent, just for some extra proxying goodness.
-  WriteMessageWithHandles(c, "foo", &pipe[1], 1);
-  EXPECT_EQ("foo", ReadMessageWithHandles(d, &pipe[1], 1));
-
-  // And finally pass it back to the parent.
-  WriteMessageWithHandles(h, "bar", &pipe[1], 1);
-
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, WriteCloseSendPeer) {
-  MojoHandle pipe[2];
-  CreateMessagePipe(&pipe[0], &pipe[1]);
-
-  RUN_CHILD_ON_PIPE(WriteCloseSendPeerClient, h)
-    // Pass the pipe to the child.
-    WriteMessageWithHandles(h, "foo", pipe, 2);
-
-    // Read back an endpoint which should have messages on it.
-    MojoHandle p;
-    EXPECT_EQ("bar", ReadMessageWithHandles(h, &p, 1));
-
-    EXPECT_EQ("baz", ReadMessage(p));
-    EXPECT_EQ("qux", ReadMessage(p));
-
-    // Expect to have peer closure signaled.
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(p, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-    WriteMessage(h, "quit");
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MessagePipeStatusChangeInTransitClient,
-                                  MultiprocessMessagePipeTest, parent) {
-  // This test verifies that peer closure is detectable through various
-  // mechanisms when it races with handle transfer.
-  MojoHandle handles[4];
-  EXPECT_EQ("o_O", ReadMessageWithHandles(parent, handles, 4));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(handles[0], MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  base::MessageLoop message_loop;
-
-  // Wait on handle 1 using a SimpleWatcher.
-  {
-    base::RunLoop run_loop;
-    SimpleWatcher watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-    watcher.Watch(Handle(handles[1]), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-                  base::Bind(
-                      [](base::RunLoop* loop, MojoResult result) {
-                        EXPECT_EQ(MOJO_RESULT_OK, result);
-                        loop->Quit();
-                      },
-                      &run_loop));
-    run_loop.Run();
-  }
-
-  // Wait on handle 2 by polling with MojoReadMessage.
-  MojoResult result;
-  do {
-    result = MojoReadMessage(handles[2], nullptr, nullptr, nullptr, nullptr,
-                             MOJO_READ_MESSAGE_FLAG_NONE);
-  } while (result == MOJO_RESULT_SHOULD_WAIT);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-
-  // Wait on handle 3 by polling with MojoWriteMessage.
-  do {
-    result = MojoWriteMessage(handles[3], nullptr, 0, nullptr, 0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE);
-  } while (result == MOJO_RESULT_OK);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-
-  for (size_t i = 0; i < 4; ++i)
-    CloseHandle(handles[i]);
-}
-
-TEST_F(MultiprocessMessagePipeTest, MessagePipeStatusChangeInTransit) {
-  MojoHandle local_handles[4];
-  MojoHandle sent_handles[4];
-  for (size_t i = 0; i < 4; ++i)
-    CreateMessagePipe(&local_handles[i], &sent_handles[i]);
-
-  RUN_CHILD_ON_PIPE(MessagePipeStatusChangeInTransitClient, child)
-    // Send 4 handles and let their transfer race with their peers' closure.
-    WriteMessageWithHandles(child, "o_O", sent_handles, 4);
-    for (size_t i = 0; i < 4; ++i)
-      CloseHandle(local_handles[i]);
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(BadMessageClient, MultiprocessMessagePipeTest,
-                                  parent) {
-  MojoHandle pipe;
-  EXPECT_EQ("hi", ReadMessageWithHandles(parent, &pipe, 1));
-  WriteMessage(pipe, "derp");
-  EXPECT_EQ("bye", ReadMessage(parent));
-}
-
-void OnProcessError(std::string* out_error, const std::string& error) {
-  *out_error = error;
-}
-
-TEST_F(MultiprocessMessagePipeTest, NotifyBadMessage) {
-  const std::string kFirstErrorMessage = "everything is terrible!";
-  const std::string kSecondErrorMessage = "not the bits you're looking for";
-
-  std::string first_process_error;
-  std::string second_process_error;
-
-  set_process_error_callback(base::Bind(&OnProcessError, &first_process_error));
-  RUN_CHILD_ON_PIPE(BadMessageClient, child1)
-    set_process_error_callback(base::Bind(&OnProcessError,
-                                          &second_process_error));
-    RUN_CHILD_ON_PIPE(BadMessageClient, child2)
-      MojoHandle a, b, c, d;
-      CreateMessagePipe(&a, &b);
-      CreateMessagePipe(&c, &d);
-      WriteMessageWithHandles(child1, "hi", &b, 1);
-      WriteMessageWithHandles(child2, "hi", &d, 1);
-
-      // Read a message from the pipe we sent to child1 and flag it as bad.
-      ASSERT_EQ(MOJO_RESULT_OK, WaitForSignals(a, MOJO_HANDLE_SIGNAL_READABLE));
-      uint32_t num_bytes = 0;
-      MojoMessageHandle message;
-      ASSERT_EQ(MOJO_RESULT_OK,
-                MojoReadMessageNew(a, &message, &num_bytes, nullptr, 0,
-                                   MOJO_READ_MESSAGE_FLAG_NONE));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                MojoNotifyBadMessage(message, kFirstErrorMessage.data(),
-                                     kFirstErrorMessage.size()));
-      EXPECT_EQ(MOJO_RESULT_OK, MojoFreeMessage(message));
-
-      // Read a message from the pipe we sent to child2 and flag it as bad.
-      ASSERT_EQ(MOJO_RESULT_OK, WaitForSignals(c, MOJO_HANDLE_SIGNAL_READABLE));
-      ASSERT_EQ(MOJO_RESULT_OK,
-                MojoReadMessageNew(c, &message, &num_bytes, nullptr, 0,
-                                   MOJO_READ_MESSAGE_FLAG_NONE));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                MojoNotifyBadMessage(message, kSecondErrorMessage.data(),
-                                     kSecondErrorMessage.size()));
-      EXPECT_EQ(MOJO_RESULT_OK, MojoFreeMessage(message));
-
-      WriteMessage(child2, "bye");
-    END_CHILD();
-
-    WriteMessage(child1, "bye");
-  END_CHILD()
-
-  // The error messages should match the processes which triggered them.
-  EXPECT_NE(std::string::npos, first_process_error.find(kFirstErrorMessage));
-  EXPECT_NE(std::string::npos, second_process_error.find(kSecondErrorMessage));
-}
-INSTANTIATE_TEST_CASE_P(
-    ,
-    MultiprocessMessagePipeTestWithPeerSupport,
-    testing::Values(test::MojoTestBase::LaunchType::CHILD,
-                    test::MojoTestBase::LaunchType::PEER,
-                    test::MojoTestBase::LaunchType::NAMED_CHILD,
-                    test::MojoTestBase::LaunchType::NAMED_PEER));
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/node_channel.cc b/mojo/edk/system/node_channel.cc
deleted file mode 100644
index b0f770d..0000000
--- a/mojo/edk/system/node_channel.cc
+++ /dev/null
@@ -1,905 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/node_channel.h"
-
-#include <cstring>
-#include <limits>
-#include <sstream>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/request_context.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "mojo/edk/system/mach_port_relay.h"
-#endif
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-template <typename T>
-T Align(T t) {
-  const auto k = kChannelMessageAlignment;
-  return t + (k - (t % k)) % k;
-}
-
-// NOTE: Please ONLY append messages to the end of this enum.
-enum class MessageType : uint32_t {
-  ACCEPT_CHILD,
-  ACCEPT_PARENT,
-  ADD_BROKER_CLIENT,
-  BROKER_CLIENT_ADDED,
-  ACCEPT_BROKER_CLIENT,
-  PORTS_MESSAGE,
-  REQUEST_PORT_MERGE,
-  REQUEST_INTRODUCTION,
-  INTRODUCE,
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-  RELAY_PORTS_MESSAGE,
-#endif
-  BROADCAST,
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-  PORTS_MESSAGE_FROM_RELAY,
-#endif
-  ACCEPT_PEER,
-};
-
-struct Header {
-  MessageType type;
-  uint32_t padding;
-};
-
-static_assert(IsAlignedForChannelMessage(sizeof(Header)),
-              "Invalid header size.");
-
-struct AcceptChildData {
-  ports::NodeName parent_name;
-  ports::NodeName token;
-};
-
-struct AcceptParentData {
-  ports::NodeName token;
-  ports::NodeName child_name;
-};
-
-struct AcceptPeerData {
-  ports::NodeName token;
-  ports::NodeName peer_name;
-  ports::PortName port_name;
-};
-
-// This message may include a process handle on plaforms that require it.
-struct AddBrokerClientData {
-  ports::NodeName client_name;
-#if !defined(OS_WIN)
-  uint32_t process_handle;
-  uint32_t padding;
-#endif
-};
-
-#if !defined(OS_WIN)
-static_assert(sizeof(base::ProcessHandle) == sizeof(uint32_t),
-              "Unexpected pid size");
-static_assert(sizeof(AddBrokerClientData) % kChannelMessageAlignment == 0,
-              "Invalid AddBrokerClientData size.");
-#endif
-
-// This data is followed by a platform channel handle to the broker.
-struct BrokerClientAddedData {
-  ports::NodeName client_name;
-};
-
-// This data may be followed by a platform channel handle to the broker. If not,
-// then the parent is the broker and its channel should be used as such.
-struct AcceptBrokerClientData {
-  ports::NodeName broker_name;
-};
-
-// This is followed by arbitrary payload data which is interpreted as a token
-// string for port location.
-struct RequestPortMergeData {
-  ports::PortName connector_port_name;
-};
-
-// Used for both REQUEST_INTRODUCTION and INTRODUCE.
-//
-// For INTRODUCE the message also includes a valid platform handle for a channel
-// the receiver may use to communicate with the named node directly, or an
-// invalid platform handle if the node is unknown to the sender or otherwise
-// cannot be introduced.
-struct IntroductionData {
-  ports::NodeName name;
-};
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-// This struct is followed by the full payload of a message to be relayed.
-struct RelayPortsMessageData {
-  ports::NodeName destination;
-};
-
-// This struct is followed by the full payload of a relayed message.
-struct PortsMessageFromRelayData {
-  ports::NodeName source;
-};
-#endif
-
-template <typename DataType>
-Channel::MessagePtr CreateMessage(MessageType type,
-                                  size_t payload_size,
-                                  size_t num_handles,
-                                  DataType** out_data) {
-  Channel::MessagePtr message(
-      new Channel::Message(sizeof(Header) + payload_size, num_handles));
-  Header* header = reinterpret_cast<Header*>(message->mutable_payload());
-  header->type = type;
-  header->padding = 0;
-  *out_data = reinterpret_cast<DataType*>(&header[1]);
-  return message;
-}
-
-template <typename DataType>
-bool GetMessagePayload(const void* bytes,
-                       size_t num_bytes,
-                       DataType** out_data) {
-  static_assert(sizeof(DataType) > 0, "DataType must have non-zero size.");
-  if (num_bytes < sizeof(Header) + sizeof(DataType))
-    return false;
-  *out_data = reinterpret_cast<const DataType*>(
-      static_cast<const char*>(bytes) + sizeof(Header));
-  return true;
-}
-
-}  // namespace
-
-// static
-scoped_refptr<NodeChannel> NodeChannel::Create(
-    Delegate* delegate,
-    ConnectionParams connection_params,
-    scoped_refptr<base::TaskRunner> io_task_runner,
-    const ProcessErrorCallback& process_error_callback) {
-#if defined(OS_NACL_SFI)
-  LOG(FATAL) << "Multi-process not yet supported on NaCl-SFI";
-  return nullptr;
-#else
-  return new NodeChannel(delegate, std::move(connection_params), io_task_runner,
-                         process_error_callback);
-#endif
-}
-
-// static
-Channel::MessagePtr NodeChannel::CreatePortsMessage(size_t payload_size,
-                                                    void** payload,
-                                                    size_t num_handles) {
-  return CreateMessage(MessageType::PORTS_MESSAGE, payload_size, num_handles,
-                       payload);
-}
-
-// static
-void NodeChannel::GetPortsMessageData(Channel::Message* message,
-                                      void** data,
-                                      size_t* num_data_bytes) {
-  *data = reinterpret_cast<Header*>(message->mutable_payload()) + 1;
-  *num_data_bytes = message->payload_size() - sizeof(Header);
-}
-
-void NodeChannel::Start() {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  MachPortRelay* relay = delegate_->GetMachPortRelay();
-  if (relay)
-    relay->AddObserver(this);
-#endif
-
-  base::AutoLock lock(channel_lock_);
-  // ShutDown() may have already been called, in which case |channel_| is null.
-  if (channel_)
-    channel_->Start();
-}
-
-void NodeChannel::ShutDown() {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  MachPortRelay* relay = delegate_->GetMachPortRelay();
-  if (relay)
-    relay->RemoveObserver(this);
-#endif
-
-  base::AutoLock lock(channel_lock_);
-  if (channel_) {
-    channel_->ShutDown();
-    channel_ = nullptr;
-  }
-}
-
-void NodeChannel::LeakHandleOnShutdown() {
-  base::AutoLock lock(channel_lock_);
-  if (channel_) {
-    channel_->LeakHandle();
-  }
-}
-
-void NodeChannel::NotifyBadMessage(const std::string& error) {
-  if (!process_error_callback_.is_null())
-    process_error_callback_.Run("Received bad user message: " + error);
-}
-
-void NodeChannel::SetRemoteProcessHandle(base::ProcessHandle process_handle) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-  base::AutoLock lock(remote_process_handle_lock_);
-  DCHECK_EQ(base::kNullProcessHandle, remote_process_handle_);
-  CHECK_NE(remote_process_handle_, base::GetCurrentProcessHandle());
-  remote_process_handle_ = process_handle;
-#if defined(OS_WIN)
-  DCHECK(!scoped_remote_process_handle_.is_valid());
-  scoped_remote_process_handle_.reset(PlatformHandle(process_handle));
-#endif
-}
-
-bool NodeChannel::HasRemoteProcessHandle() {
-  base::AutoLock lock(remote_process_handle_lock_);
-  return remote_process_handle_ != base::kNullProcessHandle;
-}
-
-base::ProcessHandle NodeChannel::CopyRemoteProcessHandle() {
-  base::AutoLock lock(remote_process_handle_lock_);
-#if defined(OS_WIN)
-  if (remote_process_handle_ != base::kNullProcessHandle) {
-    // Privileged nodes use this to pass their childrens' process handles to the
-    // broker on launch.
-    HANDLE handle = remote_process_handle_;
-    BOOL result = DuplicateHandle(
-        base::GetCurrentProcessHandle(), remote_process_handle_,
-        base::GetCurrentProcessHandle(), &handle, 0, FALSE,
-        DUPLICATE_SAME_ACCESS);
-    DPCHECK(result);
-    return handle;
-  }
-  return base::kNullProcessHandle;
-#else
-  return remote_process_handle_;
-#endif
-}
-
-void NodeChannel::SetRemoteNodeName(const ports::NodeName& name) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-  remote_node_name_ = name;
-}
-
-void NodeChannel::AcceptChild(const ports::NodeName& parent_name,
-                              const ports::NodeName& token) {
-  AcceptChildData* data;
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::ACCEPT_CHILD, sizeof(AcceptChildData), 0, &data);
-  data->parent_name = parent_name;
-  data->token = token;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::AcceptParent(const ports::NodeName& token,
-                               const ports::NodeName& child_name) {
-  AcceptParentData* data;
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::ACCEPT_PARENT, sizeof(AcceptParentData), 0, &data);
-  data->token = token;
-  data->child_name = child_name;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::AcceptPeer(const ports::NodeName& sender_name,
-                             const ports::NodeName& token,
-                             const ports::PortName& port_name) {
-  AcceptPeerData* data;
-  Channel::MessagePtr message =
-      CreateMessage(MessageType::ACCEPT_PEER, sizeof(AcceptPeerData), 0, &data);
-  data->token = token;
-  data->peer_name = sender_name;
-  data->port_name = port_name;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::AddBrokerClient(const ports::NodeName& client_name,
-                                  base::ProcessHandle process_handle) {
-  AddBrokerClientData* data;
-  ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector());
-#if defined(OS_WIN)
-  handles->push_back(PlatformHandle(process_handle));
-#endif
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::ADD_BROKER_CLIENT, sizeof(AddBrokerClientData),
-      handles->size(), &data);
-  message->SetHandles(std::move(handles));
-  data->client_name = client_name;
-#if !defined(OS_WIN)
-  data->process_handle = process_handle;
-  data->padding = 0;
-#endif
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::BrokerClientAdded(const ports::NodeName& client_name,
-                                    ScopedPlatformHandle broker_channel) {
-  BrokerClientAddedData* data;
-  ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector());
-  if (broker_channel.is_valid())
-    handles->push_back(broker_channel.release());
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::BROKER_CLIENT_ADDED, sizeof(BrokerClientAddedData),
-      handles->size(), &data);
-  message->SetHandles(std::move(handles));
-  data->client_name = client_name;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::AcceptBrokerClient(const ports::NodeName& broker_name,
-                                     ScopedPlatformHandle broker_channel) {
-  AcceptBrokerClientData* data;
-  ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector());
-  if (broker_channel.is_valid())
-    handles->push_back(broker_channel.release());
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::ACCEPT_BROKER_CLIENT, sizeof(AcceptBrokerClientData),
-      handles->size(), &data);
-  message->SetHandles(std::move(handles));
-  data->broker_name = broker_name;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::PortsMessage(Channel::MessagePtr message) {
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::RequestPortMerge(const ports::PortName& connector_port_name,
-                                   const std::string& token) {
-  RequestPortMergeData* data;
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::REQUEST_PORT_MERGE,
-      sizeof(RequestPortMergeData) + token.size(), 0, &data);
-  data->connector_port_name = connector_port_name;
-  memcpy(data + 1, token.data(), token.size());
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::RequestIntroduction(const ports::NodeName& name) {
-  IntroductionData* data;
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::REQUEST_INTRODUCTION, sizeof(IntroductionData), 0, &data);
-  data->name = name;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::Introduce(const ports::NodeName& name,
-                            ScopedPlatformHandle channel_handle) {
-  IntroductionData* data;
-  ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector());
-  if (channel_handle.is_valid())
-    handles->push_back(channel_handle.release());
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::INTRODUCE, sizeof(IntroductionData), handles->size(), &data);
-  message->SetHandles(std::move(handles));
-  data->name = name;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::Broadcast(Channel::MessagePtr message) {
-  DCHECK(!message->has_handles());
-  void* data;
-  Channel::MessagePtr broadcast_message = CreateMessage(
-      MessageType::BROADCAST, message->data_num_bytes(), 0, &data);
-  memcpy(data, message->data(), message->data_num_bytes());
-  WriteChannelMessage(std::move(broadcast_message));
-}
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-void NodeChannel::RelayPortsMessage(const ports::NodeName& destination,
-                                    Channel::MessagePtr message) {
-#if defined(OS_WIN)
-  DCHECK(message->has_handles());
-
-  // Note that this is only used on Windows, and on Windows all platform
-  // handles are included in the message data. We blindly copy all the data
-  // here and the relay node (the parent) will duplicate handles as needed.
-  size_t num_bytes = sizeof(RelayPortsMessageData) + message->data_num_bytes();
-  RelayPortsMessageData* data;
-  Channel::MessagePtr relay_message = CreateMessage(
-      MessageType::RELAY_PORTS_MESSAGE, num_bytes, 0, &data);
-  data->destination = destination;
-  memcpy(data + 1, message->data(), message->data_num_bytes());
-
-  // When the handles are duplicated in the parent, the source handles will
-  // be closed. If the parent never receives this message then these handles
-  // will leak, but that means something else has probably broken and the
-  // sending process won't likely be around much longer.
-  ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-  handles->clear();
-
-#else
-  DCHECK(message->has_mach_ports());
-
-  // On OSX, the handles are extracted from the relayed message and attached to
-  // the wrapper. The broker then takes the handles attached to the wrapper and
-  // moves them back to the relayed message. This is necessary because the
-  // message may contain fds which need to be attached to the outer message so
-  // that they can be transferred to the broker.
-  ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-  size_t num_bytes = sizeof(RelayPortsMessageData) + message->data_num_bytes();
-  RelayPortsMessageData* data;
-  Channel::MessagePtr relay_message = CreateMessage(
-      MessageType::RELAY_PORTS_MESSAGE, num_bytes, handles->size(), &data);
-  data->destination = destination;
-  memcpy(data + 1, message->data(), message->data_num_bytes());
-  relay_message->SetHandles(std::move(handles));
-#endif  // defined(OS_WIN)
-
-  WriteChannelMessage(std::move(relay_message));
-}
-
-void NodeChannel::PortsMessageFromRelay(const ports::NodeName& source,
-                                        Channel::MessagePtr message) {
-  size_t num_bytes = sizeof(PortsMessageFromRelayData) +
-      message->payload_size();
-  PortsMessageFromRelayData* data;
-  Channel::MessagePtr relayed_message = CreateMessage(
-      MessageType::PORTS_MESSAGE_FROM_RELAY, num_bytes, message->num_handles(),
-      &data);
-  data->source = source;
-  if (message->payload_size())
-    memcpy(data + 1, message->payload(), message->payload_size());
-  relayed_message->SetHandles(message->TakeHandles());
-  WriteChannelMessage(std::move(relayed_message));
-}
-#endif  // defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-
-NodeChannel::NodeChannel(Delegate* delegate,
-                         ConnectionParams connection_params,
-                         scoped_refptr<base::TaskRunner> io_task_runner,
-                         const ProcessErrorCallback& process_error_callback)
-    : delegate_(delegate),
-      io_task_runner_(io_task_runner),
-      process_error_callback_(process_error_callback)
-#if !defined(OS_NACL_SFI)
-      ,
-      channel_(
-          Channel::Create(this, std::move(connection_params), io_task_runner_))
-#endif
-{
-}
-
-NodeChannel::~NodeChannel() {
-  ShutDown();
-}
-
-void NodeChannel::OnChannelMessage(const void* payload,
-                                   size_t payload_size,
-                                   ScopedPlatformHandleVectorPtr handles) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  RequestContext request_context(RequestContext::Source::SYSTEM);
-
-  // Ensure this NodeChannel stays alive through the extent of this method. The
-  // delegate may have the only other reference to this object and it may choose
-  // to drop it here in response to, e.g., a malformed message.
-  scoped_refptr<NodeChannel> keepalive = this;
-
-#if defined(OS_WIN)
-  // If we receive handles from a known process, rewrite them to our own
-  // process. This can occur when a privileged node receives handles directly
-  // from a privileged descendant.
-  {
-    base::AutoLock lock(remote_process_handle_lock_);
-    if (handles && remote_process_handle_ != base::kNullProcessHandle) {
-      // Note that we explicitly mark the handles as being owned by the sending
-      // process before rewriting them, in order to accommodate RewriteHandles'
-      // internal sanity checks.
-      for (auto& handle : *handles)
-        handle.owning_process = remote_process_handle_;
-      if (!Channel::Message::RewriteHandles(remote_process_handle_,
-                                            base::GetCurrentProcessHandle(),
-                                            handles.get())) {
-        DLOG(ERROR) << "Received one or more invalid handles.";
-      }
-    } else if (handles) {
-      // Handles received by an unknown process must already be owned by us.
-      for (auto& handle : *handles)
-        handle.owning_process = base::GetCurrentProcessHandle();
-    }
-  }
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  // If we're not the root, receive any mach ports from the message. If we're
-  // the root, the only message containing mach ports should be a
-  // RELAY_PORTS_MESSAGE.
-  {
-    MachPortRelay* relay = delegate_->GetMachPortRelay();
-    if (handles && !relay) {
-      if (!MachPortRelay::ReceivePorts(handles.get())) {
-        LOG(ERROR) << "Error receiving mach ports.";
-      }
-    }
-  }
-#endif  // defined(OS_WIN)
-
-
-  if (payload_size <= sizeof(Header)) {
-    delegate_->OnChannelError(remote_node_name_, this);
-    return;
-  }
-
-  const Header* header = static_cast<const Header*>(payload);
-  switch (header->type) {
-    case MessageType::ACCEPT_CHILD: {
-      const AcceptChildData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        delegate_->OnAcceptChild(remote_node_name_, data->parent_name,
-                                 data->token);
-        return;
-      }
-      break;
-    }
-
-    case MessageType::ACCEPT_PARENT: {
-      const AcceptParentData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        delegate_->OnAcceptParent(remote_node_name_, data->token,
-                                  data->child_name);
-        return;
-      }
-      break;
-    }
-
-    case MessageType::ADD_BROKER_CLIENT: {
-      const AddBrokerClientData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        ScopedPlatformHandle process_handle;
-#if defined(OS_WIN)
-        if (!handles || handles->size() != 1) {
-          DLOG(ERROR) << "Dropping invalid AddBrokerClient message.";
-          break;
-        }
-        process_handle = ScopedPlatformHandle(handles->at(0));
-        handles->clear();
-        delegate_->OnAddBrokerClient(remote_node_name_, data->client_name,
-                                     process_handle.release().handle);
-#else
-        if (handles && handles->size() != 0) {
-          DLOG(ERROR) << "Dropping invalid AddBrokerClient message.";
-          break;
-        }
-        delegate_->OnAddBrokerClient(remote_node_name_, data->client_name,
-                                     data->process_handle);
-#endif
-        return;
-      }
-      break;
-    }
-
-    case MessageType::BROKER_CLIENT_ADDED: {
-      const BrokerClientAddedData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        ScopedPlatformHandle broker_channel;
-        if (!handles || handles->size() != 1) {
-          DLOG(ERROR) << "Dropping invalid BrokerClientAdded message.";
-          break;
-        }
-        broker_channel = ScopedPlatformHandle(handles->at(0));
-        handles->clear();
-        delegate_->OnBrokerClientAdded(remote_node_name_, data->client_name,
-                                       std::move(broker_channel));
-        return;
-      }
-      break;
-    }
-
-    case MessageType::ACCEPT_BROKER_CLIENT: {
-      const AcceptBrokerClientData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        ScopedPlatformHandle broker_channel;
-        if (handles && handles->size() > 1) {
-          DLOG(ERROR) << "Dropping invalid AcceptBrokerClient message.";
-          break;
-        }
-        if (handles && handles->size() == 1) {
-          broker_channel = ScopedPlatformHandle(handles->at(0));
-          handles->clear();
-        }
-        delegate_->OnAcceptBrokerClient(remote_node_name_, data->broker_name,
-                                        std::move(broker_channel));
-        return;
-      }
-      break;
-    }
-
-    case MessageType::PORTS_MESSAGE: {
-      size_t num_handles = handles ? handles->size() : 0;
-      Channel::MessagePtr message(
-          new Channel::Message(payload_size, num_handles));
-      message->SetHandles(std::move(handles));
-      memcpy(message->mutable_payload(), payload, payload_size);
-      delegate_->OnPortsMessage(remote_node_name_, std::move(message));
-      return;
-    }
-
-    case MessageType::REQUEST_PORT_MERGE: {
-      const RequestPortMergeData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        // Don't accept an empty token.
-        size_t token_size = payload_size - sizeof(*data) - sizeof(Header);
-        if (token_size == 0)
-          break;
-        std::string token(reinterpret_cast<const char*>(data + 1), token_size);
-        delegate_->OnRequestPortMerge(remote_node_name_,
-                                      data->connector_port_name, token);
-        return;
-      }
-      break;
-    }
-
-    case MessageType::REQUEST_INTRODUCTION: {
-      const IntroductionData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        delegate_->OnRequestIntroduction(remote_node_name_, data->name);
-        return;
-      }
-      break;
-    }
-
-    case MessageType::INTRODUCE: {
-      const IntroductionData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        if (handles && handles->size() > 1) {
-          DLOG(ERROR) << "Dropping invalid introduction message.";
-          break;
-        }
-        ScopedPlatformHandle channel_handle;
-        if (handles && handles->size() == 1) {
-          channel_handle = ScopedPlatformHandle(handles->at(0));
-          handles->clear();
-        }
-        delegate_->OnIntroduce(remote_node_name_, data->name,
-                               std::move(channel_handle));
-        return;
-      }
-      break;
-    }
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-    case MessageType::RELAY_PORTS_MESSAGE: {
-      base::ProcessHandle from_process;
-      {
-        base::AutoLock lock(remote_process_handle_lock_);
-        from_process = remote_process_handle_;
-      }
-      const RelayPortsMessageData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        // Don't try to relay an empty message.
-        if (payload_size <= sizeof(Header) + sizeof(RelayPortsMessageData))
-          break;
-
-        const void* message_start = data + 1;
-        Channel::MessagePtr message = Channel::Message::Deserialize(
-            message_start, payload_size - sizeof(Header) - sizeof(*data));
-        if (!message) {
-          DLOG(ERROR) << "Dropping invalid relay message.";
-          break;
-        }
-  #if defined(OS_MACOSX) && !defined(OS_IOS)
-        message->SetHandles(std::move(handles));
-        MachPortRelay* relay = delegate_->GetMachPortRelay();
-        if (!relay) {
-          LOG(ERROR) << "Receiving mach ports without a port relay from "
-                     << remote_node_name_ << ". Dropping message.";
-          break;
-        }
-        {
-          base::AutoLock lock(pending_mach_messages_lock_);
-          if (relay->port_provider()->TaskForPid(from_process) ==
-              MACH_PORT_NULL) {
-            pending_relay_messages_.push(
-                std::make_pair(data->destination, std::move(message)));
-            break;
-          }
-        }
-  #endif
-        delegate_->OnRelayPortsMessage(remote_node_name_, from_process,
-                                       data->destination, std::move(message));
-        return;
-      }
-      break;
-    }
-#endif
-
-    case MessageType::BROADCAST: {
-      if (payload_size <= sizeof(Header))
-        break;
-      const void* data = static_cast<const void*>(
-          reinterpret_cast<const Header*>(payload) + 1);
-      Channel::MessagePtr message =
-          Channel::Message::Deserialize(data, payload_size - sizeof(Header));
-      if (!message || message->has_handles()) {
-        DLOG(ERROR) << "Dropping invalid broadcast message.";
-        break;
-      }
-      delegate_->OnBroadcast(remote_node_name_, std::move(message));
-      return;
-    }
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-    case MessageType::PORTS_MESSAGE_FROM_RELAY:
-      const PortsMessageFromRelayData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        size_t num_bytes = payload_size - sizeof(*data);
-        if (num_bytes < sizeof(Header))
-          break;
-        num_bytes -= sizeof(Header);
-
-        size_t num_handles = handles ? handles->size() : 0;
-        Channel::MessagePtr message(
-            new Channel::Message(num_bytes, num_handles));
-        message->SetHandles(std::move(handles));
-        if (num_bytes)
-          memcpy(message->mutable_payload(), data + 1, num_bytes);
-        delegate_->OnPortsMessageFromRelay(
-            remote_node_name_, data->source, std::move(message));
-        return;
-      }
-      break;
-
-#endif  // defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-
-    case MessageType::ACCEPT_PEER: {
-      const AcceptPeerData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        delegate_->OnAcceptPeer(remote_node_name_, data->token, data->peer_name,
-                                data->port_name);
-        return;
-      }
-      break;
-    }
-
-    default:
-      break;
-  }
-
-  DLOG(ERROR) << "Received invalid message. Closing channel.";
-  delegate_->OnChannelError(remote_node_name_, this);
-}
-
-void NodeChannel::OnChannelError() {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  RequestContext request_context(RequestContext::Source::SYSTEM);
-
-  ShutDown();
-  // |OnChannelError()| may cause |this| to be destroyed, but still need access
-  // to the name name after that destruction. So may a copy of
-  // |remote_node_name_| so it can be used if |this| becomes destroyed.
-  ports::NodeName node_name = remote_node_name_;
-  delegate_->OnChannelError(node_name, this);
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-void NodeChannel::OnProcessReady(base::ProcessHandle process) {
-  io_task_runner_->PostTask(FROM_HERE, base::Bind(
-      &NodeChannel::ProcessPendingMessagesWithMachPorts, this));
-}
-
-void NodeChannel::ProcessPendingMessagesWithMachPorts() {
-  MachPortRelay* relay = delegate_->GetMachPortRelay();
-  DCHECK(relay);
-
-  base::ProcessHandle remote_process_handle;
-  {
-    base::AutoLock lock(remote_process_handle_lock_);
-    remote_process_handle = remote_process_handle_;
-  }
-  PendingMessageQueue pending_writes;
-  PendingRelayMessageQueue pending_relays;
-  {
-    base::AutoLock lock(pending_mach_messages_lock_);
-    pending_writes.swap(pending_write_messages_);
-    pending_relays.swap(pending_relay_messages_);
-  }
-
-  while (!pending_writes.empty()) {
-    Channel::MessagePtr message = std::move(pending_writes.front());
-    pending_writes.pop();
-    if (!relay->SendPortsToProcess(message.get(), remote_process_handle)) {
-      LOG(ERROR) << "Error on sending mach ports. Remote process is likely "
-                 << "gone. Dropping message.";
-      return;
-    }
-
-    base::AutoLock lock(channel_lock_);
-    if (!channel_) {
-      DLOG(ERROR) << "Dropping message on closed channel.";
-      break;
-    } else {
-      channel_->Write(std::move(message));
-    }
-  }
-
-  // Ensure this NodeChannel stays alive while flushing relay messages.
-  scoped_refptr<NodeChannel> keepalive = this;
-
-  while (!pending_relays.empty()) {
-    ports::NodeName destination = pending_relays.front().first;
-    Channel::MessagePtr message = std::move(pending_relays.front().second);
-    pending_relays.pop();
-    delegate_->OnRelayPortsMessage(remote_node_name_, remote_process_handle,
-                                   destination, std::move(message));
-  }
-}
-#endif
-
-void NodeChannel::WriteChannelMessage(Channel::MessagePtr message) {
-#if defined(OS_WIN)
-  // Map handles to the destination process. Note: only messages from a
-  // privileged node should contain handles on Windows. If an unprivileged
-  // node needs to send handles, it should do so via RelayPortsMessage which
-  // stashes the handles in the message in such a way that they go undetected
-  // here (they'll be unpacked and duplicated by a privileged parent.)
-
-  if (message->has_handles()) {
-    base::ProcessHandle remote_process_handle;
-    {
-      base::AutoLock lock(remote_process_handle_lock_);
-      remote_process_handle = remote_process_handle_;
-    }
-
-    // Rewrite outgoing handles if we have a handle to the destination process.
-    if (remote_process_handle != base::kNullProcessHandle) {
-      ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-      if (!Channel::Message::RewriteHandles(base::GetCurrentProcessHandle(),
-                                            remote_process_handle,
-                                            handles.get())) {
-        DLOG(ERROR) << "Failed to duplicate one or more outgoing handles.";
-      }
-      message->SetHandles(std::move(handles));
-    }
-  }
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  // On OSX, we need to transfer mach ports to the destination process before
-  // transferring the message itself.
-  if (message->has_mach_ports()) {
-    MachPortRelay* relay = delegate_->GetMachPortRelay();
-    if (relay) {
-      base::ProcessHandle remote_process_handle;
-      {
-        base::AutoLock lock(remote_process_handle_lock_);
-        // Expect that the receiving node is a child.
-        DCHECK(remote_process_handle_ != base::kNullProcessHandle);
-        remote_process_handle = remote_process_handle_;
-      }
-      {
-        base::AutoLock lock(pending_mach_messages_lock_);
-        if (relay->port_provider()->TaskForPid(remote_process_handle) ==
-            MACH_PORT_NULL) {
-          // It is also possible for TaskForPid() to return MACH_PORT_NULL when
-          // the process has started, then died. In that case, the queued
-          // message will never be processed. But that's fine since we're about
-          // to die anyway.
-          pending_write_messages_.push(std::move(message));
-          return;
-        }
-      }
-
-      if (!relay->SendPortsToProcess(message.get(), remote_process_handle)) {
-        LOG(ERROR) << "Error on sending mach ports. Remote process is likely "
-                   << "gone. Dropping message.";
-        return;
-      }
-    }
-  }
-#endif
-
-  base::AutoLock lock(channel_lock_);
-  if (!channel_)
-    DLOG(ERROR) << "Dropping message on closed channel.";
-  else
-    channel_->Write(std::move(message));
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/node_channel.h b/mojo/edk/system/node_channel.h
deleted file mode 100644
index 95dc341..0000000
--- a/mojo/edk/system/node_channel.h
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_NODE_CHANNEL_H_
-#define MOJO_EDK_SYSTEM_NODE_CHANNEL_H_
-
-#include <queue>
-#include <unordered_map>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/process/process_handle.h"
-#include "base/synchronization/lock.h"
-#include "base/task_runner.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/connection_params.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/ports/name.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "mojo/edk/system/mach_port_relay.h"
-#endif
-
-namespace mojo {
-namespace edk {
-
-// Wraps a Channel to send and receive Node control messages.
-class NodeChannel : public base::RefCountedThreadSafe<NodeChannel>,
-                    public Channel::Delegate
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-                    , public MachPortRelay::Observer
-#endif
-  {
- public:
-  class Delegate {
-   public:
-    virtual ~Delegate() {}
-    virtual void OnAcceptChild(const ports::NodeName& from_node,
-                               const ports::NodeName& parent_name,
-                               const ports::NodeName& token) = 0;
-    virtual void OnAcceptParent(const ports::NodeName& from_node,
-                                const ports::NodeName& token,
-                                const ports::NodeName& child_name) = 0;
-    virtual void OnAddBrokerClient(const ports::NodeName& from_node,
-                                   const ports::NodeName& client_name,
-                                   base::ProcessHandle process_handle) = 0;
-    virtual void OnBrokerClientAdded(const ports::NodeName& from_node,
-                                     const ports::NodeName& client_name,
-                                     ScopedPlatformHandle broker_channel) = 0;
-    virtual void OnAcceptBrokerClient(const ports::NodeName& from_node,
-                                      const ports::NodeName& broker_name,
-                                      ScopedPlatformHandle broker_channel) = 0;
-    virtual void OnPortsMessage(const ports::NodeName& from_node,
-                                Channel::MessagePtr message) = 0;
-    virtual void OnRequestPortMerge(const ports::NodeName& from_node,
-                                    const ports::PortName& connector_port_name,
-                                    const std::string& token) = 0;
-    virtual void OnRequestIntroduction(const ports::NodeName& from_node,
-                                       const ports::NodeName& name) = 0;
-    virtual void OnIntroduce(const ports::NodeName& from_node,
-                             const ports::NodeName& name,
-                             ScopedPlatformHandle channel_handle) = 0;
-    virtual void OnBroadcast(const ports::NodeName& from_node,
-                             Channel::MessagePtr message) = 0;
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-    virtual void OnRelayPortsMessage(const ports::NodeName& from_node,
-                                     base::ProcessHandle from_process,
-                                     const ports::NodeName& destination,
-                                     Channel::MessagePtr message) = 0;
-    virtual void OnPortsMessageFromRelay(const ports::NodeName& from_node,
-                                         const ports::NodeName& source_node,
-                                         Channel::MessagePtr message) = 0;
-#endif
-    virtual void OnAcceptPeer(const ports::NodeName& from_node,
-                              const ports::NodeName& token,
-                              const ports::NodeName& peer_name,
-                              const ports::PortName& port_name) = 0;
-    virtual void OnChannelError(const ports::NodeName& node,
-                                NodeChannel* channel) = 0;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    virtual MachPortRelay* GetMachPortRelay() = 0;
-#endif
-  };
-
-  static scoped_refptr<NodeChannel> Create(
-      Delegate* delegate,
-      ConnectionParams connection_params,
-      scoped_refptr<base::TaskRunner> io_task_runner,
-      const ProcessErrorCallback& process_error_callback);
-
-  static Channel::MessagePtr CreatePortsMessage(size_t payload_size,
-                                                void** payload,
-                                                size_t num_handles);
-
-  static void GetPortsMessageData(Channel::Message* message, void** data,
-                                  size_t* num_data_bytes);
-
-  // Start receiving messages.
-  void Start();
-
-  // Permanently stop the channel from sending or receiving messages.
-  void ShutDown();
-
-  // Leaks the pipe handle instead of closing it on shutdown.
-  void LeakHandleOnShutdown();
-
-  // Invokes the bad message callback for this channel, if any.
-  void NotifyBadMessage(const std::string& error);
-
-  // Note: On Windows, we take ownership of the remote process handle.
-  void SetRemoteProcessHandle(base::ProcessHandle process_handle);
-  bool HasRemoteProcessHandle();
-  // Note: The returned |ProcessHandle| is owned by the caller and should be
-  // freed if necessary.
-  base::ProcessHandle CopyRemoteProcessHandle();
-
-  // Used for context in Delegate calls (via |from_node| arguments.)
-  void SetRemoteNodeName(const ports::NodeName& name);
-
-  void AcceptChild(const ports::NodeName& parent_name,
-                   const ports::NodeName& token);
-  void AcceptParent(const ports::NodeName& token,
-                    const ports::NodeName& child_name);
-  void AcceptPeer(const ports::NodeName& sender_name,
-                  const ports::NodeName& token,
-                  const ports::PortName& port_name);
-  void AddBrokerClient(const ports::NodeName& client_name,
-                       base::ProcessHandle process_handle);
-  void BrokerClientAdded(const ports::NodeName& client_name,
-                         ScopedPlatformHandle broker_channel);
-  void AcceptBrokerClient(const ports::NodeName& broker_name,
-                          ScopedPlatformHandle broker_channel);
-  void PortsMessage(Channel::MessagePtr message);
-  void RequestPortMerge(const ports::PortName& connector_port_name,
-                        const std::string& token);
-  void RequestIntroduction(const ports::NodeName& name);
-  void Introduce(const ports::NodeName& name,
-                 ScopedPlatformHandle channel_handle);
-  void Broadcast(Channel::MessagePtr message);
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-  // Relay the message to the specified node via this channel.  This is used to
-  // pass windows handles between two processes that do not have permission to
-  // duplicate handles into the other's address space. The relay process is
-  // assumed to have that permission.
-  void RelayPortsMessage(const ports::NodeName& destination,
-                         Channel::MessagePtr message);
-
-  // Sends a message to its destination from a relay. This is interpreted by the
-  // receiver similarly to PortsMessage, but the original source node is
-  // provided as additional message metadata from the (trusted) relay node.
-  void PortsMessageFromRelay(const ports::NodeName& source,
-                             Channel::MessagePtr message);
-#endif
-
- private:
-  friend class base::RefCountedThreadSafe<NodeChannel>;
-
-  using PendingMessageQueue = std::queue<Channel::MessagePtr>;
-  using PendingRelayMessageQueue =
-      std::queue<std::pair<ports::NodeName, Channel::MessagePtr>>;
-
-  NodeChannel(Delegate* delegate,
-              ConnectionParams connection_params,
-              scoped_refptr<base::TaskRunner> io_task_runner,
-              const ProcessErrorCallback& process_error_callback);
-  ~NodeChannel() override;
-
-  // Channel::Delegate:
-  void OnChannelMessage(const void* payload,
-                        size_t payload_size,
-                        ScopedPlatformHandleVectorPtr handles) override;
-  void OnChannelError() override;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  // MachPortRelay::Observer:
-  void OnProcessReady(base::ProcessHandle process) override;
-
-  void ProcessPendingMessagesWithMachPorts();
-#endif
-
-  void WriteChannelMessage(Channel::MessagePtr message);
-
-  Delegate* const delegate_;
-  const scoped_refptr<base::TaskRunner> io_task_runner_;
-  const ProcessErrorCallback process_error_callback_;
-
-  base::Lock channel_lock_;
-  scoped_refptr<Channel> channel_;
-
-  // Must only be accessed from |io_task_runner_|'s thread.
-  ports::NodeName remote_node_name_;
-
-  base::Lock remote_process_handle_lock_;
-  base::ProcessHandle remote_process_handle_ = base::kNullProcessHandle;
-#if defined(OS_WIN)
-  ScopedPlatformHandle scoped_remote_process_handle_;
-#endif
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  base::Lock pending_mach_messages_lock_;
-  PendingMessageQueue pending_write_messages_;
-  PendingRelayMessageQueue pending_relay_messages_;
-#endif
-
-  DISALLOW_COPY_AND_ASSIGN(NodeChannel);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_NODE_CHANNEL_H_
diff --git a/mojo/edk/system/node_controller.cc b/mojo/edk/system/node_controller.cc
deleted file mode 100644
index 73b16b1..0000000
--- a/mojo/edk/system/node_controller.cc
+++ /dev/null
@@ -1,1470 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/node_controller.h"
-
-#include <algorithm>
-#include <limits>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/process/process_handle.h"
-#include "base/rand_util.h"
-#include "base/time/time.h"
-#include "base/timer/elapsed_timer.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/named_platform_channel_pair.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/system/broker.h"
-#include "mojo/edk/system/broker_host.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/ports_message.h"
-#include "mojo/edk/system/request_context.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "mojo/edk/system/mach_port_relay.h"
-#endif
-
-#if !defined(OS_NACL)
-#include "crypto/random.h"
-#endif
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-#if defined(OS_NACL)
-template <typename T>
-void GenerateRandomName(T* out) { base::RandBytes(out, sizeof(T)); }
-#else
-template <typename T>
-void GenerateRandomName(T* out) { crypto::RandBytes(out, sizeof(T)); }
-#endif
-
-ports::NodeName GetRandomNodeName() {
-  ports::NodeName name;
-  GenerateRandomName(&name);
-  return name;
-}
-
-void RecordPeerCount(size_t count) {
-  DCHECK_LE(count, static_cast<size_t>(std::numeric_limits<int32_t>::max()));
-
-  // 8k is the maximum number of file descriptors allowed in Chrome.
-  UMA_HISTOGRAM_CUSTOM_COUNTS("Mojo.System.Node.ConnectedPeers",
-                              static_cast<int32_t>(count),
-                              1 /* min */,
-                              8000 /* max */,
-                              50 /* bucket count */);
-}
-
-void RecordPendingChildCount(size_t count) {
-  DCHECK_LE(count, static_cast<size_t>(std::numeric_limits<int32_t>::max()));
-
-  // 8k is the maximum number of file descriptors allowed in Chrome.
-  UMA_HISTOGRAM_CUSTOM_COUNTS("Mojo.System.Node.PendingChildren",
-                              static_cast<int32_t>(count),
-                              1 /* min */,
-                              8000 /* max */,
-                              50 /* bucket count */);
-}
-
-bool ParsePortsMessage(Channel::Message* message,
-                       void** data,
-                       size_t* num_data_bytes,
-                       size_t* num_header_bytes,
-                       size_t* num_payload_bytes,
-                       size_t* num_ports_bytes) {
-  DCHECK(data && num_data_bytes && num_header_bytes && num_payload_bytes &&
-         num_ports_bytes);
-
-  NodeChannel::GetPortsMessageData(message, data, num_data_bytes);
-  if (!*num_data_bytes)
-    return false;
-
-  if (!ports::Message::Parse(*data, *num_data_bytes, num_header_bytes,
-                             num_payload_bytes, num_ports_bytes)) {
-    return false;
-  }
-
-  return true;
-}
-
-// Used by NodeController to watch for shutdown. Since no IO can happen once
-// the IO thread is killed, the NodeController can cleanly drop all its peers
-// at that time.
-class ThreadDestructionObserver :
-    public base::MessageLoop::DestructionObserver {
- public:
-  static void Create(scoped_refptr<base::TaskRunner> task_runner,
-                     const base::Closure& callback) {
-    if (task_runner->RunsTasksOnCurrentThread()) {
-      // Owns itself.
-      new ThreadDestructionObserver(callback);
-    } else {
-      task_runner->PostTask(FROM_HERE,
-                            base::Bind(&Create, task_runner, callback));
-    }
-  }
-
- private:
-  explicit ThreadDestructionObserver(const base::Closure& callback)
-      : callback_(callback) {
-    base::MessageLoop::current()->AddDestructionObserver(this);
-  }
-
-  ~ThreadDestructionObserver() override {
-    base::MessageLoop::current()->RemoveDestructionObserver(this);
-  }
-
-  // base::MessageLoop::DestructionObserver:
-  void WillDestroyCurrentMessageLoop() override {
-    callback_.Run();
-    delete this;
-  }
-
-  const base::Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadDestructionObserver);
-};
-
-}  // namespace
-
-NodeController::~NodeController() {}
-
-NodeController::NodeController(Core* core)
-    : core_(core),
-      name_(GetRandomNodeName()),
-      node_(new ports::Node(name_, this)) {
-  DVLOG(1) << "Initializing node " << name_;
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-void NodeController::CreateMachPortRelay(
-    base::PortProvider* port_provider) {
-  base::AutoLock lock(mach_port_relay_lock_);
-  DCHECK(!mach_port_relay_);
-  mach_port_relay_.reset(new MachPortRelay(port_provider));
-}
-#endif
-
-void NodeController::SetIOTaskRunner(
-    scoped_refptr<base::TaskRunner> task_runner) {
-  io_task_runner_ = task_runner;
-  ThreadDestructionObserver::Create(
-      io_task_runner_,
-      base::Bind(&NodeController::DropAllPeers, base::Unretained(this)));
-}
-
-void NodeController::ConnectToChild(
-    base::ProcessHandle process_handle,
-    ConnectionParams connection_params,
-    const std::string& child_token,
-    const ProcessErrorCallback& process_error_callback) {
-  // Generate the temporary remote node name here so that it can be associated
-  // with the embedder's child_token. If an error occurs in the child process
-  // after it is launched, but before any reserved ports are connected, this can
-  // be used to clean up any dangling ports.
-  ports::NodeName node_name;
-  GenerateRandomName(&node_name);
-
-  {
-    base::AutoLock lock(reserved_ports_lock_);
-    bool inserted = pending_child_tokens_.insert(
-        std::make_pair(node_name, child_token)).second;
-    DCHECK(inserted);
-  }
-
-#if defined(OS_WIN)
-  // On Windows, we need to duplicate the process handle because we have no
-  // control over its lifetime and it may become invalid by the time the posted
-  // task runs.
-  HANDLE dup_handle = INVALID_HANDLE_VALUE;
-  BOOL ok = ::DuplicateHandle(
-      base::GetCurrentProcessHandle(), process_handle,
-      base::GetCurrentProcessHandle(), &dup_handle,
-      0, FALSE, DUPLICATE_SAME_ACCESS);
-  DPCHECK(ok);
-  process_handle = dup_handle;
-#endif
-
-  io_task_runner_->PostTask(
-      FROM_HERE, base::Bind(&NodeController::ConnectToChildOnIOThread,
-                            base::Unretained(this), process_handle,
-                            base::Passed(&connection_params), node_name,
-                            process_error_callback));
-}
-
-void NodeController::CloseChildPorts(const std::string& child_token) {
-  std::vector<ports::PortRef> ports_to_close;
-  {
-    std::vector<std::string> port_tokens;
-    base::AutoLock lock(reserved_ports_lock_);
-    for (const auto& port : reserved_ports_) {
-      if (port.second.child_token == child_token) {
-        DVLOG(1) << "Closing reserved port " << port.second.port.name();
-        ports_to_close.push_back(port.second.port);
-        port_tokens.push_back(port.first);
-      }
-    }
-
-    for (const auto& token : port_tokens)
-      reserved_ports_.erase(token);
-  }
-
-  for (const auto& port : ports_to_close)
-    node_->ClosePort(port);
-
-  // Ensure local port closure messages are processed.
-  AcceptIncomingMessages();
-}
-
-void NodeController::ClosePeerConnection(const std::string& peer_token) {
-  io_task_runner_->PostTask(
-      FROM_HERE, base::Bind(&NodeController::ClosePeerConnectionOnIOThread,
-                            base::Unretained(this), peer_token));
-}
-
-void NodeController::ConnectToParent(ConnectionParams connection_params) {
-#if !defined(OS_MACOSX) && !defined(OS_NACL_SFI)
-  // Use the bootstrap channel for the broker and receive the node's channel
-  // synchronously as the first message from the broker.
-  base::ElapsedTimer timer;
-  broker_.reset(new Broker(connection_params.TakeChannelHandle()));
-  ScopedPlatformHandle platform_handle = broker_->GetParentPlatformHandle();
-  UMA_HISTOGRAM_TIMES("Mojo.System.GetParentPlatformHandleSyncTime",
-                      timer.Elapsed());
-
-  if (!platform_handle.is_valid()) {
-    // Most likely the browser side of the channel has already been closed and
-    // the broker was unable to negotiate a NodeChannel pipe. In this case we
-    // can cancel parent connection.
-    DVLOG(1) << "Cannot connect to invalid parent channel.";
-    CancelPendingPortMerges();
-    return;
-  }
-  connection_params = ConnectionParams(std::move(platform_handle));
-#endif
-
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&NodeController::ConnectToParentOnIOThread,
-                 base::Unretained(this), base::Passed(&connection_params)));
-}
-
-void NodeController::ConnectToPeer(ConnectionParams connection_params,
-                                   const ports::PortRef& port,
-                                   const std::string& peer_token) {
-  ports::NodeName node_name;
-  GenerateRandomName(&node_name);
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&NodeController::ConnectToPeerOnIOThread,
-                 base::Unretained(this), base::Passed(&connection_params),
-                 node_name, port, peer_token));
-}
-
-void NodeController::SetPortObserver(const ports::PortRef& port,
-                                     scoped_refptr<PortObserver> observer) {
-  node_->SetUserData(port, std::move(observer));
-}
-
-void NodeController::ClosePort(const ports::PortRef& port) {
-  SetPortObserver(port, nullptr);
-  int rv = node_->ClosePort(port);
-  DCHECK_EQ(rv, ports::OK) << " Failed to close port: " << port.name();
-
-  AcceptIncomingMessages();
-}
-
-int NodeController::SendMessage(const ports::PortRef& port,
-                                std::unique_ptr<PortsMessage> message) {
-  ports::ScopedMessage ports_message(message.release());
-  int rv = node_->SendMessage(port, std::move(ports_message));
-
-  AcceptIncomingMessages();
-  return rv;
-}
-
-void NodeController::ReservePort(const std::string& token,
-                                 const ports::PortRef& port,
-                                 const std::string& child_token) {
-  DVLOG(2) << "Reserving port " << port.name() << "@" << name_ << " for token "
-           << token;
-
-  base::AutoLock lock(reserved_ports_lock_);
-  auto result = reserved_ports_.insert(
-      std::make_pair(token, ReservedPort{port, child_token}));
-  DCHECK(result.second);
-}
-
-void NodeController::MergePortIntoParent(const std::string& token,
-                                         const ports::PortRef& port) {
-  bool was_merged = false;
-  {
-    // This request may be coming from within the process that reserved the
-    // "parent" side (e.g. for Chrome single-process mode), so if this token is
-    // reserved locally, merge locally instead.
-    base::AutoLock lock(reserved_ports_lock_);
-    auto it = reserved_ports_.find(token);
-    if (it != reserved_ports_.end()) {
-      node_->MergePorts(port, name_, it->second.port.name());
-      reserved_ports_.erase(it);
-      was_merged = true;
-    }
-  }
-  if (was_merged) {
-    AcceptIncomingMessages();
-    return;
-  }
-
-  scoped_refptr<NodeChannel> parent;
-  bool reject_merge = false;
-  {
-    // Hold |pending_port_merges_lock_| while getting |parent|. Otherwise,
-    // there is a race where the parent can be set, and |pending_port_merges_|
-    // be processed between retrieving |parent| and adding the merge to
-    // |pending_port_merges_|.
-    base::AutoLock lock(pending_port_merges_lock_);
-    parent = GetParentChannel();
-    if (reject_pending_merges_) {
-      reject_merge = true;
-    } else if (!parent) {
-      pending_port_merges_.push_back(std::make_pair(token, port));
-      return;
-    }
-  }
-  if (reject_merge) {
-    node_->ClosePort(port);
-    DVLOG(2) << "Rejecting port merge for token " << token
-             << " due to closed parent channel.";
-    AcceptIncomingMessages();
-    return;
-  }
-
-  parent->RequestPortMerge(port.name(), token);
-}
-
-int NodeController::MergeLocalPorts(const ports::PortRef& port0,
-                                    const ports::PortRef& port1) {
-  int rv = node_->MergeLocalPorts(port0, port1);
-  AcceptIncomingMessages();
-  return rv;
-}
-
-scoped_refptr<PlatformSharedBuffer> NodeController::CreateSharedBuffer(
-    size_t num_bytes) {
-#if !defined(OS_MACOSX) && !defined(OS_NACL_SFI)
-  // Shared buffer creation failure is fatal, so always use the broker when we
-  // have one. This does mean that a non-root process that has children will use
-  // the broker for shared buffer creation even though that process is
-  // privileged.
-  if (broker_) {
-    return broker_->GetSharedBuffer(num_bytes);
-  }
-#endif
-  return PlatformSharedBuffer::Create(num_bytes);
-}
-
-void NodeController::RequestShutdown(const base::Closure& callback) {
-  {
-    base::AutoLock lock(shutdown_lock_);
-    shutdown_callback_ = callback;
-    shutdown_callback_flag_.Set(true);
-  }
-
-  AttemptShutdownIfRequested();
-}
-
-void NodeController::NotifyBadMessageFrom(const ports::NodeName& source_node,
-                                          const std::string& error) {
-  scoped_refptr<NodeChannel> peer = GetPeerChannel(source_node);
-  if (peer)
-    peer->NotifyBadMessage(error);
-}
-
-void NodeController::ConnectToChildOnIOThread(
-    base::ProcessHandle process_handle,
-    ConnectionParams connection_params,
-    ports::NodeName token,
-    const ProcessErrorCallback& process_error_callback) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-#if !defined(OS_MACOSX) && !defined(OS_NACL)
-  PlatformChannelPair node_channel;
-  ScopedPlatformHandle server_handle = node_channel.PassServerHandle();
-  // BrokerHost owns itself.
-  BrokerHost* broker_host =
-      new BrokerHost(process_handle, connection_params.TakeChannelHandle());
-  bool channel_ok = broker_host->SendChannel(node_channel.PassClientHandle());
-
-#if defined(OS_WIN)
-  if (!channel_ok) {
-    // On Windows the above operation may fail if the channel is crossing a
-    // session boundary. In that case we fall back to a named pipe.
-    NamedPlatformChannelPair named_channel;
-    server_handle = named_channel.PassServerHandle();
-    broker_host->SendNamedChannel(named_channel.handle().name);
-  }
-#else
-  CHECK(channel_ok);
-#endif  // defined(OS_WIN)
-
-  scoped_refptr<NodeChannel> channel =
-      NodeChannel::Create(this, ConnectionParams(std::move(server_handle)),
-                          io_task_runner_, process_error_callback);
-
-#else  // !defined(OS_MACOSX) && !defined(OS_NACL)
-  scoped_refptr<NodeChannel> channel =
-      NodeChannel::Create(this, std::move(connection_params), io_task_runner_,
-                          process_error_callback);
-#endif  // !defined(OS_MACOSX) && !defined(OS_NACL)
-
-  // We set up the child channel with a temporary name so it can be identified
-  // as a pending child if it writes any messages to the channel. We may start
-  // receiving messages from it (though we shouldn't) as soon as Start() is
-  // called below.
-
-  pending_children_.insert(std::make_pair(token, channel));
-  RecordPendingChildCount(pending_children_.size());
-
-  channel->SetRemoteNodeName(token);
-  channel->SetRemoteProcessHandle(process_handle);
-  channel->Start();
-
-  channel->AcceptChild(name_, token);
-}
-
-void NodeController::ConnectToParentOnIOThread(
-    ConnectionParams connection_params) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  {
-    base::AutoLock lock(parent_lock_);
-    DCHECK(parent_name_ == ports::kInvalidNodeName);
-
-    // At this point we don't know the parent's name, so we can't yet insert it
-    // into our |peers_| map. That will happen as soon as we receive an
-    // AcceptChild message from them.
-    bootstrap_parent_channel_ =
-        NodeChannel::Create(this, std::move(connection_params), io_task_runner_,
-                            ProcessErrorCallback());
-    // Prevent the parent pipe handle from being closed on shutdown. Pipe
-    // closure is used by the parent to detect the child process has exited.
-    // Relying on message pipes to be closed is not enough because the parent
-    // may see the message pipe closure before the child is dead, causing the
-    // child process to be unexpectedly SIGKILL'd.
-    bootstrap_parent_channel_->LeakHandleOnShutdown();
-  }
-  bootstrap_parent_channel_->Start();
-}
-
-void NodeController::ConnectToPeerOnIOThread(ConnectionParams connection_params,
-                                             ports::NodeName token,
-                                             ports::PortRef port,
-                                             const std::string& peer_token) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  scoped_refptr<NodeChannel> channel = NodeChannel::Create(
-      this, std::move(connection_params), io_task_runner_, {});
-  peer_connections_.insert(
-      {token, PeerConnection{channel, port, peer_token}});
-  peers_by_token_.insert({peer_token, token});
-
-  channel->SetRemoteNodeName(token);
-  channel->Start();
-
-  channel->AcceptPeer(name_, token, port.name());
-}
-
-void NodeController::ClosePeerConnectionOnIOThread(
-    const std::string& peer_token) {
-  RequestContext request_context(RequestContext::Source::SYSTEM);
-  auto peer = peers_by_token_.find(peer_token);
-  // The connection may already be closed.
-  if (peer == peers_by_token_.end())
-    return;
-
-  // |peer| may be removed so make a copy of |name|.
-  ports::NodeName name = peer->second;
-  DropPeer(name, nullptr);
-}
-
-scoped_refptr<NodeChannel> NodeController::GetPeerChannel(
-    const ports::NodeName& name) {
-  base::AutoLock lock(peers_lock_);
-  auto it = peers_.find(name);
-  if (it == peers_.end())
-    return nullptr;
-  return it->second;
-}
-
-scoped_refptr<NodeChannel> NodeController::GetParentChannel() {
-  ports::NodeName parent_name;
-  {
-    base::AutoLock lock(parent_lock_);
-    parent_name = parent_name_;
-  }
-  return GetPeerChannel(parent_name);
-}
-
-scoped_refptr<NodeChannel> NodeController::GetBrokerChannel() {
-  ports::NodeName broker_name;
-  {
-    base::AutoLock lock(broker_lock_);
-    broker_name = broker_name_;
-  }
-  return GetPeerChannel(broker_name);
-}
-
-void NodeController::AddPeer(const ports::NodeName& name,
-                             scoped_refptr<NodeChannel> channel,
-                             bool start_channel) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  DCHECK(name != ports::kInvalidNodeName);
-  DCHECK(channel);
-
-  channel->SetRemoteNodeName(name);
-
-  OutgoingMessageQueue pending_messages;
-  {
-    base::AutoLock lock(peers_lock_);
-    if (peers_.find(name) != peers_.end()) {
-      // This can happen normally if two nodes race to be introduced to each
-      // other. The losing pipe will be silently closed and introduction should
-      // not be affected.
-      DVLOG(1) << "Ignoring duplicate peer name " << name;
-      return;
-    }
-
-    auto result = peers_.insert(std::make_pair(name, channel));
-    DCHECK(result.second);
-
-    DVLOG(2) << "Accepting new peer " << name << " on node " << name_;
-
-    RecordPeerCount(peers_.size());
-
-    auto it = pending_peer_messages_.find(name);
-    if (it != pending_peer_messages_.end()) {
-      std::swap(pending_messages, it->second);
-      pending_peer_messages_.erase(it);
-    }
-  }
-
-  if (start_channel)
-    channel->Start();
-
-  // Flush any queued message we need to deliver to this node.
-  while (!pending_messages.empty()) {
-    channel->PortsMessage(std::move(pending_messages.front()));
-    pending_messages.pop();
-  }
-}
-
-void NodeController::DropPeer(const ports::NodeName& name,
-                              NodeChannel* channel) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  {
-    base::AutoLock lock(peers_lock_);
-    auto it = peers_.find(name);
-
-    if (it != peers_.end()) {
-      ports::NodeName peer = it->first;
-      peers_.erase(it);
-      DVLOG(1) << "Dropped peer " << peer;
-    }
-
-    pending_peer_messages_.erase(name);
-    pending_children_.erase(name);
-
-    RecordPeerCount(peers_.size());
-    RecordPendingChildCount(pending_children_.size());
-  }
-
-  std::vector<ports::PortRef> ports_to_close;
-  {
-    // Clean up any reserved ports.
-    base::AutoLock lock(reserved_ports_lock_);
-    auto it = pending_child_tokens_.find(name);
-    if (it != pending_child_tokens_.end()) {
-      const std::string& child_token = it->second;
-
-      std::vector<std::string> port_tokens;
-      for (const auto& port : reserved_ports_) {
-        if (port.second.child_token == child_token) {
-          DVLOG(1) << "Closing reserved port: " << port.second.port.name();
-          ports_to_close.push_back(port.second.port);
-          port_tokens.push_back(port.first);
-        }
-      }
-
-      // We have to erase reserved ports in a two-step manner because the usual
-      // manner of using the returned iterator from map::erase isn't technically
-      // valid in C++11 (although it is in C++14).
-      for (const auto& token : port_tokens)
-        reserved_ports_.erase(token);
-
-      pending_child_tokens_.erase(it);
-    }
-  }
-
-  bool is_parent;
-  {
-    base::AutoLock lock(parent_lock_);
-    is_parent = (name == parent_name_ || channel == bootstrap_parent_channel_);
-  }
-
-  // If the error comes from the parent channel, we also need to cancel any
-  // port merge requests, so that errors can be propagated to the message
-  // pipes.
-  if (is_parent)
-    CancelPendingPortMerges();
-
-  auto peer = peer_connections_.find(name);
-  if (peer != peer_connections_.end()) {
-    peers_by_token_.erase(peer->second.peer_token);
-    ports_to_close.push_back(peer->second.local_port);
-    peer_connections_.erase(peer);
-  }
-
-  for (const auto& port : ports_to_close)
-    node_->ClosePort(port);
-
-  node_->LostConnectionToNode(name);
-
-  AcceptIncomingMessages();
-}
-
-void NodeController::SendPeerMessage(const ports::NodeName& name,
-                                     ports::ScopedMessage message) {
-  Channel::MessagePtr channel_message =
-      static_cast<PortsMessage*>(message.get())->TakeChannelMessage();
-
-  scoped_refptr<NodeChannel> peer = GetPeerChannel(name);
-#if defined(OS_WIN)
-  if (channel_message->has_handles()) {
-    // If we're sending a message with handles we aren't the destination
-    // node's parent or broker (i.e. we don't know its process handle), ask
-    // the broker to relay for us.
-    scoped_refptr<NodeChannel> broker = GetBrokerChannel();
-    if (!peer || !peer->HasRemoteProcessHandle()) {
-      if (broker) {
-        broker->RelayPortsMessage(name, std::move(channel_message));
-      } else {
-        base::AutoLock lock(broker_lock_);
-        pending_relay_messages_[name].emplace(std::move(channel_message));
-      }
-      return;
-    }
-  }
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  if (channel_message->has_mach_ports()) {
-    // Messages containing Mach ports are always routed through the broker, even
-    // if the broker process is the intended recipient.
-    bool use_broker = false;
-    {
-      base::AutoLock lock(parent_lock_);
-      use_broker = (bootstrap_parent_channel_ ||
-                    parent_name_ != ports::kInvalidNodeName);
-    }
-    if (use_broker) {
-      scoped_refptr<NodeChannel> broker = GetBrokerChannel();
-      if (broker) {
-        broker->RelayPortsMessage(name, std::move(channel_message));
-      } else {
-        base::AutoLock lock(broker_lock_);
-        pending_relay_messages_[name].emplace(std::move(channel_message));
-      }
-      return;
-    }
-  }
-#endif  // defined(OS_WIN)
-
-  if (peer) {
-    peer->PortsMessage(std::move(channel_message));
-    return;
-  }
-
-  // If we don't know who the peer is and we are the broker, we can only assume
-  // the peer is invalid, i.e., it's either a junk name or has already been
-  // disconnected.
-  scoped_refptr<NodeChannel> broker = GetBrokerChannel();
-  if (!broker) {
-    DVLOG(1) << "Dropping message for unknown peer: " << name;
-    return;
-  }
-
-  // If we aren't the broker, assume we just need to be introduced and queue
-  // until that can be either confirmed or denied by the broker.
-  bool needs_introduction = false;
-  {
-    base::AutoLock lock(peers_lock_);
-    auto& queue = pending_peer_messages_[name];
-    needs_introduction = queue.empty();
-    queue.emplace(std::move(channel_message));
-  }
-  if (needs_introduction)
-    broker->RequestIntroduction(name);
-}
-
-void NodeController::AcceptIncomingMessages() {
-  // This is an impactically large value which should never be reached in
-  // practice. See the CHECK below for usage.
-  constexpr size_t kMaxAcceptedMessages = 1000000;
-
-  size_t num_messages_accepted = 0;
-  while (incoming_messages_flag_) {
-    // TODO: We may need to be more careful to avoid starving the rest of the
-    // thread here. Revisit this if it turns out to be a problem. One
-    // alternative would be to schedule a task to continue pumping messages
-    // after flushing once.
-
-    messages_lock_.Acquire();
-    if (incoming_messages_.empty()) {
-      messages_lock_.Release();
-      break;
-    }
-
-    // libstdc++'s deque creates an internal buffer on construction, even when
-    // the size is 0. So avoid creating it until it is necessary.
-    std::queue<ports::ScopedMessage> messages;
-    std::swap(messages, incoming_messages_);
-    incoming_messages_flag_.Set(false);
-    messages_lock_.Release();
-
-    num_messages_accepted += messages.size();
-    while (!messages.empty()) {
-      node_->AcceptMessage(std::move(messages.front()));
-      messages.pop();
-    }
-
-    // This is effectively a safeguard against potential bugs which might lead
-    // to runaway message cycles. If any such cycles arise, we'll start seeing
-    // crash reports from this location.
-    CHECK_LE(num_messages_accepted, kMaxAcceptedMessages);
-  }
-
-  if (num_messages_accepted >= 4) {
-    // Note: We avoid logging this histogram for the vast majority of cases.
-    // See https://crbug.com/685763 for more context.
-    UMA_HISTOGRAM_CUSTOM_COUNTS("Mojo.System.MessagesAcceptedPerEvent",
-                                static_cast<int32_t>(num_messages_accepted),
-                                1 /* min */,
-                                500 /* max */,
-                                50 /* bucket count */);
-  }
-
-  AttemptShutdownIfRequested();
-}
-
-void NodeController::ProcessIncomingMessages() {
-  RequestContext request_context(RequestContext::Source::SYSTEM);
-
-  {
-    base::AutoLock lock(messages_lock_);
-    // Allow a new incoming messages processing task to be posted. This can't be
-    // done after AcceptIncomingMessages() otherwise a message might be missed.
-    // Doing it here may result in at most two tasks existing at the same time;
-    // this running one, and one pending in the task runner.
-    incoming_messages_task_posted_ = false;
-  }
-
-  AcceptIncomingMessages();
-}
-
-void NodeController::DropAllPeers() {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  std::vector<scoped_refptr<NodeChannel>> all_peers;
-  {
-    base::AutoLock lock(parent_lock_);
-    if (bootstrap_parent_channel_) {
-      // |bootstrap_parent_channel_| isn't null'd here becuase we rely on its
-      // existence to determine whether or not this is the root node. Once
-      // bootstrap_parent_channel_->ShutDown() has been called,
-      // |bootstrap_parent_channel_| is essentially a dead object and it doesn't
-      // matter if it's deleted now or when |this| is deleted.
-      // Note: |bootstrap_parent_channel_| is only modified on the IO thread.
-      all_peers.push_back(bootstrap_parent_channel_);
-    }
-  }
-
-  {
-    base::AutoLock lock(peers_lock_);
-    for (const auto& peer : peers_)
-      all_peers.push_back(peer.second);
-    for (const auto& peer : pending_children_)
-      all_peers.push_back(peer.second);
-    peers_.clear();
-    pending_children_.clear();
-    pending_peer_messages_.clear();
-    peer_connections_.clear();
-  }
-
-  for (const auto& peer : all_peers)
-    peer->ShutDown();
-
-  if (destroy_on_io_thread_shutdown_)
-    delete this;
-}
-
-void NodeController::GenerateRandomPortName(ports::PortName* port_name) {
-  GenerateRandomName(port_name);
-}
-
-void NodeController::AllocMessage(size_t num_header_bytes,
-                                  ports::ScopedMessage* message) {
-  message->reset(new PortsMessage(num_header_bytes, 0, 0, nullptr));
-}
-
-void NodeController::ForwardMessage(const ports::NodeName& node,
-                                    ports::ScopedMessage message) {
-  DCHECK(message);
-  bool schedule_pump_task = false;
-  if (node == name_) {
-    // NOTE: We need to avoid re-entering the Node instance within
-    // ForwardMessage. Because ForwardMessage is only ever called
-    // (synchronously) in response to Node's ClosePort, SendMessage, or
-    // AcceptMessage, we flush the queue after calling any of those methods.
-    base::AutoLock lock(messages_lock_);
-    // |io_task_runner_| may be null in tests or processes that don't require
-    // multi-process Mojo.
-    schedule_pump_task = incoming_messages_.empty() && io_task_runner_ &&
-        !incoming_messages_task_posted_;
-    incoming_messages_task_posted_ |= schedule_pump_task;
-    incoming_messages_.emplace(std::move(message));
-    incoming_messages_flag_.Set(true);
-  } else {
-    SendPeerMessage(node, std::move(message));
-  }
-
-  if (schedule_pump_task) {
-    // Normally, the queue is processed after the action that added the local
-    // message is done (i.e. SendMessage, ClosePort, etc). However, it's also
-    // possible for a local message to be added as a result of a remote message,
-    // and OnChannelMessage() doesn't process this queue (although
-    // OnPortsMessage() does). There may also be other code paths, now or added
-    // in the future, which cause local messages to be added but don't process
-    // this message queue.
-    //
-    // Instead of adding a call to AcceptIncomingMessages() on every possible
-    // code path, post a task to the IO thread to process the queue. If the
-    // current call stack processes the queue, this may end up doing nothing.
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::Bind(&NodeController::ProcessIncomingMessages,
-                   base::Unretained(this)));
-  }
-}
-
-void NodeController::BroadcastMessage(ports::ScopedMessage message) {
-  CHECK_EQ(message->num_ports(), 0u);
-  Channel::MessagePtr channel_message =
-      static_cast<PortsMessage*>(message.get())->TakeChannelMessage();
-  CHECK(!channel_message->has_handles());
-
-  scoped_refptr<NodeChannel> broker = GetBrokerChannel();
-  if (broker)
-    broker->Broadcast(std::move(channel_message));
-  else
-    OnBroadcast(name_, std::move(channel_message));
-}
-
-void NodeController::PortStatusChanged(const ports::PortRef& port) {
-  scoped_refptr<ports::UserData> user_data;
-  node_->GetUserData(port, &user_data);
-
-  PortObserver* observer = static_cast<PortObserver*>(user_data.get());
-  if (observer) {
-    observer->OnPortStatusChanged();
-  } else {
-    DVLOG(2) << "Ignoring status change for " << port.name() << " because it "
-             << "doesn't have an observer.";
-  }
-}
-
-void NodeController::OnAcceptChild(const ports::NodeName& from_node,
-                                   const ports::NodeName& parent_name,
-                                   const ports::NodeName& token) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  scoped_refptr<NodeChannel> parent;
-  {
-    base::AutoLock lock(parent_lock_);
-    if (bootstrap_parent_channel_ && parent_name_ == ports::kInvalidNodeName) {
-      parent_name_ = parent_name;
-      parent = bootstrap_parent_channel_;
-    }
-  }
-
-  if (!parent) {
-    DLOG(ERROR) << "Unexpected AcceptChild message from " << from_node;
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  parent->SetRemoteNodeName(parent_name);
-  parent->AcceptParent(token, name_);
-
-  // NOTE: The child does not actually add its parent as a peer until
-  // receiving an AcceptBrokerClient message from the broker. The parent
-  // will request that said message be sent upon receiving AcceptParent.
-
-  DVLOG(1) << "Child " << name_ << " accepting parent " << parent_name;
-}
-
-void NodeController::OnAcceptParent(const ports::NodeName& from_node,
-                                    const ports::NodeName& token,
-                                    const ports::NodeName& child_name) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  auto it = pending_children_.find(from_node);
-  if (it == pending_children_.end() || token != from_node) {
-    DLOG(ERROR) << "Received unexpected AcceptParent message from "
-                << from_node;
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  {
-    base::AutoLock lock(reserved_ports_lock_);
-    auto it = pending_child_tokens_.find(from_node);
-    if (it != pending_child_tokens_.end()) {
-      std::string token = std::move(it->second);
-      pending_child_tokens_.erase(it);
-      pending_child_tokens_[child_name] = std::move(token);
-    }
-  }
-
-  scoped_refptr<NodeChannel> channel = it->second;
-  pending_children_.erase(it);
-
-  DCHECK(channel);
-
-  DVLOG(1) << "Parent " << name_ << " accepted child " << child_name;
-
-  AddPeer(child_name, channel, false /* start_channel */);
-
-  // TODO(rockot/amistry): We could simplify child initialization if we could
-  // synchronously get a new async broker channel from the broker. For now we do
-  // it asynchronously since it's only used to facilitate handle passing, not
-  // handle creation.
-  scoped_refptr<NodeChannel> broker = GetBrokerChannel();
-  if (broker) {
-    // Inform the broker of this new child.
-    broker->AddBrokerClient(child_name, channel->CopyRemoteProcessHandle());
-  } else {
-    // If we have no broker, either we need to wait for one, or we *are* the
-    // broker.
-    scoped_refptr<NodeChannel> parent = GetParentChannel();
-    if (!parent) {
-      base::AutoLock lock(parent_lock_);
-      parent = bootstrap_parent_channel_;
-    }
-
-    if (!parent) {
-      // Yes, we're the broker. We can initialize the child directly.
-      channel->AcceptBrokerClient(name_, ScopedPlatformHandle());
-    } else {
-      // We aren't the broker, so wait for a broker connection.
-      base::AutoLock lock(broker_lock_);
-      pending_broker_clients_.push(child_name);
-    }
-  }
-}
-
-void NodeController::OnAddBrokerClient(const ports::NodeName& from_node,
-                                       const ports::NodeName& client_name,
-                                       base::ProcessHandle process_handle) {
-#if defined(OS_WIN)
-  // Scoped handle to avoid leaks on error.
-  ScopedPlatformHandle scoped_process_handle =
-      ScopedPlatformHandle(PlatformHandle(process_handle));
-#endif
-  scoped_refptr<NodeChannel> sender = GetPeerChannel(from_node);
-  if (!sender) {
-    DLOG(ERROR) << "Ignoring AddBrokerClient from unknown sender.";
-    return;
-  }
-
-  if (GetPeerChannel(client_name)) {
-    DLOG(ERROR) << "Ignoring AddBrokerClient for known client.";
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  PlatformChannelPair broker_channel;
-  ConnectionParams connection_params(broker_channel.PassServerHandle());
-  scoped_refptr<NodeChannel> client =
-      NodeChannel::Create(this, std::move(connection_params), io_task_runner_,
-                          ProcessErrorCallback());
-
-#if defined(OS_WIN)
-  // The broker must have a working handle to the client process in order to
-  // properly copy other handles to and from the client.
-  if (!scoped_process_handle.is_valid()) {
-    DLOG(ERROR) << "Broker rejecting client with invalid process handle.";
-    return;
-  }
-  client->SetRemoteProcessHandle(scoped_process_handle.release().handle);
-#else
-  client->SetRemoteProcessHandle(process_handle);
-#endif
-
-  AddPeer(client_name, client, true /* start_channel */);
-
-  DVLOG(1) << "Broker " << name_ << " accepting client " << client_name
-           << " from peer " << from_node;
-
-  sender->BrokerClientAdded(client_name, broker_channel.PassClientHandle());
-}
-
-void NodeController::OnBrokerClientAdded(const ports::NodeName& from_node,
-                                         const ports::NodeName& client_name,
-                                         ScopedPlatformHandle broker_channel) {
-  scoped_refptr<NodeChannel> client = GetPeerChannel(client_name);
-  if (!client) {
-    DLOG(ERROR) << "BrokerClientAdded for unknown child " << client_name;
-    return;
-  }
-
-  // This should have come from our own broker.
-  if (GetBrokerChannel() != GetPeerChannel(from_node)) {
-    DLOG(ERROR) << "BrokerClientAdded from non-broker node " << from_node;
-    return;
-  }
-
-  DVLOG(1) << "Child " << client_name << " accepted by broker " << from_node;
-
-  client->AcceptBrokerClient(from_node, std::move(broker_channel));
-}
-
-void NodeController::OnAcceptBrokerClient(const ports::NodeName& from_node,
-                                          const ports::NodeName& broker_name,
-                                          ScopedPlatformHandle broker_channel) {
-  // This node should already have a parent in bootstrap mode.
-  ports::NodeName parent_name;
-  scoped_refptr<NodeChannel> parent;
-  {
-    base::AutoLock lock(parent_lock_);
-    parent_name = parent_name_;
-    parent = bootstrap_parent_channel_;
-    bootstrap_parent_channel_ = nullptr;
-  }
-  DCHECK(parent_name == from_node);
-  DCHECK(parent);
-
-  std::queue<ports::NodeName> pending_broker_clients;
-  std::unordered_map<ports::NodeName, OutgoingMessageQueue>
-      pending_relay_messages;
-  {
-    base::AutoLock lock(broker_lock_);
-    broker_name_ = broker_name;
-    std::swap(pending_broker_clients, pending_broker_clients_);
-    std::swap(pending_relay_messages, pending_relay_messages_);
-  }
-  DCHECK(broker_name != ports::kInvalidNodeName);
-
-  // It's now possible to add both the broker and the parent as peers.
-  // Note that the broker and parent may be the same node.
-  scoped_refptr<NodeChannel> broker;
-  if (broker_name == parent_name) {
-    DCHECK(!broker_channel.is_valid());
-    broker = parent;
-  } else {
-    DCHECK(broker_channel.is_valid());
-    broker =
-        NodeChannel::Create(this, ConnectionParams(std::move(broker_channel)),
-                            io_task_runner_, ProcessErrorCallback());
-    AddPeer(broker_name, broker, true /* start_channel */);
-  }
-
-  AddPeer(parent_name, parent, false /* start_channel */);
-
-  {
-    // Complete any port merge requests we have waiting for the parent.
-    base::AutoLock lock(pending_port_merges_lock_);
-    for (const auto& request : pending_port_merges_)
-      parent->RequestPortMerge(request.second.name(), request.first);
-    pending_port_merges_.clear();
-  }
-
-  // Feed the broker any pending children of our own.
-  while (!pending_broker_clients.empty()) {
-    const ports::NodeName& child_name = pending_broker_clients.front();
-    auto it = pending_children_.find(child_name);
-    DCHECK(it != pending_children_.end());
-    broker->AddBrokerClient(child_name, it->second->CopyRemoteProcessHandle());
-    pending_broker_clients.pop();
-  }
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-  // Have the broker relay any messages we have waiting.
-  for (auto& entry : pending_relay_messages) {
-    const ports::NodeName& destination = entry.first;
-    auto& message_queue = entry.second;
-    while (!message_queue.empty()) {
-      broker->RelayPortsMessage(destination, std::move(message_queue.front()));
-      message_queue.pop();
-    }
-  }
-#endif
-
-  DVLOG(1) << "Child " << name_ << " accepted by broker " << broker_name;
-}
-
-void NodeController::OnPortsMessage(const ports::NodeName& from_node,
-                                    Channel::MessagePtr channel_message) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  void* data;
-  size_t num_data_bytes, num_header_bytes, num_payload_bytes, num_ports_bytes;
-  if (!ParsePortsMessage(channel_message.get(), &data, &num_data_bytes,
-                         &num_header_bytes, &num_payload_bytes,
-                         &num_ports_bytes)) {
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  CHECK(channel_message);
-  std::unique_ptr<PortsMessage> ports_message(
-      new PortsMessage(num_header_bytes,
-                       num_payload_bytes,
-                       num_ports_bytes,
-                       std::move(channel_message)));
-  ports_message->set_source_node(from_node);
-  node_->AcceptMessage(ports::ScopedMessage(ports_message.release()));
-  AcceptIncomingMessages();
-}
-
-void NodeController::OnRequestPortMerge(
-    const ports::NodeName& from_node,
-    const ports::PortName& connector_port_name,
-    const std::string& token) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  DVLOG(2) << "Node " << name_ << " received RequestPortMerge for token "
-           << token << " and port " << connector_port_name << "@" << from_node;
-
-  ports::PortRef local_port;
-  {
-    base::AutoLock lock(reserved_ports_lock_);
-    auto it = reserved_ports_.find(token);
-    if (it == reserved_ports_.end()) {
-      DVLOG(1) << "Ignoring request to connect to port for unknown token "
-               << token;
-      return;
-    }
-    local_port = it->second.port;
-    reserved_ports_.erase(it);
-  }
-
-  int rv = node_->MergePorts(local_port, from_node, connector_port_name);
-  if (rv != ports::OK)
-    DLOG(ERROR) << "MergePorts failed: " << rv;
-
-  AcceptIncomingMessages();
-}
-
-void NodeController::OnRequestIntroduction(const ports::NodeName& from_node,
-                                           const ports::NodeName& name) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  scoped_refptr<NodeChannel> requestor = GetPeerChannel(from_node);
-  if (from_node == name || name == ports::kInvalidNodeName || !requestor) {
-    DLOG(ERROR) << "Rejecting invalid OnRequestIntroduction message from "
-                << from_node;
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  scoped_refptr<NodeChannel> new_friend = GetPeerChannel(name);
-  if (!new_friend) {
-    // We don't know who they're talking about!
-    requestor->Introduce(name, ScopedPlatformHandle());
-  } else {
-    PlatformChannelPair new_channel;
-    requestor->Introduce(name, new_channel.PassServerHandle());
-    new_friend->Introduce(from_node, new_channel.PassClientHandle());
-  }
-}
-
-void NodeController::OnIntroduce(const ports::NodeName& from_node,
-                                 const ports::NodeName& name,
-                                 ScopedPlatformHandle channel_handle) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  if (!channel_handle.is_valid()) {
-    node_->LostConnectionToNode(name);
-
-    DVLOG(1) << "Could not be introduced to peer " << name;
-    base::AutoLock lock(peers_lock_);
-    pending_peer_messages_.erase(name);
-    return;
-  }
-
-  scoped_refptr<NodeChannel> channel =
-      NodeChannel::Create(this, ConnectionParams(std::move(channel_handle)),
-                          io_task_runner_, ProcessErrorCallback());
-
-  DVLOG(1) << "Adding new peer " << name << " via parent introduction.";
-  AddPeer(name, channel, true /* start_channel */);
-}
-
-void NodeController::OnBroadcast(const ports::NodeName& from_node,
-                                 Channel::MessagePtr message) {
-  DCHECK(!message->has_handles());
-
-  void* data;
-  size_t num_data_bytes, num_header_bytes, num_payload_bytes, num_ports_bytes;
-  if (!ParsePortsMessage(message.get(), &data, &num_data_bytes,
-                         &num_header_bytes, &num_payload_bytes,
-                         &num_ports_bytes)) {
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  // Broadcast messages must not contain ports.
-  if (num_ports_bytes > 0) {
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  base::AutoLock lock(peers_lock_);
-  for (auto& iter : peers_) {
-    // Copy and send the message to each known peer.
-    Channel::MessagePtr peer_message(
-        new Channel::Message(message->payload_size(), 0));
-    memcpy(peer_message->mutable_payload(), message->payload(),
-           message->payload_size());
-    iter.second->PortsMessage(std::move(peer_message));
-  }
-}
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-void NodeController::OnRelayPortsMessage(const ports::NodeName& from_node,
-                                         base::ProcessHandle from_process,
-                                         const ports::NodeName& destination,
-                                         Channel::MessagePtr message) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  if (GetBrokerChannel()) {
-    // Only the broker should be asked to relay a message.
-    LOG(ERROR) << "Non-broker refusing to relay message.";
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  // The parent should always know which process this came from.
-  DCHECK(from_process != base::kNullProcessHandle);
-
-#if defined(OS_WIN)
-  // Rewrite the handles to this (the parent) process. If the message is
-  // destined for another child process, the handles will be rewritten to that
-  // process before going out (see NodeChannel::WriteChannelMessage).
-  //
-  // TODO: We could avoid double-duplication.
-  //
-  // Note that we explicitly mark the handles as being owned by the sending
-  // process before rewriting them, in order to accommodate RewriteHandles'
-  // internal sanity checks.
-  ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-  for (size_t i = 0; i < handles->size(); ++i)
-    (*handles)[i].owning_process = from_process;
-  if (!Channel::Message::RewriteHandles(from_process,
-                                        base::GetCurrentProcessHandle(),
-                                        handles.get())) {
-    DLOG(ERROR) << "Failed to relay one or more handles.";
-  }
-  message->SetHandles(std::move(handles));
-#else
-  MachPortRelay* relay = GetMachPortRelay();
-  if (!relay) {
-    LOG(ERROR) << "Receiving Mach ports without a port relay from "
-               << from_node << ". Dropping message.";
-    return;
-  }
-  if (!relay->ExtractPortRights(message.get(), from_process)) {
-    // NodeChannel should ensure that MachPortRelay is ready for the remote
-    // process. At this point, if the port extraction failed, either something
-    // went wrong in the mach stuff, or the remote process died.
-    LOG(ERROR) << "Error on receiving Mach ports " << from_node
-               << ". Dropping message.";
-    return;
-  }
-#endif  // defined(OS_WIN)
-
-  if (destination == name_) {
-    // Great, we can deliver this message locally.
-    OnPortsMessage(from_node, std::move(message));
-    return;
-  }
-
-  scoped_refptr<NodeChannel> peer = GetPeerChannel(destination);
-  if (peer)
-    peer->PortsMessageFromRelay(from_node, std::move(message));
-  else
-    DLOG(ERROR) << "Dropping relay message for unknown node " << destination;
-}
-
-void NodeController::OnPortsMessageFromRelay(const ports::NodeName& from_node,
-                                             const ports::NodeName& source_node,
-                                             Channel::MessagePtr message) {
-  if (GetPeerChannel(from_node) != GetBrokerChannel()) {
-    LOG(ERROR) << "Refusing relayed message from non-broker node.";
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  OnPortsMessage(source_node, std::move(message));
-}
-#endif
-
-void NodeController::OnAcceptPeer(const ports::NodeName& from_node,
-                                  const ports::NodeName& token,
-                                  const ports::NodeName& peer_name,
-                                  const ports::PortName& port_name) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  auto it = peer_connections_.find(from_node);
-  if (it == peer_connections_.end()) {
-    DLOG(ERROR) << "Received unexpected AcceptPeer message from " << from_node;
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  scoped_refptr<NodeChannel> channel = std::move(it->second.channel);
-  ports::PortRef local_port = it->second.local_port;
-  std::string peer_token = std::move(it->second.peer_token);
-  peer_connections_.erase(it);
-  DCHECK(channel);
-
-  // If the peer connection is a self connection (which is used in tests),
-  // drop the channel to it and skip straight to merging the ports.
-  if (name_ == peer_name) {
-    peers_by_token_.erase(peer_token);
-  } else {
-    peers_by_token_[peer_token] = peer_name;
-    peer_connections_.insert(
-        {peer_name, PeerConnection{nullptr, local_port, peer_token}});
-    DVLOG(1) << "Node " << name_ << " accepted peer " << peer_name;
-
-    AddPeer(peer_name, channel, false /* start_channel */);
-  }
-
-  // We need to choose one side to initiate the port merge. It doesn't matter
-  // who does it as long as they don't both try. Simple solution: pick the one
-  // with the "smaller" port name.
-  if (local_port.name() < port_name) {
-    node()->MergePorts(local_port, peer_name, port_name);
-  }
-}
-
-void NodeController::OnChannelError(const ports::NodeName& from_node,
-                                    NodeChannel* channel) {
-  if (io_task_runner_->RunsTasksOnCurrentThread()) {
-    DropPeer(from_node, channel);
-    // DropPeer may have caused local port closures, so be sure to process any
-    // pending local messages.
-    AcceptIncomingMessages();
-  } else {
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::Bind(&NodeController::OnChannelError, base::Unretained(this),
-                   from_node, channel));
-  }
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-MachPortRelay* NodeController::GetMachPortRelay() {
-  {
-    base::AutoLock lock(parent_lock_);
-    // Return null if we're not the root.
-    if (bootstrap_parent_channel_ || parent_name_ != ports::kInvalidNodeName)
-      return nullptr;
-  }
-
-  base::AutoLock lock(mach_port_relay_lock_);
-  return mach_port_relay_.get();
-}
-#endif
-
-void NodeController::CancelPendingPortMerges() {
-  std::vector<ports::PortRef> ports_to_close;
-
-  {
-    base::AutoLock lock(pending_port_merges_lock_);
-    reject_pending_merges_ = true;
-    for (const auto& port : pending_port_merges_)
-      ports_to_close.push_back(port.second);
-    pending_port_merges_.clear();
-  }
-
-  for (const auto& port : ports_to_close)
-    node_->ClosePort(port);
-}
-
-void NodeController::DestroyOnIOThreadShutdown() {
-  destroy_on_io_thread_shutdown_ = true;
-}
-
-void NodeController::AttemptShutdownIfRequested() {
-  if (!shutdown_callback_flag_)
-    return;
-
-  base::Closure callback;
-  {
-    base::AutoLock lock(shutdown_lock_);
-    if (shutdown_callback_.is_null())
-      return;
-    if (!node_->CanShutdownCleanly(
-          ports::Node::ShutdownPolicy::ALLOW_LOCAL_PORTS)) {
-      DVLOG(2) << "Unable to cleanly shut down node " << name_;
-      return;
-    }
-
-    callback = shutdown_callback_;
-    shutdown_callback_.Reset();
-    shutdown_callback_flag_.Set(false);
-  }
-
-  DCHECK(!callback.is_null());
-
-  callback.Run();
-}
-
-NodeController::PeerConnection::PeerConnection() = default;
-
-NodeController::PeerConnection::PeerConnection(
-    const PeerConnection& other) = default;
-
-NodeController::PeerConnection::PeerConnection(
-    PeerConnection&& other) = default;
-
-NodeController::PeerConnection::PeerConnection(
-    scoped_refptr<NodeChannel> channel,
-    const ports::PortRef& local_port,
-    const std::string& peer_token)
-    : channel(std::move(channel)),
-      local_port(local_port),
-      peer_token(peer_token) {}
-
-NodeController::PeerConnection::~PeerConnection() = default;
-
-NodeController::PeerConnection& NodeController::PeerConnection::
-operator=(const PeerConnection& other) = default;
-
-NodeController::PeerConnection& NodeController::PeerConnection::
-operator=(PeerConnection&& other) = default;
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/node_controller.h b/mojo/edk/system/node_controller.h
deleted file mode 100644
index 46a2d61..0000000
--- a/mojo/edk/system/node_controller.h
+++ /dev/null
@@ -1,378 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_
-#define MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_
-
-#include <memory>
-#include <queue>
-#include <unordered_map>
-#include <unordered_set>
-#include <utility>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/containers/hash_tables.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/task_runner.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/atomic_flag.h"
-#include "mojo/edk/system/node_channel.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/node.h"
-#include "mojo/edk/system/ports/node_delegate.h"
-
-namespace base {
-class PortProvider;
-}
-
-namespace mojo {
-namespace edk {
-
-class Broker;
-class Core;
-class MachPortRelay;
-class PortsMessage;
-
-// The owner of ports::Node which facilitates core EDK implementation. All
-// public interface methods are safe to call from any thread.
-class NodeController : public ports::NodeDelegate,
-                       public NodeChannel::Delegate {
- public:
-  class PortObserver : public ports::UserData {
-   public:
-    virtual void OnPortStatusChanged() = 0;
-
-   protected:
-    ~PortObserver() override {}
-  };
-
-  // |core| owns and out-lives us.
-  explicit NodeController(Core* core);
-  ~NodeController() override;
-
-  const ports::NodeName& name() const { return name_; }
-  Core* core() const { return core_; }
-  ports::Node* node() const { return node_.get(); }
-  scoped_refptr<base::TaskRunner> io_task_runner() const {
-    return io_task_runner_;
-  }
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  // Create the relay used to transfer mach ports between processes.
-  void CreateMachPortRelay(base::PortProvider* port_provider);
-#endif
-
-  // Called exactly once, shortly after construction, and before any other
-  // methods are called on this object.
-  void SetIOTaskRunner(scoped_refptr<base::TaskRunner> io_task_runner);
-
-  // Connects this node to a child node. This node will initiate a handshake.
-  void ConnectToChild(base::ProcessHandle process_handle,
-                      ConnectionParams connection_params,
-                      const std::string& child_token,
-                      const ProcessErrorCallback& process_error_callback);
-
-  // Closes all reserved ports which associated with the child process
-  // |child_token|.
-  void CloseChildPorts(const std::string& child_token);
-
-  // Close a connection to a peer associated with |peer_token|.
-  void ClosePeerConnection(const std::string& peer_token);
-
-  // Connects this node to a parent node. The parent node will initiate a
-  // handshake.
-  void ConnectToParent(ConnectionParams connection_params);
-
-  // Connects this node to a peer node. On success, |port| will be merged with
-  // the corresponding port in the peer node.
-  void ConnectToPeer(ConnectionParams connection_params,
-                     const ports::PortRef& port,
-                     const std::string& peer_token);
-
-  // Sets a port's observer. If |observer| is null the port's current observer
-  // is removed.
-  void SetPortObserver(const ports::PortRef& port,
-                       scoped_refptr<PortObserver> observer);
-
-  // Closes a port. Use this in lieu of calling Node::ClosePort() directly, as
-  // it ensures the port's observer has also been removed.
-  void ClosePort(const ports::PortRef& port);
-
-  // Sends a message on a port to its peer.
-  int SendMessage(const ports::PortRef& port_ref,
-                  std::unique_ptr<PortsMessage> message);
-
-  // Reserves a local port |port| associated with |token|. A peer holding a copy
-  // of |token| can merge one of its own ports into this one.
-  void ReservePort(const std::string& token, const ports::PortRef& port,
-                   const std::string& child_token);
-
-  // Merges a local port |port| into a port reserved by |token| in the parent.
-  void MergePortIntoParent(const std::string& token,
-                           const ports::PortRef& port);
-
-  // Merges two local ports together.
-  int MergeLocalPorts(const ports::PortRef& port0, const ports::PortRef& port1);
-
-  // Creates a new shared buffer for use in the current process.
-  scoped_refptr<PlatformSharedBuffer> CreateSharedBuffer(size_t num_bytes);
-
-  // Request that the Node be shut down cleanly. This may take an arbitrarily
-  // long time to complete, at which point |callback| will be called.
-  //
-  // Note that while it is safe to continue using the NodeController's public
-  // interface after requesting shutdown, you do so at your own risk and there
-  // is NO guarantee that new messages will be sent or ports will complete
-  // transfer.
-  void RequestShutdown(const base::Closure& callback);
-
-  // Notifies the NodeController that we received a bad message from the given
-  // node.
-  void NotifyBadMessageFrom(const ports::NodeName& source_node,
-                            const std::string& error);
-
- private:
-  friend Core;
-
-  using NodeMap = std::unordered_map<ports::NodeName,
-                                     scoped_refptr<NodeChannel>>;
-  using OutgoingMessageQueue = std::queue<Channel::MessagePtr>;
-
-  struct ReservedPort {
-    ports::PortRef port;
-    const std::string child_token;
-  };
-
-  struct PeerConnection {
-    PeerConnection();
-    PeerConnection(const PeerConnection& other);
-    PeerConnection(PeerConnection&& other);
-    PeerConnection(scoped_refptr<NodeChannel> channel,
-                   const ports::PortRef& local_port,
-                   const std::string& peer_token);
-    ~PeerConnection();
-
-    PeerConnection& operator=(const PeerConnection& other);
-    PeerConnection& operator=(PeerConnection&& other);
-
-
-    scoped_refptr<NodeChannel> channel;
-    ports::PortRef local_port;
-    std::string peer_token;
-  };
-
-  void ConnectToChildOnIOThread(
-      base::ProcessHandle process_handle,
-      ConnectionParams connection_params,
-      ports::NodeName token,
-      const ProcessErrorCallback& process_error_callback);
-  void ConnectToParentOnIOThread(ConnectionParams connection_params);
-
-  void ConnectToPeerOnIOThread(ConnectionParams connection_params,
-                               ports::NodeName token,
-                               ports::PortRef port,
-                               const std::string& peer_token);
-  void ClosePeerConnectionOnIOThread(const std::string& node_name);
-
-  scoped_refptr<NodeChannel> GetPeerChannel(const ports::NodeName& name);
-  scoped_refptr<NodeChannel> GetParentChannel();
-  scoped_refptr<NodeChannel> GetBrokerChannel();
-
-  void AddPeer(const ports::NodeName& name,
-               scoped_refptr<NodeChannel> channel,
-               bool start_channel);
-  void DropPeer(const ports::NodeName& name, NodeChannel* channel);
-  void SendPeerMessage(const ports::NodeName& name,
-                       ports::ScopedMessage message);
-  void AcceptIncomingMessages();
-  void ProcessIncomingMessages();
-  void DropAllPeers();
-
-  // ports::NodeDelegate:
-  void GenerateRandomPortName(ports::PortName* port_name) override;
-  void AllocMessage(size_t num_header_bytes,
-                    ports::ScopedMessage* message) override;
-  void ForwardMessage(const ports::NodeName& node,
-                      ports::ScopedMessage message) override;
-  void BroadcastMessage(ports::ScopedMessage message) override;
-  void PortStatusChanged(const ports::PortRef& port) override;
-
-  // NodeChannel::Delegate:
-  void OnAcceptChild(const ports::NodeName& from_node,
-                     const ports::NodeName& parent_name,
-                     const ports::NodeName& token) override;
-  void OnAcceptParent(const ports::NodeName& from_node,
-                      const ports::NodeName& token,
-                      const ports::NodeName& child_name) override;
-  void OnAddBrokerClient(const ports::NodeName& from_node,
-                         const ports::NodeName& client_name,
-                         base::ProcessHandle process_handle) override;
-  void OnBrokerClientAdded(const ports::NodeName& from_node,
-                           const ports::NodeName& client_name,
-                           ScopedPlatformHandle broker_channel) override;
-  void OnAcceptBrokerClient(const ports::NodeName& from_node,
-                            const ports::NodeName& broker_name,
-                            ScopedPlatformHandle broker_channel) override;
-  void OnPortsMessage(const ports::NodeName& from_node,
-                      Channel::MessagePtr message) override;
-  void OnRequestPortMerge(const ports::NodeName& from_node,
-                          const ports::PortName& connector_port_name,
-                          const std::string& token) override;
-  void OnRequestIntroduction(const ports::NodeName& from_node,
-                             const ports::NodeName& name) override;
-  void OnIntroduce(const ports::NodeName& from_node,
-                   const ports::NodeName& name,
-                   ScopedPlatformHandle channel_handle) override;
-  void OnBroadcast(const ports::NodeName& from_node,
-                   Channel::MessagePtr message) override;
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-  void OnRelayPortsMessage(const ports::NodeName& from_node,
-                           base::ProcessHandle from_process,
-                           const ports::NodeName& destination,
-                           Channel::MessagePtr message) override;
-  void OnPortsMessageFromRelay(const ports::NodeName& from_node,
-                               const ports::NodeName& source_node,
-                               Channel::MessagePtr message) override;
-#endif
-  void OnAcceptPeer(const ports::NodeName& from_node,
-                    const ports::NodeName& token,
-                    const ports::NodeName& peer_name,
-                    const ports::PortName& port_name) override;
-  void OnChannelError(const ports::NodeName& from_node,
-                      NodeChannel* channel) override;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  MachPortRelay* GetMachPortRelay() override;
-#endif
-
-  // Cancels all pending port merges. These are merges which are supposed to
-  // be requested from the parent ASAP, and they may be cancelled if the
-  // connection to the parent is broken or never established.
-  void CancelPendingPortMerges();
-
-  // Marks this NodeController for destruction when the IO thread shuts down.
-  // This is used in case Core is torn down before the IO thread. Must only be
-  // called on the IO thread.
-  void DestroyOnIOThreadShutdown();
-
-  // If there is a registered shutdown callback (meaning shutdown has been
-  // requested, this checks the Node's status to see if clean shutdown is
-  // possible. If so, shutdown is performed and the shutdown callback is run.
-  void AttemptShutdownIfRequested();
-
-  // These are safe to access from any thread as long as the Node is alive.
-  Core* const core_;
-  const ports::NodeName name_;
-  const std::unique_ptr<ports::Node> node_;
-  scoped_refptr<base::TaskRunner> io_task_runner_;
-
-  // Guards |peers_| and |pending_peer_messages_|.
-  base::Lock peers_lock_;
-
-  // Channels to known peers, including parent and children, if any.
-  NodeMap peers_;
-
-  // Outgoing message queues for peers we've heard of but can't yet talk to.
-  std::unordered_map<ports::NodeName, OutgoingMessageQueue>
-      pending_peer_messages_;
-
-  // Guards |reserved_ports_| and |pending_child_tokens_|.
-  base::Lock reserved_ports_lock_;
-
-  // Ports reserved by token. Key is the port token.
-  base::hash_map<std::string, ReservedPort> reserved_ports_;
-  // TODO(amistry): This _really_ needs to be a bimap. Unfortunately, we don't
-  // have one yet :(
-  std::unordered_map<ports::NodeName, std::string> pending_child_tokens_;
-
-  // Guards |pending_port_merges_| and |reject_pending_merges_|.
-  base::Lock pending_port_merges_lock_;
-
-  // A set of port merge requests awaiting parent connection.
-  std::vector<std::pair<std::string, ports::PortRef>> pending_port_merges_;
-
-  // Indicates that new merge requests should be rejected because the parent has
-  // disconnected.
-  bool reject_pending_merges_ = false;
-
-  // Guards |parent_name_| and |bootstrap_parent_channel_|.
-  base::Lock parent_lock_;
-
-  // The name of our parent node, if any.
-  ports::NodeName parent_name_;
-
-  // A temporary reference to the parent channel before we know their name.
-  scoped_refptr<NodeChannel> bootstrap_parent_channel_;
-
-  // Guards |broker_name_|, |pending_broker_clients_|, and
-  // |pending_relay_messages_|.
-  base::Lock broker_lock_;
-
-  // The name of our broker node, if any.
-  ports::NodeName broker_name_;
-
-  // A queue of pending child names waiting to be connected to a broker.
-  std::queue<ports::NodeName> pending_broker_clients_;
-
-  // Messages waiting to be relayed by the broker once it's known.
-  std::unordered_map<ports::NodeName, OutgoingMessageQueue>
-      pending_relay_messages_;
-
-  // Guards |incoming_messages_| and |incoming_messages_task_posted_|.
-  base::Lock messages_lock_;
-  std::queue<ports::ScopedMessage> incoming_messages_;
-  // Ensures that there is only one incoming messages task posted to the IO
-  // thread.
-  bool incoming_messages_task_posted_ = false;
-  // Flag to fast-path checking |incoming_messages_|.
-  AtomicFlag incoming_messages_flag_;
-
-  // Guards |shutdown_callback_|.
-  base::Lock shutdown_lock_;
-
-  // Set by RequestShutdown(). If this is non-null, the controller will
-  // begin polling the Node to see if clean shutdown is possible any time the
-  // Node's state is modified by the controller.
-  base::Closure shutdown_callback_;
-  // Flag to fast-path checking |shutdown_callback_|.
-  AtomicFlag shutdown_callback_flag_;
-
-  // All other fields below must only be accessed on the I/O thread, i.e., the
-  // thread on which core_->io_task_runner() runs tasks.
-
-  // Channels to children during handshake.
-  NodeMap pending_children_;
-
-  using PeerNodeMap =
-      std::unordered_map<ports::NodeName, PeerConnection>;
-  PeerNodeMap peer_connections_;
-
-  // Maps from peer token to node name, pending or not.
-  std::unordered_map<std::string, ports::NodeName> peers_by_token_;
-
-  // Indicates whether this object should delete itself on IO thread shutdown.
-  // Must only be accessed from the IO thread.
-  bool destroy_on_io_thread_shutdown_ = false;
-
-#if !defined(OS_MACOSX) && !defined(OS_NACL_SFI)
-  // Broker for sync shared buffer creation in children.
-  std::unique_ptr<Broker> broker_;
-#endif
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  base::Lock mach_port_relay_lock_;
-  // Relay for transferring mach ports to/from children.
-  std::unique_ptr<MachPortRelay> mach_port_relay_;
-#endif
-
-  DISALLOW_COPY_AND_ASSIGN(NodeController);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_
diff --git a/mojo/edk/system/options_validation.h b/mojo/edk/system/options_validation.h
deleted file mode 100644
index e1b337d..0000000
--- a/mojo/edk/system/options_validation.h
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Functions to help with verifying various |Mojo...Options| structs from the
-// (public, C) API. These are "extensible" structs, which all have |struct_size|
-// as their first member. All fields (other than |struct_size|) are optional,
-// but any |flags| specified must be known to the system (otherwise, an error of
-// |MOJO_RESULT_UNIMPLEMENTED| should be returned).
-
-#ifndef MOJO_EDK_SYSTEM_OPTIONS_VALIDATION_H_
-#define MOJO_EDK_SYSTEM_OPTIONS_VALIDATION_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-namespace edk {
-
-template <class Options>
-class UserOptionsReader {
- public:
-  // Constructor from a |const* Options| (which it checks -- this constructor
-  // has side effects!).
-  // Note: We initialize |options_reader_| without checking, since we do a check
-  // in |GetSizeForReader()|.
-  explicit UserOptionsReader(const Options* options) {
-    CHECK(options && IsAligned<MOJO_ALIGNOF(Options)>(options));
-    options_ = GetSizeForReader(options) == 0 ? nullptr : options;
-    static_assert(offsetof(Options, struct_size) == 0,
-                  "struct_size not first member of Options");
-    // TODO(vtl): Enable when MSVC supports this (C++11 extended sizeof):
-    //   static_assert(sizeof(Options::struct_size) == sizeof(uint32_t),
-    //                 "Options::struct_size not a uint32_t");
-    // (Or maybe assert that its type is uint32_t?)
-  }
-
-  bool is_valid() const { return !!options_; }
-
-  const Options& options() const {
-    DCHECK(is_valid());
-    return *options_;
-  }
-
-  // Checks that the given (variable-size) |options| passed to the constructor
-  // (plausibly) has a member at the given offset with the given size. You
-  // probably want to use |OPTIONS_STRUCT_HAS_MEMBER()| instead.
-  bool HasMember(size_t offset, size_t size) const {
-    DCHECK(is_valid());
-    // We assume that |offset| and |size| are reasonable, since they should come
-    // from |offsetof(Options, some_member)| and |sizeof(Options::some_member)|,
-    // respectively.
-    return options().struct_size >= offset + size;
-  }
-
- private:
-  static inline size_t GetSizeForReader(const Options* options) {
-    uint32_t struct_size = *reinterpret_cast<const uint32_t*>(options);
-    if (struct_size < sizeof(uint32_t))
-      return 0;
-
-    return std::min(static_cast<size_t>(struct_size), sizeof(Options));
-  }
-
-  template <size_t alignment>
-  static bool IsAligned(const void* pointer) {
-    return reinterpret_cast<uintptr_t>(pointer) % alignment == 0;
-  }
-
-  const Options* options_;
-
-  DISALLOW_COPY_AND_ASSIGN(UserOptionsReader);
-};
-
-// Macro to invoke |UserOptionsReader<Options>::HasMember()| parametrized by
-// member name instead of offset and size.
-//
-// (We can't just give |HasMember()| a member pointer template argument instead,
-// since there's no good/strictly-correct way to get an offset from that.)
-//
-// TODO(vtl): With C++11, use |sizeof(Options::member)| instead of (the
-// contortion below). We might also be able to pull out the type |Options| from
-// |reader| (using |decltype|) instead of requiring a parameter.
-#define OPTIONS_STRUCT_HAS_MEMBER(Options, member, reader) \
-  reader.HasMember(offsetof(Options, member), sizeof(reader.options().member))
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_OPTIONS_VALIDATION_H_
diff --git a/mojo/edk/system/options_validation_unittest.cc b/mojo/edk/system/options_validation_unittest.cc
deleted file mode 100644
index a01a92c..0000000
--- a/mojo/edk/system/options_validation_unittest.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/options_validation.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "mojo/public/c/system/macros.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-// Declare a test options struct just as we do in actual public headers.
-
-using TestOptionsFlags = uint32_t;
-
-static_assert(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
-struct MOJO_ALIGNAS(8) TestOptions {
-  uint32_t struct_size;
-  TestOptionsFlags flags;
-  uint32_t member1;
-  uint32_t member2;
-};
-static_assert(sizeof(TestOptions) == 16, "TestOptions has wrong size");
-
-const uint32_t kSizeOfTestOptions = static_cast<uint32_t>(sizeof(TestOptions));
-
-TEST(OptionsValidationTest, Valid) {
-  {
-    const TestOptions kOptions = {kSizeOfTestOptions};
-    UserOptionsReader<TestOptions> reader(&kOptions);
-    EXPECT_TRUE(reader.is_valid());
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, flags, reader));
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member1, reader));
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member2, reader));
-  }
-  {
-    const TestOptions kOptions = {static_cast<uint32_t>(
-        offsetof(TestOptions, struct_size) + sizeof(uint32_t))};
-    UserOptionsReader<TestOptions> reader(&kOptions);
-    EXPECT_TRUE(reader.is_valid());
-    EXPECT_FALSE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, flags, reader));
-    EXPECT_FALSE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member1, reader));
-    EXPECT_FALSE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member2, reader));
-  }
-
-  {
-    const TestOptions kOptions = {
-        static_cast<uint32_t>(offsetof(TestOptions, flags) + sizeof(uint32_t))};
-    UserOptionsReader<TestOptions> reader(&kOptions);
-    EXPECT_TRUE(reader.is_valid());
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, flags, reader));
-    EXPECT_FALSE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member1, reader));
-    EXPECT_FALSE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member2, reader));
-  }
-  {
-    MOJO_ALIGNAS(8) char buf[sizeof(TestOptions) + 100] = {};
-    TestOptions* options = reinterpret_cast<TestOptions*>(buf);
-    options->struct_size = kSizeOfTestOptions + 1;
-    UserOptionsReader<TestOptions> reader(options);
-    EXPECT_TRUE(reader.is_valid());
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, flags, reader));
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member1, reader));
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member2, reader));
-  }
-  {
-    MOJO_ALIGNAS(8) char buf[sizeof(TestOptions) + 100] = {};
-    TestOptions* options = reinterpret_cast<TestOptions*>(buf);
-    options->struct_size = kSizeOfTestOptions + 4;
-    UserOptionsReader<TestOptions> reader(options);
-    EXPECT_TRUE(reader.is_valid());
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, flags, reader));
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member1, reader));
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member2, reader));
-  }
-}
-
-TEST(OptionsValidationTest, Invalid) {
-  // Size too small:
-  for (size_t i = 0; i < sizeof(uint32_t); i++) {
-    TestOptions options = {static_cast<uint32_t>(i)};
-    UserOptionsReader<TestOptions> reader(&options);
-    EXPECT_FALSE(reader.is_valid()) << i;
-  }
-}
-
-// These test invalid arguments that should cause death if we're being paranoid
-// about checking arguments (which we would want to do if, e.g., we were in a
-// true "kernel" situation, but we might not want to do otherwise for
-// performance reasons). Probably blatant errors like passing in null pointers
-// (for required pointer arguments) will still cause death, but perhaps not
-// predictably.
-TEST(OptionsValidationTest, InvalidDeath) {
-#if defined(OFFICIAL_BUILD)
-  const char kMemoryCheckFailedRegex[] = "";
-#else
-  const char kMemoryCheckFailedRegex[] = "Check failed";
-#endif
-
-  // Null:
-  EXPECT_DEATH_IF_SUPPORTED(
-      { UserOptionsReader<TestOptions> reader((nullptr)); },
-      kMemoryCheckFailedRegex);
-
-  // Unaligned:
-  EXPECT_DEATH_IF_SUPPORTED(
-      {
-        UserOptionsReader<TestOptions> reader(
-            reinterpret_cast<const TestOptions*>(1));
-      },
-      kMemoryCheckFailedRegex);
-  // Note: The current implementation checks the size only after checking the
-  // alignment versus that required for the |uint32_t| size, so it won't die in
-  // the expected way if you pass, e.g., 4. So we have to manufacture a valid
-  // pointer at an offset of alignment 4.
-  EXPECT_DEATH_IF_SUPPORTED(
-      {
-        uint32_t buffer[100] = {};
-        TestOptions* options = (reinterpret_cast<uintptr_t>(buffer) % 8 == 0)
-                                   ? reinterpret_cast<TestOptions*>(&buffer[1])
-                                   : reinterpret_cast<TestOptions*>(&buffer[0]);
-        options->struct_size = static_cast<uint32_t>(sizeof(TestOptions));
-        UserOptionsReader<TestOptions> reader(options);
-      },
-      kMemoryCheckFailedRegex);
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/platform_handle_dispatcher.cc b/mojo/edk/system/platform_handle_dispatcher.cc
deleted file mode 100644
index 3e708c2..0000000
--- a/mojo/edk/system/platform_handle_dispatcher.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/platform_handle_dispatcher.h"
-
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-
-namespace mojo {
-namespace edk {
-
-// static
-scoped_refptr<PlatformHandleDispatcher> PlatformHandleDispatcher::Create(
-    ScopedPlatformHandle platform_handle) {
-  return new PlatformHandleDispatcher(std::move(platform_handle));
-}
-
-ScopedPlatformHandle PlatformHandleDispatcher::PassPlatformHandle() {
-  return std::move(platform_handle_);
-}
-
-Dispatcher::Type PlatformHandleDispatcher::GetType() const {
-  return Type::PLATFORM_HANDLE;
-}
-
-MojoResult PlatformHandleDispatcher::Close() {
-  base::AutoLock lock(lock_);
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  is_closed_ = true;
-  platform_handle_.reset();
-  return MOJO_RESULT_OK;
-}
-
-void PlatformHandleDispatcher::StartSerialize(uint32_t* num_bytes,
-                                              uint32_t* num_ports,
-                                              uint32_t* num_handles) {
-  *num_bytes = 0;
-  *num_ports = 0;
-  *num_handles = 1;
-}
-
-bool PlatformHandleDispatcher::EndSerialize(void* destination,
-                                            ports::PortName* ports,
-                                            PlatformHandle* handles) {
-  base::AutoLock lock(lock_);
-  if (is_closed_)
-    return false;
-  handles[0] = platform_handle_.get();
-  return true;
-}
-
-bool PlatformHandleDispatcher::BeginTransit() {
-  base::AutoLock lock(lock_);
-  if (in_transit_)
-    return false;
-  in_transit_ = !is_closed_;
-  return in_transit_;
-}
-
-void PlatformHandleDispatcher::CompleteTransitAndClose() {
-  base::AutoLock lock(lock_);
-
-  in_transit_ = false;
-  is_closed_ = true;
-
-  // The system has taken ownership of our handle.
-  ignore_result(platform_handle_.release());
-}
-
-void PlatformHandleDispatcher::CancelTransit() {
-  base::AutoLock lock(lock_);
-  in_transit_ = false;
-}
-
-// static
-scoped_refptr<PlatformHandleDispatcher> PlatformHandleDispatcher::Deserialize(
-    const void* bytes,
-    size_t num_bytes,
-    const ports::PortName* ports,
-    size_t num_ports,
-    PlatformHandle* handles,
-    size_t num_handles) {
-  if (num_bytes || num_ports || num_handles != 1)
-    return nullptr;
-
-  PlatformHandle handle;
-  std::swap(handle, handles[0]);
-
-  return PlatformHandleDispatcher::Create(ScopedPlatformHandle(handle));
-}
-
-PlatformHandleDispatcher::PlatformHandleDispatcher(
-    ScopedPlatformHandle platform_handle)
-    : platform_handle_(std::move(platform_handle)) {}
-
-PlatformHandleDispatcher::~PlatformHandleDispatcher() {
-  DCHECK(is_closed_ && !in_transit_);
-  DCHECK(!platform_handle_.is_valid());
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/platform_handle_dispatcher.h b/mojo/edk/system/platform_handle_dispatcher.h
deleted file mode 100644
index a36c7a0..0000000
--- a/mojo/edk/system/platform_handle_dispatcher.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PLATFORM_HANDLE_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_PLATFORM_HANDLE_DISPATCHER_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-class MOJO_SYSTEM_IMPL_EXPORT PlatformHandleDispatcher : public Dispatcher {
- public:
-  static scoped_refptr<PlatformHandleDispatcher> Create(
-      ScopedPlatformHandle platform_handle);
-
-  ScopedPlatformHandle PassPlatformHandle();
-
-  // Dispatcher:
-  Type GetType() const override;
-  MojoResult Close() override;
-  void StartSerialize(uint32_t* num_bytes,
-                      uint32_t* num_ports,
-                      uint32_t* num_handles) override;
-  bool EndSerialize(void* destination,
-                    ports::PortName* ports,
-                    PlatformHandle* handles) override;
-  bool BeginTransit() override;
-  void CompleteTransitAndClose() override;
-  void CancelTransit() override;
-
-  static scoped_refptr<PlatformHandleDispatcher> Deserialize(
-      const void* bytes,
-      size_t num_bytes,
-      const ports::PortName* ports,
-      size_t num_ports,
-      PlatformHandle* handles,
-      size_t num_handles);
-
- private:
-  PlatformHandleDispatcher(ScopedPlatformHandle platform_handle);
-  ~PlatformHandleDispatcher() override;
-
-  base::Lock lock_;
-  bool in_transit_ = false;
-  bool is_closed_ = false;
-  ScopedPlatformHandle platform_handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(PlatformHandleDispatcher);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PLATFORM_HANDLE_DISPATCHER_H_
diff --git a/mojo/edk/system/platform_handle_dispatcher_unittest.cc b/mojo/edk/system/platform_handle_dispatcher_unittest.cc
deleted file mode 100644
index 7a94262..0000000
--- a/mojo/edk/system/platform_handle_dispatcher_unittest.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/platform_handle_dispatcher.h"
-
-#include <stdio.h>
-#include <utility>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/test/test_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-TEST(PlatformHandleDispatcherTest, Basic) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  static const char kHelloWorld[] = "hello world";
-
-  base::FilePath unused;
-  base::ScopedFILE fp(
-      CreateAndOpenTemporaryFileInDir(temp_dir.GetPath(), &unused));
-  ASSERT_TRUE(fp);
-  EXPECT_EQ(sizeof(kHelloWorld),
-            fwrite(kHelloWorld, 1, sizeof(kHelloWorld), fp.get()));
-
-  ScopedPlatformHandle h(test::PlatformHandleFromFILE(std::move(fp)));
-  EXPECT_FALSE(fp);
-  ASSERT_TRUE(h.is_valid());
-
-  scoped_refptr<PlatformHandleDispatcher> dispatcher =
-      PlatformHandleDispatcher::Create(std::move(h));
-  EXPECT_FALSE(h.is_valid());
-  EXPECT_EQ(Dispatcher::Type::PLATFORM_HANDLE, dispatcher->GetType());
-
-  h = dispatcher->PassPlatformHandle();
-  EXPECT_TRUE(h.is_valid());
-
-  fp = test::FILEFromPlatformHandle(std::move(h), "rb");
-  EXPECT_FALSE(h.is_valid());
-  EXPECT_TRUE(fp);
-
-  rewind(fp.get());
-  char read_buffer[1000] = {};
-  EXPECT_EQ(sizeof(kHelloWorld),
-            fread(read_buffer, 1, sizeof(read_buffer), fp.get()));
-  EXPECT_STREQ(kHelloWorld, read_buffer);
-
-  // Try getting the handle again. (It should fail cleanly.)
-  h = dispatcher->PassPlatformHandle();
-  EXPECT_FALSE(h.is_valid());
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
-}
-
-TEST(PlatformHandleDispatcherTest, Serialization) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  static const char kFooBar[] = "foo bar";
-
-  base::FilePath unused;
-  base::ScopedFILE fp(
-      CreateAndOpenTemporaryFileInDir(temp_dir.GetPath(), &unused));
-  EXPECT_EQ(sizeof(kFooBar), fwrite(kFooBar, 1, sizeof(kFooBar), fp.get()));
-
-  scoped_refptr<PlatformHandleDispatcher> dispatcher =
-      PlatformHandleDispatcher::Create(
-          test::PlatformHandleFromFILE(std::move(fp)));
-
-  uint32_t num_bytes = 0;
-  uint32_t num_ports = 0;
-  uint32_t num_handles = 0;
-  EXPECT_TRUE(dispatcher->BeginTransit());
-  dispatcher->StartSerialize(&num_bytes, &num_ports, &num_handles);
-
-  EXPECT_EQ(0u, num_bytes);
-  EXPECT_EQ(0u, num_ports);
-  EXPECT_EQ(1u, num_handles);
-
-  ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector(1));
-  EXPECT_TRUE(dispatcher->EndSerialize(nullptr, nullptr, handles->data()));
-  dispatcher->CompleteTransitAndClose();
-
-  EXPECT_TRUE(handles->at(0).is_valid());
-
-  ScopedPlatformHandle handle = dispatcher->PassPlatformHandle();
-  EXPECT_FALSE(handle.is_valid());
-
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dispatcher->Close());
-
-  dispatcher = static_cast<PlatformHandleDispatcher*>(
-      Dispatcher::Deserialize(Dispatcher::Type::PLATFORM_HANDLE, nullptr,
-                              num_bytes, nullptr, num_ports, handles->data(),
-                              1).get());
-
-  EXPECT_FALSE(handles->at(0).is_valid());
-  EXPECT_TRUE(dispatcher->GetType() == Dispatcher::Type::PLATFORM_HANDLE);
-
-  fp = test::FILEFromPlatformHandle(dispatcher->PassPlatformHandle(), "rb");
-  EXPECT_TRUE(fp);
-
-  rewind(fp.get());
-  char read_buffer[1000] = {};
-  EXPECT_EQ(sizeof(kFooBar),
-            fread(read_buffer, 1, sizeof(read_buffer), fp.get()));
-  EXPECT_STREQ(kFooBar, read_buffer);
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/platform_wrapper_unittest.cc b/mojo/edk/system/platform_wrapper_unittest.cc
deleted file mode 100644
index f29d62b..0000000
--- a/mojo/edk/system/platform_wrapper_unittest.cc
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-#include <string.h>
-
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include "base/files/file.h"
-#include "base/files/file_util.h"
-#include "base/memory/shared_memory.h"
-#include "base/process/process_handle.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/platform_handle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-
-#if defined(OS_POSIX)
-#define SIMPLE_PLATFORM_HANDLE_TYPE MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR
-#elif defined(OS_WIN)
-#define SIMPLE_PLATFORM_HANDLE_TYPE MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE
-#endif
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#define SHARED_BUFFER_PLATFORM_HANDLE_TYPE MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT
-#else
-#define SHARED_BUFFER_PLATFORM_HANDLE_TYPE SIMPLE_PLATFORM_HANDLE_TYPE
-#endif
-
-uint64_t PlatformHandleValueFromPlatformFile(base::PlatformFile file) {
-#if defined(OS_WIN)
-  return reinterpret_cast<uint64_t>(file);
-#else
-  return static_cast<uint64_t>(file);
-#endif
-}
-
-base::PlatformFile PlatformFileFromPlatformHandleValue(uint64_t value) {
-#if defined(OS_WIN)
-  return reinterpret_cast<base::PlatformFile>(value);
-#else
-  return static_cast<base::PlatformFile>(value);
-#endif
-}
-
-namespace mojo {
-namespace edk {
-namespace {
-
-using PlatformWrapperTest = test::MojoTestBase;
-
-TEST_F(PlatformWrapperTest, WrapPlatformHandle) {
-  // Create a temporary file and write a message to it.
-  base::FilePath temp_file_path;
-  ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path));
-  const std::string kMessage = "Hello, world!";
-  EXPECT_EQ(base::WriteFile(temp_file_path, kMessage.data(),
-                            static_cast<int>(kMessage.size())),
-            static_cast<int>(kMessage.size()));
-
-  RUN_CHILD_ON_PIPE(ReadPlatformFile, h)
-    // Open the temporary file for reading, wrap its handle, and send it to
-    // the child along with the expected message to be read.
-    base::File file(temp_file_path,
-                    base::File::FLAG_OPEN | base::File::FLAG_READ);
-    EXPECT_TRUE(file.IsValid());
-
-    MojoHandle wrapped_handle;
-    MojoPlatformHandle os_file;
-    os_file.struct_size = sizeof(MojoPlatformHandle);
-    os_file.type = SIMPLE_PLATFORM_HANDLE_TYPE;
-    os_file.value =
-        PlatformHandleValueFromPlatformFile(file.TakePlatformFile());
-    EXPECT_EQ(MOJO_RESULT_OK,
-              MojoWrapPlatformHandle(&os_file, &wrapped_handle));
-
-    WriteMessageWithHandles(h, kMessage, &wrapped_handle, 1);
-  END_CHILD()
-
-  base::DeleteFile(temp_file_path, false);
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReadPlatformFile, PlatformWrapperTest, h) {
-  // Read a message and a wrapped file handle; unwrap the handle.
-  MojoHandle wrapped_handle;
-  std::string message = ReadMessageWithHandles(h, &wrapped_handle, 1);
-
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoUnwrapPlatformHandle(wrapped_handle, &platform_handle));
-  EXPECT_EQ(SIMPLE_PLATFORM_HANDLE_TYPE, platform_handle.type);
-  base::File file(PlatformFileFromPlatformHandleValue(platform_handle.value));
-
-  // Expect to read the same message from the file.
-  std::vector<char> data(message.size());
-  EXPECT_EQ(file.ReadAtCurrentPos(data.data(), static_cast<int>(data.size())),
-            static_cast<int>(data.size()));
-  EXPECT_TRUE(std::equal(message.begin(), message.end(), data.begin()));
-}
-
-TEST_F(PlatformWrapperTest, WrapPlatformSharedBufferHandle) {
-  // Allocate a new platform shared buffer and write a message into it.
-  const std::string kMessage = "Hello, world!";
-  base::SharedMemory buffer;
-  buffer.CreateAndMapAnonymous(kMessage.size());
-  CHECK(buffer.memory());
-  memcpy(buffer.memory(), kMessage.data(), kMessage.size());
-
-  RUN_CHILD_ON_PIPE(ReadPlatformSharedBuffer, h)
-    // Wrap the shared memory handle and send it to the child along with the
-    // expected message.
-    base::SharedMemoryHandle memory_handle =
-        base::SharedMemory::DuplicateHandle(buffer.handle());
-    MojoPlatformHandle os_buffer;
-    os_buffer.struct_size = sizeof(MojoPlatformHandle);
-    os_buffer.type = SHARED_BUFFER_PLATFORM_HANDLE_TYPE;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    os_buffer.value = static_cast<uint64_t>(memory_handle.GetMemoryObject());
-#elif defined(OS_POSIX)
-    os_buffer.value = static_cast<uint64_t>(memory_handle.fd);
-#elif defined(OS_WIN)
-    os_buffer.value = reinterpret_cast<uint64_t>(memory_handle.GetHandle());
-#endif
-
-    MojoHandle wrapped_handle;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWrapPlatformSharedBufferHandle(
-                  &os_buffer, kMessage.size(),
-                  MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE,
-                  &wrapped_handle));
-    WriteMessageWithHandles(h, kMessage, &wrapped_handle, 1);
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReadPlatformSharedBuffer, PlatformWrapperTest,
-                                  h) {
-  // Read a message and a wrapped shared buffer handle.
-  MojoHandle wrapped_handle;
-  std::string message = ReadMessageWithHandles(h, &wrapped_handle, 1);
-
-  // Check the message in the buffer
-  ExpectBufferContents(wrapped_handle, 0, message);
-
-  // Now unwrap the buffer and verify that the base::SharedMemoryHandle also
-  // works as expected.
-  MojoPlatformHandle os_buffer;
-  os_buffer.struct_size = sizeof(MojoPlatformHandle);
-  size_t size;
-  MojoPlatformSharedBufferHandleFlags flags;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoUnwrapPlatformSharedBufferHandle(wrapped_handle, &os_buffer,
-                                                 &size, &flags));
-  bool read_only = flags & MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE;
-  EXPECT_FALSE(read_only);
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  ASSERT_EQ(MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT, os_buffer.type);
-  base::SharedMemoryHandle memory_handle(
-      static_cast<mach_port_t>(os_buffer.value), size,
-      base::GetCurrentProcId());
-#elif defined(OS_POSIX)
-  ASSERT_EQ(MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR, os_buffer.type);
-  base::SharedMemoryHandle memory_handle(static_cast<int>(os_buffer.value),
-                                         false);
-#elif defined(OS_WIN)
-  ASSERT_EQ(MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE, os_buffer.type);
-  base::SharedMemoryHandle memory_handle(
-      reinterpret_cast<HANDLE>(os_buffer.value), base::GetCurrentProcId());
-#endif
-
-  base::SharedMemory memory(memory_handle, read_only);
-  memory.Map(message.size());
-  ASSERT_TRUE(memory.memory());
-
-  EXPECT_TRUE(std::equal(message.begin(), message.end(),
-                         static_cast<const char*>(memory.memory())));
-}
-
-TEST_F(PlatformWrapperTest, InvalidHandle) {
-  // Wrap an invalid platform handle and expect to unwrap the same.
-
-  MojoHandle wrapped_handle;
-  MojoPlatformHandle invalid_handle;
-  invalid_handle.struct_size = sizeof(MojoPlatformHandle);
-  invalid_handle.type = MOJO_PLATFORM_HANDLE_TYPE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWrapPlatformHandle(&invalid_handle, &wrapped_handle));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoUnwrapPlatformHandle(wrapped_handle, &invalid_handle));
-  EXPECT_EQ(MOJO_PLATFORM_HANDLE_TYPE_INVALID, invalid_handle.type);
-}
-
-TEST_F(PlatformWrapperTest, InvalidArgument) {
-  // Try to wrap an invalid MojoPlatformHandle struct and expect an error.
-  MojoHandle wrapped_handle;
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = 0;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoWrapPlatformHandle(&platform_handle, &wrapped_handle));
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/BUILD.gn b/mojo/edk/system/ports/BUILD.gn
deleted file mode 100644
index 5c82761..0000000
--- a/mojo/edk/system/ports/BUILD.gn
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//testing/test.gni")
-
-source_set("ports") {
-  sources = [
-    "event.cc",
-    "event.h",
-    "message.cc",
-    "message.h",
-    "message_filter.h",
-    "message_queue.cc",
-    "message_queue.h",
-    "name.cc",
-    "name.h",
-    "node.cc",
-    "node.h",
-    "node_delegate.h",
-    "port.cc",
-    "port.h",
-    "port_ref.cc",
-    "port_ref.h",
-    "user_data.h",
-  ]
-
-  public_deps = [
-    "//base",
-  ]
-}
-
-source_set("tests") {
-  testonly = true
-
-  sources = [
-    "ports_unittest.cc",
-  ]
-
-  deps = [
-    ":ports",
-    "//base",
-    "//base/test:test_support",
-    "//testing/gtest",
-  ]
-}
diff --git a/mojo/edk/system/ports/event.cc b/mojo/edk/system/ports/event.cc
deleted file mode 100644
index 2e22086..0000000
--- a/mojo/edk/system/ports/event.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports/event.h"
-
-#include <string.h>
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-namespace {
-
-const size_t kPortsMessageAlignment = 8;
-
-static_assert(sizeof(PortDescriptor) % kPortsMessageAlignment == 0,
-              "Invalid PortDescriptor size.");
-
-static_assert(sizeof(EventHeader) % kPortsMessageAlignment == 0,
-              "Invalid EventHeader size.");
-
-static_assert(sizeof(UserEventData) % kPortsMessageAlignment == 0,
-              "Invalid UserEventData size.");
-
-static_assert(sizeof(ObserveProxyEventData) % kPortsMessageAlignment == 0,
-              "Invalid ObserveProxyEventData size.");
-
-static_assert(sizeof(ObserveProxyAckEventData) % kPortsMessageAlignment == 0,
-              "Invalid ObserveProxyAckEventData size.");
-
-static_assert(sizeof(ObserveClosureEventData) % kPortsMessageAlignment == 0,
-              "Invalid ObserveClosureEventData size.");
-
-static_assert(sizeof(MergePortEventData) % kPortsMessageAlignment == 0,
-              "Invalid MergePortEventData size.");
-
-}  // namespace
-
-PortDescriptor::PortDescriptor() {
-  memset(padding, 0, sizeof(padding));
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/event.h b/mojo/edk/system/ports/event.h
deleted file mode 100644
index a66dfc1..0000000
--- a/mojo/edk/system/ports/event.h
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_EVENT_H_
-#define MOJO_EDK_SYSTEM_PORTS_EVENT_H_
-
-#include <stdint.h>
-
-#include "mojo/edk/system/ports/message.h"
-#include "mojo/edk/system/ports/name.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-#pragma pack(push, 1)
-
-// TODO: Add static assertions of alignment.
-
-struct PortDescriptor {
-  PortDescriptor();
-
-  NodeName peer_node_name;
-  PortName peer_port_name;
-  NodeName referring_node_name;
-  PortName referring_port_name;
-  uint64_t next_sequence_num_to_send;
-  uint64_t next_sequence_num_to_receive;
-  uint64_t last_sequence_num_to_receive;
-  bool peer_closed;
-  char padding[7];
-};
-
-enum struct EventType : uint32_t {
-  kUser,
-  kPortAccepted,
-  kObserveProxy,
-  kObserveProxyAck,
-  kObserveClosure,
-  kMergePort,
-};
-
-struct EventHeader {
-  EventType type;
-  uint32_t padding;
-  PortName port_name;
-};
-
-struct UserEventData {
-  uint64_t sequence_num;
-  uint32_t num_ports;
-  uint32_t padding;
-};
-
-struct ObserveProxyEventData {
-  NodeName proxy_node_name;
-  PortName proxy_port_name;
-  NodeName proxy_to_node_name;
-  PortName proxy_to_port_name;
-};
-
-struct ObserveProxyAckEventData {
-  uint64_t last_sequence_num;
-};
-
-struct ObserveClosureEventData {
-  uint64_t last_sequence_num;
-};
-
-struct MergePortEventData {
-  PortName new_port_name;
-  PortDescriptor new_port_descriptor;
-};
-
-#pragma pack(pop)
-
-inline const EventHeader* GetEventHeader(const Message& message) {
-  return static_cast<const EventHeader*>(message.header_bytes());
-}
-
-inline EventHeader* GetMutableEventHeader(Message* message) {
-  return static_cast<EventHeader*>(message->mutable_header_bytes());
-}
-
-template <typename EventData>
-inline const EventData* GetEventData(const Message& message) {
-  return reinterpret_cast<const EventData*>(
-      reinterpret_cast<const char*>(GetEventHeader(message) + 1));
-}
-
-template <typename EventData>
-inline EventData* GetMutableEventData(Message* message) {
-  return reinterpret_cast<EventData*>(
-      reinterpret_cast<char*>(GetMutableEventHeader(message) + 1));
-}
-
-inline const PortDescriptor* GetPortDescriptors(const UserEventData* event) {
-  return reinterpret_cast<const PortDescriptor*>(
-      reinterpret_cast<const char*>(event + 1));
-}
-
-inline PortDescriptor* GetMutablePortDescriptors(UserEventData* event) {
-  return reinterpret_cast<PortDescriptor*>(reinterpret_cast<char*>(event + 1));
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_EVENT_H_
diff --git a/mojo/edk/system/ports/message.cc b/mojo/edk/system/ports/message.cc
deleted file mode 100644
index 5d3c000..0000000
--- a/mojo/edk/system/ports/message.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdlib.h>
-
-#include <limits>
-
-#include "base/logging.h"
-#include "mojo/edk/system/ports/event.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-// static
-bool Message::Parse(const void* bytes,
-                    size_t num_bytes,
-                    size_t* num_header_bytes,
-                    size_t* num_payload_bytes,
-                    size_t* num_ports_bytes) {
-  if (num_bytes < sizeof(EventHeader))
-    return false;
-  const EventHeader* header = static_cast<const EventHeader*>(bytes);
-  switch (header->type) {
-    case EventType::kUser:
-      // See below.
-      break;
-    case EventType::kPortAccepted:
-      *num_header_bytes = sizeof(EventHeader);
-      break;
-    case EventType::kObserveProxy:
-      *num_header_bytes = sizeof(EventHeader) + sizeof(ObserveProxyEventData);
-      break;
-    case EventType::kObserveProxyAck:
-      *num_header_bytes =
-          sizeof(EventHeader) + sizeof(ObserveProxyAckEventData);
-      break;
-    case EventType::kObserveClosure:
-      *num_header_bytes = sizeof(EventHeader) + sizeof(ObserveClosureEventData);
-      break;
-    case EventType::kMergePort:
-      *num_header_bytes = sizeof(EventHeader) + sizeof(MergePortEventData);
-      break;
-    default:
-      return false;
-  }
-
-  if (header->type == EventType::kUser) {
-    if (num_bytes < sizeof(EventHeader) + sizeof(UserEventData))
-      return false;
-    const UserEventData* event_data =
-        reinterpret_cast<const UserEventData*>(
-            reinterpret_cast<const char*>(header + 1));
-    if (event_data->num_ports > std::numeric_limits<uint16_t>::max())
-      return false;
-    *num_header_bytes = sizeof(EventHeader) +
-                        sizeof(UserEventData) +
-                        event_data->num_ports * sizeof(PortDescriptor);
-    *num_ports_bytes = event_data->num_ports * sizeof(PortName);
-    if (num_bytes < *num_header_bytes + *num_ports_bytes)
-      return false;
-    *num_payload_bytes = num_bytes - *num_header_bytes - *num_ports_bytes;
-  } else {
-    if (*num_header_bytes != num_bytes)
-      return false;
-    *num_payload_bytes = 0;
-    *num_ports_bytes = 0;
-  }
-
-  return true;
-}
-
-Message::Message(size_t num_payload_bytes, size_t num_ports)
-    : Message(sizeof(EventHeader) + sizeof(UserEventData) +
-                  num_ports * sizeof(PortDescriptor),
-              num_payload_bytes, num_ports * sizeof(PortName)) {
-  num_ports_ = num_ports;
-}
-
-Message::Message(size_t num_header_bytes,
-                 size_t num_payload_bytes,
-                 size_t num_ports_bytes)
-    : start_(nullptr),
-      num_header_bytes_(num_header_bytes),
-      num_ports_bytes_(num_ports_bytes),
-      num_payload_bytes_(num_payload_bytes) {
-}
-
-void Message::InitializeUserMessageHeader(void* start) {
-  start_ = static_cast<char*>(start);
-  memset(start_, 0, num_header_bytes_);
-  GetMutableEventHeader(this)->type = EventType::kUser;
-  GetMutableEventData<UserEventData>(this)->num_ports =
-      static_cast<uint32_t>(num_ports_);
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/message.h b/mojo/edk/system/ports/message.h
deleted file mode 100644
index 95fa046..0000000
--- a/mojo/edk/system/ports/message.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_MESSAGE_H_
-#define MOJO_EDK_SYSTEM_PORTS_MESSAGE_H_
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "mojo/edk/system/ports/name.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-// A message consists of a header (array of bytes), payload (array of bytes)
-// and an array of ports. The header is used by the Node implementation.
-//
-// This class is designed to be subclassed, and the subclass is responsible for
-// providing the underlying storage. The header size will be aligned, and it
-// should be followed in memory by the array of ports and finally the payload.
-//
-// NOTE: This class does not manage the lifetime of the ports it references.
-class Message {
- public:
-  virtual ~Message() {}
-
-  // Inspect the message at |bytes| and return the size of each section. Returns
-  // |false| if the message is malformed and |true| otherwise.
-  static bool Parse(const void* bytes,
-                    size_t num_bytes,
-                    size_t* num_header_bytes,
-                    size_t* num_payload_bytes,
-                    size_t* num_ports_bytes);
-
-  void* mutable_header_bytes() { return start_; }
-  const void* header_bytes() const { return start_; }
-  size_t num_header_bytes() const { return num_header_bytes_; }
-
-  void* mutable_payload_bytes() {
-    return start_ + num_header_bytes_ + num_ports_bytes_;
-  }
-  const void* payload_bytes() const {
-    return const_cast<Message*>(this)->mutable_payload_bytes();
-  }
-  size_t num_payload_bytes() const { return num_payload_bytes_; }
-
-  PortName* mutable_ports() {
-    return reinterpret_cast<PortName*>(start_ + num_header_bytes_);
-  }
-  const PortName* ports() const {
-    return const_cast<Message*>(this)->mutable_ports();
-  }
-  size_t num_ports_bytes() const { return num_ports_bytes_; }
-  size_t num_ports() const { return num_ports_bytes_ / sizeof(PortName); }
-
- protected:
-  // Constructs a new Message base for a user message.
-  //
-  // Note: You MUST call InitializeUserMessageHeader() before this Message is
-  // ready for transmission.
-  Message(size_t num_payload_bytes, size_t num_ports);
-
-  // Constructs a new Message base for an internal message. Do NOT call
-  // InitializeUserMessageHeader() when using this constructor.
-  Message(size_t num_header_bytes,
-          size_t num_payload_bytes,
-          size_t num_ports_bytes);
-
-  Message(const Message& other) = delete;
-  void operator=(const Message& other) = delete;
-
-  // Initializes the header in a newly allocated message buffer to carry a
-  // user message.
-  void InitializeUserMessageHeader(void* start);
-
-  // Note: storage is [header][ports][payload].
-  char* start_ = nullptr;
-  size_t num_ports_ = 0;
-  size_t num_header_bytes_ = 0;
-  size_t num_ports_bytes_ = 0;
-  size_t num_payload_bytes_ = 0;
-};
-
-using ScopedMessage = std::unique_ptr<Message>;
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_MESSAGE_H_
diff --git a/mojo/edk/system/ports/message_filter.h b/mojo/edk/system/ports/message_filter.h
deleted file mode 100644
index bf8fa21..0000000
--- a/mojo/edk/system/ports/message_filter.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_MESSAGE_FILTER_H_
-#define MOJO_EDK_SYSTEM_PORTS_MESSAGE_FILTER_H_
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-class Message;
-
-// An interface which can be implemented to filter port messages according to
-// arbitrary policy.
-class MessageFilter {
- public:
-  virtual ~MessageFilter() {}
-
-  // Returns true of |message| should be accepted by whomever is applying this
-  // filter. See MessageQueue::GetNextMessage(), for example.
-  virtual bool Match(const Message& message) = 0;
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_MESSAGE_FILTER_H_
diff --git a/mojo/edk/system/ports/message_queue.cc b/mojo/edk/system/ports/message_queue.cc
deleted file mode 100644
index defb1b6..0000000
--- a/mojo/edk/system/ports/message_queue.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports/message_queue.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/message_filter.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-inline uint64_t GetSequenceNum(const ScopedMessage& message) {
-  return GetEventData<UserEventData>(*message)->sequence_num;
-}
-
-// Used by std::{push,pop}_heap functions
-inline bool operator<(const ScopedMessage& a, const ScopedMessage& b) {
-  return GetSequenceNum(a) > GetSequenceNum(b);
-}
-
-MessageQueue::MessageQueue() : MessageQueue(kInitialSequenceNum) {}
-
-MessageQueue::MessageQueue(uint64_t next_sequence_num)
-    : next_sequence_num_(next_sequence_num) {
-  // The message queue is blocked waiting for a message with sequence number
-  // equal to |next_sequence_num|.
-}
-
-MessageQueue::~MessageQueue() {
-#if DCHECK_IS_ON()
-  size_t num_leaked_ports = 0;
-  for (const auto& message : heap_)
-    num_leaked_ports += message->num_ports();
-  DVLOG_IF(1, num_leaked_ports > 0)
-      << "Leaking " << num_leaked_ports << " ports in unreceived messages";
-#endif
-}
-
-bool MessageQueue::HasNextMessage() const {
-  return !heap_.empty() && GetSequenceNum(heap_[0]) == next_sequence_num_;
-}
-
-void MessageQueue::GetNextMessage(ScopedMessage* message,
-                                  MessageFilter* filter) {
-  if (!HasNextMessage() || (filter && !filter->Match(*heap_[0].get()))) {
-    message->reset();
-    return;
-  }
-
-  std::pop_heap(heap_.begin(), heap_.end());
-  *message = std::move(heap_.back());
-  heap_.pop_back();
-
-  next_sequence_num_++;
-}
-
-void MessageQueue::AcceptMessage(ScopedMessage message,
-                                 bool* has_next_message) {
-  DCHECK(GetEventHeader(*message)->type == EventType::kUser);
-
-  // TODO: Handle sequence number roll-over.
-
-  heap_.emplace_back(std::move(message));
-  std::push_heap(heap_.begin(), heap_.end());
-
-  if (!signalable_) {
-    *has_next_message = false;
-  } else {
-    *has_next_message = (GetSequenceNum(heap_[0]) == next_sequence_num_);
-  }
-}
-
-void MessageQueue::GetReferencedPorts(std::deque<PortName>* port_names) {
-  for (const auto& message : heap_) {
-    for (size_t i = 0; i < message->num_ports(); ++i)
-      port_names->push_back(message->ports()[i]);
-  }
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/message_queue.h b/mojo/edk/system/ports/message_queue.h
deleted file mode 100644
index d9a47ed..0000000
--- a/mojo/edk/system/ports/message_queue.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_MESSAGE_QUEUE_H_
-#define MOJO_EDK_SYSTEM_PORTS_MESSAGE_QUEUE_H_
-
-#include <stdint.h>
-
-#include <deque>
-#include <functional>
-#include <limits>
-#include <vector>
-
-#include "base/macros.h"
-#include "mojo/edk/system/ports/message.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-const uint64_t kInitialSequenceNum = 1;
-const uint64_t kInvalidSequenceNum = std::numeric_limits<uint64_t>::max();
-
-class MessageFilter;
-
-// An incoming message queue for a port. MessageQueue keeps track of the highest
-// known sequence number and can indicate whether the next sequential message is
-// available. Thus the queue enforces message ordering for the consumer without
-// enforcing it for the producer (see AcceptMessage() below.)
-class MessageQueue {
- public:
-  explicit MessageQueue();
-  explicit MessageQueue(uint64_t next_sequence_num);
-  ~MessageQueue();
-
-  void set_signalable(bool value) { signalable_ = value; }
-
-  uint64_t next_sequence_num() const { return next_sequence_num_; }
-
-  bool HasNextMessage() const;
-
-  // Gives ownership of the message. If |filter| is non-null, the next message
-  // will only be retrieved if the filter successfully matches it.
-  void GetNextMessage(ScopedMessage* message, MessageFilter* filter);
-
-  // Takes ownership of the message. Note: Messages are ordered, so while we
-  // have added a message to the queue, we may still be waiting on a message
-  // ahead of this one before we can let any of the messages be returned by
-  // GetNextMessage.
-  //
-  // Furthermore, once has_next_message is set to true, it will remain false
-  // until GetNextMessage is called enough times to return a null message.
-  // In other words, has_next_message acts like an edge trigger.
-  //
-  void AcceptMessage(ScopedMessage message, bool* has_next_message);
-
-  // Returns all of the ports referenced by messages in this message queue.
-  void GetReferencedPorts(std::deque<PortName>* ports);
-
- private:
-  std::vector<ScopedMessage> heap_;
-  uint64_t next_sequence_num_;
-  bool signalable_ = true;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageQueue);
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_MESSAGE_QUEUE_H_
diff --git a/mojo/edk/system/ports/name.cc b/mojo/edk/system/ports/name.cc
deleted file mode 100644
index ea17698..0000000
--- a/mojo/edk/system/ports/name.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports/name.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-extern const PortName kInvalidPortName = {0, 0};
-
-extern const NodeName kInvalidNodeName = {0, 0};
-
-std::ostream& operator<<(std::ostream& stream, const Name& name) {
-  std::ios::fmtflags flags(stream.flags());
-  stream << std::hex << std::uppercase << name.v1;
-  if (name.v2 != 0)
-    stream << '.' << name.v2;
-  stream.flags(flags);
-  return stream;
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/name.h b/mojo/edk/system/ports/name.h
deleted file mode 100644
index 72e41b9..0000000
--- a/mojo/edk/system/ports/name.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_NAME_H_
-#define MOJO_EDK_SYSTEM_PORTS_NAME_H_
-
-#include <stdint.h>
-
-#include <ostream>
-#include <tuple>
-
-#include "base/hash.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-struct Name {
-  Name(uint64_t v1, uint64_t v2) : v1(v1), v2(v2) {}
-  uint64_t v1, v2;
-};
-
-inline bool operator==(const Name& a, const Name& b) {
-  return a.v1 == b.v1 && a.v2 == b.v2;
-}
-
-inline bool operator!=(const Name& a, const Name& b) {
-  return !(a == b);
-}
-
-inline bool operator<(const Name& a, const Name& b) {
-  return std::tie(a.v1, a.v2) < std::tie(b.v1, b.v2);
-}
-
-std::ostream& operator<<(std::ostream& stream, const Name& name);
-
-struct PortName : Name {
-  PortName() : Name(0, 0) {}
-  PortName(uint64_t v1, uint64_t v2) : Name(v1, v2) {}
-};
-
-extern const PortName kInvalidPortName;
-
-struct NodeName : Name {
-  NodeName() : Name(0, 0) {}
-  NodeName(uint64_t v1, uint64_t v2) : Name(v1, v2) {}
-};
-
-extern const NodeName kInvalidNodeName;
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-namespace std {
-
-template <>
-struct hash<mojo::edk::ports::PortName> {
-  std::size_t operator()(const mojo::edk::ports::PortName& name) const {
-    return base::HashInts64(name.v1, name.v2);
-  }
-};
-
-template <>
-struct hash<mojo::edk::ports::NodeName> {
-  std::size_t operator()(const mojo::edk::ports::NodeName& name) const {
-    return base::HashInts64(name.v1, name.v2);
-  }
-};
-
-}  // namespace std
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_NAME_H_
diff --git a/mojo/edk/system/ports/node.cc b/mojo/edk/system/ports/node.cc
deleted file mode 100644
index f9a3feb..0000000
--- a/mojo/edk/system/ports/node.cc
+++ /dev/null
@@ -1,1385 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports/node.h"
-
-#include <string.h>
-
-#include <utility>
-
-#include "base/atomicops.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/system/ports/node_delegate.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-namespace {
-
-int DebugError(const char* message, int error_code) {
-  CHECK(false) << "Oops: " << message;
-  return error_code;
-}
-
-#define OOPS(x) DebugError(#x, x)
-
-bool CanAcceptMoreMessages(const Port* port) {
-  // Have we already doled out the last message (i.e., do we expect to NOT
-  // receive further messages)?
-  uint64_t next_sequence_num = port->message_queue.next_sequence_num();
-  if (port->state == Port::kClosed)
-    return false;
-  if (port->peer_closed || port->remove_proxy_on_last_message) {
-    if (port->last_sequence_num_to_receive == next_sequence_num - 1)
-      return false;
-  }
-  return true;
-}
-
-}  // namespace
-
-class Node::LockedPort {
- public:
-  explicit LockedPort(Port* port) : port_(port) {
-    port_->lock.AssertAcquired();
-  }
-
-  Port* get() const { return port_; }
-  Port* operator->() const { return port_; }
-
- private:
-  Port* const port_;
-};
-
-Node::Node(const NodeName& name, NodeDelegate* delegate)
-    : name_(name),
-      delegate_(delegate) {
-}
-
-Node::~Node() {
-  if (!ports_.empty())
-    DLOG(WARNING) << "Unclean shutdown for node " << name_;
-}
-
-bool Node::CanShutdownCleanly(ShutdownPolicy policy) {
-  base::AutoLock ports_lock(ports_lock_);
-
-  if (policy == ShutdownPolicy::DONT_ALLOW_LOCAL_PORTS) {
-#if DCHECK_IS_ON()
-    for (auto entry : ports_) {
-      DVLOG(2) << "Port " << entry.first << " referencing node "
-               << entry.second->peer_node_name << " is blocking shutdown of "
-               << "node " << name_ << " (state=" << entry.second->state << ")";
-    }
-#endif
-    return ports_.empty();
-  }
-
-  DCHECK_EQ(policy, ShutdownPolicy::ALLOW_LOCAL_PORTS);
-
-  // NOTE: This is not efficient, though it probably doesn't need to be since
-  // relatively few ports should be open during shutdown and shutdown doesn't
-  // need to be blazingly fast.
-  bool can_shutdown = true;
-  for (auto entry : ports_) {
-    base::AutoLock lock(entry.second->lock);
-    if (entry.second->peer_node_name != name_ &&
-        entry.second->state != Port::kReceiving) {
-      can_shutdown = false;
-#if DCHECK_IS_ON()
-      DVLOG(2) << "Port " << entry.first << " referencing node "
-               << entry.second->peer_node_name << " is blocking shutdown of "
-               << "node " << name_ << " (state=" << entry.second->state << ")";
-#else
-      // Exit early when not debugging.
-      break;
-#endif
-    }
-  }
-
-  return can_shutdown;
-}
-
-int Node::GetPort(const PortName& port_name, PortRef* port_ref) {
-  scoped_refptr<Port> port = GetPort(port_name);
-  if (!port)
-    return ERROR_PORT_UNKNOWN;
-
-  *port_ref = PortRef(port_name, std::move(port));
-  return OK;
-}
-
-int Node::CreateUninitializedPort(PortRef* port_ref) {
-  PortName port_name;
-  delegate_->GenerateRandomPortName(&port_name);
-
-  scoped_refptr<Port> port(new Port(kInitialSequenceNum, kInitialSequenceNum));
-  int rv = AddPortWithName(port_name, port);
-  if (rv != OK)
-    return rv;
-
-  *port_ref = PortRef(port_name, std::move(port));
-  return OK;
-}
-
-int Node::InitializePort(const PortRef& port_ref,
-                         const NodeName& peer_node_name,
-                         const PortName& peer_port_name) {
-  Port* port = port_ref.port();
-
-  {
-    base::AutoLock lock(port->lock);
-    if (port->state != Port::kUninitialized)
-      return ERROR_PORT_STATE_UNEXPECTED;
-
-    port->state = Port::kReceiving;
-    port->peer_node_name = peer_node_name;
-    port->peer_port_name = peer_port_name;
-  }
-
-  delegate_->PortStatusChanged(port_ref);
-
-  return OK;
-}
-
-int Node::CreatePortPair(PortRef* port0_ref, PortRef* port1_ref) {
-  int rv;
-
-  rv = CreateUninitializedPort(port0_ref);
-  if (rv != OK)
-    return rv;
-
-  rv = CreateUninitializedPort(port1_ref);
-  if (rv != OK)
-    return rv;
-
-  rv = InitializePort(*port0_ref, name_, port1_ref->name());
-  if (rv != OK)
-    return rv;
-
-  rv = InitializePort(*port1_ref, name_, port0_ref->name());
-  if (rv != OK)
-    return rv;
-
-  return OK;
-}
-
-int Node::SetUserData(const PortRef& port_ref,
-                      scoped_refptr<UserData> user_data) {
-  Port* port = port_ref.port();
-
-  base::AutoLock lock(port->lock);
-  if (port->state == Port::kClosed)
-    return ERROR_PORT_STATE_UNEXPECTED;
-
-  port->user_data = std::move(user_data);
-
-  return OK;
-}
-
-int Node::GetUserData(const PortRef& port_ref,
-                      scoped_refptr<UserData>* user_data) {
-  Port* port = port_ref.port();
-
-  base::AutoLock lock(port->lock);
-  if (port->state == Port::kClosed)
-    return ERROR_PORT_STATE_UNEXPECTED;
-
-  *user_data = port->user_data;
-
-  return OK;
-}
-
-int Node::ClosePort(const PortRef& port_ref) {
-  std::deque<PortName> referenced_port_names;
-
-  ObserveClosureEventData data;
-
-  NodeName peer_node_name;
-  PortName peer_port_name;
-  Port* port = port_ref.port();
-  {
-    // We may need to erase the port, which requires ports_lock_ to be held,
-    // but ports_lock_ must be acquired before any individual port locks.
-    base::AutoLock ports_lock(ports_lock_);
-
-    base::AutoLock lock(port->lock);
-    if (port->state == Port::kUninitialized) {
-      // If the port was not yet initialized, there's nothing interesting to do.
-      ErasePort_Locked(port_ref.name());
-      return OK;
-    }
-
-    if (port->state != Port::kReceiving)
-      return ERROR_PORT_STATE_UNEXPECTED;
-
-    port->state = Port::kClosed;
-
-    // We pass along the sequence number of the last message sent from this
-    // port to allow the peer to have the opportunity to consume all inbound
-    // messages before notifying the embedder that this port is closed.
-    data.last_sequence_num = port->next_sequence_num_to_send - 1;
-
-    peer_node_name = port->peer_node_name;
-    peer_port_name = port->peer_port_name;
-
-    // If the port being closed still has unread messages, then we need to take
-    // care to close those ports so as to avoid leaking memory.
-    port->message_queue.GetReferencedPorts(&referenced_port_names);
-
-    ErasePort_Locked(port_ref.name());
-  }
-
-  DVLOG(2) << "Sending ObserveClosure from " << port_ref.name() << "@" << name_
-           << " to " << peer_port_name << "@" << peer_node_name;
-
-  delegate_->ForwardMessage(
-      peer_node_name,
-      NewInternalMessage(peer_port_name, EventType::kObserveClosure, data));
-
-  for (const auto& name : referenced_port_names) {
-    PortRef ref;
-    if (GetPort(name, &ref) == OK)
-      ClosePort(ref);
-  }
-  return OK;
-}
-
-int Node::GetStatus(const PortRef& port_ref, PortStatus* port_status) {
-  Port* port = port_ref.port();
-
-  base::AutoLock lock(port->lock);
-
-  if (port->state != Port::kReceiving)
-    return ERROR_PORT_STATE_UNEXPECTED;
-
-  port_status->has_messages = port->message_queue.HasNextMessage();
-  port_status->receiving_messages = CanAcceptMoreMessages(port);
-  port_status->peer_closed = port->peer_closed;
-  return OK;
-}
-
-int Node::GetMessage(const PortRef& port_ref,
-                     ScopedMessage* message,
-                     MessageFilter* filter) {
-  *message = nullptr;
-
-  DVLOG(4) << "GetMessage for " << port_ref.name() << "@" << name_;
-
-  Port* port = port_ref.port();
-  {
-    base::AutoLock lock(port->lock);
-
-    // This could also be treated like the port being unknown since the
-    // embedder should no longer be referring to a port that has been sent.
-    if (port->state != Port::kReceiving)
-      return ERROR_PORT_STATE_UNEXPECTED;
-
-    // Let the embedder get messages until there are no more before reporting
-    // that the peer closed its end.
-    if (!CanAcceptMoreMessages(port))
-      return ERROR_PORT_PEER_CLOSED;
-
-    port->message_queue.GetNextMessage(message, filter);
-  }
-
-  // Allow referenced ports to trigger PortStatusChanged calls.
-  if (*message) {
-    for (size_t i = 0; i < (*message)->num_ports(); ++i) {
-      const PortName& new_port_name = (*message)->ports()[i];
-      scoped_refptr<Port> new_port = GetPort(new_port_name);
-
-      DCHECK(new_port) << "Port " << new_port_name << "@" << name_
-                       << " does not exist!";
-
-      base::AutoLock lock(new_port->lock);
-
-      DCHECK(new_port->state == Port::kReceiving);
-      new_port->message_queue.set_signalable(true);
-    }
-  }
-
-  return OK;
-}
-
-int Node::SendMessage(const PortRef& port_ref, ScopedMessage message) {
-  int rv = SendMessageInternal(port_ref, &message);
-  if (rv != OK) {
-    // If send failed, close all carried ports. Note that we're careful not to
-    // close the sending port itself if it happened to be one of the encoded
-    // ports (an invalid but possible condition.)
-    for (size_t i = 0; i < message->num_ports(); ++i) {
-      if (message->ports()[i] == port_ref.name())
-        continue;
-
-      PortRef port;
-      if (GetPort(message->ports()[i], &port) == OK)
-        ClosePort(port);
-    }
-  }
-  return rv;
-}
-
-int Node::AcceptMessage(ScopedMessage message) {
-  const EventHeader* header = GetEventHeader(*message);
-  switch (header->type) {
-    case EventType::kUser:
-      return OnUserMessage(std::move(message));
-    case EventType::kPortAccepted:
-      return OnPortAccepted(header->port_name);
-    case EventType::kObserveProxy:
-      return OnObserveProxy(
-          header->port_name,
-          *GetEventData<ObserveProxyEventData>(*message));
-    case EventType::kObserveProxyAck:
-      return OnObserveProxyAck(
-          header->port_name,
-          GetEventData<ObserveProxyAckEventData>(*message)->last_sequence_num);
-    case EventType::kObserveClosure:
-      return OnObserveClosure(
-          header->port_name,
-          GetEventData<ObserveClosureEventData>(*message)->last_sequence_num);
-    case EventType::kMergePort:
-      return OnMergePort(header->port_name,
-                         *GetEventData<MergePortEventData>(*message));
-  }
-  return OOPS(ERROR_NOT_IMPLEMENTED);
-}
-
-int Node::MergePorts(const PortRef& port_ref,
-                     const NodeName& destination_node_name,
-                     const PortName& destination_port_name) {
-  Port* port = port_ref.port();
-  MergePortEventData data;
-  {
-    base::AutoLock lock(port->lock);
-
-    DVLOG(1) << "Sending MergePort from " << port_ref.name() << "@" << name_
-             << " to " << destination_port_name << "@" << destination_node_name;
-
-    // Send the port-to-merge over to the destination node so it can be merged
-    // into the port cycle atomically there.
-    data.new_port_name = port_ref.name();
-    WillSendPort(LockedPort(port), destination_node_name, &data.new_port_name,
-                 &data.new_port_descriptor);
-  }
-  delegate_->ForwardMessage(
-      destination_node_name,
-      NewInternalMessage(destination_port_name,
-                         EventType::kMergePort, data));
-  return OK;
-}
-
-int Node::MergeLocalPorts(const PortRef& port0_ref, const PortRef& port1_ref) {
-  Port* port0 = port0_ref.port();
-  Port* port1 = port1_ref.port();
-  int rv;
-  {
-    // |ports_lock_| must be held when acquiring overlapping port locks.
-    base::AutoLock ports_lock(ports_lock_);
-    base::AutoLock port0_lock(port0->lock);
-    base::AutoLock port1_lock(port1->lock);
-
-    DVLOG(1) << "Merging local ports " << port0_ref.name() << "@" << name_
-             << " and " << port1_ref.name() << "@" << name_;
-
-    if (port0->state != Port::kReceiving || port1->state != Port::kReceiving)
-      rv = ERROR_PORT_STATE_UNEXPECTED;
-    else
-      rv = MergePorts_Locked(port0_ref, port1_ref);
-  }
-
-  if (rv != OK) {
-    ClosePort(port0_ref);
-    ClosePort(port1_ref);
-  }
-
-  return rv;
-}
-
-int Node::LostConnectionToNode(const NodeName& node_name) {
-  // We can no longer send events to the given node. We also can't expect any
-  // PortAccepted events.
-
-  DVLOG(1) << "Observing lost connection from node " << name_
-           << " to node " << node_name;
-
-  DestroyAllPortsWithPeer(node_name, kInvalidPortName);
-  return OK;
-}
-
-int Node::OnUserMessage(ScopedMessage message) {
-  PortName port_name = GetEventHeader(*message)->port_name;
-  const auto* event = GetEventData<UserEventData>(*message);
-
-#if DCHECK_IS_ON()
-  std::ostringstream ports_buf;
-  for (size_t i = 0; i < message->num_ports(); ++i) {
-    if (i > 0)
-      ports_buf << ",";
-    ports_buf << message->ports()[i];
-  }
-
-  DVLOG(4) << "AcceptMessage " << event->sequence_num
-             << " [ports=" << ports_buf.str() << "] at "
-             << port_name << "@" << name_;
-#endif
-
-  scoped_refptr<Port> port = GetPort(port_name);
-
-  // Even if this port does not exist, cannot receive anymore messages or is
-  // buffering or proxying messages, we still need these ports to be bound to
-  // this node. When the message is forwarded, these ports will get transferred
-  // following the usual method. If the message cannot be accepted, then the
-  // newly bound ports will simply be closed.
-
-  for (size_t i = 0; i < message->num_ports(); ++i) {
-    int rv = AcceptPort(message->ports()[i], GetPortDescriptors(event)[i]);
-    if (rv != OK)
-      return rv;
-  }
-
-  bool has_next_message = false;
-  bool message_accepted = false;
-
-  if (port) {
-    // We may want to forward messages once the port lock is held, so we must
-    // acquire |ports_lock_| first.
-    base::AutoLock ports_lock(ports_lock_);
-    base::AutoLock lock(port->lock);
-
-    // Reject spurious messages if we've already received the last expected
-    // message.
-    if (CanAcceptMoreMessages(port.get())) {
-      message_accepted = true;
-      port->message_queue.AcceptMessage(std::move(message), &has_next_message);
-
-      if (port->state == Port::kBuffering) {
-        has_next_message = false;
-      } else if (port->state == Port::kProxying) {
-        has_next_message = false;
-
-        // Forward messages. We forward messages in sequential order here so
-        // that we maintain the message queue's notion of next sequence number.
-        // That's useful for the proxy removal process as we can tell when this
-        // port has seen all of the messages it is expected to see.
-        int rv = ForwardMessages_Locked(LockedPort(port.get()), port_name);
-        if (rv != OK)
-          return rv;
-
-        MaybeRemoveProxy_Locked(LockedPort(port.get()), port_name);
-      }
-    }
-  }
-
-  if (!message_accepted) {
-    DVLOG(2) << "Message not accepted!\n";
-    // Close all newly accepted ports as they are effectively orphaned.
-    for (size_t i = 0; i < message->num_ports(); ++i) {
-      PortRef port_ref;
-      if (GetPort(message->ports()[i], &port_ref) == OK) {
-        ClosePort(port_ref);
-      } else {
-        DLOG(WARNING) << "Cannot close non-existent port!\n";
-      }
-    }
-  } else if (has_next_message) {
-    PortRef port_ref(port_name, port);
-    delegate_->PortStatusChanged(port_ref);
-  }
-
-  return OK;
-}
-
-int Node::OnPortAccepted(const PortName& port_name) {
-  scoped_refptr<Port> port = GetPort(port_name);
-  if (!port)
-    return ERROR_PORT_UNKNOWN;
-
-  DVLOG(2) << "PortAccepted at " << port_name << "@" << name_
-           << " pointing to "
-           << port->peer_port_name << "@" << port->peer_node_name;
-
-  return BeginProxying(PortRef(port_name, std::move(port)));
-}
-
-int Node::OnObserveProxy(const PortName& port_name,
-                         const ObserveProxyEventData& event) {
-  if (port_name == kInvalidPortName) {
-    // An ObserveProxy with an invalid target port name is a broadcast used to
-    // inform ports when their peer (which was itself a proxy) has become
-    // defunct due to unexpected node disconnection.
-    //
-    // Receiving ports affected by this treat it as equivalent to peer closure.
-    // Proxies affected by this can be removed and will in turn broadcast their
-    // own death with a similar message.
-    CHECK_EQ(event.proxy_to_node_name, kInvalidNodeName);
-    CHECK_EQ(event.proxy_to_port_name, kInvalidPortName);
-    DestroyAllPortsWithPeer(event.proxy_node_name, event.proxy_port_name);
-    return OK;
-  }
-
-  // The port may have already been closed locally, in which case the
-  // ObserveClosure message will contain the last_sequence_num field.
-  // We can then silently ignore this message.
-  scoped_refptr<Port> port = GetPort(port_name);
-  if (!port) {
-    DVLOG(1) << "ObserveProxy: " << port_name << "@" << name_ << " not found";
-    return OK;
-  }
-
-  DVLOG(2) << "ObserveProxy at " << port_name << "@" << name_ << ", proxy at "
-           << event.proxy_port_name << "@"
-           << event.proxy_node_name << " pointing to "
-           << event.proxy_to_port_name << "@"
-           << event.proxy_to_node_name;
-
-  {
-    base::AutoLock lock(port->lock);
-
-    if (port->peer_node_name == event.proxy_node_name &&
-        port->peer_port_name == event.proxy_port_name) {
-      if (port->state == Port::kReceiving) {
-        port->peer_node_name = event.proxy_to_node_name;
-        port->peer_port_name = event.proxy_to_port_name;
-
-        ObserveProxyAckEventData ack;
-        ack.last_sequence_num = port->next_sequence_num_to_send - 1;
-
-        delegate_->ForwardMessage(
-            event.proxy_node_name,
-            NewInternalMessage(event.proxy_port_name,
-                               EventType::kObserveProxyAck,
-                               ack));
-      } else {
-        // As a proxy ourselves, we don't know how to honor the ObserveProxy
-        // event or to populate the last_sequence_num field of ObserveProxyAck.
-        // Afterall, another port could be sending messages to our peer now
-        // that we've sent out our own ObserveProxy event.  Instead, we will
-        // send an ObserveProxyAck indicating that the ObserveProxy event
-        // should be re-sent (last_sequence_num set to kInvalidSequenceNum).
-        // However, this has to be done after we are removed as a proxy.
-        // Otherwise, we might just find ourselves back here again, which
-        // would be akin to a busy loop.
-
-        DVLOG(2) << "Delaying ObserveProxyAck to "
-                 << event.proxy_port_name << "@" << event.proxy_node_name;
-
-        ObserveProxyAckEventData ack;
-        ack.last_sequence_num = kInvalidSequenceNum;
-
-        port->send_on_proxy_removal.reset(
-            new std::pair<NodeName, ScopedMessage>(
-                event.proxy_node_name,
-                NewInternalMessage(event.proxy_port_name,
-                                   EventType::kObserveProxyAck,
-                                   ack)));
-      }
-    } else {
-      // Forward this event along to our peer. Eventually, it should find the
-      // port referring to the proxy.
-      delegate_->ForwardMessage(
-          port->peer_node_name,
-          NewInternalMessage(port->peer_port_name,
-                             EventType::kObserveProxy,
-                             event));
-    }
-  }
-  return OK;
-}
-
-int Node::OnObserveProxyAck(const PortName& port_name,
-                            uint64_t last_sequence_num) {
-  DVLOG(2) << "ObserveProxyAck at " << port_name << "@" << name_
-           << " (last_sequence_num=" << last_sequence_num << ")";
-
-  scoped_refptr<Port> port = GetPort(port_name);
-  if (!port)
-    return ERROR_PORT_UNKNOWN;  // The port may have observed closure first, so
-                                // this is not an "Oops".
-
-  {
-    base::AutoLock lock(port->lock);
-
-    if (port->state != Port::kProxying)
-      return OOPS(ERROR_PORT_STATE_UNEXPECTED);
-
-    if (last_sequence_num == kInvalidSequenceNum) {
-      // Send again.
-      InitiateProxyRemoval(LockedPort(port.get()), port_name);
-      return OK;
-    }
-
-    // We can now remove this port once we have received and forwarded the last
-    // message addressed to this port.
-    port->remove_proxy_on_last_message = true;
-    port->last_sequence_num_to_receive = last_sequence_num;
-  }
-  TryRemoveProxy(PortRef(port_name, std::move(port)));
-  return OK;
-}
-
-int Node::OnObserveClosure(const PortName& port_name,
-                           uint64_t last_sequence_num) {
-  // OK if the port doesn't exist, as it may have been closed already.
-  scoped_refptr<Port> port = GetPort(port_name);
-  if (!port)
-    return OK;
-
-  // This message tells the port that it should no longer expect more messages
-  // beyond last_sequence_num. This message is forwarded along until we reach
-  // the receiving end, and this message serves as an equivalent to
-  // ObserveProxyAck.
-
-  bool notify_delegate = false;
-  ObserveClosureEventData forwarded_data;
-  NodeName peer_node_name;
-  PortName peer_port_name;
-  bool try_remove_proxy = false;
-  {
-    base::AutoLock lock(port->lock);
-
-    port->peer_closed = true;
-    port->last_sequence_num_to_receive = last_sequence_num;
-
-    DVLOG(2) << "ObserveClosure at " << port_name << "@" << name_
-             << " (state=" << port->state << ") pointing to "
-             << port->peer_port_name << "@" << port->peer_node_name
-             << " (last_sequence_num=" << last_sequence_num << ")";
-
-    // We always forward ObserveClosure, even beyond the receiving port which
-    // cares about it. This ensures that any dead-end proxies beyond that port
-    // are notified to remove themselves.
-
-    if (port->state == Port::kReceiving) {
-      notify_delegate = true;
-
-      // When forwarding along the other half of the port cycle, this will only
-      // reach dead-end proxies. Tell them we've sent our last message so they
-      // can go away.
-      //
-      // TODO: Repurposing ObserveClosure for this has the desired result but
-      // may be semantically confusing since the forwarding port is not actually
-      // closed. Consider replacing this with a new event type.
-      forwarded_data.last_sequence_num = port->next_sequence_num_to_send - 1;
-    } else {
-      // We haven't yet reached the receiving peer of the closed port, so
-      // forward the message along as-is.
-      forwarded_data.last_sequence_num = last_sequence_num;
-
-      // See about removing the port if it is a proxy as our peer won't be able
-      // to participate in proxy removal.
-      port->remove_proxy_on_last_message = true;
-      if (port->state == Port::kProxying)
-        try_remove_proxy = true;
-    }
-
-    DVLOG(2) << "Forwarding ObserveClosure from "
-             << port_name << "@" << name_ << " to peer "
-             << port->peer_port_name << "@" << port->peer_node_name
-             << " (last_sequence_num=" << forwarded_data.last_sequence_num
-             << ")";
-
-    peer_node_name = port->peer_node_name;
-    peer_port_name = port->peer_port_name;
-  }
-  if (try_remove_proxy)
-    TryRemoveProxy(PortRef(port_name, port));
-
-  delegate_->ForwardMessage(
-      peer_node_name,
-      NewInternalMessage(peer_port_name, EventType::kObserveClosure,
-                         forwarded_data));
-
-  if (notify_delegate) {
-    PortRef port_ref(port_name, std::move(port));
-    delegate_->PortStatusChanged(port_ref);
-  }
-  return OK;
-}
-
-int Node::OnMergePort(const PortName& port_name,
-                      const MergePortEventData& event) {
-  scoped_refptr<Port> port = GetPort(port_name);
-
-  DVLOG(1) << "MergePort at " << port_name << "@" << name_ << " (state="
-           << (port ? port->state : -1) << ") merging with proxy "
-           << event.new_port_name
-           << "@" << name_ << " pointing to "
-           << event.new_port_descriptor.peer_port_name << "@"
-           << event.new_port_descriptor.peer_node_name << " referred by "
-           << event.new_port_descriptor.referring_port_name << "@"
-           << event.new_port_descriptor.referring_node_name;
-
-  bool close_target_port = false;
-  bool close_new_port = false;
-
-  // Accept the new port. This is now the receiving end of the other port cycle
-  // to be merged with ours.
-  int rv = AcceptPort(event.new_port_name, event.new_port_descriptor);
-  if (rv != OK) {
-    close_target_port = true;
-  } else if (port) {
-    // BeginProxying_Locked may call MaybeRemoveProxy_Locked, which in turn
-    // needs to hold |ports_lock_|. We also acquire multiple port locks within.
-    base::AutoLock ports_lock(ports_lock_);
-    base::AutoLock lock(port->lock);
-
-    if (port->state != Port::kReceiving) {
-      close_new_port = true;
-    } else {
-      scoped_refptr<Port> new_port = GetPort_Locked(event.new_port_name);
-      base::AutoLock new_port_lock(new_port->lock);
-      DCHECK(new_port->state == Port::kReceiving);
-
-      // Both ports are locked. Now all we have to do is swap their peer
-      // information and set them up as proxies.
-
-      PortRef port0_ref(port_name, port);
-      PortRef port1_ref(event.new_port_name, new_port);
-      int rv = MergePorts_Locked(port0_ref, port1_ref);
-      if (rv == OK)
-        return rv;
-
-      close_new_port = true;
-      close_target_port = true;
-    }
-  } else {
-    close_new_port = true;
-  }
-
-  if (close_target_port) {
-    PortRef target_port;
-    rv = GetPort(port_name, &target_port);
-    DCHECK(rv == OK);
-
-    ClosePort(target_port);
-  }
-
-  if (close_new_port) {
-    PortRef new_port;
-    rv = GetPort(event.new_port_name, &new_port);
-    DCHECK(rv == OK);
-
-    ClosePort(new_port);
-  }
-
-  return ERROR_PORT_STATE_UNEXPECTED;
-}
-
-int Node::AddPortWithName(const PortName& port_name, scoped_refptr<Port> port) {
-  base::AutoLock lock(ports_lock_);
-
-  if (!ports_.insert(std::make_pair(port_name, std::move(port))).second)
-    return OOPS(ERROR_PORT_EXISTS);  // Suggests a bad UUID generator.
-
-  DVLOG(2) << "Created port " << port_name << "@" << name_;
-  return OK;
-}
-
-void Node::ErasePort(const PortName& port_name) {
-  base::AutoLock lock(ports_lock_);
-  ErasePort_Locked(port_name);
-}
-
-void Node::ErasePort_Locked(const PortName& port_name) {
-  ports_lock_.AssertAcquired();
-  ports_.erase(port_name);
-  DVLOG(2) << "Deleted port " << port_name << "@" << name_;
-}
-
-scoped_refptr<Port> Node::GetPort(const PortName& port_name) {
-  base::AutoLock lock(ports_lock_);
-  return GetPort_Locked(port_name);
-}
-
-scoped_refptr<Port> Node::GetPort_Locked(const PortName& port_name) {
-  ports_lock_.AssertAcquired();
-  auto iter = ports_.find(port_name);
-  if (iter == ports_.end())
-    return nullptr;
-
-#if (defined(OS_ANDROID) || defined(__ANDROID__)) && defined(ARCH_CPU_ARM64)
-  // Workaround for https://crbug.com/665869.
-  base::subtle::MemoryBarrier();
-#endif
-
-  return iter->second;
-}
-
-int Node::SendMessageInternal(const PortRef& port_ref, ScopedMessage* message) {
-  ScopedMessage& m = *message;
-  for (size_t i = 0; i < m->num_ports(); ++i) {
-    if (m->ports()[i] == port_ref.name())
-      return ERROR_PORT_CANNOT_SEND_SELF;
-  }
-
-  Port* port = port_ref.port();
-  NodeName peer_node_name;
-  {
-    // We must acquire |ports_lock_| before grabbing any port locks, because
-    // WillSendMessage_Locked may need to lock multiple ports out of order.
-    base::AutoLock ports_lock(ports_lock_);
-    base::AutoLock lock(port->lock);
-
-    if (port->state != Port::kReceiving)
-      return ERROR_PORT_STATE_UNEXPECTED;
-
-    if (port->peer_closed)
-      return ERROR_PORT_PEER_CLOSED;
-
-    int rv = WillSendMessage_Locked(LockedPort(port), port_ref.name(), m.get());
-    if (rv != OK)
-      return rv;
-
-    // Beyond this point there's no sense in returning anything but OK. Even if
-    // message forwarding or acceptance fails, there's nothing the embedder can
-    // do to recover. Assume that failure beyond this point must be treated as a
-    // transport failure.
-
-    peer_node_name = port->peer_node_name;
-  }
-
-  if (peer_node_name != name_) {
-    delegate_->ForwardMessage(peer_node_name, std::move(m));
-    return OK;
-  }
-
-  int rv = AcceptMessage(std::move(m));
-  if (rv != OK) {
-    // See comment above for why we don't return an error in this case.
-    DVLOG(2) << "AcceptMessage failed: " << rv;
-  }
-
-  return OK;
-}
-
-int Node::MergePorts_Locked(const PortRef& port0_ref,
-                            const PortRef& port1_ref) {
-  Port* port0 = port0_ref.port();
-  Port* port1 = port1_ref.port();
-
-  ports_lock_.AssertAcquired();
-  port0->lock.AssertAcquired();
-  port1->lock.AssertAcquired();
-
-  CHECK(port0->state == Port::kReceiving);
-  CHECK(port1->state == Port::kReceiving);
-
-  // Ports cannot be merged with their own receiving peer!
-  if (port0->peer_node_name == name_ &&
-      port0->peer_port_name == port1_ref.name())
-    return ERROR_PORT_STATE_UNEXPECTED;
-
-  if (port1->peer_node_name == name_ &&
-      port1->peer_port_name == port0_ref.name())
-    return ERROR_PORT_STATE_UNEXPECTED;
-
-  // Only merge if both ports have never sent a message.
-  if (port0->next_sequence_num_to_send == kInitialSequenceNum &&
-      port1->next_sequence_num_to_send == kInitialSequenceNum) {
-    // Swap the ports' peer information and switch them both into buffering
-    // (eventually proxying) mode.
-
-    std::swap(port0->peer_node_name, port1->peer_node_name);
-    std::swap(port0->peer_port_name, port1->peer_port_name);
-
-    port0->state = Port::kBuffering;
-    if (port0->peer_closed)
-      port0->remove_proxy_on_last_message = true;
-
-    port1->state = Port::kBuffering;
-    if (port1->peer_closed)
-      port1->remove_proxy_on_last_message = true;
-
-    int rv1 = BeginProxying_Locked(LockedPort(port0), port0_ref.name());
-    int rv2 = BeginProxying_Locked(LockedPort(port1), port1_ref.name());
-
-    if (rv1 == OK && rv2 == OK) {
-      // If either merged port had a closed peer, its new peer needs to be
-      // informed of this.
-      if (port1->peer_closed) {
-        ObserveClosureEventData data;
-        data.last_sequence_num = port0->last_sequence_num_to_receive;
-        delegate_->ForwardMessage(
-            port0->peer_node_name,
-            NewInternalMessage(port0->peer_port_name,
-                               EventType::kObserveClosure, data));
-      }
-
-      if (port0->peer_closed) {
-        ObserveClosureEventData data;
-        data.last_sequence_num = port1->last_sequence_num_to_receive;
-        delegate_->ForwardMessage(
-            port1->peer_node_name,
-            NewInternalMessage(port1->peer_port_name,
-                               EventType::kObserveClosure, data));
-      }
-
-      return OK;
-    }
-
-    // If either proxy failed to initialize (e.g. had undeliverable messages
-    // or ended up in a bad state somehow), we keep the system in a consistent
-    // state by undoing the peer swap.
-    std::swap(port0->peer_node_name, port1->peer_node_name);
-    std::swap(port0->peer_port_name, port1->peer_port_name);
-    port0->remove_proxy_on_last_message = false;
-    port1->remove_proxy_on_last_message = false;
-    port0->state = Port::kReceiving;
-    port1->state = Port::kReceiving;
-  }
-
-  return ERROR_PORT_STATE_UNEXPECTED;
-}
-
-void Node::WillSendPort(const LockedPort& port,
-                        const NodeName& to_node_name,
-                        PortName* port_name,
-                        PortDescriptor* port_descriptor) {
-  port->lock.AssertAcquired();
-
-  PortName local_port_name = *port_name;
-
-  PortName new_port_name;
-  delegate_->GenerateRandomPortName(&new_port_name);
-
-  // Make sure we don't send messages to the new peer until after we know it
-  // exists. In the meantime, just buffer messages locally.
-  DCHECK(port->state == Port::kReceiving);
-  port->state = Port::kBuffering;
-
-  // If we already know our peer is closed, we already know this proxy can
-  // be removed once it receives and forwards its last expected message.
-  if (port->peer_closed)
-    port->remove_proxy_on_last_message = true;
-
-  *port_name = new_port_name;
-
-  port_descriptor->peer_node_name = port->peer_node_name;
-  port_descriptor->peer_port_name = port->peer_port_name;
-  port_descriptor->referring_node_name = name_;
-  port_descriptor->referring_port_name = local_port_name;
-  port_descriptor->next_sequence_num_to_send = port->next_sequence_num_to_send;
-  port_descriptor->next_sequence_num_to_receive =
-      port->message_queue.next_sequence_num();
-  port_descriptor->last_sequence_num_to_receive =
-      port->last_sequence_num_to_receive;
-  port_descriptor->peer_closed = port->peer_closed;
-  memset(port_descriptor->padding, 0, sizeof(port_descriptor->padding));
-
-  // Configure the local port to point to the new port.
-  port->peer_node_name = to_node_name;
-  port->peer_port_name = new_port_name;
-}
-
-int Node::AcceptPort(const PortName& port_name,
-                     const PortDescriptor& port_descriptor) {
-  scoped_refptr<Port> port = make_scoped_refptr(
-      new Port(port_descriptor.next_sequence_num_to_send,
-               port_descriptor.next_sequence_num_to_receive));
-  port->state = Port::kReceiving;
-  port->peer_node_name = port_descriptor.peer_node_name;
-  port->peer_port_name = port_descriptor.peer_port_name;
-  port->last_sequence_num_to_receive =
-      port_descriptor.last_sequence_num_to_receive;
-  port->peer_closed = port_descriptor.peer_closed;
-
-  DVLOG(2) << "Accepting port " << port_name << " [peer_closed="
-           << port->peer_closed << "; last_sequence_num_to_receive="
-           << port->last_sequence_num_to_receive << "]";
-
-  // A newly accepted port is not signalable until the message referencing the
-  // new port finds its way to the consumer (see GetMessage).
-  port->message_queue.set_signalable(false);
-
-  int rv = AddPortWithName(port_name, std::move(port));
-  if (rv != OK)
-    return rv;
-
-  // Allow referring port to forward messages.
-  delegate_->ForwardMessage(
-      port_descriptor.referring_node_name,
-      NewInternalMessage(port_descriptor.referring_port_name,
-                         EventType::kPortAccepted));
-  return OK;
-}
-
-int Node::WillSendMessage_Locked(const LockedPort& port,
-                                 const PortName& port_name,
-                                 Message* message) {
-  ports_lock_.AssertAcquired();
-  port->lock.AssertAcquired();
-
-  DCHECK(message);
-
-  // Messages may already have a sequence number if they're being forwarded
-  // by a proxy. Otherwise, use the next outgoing sequence number.
-  uint64_t* sequence_num =
-      &GetMutableEventData<UserEventData>(message)->sequence_num;
-  if (*sequence_num == 0)
-    *sequence_num = port->next_sequence_num_to_send++;
-
-#if DCHECK_IS_ON()
-  std::ostringstream ports_buf;
-  for (size_t i = 0; i < message->num_ports(); ++i) {
-    if (i > 0)
-      ports_buf << ",";
-    ports_buf << message->ports()[i];
-  }
-#endif
-
-  if (message->num_ports() > 0) {
-    // Note: Another thread could be trying to send the same ports, so we need
-    // to ensure that they are ours to send before we mutate their state.
-
-    std::vector<scoped_refptr<Port>> ports;
-    ports.resize(message->num_ports());
-
-    {
-      for (size_t i = 0; i < message->num_ports(); ++i) {
-        ports[i] = GetPort_Locked(message->ports()[i]);
-        DCHECK(ports[i]);
-
-        ports[i]->lock.Acquire();
-        int error = OK;
-        if (ports[i]->state != Port::kReceiving)
-          error = ERROR_PORT_STATE_UNEXPECTED;
-        else if (message->ports()[i] == port->peer_port_name)
-          error = ERROR_PORT_CANNOT_SEND_PEER;
-
-        if (error != OK) {
-          // Oops, we cannot send this port.
-          for (size_t j = 0; j <= i; ++j)
-            ports[i]->lock.Release();
-          // Backpedal on the sequence number.
-          port->next_sequence_num_to_send--;
-          return error;
-        }
-      }
-    }
-
-    PortDescriptor* port_descriptors =
-        GetMutablePortDescriptors(GetMutableEventData<UserEventData>(message));
-
-    for (size_t i = 0; i < message->num_ports(); ++i) {
-      WillSendPort(LockedPort(ports[i].get()),
-                   port->peer_node_name,
-                   message->mutable_ports() + i,
-                   port_descriptors + i);
-    }
-
-    for (size_t i = 0; i < message->num_ports(); ++i)
-      ports[i]->lock.Release();
-  }
-
-#if DCHECK_IS_ON()
-  DVLOG(4) << "Sending message "
-           << GetEventData<UserEventData>(*message)->sequence_num
-           << " [ports=" << ports_buf.str() << "]"
-           << " from " << port_name << "@" << name_
-           << " to " << port->peer_port_name << "@" << port->peer_node_name;
-#endif
-
-  GetMutableEventHeader(message)->port_name = port->peer_port_name;
-  return OK;
-}
-
-int Node::BeginProxying_Locked(const LockedPort& port,
-                               const PortName& port_name) {
-  ports_lock_.AssertAcquired();
-  port->lock.AssertAcquired();
-
-  if (port->state != Port::kBuffering)
-    return OOPS(ERROR_PORT_STATE_UNEXPECTED);
-
-  port->state = Port::kProxying;
-
-  int rv = ForwardMessages_Locked(LockedPort(port), port_name);
-  if (rv != OK)
-    return rv;
-
-  // We may have observed closure while buffering. In that case, we can advance
-  // to removing the proxy without sending out an ObserveProxy message. We
-  // already know the last expected message, etc.
-
-  if (port->remove_proxy_on_last_message) {
-    MaybeRemoveProxy_Locked(LockedPort(port), port_name);
-
-    // Make sure we propagate closure to our current peer.
-    ObserveClosureEventData data;
-    data.last_sequence_num = port->last_sequence_num_to_receive;
-    delegate_->ForwardMessage(
-        port->peer_node_name,
-        NewInternalMessage(port->peer_port_name,
-                           EventType::kObserveClosure, data));
-  } else {
-    InitiateProxyRemoval(LockedPort(port), port_name);
-  }
-
-  return OK;
-}
-
-int Node::BeginProxying(PortRef port_ref) {
-  Port* port = port_ref.port();
-  {
-    base::AutoLock ports_lock(ports_lock_);
-    base::AutoLock lock(port->lock);
-
-    if (port->state != Port::kBuffering)
-      return OOPS(ERROR_PORT_STATE_UNEXPECTED);
-
-    port->state = Port::kProxying;
-
-    int rv = ForwardMessages_Locked(LockedPort(port), port_ref.name());
-    if (rv != OK)
-      return rv;
-  }
-
-  bool should_remove;
-  NodeName peer_node_name;
-  ScopedMessage closure_message;
-  {
-    base::AutoLock lock(port->lock);
-    if (port->state != Port::kProxying)
-      return OOPS(ERROR_PORT_STATE_UNEXPECTED);
-
-    should_remove = port->remove_proxy_on_last_message;
-    if (should_remove) {
-      // Make sure we propagate closure to our current peer.
-      ObserveClosureEventData data;
-      data.last_sequence_num = port->last_sequence_num_to_receive;
-      peer_node_name = port->peer_node_name;
-      closure_message = NewInternalMessage(port->peer_port_name,
-                                           EventType::kObserveClosure, data);
-    } else {
-      InitiateProxyRemoval(LockedPort(port), port_ref.name());
-    }
-  }
-
-  if (should_remove) {
-    TryRemoveProxy(port_ref);
-    delegate_->ForwardMessage(peer_node_name, std::move(closure_message));
-  }
-
-  return OK;
-}
-
-int Node::ForwardMessages_Locked(const LockedPort& port,
-                                 const PortName &port_name) {
-  ports_lock_.AssertAcquired();
-  port->lock.AssertAcquired();
-
-  for (;;) {
-    ScopedMessage message;
-    port->message_queue.GetNextMessage(&message, nullptr);
-    if (!message)
-      break;
-
-    int rv = WillSendMessage_Locked(LockedPort(port), port_name, message.get());
-    if (rv != OK)
-      return rv;
-
-    delegate_->ForwardMessage(port->peer_node_name, std::move(message));
-  }
-  return OK;
-}
-
-void Node::InitiateProxyRemoval(const LockedPort& port,
-                                const PortName& port_name) {
-  port->lock.AssertAcquired();
-
-  // To remove this node, we start by notifying the connected graph that we are
-  // a proxy. This allows whatever port is referencing this node to skip it.
-  // Eventually, this node will receive ObserveProxyAck (or ObserveClosure if
-  // the peer was closed in the meantime).
-
-  ObserveProxyEventData data;
-  data.proxy_node_name = name_;
-  data.proxy_port_name = port_name;
-  data.proxy_to_node_name = port->peer_node_name;
-  data.proxy_to_port_name = port->peer_port_name;
-
-  delegate_->ForwardMessage(
-      port->peer_node_name,
-      NewInternalMessage(port->peer_port_name, EventType::kObserveProxy, data));
-}
-
-void Node::MaybeRemoveProxy_Locked(const LockedPort& port,
-                                   const PortName& port_name) {
-  // |ports_lock_| must be held so we can potentilaly ErasePort_Locked().
-  ports_lock_.AssertAcquired();
-  port->lock.AssertAcquired();
-
-  DCHECK(port->state == Port::kProxying);
-
-  // Make sure we have seen ObserveProxyAck before removing the port.
-  if (!port->remove_proxy_on_last_message)
-    return;
-
-  if (!CanAcceptMoreMessages(port.get())) {
-    // This proxy port is done. We can now remove it!
-    ErasePort_Locked(port_name);
-
-    if (port->send_on_proxy_removal) {
-      NodeName to_node = port->send_on_proxy_removal->first;
-      ScopedMessage& message = port->send_on_proxy_removal->second;
-
-      delegate_->ForwardMessage(to_node, std::move(message));
-      port->send_on_proxy_removal.reset();
-    }
-  } else {
-    DVLOG(2) << "Cannot remove port " << port_name << "@" << name_
-             << " now; waiting for more messages";
-  }
-}
-
-void Node::TryRemoveProxy(PortRef port_ref) {
-  Port* port = port_ref.port();
-  bool should_erase = false;
-  ScopedMessage msg;
-  NodeName to_node;
-  {
-    base::AutoLock lock(port->lock);
-
-    // Port already removed. Nothing to do.
-    if (port->state == Port::kClosed)
-      return;
-
-    DCHECK(port->state == Port::kProxying);
-
-    // Make sure we have seen ObserveProxyAck before removing the port.
-    if (!port->remove_proxy_on_last_message)
-      return;
-
-    if (!CanAcceptMoreMessages(port)) {
-      // This proxy port is done. We can now remove it!
-      should_erase = true;
-
-      if (port->send_on_proxy_removal) {
-        to_node = port->send_on_proxy_removal->first;
-        msg = std::move(port->send_on_proxy_removal->second);
-        port->send_on_proxy_removal.reset();
-      }
-    } else {
-      DVLOG(2) << "Cannot remove port " << port_ref.name() << "@" << name_
-               << " now; waiting for more messages";
-    }
-  }
-
-  if (should_erase)
-    ErasePort(port_ref.name());
-
-  if (msg)
-    delegate_->ForwardMessage(to_node, std::move(msg));
-}
-
-void Node::DestroyAllPortsWithPeer(const NodeName& node_name,
-                                   const PortName& port_name) {
-  // Wipes out all ports whose peer node matches |node_name| and whose peer port
-  // matches |port_name|. If |port_name| is |kInvalidPortName|, only the peer
-  // node is matched.
-
-  std::vector<PortRef> ports_to_notify;
-  std::vector<PortName> dead_proxies_to_broadcast;
-  std::deque<PortName> referenced_port_names;
-
-  {
-    base::AutoLock ports_lock(ports_lock_);
-
-    for (auto iter = ports_.begin(); iter != ports_.end(); ++iter) {
-      Port* port = iter->second.get();
-      {
-        base::AutoLock port_lock(port->lock);
-
-        if (port->peer_node_name == node_name &&
-              (port_name == kInvalidPortName ||
-                    port->peer_port_name == port_name)) {
-          if (!port->peer_closed) {
-            // Treat this as immediate peer closure. It's an exceptional
-            // condition akin to a broken pipe, so we don't care about losing
-            // messages.
-
-            port->peer_closed = true;
-            port->last_sequence_num_to_receive =
-                port->message_queue.next_sequence_num() - 1;
-
-            if (port->state == Port::kReceiving)
-              ports_to_notify.push_back(PortRef(iter->first, port));
-          }
-
-          // We don't expect to forward any further messages, and we don't
-          // expect to receive a Port{Accepted,Rejected} event. Because we're
-          // a proxy with no active peer, we cannot use the normal proxy removal
-          // procedure of forward-propagating an ObserveProxy. Instead we
-          // broadcast our own death so it can be back-propagated. This is
-          // inefficient but rare.
-          if (port->state != Port::kReceiving) {
-            dead_proxies_to_broadcast.push_back(iter->first);
-            iter->second->message_queue.GetReferencedPorts(
-                &referenced_port_names);
-          }
-        }
-      }
-    }
-
-    for (const auto& proxy_name : dead_proxies_to_broadcast) {
-      ports_.erase(proxy_name);
-      DVLOG(2) << "Forcibly deleted port " << proxy_name << "@" << name_;
-    }
-  }
-
-  // Wake up any receiving ports who have just observed simulated peer closure.
-  for (const auto& port : ports_to_notify)
-    delegate_->PortStatusChanged(port);
-
-  for (const auto& proxy_name : dead_proxies_to_broadcast) {
-    // Broadcast an event signifying that this proxy is no longer functioning.
-    ObserveProxyEventData event;
-    event.proxy_node_name = name_;
-    event.proxy_port_name = proxy_name;
-    event.proxy_to_node_name = kInvalidNodeName;
-    event.proxy_to_port_name = kInvalidPortName;
-    delegate_->BroadcastMessage(NewInternalMessage(
-        kInvalidPortName, EventType::kObserveProxy, event));
-
-    // Also process death locally since the port that points this closed one
-    // could be on the current node.
-    // Note: Although this is recursive, only a single port is involved which
-    // limits the expected branching to 1.
-    DestroyAllPortsWithPeer(name_, proxy_name);
-  }
-
-  // Close any ports referenced by the closed proxies.
-  for (const auto& name : referenced_port_names) {
-    PortRef ref;
-    if (GetPort(name, &ref) == OK)
-      ClosePort(ref);
-  }
-}
-
-ScopedMessage Node::NewInternalMessage_Helper(const PortName& port_name,
-                                              const EventType& type,
-                                              const void* data,
-                                              size_t num_data_bytes) {
-  ScopedMessage message;
-  delegate_->AllocMessage(sizeof(EventHeader) + num_data_bytes, &message);
-
-  EventHeader* header = GetMutableEventHeader(message.get());
-  header->port_name = port_name;
-  header->type = type;
-  header->padding = 0;
-
-  if (num_data_bytes)
-    memcpy(header + 1, data, num_data_bytes);
-
-  return message;
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/node.h b/mojo/edk/system/ports/node.h
deleted file mode 100644
index 55b8d27..0000000
--- a/mojo/edk/system/ports/node.h
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_NODE_H_
-#define MOJO_EDK_SYSTEM_PORTS_NODE_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <queue>
-#include <unordered_map>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/message.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/port.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/ports/user_data.h"
-
-#undef SendMessage  // Gah, windows
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-enum : int {
-  OK = 0,
-  ERROR_PORT_UNKNOWN = -10,
-  ERROR_PORT_EXISTS = -11,
-  ERROR_PORT_STATE_UNEXPECTED = -12,
-  ERROR_PORT_CANNOT_SEND_SELF = -13,
-  ERROR_PORT_PEER_CLOSED = -14,
-  ERROR_PORT_CANNOT_SEND_PEER = -15,
-  ERROR_NOT_IMPLEMENTED = -100,
-};
-
-struct PortStatus {
-  bool has_messages;
-  bool receiving_messages;
-  bool peer_closed;
-};
-
-class MessageFilter;
-class NodeDelegate;
-
-class Node {
- public:
-  enum class ShutdownPolicy {
-    DONT_ALLOW_LOCAL_PORTS,
-    ALLOW_LOCAL_PORTS,
-  };
-
-  // Does not take ownership of the delegate.
-  Node(const NodeName& name, NodeDelegate* delegate);
-  ~Node();
-
-  // Returns true iff there are no open ports referring to another node or ports
-  // in the process of being transferred from this node to another. If this
-  // returns false, then to ensure clean shutdown, it is necessary to keep the
-  // node alive and continue routing messages to it via AcceptMessage. This
-  // method may be called again after AcceptMessage to check if the Node is now
-  // ready to be destroyed.
-  //
-  // If |policy| is set to |ShutdownPolicy::ALLOW_LOCAL_PORTS|, this will return
-  // |true| even if some ports remain alive, as long as none of them are proxies
-  // to another node.
-  bool CanShutdownCleanly(
-      ShutdownPolicy policy = ShutdownPolicy::DONT_ALLOW_LOCAL_PORTS);
-
-  // Lookup the named port.
-  int GetPort(const PortName& port_name, PortRef* port_ref);
-
-  // Creates a port on this node. Before the port can be used, it must be
-  // initialized using InitializePort. This method is useful for bootstrapping
-  // a connection between two nodes. Generally, ports are created using
-  // CreatePortPair instead.
-  int CreateUninitializedPort(PortRef* port_ref);
-
-  // Initializes a newly created port.
-  int InitializePort(const PortRef& port_ref,
-                     const NodeName& peer_node_name,
-                     const PortName& peer_port_name);
-
-  // Generates a new connected pair of ports bound to this node. These ports
-  // are initialized and ready to go.
-  int CreatePortPair(PortRef* port0_ref, PortRef* port1_ref);
-
-  // User data associated with the port.
-  int SetUserData(const PortRef& port_ref, scoped_refptr<UserData> user_data);
-  int GetUserData(const PortRef& port_ref,
-                  scoped_refptr<UserData>* user_data);
-
-  // Prevents further messages from being sent from this port or delivered to
-  // this port. The port is removed, and the port's peer is notified of the
-  // closure after it has consumed all pending messages.
-  int ClosePort(const PortRef& port_ref);
-
-  // Returns the current status of the port.
-  int GetStatus(const PortRef& port_ref, PortStatus* port_status);
-
-  // Returns the next available message on the specified port or returns a null
-  // message if there are none available. Returns ERROR_PORT_PEER_CLOSED to
-  // indicate that this port's peer has closed. In such cases GetMessage may
-  // be called until it yields a null message, indicating that no more messages
-  // may be read from the port.
-  //
-  // If |filter| is non-null, the next available message is returned only if it
-  // is matched by the filter. If the provided filter does not match the next
-  // available message, GetMessage() behaves as if there is no message
-  // available. Ownership of |filter| is not taken, and it must outlive the
-  // extent of this call.
-  int GetMessage(const PortRef& port_ref,
-                 ScopedMessage* message,
-                 MessageFilter* filter);
-
-  // Sends a message from the specified port to its peer. Note that the message
-  // notification may arrive synchronously (via PortStatusChanged() on the
-  // delegate) if the peer is local to this Node.
-  int SendMessage(const PortRef& port_ref, ScopedMessage message);
-
-  // Corresponding to NodeDelegate::ForwardMessage.
-  int AcceptMessage(ScopedMessage message);
-
-  // Called to merge two ports with each other. If you have two independent
-  // port pairs A <=> B and C <=> D, the net result of merging B and C is a
-  // single connected port pair A <=> D.
-  //
-  // Note that the behavior of this operation is undefined if either port to be
-  // merged (B or C above) has ever been read from or written to directly, and
-  // this must ONLY be called on one side of the merge, though it doesn't matter
-  // which side.
-  //
-  // It is safe for the non-merged peers (A and D above) to be transferred,
-  // closed, and/or written to before, during, or after the merge.
-  int MergePorts(const PortRef& port_ref,
-                 const NodeName& destination_node_name,
-                 const PortName& destination_port_name);
-
-  // Like above but merges two ports local to this node. Because both ports are
-  // local this can also verify that neither port has been written to before the
-  // merge. If this fails for any reason, both ports are closed. Otherwise OK
-  // is returned and the ports' receiving peers are connected to each other.
-  int MergeLocalPorts(const PortRef& port0_ref, const PortRef& port1_ref);
-
-  // Called to inform this node that communication with another node is lost
-  // indefinitely. This triggers cleanup of ports bound to this node.
-  int LostConnectionToNode(const NodeName& node_name);
-
- private:
-  class LockedPort;
-
-  // Note: Functions that end with _Locked require |ports_lock_| to be held
-  // before calling.
-  int OnUserMessage(ScopedMessage message);
-  int OnPortAccepted(const PortName& port_name);
-  int OnObserveProxy(const PortName& port_name,
-                     const ObserveProxyEventData& event);
-  int OnObserveProxyAck(const PortName& port_name, uint64_t last_sequence_num);
-  int OnObserveClosure(const PortName& port_name, uint64_t last_sequence_num);
-  int OnMergePort(const PortName& port_name, const MergePortEventData& event);
-
-  int AddPortWithName(const PortName& port_name, scoped_refptr<Port> port);
-  void ErasePort(const PortName& port_name);
-  void ErasePort_Locked(const PortName& port_name);
-  scoped_refptr<Port> GetPort(const PortName& port_name);
-  scoped_refptr<Port> GetPort_Locked(const PortName& port_name);
-
-  int SendMessageInternal(const PortRef& port_ref, ScopedMessage* message);
-  int MergePorts_Locked(const PortRef& port0_ref, const PortRef& port1_ref);
-  void WillSendPort(const LockedPort& port,
-                    const NodeName& to_node_name,
-                    PortName* port_name,
-                    PortDescriptor* port_descriptor);
-  int AcceptPort(const PortName& port_name,
-                 const PortDescriptor& port_descriptor);
-
-  int WillSendMessage_Locked(const LockedPort& port,
-                             const PortName& port_name,
-                             Message* message);
-  int BeginProxying_Locked(const LockedPort& port, const PortName& port_name);
-  int BeginProxying(PortRef port_ref);
-  int ForwardMessages_Locked(const LockedPort& port, const PortName& port_name);
-  void InitiateProxyRemoval(const LockedPort& port, const PortName& port_name);
-  void MaybeRemoveProxy_Locked(const LockedPort& port,
-                               const PortName& port_name);
-  void TryRemoveProxy(PortRef port_ref);
-  void DestroyAllPortsWithPeer(const NodeName& node_name,
-                               const PortName& port_name);
-
-  ScopedMessage NewInternalMessage_Helper(const PortName& port_name,
-                                          const EventType& type,
-                                          const void* data,
-                                          size_t num_data_bytes);
-
-  ScopedMessage NewInternalMessage(const PortName& port_name,
-                                   const EventType& type) {
-    return NewInternalMessage_Helper(port_name, type, nullptr, 0);
-  }
-
-  template <typename EventData>
-  ScopedMessage NewInternalMessage(const PortName& port_name,
-                                   const EventType& type,
-                                   const EventData& data) {
-    return NewInternalMessage_Helper(port_name, type, &data, sizeof(data));
-  }
-
-  const NodeName name_;
-  NodeDelegate* const delegate_;
-
-  // Guards |ports_| as well as any operation which needs to hold multiple port
-  // locks simultaneously. Usage of this is subtle: it must NEVER be acquired
-  // after a Port lock is acquired, and it must ALWAYS be acquired before
-  // calling WillSendMessage_Locked or ForwardMessages_Locked.
-  base::Lock ports_lock_;
-  std::unordered_map<PortName, scoped_refptr<Port>> ports_;
-
-  DISALLOW_COPY_AND_ASSIGN(Node);
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_NODE_H_
diff --git a/mojo/edk/system/ports/node_delegate.h b/mojo/edk/system/ports/node_delegate.h
deleted file mode 100644
index 8547302..0000000
--- a/mojo/edk/system/ports/node_delegate.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_NODE_DELEGATE_H_
-#define MOJO_EDK_SYSTEM_PORTS_NODE_DELEGATE_H_
-
-#include <stddef.h>
-
-#include "mojo/edk/system/ports/message.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/port_ref.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-class NodeDelegate {
- public:
-  virtual ~NodeDelegate() {}
-
-  // Port names should be difficult to guess.
-  virtual void GenerateRandomPortName(PortName* port_name) = 0;
-
-  // Allocate a message, including a header that can be used by the Node
-  // implementation. |num_header_bytes| will be aligned. The newly allocated
-  // memory need not be zero-filled.
-  virtual void AllocMessage(size_t num_header_bytes,
-                            ScopedMessage* message) = 0;
-
-  // Forward a message asynchronously to the specified node. This method MUST
-  // NOT synchronously call any methods on Node.
-  virtual void ForwardMessage(const NodeName& node, ScopedMessage message) = 0;
-
-  // Broadcast a message to all nodes.
-  virtual void BroadcastMessage(ScopedMessage message) = 0;
-
-  // Indicates that the port's status has changed recently. Use Node::GetStatus
-  // to query the latest status of the port. Note, this event could be spurious
-  // if another thread is simultaneously modifying the status of the port.
-  virtual void PortStatusChanged(const PortRef& port_ref) = 0;
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_NODE_DELEGATE_H_
diff --git a/mojo/edk/system/ports/port.cc b/mojo/edk/system/ports/port.cc
deleted file mode 100644
index e4403ae..0000000
--- a/mojo/edk/system/ports/port.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports/port.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-Port::Port(uint64_t next_sequence_num_to_send,
-           uint64_t next_sequence_num_to_receive)
-    : state(kUninitialized),
-      next_sequence_num_to_send(next_sequence_num_to_send),
-      last_sequence_num_to_receive(0),
-      message_queue(next_sequence_num_to_receive),
-      remove_proxy_on_last_message(false),
-      peer_closed(false) {}
-
-Port::~Port() {}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/port.h b/mojo/edk/system/ports/port.h
deleted file mode 100644
index ea53d43..0000000
--- a/mojo/edk/system/ports/port.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_PORT_H_
-#define MOJO_EDK_SYSTEM_PORTS_PORT_H_
-
-#include <memory>
-#include <queue>
-#include <utility>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/system/ports/message_queue.h"
-#include "mojo/edk/system/ports/user_data.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-class Port : public base::RefCountedThreadSafe<Port> {
- public:
-  enum State {
-    kUninitialized,
-    kReceiving,
-    kBuffering,
-    kProxying,
-    kClosed
-  };
-
-  base::Lock lock;
-  State state;
-  NodeName peer_node_name;
-  PortName peer_port_name;
-  uint64_t next_sequence_num_to_send;
-  uint64_t last_sequence_num_to_receive;
-  MessageQueue message_queue;
-  std::unique_ptr<std::pair<NodeName, ScopedMessage>> send_on_proxy_removal;
-  scoped_refptr<UserData> user_data;
-  bool remove_proxy_on_last_message;
-  bool peer_closed;
-
-  Port(uint64_t next_sequence_num_to_send,
-       uint64_t next_sequence_num_to_receive);
-
- private:
-  friend class base::RefCountedThreadSafe<Port>;
-
-  ~Port();
-
-  DISALLOW_COPY_AND_ASSIGN(Port);
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_PORT_H_
diff --git a/mojo/edk/system/ports/port_ref.cc b/mojo/edk/system/ports/port_ref.cc
deleted file mode 100644
index 675754d..0000000
--- a/mojo/edk/system/ports/port_ref.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports/port_ref.h"
-
-#include "mojo/edk/system/ports/port.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-PortRef::~PortRef() {
-}
-
-PortRef::PortRef() {
-}
-
-PortRef::PortRef(const PortName& name, scoped_refptr<Port> port)
-    : name_(name), port_(std::move(port)) {}
-
-PortRef::PortRef(const PortRef& other)
-    : name_(other.name_), port_(other.port_) {
-}
-
-PortRef& PortRef::operator=(const PortRef& other) {
-  if (&other != this) {
-    name_ = other.name_;
-    port_ = other.port_;
-  }
-  return *this;
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/port_ref.h b/mojo/edk/system/ports/port_ref.h
deleted file mode 100644
index 59036c3..0000000
--- a/mojo/edk/system/ports/port_ref.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_PORT_REF_H_
-#define MOJO_EDK_SYSTEM_PORTS_PORT_REF_H_
-
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/system/ports/name.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-class Port;
-class Node;
-
-class PortRef {
- public:
-  ~PortRef();
-  PortRef();
-  PortRef(const PortName& name, scoped_refptr<Port> port);
-
-  PortRef(const PortRef& other);
-  PortRef& operator=(const PortRef& other);
-
-  const PortName& name() const { return name_; }
-
- private:
-  friend class Node;
-  Port* port() const { return port_.get(); }
-
-  PortName name_;
-  scoped_refptr<Port> port_;
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_PORT_REF_H_
diff --git a/mojo/edk/system/ports/ports_unittest.cc b/mojo/edk/system/ports/ports_unittest.cc
deleted file mode 100644
index cb48b3e..0000000
--- a/mojo/edk/system/ports/ports_unittest.cc
+++ /dev/null
@@ -1,1478 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <map>
-#include <queue>
-#include <sstream>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/rand_util.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/stringprintf.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/node.h"
-#include "mojo/edk/system/ports/node_delegate.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-namespace test {
-
-namespace {
-
-bool MessageEquals(const ScopedMessage& message, const base::StringPiece& s) {
-  return !strcmp(static_cast<const char*>(message->payload_bytes()), s.data());
-}
-
-class TestMessage : public Message {
- public:
-  static ScopedMessage NewUserMessage(size_t num_payload_bytes,
-                                      size_t num_ports) {
-    return ScopedMessage(new TestMessage(num_payload_bytes, num_ports));
-  }
-
-  TestMessage(size_t num_payload_bytes, size_t num_ports)
-      : Message(num_payload_bytes, num_ports) {
-    start_ = new char[num_header_bytes_ + num_ports_bytes_ + num_payload_bytes];
-    InitializeUserMessageHeader(start_);
-  }
-
-  TestMessage(size_t num_header_bytes,
-              size_t num_payload_bytes,
-              size_t num_ports_bytes)
-      : Message(num_header_bytes,
-                num_payload_bytes,
-                num_ports_bytes) {
-    start_ = new char[num_header_bytes + num_payload_bytes + num_ports_bytes];
-  }
-
-  ~TestMessage() override {
-    delete[] start_;
-  }
-};
-
-class TestNode;
-
-class MessageRouter {
- public:
-  virtual ~MessageRouter() {}
-
-  virtual void GeneratePortName(PortName* name) = 0;
-  virtual void ForwardMessage(TestNode* from_node,
-                              const NodeName& node_name,
-                              ScopedMessage message) = 0;
-  virtual void BroadcastMessage(TestNode* from_node, ScopedMessage message) = 0;
-};
-
-class TestNode : public NodeDelegate {
- public:
-  explicit TestNode(uint64_t id)
-      : node_name_(id, 1),
-        node_(node_name_, this),
-        node_thread_(base::StringPrintf("Node %" PRIu64 " thread", id)),
-        messages_available_event_(
-            base::WaitableEvent::ResetPolicy::AUTOMATIC,
-            base::WaitableEvent::InitialState::NOT_SIGNALED),
-        idle_event_(
-            base::WaitableEvent::ResetPolicy::MANUAL,
-            base::WaitableEvent::InitialState::SIGNALED) {
-  }
-
-  ~TestNode() override {
-    StopWhenIdle();
-    node_thread_.Stop();
-  }
-
-  const NodeName& name() const { return node_name_; }
-
-  // NOTE: Node is thread-safe.
-  Node& node() { return node_; }
-
-  base::WaitableEvent& idle_event() { return idle_event_; }
-
-  bool IsIdle() {
-    base::AutoLock lock(lock_);
-    return started_ && !dispatching_ &&
-        (incoming_messages_.empty() || (block_on_event_ && blocked_));
-  }
-
-  void BlockOnEvent(EventType type) {
-    base::AutoLock lock(lock_);
-    blocked_event_type_ = type;
-    block_on_event_ = true;
-  }
-
-  void Unblock() {
-    base::AutoLock lock(lock_);
-    block_on_event_ = false;
-    messages_available_event_.Signal();
-  }
-
-  void Start(MessageRouter* router) {
-    router_ = router;
-    node_thread_.Start();
-    node_thread_.task_runner()->PostTask(
-        FROM_HERE,
-        base::Bind(&TestNode::ProcessMessages, base::Unretained(this)));
-  }
-
-  void StopWhenIdle() {
-    base::AutoLock lock(lock_);
-    should_quit_ = true;
-    messages_available_event_.Signal();
-  }
-
-  void WakeUp() { messages_available_event_.Signal(); }
-
-  int SendStringMessage(const PortRef& port, const std::string& s) {
-    size_t size = s.size() + 1;
-    ScopedMessage message = TestMessage::NewUserMessage(size, 0);
-    memcpy(message->mutable_payload_bytes(), s.data(), size);
-    return node_.SendMessage(port, std::move(message));
-  }
-
-  int SendStringMessageWithPort(const PortRef& port,
-                                const std::string& s,
-                                const PortName& sent_port_name) {
-    size_t size = s.size() + 1;
-    ScopedMessage message = TestMessage::NewUserMessage(size, 1);
-    memcpy(message->mutable_payload_bytes(), s.data(), size);
-    message->mutable_ports()[0] = sent_port_name;
-    return node_.SendMessage(port, std::move(message));
-  }
-
-  int SendStringMessageWithPort(const PortRef& port,
-                                const std::string& s,
-                                const PortRef& sent_port) {
-    return SendStringMessageWithPort(port, s, sent_port.name());
-  }
-
-  void set_drop_messages(bool value) {
-    base::AutoLock lock(lock_);
-    drop_messages_ = value;
-  }
-
-  void set_save_messages(bool value) {
-    base::AutoLock lock(lock_);
-    save_messages_ = value;
-  }
-
-  bool ReadMessage(const PortRef& port, ScopedMessage* message) {
-    return node_.GetMessage(port, message, nullptr) == OK && *message;
-  }
-
-  bool GetSavedMessage(ScopedMessage* message) {
-    base::AutoLock lock(lock_);
-    if (saved_messages_.empty()) {
-      message->reset();
-      return false;
-    }
-    std::swap(*message, saved_messages_.front());
-    saved_messages_.pop();
-    return true;
-  }
-
-  void EnqueueMessage(ScopedMessage message) {
-    idle_event_.Reset();
-
-    // NOTE: This may be called from ForwardMessage and thus must not reenter
-    // |node_|.
-    base::AutoLock lock(lock_);
-    incoming_messages_.emplace(std::move(message));
-    messages_available_event_.Signal();
-  }
-
-  void GenerateRandomPortName(PortName* port_name) override {
-    DCHECK(router_);
-    router_->GeneratePortName(port_name);
-  }
-
-  void AllocMessage(size_t num_header_bytes, ScopedMessage* message) override {
-    message->reset(new TestMessage(num_header_bytes, 0, 0));
-  }
-
-  void ForwardMessage(const NodeName& node_name,
-                      ScopedMessage message) override {
-    {
-      base::AutoLock lock(lock_);
-      if (drop_messages_) {
-        DVLOG(1) << "Dropping ForwardMessage from node "
-                 << node_name_ << " to " << node_name;
-
-        base::AutoUnlock unlock(lock_);
-        ClosePortsInMessage(message.get());
-        return;
-      }
-    }
-
-    DCHECK(router_);
-    DVLOG(1) << "ForwardMessage from node "
-             << node_name_ << " to " << node_name;
-    router_->ForwardMessage(this, node_name, std::move(message));
-  }
-
-  void BroadcastMessage(ScopedMessage message) override {
-    router_->BroadcastMessage(this, std::move(message));
-  }
-
-  void PortStatusChanged(const PortRef& port) override {
-    // The port may be closed, in which case we ignore the notification.
-    base::AutoLock lock(lock_);
-    if (!save_messages_)
-      return;
-
-    for (;;) {
-      ScopedMessage message;
-      {
-        base::AutoUnlock unlock(lock_);
-        if (!ReadMessage(port, &message))
-          break;
-      }
-
-      saved_messages_.emplace(std::move(message));
-    }
-  }
-
-  void ClosePortsInMessage(Message* message) {
-    for (size_t i = 0; i < message->num_ports(); ++i) {
-      PortRef port;
-      ASSERT_EQ(OK, node_.GetPort(message->ports()[i], &port));
-      EXPECT_EQ(OK, node_.ClosePort(port));
-    }
-  }
-
- private:
-  void ProcessMessages() {
-    for (;;) {
-      messages_available_event_.Wait();
-
-      base::AutoLock lock(lock_);
-
-      if (should_quit_)
-        return;
-
-      dispatching_ = true;
-      while (!incoming_messages_.empty()) {
-        if (block_on_event_ &&
-            GetEventHeader(*incoming_messages_.front())->type ==
-                blocked_event_type_) {
-          blocked_ = true;
-          // Go idle if we hit a blocked event type.
-          break;
-        } else {
-          blocked_ = false;
-        }
-        ScopedMessage message = std::move(incoming_messages_.front());
-        incoming_messages_.pop();
-
-        // NOTE: AcceptMessage() can re-enter this object to call any of the
-        // NodeDelegate interface methods.
-        base::AutoUnlock unlock(lock_);
-        node_.AcceptMessage(std::move(message));
-      }
-
-      dispatching_ = false;
-      started_ = true;
-      idle_event_.Signal();
-    };
-  }
-
-  const NodeName node_name_;
-  Node node_;
-  MessageRouter* router_ = nullptr;
-
-  base::Thread node_thread_;
-  base::WaitableEvent messages_available_event_;
-  base::WaitableEvent idle_event_;
-
-  // Guards fields below.
-  base::Lock lock_;
-  bool started_ = false;
-  bool dispatching_ = false;
-  bool should_quit_ = false;
-  bool drop_messages_ = false;
-  bool save_messages_ = false;
-  bool blocked_ = false;
-  bool block_on_event_ = false;
-  EventType blocked_event_type_;
-  std::queue<ScopedMessage> incoming_messages_;
-  std::queue<ScopedMessage> saved_messages_;
-};
-
-class PortsTest : public testing::Test, public MessageRouter {
- public:
-  void AddNode(TestNode* node) {
-    {
-      base::AutoLock lock(lock_);
-      nodes_[node->name()] = node;
-    }
-    node->Start(this);
-  }
-
-  void RemoveNode(TestNode* node) {
-    {
-      base::AutoLock lock(lock_);
-      nodes_.erase(node->name());
-    }
-
-    for (const auto& entry : nodes_)
-      entry.second->node().LostConnectionToNode(node->name());
-  }
-
-  // Waits until all known Nodes are idle. Message forwarding and processing
-  // is handled in such a way that idleness is a stable state: once all nodes in
-  // the system are idle, they will remain idle until the test explicitly
-  // initiates some further event (e.g. sending a message, closing a port, or
-  // removing a Node).
-  void WaitForIdle() {
-    for (;;) {
-      base::AutoLock global_lock(global_lock_);
-      bool all_nodes_idle = true;
-      for (const auto& entry : nodes_) {
-        if (!entry.second->IsIdle())
-          all_nodes_idle = false;
-        entry.second->WakeUp();
-      }
-      if (all_nodes_idle)
-        return;
-
-      // Wait for any Node to signal that it's idle.
-      base::AutoUnlock global_unlock(global_lock_);
-      std::vector<base::WaitableEvent*> events;
-      for (const auto& entry : nodes_)
-        events.push_back(&entry.second->idle_event());
-      base::WaitableEvent::WaitMany(events.data(), events.size());
-    }
-  }
-
-  void CreatePortPair(TestNode* node0,
-                      PortRef* port0,
-                      TestNode* node1,
-                      PortRef* port1) {
-    if (node0 == node1) {
-      EXPECT_EQ(OK, node0->node().CreatePortPair(port0, port1));
-    } else {
-      EXPECT_EQ(OK, node0->node().CreateUninitializedPort(port0));
-      EXPECT_EQ(OK, node1->node().CreateUninitializedPort(port1));
-      EXPECT_EQ(OK, node0->node().InitializePort(*port0, node1->name(),
-                                                 port1->name()));
-      EXPECT_EQ(OK, node1->node().InitializePort(*port1, node0->name(),
-                                                 port0->name()));
-    }
-  }
-
- private:
-  // MessageRouter:
-  void GeneratePortName(PortName* name) override {
-    base::AutoLock lock(lock_);
-    name->v1 = next_port_id_++;
-    name->v2 = 0;
-  }
-
-  void ForwardMessage(TestNode* from_node,
-                      const NodeName& node_name,
-                      ScopedMessage message) override {
-    base::AutoLock global_lock(global_lock_);
-    base::AutoLock lock(lock_);
-    // Drop messages from nodes that have been removed.
-    if (nodes_.find(from_node->name()) == nodes_.end()) {
-      from_node->ClosePortsInMessage(message.get());
-      return;
-    }
-
-    auto it = nodes_.find(node_name);
-    if (it == nodes_.end()) {
-      DVLOG(1) << "Node not found: " << node_name;
-      return;
-    }
-
-    it->second->EnqueueMessage(std::move(message));
-  }
-
-  void BroadcastMessage(TestNode* from_node, ScopedMessage message) override {
-    base::AutoLock global_lock(global_lock_);
-    base::AutoLock lock(lock_);
-
-    // Drop messages from nodes that have been removed.
-    if (nodes_.find(from_node->name()) == nodes_.end())
-      return;
-
-    for (const auto& entry : nodes_) {
-      TestNode* node = entry.second;
-      // Broadcast doesn't deliver to the local node.
-      if (node == from_node)
-        continue;
-
-      // NOTE: We only need to support broadcast of events. Events have no
-      // payload or ports bytes.
-      ScopedMessage new_message(
-          new TestMessage(message->num_header_bytes(), 0, 0));
-      memcpy(new_message->mutable_header_bytes(), message->header_bytes(),
-             message->num_header_bytes());
-      node->EnqueueMessage(std::move(new_message));
-    }
-  }
-
-  base::MessageLoop message_loop_;
-
-  // Acquired before any operation which makes a Node busy, and before testing
-  // if all nodes are idle.
-  base::Lock global_lock_;
-
-  base::Lock lock_;
-  uint64_t next_port_id_ = 1;
-  std::map<NodeName, TestNode*> nodes_;
-};
-
-}  // namespace
-
-TEST_F(PortsTest, Basic1) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  PortRef x0, x1;
-  CreatePortPair(&node0, &x0, &node1, &x1);
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&a0, &a1));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "hello", a1));
-  EXPECT_EQ(OK, node0.node().ClosePort(a0));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(x0));
-  EXPECT_EQ(OK, node1.node().ClosePort(x1));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, Basic2) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  PortRef x0, x1;
-  CreatePortPair(&node0, &x0, &node1, &x1);
-
-  PortRef b0, b1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&b0, &b1));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "hello", b1));
-  EXPECT_EQ(OK, node0.SendStringMessage(b0, "hello again"));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(b0));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(x0));
-  EXPECT_EQ(OK, node1.node().ClosePort(x1));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, Basic3) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  PortRef x0, x1;
-  CreatePortPair(&node0, &x0, &node1, &x1);
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&a0, &a1));
-
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "hello", a1));
-  EXPECT_EQ(OK, node0.SendStringMessage(a0, "hello again"));
-
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "foo", a0));
-
-  PortRef b0, b1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&b0, &b1));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "bar", b1));
-  EXPECT_EQ(OK, node0.SendStringMessage(b0, "baz"));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(b0));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(x0));
-  EXPECT_EQ(OK, node1.node().ClosePort(x1));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, LostConnectionToNode1) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-  node1.set_drop_messages(true);
-
-  PortRef x0, x1;
-  CreatePortPair(&node0, &x0, &node1, &x1);
-
-  // Transfer a port to node1 and simulate a lost connection to node1.
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&a0, &a1));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "foo", a1));
-
-  WaitForIdle();
-
-  RemoveNode(&node1);
-
-  WaitForIdle();
-
-  EXPECT_EQ(OK, node0.node().ClosePort(a0));
-  EXPECT_EQ(OK, node0.node().ClosePort(x0));
-  EXPECT_EQ(OK, node1.node().ClosePort(x1));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, LostConnectionToNode2) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  PortRef x0, x1;
-  CreatePortPair(&node0, &x0, &node1, &x1);
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&a0, &a1));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "take a1", a1));
-
-  WaitForIdle();
-
-  node1.set_drop_messages(true);
-
-  RemoveNode(&node1);
-
-  WaitForIdle();
-
-  // a0 should have eventually detected peer closure after node loss.
-  ScopedMessage message;
-  EXPECT_EQ(ERROR_PORT_PEER_CLOSED,
-            node0.node().GetMessage(a0, &message, nullptr));
-  EXPECT_FALSE(message);
-
-  EXPECT_EQ(OK, node0.node().ClosePort(a0));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(x0));
-
-  EXPECT_EQ(OK, node1.node().GetMessage(x1, &message, nullptr));
-  EXPECT_TRUE(message);
-  node1.ClosePortsInMessage(message.get());
-
-  EXPECT_EQ(OK, node1.node().ClosePort(x1));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, LostConnectionToNodeWithSecondaryProxy) {
-  // Tests that a proxy gets cleaned up when its indirect peer lives on a lost
-  // node.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  TestNode node2(2);
-  AddNode(&node2);
-
-  // Create A-B spanning nodes 0 and 1 and C-D spanning 1 and 2.
-  PortRef A, B, C, D;
-  CreatePortPair(&node0, &A, &node1, &B);
-  CreatePortPair(&node1, &C, &node2, &D);
-
-  // Create E-F and send F over A to node 1.
-  PortRef E, F;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&E, &F));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(A, ".", F));
-
-  WaitForIdle();
-
-  ScopedMessage message;
-  ASSERT_TRUE(node1.ReadMessage(B, &message));
-  ASSERT_EQ(1u, message->num_ports());
-
-  EXPECT_EQ(OK, node1.node().GetPort(message->ports()[0], &F));
-
-  // Send F over C to node 2 and then simulate node 2 loss from node 1. Node 1
-  // will trivially become aware of the loss, and this test verifies that the
-  // port A on node 0 will eventually also become aware of it.
-
-  // Make sure node2 stops processing events when it encounters an ObserveProxy.
-  node2.BlockOnEvent(EventType::kObserveProxy);
-
-  EXPECT_EQ(OK, node1.SendStringMessageWithPort(C, ".", F));
-  WaitForIdle();
-
-  // Simulate node 1 and 2 disconnecting.
-  EXPECT_EQ(OK, node1.node().LostConnectionToNode(node2.name()));
-
-  // Let node2 continue processing events and wait for everyone to go idle.
-  node2.Unblock();
-  WaitForIdle();
-
-  // Port F should be gone.
-  EXPECT_EQ(ERROR_PORT_UNKNOWN, node1.node().GetPort(F.name(), &F));
-
-  // Port E should have detected peer closure despite the fact that there is
-  // no longer a continuous route from F to E over which the event could travel.
-  PortStatus status;
-  EXPECT_EQ(OK, node0.node().GetStatus(E, &status));
-  EXPECT_TRUE(status.peer_closed);
-
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-  EXPECT_EQ(OK, node1.node().ClosePort(B));
-  EXPECT_EQ(OK, node1.node().ClosePort(C));
-  EXPECT_EQ(OK, node0.node().ClosePort(E));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, LostConnectionToNodeWithLocalProxy) {
-  // Tests that a proxy gets cleaned up when its direct peer lives on a lost
-  // node and it's predecessor lives on the same node.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  PortRef A, B;
-  CreatePortPair(&node0, &A, &node1, &B);
-
-  PortRef C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&C, &D));
-
-  // Send D but block node0 on an ObserveProxy event.
-  node0.BlockOnEvent(EventType::kObserveProxy);
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(A, ".", D));
-
-  // node0 won't collapse the proxy but node1 will receive the message before
-  // going idle.
-  WaitForIdle();
-
-  ScopedMessage message;
-  ASSERT_TRUE(node1.ReadMessage(B, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef E;
-  EXPECT_EQ(OK, node1.node().GetPort(message->ports()[0], &E));
-
-  RemoveNode(&node1);
-
-  node0.Unblock();
-  WaitForIdle();
-
-  // Port C should have detected peer closure.
-  PortStatus status;
-  EXPECT_EQ(OK, node0.node().GetStatus(C, &status));
-  EXPECT_TRUE(status.peer_closed);
-
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-  EXPECT_EQ(OK, node1.node().ClosePort(B));
-  EXPECT_EQ(OK, node0.node().ClosePort(C));
-  EXPECT_EQ(OK, node1.node().ClosePort(E));
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, GetMessage1) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&a0, &a1));
-
-  ScopedMessage message;
-  EXPECT_EQ(OK, node.node().GetMessage(a0, &message, nullptr));
-  EXPECT_FALSE(message);
-
-  EXPECT_EQ(OK, node.node().ClosePort(a1));
-
-  WaitForIdle();
-
-  EXPECT_EQ(ERROR_PORT_PEER_CLOSED,
-            node.node().GetMessage(a0, &message, nullptr));
-  EXPECT_FALSE(message);
-
-  EXPECT_EQ(OK, node.node().ClosePort(a0));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, GetMessage2) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&a0, &a1));
-
-  EXPECT_EQ(OK, node.SendStringMessage(a1, "1"));
-
-  ScopedMessage message;
-  EXPECT_EQ(OK, node.node().GetMessage(a0, &message, nullptr));
-
-  ASSERT_TRUE(message);
-  EXPECT_TRUE(MessageEquals(message, "1"));
-
-  EXPECT_EQ(OK, node.node().ClosePort(a0));
-  EXPECT_EQ(OK, node.node().ClosePort(a1));
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, GetMessage3) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&a0, &a1));
-
-  const char* kStrings[] = {
-    "1",
-    "2",
-    "3"
-  };
-
-  for (size_t i = 0; i < sizeof(kStrings)/sizeof(kStrings[0]); ++i)
-    EXPECT_EQ(OK, node.SendStringMessage(a1, kStrings[i]));
-
-  ScopedMessage message;
-  for (size_t i = 0; i < sizeof(kStrings)/sizeof(kStrings[0]); ++i) {
-    EXPECT_EQ(OK, node.node().GetMessage(a0, &message, nullptr));
-    ASSERT_TRUE(message);
-    EXPECT_TRUE(MessageEquals(message, kStrings[i]));
-  }
-
-  EXPECT_EQ(OK, node.node().ClosePort(a0));
-  EXPECT_EQ(OK, node.node().ClosePort(a1));
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, Delegation1) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  PortRef x0, x1;
-  CreatePortPair(&node0, &x0, &node1, &x1);
-
-  // In this test, we send a message to a port that has been moved.
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&a0, &a1));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "a1", a1));
-  WaitForIdle();
-
-  ScopedMessage message;
-  ASSERT_TRUE(node1.ReadMessage(x1, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  EXPECT_TRUE(MessageEquals(message, "a1"));
-
-  // This is "a1" from the point of view of node1.
-  PortName a2_name = message->ports()[0];
-  EXPECT_EQ(OK, node1.SendStringMessageWithPort(x1, "a2", a2_name));
-  EXPECT_EQ(OK, node0.SendStringMessage(a0, "hello"));
-
-  WaitForIdle();
-
-  ASSERT_TRUE(node0.ReadMessage(x0, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  EXPECT_TRUE(MessageEquals(message, "a2"));
-
-  // This is "a2" from the point of view of node1.
-  PortName a3_name = message->ports()[0];
-
-  PortRef a3;
-  EXPECT_EQ(OK, node0.node().GetPort(a3_name, &a3));
-
-  ASSERT_TRUE(node0.ReadMessage(a3, &message));
-  EXPECT_EQ(0u, message->num_ports());
-  EXPECT_TRUE(MessageEquals(message, "hello"));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(a0));
-  EXPECT_EQ(OK, node0.node().ClosePort(a3));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(x0));
-  EXPECT_EQ(OK, node1.node().ClosePort(x1));
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, Delegation2) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  for (int i = 0; i < 100; ++i) {
-    // Setup pipe a<->b between node0 and node1.
-    PortRef A, B;
-    CreatePortPair(&node0, &A, &node1, &B);
-
-    PortRef C, D;
-    EXPECT_EQ(OK, node0.node().CreatePortPair(&C, &D));
-
-    PortRef E, F;
-    EXPECT_EQ(OK, node0.node().CreatePortPair(&E, &F));
-
-    node1.set_save_messages(true);
-
-    // Pass D over A to B.
-    EXPECT_EQ(OK, node0.SendStringMessageWithPort(A, "1", D));
-
-    // Pass F over C to D.
-    EXPECT_EQ(OK, node0.SendStringMessageWithPort(C, "1", F));
-
-    // This message should find its way to node1.
-    EXPECT_EQ(OK, node0.SendStringMessage(E, "hello"));
-
-    WaitForIdle();
-
-    EXPECT_EQ(OK, node0.node().ClosePort(C));
-    EXPECT_EQ(OK, node0.node().ClosePort(E));
-
-    EXPECT_EQ(OK, node0.node().ClosePort(A));
-    EXPECT_EQ(OK, node1.node().ClosePort(B));
-
-    bool got_hello = false;
-    ScopedMessage message;
-    while (node1.GetSavedMessage(&message)) {
-      node1.ClosePortsInMessage(message.get());
-      if (MessageEquals(message, "hello")) {
-        got_hello = true;
-        break;
-      }
-    }
-
-    EXPECT_TRUE(got_hello);
-
-    WaitForIdle();  // Because closing ports may have generated tasks.
-  }
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, SendUninitialized) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef x0;
-  EXPECT_EQ(OK, node.node().CreateUninitializedPort(&x0));
-  EXPECT_EQ(ERROR_PORT_STATE_UNEXPECTED, node.SendStringMessage(x0, "oops"));
-  EXPECT_EQ(OK, node.node().ClosePort(x0));
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, SendFailure) {
-  TestNode node(0);
-  AddNode(&node);
-
-  node.set_save_messages(true);
-
-  PortRef A, B;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-
-  // Try to send A over itself.
-
-  EXPECT_EQ(ERROR_PORT_CANNOT_SEND_SELF,
-            node.SendStringMessageWithPort(A, "oops", A));
-
-  // Try to send B over A.
-
-  EXPECT_EQ(ERROR_PORT_CANNOT_SEND_PEER,
-            node.SendStringMessageWithPort(A, "nope", B));
-
-  // B should be closed immediately.
-  EXPECT_EQ(ERROR_PORT_UNKNOWN, node.node().GetPort(B.name(), &B));
-
-  WaitForIdle();
-
-  // There should have been no messages accepted.
-  ScopedMessage message;
-  EXPECT_FALSE(node.GetSavedMessage(&message));
-
-  EXPECT_EQ(OK, node.node().ClosePort(A));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, DontLeakUnreceivedPorts) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node.node().CreatePortPair(&C, &D));
-
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(A, "foo", D));
-
-  EXPECT_EQ(OK, node.node().ClosePort(C));
-  EXPECT_EQ(OK, node.node().ClosePort(A));
-  EXPECT_EQ(OK, node.node().ClosePort(B));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, AllowShutdownWithLocalPortsOpen) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node.node().CreatePortPair(&C, &D));
-
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(A, "foo", D));
-
-  ScopedMessage message;
-  EXPECT_TRUE(node.ReadMessage(B, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  EXPECT_TRUE(MessageEquals(message, "foo"));
-  PortRef E;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &E));
-
-  EXPECT_TRUE(
-      node.node().CanShutdownCleanly(Node::ShutdownPolicy::ALLOW_LOCAL_PORTS));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(
-      node.node().CanShutdownCleanly(Node::ShutdownPolicy::ALLOW_LOCAL_PORTS));
-  EXPECT_FALSE(node.node().CanShutdownCleanly());
-
-  EXPECT_EQ(OK, node.node().ClosePort(A));
-  EXPECT_EQ(OK, node.node().ClosePort(B));
-  EXPECT_EQ(OK, node.node().ClosePort(C));
-  EXPECT_EQ(OK, node.node().ClosePort(E));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, ProxyCollapse1) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef A, B;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-
-  PortRef X, Y;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&X, &Y));
-
-  ScopedMessage message;
-
-  // Send B and receive it as C.
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", B));
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef C;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &C));
-
-  // Send C and receive it as D.
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", C));
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef D;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &D));
-
-  // Send D and receive it as E.
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", D));
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef E;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &E));
-
-  EXPECT_EQ(OK, node.node().ClosePort(X));
-  EXPECT_EQ(OK, node.node().ClosePort(Y));
-
-  EXPECT_EQ(OK, node.node().ClosePort(A));
-  EXPECT_EQ(OK, node.node().ClosePort(E));
-
-  // The node should not idle until all proxies are collapsed.
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, ProxyCollapse2) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef A, B;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-
-  PortRef X, Y;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&X, &Y));
-
-  ScopedMessage message;
-
-  // Send B and A to create proxies in each direction.
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", B));
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", A));
-
-  EXPECT_EQ(OK, node.node().ClosePort(X));
-  EXPECT_EQ(OK, node.node().ClosePort(Y));
-
-  // At this point we have a scenario with:
-  //
-  // D -> [B] -> C -> [A]
-  //
-  // Ensure that the proxies can collapse. The sent ports will be closed
-  // eventually as a result of Y's closure.
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, SendWithClosedPeer) {
-  // This tests that if a port is sent when its peer is already known to be
-  // closed, the newly created port will be aware of that peer closure, and the
-  // proxy will eventually collapse.
-
-  TestNode node(0);
-  AddNode(&node);
-
-  // Send a message from A to B, then close A.
-  PortRef A, B;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node.SendStringMessage(A, "hey"));
-  EXPECT_EQ(OK, node.node().ClosePort(A));
-
-  // Now send B over X-Y as new port C.
-  PortRef X, Y;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&X, &Y));
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", B));
-  ScopedMessage message;
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef C;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &C));
-
-  EXPECT_EQ(OK, node.node().ClosePort(X));
-  EXPECT_EQ(OK, node.node().ClosePort(Y));
-
-  WaitForIdle();
-
-  // C should have received the message originally sent to B, and it should also
-  // be aware of A's closure.
-
-  ASSERT_TRUE(node.ReadMessage(C, &message));
-  EXPECT_TRUE(MessageEquals(message, "hey"));
-
-  PortStatus status;
-  EXPECT_EQ(OK, node.node().GetStatus(C, &status));
-  EXPECT_FALSE(status.receiving_messages);
-  EXPECT_FALSE(status.has_messages);
-  EXPECT_TRUE(status.peer_closed);
-
-  node.node().ClosePort(C);
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, SendWithClosedPeerSent) {
-  // This tests that if a port is closed while some number of proxies are still
-  // routing messages (directly or indirectly) to it, that the peer port is
-  // eventually notified of the closure, and the dead-end proxies will
-  // eventually be removed.
-
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef X, Y;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&X, &Y));
-
-  PortRef A, B;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-
-  ScopedMessage message;
-
-  // Send A as new port C.
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", A));
-
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef C;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &C));
-
-  // Send C as new port D.
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", C));
-
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef D;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &D));
-
-  // Send a message to B through D, then close D.
-  EXPECT_EQ(OK, node.SendStringMessage(D, "hey"));
-  EXPECT_EQ(OK, node.node().ClosePort(D));
-
-  // Now send B as new port E.
-
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", B));
-  EXPECT_EQ(OK, node.node().ClosePort(X));
-
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef E;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &E));
-
-  EXPECT_EQ(OK, node.node().ClosePort(Y));
-
-  WaitForIdle();
-
-  // E should receive the message originally sent to B, and it should also be
-  // aware of D's closure.
-
-  ASSERT_TRUE(node.ReadMessage(E, &message));
-  EXPECT_TRUE(MessageEquals(message, "hey"));
-
-  PortStatus status;
-  EXPECT_EQ(OK, node.node().GetStatus(E, &status));
-  EXPECT_FALSE(status.receiving_messages);
-  EXPECT_FALSE(status.has_messages);
-  EXPECT_TRUE(status.peer_closed);
-
-  EXPECT_EQ(OK, node.node().ClosePort(E));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, MergePorts) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  // Setup two independent port pairs, A-B on node0 and C-D on node1.
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&C, &D));
-
-  // Write a message on A.
-  EXPECT_EQ(OK, node0.SendStringMessage(A, "hey"));
-
-  // Initiate a merge between B and C.
-  EXPECT_EQ(OK, node0.node().MergePorts(B, node1.name(), C.name()));
-
-  WaitForIdle();
-
-  // Expect all proxies to be gone once idle.
-  EXPECT_TRUE(
-      node0.node().CanShutdownCleanly(Node::ShutdownPolicy::ALLOW_LOCAL_PORTS));
-  EXPECT_TRUE(
-      node1.node().CanShutdownCleanly(Node::ShutdownPolicy::ALLOW_LOCAL_PORTS));
-
-  // Expect D to have received the message sent on A.
-  ScopedMessage message;
-  ASSERT_TRUE(node1.ReadMessage(D, &message));
-  EXPECT_TRUE(MessageEquals(message, "hey"));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-  EXPECT_EQ(OK, node1.node().ClosePort(D));
-
-  // No more ports should be open.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, MergePortWithClosedPeer1) {
-  // This tests that the right thing happens when initiating a merge on a port
-  // whose peer has already been closed.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  // Setup two independent port pairs, A-B on node0 and C-D on node1.
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&C, &D));
-
-  // Write a message on A.
-  EXPECT_EQ(OK, node0.SendStringMessage(A, "hey"));
-
-  // Close A.
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-
-  // Initiate a merge between B and C.
-  EXPECT_EQ(OK, node0.node().MergePorts(B, node1.name(), C.name()));
-
-  WaitForIdle();
-
-  // Expect all proxies to be gone once idle. node0 should have no ports since
-  // A was explicitly closed.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(
-      node1.node().CanShutdownCleanly(Node::ShutdownPolicy::ALLOW_LOCAL_PORTS));
-
-  // Expect D to have received the message sent on A.
-  ScopedMessage message;
-  ASSERT_TRUE(node1.ReadMessage(D, &message));
-  EXPECT_TRUE(MessageEquals(message, "hey"));
-
-  EXPECT_EQ(OK, node1.node().ClosePort(D));
-
-  // No more ports should be open.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, MergePortWithClosedPeer2) {
-  // This tests that the right thing happens when merging into a port whose peer
-  // has already been closed.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  // Setup two independent port pairs, A-B on node0 and C-D on node1.
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&C, &D));
-
-  // Write a message on D and close it.
-  EXPECT_EQ(OK, node0.SendStringMessage(D, "hey"));
-  EXPECT_EQ(OK, node1.node().ClosePort(D));
-
-  // Initiate a merge between B and C.
-  EXPECT_EQ(OK, node0.node().MergePorts(B, node1.name(), C.name()));
-
-  WaitForIdle();
-
-  // Expect all proxies to be gone once idle. node1 should have no ports since
-  // D was explicitly closed.
-  EXPECT_TRUE(
-      node0.node().CanShutdownCleanly(Node::ShutdownPolicy::ALLOW_LOCAL_PORTS));
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-
-  // Expect A to have received the message sent on D.
-  ScopedMessage message;
-  ASSERT_TRUE(node0.ReadMessage(A, &message));
-  EXPECT_TRUE(MessageEquals(message, "hey"));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-
-  // No more ports should be open.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, MergePortsWithClosedPeers) {
-  // This tests that no residual ports are left behind if two ports are merged
-  // when both of their peers have been closed.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  // Setup two independent port pairs, A-B on node0 and C-D on node1.
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&C, &D));
-
-  // Close A and D.
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-  EXPECT_EQ(OK, node1.node().ClosePort(D));
-
-  WaitForIdle();
-
-  // Initiate a merge between B and C.
-  EXPECT_EQ(OK, node0.node().MergePorts(B, node1.name(), C.name()));
-
-  WaitForIdle();
-
-  // Expect everything to have gone away.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, MergePortsWithMovedPeers) {
-  // This tests that ports can be merged successfully even if their peers are
-  // moved around.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  // Setup two independent port pairs, A-B on node0 and C-D on node1.
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&C, &D));
-
-  // Set up another pair X-Y for moving ports on node0.
-  PortRef X, Y;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&X, &Y));
-
-  ScopedMessage message;
-
-  // Move A to new port E.
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(X, "foo", A));
-  ASSERT_TRUE(node0.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef E;
-  ASSERT_EQ(OK, node0.node().GetPort(message->ports()[0], &E));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(X));
-  EXPECT_EQ(OK, node0.node().ClosePort(Y));
-
-  // Write messages on E and D.
-  EXPECT_EQ(OK, node0.SendStringMessage(E, "hey"));
-  EXPECT_EQ(OK, node1.SendStringMessage(D, "hi"));
-
-  // Initiate a merge between B and C.
-  EXPECT_EQ(OK, node0.node().MergePorts(B, node1.name(), C.name()));
-
-  WaitForIdle();
-
-  // Expect to receive D's message on E and E's message on D.
-  ASSERT_TRUE(node0.ReadMessage(E, &message));
-  EXPECT_TRUE(MessageEquals(message, "hi"));
-  ASSERT_TRUE(node1.ReadMessage(D, &message));
-  EXPECT_TRUE(MessageEquals(message, "hey"));
-
-  // Close E and D.
-  EXPECT_EQ(OK, node0.node().ClosePort(E));
-  EXPECT_EQ(OK, node1.node().ClosePort(D));
-
-  WaitForIdle();
-
-  // Expect everything to have gone away.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, MergePortsFailsGracefully) {
-  // This tests that the system remains in a well-defined state if something
-  // goes wrong during port merge.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  // Setup two independent port pairs, A-B on node0 and C-D on node1.
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&C, &D));
-
-  ScopedMessage message;
-  PortRef X, Y;
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&X, &Y));
-
-  // Block the merge from proceeding until we can do something stupid with port
-  // C. This avoids the test logic racing with async merge logic.
-  node1.BlockOnEvent(EventType::kMergePort);
-
-  // Initiate the merge between B and C.
-  EXPECT_EQ(OK, node0.node().MergePorts(B, node1.name(), C.name()));
-
-  // Move C to a new port E. This is not a sane use of Node's public API but
-  // is still hypothetically possible. It allows us to force a merge failure
-  // because C will be in an invalid state by the term the merge is processed.
-  // As a result, B should be closed.
-  EXPECT_EQ(OK, node1.SendStringMessageWithPort(X, "foo", C));
-
-  node1.Unblock();
-
-  ASSERT_TRUE(node1.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef E;
-  ASSERT_EQ(OK, node1.node().GetPort(message->ports()[0], &E));
-
-  EXPECT_EQ(OK, node1.node().ClosePort(X));
-  EXPECT_EQ(OK, node1.node().ClosePort(Y));
-
-  WaitForIdle();
-
-  // C goes away as a result of normal proxy removal. B should have been closed
-  // cleanly by the failed MergePorts.
-  EXPECT_EQ(ERROR_PORT_UNKNOWN, node1.node().GetPort(C.name(), &C));
-  EXPECT_EQ(ERROR_PORT_UNKNOWN, node0.node().GetPort(B.name(), &B));
-
-  // Close A, D, and E.
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-  EXPECT_EQ(OK, node1.node().ClosePort(D));
-  EXPECT_EQ(OK, node1.node().ClosePort(E));
-
-  WaitForIdle();
-
-  // Expect everything to have gone away.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-}  // namespace test
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/user_data.h b/mojo/edk/system/ports/user_data.h
deleted file mode 100644
index 73e7d17..0000000
--- a/mojo/edk/system/ports/user_data.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_USER_DATA_H_
-#define MOJO_EDK_SYSTEM_PORTS_USER_DATA_H_
-
-#include "base/memory/ref_counted.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-class UserData : public base::RefCountedThreadSafe<UserData> {
- protected:
-  friend class base::RefCountedThreadSafe<UserData>;
-
-  virtual ~UserData() {}
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_USER_DATA_H_
diff --git a/mojo/edk/system/ports_message.cc b/mojo/edk/system/ports_message.cc
deleted file mode 100644
index 5f3e8c0..0000000
--- a/mojo/edk/system/ports_message.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports_message.h"
-
-#include "base/memory/ptr_util.h"
-#include "mojo/edk/system/node_channel.h"
-
-namespace mojo {
-namespace edk {
-
-// static
-std::unique_ptr<PortsMessage> PortsMessage::NewUserMessage(
-    size_t num_payload_bytes,
-    size_t num_ports,
-    size_t num_handles) {
-  return base::WrapUnique(
-      new PortsMessage(num_payload_bytes, num_ports, num_handles));
-}
-
-PortsMessage::~PortsMessage() {}
-
-PortsMessage::PortsMessage(size_t num_payload_bytes,
-                           size_t num_ports,
-                           size_t num_handles)
-    : ports::Message(num_payload_bytes, num_ports) {
-  size_t size = num_header_bytes_ + num_ports_bytes_ + num_payload_bytes;
-  void* ptr;
-  channel_message_ = NodeChannel::CreatePortsMessage(size, &ptr, num_handles);
-  InitializeUserMessageHeader(ptr);
-}
-
-PortsMessage::PortsMessage(size_t num_header_bytes,
-                           size_t num_payload_bytes,
-                           size_t num_ports_bytes,
-                           Channel::MessagePtr channel_message)
-    : ports::Message(num_header_bytes,
-                     num_payload_bytes,
-                     num_ports_bytes) {
-  if (channel_message) {
-    channel_message_ = std::move(channel_message);
-    void* data;
-    size_t num_data_bytes;
-    NodeChannel::GetPortsMessageData(channel_message_.get(), &data,
-                                     &num_data_bytes);
-    start_ = static_cast<char*>(data);
-  } else {
-    // TODO: Clean this up. In practice this branch of the constructor should
-    // only be reached from Node-internal calls to AllocMessage, which never
-    // carry ports or non-header bytes.
-    CHECK_EQ(num_payload_bytes, 0u);
-    CHECK_EQ(num_ports_bytes, 0u);
-    void* ptr;
-    channel_message_ =
-        NodeChannel::CreatePortsMessage(num_header_bytes, &ptr, 0);
-    start_ = static_cast<char*>(ptr);
-  }
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports_message.h b/mojo/edk/system/ports_message.h
deleted file mode 100644
index 542b981..0000000
--- a/mojo/edk/system/ports_message.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_MESSAGE_H__
-#define MOJO_EDK_SYSTEM_PORTS_MESSAGE_H__
-
-#include <memory>
-#include <utility>
-
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/ports/message.h"
-#include "mojo/edk/system/ports/name.h"
-
-namespace mojo {
-namespace edk {
-
-class NodeController;
-
-class PortsMessage : public ports::Message {
- public:
-  static std::unique_ptr<PortsMessage> NewUserMessage(size_t num_payload_bytes,
-                                                      size_t num_ports,
-                                                      size_t num_handles);
-
-  ~PortsMessage() override;
-
-  size_t num_handles() const { return channel_message_->num_handles(); }
-  bool has_handles() const { return channel_message_->has_handles(); }
-
-  void SetHandles(ScopedPlatformHandleVectorPtr handles) {
-    channel_message_->SetHandles(std::move(handles));
-  }
-
-  ScopedPlatformHandleVectorPtr TakeHandles() {
-    return channel_message_->TakeHandles();
-  }
-
-  Channel::MessagePtr TakeChannelMessage() {
-    return std::move(channel_message_);
-  }
-
-  void set_source_node(const ports::NodeName& name) { source_node_ = name; }
-  const ports::NodeName& source_node() const { return source_node_; }
-
- private:
-  friend class NodeController;
-
-  // Construct a new user PortsMessage backed by a new Channel::Message.
-  PortsMessage(size_t num_payload_bytes, size_t num_ports, size_t num_handles);
-
-  // Construct a new PortsMessage backed by a Channel::Message. If
-  // |channel_message| is null, a new one is allocated internally.
-  PortsMessage(size_t num_header_bytes,
-               size_t num_payload_bytes,
-               size_t num_ports_bytes,
-               Channel::MessagePtr channel_message);
-
-  Channel::MessagePtr channel_message_;
-
-  // The node name from which this message was received, if known.
-  ports::NodeName source_node_ = ports::kInvalidNodeName;
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_MESSAGE_H__
diff --git a/mojo/edk/system/request_context.cc b/mojo/edk/system/request_context.cc
deleted file mode 100644
index 5de65d7..0000000
--- a/mojo/edk/system/request_context.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/request_context.h"
-
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/threading/thread_local.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-base::LazyInstance<base::ThreadLocalPointer<RequestContext>>::Leaky
-    g_current_context = LAZY_INSTANCE_INITIALIZER;
-
-}  // namespace
-
-RequestContext::RequestContext() : RequestContext(Source::LOCAL_API_CALL) {}
-
-RequestContext::RequestContext(Source source)
-    : source_(source), tls_context_(g_current_context.Pointer()) {
-  // We allow nested RequestContexts to exist as long as they aren't actually
-  // used for anything.
-  if (!tls_context_->Get())
-    tls_context_->Set(this);
-}
-
-RequestContext::~RequestContext() {
-  if (IsCurrent()) {
-    // NOTE: Callbacks invoked by this destructor are allowed to initiate new
-    // EDK requests on this thread, so we need to reset the thread-local context
-    // pointer before calling them. We persist the original notification source
-    // since we're starting over at the bottom of the stack.
-    tls_context_->Set(nullptr);
-
-    MojoWatcherNotificationFlags flags = MOJO_WATCHER_NOTIFICATION_FLAG_NONE;
-    if (source_ == Source::SYSTEM)
-      flags |= MOJO_WATCHER_NOTIFICATION_FLAG_FROM_SYSTEM;
-
-    // We send all cancellation notifications first. This is necessary because
-    // it's possible that cancelled watches have other pending notifications
-    // attached to this RequestContext.
-    //
-    // From the application's perspective the watch is cancelled as soon as this
-    // notification is received, and dispatching the cancellation notification
-    // updates some internal Watch state to ensure no further notifications
-    // fire. Because notifications on a single Watch are mutually exclusive,
-    // this is sufficient to guarantee that MOJO_RESULT_CANCELLED is the last
-    // notification received; which is the guarantee the API makes.
-    for (const scoped_refptr<Watch>& watch :
-         watch_cancel_finalizers_.container()) {
-      static const HandleSignalsState closed_state = {0, 0};
-
-      // Establish a new RequestContext to capture and run any new notifications
-      // triggered by the callback invocation.
-      RequestContext inner_context(source_);
-      watch->InvokeCallback(MOJO_RESULT_CANCELLED, closed_state, flags);
-    }
-
-    for (const WatchNotifyFinalizer& watch :
-         watch_notify_finalizers_.container()) {
-      RequestContext inner_context(source_);
-      watch.watch->InvokeCallback(watch.result, watch.state, flags);
-    }
-  } else {
-    // It should be impossible for nested contexts to have finalizers.
-    DCHECK(watch_notify_finalizers_.container().empty());
-    DCHECK(watch_cancel_finalizers_.container().empty());
-  }
-}
-
-// static
-RequestContext* RequestContext::current() {
-  DCHECK(g_current_context.Pointer()->Get());
-  return g_current_context.Pointer()->Get();
-}
-
-void RequestContext::AddWatchNotifyFinalizer(scoped_refptr<Watch> watch,
-                                             MojoResult result,
-                                             const HandleSignalsState& state) {
-  DCHECK(IsCurrent());
-  watch_notify_finalizers_->push_back(
-      WatchNotifyFinalizer(std::move(watch), result, state));
-}
-
-void RequestContext::AddWatchCancelFinalizer(scoped_refptr<Watch> watch) {
-  DCHECK(IsCurrent());
-  watch_cancel_finalizers_->push_back(std::move(watch));
-}
-
-bool RequestContext::IsCurrent() const {
-  return tls_context_->Get() == this;
-}
-
-RequestContext::WatchNotifyFinalizer::WatchNotifyFinalizer(
-    scoped_refptr<Watch> watch,
-    MojoResult result,
-    const HandleSignalsState& state)
-    : watch(std::move(watch)), result(result), state(state) {}
-
-RequestContext::WatchNotifyFinalizer::WatchNotifyFinalizer(
-    const WatchNotifyFinalizer& other) = default;
-
-RequestContext::WatchNotifyFinalizer::~WatchNotifyFinalizer() {}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/request_context.h b/mojo/edk/system/request_context.h
deleted file mode 100644
index d1f43bd..0000000
--- a/mojo/edk/system/request_context.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_REQUEST_CONTEXT_H_
-#define MOJO_EDK_SYSTEM_REQUEST_CONTEXT_H_
-
-#include "base/containers/stack_container.h"
-#include "base/macros.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/edk/system/watch.h"
-
-namespace base {
-template<typename T> class ThreadLocalPointer;
-}
-
-namespace mojo {
-namespace edk {
-
-// A RequestContext is a thread-local object which exists for the duration of
-// a single system API call. It is constructed immediately upon EDK entry and
-// destructed immediately before returning to the caller, after any internal
-// locks have been released.
-//
-// NOTE: It is legal to construct a RequestContext while another one already
-// exists on the current thread, but it is not safe to use the nested context
-// for any reason. Therefore it is important to always use
-// |RequestContext::current()| rather than referring to any local instance
-// directly.
-class MOJO_SYSTEM_IMPL_EXPORT RequestContext {
- public:
-  // Identifies the source of the current stack frame's RequestContext.
-  enum class Source {
-    LOCAL_API_CALL,
-    SYSTEM,
-  };
-
-  // Constructs a RequestContext with a LOCAL_API_CALL Source.
-  RequestContext();
-
-  explicit RequestContext(Source source);
-  ~RequestContext();
-
-  // Returns the current thread-local RequestContext.
-  static RequestContext* current();
-
-  Source source() const { return source_; }
-
-  // Adds a finalizer to this RequestContext corresponding to a watch callback
-  // which should be triggered in response to some handle state change. If
-  // the WatcherDispatcher hasn't been closed by the time this RequestContext is
-  // destroyed, its WatchCallback will be invoked with |result| and |state|
-  // arguments.
-  void AddWatchNotifyFinalizer(scoped_refptr<Watch> watch,
-                               MojoResult result,
-                               const HandleSignalsState& state);
-
-  // Adds a finalizer to this RequestContext corresponding to a watch callback
-  // which should be triggered to notify of watch cancellation. This appends to
-  // a separate finalizer list from AddWatchNotifyFinalizer, as pending
-  // cancellations must always preempt other pending notifications.
-  void AddWatchCancelFinalizer(scoped_refptr<Watch> watch);
-
- private:
-  // Is this request context the current one?
-  bool IsCurrent() const;
-
-  struct WatchNotifyFinalizer {
-    WatchNotifyFinalizer(scoped_refptr<Watch> watch,
-                         MojoResult result,
-                         const HandleSignalsState& state);
-    WatchNotifyFinalizer(const WatchNotifyFinalizer& other);
-    ~WatchNotifyFinalizer();
-
-    scoped_refptr<Watch> watch;
-    MojoResult result;
-    HandleSignalsState state;
-  };
-
-  // NOTE: This upper bound was chosen somewhat arbitrarily after observing some
-  // rare worst-case behavior in Chrome. A vast majority of RequestContexts only
-  // ever accumulate 0 or 1 finalizers.
-  static const size_t kStaticWatchFinalizersCapacity = 8;
-
-  using WatchNotifyFinalizerList =
-      base::StackVector<WatchNotifyFinalizer, kStaticWatchFinalizersCapacity>;
-  using WatchCancelFinalizerList =
-      base::StackVector<scoped_refptr<Watch>, kStaticWatchFinalizersCapacity>;
-
-  const Source source_;
-
-  WatchNotifyFinalizerList watch_notify_finalizers_;
-  WatchCancelFinalizerList watch_cancel_finalizers_;
-
-  // Pointer to the TLS context. Although this can easily be accessed via the
-  // global LazyInstance, accessing a LazyInstance has a large cost relative to
-  // the rest of this class and its usages.
-  base::ThreadLocalPointer<RequestContext>* tls_context_;
-
-  DISALLOW_COPY_AND_ASSIGN(RequestContext);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_REQUEST_CONTEXT_H_
diff --git a/mojo/edk/system/shared_buffer_dispatcher.cc b/mojo/edk/system/shared_buffer_dispatcher.cc
deleted file mode 100644
index df39105..0000000
--- a/mojo/edk/system/shared_buffer_dispatcher.cc
+++ /dev/null
@@ -1,339 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/shared_buffer_dispatcher.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-#include <memory>
-#include <utility>
-
-#include "base/logging.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/options_validation.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-#pragma pack(push, 1)
-
-struct SerializedState {
-  uint64_t num_bytes;
-  uint32_t flags;
-  uint32_t padding;
-};
-
-const uint32_t kSerializedStateFlagsReadOnly = 1 << 0;
-
-#pragma pack(pop)
-
-static_assert(sizeof(SerializedState) % 8 == 0,
-              "Invalid SerializedState size.");
-
-}  // namespace
-
-// static
-const MojoCreateSharedBufferOptions
-    SharedBufferDispatcher::kDefaultCreateOptions = {
-        static_cast<uint32_t>(sizeof(MojoCreateSharedBufferOptions)),
-        MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE};
-
-// static
-MojoResult SharedBufferDispatcher::ValidateCreateOptions(
-    const MojoCreateSharedBufferOptions* in_options,
-    MojoCreateSharedBufferOptions* out_options) {
-  const MojoCreateSharedBufferOptionsFlags kKnownFlags =
-      MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
-
-  *out_options = kDefaultCreateOptions;
-  if (!in_options)
-    return MOJO_RESULT_OK;
-
-  UserOptionsReader<MojoCreateSharedBufferOptions> reader(in_options);
-  if (!reader.is_valid())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (!OPTIONS_STRUCT_HAS_MEMBER(MojoCreateSharedBufferOptions, flags, reader))
-    return MOJO_RESULT_OK;
-  if ((reader.options().flags & ~kKnownFlags))
-    return MOJO_RESULT_UNIMPLEMENTED;
-  out_options->flags = reader.options().flags;
-
-  // Checks for fields beyond |flags|:
-
-  // (Nothing here yet.)
-
-  return MOJO_RESULT_OK;
-}
-
-// static
-MojoResult SharedBufferDispatcher::Create(
-    const MojoCreateSharedBufferOptions& /*validated_options*/,
-    NodeController* node_controller,
-    uint64_t num_bytes,
-    scoped_refptr<SharedBufferDispatcher>* result) {
-  if (!num_bytes)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  if (num_bytes > GetConfiguration().max_shared_memory_num_bytes)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  scoped_refptr<PlatformSharedBuffer> shared_buffer;
-  if (node_controller) {
-    shared_buffer =
-        node_controller->CreateSharedBuffer(static_cast<size_t>(num_bytes));
-  } else {
-    shared_buffer =
-        PlatformSharedBuffer::Create(static_cast<size_t>(num_bytes));
-  }
-  if (!shared_buffer)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  *result = CreateInternal(std::move(shared_buffer));
-  return MOJO_RESULT_OK;
-}
-
-// static
-MojoResult SharedBufferDispatcher::CreateFromPlatformSharedBuffer(
-    const scoped_refptr<PlatformSharedBuffer>& shared_buffer,
-    scoped_refptr<SharedBufferDispatcher>* result) {
-  if (!shared_buffer)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  *result = CreateInternal(shared_buffer);
-  return MOJO_RESULT_OK;
-}
-
-// static
-scoped_refptr<SharedBufferDispatcher> SharedBufferDispatcher::Deserialize(
-    const void* bytes,
-    size_t num_bytes,
-    const ports::PortName* ports,
-    size_t num_ports,
-    PlatformHandle* platform_handles,
-    size_t num_platform_handles) {
-  if (num_bytes != sizeof(SerializedState)) {
-    LOG(ERROR) << "Invalid serialized shared buffer dispatcher (bad size)";
-    return nullptr;
-  }
-
-  const SerializedState* serialization =
-      static_cast<const SerializedState*>(bytes);
-  if (!serialization->num_bytes) {
-    LOG(ERROR)
-        << "Invalid serialized shared buffer dispatcher (invalid num_bytes)";
-    return nullptr;
-  }
-
-  if (!platform_handles || num_platform_handles != 1 || num_ports) {
-    LOG(ERROR)
-        << "Invalid serialized shared buffer dispatcher (missing handles)";
-    return nullptr;
-  }
-
-  // Starts off invalid, which is what we want.
-  PlatformHandle platform_handle;
-  // We take ownership of the handle, so we have to invalidate the one in
-  // |platform_handles|.
-  std::swap(platform_handle, *platform_handles);
-
-  // Wrapping |platform_handle| in a |ScopedPlatformHandle| means that it'll be
-  // closed even if creation fails.
-  bool read_only = (serialization->flags & kSerializedStateFlagsReadOnly);
-  scoped_refptr<PlatformSharedBuffer> shared_buffer(
-      PlatformSharedBuffer::CreateFromPlatformHandle(
-          static_cast<size_t>(serialization->num_bytes), read_only,
-          ScopedPlatformHandle(platform_handle)));
-  if (!shared_buffer) {
-    LOG(ERROR)
-        << "Invalid serialized shared buffer dispatcher (invalid num_bytes?)";
-    return nullptr;
-  }
-
-  return CreateInternal(std::move(shared_buffer));
-}
-
-scoped_refptr<PlatformSharedBuffer>
-SharedBufferDispatcher::PassPlatformSharedBuffer() {
-  base::AutoLock lock(lock_);
-  if (!shared_buffer_ || in_transit_)
-    return nullptr;
-
-  scoped_refptr<PlatformSharedBuffer> retval = shared_buffer_;
-  shared_buffer_ = nullptr;
-  return retval;
-}
-
-Dispatcher::Type SharedBufferDispatcher::GetType() const {
-  return Type::SHARED_BUFFER;
-}
-
-MojoResult SharedBufferDispatcher::Close() {
-  base::AutoLock lock(lock_);
-  if (in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  shared_buffer_ = nullptr;
-  return MOJO_RESULT_OK;
-}
-
-MojoResult SharedBufferDispatcher::DuplicateBufferHandle(
-    const MojoDuplicateBufferHandleOptions* options,
-    scoped_refptr<Dispatcher>* new_dispatcher) {
-  MojoDuplicateBufferHandleOptions validated_options;
-  MojoResult result = ValidateDuplicateOptions(options, &validated_options);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  // Note: Since this is "duplicate", we keep our ref to |shared_buffer_|.
-  base::AutoLock lock(lock_);
-  if (in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if ((validated_options.flags &
-       MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY) &&
-      (!shared_buffer_->IsReadOnly())) {
-    // If a read-only duplicate is requested and |shared_buffer_| is not
-    // read-only, make a read-only duplicate of |shared_buffer_|.
-    scoped_refptr<PlatformSharedBuffer> read_only_buffer =
-        shared_buffer_->CreateReadOnlyDuplicate();
-    if (!read_only_buffer)
-      return MOJO_RESULT_FAILED_PRECONDITION;
-    DCHECK(read_only_buffer->IsReadOnly());
-    *new_dispatcher = CreateInternal(std::move(read_only_buffer));
-    return MOJO_RESULT_OK;
-  }
-
-  *new_dispatcher = CreateInternal(shared_buffer_);
-  return MOJO_RESULT_OK;
-}
-
-MojoResult SharedBufferDispatcher::MapBuffer(
-    uint64_t offset,
-    uint64_t num_bytes,
-    MojoMapBufferFlags flags,
-    std::unique_ptr<PlatformSharedBufferMapping>* mapping) {
-  if (offset > static_cast<uint64_t>(std::numeric_limits<size_t>::max()))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  if (num_bytes > static_cast<uint64_t>(std::numeric_limits<size_t>::max()))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  base::AutoLock lock(lock_);
-  DCHECK(shared_buffer_);
-  if (in_transit_ ||
-      !shared_buffer_->IsValidMap(static_cast<size_t>(offset),
-                                  static_cast<size_t>(num_bytes))) {
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-
-  DCHECK(mapping);
-  *mapping = shared_buffer_->MapNoCheck(static_cast<size_t>(offset),
-                                        static_cast<size_t>(num_bytes));
-  if (!*mapping) {
-    LOG(ERROR) << "Unable to map: read_only" << shared_buffer_->IsReadOnly();
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-void SharedBufferDispatcher::StartSerialize(uint32_t* num_bytes,
-                                            uint32_t* num_ports,
-                                            uint32_t* num_platform_handles) {
-  *num_bytes = sizeof(SerializedState);
-  *num_ports = 0;
-  *num_platform_handles = 1;
-}
-
-bool SharedBufferDispatcher::EndSerialize(void* destination,
-                                          ports::PortName* ports,
-                                          PlatformHandle* handles) {
-  SerializedState* serialization =
-      static_cast<SerializedState*>(destination);
-  base::AutoLock lock(lock_);
-  serialization->num_bytes =
-        static_cast<uint64_t>(shared_buffer_->GetNumBytes());
-  serialization->flags =
-      (shared_buffer_->IsReadOnly() ? kSerializedStateFlagsReadOnly : 0);
-  serialization->padding = 0;
-
-  handle_for_transit_ = shared_buffer_->DuplicatePlatformHandle();
-  if (!handle_for_transit_.is_valid()) {
-    shared_buffer_ = nullptr;
-    return false;
-  }
-  handles[0] = handle_for_transit_.get();
-  return true;
-}
-
-bool SharedBufferDispatcher::BeginTransit() {
-  base::AutoLock lock(lock_);
-  if (in_transit_)
-    return false;
-  in_transit_ = static_cast<bool>(shared_buffer_);
-  return in_transit_;
-}
-
-void SharedBufferDispatcher::CompleteTransitAndClose() {
-  base::AutoLock lock(lock_);
-  in_transit_ = false;
-  shared_buffer_ = nullptr;
-  ignore_result(handle_for_transit_.release());
-}
-
-void SharedBufferDispatcher::CancelTransit() {
-  base::AutoLock lock(lock_);
-  in_transit_ = false;
-  handle_for_transit_.reset();
-}
-
-SharedBufferDispatcher::SharedBufferDispatcher(
-    scoped_refptr<PlatformSharedBuffer> shared_buffer)
-    : shared_buffer_(shared_buffer) {
-  DCHECK(shared_buffer_);
-}
-
-SharedBufferDispatcher::~SharedBufferDispatcher() {
-  DCHECK(!shared_buffer_ && !in_transit_);
-}
-
-// static
-MojoResult SharedBufferDispatcher::ValidateDuplicateOptions(
-    const MojoDuplicateBufferHandleOptions* in_options,
-    MojoDuplicateBufferHandleOptions* out_options) {
-  const MojoDuplicateBufferHandleOptionsFlags kKnownFlags =
-      MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
-  static const MojoDuplicateBufferHandleOptions kDefaultOptions = {
-      static_cast<uint32_t>(sizeof(MojoDuplicateBufferHandleOptions)),
-      MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE};
-
-  *out_options = kDefaultOptions;
-  if (!in_options)
-    return MOJO_RESULT_OK;
-
-  UserOptionsReader<MojoDuplicateBufferHandleOptions> reader(in_options);
-  if (!reader.is_valid())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (!OPTIONS_STRUCT_HAS_MEMBER(MojoDuplicateBufferHandleOptions, flags,
-                                 reader))
-    return MOJO_RESULT_OK;
-  if ((reader.options().flags & ~kKnownFlags))
-    return MOJO_RESULT_UNIMPLEMENTED;
-  out_options->flags = reader.options().flags;
-
-  // Checks for fields beyond |flags|:
-
-  // (Nothing here yet.)
-
-  return MOJO_RESULT_OK;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/shared_buffer_dispatcher.h b/mojo/edk/system/shared_buffer_dispatcher.h
deleted file mode 100644
index 6015595..0000000
--- a/mojo/edk/system/shared_buffer_dispatcher.h
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_SHARED_BUFFER_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_SHARED_BUFFER_DISPATCHER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/macros.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-
-namespace edk {
-class NodeController;
-
-class MOJO_SYSTEM_IMPL_EXPORT SharedBufferDispatcher final : public Dispatcher {
- public:
-  // The default options to use for |MojoCreateSharedBuffer()|. (Real uses
-  // should obtain this via |ValidateCreateOptions()| with a null |in_options|;
-  // this is exposed directly for testing convenience.)
-  static const MojoCreateSharedBufferOptions kDefaultCreateOptions;
-
-  // Validates and/or sets default options for |MojoCreateSharedBufferOptions|.
-  // If non-null, |in_options| must point to a struct of at least
-  // |in_options->struct_size| bytes. |out_options| must point to a (current)
-  // |MojoCreateSharedBufferOptions| and will be entirely overwritten on success
-  // (it may be partly overwritten on failure).
-  static MojoResult ValidateCreateOptions(
-      const MojoCreateSharedBufferOptions* in_options,
-      MojoCreateSharedBufferOptions* out_options);
-
-  // Static factory method: |validated_options| must be validated (obviously).
-  // On failure, |*result| will be left as-is.
-  // TODO(vtl): This should probably be made to return a scoped_refptr and have
-  // a MojoResult out parameter instead.
-  static MojoResult Create(
-      const MojoCreateSharedBufferOptions& validated_options,
-      NodeController* node_controller,
-      uint64_t num_bytes,
-      scoped_refptr<SharedBufferDispatcher>* result);
-
-  // Create a |SharedBufferDispatcher| from |shared_buffer|.
-  static MojoResult CreateFromPlatformSharedBuffer(
-      const scoped_refptr<PlatformSharedBuffer>& shared_buffer,
-      scoped_refptr<SharedBufferDispatcher>* result);
-
-  // The "opposite" of SerializeAndClose(). Called by Dispatcher::Deserialize().
-  static scoped_refptr<SharedBufferDispatcher> Deserialize(
-      const void* bytes,
-      size_t num_bytes,
-      const ports::PortName* ports,
-      size_t num_ports,
-      PlatformHandle* platform_handles,
-      size_t num_platform_handles);
-
-  // Passes the underlying platform shared buffer. This dispatcher must be
-  // closed after calling this function.
-  scoped_refptr<PlatformSharedBuffer> PassPlatformSharedBuffer();
-
-  // Dispatcher:
-  Type GetType() const override;
-  MojoResult Close() override;
-  MojoResult DuplicateBufferHandle(
-      const MojoDuplicateBufferHandleOptions* options,
-      scoped_refptr<Dispatcher>* new_dispatcher) override;
-  MojoResult MapBuffer(
-      uint64_t offset,
-      uint64_t num_bytes,
-      MojoMapBufferFlags flags,
-      std::unique_ptr<PlatformSharedBufferMapping>* mapping) override;
-  void StartSerialize(uint32_t* num_bytes,
-                      uint32_t* num_ports,
-                      uint32_t* num_platform_handles) override;
-  bool EndSerialize(void* destination,
-                    ports::PortName* ports,
-                    PlatformHandle* handles) override;
-  bool BeginTransit() override;
-  void CompleteTransitAndClose() override;
-  void CancelTransit() override;
-
- private:
-  static scoped_refptr<SharedBufferDispatcher> CreateInternal(
-      scoped_refptr<PlatformSharedBuffer> shared_buffer) {
-    return make_scoped_refptr(
-        new SharedBufferDispatcher(std::move(shared_buffer)));
-  }
-
-  explicit SharedBufferDispatcher(
-      scoped_refptr<PlatformSharedBuffer> shared_buffer);
-  ~SharedBufferDispatcher() override;
-
-  // Validates and/or sets default options for
-  // |MojoDuplicateBufferHandleOptions|. If non-null, |in_options| must point to
-  // a struct of at least |in_options->struct_size| bytes. |out_options| must
-  // point to a (current) |MojoDuplicateBufferHandleOptions| and will be
-  // entirely overwritten on success (it may be partly overwritten on failure).
-  static MojoResult ValidateDuplicateOptions(
-      const MojoDuplicateBufferHandleOptions* in_options,
-      MojoDuplicateBufferHandleOptions* out_options);
-
-  // Guards access to |shared_buffer_|.
-  base::Lock lock_;
-
-  bool in_transit_ = false;
-
-  // We keep a copy of the buffer's platform handle during transit so we can
-  // close it if something goes wrong.
-  ScopedPlatformHandle handle_for_transit_;
-
-  scoped_refptr<PlatformSharedBuffer> shared_buffer_;
-
-  DISALLOW_COPY_AND_ASSIGN(SharedBufferDispatcher);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_SHARED_BUFFER_DISPATCHER_H_
diff --git a/mojo/edk/system/shared_buffer_dispatcher_unittest.cc b/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
deleted file mode 100644
index c95bdc3..0000000
--- a/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
+++ /dev/null
@@ -1,312 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/shared_buffer_dispatcher.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-// NOTE(vtl): There's currently not much to test for in
-// |SharedBufferDispatcher::ValidateCreateOptions()|, but the tests should be
-// expanded if/when options are added, so I've kept the general form of the
-// tests from data_pipe_unittest.cc.
-
-const uint32_t kSizeOfCreateOptions = sizeof(MojoCreateSharedBufferOptions);
-
-// Does a cursory sanity check of |validated_options|. Calls
-// |ValidateCreateOptions()| on already-validated options. The validated options
-// should be valid, and the revalidated copy should be the same.
-void RevalidateCreateOptions(
-    const MojoCreateSharedBufferOptions& validated_options) {
-  EXPECT_EQ(kSizeOfCreateOptions, validated_options.struct_size);
-  // Nothing to check for flags.
-
-  MojoCreateSharedBufferOptions revalidated_options = {};
-  EXPECT_EQ(MOJO_RESULT_OK,
-            SharedBufferDispatcher::ValidateCreateOptions(
-                &validated_options, &revalidated_options));
-  EXPECT_EQ(validated_options.struct_size, revalidated_options.struct_size);
-  EXPECT_EQ(validated_options.flags, revalidated_options.flags);
-}
-
-class SharedBufferDispatcherTest : public testing::Test {
- public:
-  SharedBufferDispatcherTest() {}
-  ~SharedBufferDispatcherTest() override {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SharedBufferDispatcherTest);
-};
-
-// Tests valid inputs to |ValidateCreateOptions()|.
-TEST_F(SharedBufferDispatcherTest, ValidateCreateOptionsValid) {
-  // Default options.
-  {
-    MojoCreateSharedBufferOptions validated_options = {};
-    EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::ValidateCreateOptions(
-                                  nullptr, &validated_options));
-    RevalidateCreateOptions(validated_options);
-  }
-
-  // Different flags.
-  MojoCreateSharedBufferOptionsFlags flags_values[] = {
-      MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE};
-  for (size_t i = 0; i < arraysize(flags_values); i++) {
-    const MojoCreateSharedBufferOptionsFlags flags = flags_values[i];
-
-    // Different capacities (size 1).
-    for (uint32_t capacity = 1; capacity <= 100 * 1000 * 1000; capacity *= 10) {
-      MojoCreateSharedBufferOptions options = {
-          kSizeOfCreateOptions,  // |struct_size|.
-          flags                  // |flags|.
-      };
-      MojoCreateSharedBufferOptions validated_options = {};
-      EXPECT_EQ(MOJO_RESULT_OK,
-                SharedBufferDispatcher::ValidateCreateOptions(
-                    &options, &validated_options))
-          << capacity;
-      RevalidateCreateOptions(validated_options);
-      EXPECT_EQ(options.flags, validated_options.flags);
-    }
-  }
-}
-
-TEST_F(SharedBufferDispatcherTest, ValidateCreateOptionsInvalid) {
-  // Invalid |struct_size|.
-  {
-    MojoCreateSharedBufferOptions options = {
-        1,                                           // |struct_size|.
-        MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE  // |flags|.
-    };
-    MojoCreateSharedBufferOptions unused;
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              SharedBufferDispatcher::ValidateCreateOptions(
-                  &options, &unused));
-  }
-
-  // Unknown |flags|.
-  {
-    MojoCreateSharedBufferOptions options = {
-        kSizeOfCreateOptions,  // |struct_size|.
-        ~0u                    // |flags|.
-    };
-    MojoCreateSharedBufferOptions unused;
-    EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-              SharedBufferDispatcher::ValidateCreateOptions(
-                  &options, &unused));
-  }
-}
-
-TEST_F(SharedBufferDispatcherTest, CreateAndMapBuffer) {
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create(
-                                SharedBufferDispatcher::kDefaultCreateOptions,
-                                nullptr, 100, &dispatcher));
-  ASSERT_TRUE(dispatcher);
-  EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher->GetType());
-
-  // Make a couple of mappings.
-  std::unique_ptr<PlatformSharedBufferMapping> mapping1;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(
-                                0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping1));
-  ASSERT_TRUE(mapping1);
-  ASSERT_TRUE(mapping1->GetBase());
-  EXPECT_EQ(100u, mapping1->GetLength());
-  // Write something.
-  static_cast<char*>(mapping1->GetBase())[50] = 'x';
-
-  std::unique_ptr<PlatformSharedBufferMapping> mapping2;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(
-                                50, 50, MOJO_MAP_BUFFER_FLAG_NONE, &mapping2));
-  ASSERT_TRUE(mapping2);
-  ASSERT_TRUE(mapping2->GetBase());
-  EXPECT_EQ(50u, mapping2->GetLength());
-  EXPECT_EQ('x', static_cast<char*>(mapping2->GetBase())[0]);
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
-
-  // Check that we can still read/write to mappings after the dispatcher has
-  // gone away.
-  static_cast<char*>(mapping2->GetBase())[1] = 'y';
-  EXPECT_EQ('y', static_cast<char*>(mapping1->GetBase())[51]);
-}
-
-TEST_F(SharedBufferDispatcherTest, CreateAndMapBufferFromPlatformBuffer) {
-  scoped_refptr<PlatformSharedBuffer> platform_shared_buffer =
-      PlatformSharedBuffer::Create(100);
-  ASSERT_TRUE(platform_shared_buffer);
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            SharedBufferDispatcher::CreateFromPlatformSharedBuffer(
-                platform_shared_buffer, &dispatcher));
-  ASSERT_TRUE(dispatcher);
-  EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher->GetType());
-
-  // Make a couple of mappings.
-  std::unique_ptr<PlatformSharedBufferMapping> mapping1;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(
-                                0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping1));
-  ASSERT_TRUE(mapping1);
-  ASSERT_TRUE(mapping1->GetBase());
-  EXPECT_EQ(100u, mapping1->GetLength());
-  // Write something.
-  static_cast<char*>(mapping1->GetBase())[50] = 'x';
-
-  std::unique_ptr<PlatformSharedBufferMapping> mapping2;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(
-                                50, 50, MOJO_MAP_BUFFER_FLAG_NONE, &mapping2));
-  ASSERT_TRUE(mapping2);
-  ASSERT_TRUE(mapping2->GetBase());
-  EXPECT_EQ(50u, mapping2->GetLength());
-  EXPECT_EQ('x', static_cast<char*>(mapping2->GetBase())[0]);
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
-
-  // Check that we can still read/write to mappings after the dispatcher has
-  // gone away.
-  static_cast<char*>(mapping2->GetBase())[1] = 'y';
-  EXPECT_EQ('y', static_cast<char*>(mapping1->GetBase())[51]);
-}
-
-TEST_F(SharedBufferDispatcherTest, DuplicateBufferHandle) {
-  scoped_refptr<SharedBufferDispatcher> dispatcher1;
-  EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create(
-                                SharedBufferDispatcher::kDefaultCreateOptions,
-                                nullptr, 100, &dispatcher1));
-
-  // Map and write something.
-  std::unique_ptr<PlatformSharedBufferMapping> mapping;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->MapBuffer(
-                                0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
-  static_cast<char*>(mapping->GetBase())[0] = 'x';
-  mapping.reset();
-
-  // Duplicate |dispatcher1| and then close it.
-  scoped_refptr<Dispatcher> dispatcher2;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->DuplicateBufferHandle(
-                                nullptr, &dispatcher2));
-  ASSERT_TRUE(dispatcher2);
-  EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher2->GetType());
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close());
-
-  // Map |dispatcher2| and read something.
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->MapBuffer(
-                                0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
-  EXPECT_EQ('x', static_cast<char*>(mapping->GetBase())[0]);
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->Close());
-}
-
-TEST_F(SharedBufferDispatcherTest, DuplicateBufferHandleOptionsValid) {
-  scoped_refptr<SharedBufferDispatcher> dispatcher1;
-  EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create(
-                                SharedBufferDispatcher::kDefaultCreateOptions,
-                                nullptr, 100, &dispatcher1));
-
-  MojoDuplicateBufferHandleOptions options[] = {
-      {sizeof(MojoDuplicateBufferHandleOptions),
-       MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE},
-      {sizeof(MojoDuplicateBufferHandleOptions),
-       MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY},
-      {sizeof(MojoDuplicateBufferHandleOptionsFlags), ~0u}};
-  for (size_t i = 0; i < arraysize(options); i++) {
-    scoped_refptr<Dispatcher> dispatcher2;
-    EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->DuplicateBufferHandle(
-                                  &options[i], &dispatcher2));
-    ASSERT_TRUE(dispatcher2);
-    EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher2->GetType());
-    {
-      std::unique_ptr<PlatformSharedBufferMapping> mapping;
-      EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->MapBuffer(0, 100, 0, &mapping));
-    }
-    EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->Close());
-  }
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close());
-}
-
-TEST_F(SharedBufferDispatcherTest, DuplicateBufferHandleOptionsInvalid) {
-  scoped_refptr<SharedBufferDispatcher> dispatcher1;
-  EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create(
-                                SharedBufferDispatcher::kDefaultCreateOptions,
-                                nullptr, 100, &dispatcher1));
-
-  // Invalid |struct_size|.
-  {
-    MojoDuplicateBufferHandleOptions options = {
-        1u, MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE};
-    scoped_refptr<Dispatcher> dispatcher2;
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              dispatcher1->DuplicateBufferHandle(&options, &dispatcher2));
-    EXPECT_FALSE(dispatcher2);
-  }
-
-  // Unknown |flags|.
-  {
-    MojoDuplicateBufferHandleOptions options = {
-        sizeof(MojoDuplicateBufferHandleOptions), ~0u};
-    scoped_refptr<Dispatcher> dispatcher2;
-    EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-              dispatcher1->DuplicateBufferHandle(&options, &dispatcher2));
-    EXPECT_FALSE(dispatcher2);
-  }
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close());
-}
-
-TEST_F(SharedBufferDispatcherTest, CreateInvalidNumBytes) {
-  // Size too big.
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            SharedBufferDispatcher::Create(
-                SharedBufferDispatcher::kDefaultCreateOptions, nullptr,
-                std::numeric_limits<uint64_t>::max(), &dispatcher));
-  EXPECT_FALSE(dispatcher);
-
-  // Zero size.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            SharedBufferDispatcher::Create(
-                SharedBufferDispatcher::kDefaultCreateOptions, nullptr, 0,
-                &dispatcher));
-  EXPECT_FALSE(dispatcher);
-}
-
-TEST_F(SharedBufferDispatcherTest, MapBufferInvalidArguments) {
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create(
-                                SharedBufferDispatcher::kDefaultCreateOptions,
-                                nullptr, 100, &dispatcher));
-
-  std::unique_ptr<PlatformSharedBufferMapping> mapping;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            dispatcher->MapBuffer(0, 101, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
-  EXPECT_FALSE(mapping);
-
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            dispatcher->MapBuffer(1, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
-  EXPECT_FALSE(mapping);
-
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            dispatcher->MapBuffer(0, 0, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
-  EXPECT_FALSE(mapping);
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/shared_buffer_unittest.cc b/mojo/edk/system/shared_buffer_unittest.cc
deleted file mode 100644
index 3a72872..0000000
--- a/mojo/edk/system/shared_buffer_unittest.cc
+++ /dev/null
@@ -1,318 +0,0 @@
-// Copyright 2015 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 <string.h>
-
-#include <string>
-#include <utility>
-
-#include "base/logging.h"
-#include "base/memory/shared_memory.h"
-#include "base/strings/string_piece.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-using SharedBufferTest = test::MojoTestBase;
-
-TEST_F(SharedBufferTest, CreateSharedBuffer) {
-  const std::string message = "hello";
-  MojoHandle h = CreateBuffer(message.size());
-  WriteToBuffer(h, 0, message);
-  ExpectBufferContents(h, 0, message);
-}
-
-TEST_F(SharedBufferTest, DuplicateSharedBuffer) {
-  const std::string message = "hello";
-  MojoHandle h = CreateBuffer(message.size());
-  WriteToBuffer(h, 0, message);
-
-  MojoHandle dupe = DuplicateBuffer(h, false);
-  ExpectBufferContents(dupe, 0, message);
-}
-
-TEST_F(SharedBufferTest, PassSharedBufferLocal) {
-  const std::string message = "hello";
-  MojoHandle h = CreateBuffer(message.size());
-  WriteToBuffer(h, 0, message);
-
-  MojoHandle dupe = DuplicateBuffer(h, false);
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-
-  WriteMessageWithHandles(p0, "...", &dupe, 1);
-  EXPECT_EQ("...", ReadMessageWithHandles(p1, &dupe, 1));
-
-  ExpectBufferContents(dupe, 0, message);
-}
-
-#if !defined(OS_IOS)
-
-// Reads a single message with a shared buffer handle, maps the buffer, copies
-// the message contents into it, then exits.
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CopyToBufferClient, SharedBufferTest, h) {
-  MojoHandle b;
-  std::string message = ReadMessageWithHandles(h, &b, 1);
-  WriteToBuffer(b, 0, message);
-
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_F(SharedBufferTest, PassSharedBufferCrossProcess) {
-  const std::string message = "hello";
-  MojoHandle b = CreateBuffer(message.size());
-
-  RUN_CHILD_ON_PIPE(CopyToBufferClient, h)
-    MojoHandle dupe = DuplicateBuffer(b, false);
-    WriteMessageWithHandles(h, message, &dupe, 1);
-    WriteMessage(h, "quit");
-  END_CHILD()
-
-  ExpectBufferContents(b, 0, message);
-}
-
-// Creates a new buffer, maps it, writes a message contents to it, unmaps it,
-// and finally passes it back to the parent.
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateBufferClient, SharedBufferTest, h) {
-  std::string message = ReadMessage(h);
-  MojoHandle b = CreateBuffer(message.size());
-  WriteToBuffer(b, 0, message);
-  WriteMessageWithHandles(h, "have a buffer", &b, 1);
-
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_F(SharedBufferTest, PassSharedBufferFromChild) {
-  const std::string message = "hello";
-  MojoHandle b;
-  RUN_CHILD_ON_PIPE(CreateBufferClient, h)
-    WriteMessage(h, message);
-    ReadMessageWithHandles(h, &b, 1);
-    WriteMessage(h, "quit");
-  END_CHILD()
-
-  ExpectBufferContents(b, 0, message);
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateAndPassBuffer, SharedBufferTest, h) {
-  // Receive a pipe handle over the primordial pipe. This will be connected to
-  // another child process.
-  MojoHandle other_child;
-  std::string message = ReadMessageWithHandles(h, &other_child, 1);
-
-  // Create a new shared buffer.
-  MojoHandle b = CreateBuffer(message.size());
-
-  // Send a copy of the buffer to the parent and the other child.
-  MojoHandle dupe = DuplicateBuffer(b, false);
-  WriteMessageWithHandles(h, "", &b, 1);
-  WriteMessageWithHandles(other_child, "", &dupe, 1);
-
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceiveAndEditBuffer, SharedBufferTest, h) {
-  // Receive a pipe handle over the primordial pipe. This will be connected to
-  // another child process (running CreateAndPassBuffer).
-  MojoHandle other_child;
-  std::string message = ReadMessageWithHandles(h, &other_child, 1);
-
-  // Receive a shared buffer from the other child.
-  MojoHandle b;
-  ReadMessageWithHandles(other_child, &b, 1);
-
-  // Write the message from the parent into the buffer and exit.
-  WriteToBuffer(b, 0, message);
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_F(SharedBufferTest, PassSharedBufferFromChildToChild) {
-  const std::string message = "hello";
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-
-  MojoHandle b;
-  RUN_CHILD_ON_PIPE(CreateAndPassBuffer, h0)
-    RUN_CHILD_ON_PIPE(ReceiveAndEditBuffer, h1)
-      // Send one end of the pipe to each child. The first child will create
-      // and pass a buffer to the second child and back to us. The second child
-      // will write our message into the buffer.
-      WriteMessageWithHandles(h0, message, &p0, 1);
-      WriteMessageWithHandles(h1, message, &p1, 1);
-
-      // Receive the buffer back from the first child.
-      ReadMessageWithHandles(h0, &b, 1);
-
-      WriteMessage(h1, "quit");
-    END_CHILD()
-    WriteMessage(h0, "quit");
-  END_CHILD()
-
-  // The second child should have written this message.
-  ExpectBufferContents(b, 0, message);
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateAndPassBufferParent, SharedBufferTest,
-                                  parent) {
-  RUN_CHILD_ON_PIPE(CreateAndPassBuffer, child)
-    // Read a pipe from the parent and forward it to our child.
-    MojoHandle pipe;
-    std::string message = ReadMessageWithHandles(parent, &pipe, 1);
-
-    WriteMessageWithHandles(child, message, &pipe, 1);
-
-    // Read a buffer handle from the child and pass it back to the parent.
-    MojoHandle buffer;
-    EXPECT_EQ("", ReadMessageWithHandles(child, &buffer, 1));
-    WriteMessageWithHandles(parent, "", &buffer, 1);
-
-    EXPECT_EQ("quit", ReadMessage(parent));
-    WriteMessage(child, "quit");
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceiveAndEditBufferParent, SharedBufferTest,
-                                  parent) {
-  RUN_CHILD_ON_PIPE(ReceiveAndEditBuffer, child)
-    // Read a pipe from the parent and forward it to our child.
-    MojoHandle pipe;
-    std::string message = ReadMessageWithHandles(parent, &pipe, 1);
-    WriteMessageWithHandles(child, message, &pipe, 1);
-
-    EXPECT_EQ("quit", ReadMessage(parent));
-    WriteMessage(child, "quit");
-  END_CHILD()
-}
-
-#if defined(OS_ANDROID) || defined(OS_MACOSX)
-// Android multi-process tests are not executing the new process. This is flaky.
-// Passing shared memory handles between cousins is not currently supported on
-// OSX.
-#define MAYBE_PassHandleBetweenCousins DISABLED_PassHandleBetweenCousins
-#else
-#define MAYBE_PassHandleBetweenCousins PassHandleBetweenCousins
-#endif
-TEST_F(SharedBufferTest, MAYBE_PassHandleBetweenCousins) {
-  const std::string message = "hello";
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-
-  // Spawn two children who will each spawn their own child. Make sure the
-  // grandchildren (cousins to each other) can pass platform handles.
-  MojoHandle b;
-  RUN_CHILD_ON_PIPE(CreateAndPassBufferParent, child1)
-    RUN_CHILD_ON_PIPE(ReceiveAndEditBufferParent, child2)
-      MojoHandle pipe[2];
-      CreateMessagePipe(&pipe[0], &pipe[1]);
-
-      WriteMessageWithHandles(child1, message, &pipe[0], 1);
-      WriteMessageWithHandles(child2, message, &pipe[1], 1);
-
-      // Receive the buffer back from the first child.
-      ReadMessageWithHandles(child1, &b, 1);
-
-      WriteMessage(child2, "quit");
-    END_CHILD()
-    WriteMessage(child1, "quit");
-  END_CHILD()
-
-  // The second grandchild should have written this message.
-  ExpectBufferContents(b, 0, message);
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReadAndMapWriteSharedBuffer,
-                                  SharedBufferTest, h) {
-  // Receive the shared buffer.
-  MojoHandle b;
-  EXPECT_EQ("hello", ReadMessageWithHandles(h, &b, 1));
-
-  // Read from the bufer.
-  ExpectBufferContents(b, 0, "hello");
-
-  // Extract the shared memory handle and try to map it writable.
-  base::SharedMemoryHandle shm_handle;
-  bool read_only = false;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            PassSharedMemoryHandle(b, &shm_handle, nullptr, &read_only));
-  base::SharedMemory shared_memory(shm_handle, false);
-  EXPECT_TRUE(read_only);
-  EXPECT_FALSE(shared_memory.Map(1234));
-
-  EXPECT_EQ("quit", ReadMessage(h));
-  WriteMessage(h, "ok");
-}
-
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_CreateAndPassReadOnlyBuffer DISABLED_CreateAndPassReadOnlyBuffer
-#else
-#define MAYBE_CreateAndPassReadOnlyBuffer CreateAndPassReadOnlyBuffer
-#endif
-TEST_F(SharedBufferTest, MAYBE_CreateAndPassReadOnlyBuffer) {
-  RUN_CHILD_ON_PIPE(ReadAndMapWriteSharedBuffer, h)
-    // Create a new shared buffer.
-    MojoHandle b = CreateBuffer(1234);
-    WriteToBuffer(b, 0, "hello");
-
-    // Send a read-only copy of the buffer to the child.
-    MojoHandle dupe = DuplicateBuffer(b, true /* read_only */);
-    WriteMessageWithHandles(h, "hello", &dupe, 1);
-
-    WriteMessage(h, "quit");
-    EXPECT_EQ("ok", ReadMessage(h));
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateAndPassReadOnlyBuffer,
-                                  SharedBufferTest, h) {
-  // Create a new shared buffer.
-  MojoHandle b = CreateBuffer(1234);
-  WriteToBuffer(b, 0, "hello");
-
-  // Send a read-only copy of the buffer to the parent.
-  MojoHandle dupe = DuplicateBuffer(b, true /* read_only */);
-  WriteMessageWithHandles(h, "", &dupe, 1);
-
-  EXPECT_EQ("quit", ReadMessage(h));
-  WriteMessage(h, "ok");
-}
-
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_CreateAndPassFromChildReadOnlyBuffer \
-    DISABLED_CreateAndPassFromChildReadOnlyBuffer
-#else
-#define MAYBE_CreateAndPassFromChildReadOnlyBuffer \
-    CreateAndPassFromChildReadOnlyBuffer
-#endif
-TEST_F(SharedBufferTest, MAYBE_CreateAndPassFromChildReadOnlyBuffer) {
-  RUN_CHILD_ON_PIPE(CreateAndPassReadOnlyBuffer, h)
-    MojoHandle b;
-    EXPECT_EQ("", ReadMessageWithHandles(h, &b, 1));
-    ExpectBufferContents(b, 0, "hello");
-
-    // Extract the shared memory handle and try to map it writable.
-    base::SharedMemoryHandle shm_handle;
-    bool read_only = false;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              PassSharedMemoryHandle(b, &shm_handle, nullptr, &read_only));
-    base::SharedMemory shared_memory(shm_handle, false);
-    EXPECT_TRUE(read_only);
-    EXPECT_FALSE(shared_memory.Map(1234));
-
-    WriteMessage(h, "quit");
-    EXPECT_EQ("ok", ReadMessage(h));
-  END_CHILD()
-}
-
-#endif  // !defined(OS_IOS)
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/signals_unittest.cc b/mojo/edk/system/signals_unittest.cc
deleted file mode 100644
index e8b0cd1..0000000
--- a/mojo/edk/system/signals_unittest.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-using SignalsTest = test::MojoTestBase;
-
-TEST_F(SignalsTest, QueryInvalidArguments) {
-  MojoHandleSignalsState state = {0, 0};
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoQueryHandleSignalsState(MOJO_HANDLE_INVALID, &state));
-
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoQueryHandleSignalsState(a, nullptr));
-}
-
-TEST_F(SignalsTest, QueryMessagePipeSignals) {
-  MojoHandleSignalsState state = {0, 0};
-
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(a, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfiable_signals);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(b, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfiable_signals);
-
-  WriteMessage(a, "ok");
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(b, MOJO_HANDLE_SIGNAL_READABLE));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(b, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfiable_signals);
-
-  EXPECT_EQ("ok", ReadMessage(b));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(b, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfiable_signals);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(b, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(b, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/system_impl_export.h b/mojo/edk/system/system_impl_export.h
deleted file mode 100644
index 5bbf005..0000000
--- a/mojo/edk/system/system_impl_export.h
+++ /dev/null
@@ -1,29 +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.
-
-#ifndef MOJO_EDK_SYSTEM_SYSTEM_IMPL_EXPORT_H_
-#define MOJO_EDK_SYSTEM_SYSTEM_IMPL_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(MOJO_SYSTEM_IMPL_IMPLEMENTATION)
-#define MOJO_SYSTEM_IMPL_EXPORT __declspec(dllexport)
-#else
-#define MOJO_SYSTEM_IMPL_EXPORT __declspec(dllimport)
-#endif  // defined(MOJO_SYSTEM_IMPL_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-#if defined(MOJO_SYSTEM_IMPL_IMPLEMENTATION)
-#define MOJO_SYSTEM_IMPL_EXPORT __attribute__((visibility("default")))
-#else
-#define MOJO_SYSTEM_IMPL_EXPORT
-#endif
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define MOJO_SYSTEM_IMPL_EXPORT
-#endif
-
-#endif  // MOJO_EDK_SYSTEM_SYSTEM_IMPL_EXPORT_H_
diff --git a/mojo/edk/system/test_utils.cc b/mojo/edk/system/test_utils.cc
deleted file mode 100644
index 4a39cf7..0000000
--- a/mojo/edk/system/test_utils.cc
+++ /dev/null
@@ -1,76 +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.
-
-#include "mojo/edk/system/test_utils.h"
-
-#include <stdint.h>
-
-#include <limits>
-
-#include "base/logging.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"  // For |Sleep()|.
-#include "build/build_config.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-MojoDeadline DeadlineFromMilliseconds(unsigned milliseconds) {
-  return static_cast<MojoDeadline>(milliseconds) * 1000;
-}
-
-MojoDeadline EpsilonDeadline() {
-// Originally, our epsilon timeout was 10 ms, which was mostly fine but flaky on
-// some Windows bots. I don't recall ever seeing flakes on other bots. At 30 ms
-// tests seem reliable on Windows bots, but not at 25 ms. We'd like this timeout
-// to be as small as possible (see the description in the .h file).
-//
-// Currently, |tiny_timeout()| is usually 100 ms (possibly scaled under ASAN,
-// etc.). Based on this, set it to (usually be) 30 ms on Windows and 20 ms
-// elsewhere.
-#if defined(OS_WIN) || defined(OS_ANDROID)
-  return (TinyDeadline() * 3) / 10;
-#else
-  return (TinyDeadline() * 2) / 10;
-#endif
-}
-
-MojoDeadline TinyDeadline() {
-  return static_cast<MojoDeadline>(
-      TestTimeouts::tiny_timeout().InMicroseconds());
-}
-
-MojoDeadline ActionDeadline() {
-  return static_cast<MojoDeadline>(
-      TestTimeouts::action_timeout().InMicroseconds());
-}
-
-void Sleep(MojoDeadline deadline) {
-  CHECK_LE(deadline,
-           static_cast<MojoDeadline>(std::numeric_limits<int64_t>::max()));
-  base::PlatformThread::Sleep(
-      base::TimeDelta::FromMicroseconds(static_cast<int64_t>(deadline)));
-}
-
-Stopwatch::Stopwatch() {
-}
-
-Stopwatch::~Stopwatch() {
-}
-
-void Stopwatch::Start() {
-  start_time_ = base::TimeTicks::Now();
-}
-
-MojoDeadline Stopwatch::Elapsed() {
-  int64_t result = (base::TimeTicks::Now() - start_time_).InMicroseconds();
-  // |DCHECK_GE|, not |CHECK_GE|, since this may be performance-important.
-  DCHECK_GE(result, 0);
-  return static_cast<MojoDeadline>(result);
-}
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/test_utils.h b/mojo/edk/system/test_utils.h
deleted file mode 100644
index 1c90dc1..0000000
--- a/mojo/edk/system/test_utils.h
+++ /dev/null
@@ -1,59 +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.
-
-#ifndef MOJO_EDK_SYSTEM_TEST_UTILS_H_
-#define MOJO_EDK_SYSTEM_TEST_UTILS_H_
-
-#include "base/macros.h"
-#include "base/time/time.h"
-#include "mojo/public/c/system/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-MojoDeadline DeadlineFromMilliseconds(unsigned milliseconds);
-
-// A timeout smaller than |TestTimeouts::tiny_timeout()|, as a |MojoDeadline|.
-// Warning: This may lead to flakiness, but this is unavoidable if, e.g., you're
-// trying to ensure that functions with timeouts are reasonably accurate. We
-// want this to be as small as possible without causing too much flakiness.
-MojoDeadline EpsilonDeadline();
-
-// |TestTimeouts::tiny_timeout()|, as a |MojoDeadline|. (Expect this to be on
-// the order of 100 ms.)
-MojoDeadline TinyDeadline();
-
-// |TestTimeouts::action_timeout()|, as a |MojoDeadline|. (Expect this to be on
-// the order of 10 s.)
-MojoDeadline ActionDeadline();
-
-// Sleeps for at least the specified duration.
-void Sleep(MojoDeadline deadline);
-
-// Stopwatch -------------------------------------------------------------------
-
-// A simple "stopwatch" for measuring time elapsed from a given starting point.
-class Stopwatch {
- public:
-  Stopwatch();
-  ~Stopwatch();
-
-  void Start();
-  // Returns the amount of time elapsed since the last call to |Start()| (in
-  // microseconds).
-  MojoDeadline Elapsed();
-
- private:
-  base::TimeTicks start_time_;
-
-  DISALLOW_COPY_AND_ASSIGN(Stopwatch);
-};
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_TEST_UTILS_H_
diff --git a/mojo/edk/system/watch.cc b/mojo/edk/system/watch.cc
deleted file mode 100644
index cf08ac3..0000000
--- a/mojo/edk/system/watch.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/watch.h"
-
-#include "mojo/edk/system/request_context.h"
-#include "mojo/edk/system/watcher_dispatcher.h"
-
-namespace mojo {
-namespace edk {
-
-Watch::Watch(const scoped_refptr<WatcherDispatcher>& watcher,
-             const scoped_refptr<Dispatcher>& dispatcher,
-             uintptr_t context,
-             MojoHandleSignals signals)
-    : watcher_(watcher),
-      dispatcher_(dispatcher),
-      context_(context),
-      signals_(signals) {}
-
-bool Watch::NotifyState(const HandleSignalsState& state,
-                        bool allowed_to_call_callback) {
-  AssertWatcherLockAcquired();
-
-  // NOTE: This method must NEVER call into |dispatcher_| directly, because it
-  // may be called while |dispatcher_| holds a lock.
-
-  MojoResult rv = MOJO_RESULT_SHOULD_WAIT;
-  RequestContext* const request_context = RequestContext::current();
-  if (state.satisfies(signals_)) {
-    rv = MOJO_RESULT_OK;
-    if (allowed_to_call_callback && rv != last_known_result_) {
-      request_context->AddWatchNotifyFinalizer(this, MOJO_RESULT_OK, state);
-    }
-  } else if (!state.can_satisfy(signals_)) {
-    rv = MOJO_RESULT_FAILED_PRECONDITION;
-    if (allowed_to_call_callback && rv != last_known_result_) {
-      request_context->AddWatchNotifyFinalizer(
-          this, MOJO_RESULT_FAILED_PRECONDITION, state);
-    }
-  }
-
-  last_known_signals_state_ =
-      *static_cast<const MojoHandleSignalsState*>(&state);
-  last_known_result_ = rv;
-  return ready();
-}
-
-void Watch::Cancel() {
-  RequestContext::current()->AddWatchCancelFinalizer(this);
-}
-
-void Watch::InvokeCallback(MojoResult result,
-                           const HandleSignalsState& state,
-                           MojoWatcherNotificationFlags flags) {
-  // We hold the lock through invocation to ensure that only one notification
-  // callback runs for this context at any given time.
-  base::AutoLock lock(notification_lock_);
-  if (result == MOJO_RESULT_CANCELLED) {
-    // Make sure cancellation is the last notification we dispatch.
-    DCHECK(!is_cancelled_);
-    is_cancelled_ = true;
-  } else if (is_cancelled_) {
-    return;
-  }
-
-  // NOTE: This will acquire |watcher_|'s internal lock. It's safe because a
-  // thread can only enter InvokeCallback() from within a RequestContext
-  // destructor where no dispatcher locks are held.
-  watcher_->InvokeWatchCallback(context_, result, state, flags);
-}
-
-Watch::~Watch() {}
-
-#if DCHECK_IS_ON()
-void Watch::AssertWatcherLockAcquired() const {
-  watcher_->lock_.AssertAcquired();
-}
-#endif
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/watch.h b/mojo/edk/system/watch.h
deleted file mode 100644
index f277de9..0000000
--- a/mojo/edk/system/watch.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_WATCH_H_
-#define MOJO_EDK_SYSTEM_WATCH_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/system/atomic_flag.h"
-#include "mojo/edk/system/handle_signals_state.h"
-
-namespace mojo {
-namespace edk {
-
-class Dispatcher;
-class WatcherDispatcher;
-
-// Encapsulates the state associated with a single watch context within a
-// watcher.
-//
-// Every Watch has its own cancellation state, and is captured by RequestContext
-// notification finalizers to avoid redundant context resolution during
-// finalizer execution.
-class Watch : public base::RefCountedThreadSafe<Watch> {
- public:
-  // Constructs a Watch which represents a watch within |watcher| associated
-  // with |context|, watching |dispatcher| for |signals|.
-  Watch(const scoped_refptr<WatcherDispatcher>& watcher,
-        const scoped_refptr<Dispatcher>& dispatcher,
-        uintptr_t context,
-        MojoHandleSignals signals);
-
-  // Notifies the Watch of a potential state change.
-  //
-  // If |allowed_to_call_callback| is true, this may add a notification
-  // finalizer to the current RequestContext to invoke the watcher's callback
-  // with this watch's context. See return values below.
-  //
-  // This is called directly by WatcherDispatcher whenever the Watch's observed
-  // dispatcher notifies the WatcherDispatcher of a state change.
-  //
-  // Returns |true| if the Watch entered or remains in a ready state as a result
-  // of the state change. If |allowed_to_call_callback| was true in this case,
-  // the Watch will have also attached a notification finalizer to the current
-  // RequestContext.
-  //
-  // Returns |false| if the
-  bool NotifyState(const HandleSignalsState& state,
-                   bool allowed_to_call_callback);
-
-  // Notifies the watch of cancellation ASAP. This will always be the last
-  // notification sent for the watch.
-  void Cancel();
-
-  // Finalizer method for RequestContexts. This method is invoked once for every
-  // notification finalizer added to a RequestContext by this object. This calls
-  // down into the WatcherDispatcher to do the actual notification call.
-  void InvokeCallback(MojoResult result,
-                      const HandleSignalsState& state,
-                      MojoWatcherNotificationFlags flags);
-
-  const scoped_refptr<Dispatcher>& dispatcher() const { return dispatcher_; }
-  uintptr_t context() const { return context_; }
-
-  MojoResult last_known_result() const {
-    AssertWatcherLockAcquired();
-    return last_known_result_;
-  }
-
-  MojoHandleSignalsState last_known_signals_state() const {
-    AssertWatcherLockAcquired();
-    return last_known_signals_state_;
-  }
-
-  bool ready() const {
-    AssertWatcherLockAcquired();
-    return last_known_result_ == MOJO_RESULT_OK ||
-           last_known_result_ == MOJO_RESULT_FAILED_PRECONDITION;
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<Watch>;
-
-  ~Watch();
-
-#if DCHECK_IS_ON()
-  void AssertWatcherLockAcquired() const;
-#else
-  void AssertWatcherLockAcquired() const {}
-#endif
-
-  const scoped_refptr<WatcherDispatcher> watcher_;
-  const scoped_refptr<Dispatcher> dispatcher_;
-  const uintptr_t context_;
-  const MojoHandleSignals signals_;
-
-  // The result code with which this Watch would notify if currently armed,
-  // based on the last known signaling state of |dispatcher_|. Guarded by the
-  // owning WatcherDispatcher's lock.
-  MojoResult last_known_result_ = MOJO_RESULT_UNKNOWN;
-
-  // The last known signaling state of |dispatcher_|. Guarded by the owning
-  // WatcherDispatcher's lock.
-  MojoHandleSignalsState last_known_signals_state_ = {0, 0};
-
-  // Guards |is_cancelled_| below and mutually excludes individual watch
-  // notification executions for this same watch context.
-  //
-  // Note that this should only be acquired from a RequestContext finalizer to
-  // ensure that no other internal locks are already held.
-  base::Lock notification_lock_;
-
-  // Guarded by |notification_lock_|.
-  bool is_cancelled_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(Watch);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_WATCH_H_
diff --git a/mojo/edk/system/watcher_dispatcher.cc b/mojo/edk/system/watcher_dispatcher.cc
deleted file mode 100644
index 409dd2a..0000000
--- a/mojo/edk/system/watcher_dispatcher.cc
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/watcher_dispatcher.h"
-
-#include <algorithm>
-#include <limits>
-#include <map>
-
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "mojo/edk/system/watch.h"
-
-namespace mojo {
-namespace edk {
-
-WatcherDispatcher::WatcherDispatcher(MojoWatcherCallback callback)
-    : callback_(callback) {}
-
-void WatcherDispatcher::NotifyHandleState(Dispatcher* dispatcher,
-                                          const HandleSignalsState& state) {
-  base::AutoLock lock(lock_);
-  auto it = watched_handles_.find(dispatcher);
-  if (it == watched_handles_.end())
-    return;
-
-  // Maybe fire a notification to the watch assoicated with this dispatcher,
-  // provided we're armed it cares about the new state.
-  if (it->second->NotifyState(state, armed_)) {
-    ready_watches_.insert(it->second.get());
-
-    // If we were armed and got here, we notified the watch. Disarm.
-    armed_ = false;
-  } else {
-    ready_watches_.erase(it->second.get());
-  }
-}
-
-void WatcherDispatcher::NotifyHandleClosed(Dispatcher* dispatcher) {
-  scoped_refptr<Watch> watch;
-  {
-    base::AutoLock lock(lock_);
-    auto it = watched_handles_.find(dispatcher);
-    if (it == watched_handles_.end())
-      return;
-
-    watch = std::move(it->second);
-
-    // Wipe out all state associated with the closed dispatcher.
-    watches_.erase(watch->context());
-    ready_watches_.erase(watch.get());
-    watched_handles_.erase(it);
-  }
-
-  // NOTE: It's important that this is called outside of |lock_| since it
-  // acquires internal Watch locks.
-  watch->Cancel();
-}
-
-void WatcherDispatcher::InvokeWatchCallback(
-    uintptr_t context,
-    MojoResult result,
-    const HandleSignalsState& state,
-    MojoWatcherNotificationFlags flags) {
-  {
-    // We avoid holding the lock during dispatch. It's OK for notification
-    // callbacks to close this watcher, and it's OK for notifications to race
-    // with closure, if for example the watcher is closed from another thread
-    // between this test and the invocation of |callback_| below.
-    //
-    // Because cancellation synchronously blocks all future notifications, and
-    // because notifications themselves are mutually exclusive for any given
-    // context, we still guarantee that a single MOJO_RESULT_CANCELLED result
-    // is the last notification received for any given context.
-    //
-    // This guarantee is sufficient to make safe, synchronized, per-context
-    // state management possible in user code.
-    base::AutoLock lock(lock_);
-    if (closed_ && result != MOJO_RESULT_CANCELLED)
-      return;
-  }
-
-  callback_(context, result, static_cast<MojoHandleSignalsState>(state), flags);
-}
-
-Dispatcher::Type WatcherDispatcher::GetType() const {
-  return Type::WATCHER;
-}
-
-MojoResult WatcherDispatcher::Close() {
-  // We swap out all the watched handle information onto the stack so we can
-  // call into their dispatchers without our own lock held.
-  std::map<uintptr_t, scoped_refptr<Watch>> watches;
-  {
-    base::AutoLock lock(lock_);
-    DCHECK(!closed_);
-    closed_ = true;
-    std::swap(watches, watches_);
-    watched_handles_.clear();
-  }
-
-  // Remove all refs from our watched dispatchers and fire cancellations.
-  for (auto& entry : watches) {
-    entry.second->dispatcher()->RemoveWatcherRef(this, entry.first);
-    entry.second->Cancel();
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult WatcherDispatcher::WatchDispatcher(
-    scoped_refptr<Dispatcher> dispatcher,
-    MojoHandleSignals signals,
-    uintptr_t context) {
-  // NOTE: Because it's critical to avoid acquiring any other dispatcher locks
-  // while |lock_| is held, we defer adding oursevles to the dispatcher until
-  // after we've updated all our own relevant state and released |lock_|.
-  {
-    base::AutoLock lock(lock_);
-    if (watches_.count(context) || watched_handles_.count(dispatcher.get()))
-      return MOJO_RESULT_ALREADY_EXISTS;
-
-    scoped_refptr<Watch> watch = new Watch(this, dispatcher, context, signals);
-    watches_.insert({context, watch});
-    auto result =
-        watched_handles_.insert(std::make_pair(dispatcher.get(), watch));
-    DCHECK(result.second);
-  }
-
-  MojoResult rv = dispatcher->AddWatcherRef(this, context);
-  if (rv != MOJO_RESULT_OK) {
-    // Oops. This was not a valid handle to watch. Undo the above work and
-    // fail gracefully.
-    base::AutoLock lock(lock_);
-    watches_.erase(context);
-    watched_handles_.erase(dispatcher.get());
-    return rv;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult WatcherDispatcher::CancelWatch(uintptr_t context) {
-  // We may remove the last stored ref to the Watch below, so we retain
-  // a reference on the stack.
-  scoped_refptr<Watch> watch;
-  {
-    base::AutoLock lock(lock_);
-    auto it = watches_.find(context);
-    if (it == watches_.end())
-      return MOJO_RESULT_NOT_FOUND;
-    watch = it->second;
-    watches_.erase(it);
-  }
-
-  // Mark the watch as cancelled so no further notifications get through.
-  watch->Cancel();
-
-  // We remove the watcher ref for this context before updating any more
-  // internal watcher state, ensuring that we don't receiving further
-  // notifications for this context.
-  watch->dispatcher()->RemoveWatcherRef(this, context);
-
-  {
-    base::AutoLock lock(lock_);
-    auto handle_it = watched_handles_.find(watch->dispatcher().get());
-    DCHECK(handle_it != watched_handles_.end());
-    ready_watches_.erase(handle_it->second.get());
-    watched_handles_.erase(handle_it);
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult WatcherDispatcher::Arm(
-    uint32_t* num_ready_contexts,
-    uintptr_t* ready_contexts,
-    MojoResult* ready_results,
-    MojoHandleSignalsState* ready_signals_states) {
-  base::AutoLock lock(lock_);
-  if (num_ready_contexts &&
-      (!ready_contexts || !ready_results || !ready_signals_states)) {
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-
-  if (watched_handles_.empty())
-    return MOJO_RESULT_NOT_FOUND;
-
-  if (ready_watches_.empty()) {
-    // Fast path: No watches are ready to notify, so we're done.
-    armed_ = true;
-    return MOJO_RESULT_OK;
-  }
-
-  if (num_ready_contexts) {
-    DCHECK_LE(ready_watches_.size(), std::numeric_limits<uint32_t>::max());
-    *num_ready_contexts = std::min(
-        *num_ready_contexts, static_cast<uint32_t>(ready_watches_.size()));
-
-    WatchSet::const_iterator next_ready_iter = ready_watches_.begin();
-    if (last_watch_to_block_arming_) {
-      // Find the next watch to notify in simple round-robin order on the
-      // |ready_watches_| map, wrapping around to the beginning if necessary.
-      next_ready_iter = ready_watches_.find(last_watch_to_block_arming_);
-      if (next_ready_iter != ready_watches_.end())
-        ++next_ready_iter;
-      if (next_ready_iter == ready_watches_.end())
-        next_ready_iter = ready_watches_.begin();
-    }
-
-    for (size_t i = 0; i < *num_ready_contexts; ++i) {
-      const Watch* const watch = *next_ready_iter;
-      ready_contexts[i] = watch->context();
-      ready_results[i] = watch->last_known_result();
-      ready_signals_states[i] = watch->last_known_signals_state();
-
-      // Iterate and wrap around.
-      last_watch_to_block_arming_ = watch;
-      ++next_ready_iter;
-      if (next_ready_iter == ready_watches_.end())
-        next_ready_iter = ready_watches_.begin();
-    }
-  }
-
-  return MOJO_RESULT_FAILED_PRECONDITION;
-}
-
-WatcherDispatcher::~WatcherDispatcher() {}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/watcher_dispatcher.h b/mojo/edk/system/watcher_dispatcher.h
deleted file mode 100644
index 605a315..0000000
--- a/mojo/edk/system/watcher_dispatcher.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_WATCHER_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_WATCHER_DISPATCHER_H_
-
-#include <map>
-#include <set>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/watcher.h"
-
-namespace mojo {
-namespace edk {
-
-class Watch;
-
-// The dispatcher type which backs watcher handles.
-class WatcherDispatcher : public Dispatcher {
- public:
-  // Constructs a new WatcherDispatcher which invokes |callback| when a
-  // registered watch observes some relevant state change.
-  explicit WatcherDispatcher(MojoWatcherCallback callback);
-
-  // Methods used by watched dispatchers to notify watchers of events.
-  void NotifyHandleState(Dispatcher* dispatcher,
-                         const HandleSignalsState& state);
-  void NotifyHandleClosed(Dispatcher* dispatcher);
-
-  // Method used by RequestContext (indirectly, via Watch) to complete
-  // notification operations from a safe stack frame to avoid reentrancy.
-  void InvokeWatchCallback(uintptr_t context,
-                           MojoResult result,
-                           const HandleSignalsState& state,
-                           MojoWatcherNotificationFlags flags);
-
-  // Dispatcher:
-  Type GetType() const override;
-  MojoResult Close() override;
-  MojoResult WatchDispatcher(scoped_refptr<Dispatcher> dispatcher,
-                             MojoHandleSignals signals,
-                             uintptr_t context) override;
-  MojoResult CancelWatch(uintptr_t context) override;
-  MojoResult Arm(uint32_t* num_ready_contexts,
-                 uintptr_t* ready_contexts,
-                 MojoResult* ready_results,
-                 MojoHandleSignalsState* ready_signals_states) override;
-
- private:
-  friend class Watch;
-
-  using WatchSet = std::set<const Watch*>;
-
-  ~WatcherDispatcher() override;
-
-  const MojoWatcherCallback callback_;
-
-  // Guards access to the fields below.
-  //
-  // NOTE: This may be acquired while holding another dispatcher's lock, as
-  // watched dispatchers call into WatcherDispatcher methods which lock this
-  // when issuing state change notifications. WatcherDispatcher must therefore
-  // take caution to NEVER acquire other dispatcher locks while this is held.
-  base::Lock lock_;
-
-  bool armed_ = false;
-  bool closed_ = false;
-
-  // A mapping from context to Watch.
-  std::map<uintptr_t, scoped_refptr<Watch>> watches_;
-
-  // A mapping from watched dispatcher to Watch.
-  std::map<Dispatcher*, scoped_refptr<Watch>> watched_handles_;
-
-  // The set of all Watch instances which are currently ready to signal. This is
-  // used for efficient arming behavior, as it allows for O(1) discovery of
-  // whether or not arming can succeed and quick determination of who's
-  // responsible if it can't.
-  WatchSet ready_watches_;
-
-  // Tracks the last Watch whose state was returned by Arm(). This is used to
-  // ensure consistent round-robin behavior in the event that multiple Watches
-  // remain ready over the span of several Arm() attempts.
-  //
-  // NOTE: This pointer is only used to index |ready_watches_| and may point to
-  // an invalid object. It must therefore never be dereferenced.
-  const Watch* last_watch_to_block_arming_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(WatcherDispatcher);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_WATCHER_DISPATCHER_H_
diff --git a/mojo/edk/system/watcher_set.cc b/mojo/edk/system/watcher_set.cc
deleted file mode 100644
index 0355b58..0000000
--- a/mojo/edk/system/watcher_set.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/watcher_set.h"
-
-#include <utility>
-
-namespace mojo {
-namespace edk {
-
-WatcherSet::WatcherSet(Dispatcher* owner) : owner_(owner) {}
-
-WatcherSet::~WatcherSet() = default;
-
-void WatcherSet::NotifyState(const HandleSignalsState& state) {
-  // Avoid notifying watchers if they have already seen this state.
-  if (last_known_state_.has_value() && state.equals(last_known_state_.value()))
-    return;
-  last_known_state_ = state;
-  for (const auto& entry : watchers_)
-    entry.first->NotifyHandleState(owner_, state);
-}
-
-void WatcherSet::NotifyClosed() {
-  for (const auto& entry : watchers_)
-    entry.first->NotifyHandleClosed(owner_);
-}
-
-MojoResult WatcherSet::Add(const scoped_refptr<WatcherDispatcher>& watcher,
-                           uintptr_t context,
-                           const HandleSignalsState& current_state) {
-  auto it = watchers_.find(watcher.get());
-  if (it == watchers_.end()) {
-    auto result =
-        watchers_.insert(std::make_pair(watcher.get(), Entry{watcher}));
-    it = result.first;
-  }
-
-  if (!it->second.contexts.insert(context).second)
-    return MOJO_RESULT_ALREADY_EXISTS;
-
-  if (last_known_state_.has_value() &&
-      !current_state.equals(last_known_state_.value())) {
-    // This new state may be relevant to everyone, in which case we just
-    // notify everyone.
-    NotifyState(current_state);
-  } else {
-    // Otherwise only notify the newly added Watcher.
-    watcher->NotifyHandleState(owner_, current_state);
-  }
-  return MOJO_RESULT_OK;
-}
-
-MojoResult WatcherSet::Remove(WatcherDispatcher* watcher, uintptr_t context) {
-  auto it = watchers_.find(watcher);
-  if (it == watchers_.end())
-    return MOJO_RESULT_NOT_FOUND;
-
-  ContextSet& contexts = it->second.contexts;
-  auto context_it = contexts.find(context);
-  if (context_it == contexts.end())
-    return MOJO_RESULT_NOT_FOUND;
-
-  contexts.erase(context_it);
-  if (contexts.empty())
-    watchers_.erase(it);
-
-  return MOJO_RESULT_OK;
-}
-
-WatcherSet::Entry::Entry(const scoped_refptr<WatcherDispatcher>& dispatcher)
-    : dispatcher(dispatcher) {}
-
-WatcherSet::Entry::Entry(Entry&& other) = default;
-
-WatcherSet::Entry::~Entry() = default;
-
-WatcherSet::Entry& WatcherSet::Entry::operator=(Entry&& other) = default;
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/watcher_set.h b/mojo/edk/system/watcher_set.h
deleted file mode 100644
index 2b7ef2c..0000000
--- a/mojo/edk/system/watcher_set.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_WATCHER_SET_H_
-#define MOJO_EDK_SYSTEM_WATCHER_SET_H_
-
-#include <map>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/optional.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/watcher_dispatcher.h"
-
-namespace mojo {
-namespace edk {
-
-// A WatcherSet maintains a set of references to WatcherDispatchers to be
-// notified when a handle changes state.
-//
-// Dispatchers which may be watched by a watcher should own a WatcherSet and
-// notify it of all relevant state changes.
-class WatcherSet {
- public:
-  // |owner| is the Dispatcher who owns this WatcherSet.
-  explicit WatcherSet(Dispatcher* owner);
-  ~WatcherSet();
-
-  // Notifies all watchers of the handle's current signals state.
-  void NotifyState(const HandleSignalsState& state);
-
-  // Notifies all watchers that this handle has been closed.
-  void NotifyClosed();
-
-  // Adds a new watcher+context.
-  MojoResult Add(const scoped_refptr<WatcherDispatcher>& watcher,
-                 uintptr_t context,
-                 const HandleSignalsState& current_state);
-
-  // Removes a watcher+context.
-  MojoResult Remove(WatcherDispatcher* watcher, uintptr_t context);
-
- private:
-  using ContextSet = std::set<uintptr_t>;
-
-  struct Entry {
-    Entry(const scoped_refptr<WatcherDispatcher>& dispatcher);
-    Entry(Entry&& other);
-    ~Entry();
-
-    Entry& operator=(Entry&& other);
-
-    scoped_refptr<WatcherDispatcher> dispatcher;
-    ContextSet contexts;
-
-   private:
-    DISALLOW_COPY_AND_ASSIGN(Entry);
-  };
-
-  Dispatcher* const owner_;
-  std::map<WatcherDispatcher*, Entry> watchers_;
-  base::Optional<HandleSignalsState> last_known_state_;
-
-  DISALLOW_COPY_AND_ASSIGN(WatcherSet);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_WATCHER_SET_H_
diff --git a/mojo/edk/system/watcher_unittest.cc b/mojo/edk/system/watcher_unittest.cc
deleted file mode 100644
index dd396cd..0000000
--- a/mojo/edk/system/watcher_unittest.cc
+++ /dev/null
@@ -1,1637 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-
-#include <map>
-#include <memory>
-#include <set>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/c/system/watcher.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-using WatcherTest = test::MojoTestBase;
-
-class WatchHelper {
- public:
-  using ContextCallback =
-      base::Callback<void(MojoResult, MojoHandleSignalsState)>;
-
-  WatchHelper() {}
-  ~WatchHelper() {}
-
-  MojoResult CreateWatcher(MojoHandle* handle) {
-    return MojoCreateWatcher(&Notify, handle);
-  }
-
-  uintptr_t CreateContext(const ContextCallback& callback) {
-    return CreateContextWithCancel(callback, base::Closure());
-  }
-
-  uintptr_t CreateContextWithCancel(const ContextCallback& callback,
-                                    const base::Closure& cancel_callback) {
-    auto context = base::MakeUnique<NotificationContext>(callback);
-    NotificationContext* raw_context = context.get();
-    raw_context->SetCancelCallback(base::Bind(
-        [](std::unique_ptr<NotificationContext> context,
-           const base::Closure& cancel_callback) {
-          if (cancel_callback)
-            cancel_callback.Run();
-        },
-        base::Passed(&context), cancel_callback));
-    return reinterpret_cast<uintptr_t>(raw_context);
-  }
-
- private:
-  class NotificationContext {
-   public:
-    explicit NotificationContext(const ContextCallback& callback)
-        : callback_(callback) {}
-
-    ~NotificationContext() {}
-
-    void SetCancelCallback(const base::Closure& cancel_callback) {
-      cancel_callback_ = cancel_callback;
-    }
-
-    void Notify(MojoResult result, MojoHandleSignalsState state) {
-      if (result == MOJO_RESULT_CANCELLED)
-        cancel_callback_.Run();
-      else
-        callback_.Run(result, state);
-    }
-
-   private:
-    const ContextCallback callback_;
-    base::Closure cancel_callback_;
-
-    DISALLOW_COPY_AND_ASSIGN(NotificationContext);
-  };
-
-  static void Notify(uintptr_t context,
-                     MojoResult result,
-                     MojoHandleSignalsState state,
-                     MojoWatcherNotificationFlags flags) {
-    reinterpret_cast<NotificationContext*>(context)->Notify(result, state);
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(WatchHelper);
-};
-
-class ThreadedRunner : public base::SimpleThread {
- public:
-  explicit ThreadedRunner(const base::Closure& callback)
-      : SimpleThread("ThreadedRunner"), callback_(callback) {}
-  ~ThreadedRunner() override {}
-
-  void Run() override { callback_.Run(); }
-
- private:
-  const base::Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadedRunner);
-};
-
-void ExpectNoNotification(uintptr_t context,
-                          MojoResult result,
-                          MojoHandleSignalsState state,
-                          MojoWatcherNotificationFlags flags) {
-  NOTREACHED();
-}
-
-void ExpectOnlyCancel(uintptr_t context,
-                      MojoResult result,
-                      MojoHandleSignalsState state,
-                      MojoWatcherNotificationFlags flags) {
-  EXPECT_EQ(result, MOJO_RESULT_CANCELLED);
-}
-
-TEST_F(WatcherTest, InvalidArguments) {
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoCreateWatcher(&ExpectNoNotification, nullptr));
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectNoNotification, &w));
-
-  // Try to watch unwatchable handles.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoWatch(w, w, MOJO_HANDLE_SIGNAL_READABLE, 0));
-  MojoHandle buffer_handle = CreateBuffer(42);
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoWatch(w, buffer_handle, MOJO_HANDLE_SIGNAL_READABLE, 0));
-
-  // Try to cancel a watch on an invalid watcher handle.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoCancelWatch(buffer_handle, 0));
-
-  // Try to arm an invalid handle.
-  EXPECT_EQ(
-      MOJO_RESULT_INVALID_ARGUMENT,
-      MojoArmWatcher(MOJO_HANDLE_INVALID, nullptr, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoArmWatcher(buffer_handle, nullptr, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(buffer_handle));
-
-  // Try to arm with a non-null count but at least one null output buffer.
-  uint32_t num_ready_contexts = 1;
-  uintptr_t ready_context;
-  MojoResult ready_result;
-  MojoHandleSignalsState ready_state;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoArmWatcher(w, &num_ready_contexts, nullptr, &ready_result,
-                           &ready_state));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoArmWatcher(w, &num_ready_contexts, &ready_context, nullptr,
-                           &ready_state));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoArmWatcher(w, &num_ready_contexts, &ready_context,
-                           &ready_result, nullptr));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, WatchMessagePipeReadable) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  int num_expected_notifications = 1;
-  const uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, int* expected_count, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_GT(*expected_count, 0);
-        *expected_count -= 1;
-
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        event->Signal();
-      },
-      &event, &num_expected_notifications));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  const char kMessage1[] = "hey hey hey hey";
-  const char kMessage2[] = "i said hey";
-  const char kMessage3[] = "what's goin' on?";
-
-  // Writing to |b| multiple times should notify exactly once.
-  WriteMessage(b, kMessage1);
-  WriteMessage(b, kMessage2);
-  event.Wait();
-
-  // This also shouldn't fire a notification; the watcher is still disarmed.
-  WriteMessage(b, kMessage3);
-
-  // Arming should fail with relevant information.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(readable_a_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-
-  // Flush the three messages from above.
-  EXPECT_EQ(kMessage1, ReadMessage(a));
-  EXPECT_EQ(kMessage2, ReadMessage(a));
-  EXPECT_EQ(kMessage3, ReadMessage(a));
-
-  // Now we can rearm the watcher.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-}
-
-TEST_F(WatcherTest, CloseWatchedMessagePipeHandle) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  const uintptr_t readable_a_context = helper.CreateContextWithCancel(
-      WatchHelper::ContextCallback(),
-      base::Bind([](base::WaitableEvent* event) { event->Signal(); }, &event));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-
-  // Test that closing a watched handle fires an appropriate notification, even
-  // when the watcher is unarmed.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, CloseWatchedMessagePipeHandlePeer) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  const uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-        event->Signal();
-      },
-      &event));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-
-  // Test that closing a watched handle's peer with an armed watcher fires an
-  // appropriate notification.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  event.Wait();
-
-  // And now arming should fail with correct information about |a|'s state.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(readable_a_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals &
-              MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-  EXPECT_FALSE(ready_states[0].satisfiable_signals &
-               MOJO_HANDLE_SIGNAL_READABLE);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-}
-
-TEST_F(WatcherTest, WatchDataPipeConsumerReadable) {
-  constexpr size_t kTestPipeCapacity = 64;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  int num_expected_notifications = 1;
-  const uintptr_t readable_consumer_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, int* expected_count, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_GT(*expected_count, 0);
-        *expected_count -= 1;
-
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        event->Signal();
-      },
-      &event, &num_expected_notifications));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, consumer, MOJO_HANDLE_SIGNAL_READABLE,
-                                      readable_consumer_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  const char kMessage1[] = "hey hey hey hey";
-  const char kMessage2[] = "i said hey";
-  const char kMessage3[] = "what's goin' on?";
-
-  // Writing to |producer| multiple times should notify exactly once.
-  WriteData(producer, kMessage1);
-  WriteData(producer, kMessage2);
-  event.Wait();
-
-  // This also shouldn't fire a notification; the watcher is still disarmed.
-  WriteData(producer, kMessage3);
-
-  // Arming should fail with relevant information.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(readable_consumer_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-
-  // Flush the three messages from above.
-  EXPECT_EQ(kMessage1, ReadData(consumer, sizeof(kMessage1) - 1));
-  EXPECT_EQ(kMessage2, ReadData(consumer, sizeof(kMessage2) - 1));
-  EXPECT_EQ(kMessage3, ReadData(consumer, sizeof(kMessage3) - 1));
-
-  // Now we can rearm the watcher.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-}
-
-TEST_F(WatcherTest, WatchDataPipeConsumerNewDataReadable) {
-  constexpr size_t kTestPipeCapacity = 64;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  int num_new_data_notifications = 0;
-  const uintptr_t new_data_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, int* notification_count, MojoResult result,
-         MojoHandleSignalsState state) {
-        *notification_count += 1;
-
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        event->Signal();
-      },
-      &event, &num_new_data_notifications));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, consumer, MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-                      new_data_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  const char kMessage1[] = "hey hey hey hey";
-  const char kMessage2[] = "i said hey";
-  const char kMessage3[] = "what's goin' on?";
-
-  // Writing to |producer| multiple times should notify exactly once.
-  WriteData(producer, kMessage1);
-  WriteData(producer, kMessage2);
-  event.Wait();
-
-  // This also shouldn't fire a notification; the watcher is still disarmed.
-  WriteData(producer, kMessage3);
-
-  // Arming should fail with relevant information.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(new_data_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-
-  // Attempt to read more data than is available. Should fail but clear the
-  // NEW_DATA_READABLE signal.
-  char large_buffer[512];
-  uint32_t large_read_size = 512;
-  EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            MojoReadData(consumer, large_buffer, &large_read_size,
-                         MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-  // Attempt to arm again. Should succeed.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  // Write more data. Should notify.
-  event.Reset();
-  WriteData(producer, kMessage1);
-  event.Wait();
-
-  // Reading some data should clear NEW_DATA_READABLE again so we can rearm.
-  EXPECT_EQ(kMessage1, ReadData(consumer, sizeof(kMessage1) - 1));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  EXPECT_EQ(2, num_new_data_notifications);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-}
-
-TEST_F(WatcherTest, WatchDataPipeProducerWritable) {
-  constexpr size_t kTestPipeCapacity = 8;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  // Half the capacity of the data pipe.
-  const char kTestData[] = "aaaa";
-  static_assert((sizeof(kTestData) - 1) * 2 == kTestPipeCapacity,
-                "Invalid test data for this test.");
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  int num_expected_notifications = 1;
-  const uintptr_t writable_producer_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, int* expected_count, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_GT(*expected_count, 0);
-        *expected_count -= 1;
-
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        event->Signal();
-      },
-      &event, &num_expected_notifications));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, producer, MOJO_HANDLE_SIGNAL_WRITABLE,
-                                      writable_producer_context));
-
-  // The producer is already writable, so arming should fail with relevant
-  // information.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(writable_producer_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  // Write some data, but don't fill the pipe yet. Arming should fail again.
-  WriteData(producer, kTestData);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(writable_producer_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  // Write more data, filling the pipe to capacity. Arming should succeed now.
-  WriteData(producer, kTestData);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  // Now read from the pipe, making the producer writable again. Should notify.
-  EXPECT_EQ(kTestData, ReadData(consumer, sizeof(kTestData) - 1));
-  event.Wait();
-
-  // Arming should fail again.
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(writable_producer_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  // Fill the pipe once more and arm the watcher. Should succeed.
-  WriteData(producer, kTestData);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-};
-
-TEST_F(WatcherTest, CloseWatchedDataPipeConsumerHandle) {
-  constexpr size_t kTestPipeCapacity = 8;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  const uintptr_t readable_consumer_context = helper.CreateContextWithCancel(
-      WatchHelper::ContextCallback(),
-      base::Bind([](base::WaitableEvent* event) { event->Signal(); }, &event));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, consumer, MOJO_HANDLE_SIGNAL_READABLE,
-                                      readable_consumer_context));
-
-  // Closing the consumer should fire a cancellation notification.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, CloseWatcherDataPipeConsumerHandlePeer) {
-  constexpr size_t kTestPipeCapacity = 8;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  const uintptr_t readable_consumer_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-        event->Signal();
-      },
-      &event));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, consumer, MOJO_HANDLE_SIGNAL_READABLE,
-                                      readable_consumer_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  // Closing the producer should fire a notification for an unsatisfiable watch.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-  event.Wait();
-
-  // Now attempt to rearm and expect appropriate error feedback.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(readable_consumer_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, ready_results[0]);
-  EXPECT_FALSE(ready_states[0].satisfiable_signals &
-               MOJO_HANDLE_SIGNAL_READABLE);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-}
-
-TEST_F(WatcherTest, CloseWatchedDataPipeProducerHandle) {
-  constexpr size_t kTestPipeCapacity = 8;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  const uintptr_t writable_producer_context = helper.CreateContextWithCancel(
-      WatchHelper::ContextCallback(),
-      base::Bind([](base::WaitableEvent* event) { event->Signal(); }, &event));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, producer, MOJO_HANDLE_SIGNAL_WRITABLE,
-                                      writable_producer_context));
-
-  // Closing the consumer should fire a cancellation notification.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, CloseWatchedDataPipeProducerHandlePeer) {
-  constexpr size_t kTestPipeCapacity = 8;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  const char kTestMessageFullCapacity[] = "xxxxxxxx";
-  static_assert(sizeof(kTestMessageFullCapacity) - 1 == kTestPipeCapacity,
-                "Invalid test message size for this test.");
-
-  // Make the pipe unwritable initially.
-  WriteData(producer, kTestMessageFullCapacity);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  const uintptr_t writable_producer_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-        event->Signal();
-      },
-      &event));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, producer, MOJO_HANDLE_SIGNAL_WRITABLE,
-                                      writable_producer_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  // Closing the consumer should fire a notification for an unsatisfiable watch,
-  // as the full data pipe can never be read from again and is therefore
-  // permanently full and unwritable.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-  event.Wait();
-
-  // Now attempt to rearm and expect appropriate error feedback.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(writable_producer_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, ready_results[0]);
-  EXPECT_FALSE(ready_states[0].satisfiable_signals &
-               MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-}
-
-TEST_F(WatcherTest, ArmWithNoWatches) {
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectNoNotification, &w));
-  EXPECT_EQ(MOJO_RESULT_NOT_FOUND,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, WatchDuplicateContext) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectOnlyCancel, &w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, 0));
-  EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
-            MojoWatch(w, b, MOJO_HANDLE_SIGNAL_READABLE, 0));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-}
-
-TEST_F(WatcherTest, CancelUnknownWatch) {
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectNoNotification, &w));
-  EXPECT_EQ(MOJO_RESULT_NOT_FOUND, MojoCancelWatch(w, 1234));
-}
-
-TEST_F(WatcherTest, ArmWithWatchAlreadySatisfied) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectOnlyCancel, &w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, a, MOJO_HANDLE_SIGNAL_WRITABLE, 0));
-
-  // |a| is always writable, so we can never arm this watcher.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(0u, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-}
-
-TEST_F(WatcherTest, ArmWithWatchAlreadyUnsatisfiable) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectOnlyCancel, &w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, 0));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-
-  // |b| is closed and never wrote any messages, so |a| won't be readable again.
-  // MojoArmWatcher() should fail, incidcating as much.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(0u, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals &
-              MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-  EXPECT_FALSE(ready_states[0].satisfiable_signals &
-               MOJO_HANDLE_SIGNAL_READABLE);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-}
-
-TEST_F(WatcherTest, MultipleWatches) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  base::WaitableEvent a_event(base::WaitableEvent::ResetPolicy::MANUAL,
-                              base::WaitableEvent::InitialState::NOT_SIGNALED);
-  base::WaitableEvent b_event(base::WaitableEvent::ResetPolicy::MANUAL,
-                              base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  int num_a_notifications = 0;
-  int num_b_notifications = 0;
-  auto notify_callback =
-      base::Bind([](base::WaitableEvent* event, int* notification_count,
-                    MojoResult result, MojoHandleSignalsState state) {
-        *notification_count += 1;
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        event->Signal();
-      });
-  uintptr_t readable_a_context = helper.CreateContext(
-      base::Bind(notify_callback, &a_event, &num_a_notifications));
-  uintptr_t readable_b_context = helper.CreateContext(
-      base::Bind(notify_callback, &b_event, &num_b_notifications));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  // Add two independent watch contexts to watch for |a| or |b| readability.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, b, MOJO_HANDLE_SIGNAL_READABLE, readable_b_context));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  const char kMessage1[] = "things are happening";
-  const char kMessage2[] = "ok. ok. ok. ok.";
-  const char kMessage3[] = "plz wake up";
-
-  // Writing to |b| should signal |a|'s watch.
-  WriteMessage(b, kMessage1);
-  a_event.Wait();
-  a_event.Reset();
-
-  // Subsequent messages on |b| should not trigger another notification.
-  WriteMessage(b, kMessage2);
-  WriteMessage(b, kMessage3);
-
-  // Messages on |a| also shouldn't trigger |b|'s notification, since the
-  // watcher should be disarmed by now.
-  WriteMessage(a, kMessage1);
-  WriteMessage(a, kMessage2);
-  WriteMessage(a, kMessage3);
-
-  // Arming should fail. Since we only ask for at most one context's information
-  // that's all we should get back. Which one we get is unspecified.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = 1;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_TRUE(ready_contexts[0] == readable_a_context ||
-              ready_contexts[0] == readable_b_context);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  // Now try arming again, verifying that both contexts are returned.
-  num_ready_contexts = kMaxReadyContexts;
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(2u, num_ready_contexts);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[1]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-  EXPECT_TRUE(ready_states[1].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-  EXPECT_TRUE((ready_contexts[0] == readable_a_context &&
-               ready_contexts[1] == readable_b_context) ||
-              (ready_contexts[0] == readable_b_context &&
-               ready_contexts[1] == readable_a_context));
-
-  // Flush out the test messages so we should be able to successfully rearm.
-  EXPECT_EQ(kMessage1, ReadMessage(a));
-  EXPECT_EQ(kMessage2, ReadMessage(a));
-  EXPECT_EQ(kMessage3, ReadMessage(a));
-  EXPECT_EQ(kMessage1, ReadMessage(b));
-  EXPECT_EQ(kMessage2, ReadMessage(b));
-  EXPECT_EQ(kMessage3, ReadMessage(b));
-
-  // Add a watch which is always satisfied, so we can't arm. Arming should fail
-  // with only this new watch's information.
-  uintptr_t writable_c_context = helper.CreateContext(base::Bind(
-      [](MojoResult result, MojoHandleSignalsState state) { NOTREACHED(); }));
-  MojoHandle c, d;
-  CreateMessagePipe(&c, &d);
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, c, MOJO_HANDLE_SIGNAL_WRITABLE, writable_c_context));
-  num_ready_contexts = kMaxReadyContexts;
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(writable_c_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  // Cancel the new watch and arming should succeed once again.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCancelWatch(w, writable_c_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(c));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(WatcherTest, NotifyOtherFromNotificationCallback) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA[] = "hello a";
-  static const char kTestMessageToB[] = "hello b";
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WatchHelper helper;
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](MojoHandle w, MojoHandle a, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ("hello a", ReadMessage(a));
-
-        // Re-arm the watcher and signal |b|.
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-        WriteMessage(a, kTestMessageToB);
-      },
-      w, a));
-
-  uintptr_t readable_b_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoHandle w, MojoHandle b,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ(kTestMessageToB, ReadMessage(b));
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-        event->Signal();
-      },
-      &event, w, b));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, b, MOJO_HANDLE_SIGNAL_READABLE, readable_b_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  // Send a message to |a|. The relevant watch context should be notified, and
-  // should in turn send a message to |b|, waking up the other context. The
-  // second context signals |event|.
-  WriteMessage(b, kTestMessageToA);
-  event.Wait();
-}
-
-TEST_F(WatcherTest, NotifySelfFromNotificationCallback) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA[] = "hello a";
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WatchHelper helper;
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  int expected_notifications = 10;
-  uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](int* expected_count, MojoHandle w, MojoHandle a, MojoHandle b,
-         base::WaitableEvent* event, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ("hello a", ReadMessage(a));
-
-        EXPECT_GT(*expected_count, 0);
-        *expected_count -= 1;
-        if (*expected_count == 0) {
-          event->Signal();
-          return;
-        } else {
-          // Re-arm the watcher and signal |a| again.
-          EXPECT_EQ(MOJO_RESULT_OK,
-                    MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-          WriteMessage(b, kTestMessageToA);
-        }
-      },
-      &expected_notifications, w, a, b, &event));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  // Send a message to |a|. When the watch above is notified, it will rearm and
-  // send another message to |a|. This will happen until
-  // |expected_notifications| reaches 0.
-  WriteMessage(b, kTestMessageToA);
-  event.Wait();
-}
-
-TEST_F(WatcherTest, ImplicitCancelOtherFromNotificationCallback) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle c, d;
-  CreateMessagePipe(&c, &d);
-
-  static const char kTestMessageToA[] = "hi a";
-  static const char kTestMessageToC[] = "hi c";
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WatchHelper helper;
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  uintptr_t readable_a_context = helper.CreateContextWithCancel(
-      base::Bind([](MojoResult result, MojoHandleSignalsState state) {
-        NOTREACHED();
-      }),
-      base::Bind([](base::WaitableEvent* event) { event->Signal(); }, &event));
-
-  uintptr_t readable_c_context = helper.CreateContext(base::Bind(
-      [](MojoHandle w, MojoHandle a, MojoHandle b, MojoHandle c,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ(kTestMessageToC, ReadMessage(c));
-
-        // Now rearm the watcher.
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // Must result in exactly ONE notification on the above context, for
-        // CANCELLED only. Because we cannot dispatch notifications until the
-        // stack unwinds, and because we must never dispatch non-cancellation
-        // notifications for a handle once it's been closed, we must be certain
-        // that cancellation due to closure preemptively invalidates any
-        // pending non-cancellation notifications queued on the current
-        // RequestContext, such as the one resulting from the WriteMessage here.
-        WriteMessage(b, kTestMessageToA);
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-
-        // Rearming should be fine since |a|'s watch should already be
-        // implicitly cancelled (even though the notification will not have
-        // been invoked yet.)
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // Nothing interesting should happen as a result of this.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-      },
-      w, a, b, c));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, c, MOJO_HANDLE_SIGNAL_READABLE, readable_c_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(d, kTestMessageToC);
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(c));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(WatcherTest, ExplicitCancelOtherFromNotificationCallback) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle c, d;
-  CreateMessagePipe(&c, &d);
-
-  static const char kTestMessageToA[] = "hi a";
-  static const char kTestMessageToC[] = "hi c";
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WatchHelper helper;
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](MojoResult result, MojoHandleSignalsState state) { NOTREACHED(); }));
-
-  uintptr_t readable_c_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, uintptr_t readable_a_context, MojoHandle w,
-         MojoHandle a, MojoHandle b, MojoHandle c, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ(kTestMessageToC, ReadMessage(c));
-
-        // Now rearm the watcher.
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // Should result in no notifications on the above context, because the
-        // watch will have been cancelled by the time the notification callback
-        // can execute.
-        WriteMessage(b, kTestMessageToA);
-        WriteMessage(b, kTestMessageToA);
-        EXPECT_EQ(MOJO_RESULT_OK, MojoCancelWatch(w, readable_a_context));
-
-        // Rearming should be fine now.
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // Nothing interesting should happen as a result of these.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-
-        event->Signal();
-      },
-      &event, readable_a_context, w, a, b, c));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, c, MOJO_HANDLE_SIGNAL_READABLE, readable_c_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(d, kTestMessageToC);
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(c));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(WatcherTest, NestedCancellation) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle c, d;
-  CreateMessagePipe(&c, &d);
-
-  static const char kTestMessageToA[] = "hey a";
-  static const char kTestMessageToC[] = "hey c";
-  static const char kTestMessageToD[] = "hey d";
-
-  // This is a tricky test. It establishes a watch on |b| using one watcher and
-  // watches on |c| and |d| using another watcher.
-  //
-  // A message is written to |d| to wake up |c|'s watch, and the notification
-  // handler for that event does the following:
-  //   1. Writes to |a| to eventually wake up |b|'s watcher.
-  //   2. Rearms |c|'s watcher.
-  //   3. Writes to |d| to eventually wake up |c|'s watcher again.
-  //
-  // Meanwhile, |b|'s watch notification handler cancels |c|'s watch altogether
-  // before writing to |c| to wake up |d|.
-  //
-  // The net result should be that |c|'s context only gets notified once (from
-  // the first write to |d| above) and everyone else gets notified as expected.
-
-  MojoHandle b_watcher;
-  MojoHandle cd_watcher;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&b_watcher));
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&cd_watcher));
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  uintptr_t readable_d_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoHandle d, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ(kTestMessageToD, ReadMessage(d));
-        event->Signal();
-      },
-      &event, d));
-
-  static int num_expected_c_notifications = 1;
-  uintptr_t readable_c_context = helper.CreateContext(base::Bind(
-      [](MojoHandle cd_watcher, MojoHandle a, MojoHandle c, MojoHandle d,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_GT(num_expected_c_notifications--, 0);
-
-        // Trigger an eventual |readable_b_context| notification.
-        WriteMessage(a, kTestMessageToA);
-
-        EXPECT_EQ(kTestMessageToC, ReadMessage(c));
-        EXPECT_EQ(MOJO_RESULT_OK, MojoArmWatcher(cd_watcher, nullptr, nullptr,
-                                                 nullptr, nullptr));
-
-        // Trigger another eventual |readable_c_context| notification.
-        WriteMessage(d, kTestMessageToC);
-      },
-      cd_watcher, a, c, d));
-
-  uintptr_t readable_b_context = helper.CreateContext(base::Bind(
-      [](MojoHandle cd_watcher, uintptr_t readable_c_context, MojoHandle c,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoCancelWatch(cd_watcher, readable_c_context));
-
-        EXPECT_EQ(MOJO_RESULT_OK, MojoArmWatcher(cd_watcher, nullptr, nullptr,
-                                                 nullptr, nullptr));
-
-        WriteMessage(c, kTestMessageToD);
-      },
-      cd_watcher, readable_c_context, c));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(b_watcher, b, MOJO_HANDLE_SIGNAL_READABLE,
-                                      readable_b_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(cd_watcher, c, MOJO_HANDLE_SIGNAL_READABLE,
-                      readable_c_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(cd_watcher, d, MOJO_HANDLE_SIGNAL_READABLE,
-                      readable_d_context));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(b_watcher, nullptr, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(cd_watcher, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(d, kTestMessageToC);
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(cd_watcher));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b_watcher));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(c));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(WatcherTest, CancelSelfInNotificationCallback) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA[] = "hey a";
-
-  MojoHandle w;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  static uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoHandle w, MojoHandle a,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-
-        // There should be no problem cancelling this watch from its own
-        // notification invocation.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoCancelWatch(w, readable_a_context));
-        EXPECT_EQ(kTestMessageToA, ReadMessage(a));
-
-        // Arming should fail because there are no longer any registered
-        // watches on the watcher.
-        EXPECT_EQ(MOJO_RESULT_NOT_FOUND,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // And closing |a| should be fine (and should not invoke this
-        // notification with MOJO_RESULT_CANCELLED) for the same reason.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-
-        event->Signal();
-      },
-      &event, w, a));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(b, kTestMessageToA);
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, CloseWatcherInNotificationCallback) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA1[] = "hey a";
-  static const char kTestMessageToA2[] = "hey a again";
-
-  MojoHandle w;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoHandle w, MojoHandle a, MojoHandle b,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ(kTestMessageToA1, ReadMessage(a));
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // There should be no problem closing this watcher from its own
-        // notification callback.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-
-        // And these should not trigger more notifications, because |w| has been
-        // closed already.
-        WriteMessage(b, kTestMessageToA2);
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-
-        event->Signal();
-      },
-      &event, w, a, b));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(b, kTestMessageToA1);
-  event.Wait();
-}
-
-TEST_F(WatcherTest, CloseWatcherAfterImplicitCancel) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA[] = "hey a";
-
-  MojoHandle w;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoHandle w, MojoHandle a,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ(kTestMessageToA, ReadMessage(a));
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // This will cue up a notification for |MOJO_RESULT_CANCELLED|...
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-
-        // ...but it should never fire because we close the watcher here.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-
-        event->Signal();
-      },
-      &event, w, a));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(b, kTestMessageToA);
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-}
-
-TEST_F(WatcherTest, OtherThreadCancelDuringNotification) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA[] = "hey a";
-
-  MojoHandle w;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  base::WaitableEvent wait_for_notification(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  base::WaitableEvent wait_for_cancellation(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  static bool callback_done = false;
-  uintptr_t readable_a_context = helper.CreateContextWithCancel(
-      base::Bind(
-          [](base::WaitableEvent* wait_for_notification, MojoHandle w,
-             MojoHandle a, MojoResult result, MojoHandleSignalsState state) {
-            EXPECT_EQ(MOJO_RESULT_OK, result);
-            EXPECT_EQ(kTestMessageToA, ReadMessage(a));
-
-            wait_for_notification->Signal();
-
-            // Give the other thread sufficient time to race with the completion
-            // of this callback. There should be no race, since the cancellation
-            // notification must be mutually exclusive to this notification.
-            base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
-
-            callback_done = true;
-          },
-          &wait_for_notification, w, a),
-      base::Bind(
-          [](base::WaitableEvent* wait_for_cancellation) {
-            EXPECT_TRUE(callback_done);
-            wait_for_cancellation->Signal();
-          },
-          &wait_for_cancellation));
-
-  ThreadedRunner runner(base::Bind(
-      [](base::WaitableEvent* wait_for_notification,
-         base::WaitableEvent* wait_for_cancellation, MojoHandle w,
-         uintptr_t readable_a_context) {
-        wait_for_notification->Wait();
-
-        // Cancel the watch while the notification is still running.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoCancelWatch(w, readable_a_context));
-
-        wait_for_cancellation->Wait();
-
-        EXPECT_TRUE(callback_done);
-      },
-      &wait_for_notification, &wait_for_cancellation, w, readable_a_context));
-  runner.Start();
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(b, kTestMessageToA);
-  runner.Join();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, WatchesCancelEachOtherFromNotifications) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA[] = "hey a";
-  static const char kTestMessageToB[] = "hey b";
-
-  base::WaitableEvent wait_for_a_to_notify(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  base::WaitableEvent wait_for_b_to_notify(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  base::WaitableEvent wait_for_a_to_cancel(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  base::WaitableEvent wait_for_b_to_cancel(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  MojoHandle a_watcher;
-  MojoHandle b_watcher;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&a_watcher));
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&b_watcher));
-
-  // We set up two watchers, one on |a| and one on |b|. They cancel each other
-  // from within their respective watch notifications. This should be safe,
-  // i.e., it should not deadlock, in spite of the fact that we also guarantee
-  // mutually exclusive notification execution (including cancellations) on any
-  // given watch.
-  bool a_cancelled = false;
-  bool b_cancelled = false;
-  static uintptr_t readable_b_context;
-  uintptr_t readable_a_context = helper.CreateContextWithCancel(
-      base::Bind(
-          [](base::WaitableEvent* wait_for_a_to_notify,
-             base::WaitableEvent* wait_for_b_to_notify, MojoHandle b_watcher,
-             MojoHandle a, MojoResult result, MojoHandleSignalsState state) {
-            EXPECT_EQ(MOJO_RESULT_OK, result);
-            EXPECT_EQ(kTestMessageToA, ReadMessage(a));
-            wait_for_a_to_notify->Signal();
-            wait_for_b_to_notify->Wait();
-            EXPECT_EQ(MOJO_RESULT_OK,
-                      MojoCancelWatch(b_watcher, readable_b_context));
-            EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b_watcher));
-          },
-          &wait_for_a_to_notify, &wait_for_b_to_notify, b_watcher, a),
-      base::Bind(
-          [](base::WaitableEvent* wait_for_a_to_cancel,
-             base::WaitableEvent* wait_for_b_to_cancel, bool* a_cancelled) {
-            *a_cancelled = true;
-            wait_for_a_to_cancel->Signal();
-            wait_for_b_to_cancel->Wait();
-          },
-          &wait_for_a_to_cancel, &wait_for_b_to_cancel, &a_cancelled));
-
-  readable_b_context = helper.CreateContextWithCancel(
-      base::Bind(
-          [](base::WaitableEvent* wait_for_a_to_notify,
-             base::WaitableEvent* wait_for_b_to_notify,
-             uintptr_t readable_a_context, MojoHandle a_watcher, MojoHandle b,
-             MojoResult result, MojoHandleSignalsState state) {
-            EXPECT_EQ(MOJO_RESULT_OK, result);
-            EXPECT_EQ(kTestMessageToB, ReadMessage(b));
-            wait_for_b_to_notify->Signal();
-            wait_for_a_to_notify->Wait();
-            EXPECT_EQ(MOJO_RESULT_OK,
-                      MojoCancelWatch(a_watcher, readable_a_context));
-            EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a_watcher));
-          },
-          &wait_for_a_to_notify, &wait_for_b_to_notify, readable_a_context,
-          a_watcher, b),
-      base::Bind(
-          [](base::WaitableEvent* wait_for_a_to_cancel,
-             base::WaitableEvent* wait_for_b_to_cancel, bool* b_cancelled) {
-            *b_cancelled = true;
-            wait_for_b_to_cancel->Signal();
-            wait_for_a_to_cancel->Wait();
-          },
-          &wait_for_a_to_cancel, &wait_for_b_to_cancel, &b_cancelled));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(a_watcher, a, MOJO_HANDLE_SIGNAL_READABLE,
-                                      readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(a_watcher, nullptr, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(b_watcher, b, MOJO_HANDLE_SIGNAL_READABLE,
-                                      readable_b_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(b_watcher, nullptr, nullptr, nullptr, nullptr));
-
-  ThreadedRunner runner(
-      base::Bind([](MojoHandle b) { WriteMessage(b, kTestMessageToA); }, b));
-  runner.Start();
-
-  WriteMessage(a, kTestMessageToB);
-
-  wait_for_a_to_cancel.Wait();
-  wait_for_b_to_cancel.Wait();
-  runner.Join();
-
-  EXPECT_TRUE(a_cancelled);
-  EXPECT_TRUE(b_cancelled);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-}
-
-TEST_F(WatcherTest, AlwaysCancel) {
-  // Basic sanity check to ensure that all possible ways to cancel a watch
-  // result in a final MOJO_RESULT_CANCELLED notification.
-
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle w;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  const base::Closure signal_event =
-      base::Bind(&base::WaitableEvent::Signal, base::Unretained(&event));
-
-  // Cancel via |MojoCancelWatch()|.
-  uintptr_t context = helper.CreateContextWithCancel(
-      WatchHelper::ContextCallback(), signal_event);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, context));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCancelWatch(w, context));
-  event.Wait();
-  event.Reset();
-
-  // Cancel by closing the watched handle.
-  context = helper.CreateContextWithCancel(WatchHelper::ContextCallback(),
-                                           signal_event);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, context));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  event.Wait();
-  event.Reset();
-
-  // Cancel by closing the watcher handle.
-  context = helper.CreateContextWithCancel(WatchHelper::ContextCallback(),
-                                           signal_event);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, b, MOJO_HANDLE_SIGNAL_READABLE, context));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-}
-
-TEST_F(WatcherTest, ArmFailureCirculation) {
-  // Sanity check to ensure that all ready handles will eventually be returned
-  // over a finite number of calls to MojoArmWatcher().
-
-  constexpr size_t kNumTestPipes = 100;
-  constexpr size_t kNumTestHandles = kNumTestPipes * 2;
-  MojoHandle handles[kNumTestHandles];
-
-  // Create a bunch of pipes and make sure they're all readable.
-  for (size_t i = 0; i < kNumTestPipes; ++i) {
-    CreateMessagePipe(&handles[i], &handles[i + kNumTestPipes]);
-    WriteMessage(handles[i], "hey");
-    WriteMessage(handles[i + kNumTestPipes], "hay");
-    WaitForSignals(handles[i], MOJO_HANDLE_SIGNAL_READABLE);
-    WaitForSignals(handles[i + kNumTestPipes], MOJO_HANDLE_SIGNAL_READABLE);
-  }
-
-  // Create a watcher and watch all of them.
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectOnlyCancel, &w));
-  for (size_t i = 0; i < kNumTestHandles; ++i) {
-    EXPECT_EQ(MOJO_RESULT_OK,
-              MojoWatch(w, handles[i], MOJO_HANDLE_SIGNAL_READABLE, i));
-  }
-
-  // Keep trying to arm |w| until every watch gets an entry in |ready_contexts|.
-  // If MojoArmWatcher() is well-behaved, this should terminate eventually.
-  std::set<uintptr_t> ready_contexts;
-  while (ready_contexts.size() < kNumTestHandles) {
-    uint32_t num_ready_contexts = 1;
-    uintptr_t ready_context;
-    MojoResult ready_result;
-    MojoHandleSignalsState ready_state;
-    EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-              MojoArmWatcher(w, &num_ready_contexts, &ready_context,
-                             &ready_result, &ready_state));
-    EXPECT_EQ(1u, num_ready_contexts);
-    EXPECT_EQ(MOJO_RESULT_OK, ready_result);
-    ready_contexts.insert(ready_context);
-  }
-
-  for (size_t i = 0; i < kNumTestHandles; ++i)
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(handles[i]));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/test/BUILD.gn b/mojo/edk/test/BUILD.gn
deleted file mode 100644
index a15456a..0000000
--- a/mojo/edk/test/BUILD.gn
+++ /dev/null
@@ -1,131 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//testing/test.gni")
-
-static_library("test_support") {
-  testonly = true
-  sources = [
-    "mojo_test_base.cc",
-    "mojo_test_base.h",
-    "test_utils.h",
-    "test_utils_posix.cc",
-    "test_utils_win.cc",
-  ]
-
-  if (!is_ios) {
-    sources += [
-      "multiprocess_test_helper.cc",
-      "multiprocess_test_helper.h",
-    ]
-  }
-
-  deps = [
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/system",
-    "//mojo/public/cpp/system",
-    "//testing/gtest",
-  ]
-}
-
-source_set("run_all_unittests") {
-  testonly = true
-  sources = [
-    "run_all_unittests.cc",
-  ]
-
-  deps = [
-    ":test_support",
-    ":test_support_impl",
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/system",
-    "//mojo/public/c/test_support",
-    "//testing/gtest",
-  ]
-
-  if (is_linux && !is_component_build) {
-    public_configs = [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
-  }
-}
-
-source_set("run_all_perftests") {
-  testonly = true
-  deps = [
-    ":test_support_impl",
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/system",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/c/test_support",
-  ]
-
-  sources = [
-    "run_all_perftests.cc",
-  ]
-
-  if (is_linux && !is_component_build) {
-    public_configs = [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
-  }
-}
-
-static_library("test_support_impl") {
-  testonly = true
-  deps = [
-    "//base",
-    "//base/test:test_support",
-    "//mojo/public/c/test_support",
-    "//mojo/public/cpp/system",
-  ]
-
-  sources = [
-    "test_support_impl.cc",
-    "test_support_impl.h",
-  ]
-}
-
-# Public SDK test targets follow. These targets are not defined within the
-# public SDK itself as running the unittests requires the EDK.
-# TODO(vtl): These don't really belong here. (They should be converted to
-# apptests, but even apart from that these targets belong somewhere else.)
-
-group("public_tests") {
-  testonly = true
-  deps = [
-    ":mojo_public_bindings_unittests",
-    ":mojo_public_system_perftests",
-    ":mojo_public_system_unittests",
-  ]
-}
-
-test("mojo_public_bindings_perftests") {
-  deps = [
-    ":run_all_perftests",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/bindings/tests:perftests",
-  ]
-}
-
-test("mojo_public_bindings_unittests") {
-  deps = [
-    ":run_all_unittests",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/bindings/tests",
-  ]
-}
-
-test("mojo_public_system_perftests") {
-  deps = [
-    ":run_all_perftests",
-    "//mojo/public/c/system/tests:perftests",
-  ]
-}
-
-test("mojo_public_system_unittests") {
-  deps = [
-    ":run_all_unittests",
-    "//mojo/public/cpp/system/tests",
-  ]
-}
diff --git a/mojo/edk/test/mojo_test_base.cc b/mojo/edk/test/mojo_test_base.cc
deleted file mode 100644
index 71a5e3b..0000000
--- a/mojo/edk/test/mojo_test_base.cc
+++ /dev/null
@@ -1,327 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/test/mojo_test_base.h"
-
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/synchronization/waitable_event.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/watcher.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "base/mac/mach_port_broker.h"
-#endif
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-namespace {
-base::MachPortBroker* g_mach_broker = nullptr;
-}
-#endif
-
-MojoTestBase::MojoTestBase() {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  if (!g_mach_broker) {
-    g_mach_broker = new base::MachPortBroker("mojo_test");
-    CHECK(g_mach_broker->Init());
-    SetMachPortProvider(g_mach_broker);
-  }
-#endif
-}
-
-MojoTestBase::~MojoTestBase() {}
-
-MojoTestBase::ClientController& MojoTestBase::StartClient(
-    const std::string& client_name) {
-  clients_.push_back(base::MakeUnique<ClientController>(
-      client_name, this, process_error_callback_, launch_type_));
-  return *clients_.back();
-}
-
-MojoTestBase::ClientController::ClientController(
-    const std::string& client_name,
-    MojoTestBase* test,
-    const ProcessErrorCallback& process_error_callback,
-    LaunchType launch_type) {
-#if !defined(OS_IOS)
-#if defined(OS_MACOSX)
-  // This lock needs to be held while launching the child because the Mach port
-  // broker only allows task ports to be received from known child processes.
-  // However, it can only know the child process's pid after the child has
-  // launched. To prevent a race where the child process sends its task port
-  // before the pid has been registered, the lock needs to be held over both
-  // launch and child pid registration.
-  base::AutoLock lock(g_mach_broker->GetLock());
-#endif
-  helper_.set_process_error_callback(process_error_callback);
-  pipe_ = helper_.StartChild(client_name, launch_type);
-#if defined(OS_MACOSX)
-  g_mach_broker->AddPlaceholderForPid(helper_.test_child().Handle());
-#endif
-#endif
-}
-
-MojoTestBase::ClientController::~ClientController() {
-  CHECK(was_shutdown_)
-      << "Test clients should be waited on explicitly with WaitForShutdown().";
-}
-
-void MojoTestBase::ClientController::ClosePeerConnection() {
-#if !defined(OS_IOS)
-  helper_.ClosePeerConnection();
-#endif
-}
-
-int MojoTestBase::ClientController::WaitForShutdown() {
-  was_shutdown_ = true;
-#if !defined(OS_IOS)
-  int retval = helper_.WaitForChildShutdown();
-#if defined(OS_MACOSX)
-  base::AutoLock lock(g_mach_broker->GetLock());
-  g_mach_broker->InvalidatePid(helper_.test_child().Handle());
-#endif
-  return retval;
-#else
-  NOTREACHED();
-  return 1;
-#endif
-}
-
-// static
-void MojoTestBase::CloseHandle(MojoHandle h) {
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h));
-}
-
-// static
-void MojoTestBase::CreateMessagePipe(MojoHandle *p0, MojoHandle* p1) {
-  MojoCreateMessagePipe(nullptr, p0, p1);
-  CHECK_NE(*p0, MOJO_HANDLE_INVALID);
-  CHECK_NE(*p1, MOJO_HANDLE_INVALID);
-}
-
-// static
-void MojoTestBase::WriteMessageWithHandles(MojoHandle mp,
-                                           const std::string& message,
-                                           const MojoHandle *handles,
-                                           uint32_t num_handles) {
-  CHECK_EQ(MojoWriteMessage(mp, message.data(),
-                            static_cast<uint32_t>(message.size()),
-                            handles, num_handles, MOJO_WRITE_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-}
-
-// static
-void MojoTestBase::WriteMessage(MojoHandle mp, const std::string& message) {
-  WriteMessageWithHandles(mp, message, nullptr, 0);
-}
-
-// static
-std::string MojoTestBase::ReadMessageWithHandles(
-    MojoHandle mp,
-    MojoHandle* handles,
-    uint32_t expected_num_handles) {
-  CHECK_EQ(WaitForSignals(mp, MOJO_HANDLE_SIGNAL_READABLE), MOJO_RESULT_OK);
-
-  uint32_t message_size = 0;
-  uint32_t num_handles = 0;
-  CHECK_EQ(MojoReadMessage(mp, nullptr, &message_size, nullptr, &num_handles,
-                           MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_RESOURCE_EXHAUSTED);
-  CHECK_EQ(expected_num_handles, num_handles);
-
-  std::string message(message_size, 'x');
-  CHECK_EQ(MojoReadMessage(mp, &message[0], &message_size, handles,
-                           &num_handles, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(message_size, message.size());
-  CHECK_EQ(num_handles, expected_num_handles);
-
-  return message;
-}
-
-// static
-std::string MojoTestBase::ReadMessageWithOptionalHandle(MojoHandle mp,
-                                                        MojoHandle* handle) {
-  CHECK_EQ(WaitForSignals(mp, MOJO_HANDLE_SIGNAL_READABLE), MOJO_RESULT_OK);
-
-  uint32_t message_size = 0;
-  uint32_t num_handles = 0;
-  CHECK_EQ(MojoReadMessage(mp, nullptr, &message_size, nullptr, &num_handles,
-                           MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_RESOURCE_EXHAUSTED);
-  CHECK(num_handles == 0 || num_handles == 1);
-
-  CHECK(handle);
-
-  std::string message(message_size, 'x');
-  CHECK_EQ(MojoReadMessage(mp, &message[0], &message_size, handle,
-                           &num_handles, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(message_size, message.size());
-  CHECK(num_handles == 0 || num_handles == 1);
-
-  if (num_handles)
-    CHECK_NE(*handle, MOJO_HANDLE_INVALID);
-  else
-    *handle = MOJO_HANDLE_INVALID;
-
-  return message;
-}
-
-// static
-std::string MojoTestBase::ReadMessage(MojoHandle mp) {
-  return ReadMessageWithHandles(mp, nullptr, 0);
-}
-
-// static
-void MojoTestBase::ReadMessage(MojoHandle mp,
-                               char* data,
-                               size_t num_bytes) {
-  CHECK_EQ(WaitForSignals(mp, MOJO_HANDLE_SIGNAL_READABLE), MOJO_RESULT_OK);
-
-  uint32_t message_size = 0;
-  uint32_t num_handles = 0;
-  CHECK_EQ(MojoReadMessage(mp, nullptr, &message_size, nullptr, &num_handles,
-                           MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_RESOURCE_EXHAUSTED);
-  CHECK_EQ(num_handles, 0u);
-  CHECK_EQ(message_size, num_bytes);
-
-  CHECK_EQ(MojoReadMessage(mp, data, &message_size, nullptr, &num_handles,
-                           MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(num_handles, 0u);
-  CHECK_EQ(message_size, num_bytes);
-}
-
-// static
-void MojoTestBase::VerifyTransmission(MojoHandle source,
-                                      MojoHandle dest,
-                                      const std::string& message) {
-  WriteMessage(source, message);
-
-  // We don't use EXPECT_EQ; failures on really long messages make life hard.
-  EXPECT_TRUE(message == ReadMessage(dest));
-}
-
-// static
-void MojoTestBase::VerifyEcho(MojoHandle mp,
-                              const std::string& message) {
-  VerifyTransmission(mp, mp, message);
-}
-
-// static
-MojoHandle MojoTestBase::CreateBuffer(uint64_t size) {
-  MojoHandle h;
-  EXPECT_EQ(MojoCreateSharedBuffer(nullptr, size, &h), MOJO_RESULT_OK);
-  return h;
-}
-
-// static
-MojoHandle MojoTestBase::DuplicateBuffer(MojoHandle h, bool read_only) {
-  MojoHandle new_handle;
-  MojoDuplicateBufferHandleOptions options = {
-    sizeof(MojoDuplicateBufferHandleOptions),
-    MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE
-  };
-  if (read_only)
-    options.flags |= MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoDuplicateBufferHandle(h, &options, &new_handle));
-  return new_handle;
-}
-
-// static
-void MojoTestBase::WriteToBuffer(MojoHandle h,
-                                 size_t offset,
-                                 const base::StringPiece& s) {
-  char* data;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(h, offset, s.size(), reinterpret_cast<void**>(&data),
-                          MOJO_MAP_BUFFER_FLAG_NONE));
-  memcpy(data, s.data(), s.size());
-  EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(static_cast<void*>(data)));
-}
-
-// static
-void MojoTestBase::ExpectBufferContents(MojoHandle h,
-                                        size_t offset,
-                                        const base::StringPiece& s) {
-  char* data;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(h, offset, s.size(), reinterpret_cast<void**>(&data),
-                          MOJO_MAP_BUFFER_FLAG_NONE));
-  EXPECT_EQ(s, base::StringPiece(data, s.size()));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(static_cast<void*>(data)));
-}
-
-// static
-void MojoTestBase::CreateDataPipe(MojoHandle *p0,
-                                  MojoHandle* p1,
-                                  size_t capacity) {
-  MojoCreateDataPipeOptions options;
-  options.struct_size = static_cast<uint32_t>(sizeof(options));
-  options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
-  options.element_num_bytes = 1;
-  options.capacity_num_bytes = static_cast<uint32_t>(capacity);
-
-  MojoCreateDataPipe(&options, p0, p1);
-  CHECK_NE(*p0, MOJO_HANDLE_INVALID);
-  CHECK_NE(*p1, MOJO_HANDLE_INVALID);
-}
-
-// static
-void MojoTestBase::WriteData(MojoHandle producer, const std::string& data) {
-  CHECK_EQ(WaitForSignals(producer, MOJO_HANDLE_SIGNAL_WRITABLE),
-           MOJO_RESULT_OK);
-  uint32_t num_bytes = static_cast<uint32_t>(data.size());
-  CHECK_EQ(MojoWriteData(producer, data.data(), &num_bytes,
-                         MOJO_WRITE_DATA_FLAG_ALL_OR_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(num_bytes, static_cast<uint32_t>(data.size()));
-}
-
-// static
-std::string MojoTestBase::ReadData(MojoHandle consumer, size_t size) {
-  CHECK_EQ(WaitForSignals(consumer, MOJO_HANDLE_SIGNAL_READABLE),
-           MOJO_RESULT_OK);
-  std::vector<char> buffer(size);
-  uint32_t num_bytes = static_cast<uint32_t>(size);
-  CHECK_EQ(MojoReadData(consumer, buffer.data(), &num_bytes,
-                         MOJO_WRITE_DATA_FLAG_ALL_OR_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(num_bytes, static_cast<uint32_t>(size));
-
-  return std::string(buffer.data(), buffer.size());
-}
-
-// static
-MojoHandleSignalsState MojoTestBase::GetSignalsState(MojoHandle handle) {
-  MojoHandleSignalsState signals_state;
-  CHECK_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(handle, &signals_state));
-  return signals_state;
-}
-
-// static
-MojoResult MojoTestBase::WaitForSignals(MojoHandle handle,
-                                        MojoHandleSignals signals,
-                                        MojoHandleSignalsState* state) {
-  return Wait(Handle(handle), signals, state);
-}
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/test/mojo_test_base.h b/mojo/edk/test/mojo_test_base.h
deleted file mode 100644
index 35e2c2b..0000000
--- a/mojo/edk/test/mojo_test_base.h
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_TEST_MOJO_TEST_BASE_H_
-#define MOJO_EDK_TEST_MOJO_TEST_BASE_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-class MojoTestBase : public testing::Test {
- public:
-  MojoTestBase();
-  ~MojoTestBase() override;
-
-  using LaunchType = MultiprocessTestHelper::LaunchType;
-  using HandlerCallback = base::Callback<void(ScopedMessagePipeHandle)>;
-
-  class ClientController {
-   public:
-    ClientController(const std::string& client_name,
-                     MojoTestBase* test,
-                     const ProcessErrorCallback& process_error_callback,
-                     LaunchType launch_type);
-    ~ClientController();
-
-    MojoHandle pipe() const { return pipe_.get().value(); }
-
-    void ClosePeerConnection();
-    int WaitForShutdown();
-
-   private:
-    friend class MojoTestBase;
-
-#if !defined(OS_IOS)
-    MultiprocessTestHelper helper_;
-#endif
-    ScopedMessagePipeHandle pipe_;
-    bool was_shutdown_ = false;
-
-    DISALLOW_COPY_AND_ASSIGN(ClientController);
-  };
-
-  // Set the callback to handle bad messages received from test client
-  // processes. This can be set to a different callback before starting each
-  // client.
-  void set_process_error_callback(const ProcessErrorCallback& callback) {
-    process_error_callback_ = callback;
-  }
-
-  ClientController& StartClient(const std::string& client_name);
-
-  template <typename HandlerFunc>
-  void StartClientWithHandler(const std::string& client_name,
-                              HandlerFunc handler) {
-    int expected_exit_code = 0;
-    ClientController& c = StartClient(client_name);
-    handler(c.pipe(), &expected_exit_code);
-    EXPECT_EQ(expected_exit_code, c.WaitForShutdown());
-  }
-
-  // Closes a handle and expects success.
-  static void CloseHandle(MojoHandle h);
-
-  ////// Message pipe test utilities ///////
-
-  // Creates a new pipe, returning endpoint handles in |p0| and |p1|.
-  static void CreateMessagePipe(MojoHandle* p0, MojoHandle* p1);
-
-  // Writes a string to the pipe, transferring handles in the process.
-  static void WriteMessageWithHandles(MojoHandle mp,
-                                     const std::string& message,
-                                     const MojoHandle* handles,
-                                     uint32_t num_handles);
-
-  // Writes a string to the pipe with no handles.
-  static void WriteMessage(MojoHandle mp, const std::string& message);
-
-  // Reads a string from the pipe, expecting to read an exact number of handles
-  // in the process. Returns the read string.
-  static std::string ReadMessageWithHandles(MojoHandle mp,
-                                           MojoHandle* handles,
-                                           uint32_t expected_num_handles);
-
-  // Reads a string from the pipe, expecting either zero or one handles.
-  // If no handle is read, |handle| will be reset.
-  static std::string ReadMessageWithOptionalHandle(MojoHandle mp,
-                                                  MojoHandle* handle);
-
-  // Reads a string from the pipe, expecting to read no handles.
-  // Returns the string.
-  static std::string ReadMessage(MojoHandle mp);
-
-  // Reads a string from the pipe, expecting to read no handles and exactly
-  // |num_bytes| bytes, which are read into |data|.
-  static void ReadMessage(MojoHandle mp, char* data, size_t num_bytes);
-
-  // Writes |message| to |in| and expects to read it back from |out|.
-  static void VerifyTransmission(MojoHandle in,
-                                 MojoHandle out,
-                                 const std::string& message);
-
-  // Writes |message| to |mp| and expects to read it back from the same handle.
-  static void VerifyEcho(MojoHandle mp, const std::string& message);
-
-  //////// Shared buffer test utilities /////////
-
-  // Creates a new shared buffer.
-  static MojoHandle CreateBuffer(uint64_t size);
-
-  // Duplicates a shared buffer to a new handle.
-  static MojoHandle DuplicateBuffer(MojoHandle h, bool read_only);
-
-  // Maps a buffer, writes some data into it, and unmaps it.
-  static void WriteToBuffer(MojoHandle h,
-                            size_t offset,
-                            const base::StringPiece& s);
-
-  // Maps a buffer, tests the value of some of its contents, and unmaps it.
-  static void ExpectBufferContents(MojoHandle h,
-                                   size_t offset,
-                                   const base::StringPiece& s);
-
-  //////// Data pipe test utilities /////////
-
-  // Creates a new data pipe.
-  static void CreateDataPipe(MojoHandle* producer,
-                             MojoHandle* consumer,
-                             size_t capacity);
-
-  // Writes data to a data pipe.
-  static void WriteData(MojoHandle producer, const std::string& data);
-
-  // Reads data from a data pipe.
-  static std::string ReadData(MojoHandle consumer, size_t size);
-
-  // Queries the signals state of |handle|.
-  static MojoHandleSignalsState GetSignalsState(MojoHandle handle);
-
-  // Helper to block the calling thread waiting for signals to be raised.
-  static MojoResult WaitForSignals(MojoHandle handle,
-                                   MojoHandleSignals signals,
-                                   MojoHandleSignalsState* state = nullptr);
-
-  void set_launch_type(LaunchType launch_type) { launch_type_ = launch_type; }
-
- private:
-  friend class ClientController;
-
-  std::vector<std::unique_ptr<ClientController>> clients_;
-
-  ProcessErrorCallback process_error_callback_;
-
-  LaunchType launch_type_ = LaunchType::CHILD;
-
-  DISALLOW_COPY_AND_ASSIGN(MojoTestBase);
-};
-
-// Launches a new child process running the test client |client_name| connected
-// to a new message pipe bound to |pipe_name|. |pipe_name| is automatically
-// closed on test teardown.
-#define RUN_CHILD_ON_PIPE(client_name, pipe_name)                   \
-    StartClientWithHandler(                                         \
-        #client_name,                                               \
-        [&](MojoHandle pipe_name, int *expected_exit_code) { {
-
-// Waits for the client to terminate and expects a return code of zero.
-#define END_CHILD()               \
-        }                         \
-        *expected_exit_code = 0;  \
-    });
-
-// Wait for the client to terminate with a specific return code.
-#define END_CHILD_AND_EXPECT_EXIT_CODE(code) \
-        }                                    \
-        *expected_exit_code = code;          \
-    });
-
-// Use this to declare the child process's "main()" function for tests using
-// MojoTestBase and MultiprocessTestHelper. It returns an |int|, which will
-// will be the process's exit code (but see the comment about
-// WaitForChildShutdown()).
-//
-// The function is defined as a subclass of |test_base| to facilitate shared
-// code between test clients and to allow clients to spawn children themselves.
-//
-// |pipe_name| will be bound to the MojoHandle of a message pipe connected
-// to the parent process (see RUN_CHILD_ON_PIPE above.) This pipe handle is
-// automatically closed on test client teardown.
-#if !defined(OS_IOS)
-#define DEFINE_TEST_CLIENT_WITH_PIPE(client_name, test_base, pipe_name)     \
-  class client_name##_MainFixture : public test_base {                      \
-    void TestBody() override {}                                             \
-   public:                                                                  \
-    int Main(MojoHandle);                                                   \
-  };                                                                        \
-  MULTIPROCESS_TEST_MAIN_WITH_SETUP(                                        \
-      client_name##TestChildMain,                                           \
-      ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {              \
-    client_name##_MainFixture test;                                         \
-    return ::mojo::edk::test::MultiprocessTestHelper::RunClientMain(        \
-        base::Bind(&client_name##_MainFixture::Main,                        \
-                   base::Unretained(&test)));                               \
-  }                                                                         \
-  int client_name##_MainFixture::Main(MojoHandle pipe_name)
-
-// This is a version of DEFINE_TEST_CLIENT_WITH_PIPE which can be used with
-// gtest ASSERT/EXPECT macros.
-#define DEFINE_TEST_CLIENT_TEST_WITH_PIPE(client_name, test_base, pipe_name) \
-  class client_name##_MainFixture : public test_base {                       \
-    void TestBody() override {}                                              \
-   public:                                                                   \
-    void Main(MojoHandle);                                                   \
-  };                                                                         \
-  MULTIPROCESS_TEST_MAIN_WITH_SETUP(                                         \
-      client_name##TestChildMain,                                            \
-      ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {               \
-    client_name##_MainFixture test;                                          \
-    return ::mojo::edk::test::MultiprocessTestHelper::RunClientTestMain(     \
-        base::Bind(&client_name##_MainFixture::Main,                         \
-                   base::Unretained(&test)));                                \
-  }                                                                          \
-  void client_name##_MainFixture::Main(MojoHandle pipe_name)
-#else  // !defined(OS_IOS)
-#define DEFINE_TEST_CLIENT_WITH_PIPE(client_name, test_base, pipe_name)
-#define DEFINE_TEST_CLIENT_TEST_WITH_PIPE(client_name, test_base, pipe_name)
-#endif  // !defined(OS_IOS)
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_TEST_MOJO_TEST_BASE_H_
diff --git a/mojo/edk/test/multiprocess_test_helper.cc b/mojo/edk/test/multiprocess_test_helper.cc
deleted file mode 100644
index cf37782..0000000
--- a/mojo/edk/test/multiprocess_test_helper.cc
+++ /dev/null
@@ -1,263 +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.
-
-#include "mojo/edk/test/multiprocess_test_helper.h"
-
-#include <functional>
-#include <set>
-#include <utility>
-
-#include "base/base_paths.h"
-#include "base/base_switches.h"
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/path_service.h"
-#include "base/process/kill.h"
-#include "base/process/process_handle.h"
-#include "base/run_loop.h"
-#include "base/strings/stringprintf.h"
-#include "base/task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-#include "mojo/edk/embedder/pending_process_connection.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-#include "base/mac/mach_port_broker.h"
-#endif
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-namespace {
-
-const char kMojoPrimordialPipeToken[] = "mojo-primordial-pipe-token";
-const char kMojoNamedPipeName[] = "mojo-named-pipe-name";
-
-template <typename Func>
-int RunClientFunction(Func handler, bool pass_pipe_ownership_to_main) {
-  CHECK(MultiprocessTestHelper::primordial_pipe.is_valid());
-  ScopedMessagePipeHandle pipe =
-      std::move(MultiprocessTestHelper::primordial_pipe);
-  MessagePipeHandle pipe_handle =
-      pass_pipe_ownership_to_main ? pipe.release() : pipe.get();
-  return handler(pipe_handle.value());
-}
-
-}  // namespace
-
-MultiprocessTestHelper::MultiprocessTestHelper() {}
-
-MultiprocessTestHelper::~MultiprocessTestHelper() {
-  CHECK(!test_child_.process.IsValid());
-}
-
-ScopedMessagePipeHandle MultiprocessTestHelper::StartChild(
-    const std::string& test_child_name,
-    LaunchType launch_type) {
-  return StartChildWithExtraSwitch(test_child_name, std::string(),
-                                   std::string(), launch_type);
-}
-
-ScopedMessagePipeHandle MultiprocessTestHelper::StartChildWithExtraSwitch(
-    const std::string& test_child_name,
-    const std::string& switch_string,
-    const std::string& switch_value,
-    LaunchType launch_type) {
-  CHECK(!test_child_name.empty());
-  CHECK(!test_child_.process.IsValid());
-
-  std::string test_child_main = test_child_name + "TestChildMain";
-
-  // Manually construct the new child's commandline to avoid copying unwanted
-  // values.
-  base::CommandLine command_line(
-      base::GetMultiProcessTestChildBaseCommandLine().GetProgram());
-
-  std::set<std::string> uninherited_args;
-  uninherited_args.insert("mojo-platform-channel-handle");
-  uninherited_args.insert(switches::kTestChildProcess);
-
-  // Copy commandline switches from the parent process, except for the
-  // multiprocess client name and mojo message pipe handle; this allows test
-  // clients to spawn other test clients.
-  for (const auto& entry :
-          base::CommandLine::ForCurrentProcess()->GetSwitches()) {
-    if (uninherited_args.find(entry.first) == uninherited_args.end())
-      command_line.AppendSwitchNative(entry.first, entry.second);
-  }
-
-  PlatformChannelPair channel;
-  NamedPlatformHandle named_pipe;
-  HandlePassingInformation handle_passing_info;
-  if (launch_type == LaunchType::CHILD || launch_type == LaunchType::PEER) {
-    channel.PrepareToPassClientHandleToChildProcess(&command_line,
-                                                    &handle_passing_info);
-  } else if (launch_type == LaunchType::NAMED_CHILD ||
-             launch_type == LaunchType::NAMED_PEER) {
-#if defined(OS_POSIX)
-    base::FilePath temp_dir;
-    CHECK(base::PathService::Get(base::DIR_TEMP, &temp_dir));
-    named_pipe = NamedPlatformHandle(
-        temp_dir.AppendASCII(GenerateRandomToken()).value());
-#else
-    named_pipe = NamedPlatformHandle(GenerateRandomToken());
-#endif
-    command_line.AppendSwitchNative(kMojoNamedPipeName, named_pipe.name);
-  }
-
-  if (!switch_string.empty()) {
-    CHECK(!command_line.HasSwitch(switch_string));
-    if (!switch_value.empty())
-      command_line.AppendSwitchASCII(switch_string, switch_value);
-    else
-      command_line.AppendSwitch(switch_string);
-  }
-
-  base::LaunchOptions options;
-#if defined(OS_POSIX)
-  options.fds_to_remap = &handle_passing_info;
-#elif defined(OS_WIN)
-  options.start_hidden = true;
-  if (base::win::GetVersion() >= base::win::VERSION_VISTA)
-    options.handles_to_inherit = &handle_passing_info;
-  else
-    options.inherit_handles = true;
-#else
-#error "Not supported yet."
-#endif
-
-  // NOTE: In the case of named pipes, it's important that the server handle be
-  // created before the child process is launched; otherwise the server binding
-  // the pipe path can race with child's connection to the pipe.
-  ScopedPlatformHandle server_handle;
-  if (launch_type == LaunchType::CHILD || launch_type == LaunchType::PEER) {
-    server_handle = channel.PassServerHandle();
-  } else if (launch_type == LaunchType::NAMED_CHILD ||
-             launch_type == LaunchType::NAMED_PEER) {
-    server_handle = CreateServerHandle(named_pipe);
-  }
-
-  PendingProcessConnection process;
-  ScopedMessagePipeHandle pipe;
-  if (launch_type == LaunchType::CHILD ||
-      launch_type == LaunchType::NAMED_CHILD) {
-    std::string pipe_token;
-    pipe = process.CreateMessagePipe(&pipe_token);
-    command_line.AppendSwitchASCII(kMojoPrimordialPipeToken, pipe_token);
-  } else if (launch_type == LaunchType::PEER ||
-             launch_type == LaunchType::NAMED_PEER) {
-    peer_token_ = mojo::edk::GenerateRandomToken();
-    pipe = ConnectToPeerProcess(std::move(server_handle), peer_token_);
-  }
-
-  test_child_ =
-      base::SpawnMultiProcessTestChild(test_child_main, command_line, options);
-  if (launch_type == LaunchType::CHILD || launch_type == LaunchType::PEER)
-    channel.ChildProcessLaunched();
-
-  if (launch_type == LaunchType::CHILD ||
-      launch_type == LaunchType::NAMED_CHILD) {
-    DCHECK(server_handle.is_valid());
-    process.Connect(test_child_.process.Handle(),
-                    ConnectionParams(std::move(server_handle)),
-                    process_error_callback_);
-  }
-
-  CHECK(test_child_.process.IsValid());
-  return pipe;
-}
-
-int MultiprocessTestHelper::WaitForChildShutdown() {
-  CHECK(test_child_.process.IsValid());
-
-  int rv = -1;
-  WaitForMultiprocessTestChildExit(test_child_.process,
-                                   TestTimeouts::action_timeout(), &rv);
-  test_child_.process.Close();
-  return rv;
-}
-
-void MultiprocessTestHelper::ClosePeerConnection() {
-  DCHECK(!peer_token_.empty());
-  ::mojo::edk::ClosePeerConnection(peer_token_);
-  peer_token_.clear();
-}
-
-bool MultiprocessTestHelper::WaitForChildTestShutdown() {
-  return WaitForChildShutdown() == 0;
-}
-
-// static
-void MultiprocessTestHelper::ChildSetup() {
-  CHECK(base::CommandLine::InitializedForCurrentProcess());
-
-  std::string primordial_pipe_token =
-      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          kMojoPrimordialPipeToken);
-  NamedPlatformHandle named_pipe(
-      base::CommandLine::ForCurrentProcess()->GetSwitchValueNative(
-          kMojoNamedPipeName));
-  if (!primordial_pipe_token.empty()) {
-    primordial_pipe = CreateChildMessagePipe(primordial_pipe_token);
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    CHECK(base::MachPortBroker::ChildSendTaskPortToParent("mojo_test"));
-#endif
-    if (named_pipe.is_valid()) {
-      SetParentPipeHandle(CreateClientHandle(named_pipe));
-    } else {
-      SetParentPipeHandle(
-          PlatformChannelPair::PassClientHandleFromParentProcess(
-              *base::CommandLine::ForCurrentProcess()));
-    }
-  } else {
-    if (named_pipe.is_valid()) {
-      primordial_pipe = ConnectToPeerProcess(CreateClientHandle(named_pipe));
-    } else {
-      primordial_pipe = ConnectToPeerProcess(
-          PlatformChannelPair::PassClientHandleFromParentProcess(
-              *base::CommandLine::ForCurrentProcess()));
-    }
-  }
-}
-
-// static
-int MultiprocessTestHelper::RunClientMain(
-    const base::Callback<int(MojoHandle)>& main,
-    bool pass_pipe_ownership_to_main) {
-  return RunClientFunction(
-      [main](MojoHandle handle) { return main.Run(handle); },
-      pass_pipe_ownership_to_main);
-}
-
-// static
-int MultiprocessTestHelper::RunClientTestMain(
-    const base::Callback<void(MojoHandle)>& main) {
-  return RunClientFunction(
-      [main](MojoHandle handle) {
-        main.Run(handle);
-        return (::testing::Test::HasFatalFailure() ||
-                ::testing::Test::HasNonfatalFailure())
-                   ? 1
-                   : 0;
-      },
-      true /* close_pipe_on_exit */);
-}
-
-// static
-mojo::ScopedMessagePipeHandle MultiprocessTestHelper::primordial_pipe;
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/test/multiprocess_test_helper.h b/mojo/edk/test/multiprocess_test_helper.h
deleted file mode 100644
index dc1c9bc..0000000
--- a/mojo/edk/test/multiprocess_test_helper.h
+++ /dev/null
@@ -1,110 +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.
-
-#ifndef MOJO_EDK_TEST_MULTIPROCESS_TEST_HELPER_H_
-#define MOJO_EDK_TEST_MULTIPROCESS_TEST_HELPER_H_
-
-#include <string>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/process/process.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/test_timeouts.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "testing/multiprocess_func_list.h"
-
-namespace mojo {
-
-namespace edk {
-
-namespace test {
-
-class MultiprocessTestHelper {
- public:
-  using HandlerCallback = base::Callback<void(ScopedMessagePipeHandle)>;
-
-  enum class LaunchType {
-    // Launch the child process as a child in the mojo system.
-    CHILD,
-
-    // Launch the child process as an unrelated peer process in the mojo system.
-    PEER,
-
-    // Launch the child process as a child in the mojo system, using a named
-    // pipe.
-    NAMED_CHILD,
-
-    // Launch the child process as an unrelated peer process in the mojo
-    // system, using a named pipe.
-    NAMED_PEER,
-  };
-
-  MultiprocessTestHelper();
-  ~MultiprocessTestHelper();
-
-  // Start a child process and run the "main" function "named" |test_child_name|
-  // declared using |MOJO_MULTIPROCESS_TEST_CHILD_MAIN()| or
-  // |MOJO_MULTIPROCESS_TEST_CHILD_TEST()| (below).
-  ScopedMessagePipeHandle StartChild(
-      const std::string& test_child_name,
-      LaunchType launch_type = LaunchType::CHILD);
-
-  // Like |StartChild()|, but appends an extra switch (with ASCII value) to the
-  // command line. (The switch must not already be present in the default
-  // command line.)
-  ScopedMessagePipeHandle StartChildWithExtraSwitch(
-      const std::string& test_child_name,
-      const std::string& switch_string,
-      const std::string& switch_value,
-      LaunchType launch_type);
-
-  void set_process_error_callback(const ProcessErrorCallback& callback) {
-    process_error_callback_ = callback;
-  }
-
-  void ClosePeerConnection();
-
-  // Wait for the child process to terminate.
-  // Returns the exit code of the child process. Note that, though it's declared
-  // to be an |int|, the exit code is subject to mangling by the OS. E.g., we
-  // usually return -1 on error in the child (e.g., if |test_child_name| was not
-  // found), but this is mangled to 255 on Linux. You should only rely on codes
-  // 0-127 being preserved, and -1 being outside the range 0-127.
-  int WaitForChildShutdown();
-
-  // Like |WaitForChildShutdown()|, but returns true on success (exit code of 0)
-  // and false otherwise. You probably want to do something like
-  // |EXPECT_TRUE(WaitForChildTestShutdown());|.
-  bool WaitForChildTestShutdown();
-
-  const base::Process& test_child() const { return test_child_.process; }
-
-  // Used by macros in mojo/edk/test/mojo_test_base.h to support multiprocess
-  // test client initialization.
-  static void ChildSetup();
-  static int RunClientMain(const base::Callback<int(MojoHandle)>& main,
-                           bool pass_pipe_ownership_to_main = false);
-  static int RunClientTestMain(const base::Callback<void(MojoHandle)>& main);
-
-  // For use (and only valid) in the child process:
-  static mojo::ScopedMessagePipeHandle primordial_pipe;
-
- private:
-  // Valid after |StartChild()| and before |WaitForChildShutdown()|.
-  base::SpawnChildResult test_child_;
-
-  ProcessErrorCallback process_error_callback_;
-
-  std::string peer_token_;
-
-  DISALLOW_COPY_AND_ASSIGN(MultiprocessTestHelper);
-};
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_TEST_MULTIPROCESS_TEST_HELPER_H_
diff --git a/mojo/edk/test/multiprocess_test_helper_unittest.cc b/mojo/edk/test/multiprocess_test_helper_unittest.cc
deleted file mode 100644
index f7e9e83..0000000
--- a/mojo/edk/test/multiprocess_test_helper_unittest.cc
+++ /dev/null
@@ -1,165 +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.
-
-#include "mojo/edk/test/multiprocess_test_helper.h"
-
-#include <stddef.h>
-
-#include <utility>
-
-#include "base/logging.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/test_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_POSIX)
-#include <fcntl.h>
-#endif
-
-namespace mojo {
-namespace edk {
-namespace test {
-namespace {
-
-bool IsNonBlocking(const PlatformHandle& handle) {
-#if defined(OS_WIN)
-  // Haven't figured out a way to query whether a HANDLE was created with
-  // FILE_FLAG_OVERLAPPED.
-  return true;
-#else
-  return fcntl(handle.handle, F_GETFL) & O_NONBLOCK;
-#endif
-}
-
-bool WriteByte(const PlatformHandle& handle, char c) {
-  size_t bytes_written = 0;
-  BlockingWrite(handle, &c, 1, &bytes_written);
-  return bytes_written == 1;
-}
-
-bool ReadByte(const PlatformHandle& handle, char* c) {
-  size_t bytes_read = 0;
-  BlockingRead(handle, c, 1, &bytes_read);
-  return bytes_read == 1;
-}
-
-using MultiprocessTestHelperTest = testing::Test;
-
-TEST_F(MultiprocessTestHelperTest, RunChild) {
-  MultiprocessTestHelper helper;
-  EXPECT_TRUE(helper.server_platform_handle.is_valid());
-
-  helper.StartChild("RunChild");
-  EXPECT_EQ(123, helper.WaitForChildShutdown());
-}
-
-MOJO_MULTIPROCESS_TEST_CHILD_MAIN(RunChild) {
-  CHECK(MultiprocessTestHelper::client_platform_handle.is_valid());
-  return 123;
-}
-
-TEST_F(MultiprocessTestHelperTest, TestChildMainNotFound) {
-  MultiprocessTestHelper helper;
-  helper.StartChild("NoSuchTestChildMain");
-  int result = helper.WaitForChildShutdown();
-  EXPECT_FALSE(result >= 0 && result <= 127);
-}
-
-TEST_F(MultiprocessTestHelperTest, PassedChannel) {
-  MultiprocessTestHelper helper;
-  EXPECT_TRUE(helper.server_platform_handle.is_valid());
-  helper.StartChild("PassedChannel");
-
-  // Take ownership of the handle.
-  ScopedPlatformHandle handle = std::move(helper.server_platform_handle);
-
-  // The handle should be non-blocking.
-  EXPECT_TRUE(IsNonBlocking(handle.get()));
-
-  // Write a byte.
-  const char c = 'X';
-  EXPECT_TRUE(WriteByte(handle.get(), c));
-
-  // It'll echo it back to us, incremented.
-  char d = 0;
-  EXPECT_TRUE(ReadByte(handle.get(), &d));
-  EXPECT_EQ(c + 1, d);
-
-  // And return it, incremented again.
-  EXPECT_EQ(c + 2, helper.WaitForChildShutdown());
-}
-
-MOJO_MULTIPROCESS_TEST_CHILD_MAIN(PassedChannel) {
-  CHECK(MultiprocessTestHelper::client_platform_handle.is_valid());
-
-  // Take ownership of the handle.
-  ScopedPlatformHandle handle =
-      std::move(MultiprocessTestHelper::client_platform_handle);
-
-  // The handle should be non-blocking.
-  EXPECT_TRUE(IsNonBlocking(handle.get()));
-
-  // Read a byte.
-  char c = 0;
-  EXPECT_TRUE(ReadByte(handle.get(), &c));
-
-  // Write it back, incremented.
-  c++;
-  EXPECT_TRUE(WriteByte(handle.get(), c));
-
-  // And return it, incremented again.
-  c++;
-  return static_cast<int>(c);
-}
-
-TEST_F(MultiprocessTestHelperTest, ChildTestPasses) {
-  MultiprocessTestHelper helper;
-  EXPECT_TRUE(helper.server_platform_handle.is_valid());
-  helper.StartChild("ChildTestPasses");
-  EXPECT_TRUE(helper.WaitForChildTestShutdown());
-}
-
-MOJO_MULTIPROCESS_TEST_CHILD_TEST(ChildTestPasses) {
-  ASSERT_TRUE(MultiprocessTestHelper::client_platform_handle.is_valid());
-  EXPECT_TRUE(
-      IsNonBlocking(MultiprocessTestHelper::client_platform_handle.get()));
-}
-
-TEST_F(MultiprocessTestHelperTest, ChildTestFailsAssert) {
-  MultiprocessTestHelper helper;
-  EXPECT_TRUE(helper.server_platform_handle.is_valid());
-  helper.StartChild("ChildTestFailsAssert");
-  EXPECT_FALSE(helper.WaitForChildTestShutdown());
-}
-
-MOJO_MULTIPROCESS_TEST_CHILD_TEST(ChildTestFailsAssert) {
-  ASSERT_FALSE(MultiprocessTestHelper::client_platform_handle.is_valid())
-      << "DISREGARD: Expected failure in child process";
-  ASSERT_FALSE(
-      IsNonBlocking(MultiprocessTestHelper::client_platform_handle.get()))
-      << "Not reached";
-  CHECK(false) << "Not reached";
-}
-
-TEST_F(MultiprocessTestHelperTest, ChildTestFailsExpect) {
-  MultiprocessTestHelper helper;
-  EXPECT_TRUE(helper.server_platform_handle.is_valid());
-  helper.StartChild("ChildTestFailsExpect");
-  EXPECT_FALSE(helper.WaitForChildTestShutdown());
-}
-
-MOJO_MULTIPROCESS_TEST_CHILD_TEST(ChildTestFailsExpect) {
-  EXPECT_FALSE(MultiprocessTestHelper::client_platform_handle.is_valid())
-      << "DISREGARD: Expected failure #1 in child process";
-  EXPECT_FALSE(
-      IsNonBlocking(MultiprocessTestHelper::client_platform_handle.get()))
-      << "DISREGARD: Expected failure #2 in child process";
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/test/run_all_perftests.cc b/mojo/edk/test/run_all_perftests.cc
deleted file mode 100644
index 3ce3b47..0000000
--- a/mojo/edk/test/run_all_perftests.cc
+++ /dev/null
@@ -1,26 +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.
-
-#include "base/command_line.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/perf_test_suite.h"
-#include "base/test/test_io_thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
-#include "mojo/edk/test/test_support_impl.h"
-#include "mojo/public/tests/test_support_private.h"
-
-int main(int argc, char** argv) {
-  base::PerfTestSuite test(argc, argv);
-
-  mojo::edk::Init();
-  base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
-  mojo::edk::ScopedIPCSupport ipc_support(
-      test_io_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-  mojo::test::TestSupport::Init(new mojo::edk::test::TestSupportImpl());
-
-  return test.Run();
-}
diff --git a/mojo/edk/test/run_all_unittests.cc b/mojo/edk/test/run_all_unittests.cc
deleted file mode 100644
index a057825..0000000
--- a/mojo/edk/test/run_all_unittests.cc
+++ /dev/null
@@ -1,49 +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.
-
-#include <signal.h>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/test/launcher/unit_test_launcher.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/test_io_thread.h"
-#include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
-#include "mojo/edk/test/test_support_impl.h"
-#include "mojo/public/tests/test_support_private.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-int main(int argc, char** argv) {
-#if !defined(OS_ANDROID)
-  // Silence death test thread warnings on Linux. We can afford to run our death
-  // tests a little more slowly (< 10 ms per death test on a Z620).
-  // On android, we need to run in the default mode, as the threadsafe mode
-  // relies on execve which is not available.
-  testing::GTEST_FLAG(death_test_style) = "threadsafe";
-#endif
-#if defined(OS_ANDROID)
-  // On android, the test framework has a signal handler that will print a
-  // [ CRASH ] line when the application crashes. This breaks death test has the
-  // test runner will consider the death of the child process a test failure.
-  // Removing the signal handler solves this issue.
-  signal(SIGABRT, SIG_DFL);
-#endif
-
-  base::TestSuite test_suite(argc, argv);
-
-  mojo::edk::Init();
-
-  mojo::test::TestSupport::Init(new mojo::edk::test::TestSupportImpl());
-  base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
-
-  mojo::edk::ScopedIPCSupport ipc_support(
-      test_io_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-  return base::LaunchUnitTests(
-      argc, argv,
-      base::Bind(&base::TestSuite::Run, base::Unretained(&test_suite)));
-}
diff --git a/mojo/edk/test/test_support_impl.cc b/mojo/edk/test/test_support_impl.cc
deleted file mode 100644
index 25684e4..0000000
--- a/mojo/edk/test/test_support_impl.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/test/test_support_impl.h"
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <string>
-
-#include "base/files/file_enumerator.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/path_service.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/perf_log.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-namespace {
-
-base::FilePath ResolveSourceRootRelativePath(const char* relative_path) {
-  base::FilePath path;
-  if (!PathService::Get(base::DIR_SOURCE_ROOT, &path))
-    return base::FilePath();
-
-  for (const base::StringPiece& component : base::SplitStringPiece(
-           relative_path, "/", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) {
-    if (!component.empty())
-      path = path.AppendASCII(component);
-  }
-
-  return path;
-}
-
-}  // namespace
-
-TestSupportImpl::TestSupportImpl() {
-}
-
-TestSupportImpl::~TestSupportImpl() {
-}
-
-void TestSupportImpl::LogPerfResult(const char* test_name,
-                                    const char* sub_test_name,
-                                    double value,
-                                    const char* units) {
-  DCHECK(test_name);
-  if (sub_test_name) {
-    std::string name = base::StringPrintf("%s/%s", test_name, sub_test_name);
-    base::LogPerfResult(name.c_str(), value, units);
-  } else {
-    base::LogPerfResult(test_name, value, units);
-  }
-}
-
-FILE* TestSupportImpl::OpenSourceRootRelativeFile(const char* relative_path) {
-  return base::OpenFile(ResolveSourceRootRelativePath(relative_path), "rb");
-}
-
-char** TestSupportImpl::EnumerateSourceRootRelativeDirectory(
-    const char* relative_path) {
-  std::vector<std::string> names;
-  base::FileEnumerator e(ResolveSourceRootRelativePath(relative_path), false,
-                         base::FileEnumerator::FILES);
-  for (base::FilePath name = e.Next(); !name.empty(); name = e.Next())
-    names.push_back(name.BaseName().AsUTF8Unsafe());
-
-  // |names.size() + 1| for null terminator.
-  char** rv = static_cast<char**>(calloc(names.size() + 1, sizeof(char*)));
-  for (size_t i = 0; i < names.size(); ++i)
-    rv[i] = base::strdup(names[i].c_str());
-  return rv;
-}
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/test/test_support_impl.h b/mojo/edk/test/test_support_impl.h
deleted file mode 100644
index ebb5ce6..0000000
--- a/mojo/edk/test/test_support_impl.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_TEST_TEST_SUPPORT_IMPL_H_
-#define MOJO_EDK_TEST_TEST_SUPPORT_IMPL_H_
-
-#include <stdio.h>
-
-#include "base/macros.h"
-#include "mojo/public/tests/test_support_private.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-class TestSupportImpl : public mojo::test::TestSupport {
- public:
-  TestSupportImpl();
-  ~TestSupportImpl() override;
-
-  void LogPerfResult(const char* test_name,
-                     const char* sub_test_name,
-                     double value,
-                     const char* units) override;
-  FILE* OpenSourceRootRelativeFile(const char* relative_path) override;
-  char** EnumerateSourceRootRelativeDirectory(
-      const char* relative_path) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestSupportImpl);
-};
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_TEST_TEST_SUPPORT_IMPL_H_
diff --git a/mojo/edk/test/test_utils.h b/mojo/edk/test/test_utils.h
deleted file mode 100644
index 939171b..0000000
--- a/mojo/edk/test/test_utils.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_TEST_TEST_UTILS_H_
-#define MOJO_EDK_TEST_TEST_UTILS_H_
-
-#include <stddef.h>
-#include <stdio.h>
-
-#include <string>
-
-#include "base/files/scoped_file.h"
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-// On success, |bytes_written| is updated to the number of bytes written;
-// otherwise it is untouched.
-bool BlockingWrite(const PlatformHandle& handle,
-                   const void* buffer,
-                   size_t bytes_to_write,
-                   size_t* bytes_written);
-
-// On success, |bytes_read| is updated to the number of bytes read; otherwise it
-// is untouched.
-bool BlockingRead(const PlatformHandle& handle,
-                  void* buffer,
-                  size_t buffer_size,
-                  size_t* bytes_read);
-
-// If the read is done successfully or would block, the function returns true
-// and updates |bytes_read| to the number of bytes read (0 if the read would
-// block); otherwise it returns false and leaves |bytes_read| untouched.
-// |handle| must already be in non-blocking mode.
-bool NonBlockingRead(const PlatformHandle& handle,
-                     void* buffer,
-                     size_t buffer_size,
-                     size_t* bytes_read);
-
-// Gets a (scoped) |PlatformHandle| from the given (scoped) |FILE|.
-ScopedPlatformHandle PlatformHandleFromFILE(base::ScopedFILE fp);
-
-// Gets a (scoped) |FILE| from a (scoped) |PlatformHandle|.
-base::ScopedFILE FILEFromPlatformHandle(ScopedPlatformHandle h,
-                                        const char* mode);
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_TEST_TEST_UTILS_H_
diff --git a/mojo/edk/test/test_utils_posix.cc b/mojo/edk/test/test_utils_posix.cc
deleted file mode 100644
index 60d5db5..0000000
--- a/mojo/edk/test/test_utils_posix.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/test/test_utils.h"
-
-#include <fcntl.h>
-#include <stddef.h>
-#include <unistd.h>
-
-#include "base/posix/eintr_wrapper.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-bool BlockingWrite(const PlatformHandle& handle,
-                   const void* buffer,
-                   size_t bytes_to_write,
-                   size_t* bytes_written) {
-  int original_flags = fcntl(handle.handle, F_GETFL);
-  if (original_flags == -1 ||
-      fcntl(handle.handle, F_SETFL, original_flags & (~O_NONBLOCK)) != 0) {
-    return false;
-  }
-
-  ssize_t result = HANDLE_EINTR(write(handle.handle, buffer, bytes_to_write));
-
-  fcntl(handle.handle, F_SETFL, original_flags);
-
-  if (result < 0)
-    return false;
-
-  *bytes_written = result;
-  return true;
-}
-
-bool BlockingRead(const PlatformHandle& handle,
-                  void* buffer,
-                  size_t buffer_size,
-                  size_t* bytes_read) {
-  int original_flags = fcntl(handle.handle, F_GETFL);
-  if (original_flags == -1 ||
-      fcntl(handle.handle, F_SETFL, original_flags & (~O_NONBLOCK)) != 0) {
-    return false;
-  }
-
-  ssize_t result = HANDLE_EINTR(read(handle.handle, buffer, buffer_size));
-
-  fcntl(handle.handle, F_SETFL, original_flags);
-
-  if (result < 0)
-    return false;
-
-  *bytes_read = result;
-  return true;
-}
-
-bool NonBlockingRead(const PlatformHandle& handle,
-                     void* buffer,
-                     size_t buffer_size,
-                     size_t* bytes_read) {
-  ssize_t result = HANDLE_EINTR(read(handle.handle, buffer, buffer_size));
-
-  if (result < 0) {
-    if (errno != EAGAIN && errno != EWOULDBLOCK)
-      return false;
-
-    *bytes_read = 0;
-  } else {
-    *bytes_read = result;
-  }
-
-  return true;
-}
-
-ScopedPlatformHandle PlatformHandleFromFILE(base::ScopedFILE fp) {
-  CHECK(fp);
-  int rv = dup(fileno(fp.get()));
-  PCHECK(rv != -1) << "dup";
-  return ScopedPlatformHandle(PlatformHandle(rv));
-}
-
-base::ScopedFILE FILEFromPlatformHandle(ScopedPlatformHandle h,
-                                        const char* mode) {
-  CHECK(h.is_valid());
-  base::ScopedFILE rv(fdopen(h.release().handle, mode));
-  PCHECK(rv) << "fdopen";
-  return rv;
-}
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/test/test_utils_win.cc b/mojo/edk/test/test_utils_win.cc
deleted file mode 100644
index 17bf5bb..0000000
--- a/mojo/edk/test/test_utils_win.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/test/test_utils.h"
-
-#include <windows.h>
-#include <fcntl.h>
-#include <io.h>
-#include <stddef.h>
-#include <string.h>
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-bool BlockingWrite(const PlatformHandle& handle,
-                   const void* buffer,
-                   size_t bytes_to_write,
-                   size_t* bytes_written) {
-  OVERLAPPED overlapped = {0};
-  DWORD bytes_written_dword = 0;
-
-  if (!WriteFile(handle.handle, buffer, static_cast<DWORD>(bytes_to_write),
-                 &bytes_written_dword, &overlapped)) {
-    if (GetLastError() != ERROR_IO_PENDING ||
-        !GetOverlappedResult(handle.handle, &overlapped, &bytes_written_dword,
-                             TRUE)) {
-      return false;
-    }
-  }
-
-  *bytes_written = bytes_written_dword;
-  return true;
-}
-
-bool BlockingRead(const PlatformHandle& handle,
-                  void* buffer,
-                  size_t buffer_size,
-                  size_t* bytes_read) {
-  OVERLAPPED overlapped = {0};
-  DWORD bytes_read_dword = 0;
-
-  if (!ReadFile(handle.handle, buffer, static_cast<DWORD>(buffer_size),
-                &bytes_read_dword, &overlapped)) {
-    if (GetLastError() != ERROR_IO_PENDING ||
-        !GetOverlappedResult(handle.handle, &overlapped, &bytes_read_dword,
-                             TRUE)) {
-      return false;
-    }
-  }
-
-  *bytes_read = bytes_read_dword;
-  return true;
-}
-
-bool NonBlockingRead(const PlatformHandle& handle,
-                     void* buffer,
-                     size_t buffer_size,
-                     size_t* bytes_read) {
-  OVERLAPPED overlapped = {0};
-  DWORD bytes_read_dword = 0;
-
-  if (!ReadFile(handle.handle, buffer, static_cast<DWORD>(buffer_size),
-                &bytes_read_dword, &overlapped)) {
-    if (GetLastError() != ERROR_IO_PENDING)
-      return false;
-
-    CancelIo(handle.handle);
-
-    if (!GetOverlappedResult(handle.handle, &overlapped, &bytes_read_dword,
-                             TRUE)) {
-      *bytes_read = 0;
-      return true;
-    }
-  }
-
-  *bytes_read = bytes_read_dword;
-  return true;
-}
-
-ScopedPlatformHandle PlatformHandleFromFILE(base::ScopedFILE fp) {
-  CHECK(fp);
-
-  HANDLE rv = INVALID_HANDLE_VALUE;
-  PCHECK(DuplicateHandle(
-      GetCurrentProcess(),
-      reinterpret_cast<HANDLE>(_get_osfhandle(_fileno(fp.get()))),
-      GetCurrentProcess(), &rv, 0, TRUE, DUPLICATE_SAME_ACCESS))
-      << "DuplicateHandle";
-  return ScopedPlatformHandle(PlatformHandle(rv));
-}
-
-base::ScopedFILE FILEFromPlatformHandle(ScopedPlatformHandle h,
-                                        const char* mode) {
-  CHECK(h.is_valid());
-  // Microsoft's documentation for |_open_osfhandle()| only discusses these
-  // flags (and |_O_WTEXT|). Hmmm.
-  int flags = 0;
-  if (strchr(mode, 'a'))
-    flags |= _O_APPEND;
-  if (strchr(mode, 'r'))
-    flags |= _O_RDONLY;
-  if (strchr(mode, 't'))
-    flags |= _O_TEXT;
-  base::ScopedFILE rv(_fdopen(
-      _open_osfhandle(reinterpret_cast<intptr_t>(h.release().handle), flags),
-      mode));
-  PCHECK(rv) << "_fdopen";
-  return rv;
-}
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/public/BUILD.gn b/mojo/public/BUILD.gn
deleted file mode 100644
index 3baf667..0000000
--- a/mojo/public/BUILD.gn
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-group("public") {
-  # Meta-target, don't link into production code.
-  testonly = true
-  deps = [
-    ":sdk",
-    "cpp/bindings",
-    "interfaces/bindings/tests:test_interfaces",
-  ]
-
-  if (is_android) {
-    deps += [
-      "java:bindings_java",
-      "java:system_java",
-    ]
-  }
-}
-
-group("sdk") {
-  deps = [
-    "c/system",
-    "cpp/bindings",
-    "js",
-  ]
-}
diff --git a/mojo/public/DEPS b/mojo/public/DEPS
deleted file mode 100644
index 2e49995..0000000
--- a/mojo/public/DEPS
+++ /dev/null
@@ -1,11 +0,0 @@
-include_rules = [
-  # This code is checked into the chromium repo so it's fine to depend on this.
-  "+base",
-  "+build",
-  "+testing",
-
-  "+ipc/ipc_param_traits.h",
-
-  # internal includes.
-  "+mojo",
-]
diff --git a/mojo/public/LICENSE b/mojo/public/LICENSE
deleted file mode 100644
index 972bb2e..0000000
--- a/mojo/public/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//    * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//    * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//    * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/c/system/BUILD.gn b/mojo/public/c/system/BUILD.gn
deleted file mode 100644
index 08185c7..0000000
--- a/mojo/public/c/system/BUILD.gn
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-component("system") {
-  output_name = "mojo_public_system"
-
-  sources = [
-    "buffer.h",
-    "core.h",
-    "data_pipe.h",
-    "functions.h",
-    "macros.h",
-    "message_pipe.h",
-    "platform_handle.h",
-    "system_export.h",
-    "thunks.cc",
-    "thunks.h",
-    "types.h",
-    "watcher.h",
-  ]
-
-  defines = [ "MOJO_SYSTEM_IMPLEMENTATION" ]
-}
-
-# This should ONLY be depended upon directly by shared_library targets which
-# need to export the MojoSetSystemThunks symbol, like targets generated by the
-# mojo_native_application template in //services/service_manager/public/cpp/service.gni.
-source_set("set_thunks_for_app") {
-  sources = [
-    "set_thunks_for_app.cc",
-  ]
-
-  public_deps = [
-    ":system",
-  ]
-}
diff --git a/mojo/public/c/system/README.md b/mojo/public/c/system/README.md
deleted file mode 100644
index 2abe80f..0000000
--- a/mojo/public/c/system/README.md
+++ /dev/null
@@ -1,869 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo C System API
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-The Mojo C System API is a lightweight API (with an eventually-stable ABI) upon
-which all higher layers of the Mojo system are built.
-
-This API exposes the fundamental capabilities to: create, read from, and write
-to **message pipes**; create, read from, and write to **data pipes**; create
-**shared buffers** and generate sharable handles to them; wrap platform-specific
-handle objects (such as **file descriptors**, **Windows handles**, and
-**Mach ports**) for seamless transit over message pipes; and efficiently watch
-handles for various types of state transitions.
-
-This document provides a brief guide to API usage with example code snippets.
-For a detailed API references please consult the headers in
-[//mojo/public/c/system](https://cs.chromium.org/chromium/src/mojo/public/c/system/).
-
-### A Note About Multithreading
-
-The Mojo C System API is entirely thread-agnostic. This means that all functions
-may be called from any thread in a process, and there are no restrictions on how
-many threads can use the same object at the same time.
-
-Of course this does not mean you can completely ignore potential concurrency
-issues -- such as a handle being closed on one thread while another thread is
-trying to perform an operation on the same handle -- but there is nothing
-fundamentally incorrect about using any given API or handle from multiple
-threads.
-
-### A Note About Synchronization
-
-Every Mojo API call is non-blocking and synchronously yields some kind of status
-result code, but the call's side effects -- such as affecting the state of
-one or more handles in the system -- may or may not occur asynchronously.
-
-Mojo objects can be observed for interesting state changes in a way that is
-thread-agnostic and in some ways similar to POSIX signal handlers: *i.e.*
-user-provided notification handlers may be invoked at any time on arbitrary
-threads in the process. It is entirely up to the API user to take appropriate
-measures to synchronize operations against other application state.
-
-The higher level [system](/mojo#High-Level-System-APIs) and
-[bindings](/mojo#High-Level-Bindings-APIs) APIs provide helpers to simplify Mojo
-usage in this regard, at the expense of some flexibility.
-
-## Result Codes
-
-Most API functions return a value of type `MojoResult`. This is an integral
-result code used to convey some meaningful level of detail about the result of a
-requested operation.
-
-See [//mojo/public/c/system/types.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/types.h)
-for different possible values. See documentation for individual API calls for
-more specific contextual meaning of various result codes.
-
-## Handles
-
-Every Mojo IPC primitive is identified by a generic, opaque integer handle of
-type `MojoHandle`. Handles can be acquired by creating new objects using various
-API calls, or by reading messages which contain attached handles.
-
-A `MojoHandle` can represent a message pipe endpoint, a data pipe consumer,
-a data pipe producer, a shared buffer reference, a wrapped native platform
-handle such as a POSIX file descriptor or a Windows system handle, or a watcher
-object (see [Signals & Watchers](#Signals-Watchers) below.)
-
-All types of handles except for watchers (which are an inherently local concept)
-can be attached to messages and sent over message pipes.
-
-Any `MojoHandle` may be closed by calling `MojoClose`:
-
-``` c
-MojoHandle x = DoSomethingToGetAValidHandle();
-MojoResult result = MojoClose(x);
-```
-
-If the handle passed to `MojoClose` was a valid handle, it will be closed and
-`MojoClose` returns `MOJO_RESULT_OK`. Otherwise it returns
-`MOJO_RESULT_INVALID_ARGUMENT`.
-
-Similar to native system handles on various popular platforms, `MojoHandle`
-values may be reused over time. Thus it is important to avoid logical errors
-which lead to misplaced handle ownership, double-closes, *etc.*
-
-## Message Pipes
-
-A message pipe is a bidirectional messaging channel which can carry arbitrary
-unstructured binary messages with zero or more `MojoHandle` attachments to be
-transferred from one end of a pipe to the other. Message pipes work seamlessly
-across process boundaries or within a single process.
-
-The [Embedder Development Kit (EDK)](/mojo/edk/embedder) provides the means to
-bootstrap one or more primordial cross-process message pipes, and it's up to
-Mojo embedders to expose this capability in some useful way. Once such a pipe is
-established, additional handles -- including other message pipe handles -- may
-be sent to a remote process using that pipe (or in turn, over other pipes sent
-over that pipe, or pipes sent over *that* pipe, and so on...)
-
-The public C System API exposes the ability to read and write messages on pipes
-and to create new message pipes.
-
-See [//mojo/public/c/system/message_pipe.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/message_pipe.h)
-for detailed message pipe API documentation.
-
-### Creating Message Pipes
-
-`MojoCreateMessagePipe` can be used to create a new message pipe:
-
-``` c
-MojoHandle a, b;
-MojoResult result = MojoCreateMessagePipe(NULL, &a, &b);
-```
-
-After this snippet, `result` should be `MOJO_RESULT_OK` (it's really hard for
-this to fail!), and `a` and `b` will contain valid Mojo handles, one for each
-end of the new message pipe.
-
-Any messages written to `a` are eventually readable from `b`, and any messages
-written to `b` are eventually readable from `a`. If `a` is closed at any point,
-`b` will eventually become aware of this fact; likewise if `b` is closed, `a`
-will become aware of that.
-
-The state of these conditions can be queried and watched asynchronously as
-described in the [Signals & Watchers](#Signals-Watchers) section below.
-
-### Allocating Messages
-
-In order to avoid redundant internal buffer copies, Mojo would like to allocate
-your message storage buffers for you. This is easy:
-
-``` c
-MojoMessageHandle message;
-MojoResult result = MojoAllocMessage(6, NULL, 0, MOJO_ALLOC_MESSAGE_FLAG_NONE,
-                                     &message);
-```
-
-Note that we have a special `MojoMessageHandle` type for message objects.
-
-The code above allocates a buffer for a message payload of 6 bytes with no
-handles attached.
-
-If we change our mind and decide not to send this message, we can delete it:
-
-``` c
-MojoResult result = MojoFreeMessage(message);
-```
-
-If we instead decide to send our newly allocated message, we first need to fill
-in the payload data with something interesting. How about a pleasant greeting:
-
-``` c
-void* buffer = NULL;
-MojoResult result = MojoGetMessageBuffer(message, &buffer);
-memcpy(buffer, "hello", 6);
-```
-
-Now we can write the message to a pipe. Note that attempting to write a message
-transfers ownership of the message object (and any attached handles) into the
-target pipe and there is therefore no need to subsequently call
-`MojoFreeMessage` on that message.
-
-### Writing Messages
-
-``` c
-result = MojoWriteMessageNew(a, message, MOJO_WRITE_MESSAGE_FLAG_NONE);
-```
-
-`MojoWriteMessage` is a *non-blocking* call: it always returns
-immediately. If its return code is `MOJO_RESULT_OK` the message will eventually
-find its way to the other end of the pipe -- assuming that end isn't closed
-first, of course. If the return code is anything else, the message is deleted
-and not transferred.
-
-In this case since we know `b` is still open, we also know the message will
-eventually arrive at `b`. `b` can be queried or watched to become aware of when
-the message arrives, but we'll ignore that complexity for now. See
-[Signals & Watchers](#Signals-Watchers) below for more information.
-
-*** aside
-**NOTE**: Although this is an implementation detail and not strictly guaranteed by the
-System API, it is true in the current implementation that the message will
-arrive at `b` before the above `MojoWriteMessage` call even returns, because `b`
-is in the same process as `a` and has never been transferred over another pipe.
-***
-
-### Reading Messages
-
-We can read a new message object from a pipe:
-
-``` c
-MojoMessageHandle message;
-uint32_t num_bytes;
-MojoResult result = MojoReadMessageNew(b, &message, &num_bytes, NULL, NULL,
-                                       MOJO_READ_MESSAGE_FLAG_NONE);
-```
-
-and map its buffer to retrieve the contents:
-
-``` c
-void* buffer = NULL;
-MojoResult result = MojoGetMessageBuffer(message, &buffer);
-printf("Pipe says: %s", (const char*)buffer);
-```
-
-`result` should be `MOJO_RESULT_OK` and this snippet should write `"hello"` to
-`stdout`.
-
-If we try were to try reading again now that there are no messages on `b`:
-
-``` c
-MojoMessageHandle message;
-MojoResult result = MojoReadMessageNew(b, &message, NULL, NULL, NULL,
-                                       MOJO_READ_MESSAGE_FLAG_NONE);
-```
-
-We'll get a `result` of `MOJO_RESULT_SHOULD_WAIT`, indicating that the pipe is
-not yet readable.
-
-### Messages With Handles
-
-Probably the most useful feature of Mojo IPC is that message pipes can carry
-arbitrary Mojo handles, including other message pipes. This is also
-straightforward.
-
-Here's an example which creates two pipes, using the first pipe to transfer
-one end of the second pipe. If you have a good imagination you can pretend the
-first pipe spans a process boundary, which makes the example more practically
-interesting:
-
-``` c
-MojoHandle a, b;
-MojoHandle c, d;
-MojoMessage message;
-
-// Allocate a message with an empty payload and handle |c| attached. Note that
-// this takes ownership of |c|, effectively invalidating its handle value.
-MojoResult result = MojoAllocMessage(0, &c, 1, MOJO_ALLOC_MESSAGE_FLAG_NONE,
-                                     message);
-
-result = MojoWriteMessageNew(a, message, MOJO_WRITE_MESSAGE_FLAG_NONE);
-
-// Some time later...
-uint32_t num_bytes;
-MojoHandle e;
-uint32_t num_handles = 1;
-MojoResult result = MojoReadMessageNew(b, &message, &num_bytes, &e,
-                                       &num_handles,
-                                       MOJO_READ_MESSAGE_FLAG_NONE);
-```
-
-At this point the handle in `e` is now referencing the same message pipe
-endpoint which was originally referenced by `c`.
-
-Note that `num_handles` above is initialized to 1 before we pass its address to
-`MojoReadMessageNew`. This is to indicate how much `MojoHandle` storage is
-available at the output buffer we gave it (`&e` above).
-
-If we didn't know how many handles to expect in an incoming message -- which is
-often the case -- we can use `MojoReadMessageNew` to query for this information
-first:
-
-``` c
-MojoMessageHandle message;
-uint32_t num_bytes = 0;
-uint32_t num_handles = 0;
-MojoResult result = MojoReadMessageNew(b, &message, &num_bytes, NULL,
-                                       &num_handles,
-                                       MOJO_READ_MESSAGE_FLAG_NONE);
-```
-
-If in this case there were a received message on `b` with some nonzero number
-of handles, `result` would be `MOJO_RESULT_RESOURCE_EXHAUSTED`, and both
-`num_bytes` and `num_handles` would be updated to reflect the payload size and
-number of attached handles on the next available message.
-
-It's also worth noting that if there did happen to be a message available with
-no payload and no handles (*i.e.* an empty message), this would actually return
-`MOJO_RESULT_OK`.
-
-## Data Pipes
-
-Data pipes provide an efficient unidirectional channel for moving large amounts
-of unframed data between two endpoints. Every data pipe has a fixed
-**element size** and **capacity**. Reads and writes must be done in sizes that
-are a multiple of the element size, and writes to the pipe can only be queued
-up to the pipe's capacity before reads must be done to make more space
-available.
-
-Every data pipe has a single **producer** handle used to write data into the
-pipe and a single **consumer** handle used to read data out of the pipe.
-
-Finally, data pipes support both immediate I/O -- reading into and writing out
-from user-supplied buffers -- as well as two-phase I/O, allowing callers to
-temporarily lock some portion of the data pipe in order to read or write its
-contents directly.
-
-See [//mojo/public/c/system/data_pipe.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/data_pipe.h)
-for detailed data pipe API documentation.
-
-### Creating Data Pipes
-
-Use `MojoCreateDataPipe` to create a new data pipe. The
-`MojoCreateDataPipeOptions` structure is used to configure the new pipe, but
-this can be omitted to assume the default options of a single-byte element size
-and an implementation-defined default capacity (64 kB at the time of this
-writing.)
-
-``` c
-MojoHandle producer, consumer;
-MojoResult result = MojoCreateDataPipe(NULL, &producer, &consumer);
-```
-
-### Immediate I/O
-
-Data can be written into or read out of a data pipe using buffers provided by
-the caller. This is generally more convenient than two-phase I/O but is
-also less efficient due to extra copying.
-
-``` c
-uint32_t num_bytes = 12;
-MojoResult result = MojoWriteData(producer, "datadatadata", &num_bytes,
-                                  MOJO_WRITE_DATA_FLAG_NONE);
-```
-
-The above snippet will attempt to write 12 bytes into the data pipe, which
-should succeed and return `MOJO_RESULT_OK`. If the available capacity on the
-pipe was less than the amount requested (the input value of `*num_bytes`) this
-will copy what it can into the pipe and return the number of bytes written in
-`*num_bytes`. If no data could be copied this will instead return
-`MOJO_RESULT_SHOULD_WAIT`.
-
-Reading from the consumer is a similar operation.
-
-``` c
-char buffer[64];
-uint32_t num_bytes = 64;
-MojoResult result = MojoReadData(consumer, buffer, &num_bytes,
-                                 MOJO_READ_DATA_FLAG_NONE);
-```
-
-This will attempt to read up to 64 bytes, returning the actual number of bytes
-read in `*num_bytes`.
-
-`MojoReadData` supports a number of interesting flags to change the behavior:
-you can peek at the data (copy bytes out without removing them from the pipe),
-query the number of bytes available without doing any actual reading of the
-contents, or discard data from the pipe without bothering to copy it anywhere.
-
-This also supports a `MOJO_READ_DATA_FLAG_ALL_OR_NONE` which ensures that the
-call succeeds **only** if the exact number of bytes requested could be read.
-Otherwise such a request will fail with `MOJO_READ_DATA_OUT_OF_RANGE`.
-
-### Two-Phase I/O
-
-Data pipes also support two-phase I/O operations, allowing a caller to
-temporarily lock a portion of the data pipe's storage for direct memory access.
-
-``` c
-void* buffer;
-uint32_t num_bytes = 1024;
-MojoResult result = MojoBeginWriteData(producer, &buffer, &num_bytes,
-                                       MOJO_WRITE_DATA_FLAG_NONE);
-```
-
-This requests write access to a region of up to 1024 bytes of the data pipe's
-next available capacity. Upon success, `buffer` will point to the writable
-storage and `num_bytes` will indicate the size of the buffer there.
-
-The caller should then write some data into the memory region and release it
-ASAP, indicating the number of bytes actually written:
-
-``` c
-memcpy(buffer, "hello", 6);
-MojoResult result = MojoEndWriteData(producer, 6);
-```
-
-Two-phase reads look similar:
-
-``` c
-void* buffer;
-uint32_t num_bytes = 1024;
-MojoResult result = MojoBeginReadData(consumer, &buffer, &num_bytes,
-                                      MOJO_READ_DATA_FLAG_NONE);
-// result should be MOJO_RESULT_OK, since there is some data available.
-
-printf("Pipe says: %s", (const char*)buffer);  // Should say "hello".
-
-result = MojoEndReadData(consumer, 1);  // Say we only consumed one byte.
-
-num_bytes = 1024;
-result = MojoBeginReadData(consumer, &buffer, &num_bytes,
-                           MOJO_READ_DATA_FLAG_NONE);
-printf("Pipe says: %s", (const char*)buffer);  // Should say "ello".
-result = MojoEndReadData(consumer, 5);
-```
-
-## Shared Buffers
-
-Shared buffers are chunks of memory which can be mapped simultaneously by
-multiple processes. Mojo provides a simple API to make these available to
-applications.
-
-See [//mojo/public/c/system/buffer.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/buffer.h)
-for detailed shared buffer API documentation.
-
-### Creating Buffer Handles
-
-Usage is straightforward. You can create a new buffer:
-
-``` c
-// Allocate a shared buffer of 4 kB.
-MojoHandle buffer;
-MojoResult result = MojoCreateSharedBuffer(NULL, 4096, &buffer);
-```
-
-You can also duplicate an existing shared buffer handle:
-
-``` c
-MojoHandle another_name_for_buffer;
-MojoResult result = MojoDuplicateBufferHandle(buffer, NULL,
-                                              &another_name_for_buffer);
-```
-
-This is useful if you want to retain a handle to the buffer while also sharing
-handles with one or more other clients. The allocated buffer remains valid as
-long as at least one shared buffer handle exists to reference it.
-
-### Mapping Buffers
-
-You can map (and later unmap) a specified range of the buffer to get direct
-memory access to its contents:
-
-``` c
-void* data;
-MojoResult result = MojoMapBuffer(buffer, 0, 64, &data,
-                                  MOJO_MAP_BUFFER_FLAG_NONE);
-
-*(int*)data = 42;
-result = MojoUnmapBuffer(data);
-```
-
-A buffer may have any number of active mappings at a time, in any number of
-processes.
-
-### Read-Only Handles
-
-An option can also be specified on `MojoDuplicateBufferHandle` to ensure
-that the newly duplicated handle can only be mapped to read-only memory:
-
-``` c
-MojoHandle read_only_buffer;
-MojoDuplicateBufferHandleOptions options;
-options.struct_size = sizeof(options);
-options.flags = MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
-MojoResult result = MojoDuplicateBufferHandle(buffer, &options,
-                                              &read_only_buffer);
-
-// Attempt to map and write to the buffer using the read-only handle:
-void* data;
-result = MojoMapBuffer(read_only_buffer, 0, 64, &data,
-                       MOJO_MAP_BUFFER_FLAG_NONE);
-*(int*)data = 42;  // CRASH
-```
-
-*** note
-**NOTE:** One important limitation of the current implementation is that
-read-only handles can only be produced from a handle that was originally created
-by `MojoCreateSharedBuffer` (*i.e.*, you cannot create a read-only duplicate
-from a non-read-only duplicate), and the handle cannot have been transferred
-over a message pipe first.
-***
-
-## Native Platform Handles (File Descriptors, Windows Handles, *etc.*)
-
-Native platform handles to system objects can be wrapped as Mojo handles for
-seamless transit over message pipes. Mojo currently supports wrapping POSIX
-file descriptors, Windows handles, and Mach ports.
-
-See [//mojo/public/c/system/platform_handle.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/platform_handle.h)
-for detailed platform handle API documentation.
-
-### Wrapping Basic Handle Types
-
-Wrapping a POSIX file descriptor is simple:
-
-``` c
-MojoPlatformHandle platform_handle;
-platform_handle.struct_size = sizeof(platform_handle);
-platform_handle.type = MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
-platform_handle.value = (uint64_t)fd;
-MojoHandle handle;
-MojoResult result = MojoWrapPlatformHandle(&platform_handle, &handle);
-```
-
-Note that at this point `handle` effectively owns the file descriptor
-and if you were to call `MojoClose(handle)`, the file descriptor would be closed
-too; but we're not going to close it here! We're going to pretend we've sent it
-over a message pipe, and now we want to unwrap it on the other side:
-
-``` c
-MojoPlatformHandle platform_handle;
-platform_handle.struct_size = sizeof(platform_handle);
-MojoResult result = MojoUnwrapPlatformHandle(handle, &platform_handle);
-int fd = (int)platform_handle.value;
-```
-
-The situation looks nearly identical for wrapping and unwrapping Windows handles
-and Mach ports.
-
-### Wrapping Shared Buffer Handles
-
-Unlike other handle types, shared buffers have special meaning in Mojo, and it
-may be desirable to wrap a native platform handle -- along with some extra
-metadata -- such that be treated like a real Mojo shared buffer handle.
-Conversely it can also be useful to unpack a Mojo shared buffer handle into
-a native platform handle which references the buffer object. Both of these
-things can be done using the `MojoWrapPlatformSharedBuffer` and
-`MojoUnwrapPlatformSharedBuffer` APIs.
-
-On Windows, the wrapped platform handle must always be a Windows handle to
-a file mapping object.
-
-On OS X, the wrapped platform handle must be a memory-object send right.
-
-On all other POSIX systems, the wrapped platform handle must be a file
-descriptor for a shared memory object.
-
-## Signals & Watchers
-
-Message pipe and data pipe (producer and consumer) handles can change state in
-ways that may be interesting to a Mojo API user. For example, you may wish to
-know when a message pipe handle has messages available to be read or when its
-peer has been closed. Such states are reflected by a fixed set of boolean
-signals on each pipe handle.
-
-### Signals
-
-Every message pipe and data pipe handle maintains a notion of
-**signaling state** which may be queried at any time. For example:
-
-``` c
-MojoHandle a, b;
-MojoCreateMessagePipe(NULL, &a, &b);
-
-MojoHandleSignalsState state;
-MojoResult result = MojoQueryHandleSignalsState(a, &state);
-```
-
-The `MojoHandleSignalsState` structure exposes two fields: `satisfied_signals`
-and `satisfiable_signals`. Both of these are bitmasks of the type
-`MojoHandleSignals` (see [//mojo/public/c/system/types.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/types.h)
-for more details.)
-
-The `satisfied_signals` bitmask indicates signals which were satisfied on the
-handle at the time of the call, while the `satisfiable_signals` bitmask
-indicates signals which were still possible to satisfy at the time of the call.
-It is thus by definition always true that:
-
-``` c
-(satisfied_signals | satisfiable_signals) == satisfiable_signals
-```
-
-In other words a signal obviously cannot be satisfied if it is no longer
-satisfiable. Furthermore once a signal is unsatisfiable, *i.e.* is no longer
-set in `sastisfiable_signals`, it can **never** become satisfiable again.
-
-To illustrate this more clearly, consider the message pipe created above. Both
-ends of the pipe are still open and neither has been written to yet. Thus both
-handles start out with the same signaling state:
-
-| Field                 | State |
-|-----------------------|-------|
-| `satisfied_signals`   | `MOJO_HANDLE_SIGNAL_WRITABLE`
-| `satisfiable_signals` | `MOJO_HANDLE_SIGNAL_READABLE + MOJO_HANDLE_SIGNAL_WRITABLE + MOJO_HANDLE_SIGNAL_PEER_CLOSED`
-
-Writing a message to handle `b` will eventually alter the signaling state of `a`
-such that `MOJO_HANDLE_SIGNAL_READABLE` also becomes satisfied. If we were to
-then close `b`, the signaling state of `a` would look like:
-
-| Field                 | State |
-|-----------------------|-------|
-| `satisfied_signals`   | `MOJO_HANDLE_SIGNAL_READABLE + MOJO_HANDLE_SIGNAL_PEER_CLOSED`
-| `satisfiable_signals` | `MOJO_HANDLE_SIGNAL_READABLE + MOJO_HANDLE_SIGNAL_PEER_CLOSED`
-
-Note that even though `a`'s peer is known to be closed (hence making `a`
-permanently unwritable) it remains readable because there's still an unread
-received message waiting to be read from `a`.
-
-Finally if we read the last message from `a` its signaling state becomes:
-
-| Field                 | State |
-|-----------------------|-------|
-| `satisfied_signals`   | `MOJO_HANDLE_SIGNAL_PEER_CLOSED`
-| `satisfiable_signals` | `MOJO_HANDLE_SIGNAL_PEER_CLOSED`
-
-and we know definitively that `a` can never be read from again.
-
-### Watching Signals
-
-The ability to query a handle's signaling state can be useful, but it's not
-sufficient to support robust and efficient pipe usage. Mojo watchers empower
-users with the ability to **watch** a handle's signaling state for interesting
-changes and automatically invoke a notification handler in response.
-
-When a watcher is created it must be bound to a function pointer matching
-the following signature, defined in
-[//mojo/public/c/system/watcher.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/watcher.h):
-
-``` c
-typedef void (*MojoWatcherNotificationCallback)(
-    uintptr_t context,
-    MojoResult result,
-    MojoHandleSignalsState signals_state,
-    MojoWatcherNotificationFlags flags);
-```
-
-The `context` argument corresponds to a specific handle being watched by the
-watcher (read more below), and the remaining arguments provide details regarding
-the specific reason for the notification. It's important to be aware that a
-watcher's registered handler may be called **at any time** and
-**on any thread**.
-
-It's also helpful to understand a bit about the mechanism by which the handler
-can be invoked. Essentially, any Mojo C System API call may elicit a handle
-state change of some kind. If such a change is relevant to conditions watched by
-a watcher, and that watcher is in a state which allows it raise a corresponding
-notification, its notification handler will be invoked synchronously some time
-before the outermost System API call on the current thread's stack returns.
-
-Handle state changes can also occur as a result of incoming IPC from an external
-process. If a pipe in the current process is connected to an endpoint in another
-process and the internal Mojo system receives an incoming message bound for the
-local endpoint, the arrival of that message will trigger a state change on the
-receiving handle and may thus invoke one or more watchers' notification handlers
-as a result.
-
-The `MOJO_WATCHER_NOTIFICATION_FLAG_FROM_SYSTEM` flag on the notification
-handler's `flags` argument is used to indicate whether the handler was invoked
-due to such an internal system IPC event (if the flag is set), or if it was
-invoked synchronously due to some local API call (if the flag is unset.)
-This distinction can be useful to make in certain cases to *e.g.* avoid
-accidental reentrancy in user code.
-
-### Creating a Watcher
-
-Creating a watcher is simple:
-
-``` c
-
-void OnNotification(uintptr_t context,
-                    MojoResult result,
-                    MojoHandleSignalsState signals_state,
-                    MojoWatcherNotificationFlags flags) {
-  // ...
-}
-
-MojoHandle w;
-MojoResult result = MojoCreateWatcher(&OnNotification, &w);
-```
-
-Like all other `MojoHandle` types, watchers may be destroyed by closing them
-with `MojoClose`. Unlike other `MojoHandle` types, watcher handles are **not**
-transferrable across message pipes.
-
-In order for a watcher to be useful, it has to watch at least one handle.
-
-### Adding a Handle to a Watcher
-
-Any given watcher can watch any given (message or data pipe) handle for some set
-of signaling conditions. A handle may be watched simultaneously by multiple
-watchers, and a single watcher can watch multiple different handles
-simultaneously.
-
-``` c
-MojoHandle a, b;
-MojoCreateMessagePipe(NULL, &a, &b);
-
-// Watch handle |a| for readability.
-const uintptr_t context = 1234;
-MojoResult result = MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, context);
-```
-
-We've successfully instructed watcher `w` to begin watching pipe handle `a` for
-readability. However, our recently created watcher is still in a **disarmed**
-state, meaning that it will never fire a notification pertaining to this watched
-signaling condition. It must be **armed** before that can happen.
-
-### Arming a Watcher
-
-In order for a watcher to invoke its notification handler in response to a
-relevant signaling state change on a watched handle, it must first be armed. A
-watcher may only be armed if none of its watched handles would elicit a
-notification immediately once armed.
-
-In this case `a` is clearly not yet readable, so arming should succeed:
-
-``` c
-MojoResult result = MojoArmWatcher(w, NULL, NULL, NULL, NULL);
-```
-
-Now we can write to `b` to make `a` readable:
-
-``` c
-MojoWriteMessage(b, NULL, 0, NULL, 0, MOJO_WRITE_MESSAGE_NONE);
-```
-
-Eventually -- and in practice possibly before `MojoWriteMessage` even
-returns -- this will cause `OnNotification` to be invoked on the calling thread
-with the `context` value (*i.e.* 1234) that was given when the handle was added
-to the watcher.
-
-The `result` parameter will be `MOJO_RESULT_OK` to indicate that the watched
-signaling condition has been *satisfied*. If the watched condition had instead
-become permanently *unsatisfiable* (*e.g.*, if `b` were instead closed), `result`
-would instead indicate `MOJO_RESULT_FAILED_PRECONDITION`.
-
-**NOTE:** Immediately before a watcher decides to invoke its notification
-handler, it automatically disarms itself to prevent another state change from
-eliciting another notification. Therefore a watcher must be repeatedly rearmed
-in order to continue dispatching signaling notifications.
-
-As noted above, arming a watcher may fail if any of the watched conditions for
-a handle are already partially satisfied or fully unsatisfiable. In that case
-the caller may provide buffers for `MojoArmWatcher` to store information about
-a subset of the relevant watches which caused it to fail:
-
-``` c
-// Provide some storage for information about watches that are already ready.
-uint32_t num_ready_contexts = 4;
-uintptr_t ready_contexts[4];
-MojoResult ready_results[4];
-struct MojoHandleSignalsStates ready_states[4];
-MojoResult result = MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                                   ready_results, ready_states);
-```
-
-Because `a` is still readable this operation will fail with
-`MOJO_RESULT_FAILED_PRECONDITION`. The input value of `num_ready_contexts`
-informs `MojoArmWatcher` that it may store information regarding up to 4 watches
-which currently prevent arming. In this case of course there is only one active
-watch, so upon return we will see:
-
-* `num_ready_contexts` is `1`.
-* `ready_contexts[0]` is `1234`.
-* `ready_results[0]` is `MOJO_RESULT_OK`
-* `ready_states[0]` is the last known signaling state of handle `a`.
-
-In other words the stored information mirrors what would have been the
-notification handler's arguments if the watcher were allowed to arm and thus
-notify immediately.
-
-### Cancelling a Watch
-
-There are three ways a watch can be cancelled:
-
-* The watched handle is closed
-* The watcher handle is closed (in which case all of its watches are cancelled.)
-* `MojoCancelWatch` is explicitly called for a given `context`.
-
-In the above example this means any of the following operations will cancel the
-watch on `a`:
-
-``` c
-// Close the watched handle...
-MojoClose(a);
-
-// OR close the watcher handle...
-MojoClose(w);
-
-// OR explicitly cancel.
-MojoResult result = MojoCancelWatch(w, 1234);
-```
-
-In every case the watcher's notification handler is invoked for the cancelled
-watch(es) regardless of whether or not the watcher is or was armed at the time.
-The notification handler receives a `result` of `MOJO_RESULT_CANCELLED` for
-these notifications, and this is guaranteed to be the final notification for any
-given watch context.
-
-### Practical Watch Context Usage
-
-It is common and probably wise to treat a watch's `context` value as an opaque
-pointer to some thread-safe state associated in some way with the handle being
-watched. Here's a small example which uses a single watcher to watch both ends
-of a message pipe and accumulate a count of messages received at each end.
-
-``` c
-// NOTE: For the sake of simplicity this example code is not in fact
-// thread-safe. As long as there's only one thread running in the process and
-// no external process connections, this is fine.
-
-struct WatchedHandleState {
-  MojoHandle watcher;
-  MojoHandle handle;
-  int message_count;
-};
-
-void OnNotification(uintptr_t context,
-                    MojoResult result,
-                    MojoHandleSignalsState signals_state,
-                    MojoWatcherNotificationFlags flags) {
-  struct WatchedHandleState* state = (struct WatchedHandleState*)(context);
-  MojoResult rv;
-
-  if (result == MOJO_RESULT_CANCELLED) {
-    // Cancellation is always the last notification and is guaranteed to
-    // eventually happen for every context, assuming no handles are leaked. We
-    // treat this as an opportunity to free the WatchedHandleState.
-    free(state);
-    return;
-  }
-
-  if (result == MOJO_RESULT_FAILED_PRECONDITION) {
-    // No longer readable, i.e. the other handle must have been closed. Better
-    // cancel. Note that we could also just call MojoClose(state->watcher) here
-    // since we know |context| is its only registered watch.
-    MojoCancelWatch(state->watcher, context);
-    return;
-  }
-
-  // This is the only handle watched by the watcher, so as long as we can't arm
-  // the watcher we know something's up with this handle. Try to read messages
-  // until we can successfully arm again or something goes terribly wrong.
-  while (MojoArmWatcher(state->watcher, NULL, NULL, NULL, NULL) ==
-         MOJO_RESULT_FAILED_PRECONDITION) {
-    rv = MojoReadMessageNew(state->handle, NULL, NULL, NULL,
-                            MOJO_READ_MESSAGE_FLAG_MAY_DISCARD);
-    if (rv == MOJO_RESULT_OK) {
-      state->message_count++;
-    } else if (rv == MOJO_RESULT_FAILED_PRECONDITION) {
-      MojoCancelWatch(state->watcher, context);
-      return;
-    }
-  }
-}
-
-MojoHandle a, b;
-MojoCreateMessagePipe(NULL, &a, &b);
-
-MojoHandle a_watcher, b_watcher;
-MojoCreateWatcher(&OnNotification, &a_watcher);
-MojoCreateWatcher(&OnNotification, &b_watcher)
-
-struct WatchedHandleState* a_state = malloc(sizeof(struct WatchedHandleState));
-a_state->watcher = a_watcher;
-a_state->handle = a;
-a_state->message_count = 0;
-
-struct WatchedHandleState* b_state = malloc(sizeof(struct WatchedHandleState));
-b_state->watcher = b_watcher;
-b_state->handle = b;
-b_state->message_count = 0;
-
-MojoWatch(a_watcher, a, MOJO_HANDLE_SIGNAL_READABLE, (uintptr_t)a_state);
-MojoWatch(b_watcher, b, MOJO_HANDLE_SIGNAL_READABLE, (uintptr_t)b_state);
-
-MojoArmWatcher(a_watcher, NULL, NULL, NULL, NULL);
-MojoArmWatcher(b_watcher, NULL, NULL, NULL, NULL);
-```
-
-Now any writes to `a` will increment `message_count` in `b_state`, and any
-writes to `b` will increment `message_count` in `a_state`.
-
-If either `a` or `b` is closed, both watches will be cancelled - one because
-watch cancellation is implicit in handle closure, and the other because its
-watcher will eventually detect that the handle is no longer readable.
diff --git a/mojo/public/c/system/buffer.h b/mojo/public/c/system/buffer.h
deleted file mode 100644
index 285e0d7..0000000
--- a/mojo/public/c/system/buffer.h
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains types/constants and functions specific to shared buffers.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_BUFFER_H_
-#define MOJO_PUBLIC_C_SYSTEM_BUFFER_H_
-
-#include <stdint.h>
-
-#include "mojo/public/c/system/macros.h"
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-
-// |MojoCreateSharedBufferOptions|: Used to specify creation parameters for a
-// shared buffer to |MojoCreateSharedBuffer()|.
-//
-//   |uint32_t struct_size|: Set to the size of the
-//       |MojoCreateSharedBufferOptions| struct. (Used to allow for future
-//       extensions.)
-//
-//   |MojoCreateSharedBufferOptionsFlags flags|: Reserved for future use.
-//       |MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE|: No flags; default mode.
-
-typedef uint32_t MojoCreateSharedBufferOptionsFlags;
-
-#ifdef __cplusplus
-const MojoCreateSharedBufferOptionsFlags
-    MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE = 0;
-#else
-#define MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE \
-  ((MojoCreateSharedBufferOptionsFlags)0)
-#endif
-
-MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
-struct MOJO_ALIGNAS(8) MojoCreateSharedBufferOptions {
-  uint32_t struct_size;
-  MojoCreateSharedBufferOptionsFlags flags;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoCreateSharedBufferOptions) == 8,
-                   "MojoCreateSharedBufferOptions has wrong size");
-
-// |MojoDuplicateBufferHandleOptions|: Used to specify parameters in duplicating
-// access to a shared buffer to |MojoDuplicateBufferHandle()|.
-//
-//   |uint32_t struct_size|: Set to the size of the
-//       |MojoDuplicateBufferHandleOptions| struct. (Used to allow for future
-//       extensions.)
-//
-//   |MojoDuplicateBufferHandleOptionsFlags flags|: Flags to control the
-//       behavior of |MojoDuplicateBufferHandle()|. May be some combination of
-//       the following:
-//
-//       |MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE|: No flags; default
-//           mode.
-//       |MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY|: The duplicate
-//           shared buffer can only be mapped read-only. A read-only duplicate
-//           may only be created before any handles to the buffer are passed
-//           over a message pipe.
-
-typedef uint32_t MojoDuplicateBufferHandleOptionsFlags;
-
-#ifdef __cplusplus
-const MojoDuplicateBufferHandleOptionsFlags
-    MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE = 0;
-const MojoDuplicateBufferHandleOptionsFlags
-    MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY = 1 << 0;
-#else
-#define MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE \
-  ((MojoDuplicateBufferHandleOptionsFlags)0)
-#define MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY \
-  ((MojoDuplicateBufferHandleOptionsFlags)1 << 0)
-#endif
-
-struct MojoDuplicateBufferHandleOptions {
-  uint32_t struct_size;
-  MojoDuplicateBufferHandleOptionsFlags flags;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoDuplicateBufferHandleOptions) == 8,
-                   "MojoDuplicateBufferHandleOptions has wrong size");
-
-// |MojoMapBufferFlags|: Used to specify different modes to |MojoMapBuffer()|.
-//   |MOJO_MAP_BUFFER_FLAG_NONE| - No flags; default mode.
-
-typedef uint32_t MojoMapBufferFlags;
-
-#ifdef __cplusplus
-const MojoMapBufferFlags MOJO_MAP_BUFFER_FLAG_NONE = 0;
-#else
-#define MOJO_MAP_BUFFER_FLAG_NONE ((MojoMapBufferFlags)0)
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Note: See the comment in functions.h about the meaning of the "optional"
-// label for pointer parameters.
-
-// Creates a buffer of size |num_bytes| bytes that can be shared between
-// processes. The returned handle may be duplicated any number of times by
-// |MojoDuplicateBufferHandle()|.
-//
-// To access the buffer's storage, one must call |MojoMapBuffer()|.
-//
-// |options| may be set to null for a shared buffer with the default options.
-//
-// On success, |*shared_buffer_handle| will be set to the handle for the shared
-// buffer. On failure it is not modified.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |*options| is invalid).
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if a process/system/quota/etc. limit has
-//       been reached (e.g., if the requested size was too large, or if the
-//       maximum number of handles was exceeded).
-//   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
-MOJO_SYSTEM_EXPORT MojoResult MojoCreateSharedBuffer(
-    const struct MojoCreateSharedBufferOptions* options,  // Optional.
-    uint64_t num_bytes,                                   // In.
-    MojoHandle* shared_buffer_handle);                    // Out.
-
-// Duplicates the handle |buffer_handle| as a new shared buffer handle. On
-// success this returns the new handle in |*new_buffer_handle|. A shared buffer
-// remains allocated as long as there is at least one shared buffer handle
-// referencing it in at least one process in the system.
-//
-// |options| may be set to null to duplicate the buffer handle with the default
-// options.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |buffer_handle| is not a valid buffer handle or |*options| is invalid).
-//   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
-MOJO_SYSTEM_EXPORT MojoResult MojoDuplicateBufferHandle(
-    MojoHandle buffer_handle,
-    const struct MojoDuplicateBufferHandleOptions* options,  // Optional.
-    MojoHandle* new_buffer_handle);                          // Out.
-
-// Maps the part (at offset |offset| of length |num_bytes|) of the buffer given
-// by |buffer_handle| into memory, with options specified by |flags|. |offset +
-// num_bytes| must be less than or equal to the size of the buffer. On success,
-// |*buffer| points to memory with the requested part of the buffer. On
-// failure |*buffer| it is not modified.
-//
-// A single buffer handle may have multiple active mappings The permissions
-// (e.g., writable or executable) of the returned memory depend on th
-// properties of the buffer and properties attached to the buffer handle, as
-// well as |flags|.
-//
-// A mapped buffer must eventually be unmapped by calling |MojoUnmapBuffer()|
-// with the value of |*buffer| returned by this function.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |buffer_handle| is not a valid buffer handle or the range specified by
-//       |offset| and |num_bytes| is not valid).
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if the mapping operation itself failed
-//       (e.g., due to not having appropriate address space available).
-MOJO_SYSTEM_EXPORT MojoResult MojoMapBuffer(MojoHandle buffer_handle,
-                                            uint64_t offset,
-                                            uint64_t num_bytes,
-                                            void** buffer,  // Out.
-                                            MojoMapBufferFlags flags);
-
-// Unmaps a buffer pointer that was mapped by |MojoMapBuffer()|. |buffer| must
-// have been the result of |MojoMapBuffer()| (not some other pointer inside
-// the mapped memory), and the entire mapping will be removed.
-//
-// A mapping may only be unmapped once.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |buffer| is invalid (e.g., is not the
-//       result of |MojoMapBuffer()| or has already been unmapped).
-MOJO_SYSTEM_EXPORT MojoResult MojoUnmapBuffer(void* buffer);  // In.
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_BUFFER_H_
diff --git a/mojo/public/c/system/core.h b/mojo/public/c/system/core.h
deleted file mode 100644
index 03c0652..0000000
--- a/mojo/public/c/system/core.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a catch-all header that includes everything.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_CORE_H_
-#define MOJO_PUBLIC_C_SYSTEM_CORE_H_
-
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/macros.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/c/system/platform_handle.h"
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/c/system/watcher.h"
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_CORE_H_
diff --git a/mojo/public/c/system/data_pipe.h b/mojo/public/c/system/data_pipe.h
deleted file mode 100644
index f51e36c..0000000
--- a/mojo/public/c/system/data_pipe.h
+++ /dev/null
@@ -1,344 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains types/constants and functions specific to data pipes.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_DATA_PIPE_H_
-#define MOJO_PUBLIC_C_SYSTEM_DATA_PIPE_H_
-
-#include <stdint.h>
-
-#include "mojo/public/c/system/macros.h"
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-
-// |MojoCreateDataPipeOptions|: Used to specify creation parameters for a data
-// pipe to |MojoCreateDataPipe()|.
-//
-//   |uint32_t struct_size|: Set to the size of the |MojoCreateDataPipeOptions|
-//       struct. (Used to allow for future extensions.)
-//
-//   |MojoCreateDataPipeOptionsFlags flags|: Used to specify different modes of
-//       operation. May be some combination of the following values:
-//
-//       |MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE|: No flags; default mode.
-//
-//   |uint32_t element_num_bytes|: The size of an element, in bytes. All
-//       transactions and buffers will consist of an integral number of
-//       elements. Must be nonzero.
-//
-//   |uint32_t capacity_num_bytes|: The capacity of the data pipe, in number of
-//       bytes; must be a multiple of |element_num_bytes|. The data pipe will
-//       always be able to queue AT LEAST this much data. Set to zero to opt for
-//       a system-dependent automatically-calculated capacity (which will always
-//       be at least one element).
-
-typedef uint32_t MojoCreateDataPipeOptionsFlags;
-
-#ifdef __cplusplus
-const MojoCreateDataPipeOptionsFlags MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE =
-    0;
-#else
-#define MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE \
-  ((MojoCreateDataPipeOptionsFlags)0)
-#endif
-
-MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
-struct MOJO_ALIGNAS(8) MojoCreateDataPipeOptions {
-  MOJO_ALIGNAS(4) uint32_t struct_size;
-  MOJO_ALIGNAS(4) MojoCreateDataPipeOptionsFlags flags;
-  MOJO_ALIGNAS(4) uint32_t element_num_bytes;
-  MOJO_ALIGNAS(4) uint32_t capacity_num_bytes;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoCreateDataPipeOptions) == 16,
-                   "MojoCreateDataPipeOptions has wrong size");
-
-// |MojoWriteDataFlags|: Used to specify different modes to |MojoWriteData()|
-// and |MojoBeginWriteData()|. May be some combination of the following values:
-//
-//   |MOJO_WRITE_DATA_FLAG_NONE| - No flags; default mode.
-//   |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| - Write either all the elements
-//      requested or none of them.
-
-typedef uint32_t MojoWriteDataFlags;
-
-#ifdef __cplusplus
-const MojoWriteDataFlags MOJO_WRITE_DATA_FLAG_NONE = 0;
-const MojoWriteDataFlags MOJO_WRITE_DATA_FLAG_ALL_OR_NONE = 1 << 0;
-#else
-#define MOJO_WRITE_DATA_FLAG_NONE ((MojoWriteDataFlags)0)
-#define MOJO_WRITE_DATA_FLAG_ALL_OR_NONE ((MojoWriteDataFlags)1 << 0)
-#endif
-
-// |MojoReadDataFlags|: Used to specify different modes to |MojoReadData()| and
-// |MojoBeginReadData()|. May be some combination of the following values:
-//
-//   |MOJO_READ_DATA_FLAG_NONE| - No flags; default mode.
-//   |MOJO_READ_DATA_FLAG_ALL_OR_NONE| - Read (or discard) either the requested
-//        number of elements or none. NOTE: This flag is not currently supported
-//        by |MojoBeginReadData()|.
-//   |MOJO_READ_DATA_FLAG_DISCARD| - Discard (up to) the requested number of
-//        elements.
-//   |MOJO_READ_DATA_FLAG_QUERY| - Query the number of elements available to
-//       read. For use with |MojoReadData()| only. Mutually exclusive with
-//       |MOJO_READ_DATA_FLAG_DISCARD|, and |MOJO_READ_DATA_FLAG_ALL_OR_NONE|
-//       is ignored if this flag is set.
-//   |MOJO_READ_DATA_FLAG_PEEK| - Read elements without removing them. For use
-//       with |MojoReadData()| only. Mutually exclusive with
-//       |MOJO_READ_DATA_FLAG_DISCARD| and |MOJO_READ_DATA_FLAG_QUERY|.
-
-typedef uint32_t MojoReadDataFlags;
-
-#ifdef __cplusplus
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_NONE = 0;
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_ALL_OR_NONE = 1 << 0;
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_DISCARD = 1 << 1;
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_QUERY = 1 << 2;
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_PEEK = 1 << 3;
-#else
-#define MOJO_READ_DATA_FLAG_NONE ((MojoReadDataFlags)0)
-#define MOJO_READ_DATA_FLAG_ALL_OR_NONE ((MojoReadDataFlags)1 << 0)
-#define MOJO_READ_DATA_FLAG_DISCARD ((MojoReadDataFlags)1 << 1)
-#define MOJO_READ_DATA_FLAG_QUERY ((MojoReadDataFlags)1 << 2)
-#define MOJO_READ_DATA_FLAG_PEEK ((MojoReadDataFlags)1 << 3)
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Note: See the comment in functions.h about the meaning of the "optional"
-// label for pointer parameters.
-
-// Creates a data pipe, which is a unidirectional communication channel for
-// unframed data. Data must be read and written in multiples of discrete
-// discrete elements of size given in |options|.
-//
-// See |MojoCreateDataPipeOptions| for a description of the different options
-// available for data pipes.
-//
-// |options| may be set to null for a data pipe with the default options (which
-// will have an element size of one byte and have some system-dependent
-// capacity).
-//
-// On success, |*data_pipe_producer_handle| will be set to the handle for the
-// producer and |*data_pipe_consumer_handle| will be set to the handle for the
-// consumer. On failure they are not modified.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |*options| is invalid).
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if a process/system/quota/etc. limit has
-//       been reached (e.g., if the requested capacity was too large, or if the
-//       maximum number of handles was exceeded).
-//   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
-MOJO_SYSTEM_EXPORT MojoResult MojoCreateDataPipe(
-    const struct MojoCreateDataPipeOptions* options,  // Optional.
-    MojoHandle* data_pipe_producer_handle,            // Out.
-    MojoHandle* data_pipe_consumer_handle);           // Out.
-
-// Writes the data pipe producer given by |data_pipe_producer_handle|.
-//
-// |elements| points to data of size |*num_bytes|; |*num_bytes| must be a
-// multiple of the data pipe's element size. If
-// |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| is set in |flags|, either all the data
-// is written (if enough write capacity is available) or none is.
-//
-// On success |*num_bytes| is set to the amount of data that was actually
-// written. On failure it is unmodified.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |data_pipe_producer_dispatcher| is not a handle to a data pipe
-//       producer or |*num_bytes| is not a multiple of the data pipe's element
-//       size.)
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe consumer handle has been
-//       closed.
-//   |MOJO_RESULT_OUT_OF_RANGE| if |flags| has
-//       |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set and the required amount of data
-//       (specified by |*num_bytes|) could not be written.
-//   |MOJO_RESULT_BUSY| if there is a two-phase write ongoing with
-//       |data_pipe_producer_handle| (i.e., |MojoBeginWriteData()| has been
-//       called, but not yet the matching |MojoEndWriteData()|).
-//   |MOJO_RESULT_SHOULD_WAIT| if no data can currently be written (and the
-//       consumer is still open) and |flags| does *not* have
-//       |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set.
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoWriteData(MojoHandle data_pipe_producer_handle,
-                  const void* elements,
-                  uint32_t* num_bytes,  // In/out.
-                  MojoWriteDataFlags flags);
-
-// Begins a two-phase write to the data pipe producer given by
-// |data_pipe_producer_handle|. On success |*buffer| will be a pointer to which
-// the caller can write up to |*buffer_num_bytes| bytes of data.
-//
-// During a two-phase write, |data_pipe_producer_handle| is *not* writable.
-// If another caller tries to write to it by calling |MojoWriteData()| or
-// |MojoBeginWriteData()|, their request will fail with |MOJO_RESULT_BUSY|.
-//
-// If |MojoBeginWriteData()| returns MOJO_RESULT_OK and once the caller has
-// finished writing data to |*buffer|, |MojoEndWriteData()| must be called to
-// indicate the amount of data actually written and to complete the two-phase
-// write operation. |MojoEndWriteData()| need not be called when
-// |MojoBeginWriteData()| fails.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |data_pipe_producer_handle| is not a handle to a data pipe producer or
-//       flags has |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set.
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe consumer handle has been
-//       closed.
-//   |MOJO_RESULT_BUSY| if there is already a two-phase write ongoing with
-//       |data_pipe_producer_handle| (i.e., |MojoBeginWriteData()| has been
-//       called, but not yet the matching |MojoEndWriteData()|).
-//   |MOJO_RESULT_SHOULD_WAIT| if no data can currently be written (and the
-//       consumer is still open).
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoBeginWriteData(MojoHandle data_pipe_producer_handle,
-                       void** buffer,               // Out.
-                       uint32_t* buffer_num_bytes,  // In/out.
-                       MojoWriteDataFlags flags);
-
-// Ends a two-phase write that was previously initiated by
-// |MojoBeginWriteData()| for the same |data_pipe_producer_handle|.
-//
-// |num_bytes_written| must indicate the number of bytes actually written into
-// the two-phase write buffer. It must be less than or equal to the value of
-// |*buffer_num_bytes| output by |MojoBeginWriteData()|, and it must be a
-// multiple of the data pipe's element size.
-//
-// On failure, the two-phase write (if any) is ended (so the handle may become
-// writable again if there's space available) but no data written to |*buffer|
-// is "put into" the data pipe.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |data_pipe_producer_handle| is not a handle to a data pipe producer or
-//       |num_bytes_written| is invalid (greater than the maximum value provided
-//       by |MojoBeginWriteData()| or not a multiple of the element size).
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe producer is not in a
-//       two-phase write (e.g., |MojoBeginWriteData()| was not called or
-//       |MojoEndWriteData()| has already been called).
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoEndWriteData(MojoHandle data_pipe_producer_handle,
-                     uint32_t num_bytes_written);
-
-// Reads data from the data pipe consumer given by |data_pipe_consumer_handle|.
-// May also be used to discard data or query the amount of data available.
-//
-// If |flags| has neither |MOJO_READ_DATA_FLAG_DISCARD| nor
-// |MOJO_READ_DATA_FLAG_QUERY| set, this tries to read up to |*num_bytes| (which
-// must be a multiple of the data pipe's element size) bytes of data to
-// |elements| and set |*num_bytes| to the amount actually read. If flags has
-// |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set, it will either read exactly
-// |*num_bytes| bytes of data or none. Additionally, if flags has
-// |MOJO_READ_DATA_FLAG_PEEK| set, the data read will remain in the pipe and be
-// available to future reads.
-//
-// If flags has |MOJO_READ_DATA_FLAG_DISCARD| set, it discards up to
-// |*num_bytes| (which again must be a multiple of the element size) bytes of
-// data, setting |*num_bytes| to the amount actually discarded. If flags has
-// |MOJO_READ_DATA_FLAG_ALL_OR_NONE|, it will either discard exactly
-// |*num_bytes| bytes of data or none. In this case, |MOJO_READ_DATA_FLAG_QUERY|
-// must not be set, and |elements| is ignored (and should typically be set to
-// null).
-//
-// If flags has |MOJO_READ_DATA_FLAG_QUERY| set, it queries the amount of data
-// available, setting |*num_bytes| to the number of bytes available. In this
-// case, |MOJO_READ_DATA_FLAG_DISCARD| must not be set, and
-// |MOJO_READ_DATA_FLAG_ALL_OR_NONE| is ignored, as are |elements| and the input
-// value of |*num_bytes|.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success (see above for a description of the different
-//       operations).
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |data_pipe_consumer_handle| is invalid, the combination of flags in
-//       |flags| is invalid, etc.).
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe producer handle has been
-//       closed and data (or the required amount of data) was not available to
-//       be read or discarded.
-//   |MOJO_RESULT_OUT_OF_RANGE| if |flags| has |MOJO_READ_DATA_FLAG_ALL_OR_NONE|
-//       set and the required amount of data is not available to be read or
-//       discarded (and the producer is still open).
-//   |MOJO_RESULT_BUSY| if there is a two-phase read ongoing with
-//       |data_pipe_consumer_handle| (i.e., |MojoBeginReadData()| has been
-//       called, but not yet the matching |MojoEndReadData()|).
-//   |MOJO_RESULT_SHOULD_WAIT| if there is no data to be read or discarded (and
-//       the producer is still open) and |flags| does *not* have
-//       |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set.
-MOJO_SYSTEM_EXPORT MojoResult MojoReadData(MojoHandle data_pipe_consumer_handle,
-                                           void* elements,       // Out.
-                                           uint32_t* num_bytes,  // In/out.
-                                           MojoReadDataFlags flags);
-
-// Begins a two-phase read from the data pipe consumer given by
-// |data_pipe_consumer_handle|. On success, |*buffer| will be a pointer from
-// which the caller can read up to |*buffer_num_bytes| bytes of data.
-//
-// During a two-phase read, |data_pipe_consumer_handle| is *not* readable.
-// If another caller tries to read from it by calling |MojoReadData()| or
-// |MojoBeginReadData()|, their request will fail with |MOJO_RESULT_BUSY|.
-//
-// Once the caller has finished reading data from |*buffer|, |MojoEndReadData()|
-// must be called to indicate the number of bytes read and to complete the
-// two-phase read operation.
-//
-// |flags| must not have |MOJO_READ_DATA_FLAG_DISCARD|,
-// |MOJO_READ_DATA_FLAG_QUERY|, |MOJO_READ_DATA_FLAG_PEEK|, or
-// |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |data_pipe_consumer_handle| is not a handle to a data pipe consumer,
-//       or |flags| has invalid flags set.)
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe producer handle has been
-//       closed.
-//   |MOJO_RESULT_BUSY| if there is already a two-phase read ongoing with
-//       |data_pipe_consumer_handle| (i.e., |MojoBeginReadData()| has been
-//       called, but not yet the matching |MojoEndReadData()|).
-//   |MOJO_RESULT_SHOULD_WAIT| if no data can currently be read (and the
-//       producer is still open).
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoBeginReadData(MojoHandle data_pipe_consumer_handle,
-                      const void** buffer,         // Out.
-                      uint32_t* buffer_num_bytes,  // In/out.
-                      MojoReadDataFlags flags);
-
-// Ends a two-phase read from the data pipe consumer given by
-// |data_pipe_consumer_handle| that was begun by a call to |MojoBeginReadData()|
-// on the same handle. |num_bytes_read| should indicate the amount of data
-// actually read; it must be less than or equal to the value of
-// |*buffer_num_bytes| output by |MojoBeginReadData()| and must be a multiple of
-// the element size.
-//
-// On failure, the two-phase read (if any) is ended (so the handle may become
-// readable again) but no data is "removed" from the data pipe.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |data_pipe_consumer_handle| is not a handle to a data pipe consumer or
-//       |num_bytes_written| is greater than the maximum value provided by
-//       |MojoBeginReadData()| or not a multiple of the element size).
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe consumer is not in a
-//       two-phase read (e.g., |MojoBeginReadData()| was not called or
-//       |MojoEndReadData()| has already been called).
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoEndReadData(MojoHandle data_pipe_consumer_handle,
-                    uint32_t num_bytes_read);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_DATA_PIPE_H_
diff --git a/mojo/public/c/system/functions.h b/mojo/public/c/system/functions.h
deleted file mode 100644
index d0656c6..0000000
--- a/mojo/public/c/system/functions.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains basic functions common to different Mojo system APIs.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_FUNCTIONS_H_
-#define MOJO_PUBLIC_C_SYSTEM_FUNCTIONS_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Note: Pointer parameters that are labelled "optional" may be null (at least
-// under some circumstances). Non-const pointer parameters are also labeled
-// "in", "out", or "in/out", to indicate how they are used. (Note that how/if
-// such a parameter is used may depend on other parameters or the requested
-// operation's success/failure. E.g., a separate |flags| parameter may control
-// whether a given "in/out" parameter is used for input, output, or both.)
-
-// Returns the time, in microseconds, since some undefined point in the past.
-// The values are only meaningful relative to other values that were obtained
-// from the same device without an intervening system restart. Such values are
-// guaranteed to be monotonically non-decreasing with the passage of real time.
-// Although the units are microseconds, the resolution of the clock may vary and
-// is typically in the range of ~1-15 ms.
-MOJO_SYSTEM_EXPORT MojoTimeTicks MojoGetTimeTicksNow(void);
-
-// Closes the given |handle|.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |handle| is not a valid handle.
-//
-// Concurrent operations on |handle| may succeed (or fail as usual) if they
-// happen before the close, be cancelled with result |MOJO_RESULT_CANCELLED| if
-// they properly overlap (this is likely the case with watchers), or fail with
-// |MOJO_RESULT_INVALID_ARGUMENT| if they happen after.
-MOJO_SYSTEM_EXPORT MojoResult MojoClose(MojoHandle handle);
-
-// Queries the last known signals state of a handle.
-//
-// Note that no guarantees can be made about the accuracy of the returned
-// signals state by the time this returns, as other threads in the system may
-// change the handle's state at any time. Use with appropriate discretion.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success. |*signals_state| is populated with the
-//       last known signals state of |handle|.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |handle| is not a valid handle or
-//       |signals_state| is null.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoQueryHandleSignalsState(MojoHandle handle,
-                            struct MojoHandleSignalsState* signals_state);
-
-// Retrieves system properties. See the documentation for |MojoPropertyType| for
-// supported property types and their corresponding output value type.
-//
-// Returns:
-//     |MOJO_RESULT_OK| on success.
-//     |MOJO_RESULT_INVALID_ARGUMENT| if |type| is not recognized. In this case,
-//         |value| is untouched.
-MOJO_SYSTEM_EXPORT MojoResult MojoGetProperty(MojoPropertyType type,
-                                              void* value);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_FUNCTIONS_H_
diff --git a/mojo/public/c/system/macros.h b/mojo/public/c/system/macros.h
deleted file mode 100644
index 917c69c..0000000
--- a/mojo/public/c/system/macros.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_MACROS_H_
-#define MOJO_PUBLIC_C_SYSTEM_MACROS_H_
-
-#include <stddef.h>
-
-// Assert things at compile time. (|msg| should be a valid identifier name.)
-// This macro is currently C++-only, but we want to use it in the C core.h.
-// Use like:
-//   MOJO_STATIC_ASSERT(sizeof(Foo) == 12, "Foo has invalid size");
-#if defined(__cplusplus)
-#define MOJO_STATIC_ASSERT(expr, msg) static_assert(expr, msg)
-#else
-#define MOJO_STATIC_ASSERT(expr, msg)
-#endif
-
-// Like the C++11 |alignof| operator.
-#if __cplusplus >= 201103L
-#define MOJO_ALIGNOF(type) alignof(type)
-#elif defined(__GNUC__)
-#define MOJO_ALIGNOF(type) __alignof__(type)
-#elif defined(_MSC_VER)
-// The use of |sizeof| is to work around a bug in MSVC 2010 (see
-// http://goo.gl/isH0C; supposedly fixed since then).
-#define MOJO_ALIGNOF(type) (sizeof(type) - sizeof(type) + __alignof(type))
-#else
-#error "Please define MOJO_ALIGNOF() for your compiler."
-#endif
-
-// Specify the alignment of a |struct|, etc.
-// Use like:
-//   struct MOJO_ALIGNAS(8) Foo { ... };
-// Unlike the C++11 |alignas()|, |alignment| must be an integer. It may not be a
-// type, nor can it be an expression like |MOJO_ALIGNOF(type)| (due to the
-// non-C++11 MSVS version).
-#if __cplusplus >= 201103L
-#define MOJO_ALIGNAS(alignment) alignas(alignment)
-#elif defined(__GNUC__)
-#define MOJO_ALIGNAS(alignment) __attribute__((aligned(alignment)))
-#elif defined(_MSC_VER)
-#define MOJO_ALIGNAS(alignment) __declspec(align(alignment))
-#else
-#error "Please define MOJO_ALIGNAS() for your compiler."
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_MACROS_H_
diff --git a/mojo/public/c/system/message_pipe.h b/mojo/public/c/system/message_pipe.h
deleted file mode 100644
index b759bc7..0000000
--- a/mojo/public/c/system/message_pipe.h
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains types/constants and functions specific to message pipes.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_MESSAGE_PIPE_H_
-#define MOJO_PUBLIC_C_SYSTEM_MESSAGE_PIPE_H_
-
-#include <stdint.h>
-
-#include "mojo/public/c/system/macros.h"
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-
-// |MojoMessageHandle|: Used to refer to message objects created by
-//     |MojoAllocMessage()| and transferred by |MojoWriteMessageNew()| or
-//     |MojoReadMessageNew()|.
-
-typedef uintptr_t MojoMessageHandle;
-
-#ifdef __cplusplus
-const MojoMessageHandle MOJO_MESSAGE_HANDLE_INVALID = 0;
-#else
-#define MOJO_MESSAGE_HANDLE_INVALID ((MojoMessageHandle)0)
-#endif
-
-// |MojoCreateMessagePipeOptions|: Used to specify creation parameters for a
-// message pipe to |MojoCreateMessagePipe()|.
-//   |uint32_t struct_size|: Set to the size of the
-//       |MojoCreateMessagePipeOptions| struct. (Used to allow for future
-//       extensions.)
-//   |MojoCreateMessagePipeOptionsFlags flags|: Used to specify different modes
-//       of operation.
-//       |MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE|: No flags; default mode.
-
-typedef uint32_t MojoCreateMessagePipeOptionsFlags;
-
-#ifdef __cplusplus
-const MojoCreateMessagePipeOptionsFlags
-    MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE = 0;
-#else
-#define MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE \
-  ((MojoCreateMessagePipeOptionsFlags)0)
-#endif
-
-MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
-struct MOJO_ALIGNAS(8) MojoCreateMessagePipeOptions {
-  uint32_t struct_size;
-  MojoCreateMessagePipeOptionsFlags flags;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoCreateMessagePipeOptions) == 8,
-                   "MojoCreateMessagePipeOptions has wrong size");
-
-// |MojoWriteMessageFlags|: Used to specify different modes to
-// |MojoWriteMessage()|.
-//   |MOJO_WRITE_MESSAGE_FLAG_NONE| - No flags; default mode.
-
-typedef uint32_t MojoWriteMessageFlags;
-
-#ifdef __cplusplus
-const MojoWriteMessageFlags MOJO_WRITE_MESSAGE_FLAG_NONE = 0;
-#else
-#define MOJO_WRITE_MESSAGE_FLAG_NONE ((MojoWriteMessageFlags)0)
-#endif
-
-// |MojoReadMessageFlags|: Used to specify different modes to
-// |MojoReadMessage()|.
-//   |MOJO_READ_MESSAGE_FLAG_NONE| - No flags; default mode.
-//   |MOJO_READ_MESSAGE_FLAG_MAY_DISCARD| - If the message is unable to be read
-//       for whatever reason (e.g., the caller-supplied buffer is too small),
-//       discard the message (i.e., simply dequeue it).
-
-typedef uint32_t MojoReadMessageFlags;
-
-#ifdef __cplusplus
-const MojoReadMessageFlags MOJO_READ_MESSAGE_FLAG_NONE = 0;
-const MojoReadMessageFlags MOJO_READ_MESSAGE_FLAG_MAY_DISCARD = 1 << 0;
-#else
-#define MOJO_READ_MESSAGE_FLAG_NONE ((MojoReadMessageFlags)0)
-#define MOJO_READ_MESSAGE_FLAG_MAY_DISCARD ((MojoReadMessageFlags)1 << 0)
-#endif
-
-// |MojoAllocMessageFlags|: Used to specify different options for
-// |MojoAllocMessage()|.
-//   |MOJO_ALLOC_MESSAGE_FLAG_NONE| - No flags; default mode.
-
-typedef uint32_t MojoAllocMessageFlags;
-
-#ifdef __cplusplus
-const MojoAllocMessageFlags MOJO_ALLOC_MESSAGE_FLAG_NONE = 0;
-#else
-#define MOJO_ALLOC_MESSAGE_FLAG_NONE ((MojoAllocMessageFlags)0)
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Note: See the comment in functions.h about the meaning of the "optional"
-// label for pointer parameters.
-
-// Creates a message pipe, which is a bidirectional communication channel for
-// framed data (i.e., messages). Messages can contain plain data and/or Mojo
-// handles.
-//
-// |options| may be set to null for a message pipe with the default options.
-//
-// On success, |*message_pipe_handle0| and |*message_pipe_handle1| are set to
-// handles for the two endpoints (ports) for the message pipe.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |*options| is invalid).
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if a process/system/quota/etc. limit has
-//       been reached.
-MOJO_SYSTEM_EXPORT MojoResult MojoCreateMessagePipe(
-    const struct MojoCreateMessagePipeOptions* options,  // Optional.
-    MojoHandle* message_pipe_handle0,                    // Out.
-    MojoHandle* message_pipe_handle1);                   // Out.
-
-// Writes a message to the message pipe endpoint given by |message_pipe_handle|,
-// with message data specified by |bytes| of size |num_bytes| and attached
-// handles specified by |handles| of count |num_handles|, and options specified
-// by |flags|. If there is no message data, |bytes| may be null, in which case
-// |num_bytes| must be zero. If there are no attached handles, |handles| may be
-// null, in which case |num_handles| must be zero.
-//
-// If handles are attached, the handles will no longer be valid (on success the
-// receiver will receive equivalent, but logically different, handles). Handles
-// to be sent should not be in simultaneous use (e.g., on another thread).
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success (i.e., the message was enqueued).
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g., if
-//       |message_pipe_handle| is not a valid handle, or some of the
-//       requirements above are not satisfied).
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if some system limit has been reached, or
-//       the number of handles to send is too large (TODO(vtl): reconsider the
-//       latter case).
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the other endpoint has been closed.
-//       Note that closing an endpoint is not necessarily synchronous (e.g.,
-//       across processes), so this function may succeed even if the other
-//       endpoint has been closed (in which case the message would be dropped).
-//   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
-//   |MOJO_RESULT_BUSY| if some handle to be sent is currently in use.
-//
-// TODO(vtl): Add a notion of capacity for message pipes, and return
-// |MOJO_RESULT_SHOULD_WAIT| if the message pipe is full.
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoWriteMessage(MojoHandle message_pipe_handle,
-                     const void* bytes,  // Optional.
-                     uint32_t num_bytes,
-                     const MojoHandle* handles,  // Optional.
-                     uint32_t num_handles,
-                     MojoWriteMessageFlags flags);
-
-// Writes a message to the message pipe endpoint given by |message_pipe_handle|.
-//
-// |message|: A message object allocated by |MojoAllocMessage()|. Ownership of
-//     the message is passed into Mojo.
-//
-// Returns results corresponding to |MojoWriteMessage()| above.
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoWriteMessageNew(MojoHandle message_pipe_handle,
-                        MojoMessageHandle message,
-                        MojoWriteMessageFlags);
-
-// Reads the next message from a message pipe, or indicates the size of the
-// message if it cannot fit in the provided buffers. The message will be read
-// in its entirety or not at all; if it is not, it will remain enqueued unless
-// the |MOJO_READ_MESSAGE_FLAG_MAY_DISCARD| flag was passed. At most one
-// message will be consumed from the queue, and the return value will indicate
-// whether a message was successfully read.
-//
-// |num_bytes| and |num_handles| are optional in/out parameters that on input
-// must be set to the sizes of the |bytes| and |handles| arrays, and on output
-// will be set to the actual number of bytes or handles contained in the
-// message (even if the message was not retrieved due to being too large).
-// Either |num_bytes| or |num_handles| may be null if the message is not
-// expected to contain the corresponding type of data, but such a call would
-// fail with |MOJO_RESULT_RESOURCE_EXHAUSTED| if the message in fact did
-// contain that type of data.
-//
-// |bytes| and |handles| will receive the contents of the message, if it is
-// retrieved. Either or both may be null, in which case the corresponding size
-// parameter(s) must also be set to zero or passed as null.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success (i.e., a message was actually read).
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid.
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the other endpoint has been closed.
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if the message was too large to fit in the
-//       provided buffer(s). The message will have been left in the queue or
-//       discarded, depending on flags.
-//   |MOJO_RESULT_SHOULD_WAIT| if no message was available to be read.
-//
-// TODO(vtl): Reconsider the |MOJO_RESULT_RESOURCE_EXHAUSTED| error code; should
-// distinguish this from the hitting-system-limits case.
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoReadMessage(MojoHandle message_pipe_handle,
-                    void* bytes,            // Optional out.
-                    uint32_t* num_bytes,    // Optional in/out.
-                    MojoHandle* handles,    // Optional out.
-                    uint32_t* num_handles,  // Optional in/out.
-                    MojoReadMessageFlags flags);
-
-// Reads the next message from a message pipe and returns a message containing
-// the message bytes. The returned message must eventually be freed using
-// |MojoFreeMessage()|.
-//
-// Message payload can be accessed using |MojoGetMessageBuffer()|.
-//
-//   |message_pipe_handle|, |num_bytes|, |handles|, |num_handles|, and |flags|
-//       correspond to their use in |MojoReadMessage()| above, with the
-//       exception that |num_bytes| is only an output argument.
-//   |message| must be non-null unless |MOJO_READ_MESSAGE_FLAG_MAY_DISCARD| is
-//       set in flags.
-//
-// Return values correspond to the return values for |MojoReadMessage()| above.
-// On success (MOJO_RESULT_OK), |*message| will contain a handle to a message
-// object which may be passed to |MojoGetMessageBuffer()|. The caller owns the
-// message object and is responsible for freeing it via |MojoFreeMessage()|.
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoReadMessageNew(MojoHandle message_pipe_handle,
-                       MojoMessageHandle* message,  // Optional out.
-                       uint32_t* num_bytes,         // Optional out.
-                       MojoHandle* handles,         // Optional out.
-                       uint32_t* num_handles,       // Optional in/out.
-                       MojoReadMessageFlags flags);
-
-// Fuses two message pipe endpoints together. Given two pipes:
-//
-//     A <-> B    and    C <-> D
-//
-// Fusing handle B and handle C results in a single pipe:
-//
-//     A <-> D
-//
-// Handles B and C are ALWAYS closed. Any unread messages at C will eventually
-// be delivered to A, and any unread messages at B will eventually be delivered
-// to D.
-//
-// NOTE: A handle may only be fused if it is an open message pipe handle which
-// has not been written to.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_FAILED_PRECONDITION| if both handles were valid message pipe
-//       handles but could not be merged (e.g. one of them has been written to).
-//   |MOJO_INVALID_ARGUMENT| if either handle is not a fusable message pipe
-//       handle.
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoFuseMessagePipes(MojoHandle handle0, MojoHandle handle1);
-
-// Allocates a new message whose ownership may be passed to
-// |MojoWriteMessageNew()|. Use |MojoGetMessageBuffer()| to retrieve the address
-// of the mutable message payload.
-//
-// |num_bytes|: The size of the message payload in bytes.
-// |handles|: An array of handles to transfer in the message. This takes
-//     ownership of and invalidates all contained handles. Must be null if and
-//     only if |num_handles| is 0.
-// |num_handles|: The number of handles contained in |handles|.
-// |flags|: Must be |MOJO_CREATE_MESSAGE_FLAG_NONE|.
-// |message|: The address of a handle to be filled with the allocated message's
-//     handle. Must be non-null.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if the message was successfully allocated. In this case
-//       |*message| will be populated with a handle to an allocated message
-//       with a buffer large enough to hold |num_bytes| contiguous bytes.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if one or more handles in |handles| was
-//       invalid, or |handles| was null with a non-zero |num_handles|.
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if allocation failed because either
-//       |num_bytes| or |num_handles| exceeds an implementation-defined maximum.
-//   |MOJO_RESULT_BUSY| if one or more handles in |handles| cannot be sent at
-//       the time of this call.
-//
-// Only upon successful message allocation will all handles in |handles| be
-// transferred into the message and invalidated.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoAllocMessage(uint32_t num_bytes,
-                 const MojoHandle* handles,
-                 uint32_t num_handles,
-                 MojoAllocMessageFlags flags,
-                 MojoMessageHandle* message);  // Out
-
-// Frees a message allocated by |MojoAllocMessage()| or |MojoReadMessageNew()|.
-//
-// |message|: The message to free. This must correspond to a message previously
-//     allocated by |MojoAllocMessage()| or |MojoReadMessageNew()|. Note that if
-//     the message has already been passed to |MojoWriteMessageNew()| it should
-//     NOT also be freed with this API.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if |message| was valid and has been freed.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |message| was not a valid message.
-MOJO_SYSTEM_EXPORT MojoResult MojoFreeMessage(MojoMessageHandle message);
-
-// Retrieves the address of mutable message bytes for a message allocated by
-// either |MojoAllocMessage()| or |MojoReadMessageNew()|.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if |message| is a valid message object. |*buffer| will
-//       be updated to point to mutable message bytes.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |message| is not a valid message object.
-//
-// NOTE: A returned buffer address is always guaranteed to be 8-byte aligned.
-MOJO_SYSTEM_EXPORT MojoResult MojoGetMessageBuffer(MojoMessageHandle message,
-                                                   void** buffer);  // Out
-
-// Notifies the system that a bad message was received on a message pipe,
-// according to whatever criteria the caller chooses. This ultimately tries to
-// notify the embedder about the bad message, and the embedder may enforce some
-// policy for dealing with the source of the message (e.g. close the pipe,
-// terminate, a process, etc.) The embedder may not be notified if the calling
-// process has lost its connection to the source process.
-//
-// |message|: The message to report as bad. This must have come from a call to
-//     |MojoReadMessageNew()|.
-// |error|: An error string which may provide the embedder with context when
-//     notified of this error.
-// |error_num_bytes|: The length of |error| in bytes.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if successful.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |message| is not a valid message.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoNotifyBadMessage(MojoMessageHandle message,
-                     const char* error,
-                     size_t error_num_bytes);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_MESSAGE_PIPE_H_
diff --git a/mojo/public/c/system/platform_handle.h b/mojo/public/c/system/platform_handle.h
deleted file mode 100644
index 7449c2e..0000000
--- a/mojo/public/c/system/platform_handle.h
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains types/functions and constants for platform handle wrapping
-// and unwrapping APIs.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_PLATFORM_HANDLE_H_
-#define MOJO_PUBLIC_C_SYSTEM_PLATFORM_HANDLE_H_
-
-#include <stdint.h>
-
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// |MojoPlatformHandleType|: A value indicating the specific type of platform
-//     handle encapsulated by a MojoPlatformHandle (see below.) This is stored
-//     in the MojoPlatformHandle's |type| field and determines how the |value|
-//     field is interpreted.
-//
-//   |MOJO_PLATFORM_HANDLE_TYPE_INVALID| - An invalid platform handle.
-//   |MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR| - A file descriptor. Only valid
-//       on POSIX systems.
-//   |MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT| - A Mach port. Only valid on OS X.
-//   |MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE| - A Windows HANDLE value. Only
-//       valid on Windows.
-
-typedef uint32_t MojoPlatformHandleType;
-
-#ifdef __cplusplus
-const MojoPlatformHandleType MOJO_PLATFORM_HANDLE_TYPE_INVALID = 0;
-const MojoPlatformHandleType MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR = 1;
-const MojoPlatformHandleType MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT = 2;
-const MojoPlatformHandleType MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE = 3;
-#else
-#define MOJO_PLATFORM_HANDLE_TYPE_INVALID ((MojoPlatformHandleType)0)
-#define MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR ((MojoPlatformHandleType)1)
-#define MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT ((MojoPlatformHandleType)2)
-#define MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE ((MojoPlatformHandleType)3)
-#endif
-
-// |MojoPlatformHandle|: A handle to a native platform object.
-//
-//     |uint32_t struct_size|: The size of this structure. Used for versioning
-//         to allow for future extensions.
-//
-//     |MojoPlatformHandleType type|: The type of handle stored in |value|.
-//
-//     |uint64_t value|: The value of this handle. Ignored if |type| is
-//         MOJO_PLATFORM_HANDLE_TYPE_INVALID. Otherwise the meaning of this
-//         value depends on the value of |type|.
-//
-
-struct MOJO_ALIGNAS(8) MojoPlatformHandle {
-  uint32_t struct_size;
-  MojoPlatformHandleType type;
-  uint64_t value;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoPlatformHandle) == 16,
-                   "MojoPlatformHandle has wrong size");
-
-// |MojoPlatformSharedBufferHandleFlags|: Flags relevant to wrapped platform
-//     shared buffers.
-//
-//   |MOJO_PLATFORM_SHARED_BUFFER_HANDLE_NONE| - No flags.
-//   |MOJO_PLATFORM_SHARED_BUFFER_HANDLE_READ_ONLY| - Indicates that the wrapped
-//       buffer handle may only be mapped for reading.
-
-typedef uint32_t MojoPlatformSharedBufferHandleFlags;
-
-#ifdef __cplusplus
-const MojoPlatformSharedBufferHandleFlags
-MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE = 0;
-
-const MojoPlatformSharedBufferHandleFlags
-MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY = 1 << 0;
-#else
-#define MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE \
-    ((MojoPlatformSharedBufferHandleFlags)0)
-
-#define MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY \
-    ((MojoPlatformSharedBufferHandleFlags)1 << 0)
-#endif
-
-// Wraps a native platform handle as a Mojo handle which can be transferred
-// over a message pipe. Takes ownership of the underlying native platform
-// object.
-//
-// |platform_handle|: The platform handle to wrap.
-//
-// Returns:
-//     |MOJO_RESULT_OK| if the handle was successfully wrapped. In this case
-//         |*mojo_handle| contains the Mojo handle of the wrapped object.
-//     |MOJO_RESULT_RESOURCE_EXHAUSTED| if the system is out of handles.
-//     |MOJO_RESULT_INVALID_ARGUMENT| if |platform_handle| was not a valid
-//          platform handle.
-//
-// NOTE: It is not always possible to detect if |platform_handle| is valid,
-// particularly when |platform_handle->type| is valid but
-// |platform_handle->value| does not represent a valid platform object.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoWrapPlatformHandle(const struct MojoPlatformHandle* platform_handle,
-                       MojoHandle* mojo_handle);  // Out
-
-// Unwraps a native platform handle from a Mojo handle. If this call succeeds,
-// ownership of the underlying platform object is assumed by the caller. The
-// The Mojo handle is always closed regardless of success or failure.
-//
-// |mojo_handle|: The Mojo handle from which to unwrap the native platform
-//     handle.
-//
-// Returns:
-//     |MOJO_RESULT_OK| if the handle was successfully unwrapped. In this case
-//         |*platform_handle| contains the unwrapped platform handle.
-//     |MOJO_RESULT_INVALID_ARGUMENT| if |mojo_handle| was not a valid Mojo
-//         handle wrapping a platform handle.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoUnwrapPlatformHandle(MojoHandle mojo_handle,
-                         struct MojoPlatformHandle* platform_handle);  // Out
-
-// Wraps a native platform shared buffer handle as a Mojo shared buffer handle
-// which can be used exactly like a shared buffer handle created by
-// |MojoCreateSharedBuffer()| or |MojoDuplicateBufferHandle()|.
-//
-// Takes ownership of the native platform shared buffer handle.
-//
-// |platform_handle|: The platform handle to wrap. Must be a native handle to a
-//     shared buffer object.
-// |num_bytes|: The size of the shared buffer in bytes.
-// |flags|: Flags which influence the treatment of the shared buffer object. See
-//     below.
-//
-// Flags:
-//    |MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE| indicates default behavior.
-//        No flags set.
-//    |MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY| indicates that the
-//        buffer handled to be wrapped may only be mapped as read-only. This
-//        flag does NOT change the access control of the buffer in any way.
-//
-// Returns:
-//     |MOJO_RESULT_OK| if the handle was successfully wrapped. In this case
-//         |*mojo_handle| contains a Mojo shared buffer handle.
-//     |MOJO_RESULT_INVALID_ARGUMENT| if |platform_handle| was not a valid
-//         platform shared buffer handle.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoWrapPlatformSharedBufferHandle(
-    const struct MojoPlatformHandle* platform_handle,
-    size_t num_bytes,
-    MojoPlatformSharedBufferHandleFlags flags,
-    MojoHandle* mojo_handle);  // Out
-
-// Unwraps a native platform shared buffer handle from a Mojo shared buffer
-// handle. If this call succeeds, ownership of the underlying shared buffer
-// object is assumed by the caller.
-//
-// The Mojo handle is always closed regardless of success or failure.
-//
-// |mojo_handle|: The Mojo shared buffer handle to unwrap.
-//
-// |platform_handle|, |num_bytes| and |flags| are used to receive output values
-// and MUST always be non-null.
-//
-// Returns:
-//    |MOJO_RESULT_OK| if the handle was successfully unwrapped. In this case
-//        |*platform_handle| contains a platform shared buffer handle,
-//        |*num_bytes| contains the size of the shared buffer object, and
-//        |*flags| indicates flags relevant to the wrapped buffer (see below).
-//    |MOJO_RESULT_INVALID_ARGUMENT| if |mojo_handle| is not a valid Mojo
-//        shared buffer handle.
-//
-// Flags which may be set in |*flags| upon success:
-//    |MOJO_PLATFORM_SHARED_BUFFER_FLAG_READ_ONLY| is set iff the unwrapped
-//        shared buffer handle may only be mapped as read-only.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoUnwrapPlatformSharedBufferHandle(
-    MojoHandle mojo_handle,
-    struct MojoPlatformHandle* platform_handle,
-    size_t* num_bytes,
-    MojoPlatformSharedBufferHandleFlags* flags);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_PLATFORM_HANDLE_H_
diff --git a/mojo/public/c/system/set_thunks_for_app.cc b/mojo/public/c/system/set_thunks_for_app.cc
deleted file mode 100644
index 335cc02..0000000
--- a/mojo/public/c/system/set_thunks_for_app.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/c/system/thunks.h"
-
-extern "C" {
-
-#if defined(WIN32)
-#define THUNKS_EXPORT __declspec(dllexport)
-#else
-#define THUNKS_EXPORT __attribute__((visibility("default")))
-#endif
-
-THUNKS_EXPORT size_t MojoSetSystemThunks(
-    const MojoSystemThunks* system_thunks) {
-  return MojoEmbedderSetSystemThunks(system_thunks);
-}
-
-}  // extern "C"
diff --git a/mojo/public/c/system/system_export.h b/mojo/public/c/system/system_export.h
deleted file mode 100644
index 775f667..0000000
--- a/mojo/public/c/system/system_export.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_SYSTEM_EXPORT_H_
-#define MOJO_PUBLIC_C_SYSTEM_SYSTEM_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(MOJO_SYSTEM_IMPLEMENTATION)
-#define MOJO_SYSTEM_EXPORT __declspec(dllexport)
-#else
-#define MOJO_SYSTEM_EXPORT __declspec(dllimport)
-#endif
-
-#else  // !defined(WIN32)
-
-#if defined(MOJO_SYSTEM_IMPLEMENTATION)
-#define MOJO_SYSTEM_EXPORT __attribute__((visibility("default")))
-#else
-#define MOJO_SYSTEM_EXPORT
-#endif
-
-#endif  // defined(WIN32)
-
-#else  // !defined(COMPONENT_BUILD)
-
-#define MOJO_SYSTEM_EXPORT
-
-#endif  // defined(COMPONENT_BUILD)
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_SYSTEM_EXPORT_H_
diff --git a/mojo/public/c/system/tests/BUILD.gn b/mojo/public/c/system/tests/BUILD.gn
deleted file mode 100644
index bace63c..0000000
--- a/mojo/public/c/system/tests/BUILD.gn
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("tests") {
-  testonly = true
-
-  visibility = [
-    "//mojo/public/cpp/system/tests:mojo_public_system_unittests",
-    "//mojo/public/cpp/system/tests:tests",
-  ]
-
-  sources = [
-    "core_unittest.cc",
-    "core_unittest_pure_c.c",
-    "macros_unittest.cc",
-  ]
-
-  deps = [
-    "//mojo/public/c/system",
-    "//mojo/public/cpp/system",
-    "//testing/gtest",
-  ]
-}
-
-source_set("perftests") {
-  testonly = true
-
-  sources = [
-    "core_perftest.cc",
-  ]
-
-  deps = [
-    "//mojo/public/cpp/system",
-    "//mojo/public/cpp/test_support:test_utils",
-    "//testing/gtest",
-  ]
-}
diff --git a/mojo/public/c/system/tests/core_perftest.cc b/mojo/public/c/system/tests/core_perftest.cc
deleted file mode 100644
index cab465b..0000000
--- a/mojo/public/c/system/tests/core_perftest.cc
+++ /dev/null
@@ -1,329 +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 tests the performance of the C API.
-
-#include "mojo/public/c/system/core.h"
-
-#include <assert.h>
-#include <stdint.h>
-#include <stdio.h>
-
-#include "base/macros.h"
-#include "base/threading/simple_thread.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "mojo/public/cpp/test_support/test_support.h"
-#include "mojo/public/cpp/test_support/test_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if !defined(WIN32)
-#include <time.h>
-#endif  // !defined(WIN32)
-
-namespace {
-
-#if !defined(WIN32)
-class MessagePipeWriterThread : public base::SimpleThread {
- public:
-  MessagePipeWriterThread(MojoHandle handle, uint32_t num_bytes)
-      : SimpleThread("MessagePipeWriterThread"),
-        handle_(handle),
-        num_bytes_(num_bytes),
-        num_writes_(0) {}
-  ~MessagePipeWriterThread() override {}
-
-  void Run() override {
-    char buffer[10000];
-    assert(num_bytes_ <= sizeof(buffer));
-
-    // TODO(vtl): Should I throttle somehow?
-    for (;;) {
-      MojoResult result = MojoWriteMessage(handle_, buffer, num_bytes_, nullptr,
-                                           0, MOJO_WRITE_MESSAGE_FLAG_NONE);
-      if (result == MOJO_RESULT_OK) {
-        num_writes_++;
-        continue;
-      }
-
-      // We failed to write.
-      // Either |handle_| or its peer was closed.
-      assert(result == MOJO_RESULT_INVALID_ARGUMENT ||
-             result == MOJO_RESULT_FAILED_PRECONDITION);
-      break;
-    }
-  }
-
-  // Use only after joining the thread.
-  int64_t num_writes() const { return num_writes_; }
-
- private:
-  const MojoHandle handle_;
-  const uint32_t num_bytes_;
-  int64_t num_writes_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessagePipeWriterThread);
-};
-
-class MessagePipeReaderThread : public base::SimpleThread {
- public:
-  explicit MessagePipeReaderThread(MojoHandle handle)
-      : SimpleThread("MessagePipeReaderThread"),
-        handle_(handle),
-        num_reads_(0) {}
-  ~MessagePipeReaderThread() override {}
-
-  void Run() override {
-    char buffer[10000];
-
-    for (;;) {
-      uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer));
-      MojoResult result = MojoReadMessage(handle_, buffer, &num_bytes, nullptr,
-                                          nullptr, MOJO_READ_MESSAGE_FLAG_NONE);
-      if (result == MOJO_RESULT_OK) {
-        num_reads_++;
-        continue;
-      }
-
-      if (result == MOJO_RESULT_SHOULD_WAIT) {
-        result = mojo::Wait(mojo::Handle(handle_), MOJO_HANDLE_SIGNAL_READABLE);
-        if (result == MOJO_RESULT_OK) {
-          // Go to the top of the loop to read again.
-          continue;
-        }
-      }
-
-      // We failed to read and possibly failed to wait.
-      // Either |handle_| or its peer was closed.
-      assert(result == MOJO_RESULT_INVALID_ARGUMENT ||
-             result == MOJO_RESULT_FAILED_PRECONDITION);
-      break;
-    }
-  }
-
-  // Use only after joining the thread.
-  int64_t num_reads() const { return num_reads_; }
-
- private:
-  const MojoHandle handle_;
-  int64_t num_reads_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessagePipeReaderThread);
-};
-#endif  // !defined(WIN32)
-
-class CorePerftest : public testing::Test {
- public:
-  CorePerftest() : buffer_(nullptr), num_bytes_(0) {}
-  ~CorePerftest() override {}
-
-  static void NoOp(void* /*closure*/) {}
-
-  static void MessagePipe_CreateAndClose(void* closure) {
-    CorePerftest* self = static_cast<CorePerftest*>(closure);
-    MojoResult result = MojoCreateMessagePipe(nullptr, &self->h0_, &self->h1_);
-    ALLOW_UNUSED_LOCAL(result);
-    assert(result == MOJO_RESULT_OK);
-    result = MojoClose(self->h0_);
-    assert(result == MOJO_RESULT_OK);
-    result = MojoClose(self->h1_);
-    assert(result == MOJO_RESULT_OK);
-  }
-
-  static void MessagePipe_WriteAndRead(void* closure) {
-    CorePerftest* self = static_cast<CorePerftest*>(closure);
-    MojoResult result =
-        MojoWriteMessage(self->h0_, self->buffer_, self->num_bytes_, nullptr, 0,
-                         MOJO_WRITE_MESSAGE_FLAG_NONE);
-    ALLOW_UNUSED_LOCAL(result);
-    assert(result == MOJO_RESULT_OK);
-    uint32_t read_bytes = self->num_bytes_;
-    result = MojoReadMessage(self->h1_, self->buffer_, &read_bytes, nullptr,
-                             nullptr, MOJO_READ_MESSAGE_FLAG_NONE);
-    assert(result == MOJO_RESULT_OK);
-  }
-
-  static void MessagePipe_EmptyRead(void* closure) {
-    CorePerftest* self = static_cast<CorePerftest*>(closure);
-    MojoResult result =
-        MojoReadMessage(self->h0_, nullptr, nullptr, nullptr, nullptr,
-                        MOJO_READ_MESSAGE_FLAG_MAY_DISCARD);
-    ALLOW_UNUSED_LOCAL(result);
-    assert(result == MOJO_RESULT_SHOULD_WAIT);
-  }
-
- protected:
-#if !defined(WIN32)
-  void DoMessagePipeThreadedTest(unsigned num_writers,
-                                 unsigned num_readers,
-                                 uint32_t num_bytes) {
-    static const int64_t kPerftestTimeMicroseconds = 3 * 1000000;
-
-    assert(num_writers > 0);
-    assert(num_readers > 0);
-
-    MojoResult result = MojoCreateMessagePipe(nullptr, &h0_, &h1_);
-    ALLOW_UNUSED_LOCAL(result);
-    assert(result == MOJO_RESULT_OK);
-
-    std::vector<MessagePipeWriterThread*> writers;
-    for (unsigned i = 0; i < num_writers; i++)
-      writers.push_back(new MessagePipeWriterThread(h0_, num_bytes));
-
-    std::vector<MessagePipeReaderThread*> readers;
-    for (unsigned i = 0; i < num_readers; i++)
-      readers.push_back(new MessagePipeReaderThread(h1_));
-
-    // Start time here, just before we fire off the threads.
-    const MojoTimeTicks start_time = MojoGetTimeTicksNow();
-
-    // Interleave the starts.
-    for (unsigned i = 0; i < num_writers || i < num_readers; i++) {
-      if (i < num_writers)
-        writers[i]->Start();
-      if (i < num_readers)
-        readers[i]->Start();
-    }
-
-    Sleep(kPerftestTimeMicroseconds);
-
-    // Close both handles to make writers and readers stop immediately.
-    result = MojoClose(h0_);
-    assert(result == MOJO_RESULT_OK);
-    result = MojoClose(h1_);
-    assert(result == MOJO_RESULT_OK);
-
-    // Join everything.
-    for (unsigned i = 0; i < num_writers; i++)
-      writers[i]->Join();
-    for (unsigned i = 0; i < num_readers; i++)
-      readers[i]->Join();
-
-    // Stop time here.
-    MojoTimeTicks end_time = MojoGetTimeTicksNow();
-
-    // Add up write and read counts, and destroy the threads.
-    int64_t num_writes = 0;
-    for (unsigned i = 0; i < num_writers; i++) {
-      num_writes += writers[i]->num_writes();
-      delete writers[i];
-    }
-    writers.clear();
-    int64_t num_reads = 0;
-    for (unsigned i = 0; i < num_readers; i++) {
-      num_reads += readers[i]->num_reads();
-      delete readers[i];
-    }
-    readers.clear();
-
-    char sub_test_name[200];
-    sprintf(sub_test_name, "%uw_%ur_%ubytes", num_writers, num_readers,
-            static_cast<unsigned>(num_bytes));
-    mojo::test::LogPerfResult(
-        "MessagePipe_Threaded_Writes", sub_test_name,
-        1000000.0 * static_cast<double>(num_writes) / (end_time - start_time),
-        "writes/second");
-    mojo::test::LogPerfResult(
-        "MessagePipe_Threaded_Reads", sub_test_name,
-        1000000.0 * static_cast<double>(num_reads) / (end_time - start_time),
-        "reads/second");
-  }
-#endif  // !defined(WIN32)
-
-  MojoHandle h0_;
-  MojoHandle h1_;
-
-  void* buffer_;
-  uint32_t num_bytes_;
-
- private:
-#if !defined(WIN32)
-  void Sleep(int64_t microseconds) {
-    struct timespec req = {
-        static_cast<time_t>(microseconds / 1000000),       // Seconds.
-        static_cast<long>(microseconds % 1000000) * 1000L  // Nanoseconds.
-    };
-    int rv = nanosleep(&req, nullptr);
-    ALLOW_UNUSED_LOCAL(rv);
-    assert(rv == 0);
-  }
-#endif  // !defined(WIN32)
-
-  DISALLOW_COPY_AND_ASSIGN(CorePerftest);
-};
-
-// A no-op test so we can compare performance.
-TEST_F(CorePerftest, NoOp) {
-  mojo::test::IterateAndReportPerf("Iterate_NoOp", nullptr, &CorePerftest::NoOp,
-                                   this);
-}
-
-TEST_F(CorePerftest, MessagePipe_CreateAndClose) {
-  mojo::test::IterateAndReportPerf("MessagePipe_CreateAndClose", nullptr,
-                                   &CorePerftest::MessagePipe_CreateAndClose,
-                                   this);
-}
-
-TEST_F(CorePerftest, MessagePipe_WriteAndRead) {
-  MojoResult result = MojoCreateMessagePipe(nullptr, &h0_, &h1_);
-  ALLOW_UNUSED_LOCAL(result);
-  assert(result == MOJO_RESULT_OK);
-  char buffer[10000] = {0};
-  buffer_ = buffer;
-  num_bytes_ = 10u;
-  mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "10bytes",
-                                   &CorePerftest::MessagePipe_WriteAndRead,
-                                   this);
-  num_bytes_ = 100u;
-  mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "100bytes",
-                                   &CorePerftest::MessagePipe_WriteAndRead,
-                                   this);
-  num_bytes_ = 1000u;
-  mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "1000bytes",
-                                   &CorePerftest::MessagePipe_WriteAndRead,
-                                   this);
-  num_bytes_ = 10000u;
-  mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "10000bytes",
-                                   &CorePerftest::MessagePipe_WriteAndRead,
-                                   this);
-  result = MojoClose(h0_);
-  assert(result == MOJO_RESULT_OK);
-  result = MojoClose(h1_);
-  assert(result == MOJO_RESULT_OK);
-}
-
-TEST_F(CorePerftest, MessagePipe_EmptyRead) {
-  MojoResult result = MojoCreateMessagePipe(nullptr, &h0_, &h1_);
-  ALLOW_UNUSED_LOCAL(result);
-  assert(result == MOJO_RESULT_OK);
-  mojo::test::IterateAndReportPerf("MessagePipe_EmptyRead", nullptr,
-                                   &CorePerftest::MessagePipe_EmptyRead, this);
-  result = MojoClose(h0_);
-  assert(result == MOJO_RESULT_OK);
-  result = MojoClose(h1_);
-  assert(result == MOJO_RESULT_OK);
-}
-
-#if !defined(WIN32)
-TEST_F(CorePerftest, MessagePipe_Threaded) {
-  DoMessagePipeThreadedTest(1u, 1u, 100u);
-  DoMessagePipeThreadedTest(2u, 2u, 100u);
-  DoMessagePipeThreadedTest(3u, 3u, 100u);
-  DoMessagePipeThreadedTest(10u, 10u, 100u);
-  DoMessagePipeThreadedTest(10u, 1u, 100u);
-  DoMessagePipeThreadedTest(1u, 10u, 100u);
-
-  // For comparison of overhead:
-  DoMessagePipeThreadedTest(1u, 1u, 10u);
-  // 100 was done above.
-  DoMessagePipeThreadedTest(1u, 1u, 1000u);
-  DoMessagePipeThreadedTest(1u, 1u, 10000u);
-
-  DoMessagePipeThreadedTest(3u, 3u, 10u);
-  // 100 was done above.
-  DoMessagePipeThreadedTest(3u, 3u, 1000u);
-  DoMessagePipeThreadedTest(3u, 3u, 10000u);
-}
-#endif  // !defined(WIN32)
-
-}  // namespace
diff --git a/mojo/public/c/system/tests/core_unittest.cc b/mojo/public/c/system/tests/core_unittest.cc
deleted file mode 100644
index a9da255..0000000
--- a/mojo/public/c/system/tests/core_unittest.cc
+++ /dev/null
@@ -1,322 +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 file tests the C API.
-
-#include "mojo/public/c/system/core.h"
-
-#include <stdint.h>
-#include <string.h>
-
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-const MojoHandleSignals kSignalReadadableWritable =
-    MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE;
-
-const MojoHandleSignals kSignalAll = MOJO_HANDLE_SIGNAL_READABLE |
-                                     MOJO_HANDLE_SIGNAL_WRITABLE |
-                                     MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-
-TEST(CoreTest, GetTimeTicksNow) {
-  const MojoTimeTicks start = MojoGetTimeTicksNow();
-  EXPECT_NE(static_cast<MojoTimeTicks>(0), start)
-      << "MojoGetTimeTicksNow should return nonzero value";
-}
-
-// The only handle that's guaranteed to be invalid is |MOJO_HANDLE_INVALID|.
-// Tests that everything that takes a handle properly recognizes it.
-TEST(CoreTest, InvalidHandle) {
-  MojoHandle h0, h1;
-  char buffer[10] = {0};
-  uint32_t buffer_size;
-  void* write_pointer;
-  const void* read_pointer;
-
-  // Close:
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(MOJO_HANDLE_INVALID));
-
-  // Message pipe:
-  h0 = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoWriteMessage(h0, buffer, 3, nullptr, 0,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-  buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-
-  // Data pipe:
-  buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoWriteData(h0, buffer, &buffer_size, MOJO_WRITE_DATA_FLAG_NONE));
-  write_pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoBeginWriteData(h0, &write_pointer, &buffer_size,
-                               MOJO_WRITE_DATA_FLAG_NONE));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoEndWriteData(h0, 1));
-  buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoReadData(h0, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE));
-  read_pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoBeginReadData(h0, &read_pointer, &buffer_size,
-                              MOJO_READ_DATA_FLAG_NONE));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoEndReadData(h0, 1));
-
-  // Shared buffer:
-  h1 = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoDuplicateBufferHandle(h0, nullptr, &h1));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoMapBuffer(h0, 0, 1, &write_pointer, MOJO_MAP_BUFFER_FLAG_NONE));
-}
-
-TEST(CoreTest, BasicMessagePipe) {
-  MojoHandle h0, h1;
-  MojoHandleSignals sig;
-  char buffer[10] = {0};
-  uint32_t buffer_size;
-
-  h0 = MOJO_HANDLE_INVALID;
-  h1 = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &h0, &h1));
-  EXPECT_NE(h0, MOJO_HANDLE_INVALID);
-  EXPECT_NE(h1, MOJO_HANDLE_INVALID);
-
-  // Shouldn't be readable, we haven't written anything. Should be writable.
-  MojoHandleSignalsState state;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(h0, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-  EXPECT_EQ(kSignalAll, state.satisfiable_signals);
-
-  // Try to read.
-  buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-
-  // Write to |h1|.
-  static const char kHello[] = "hello";
-  buffer_size = static_cast<uint32_t>(sizeof(kHello));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(h1, kHello, buffer_size, nullptr,
-                                             0, MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // |h0| should be readable.
-  size_t result_index = 1;
-  MojoHandleSignalsState states[1];
-  sig = MOJO_HANDLE_SIGNAL_READABLE;
-  Handle handle0(h0);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            mojo::WaitMany(&handle0, &sig, 1, &result_index, states));
-
-  EXPECT_EQ(0u, result_index);
-  EXPECT_EQ(kSignalReadadableWritable, states[0].satisfied_signals);
-  EXPECT_EQ(kSignalAll, states[0].satisfiable_signals);
-
-  // Read from |h0|.
-  buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-  EXPECT_EQ(static_cast<uint32_t>(sizeof(kHello)), buffer_size);
-  EXPECT_STREQ(kHello, buffer);
-
-  // |h0| should no longer be readable.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(h0, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-  EXPECT_EQ(kSignalAll, state.satisfiable_signals);
-
-  // Close |h0|.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0));
-
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h1),
-                                       MOJO_HANDLE_SIGNAL_PEER_CLOSED, &state));
-
-  // |h1| should no longer be readable or writable.
-  EXPECT_EQ(
-      MOJO_RESULT_FAILED_PRECONDITION,
-      mojo::Wait(mojo::Handle(h1),
-                 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-                 &state));
-
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1));
-}
-
-TEST(CoreTest, BasicDataPipe) {
-  MojoHandle hp, hc;
-  MojoHandleSignals sig;
-  char buffer[20] = {0};
-  uint32_t buffer_size;
-  void* write_pointer;
-  const void* read_pointer;
-
-  hp = MOJO_HANDLE_INVALID;
-  hc = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &hp, &hc));
-  EXPECT_NE(hp, MOJO_HANDLE_INVALID);
-  EXPECT_NE(hc, MOJO_HANDLE_INVALID);
-
-  // The consumer |hc| shouldn't be readable.
-  MojoHandleSignalsState state;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(hc, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            state.satisfiable_signals);
-
-  // The producer |hp| should be writable.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(hp, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfiable_signals);
-
-  // Try to read from |hc|.
-  buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE));
-
-  // Try to begin a two-phase read from |hc|.
-  read_pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            MojoBeginReadData(hc, &read_pointer, &buffer_size,
-                              MOJO_READ_DATA_FLAG_NONE));
-
-  // Write to |hp|.
-  static const char kHello[] = "hello ";
-  // Don't include terminating null.
-  buffer_size = static_cast<uint32_t>(strlen(kHello));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(hp, kHello, &buffer_size,
-                                          MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // |hc| should be(come) readable.
-  size_t result_index = 1;
-  MojoHandleSignalsState states[1];
-  sig = MOJO_HANDLE_SIGNAL_READABLE;
-  Handle consumer_handle(hc);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            mojo::WaitMany(&consumer_handle, &sig, 1, &result_index, states));
-
-  EXPECT_EQ(0u, result_index);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            states[0].satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            states[0].satisfiable_signals);
-
-  // Do a two-phase write to |hp|.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoBeginWriteData(hp, &write_pointer, &buffer_size,
-                                               MOJO_WRITE_DATA_FLAG_NONE));
-  static const char kWorld[] = "world";
-  ASSERT_GE(buffer_size, sizeof(kWorld));
-  // Include the terminating null.
-  memcpy(write_pointer, kWorld, sizeof(kWorld));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoEndWriteData(hp, static_cast<uint32_t>(sizeof(kWorld))));
-
-  // Read one character from |hc|.
-  memset(buffer, 0, sizeof(buffer));
-  buffer_size = 1;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE));
-
-  // Close |hp|.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hp));
-
-  // |hc| should still be readable.
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(hc),
-                                       MOJO_HANDLE_SIGNAL_PEER_CLOSED, &state));
-
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfiable_signals);
-
-  // Do a two-phase read from |hc|.
-  read_pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoBeginReadData(hc, &read_pointer, &buffer_size,
-                                              MOJO_READ_DATA_FLAG_NONE));
-  ASSERT_LE(buffer_size, sizeof(buffer) - 1);
-  memcpy(&buffer[1], read_pointer, buffer_size);
-  EXPECT_EQ(MOJO_RESULT_OK, MojoEndReadData(hc, buffer_size));
-  EXPECT_STREQ("hello world", buffer);
-
-  // |hc| should no longer be readable.
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            mojo::Wait(mojo::Handle(hc), MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hc));
-
-  // TODO(vtl): Test the other way around -- closing the consumer should make
-  // the producer never-writable?
-}
-
-TEST(CoreTest, BasicSharedBuffer) {
-  MojoHandle h0, h1;
-  void* pointer;
-
-  // Create a shared buffer (|h0|).
-  h0 = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(nullptr, 100, &h0));
-  EXPECT_NE(h0, MOJO_HANDLE_INVALID);
-
-  // Map everything.
-  pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(h0, 0, 100, &pointer, MOJO_MAP_BUFFER_FLAG_NONE));
-  ASSERT_TRUE(pointer);
-  static_cast<char*>(pointer)[50] = 'x';
-
-  // Duplicate |h0| to |h1|.
-  h1 = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(h0, nullptr, &h1));
-  EXPECT_NE(h1, MOJO_HANDLE_INVALID);
-
-  // Close |h0|.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0));
-
-  // The mapping should still be good.
-  static_cast<char*>(pointer)[51] = 'y';
-
-  // Unmap it.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(pointer));
-
-  // Map half of |h1|.
-  pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(h1, 50, 50, &pointer, MOJO_MAP_BUFFER_FLAG_NONE));
-  ASSERT_TRUE(pointer);
-
-  // It should have what we wrote.
-  EXPECT_EQ('x', static_cast<char*>(pointer)[0]);
-  EXPECT_EQ('y', static_cast<char*>(pointer)[1]);
-
-  // Unmap it.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(pointer));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1));
-}
-
-// Defined in core_unittest_pure_c.c.
-extern "C" const char* MinimalCTest(void);
-
-// This checks that things actually work in C (not C++).
-TEST(CoreTest, MinimalCTest) {
-  const char* failure = MinimalCTest();
-  EXPECT_FALSE(failure) << failure;
-}
-
-// TODO(vtl): Add multi-threaded tests.
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/c/system/tests/core_unittest_pure_c.c b/mojo/public/c/system/tests/core_unittest_pure_c.c
deleted file mode 100644
index 3164649..0000000
--- a/mojo/public/c/system/tests/core_unittest_pure_c.c
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef __cplusplus
-#error "This file should be compiled as C, not C++."
-#endif
-
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-
-// Include all the header files that are meant to be compilable as C. Start with
-// core.h, since it's the most important one.
-#include "mojo/public/c/system/core.h"
-#include "mojo/public/c/system/macros.h"
-
-// The joys of the C preprocessor....
-#define STRINGIFY(x) #x
-#define STRINGIFY2(x) STRINGIFY(x)
-#define FAILURE(message) \
-  __FILE__ "(" STRINGIFY2(__LINE__) "): Failure: " message
-
-// Makeshift gtest.
-#define EXPECT_EQ(a, b)                                                  \
-  do {                                                                   \
-    if ((a) != (b))                                                      \
-      return FAILURE(STRINGIFY(a) " != " STRINGIFY(b) " (expected ==)"); \
-  } while (0)
-#define EXPECT_NE(a, b)                                                  \
-  do {                                                                   \
-    if ((a) == (b))                                                      \
-      return FAILURE(STRINGIFY(a) " == " STRINGIFY(b) " (expected !=)"); \
-  } while (0)
-
-// This function exists mainly to be compiled and linked. We do some cursory
-// checks and call it from a unit test, to make sure that link problems aren't
-// missed due to deadstripping. Returns null on success and a string on failure
-// (describing the failure).
-const char* MinimalCTest(void) {
-  // MSVS before 2013 *really* only supports C90: All variables must be declared
-  // at the top. (MSVS 2013 is more reasonable.)
-  MojoTimeTicks ticks;
-  MojoHandle handle0, handle1;
-  const char kHello[] = "hello";
-  char buffer[200] = {0};
-  uint32_t num_bytes;
-
-  ticks = MojoGetTimeTicksNow();
-  EXPECT_NE(ticks, 0);
-
-  handle0 = MOJO_HANDLE_INVALID;
-  EXPECT_NE(MOJO_RESULT_OK, MojoClose(handle0));
-
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoQueryHandleSignalsState(handle0, NULL));
-
-  handle1 = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(NULL, &handle0, &handle1));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(handle0, kHello, (uint32_t)sizeof(kHello), NULL,
-                             0u, MOJO_WRITE_DATA_FLAG_NONE));
-
-  num_bytes = (uint32_t)sizeof(buffer);
-  EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(handle1, buffer, &num_bytes, NULL,
-                                            NULL, MOJO_READ_MESSAGE_FLAG_NONE));
-  EXPECT_EQ((uint32_t)sizeof(kHello), num_bytes);
-  EXPECT_EQ(0, memcmp(buffer, kHello, sizeof(kHello)));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(handle0));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(handle1));
-
-  // TODO(vtl): data pipe
-
-  return NULL;
-}
diff --git a/mojo/public/c/system/tests/macros_unittest.cc b/mojo/public/c/system/tests/macros_unittest.cc
deleted file mode 100644
index fb9ff76..0000000
--- a/mojo/public/c/system/tests/macros_unittest.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file tests the C Mojo system macros and consists of "positive" tests,
-// i.e., those verifying that things work (without compile errors, or even
-// warnings if warnings are treated as errors).
-// TODO(vtl): Fix no-compile tests (which are all disabled; crbug.com/105388)
-// and write some "negative" tests.
-
-#include "mojo/public/c/system/macros.h"
-
-#include <assert.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-// First test |MOJO_STATIC_ASSERT()| in a global scope.
-MOJO_STATIC_ASSERT(sizeof(int64_t) == 2 * sizeof(int32_t),
-                   "Bad static_assert() failure in global scope");
-
-TEST(MacrosTest, CompileAssert) {
-  // Then in a local scope.
-  MOJO_STATIC_ASSERT(sizeof(int32_t) == 2 * sizeof(int16_t),
-                     "Bad static_assert() failure");
-}
-
-TEST(MacrosTest, Alignof) {
-  // Strictly speaking, this isn't a portable test, but I think it'll pass on
-  // all the platforms we currently support.
-  EXPECT_EQ(1u, MOJO_ALIGNOF(char));
-  EXPECT_EQ(4u, MOJO_ALIGNOF(int32_t));
-  EXPECT_EQ(8u, MOJO_ALIGNOF(int64_t));
-  EXPECT_EQ(8u, MOJO_ALIGNOF(double));
-}
-
-// These structs are used in the Alignas test. Define them globally to avoid
-// MSVS warnings/errors.
-#if defined(_MSC_VER)
-#pragma warning(push)
-// Disable the warning "structure was padded due to __declspec(align())".
-#pragma warning(disable : 4324)
-#endif
-struct MOJO_ALIGNAS(1) StructAlignas1 {
-  char x;
-};
-struct MOJO_ALIGNAS(4) StructAlignas4 {
-  char x;
-};
-struct MOJO_ALIGNAS(8) StructAlignas8 {
-  char x;
-};
-#if defined(_MSC_VER)
-#pragma warning(pop)
-#endif
-
-TEST(MacrosTest, Alignas) {
-  EXPECT_EQ(1u, MOJO_ALIGNOF(StructAlignas1));
-  EXPECT_EQ(4u, MOJO_ALIGNOF(StructAlignas4));
-  EXPECT_EQ(8u, MOJO_ALIGNOF(StructAlignas8));
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/c/system/thunks.cc b/mojo/public/c/system/thunks.cc
deleted file mode 100644
index 67c568f..0000000
--- a/mojo/public/c/system/thunks.cc
+++ /dev/null
@@ -1,273 +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.
-
-#include "mojo/public/c/system/thunks.h"
-
-#include <assert.h>
-#include <stddef.h>
-#include <stdint.h>
-
-extern "C" {
-
-static MojoSystemThunks g_thunks = {0};
-
-MojoTimeTicks MojoGetTimeTicksNow() {
-  assert(g_thunks.GetTimeTicksNow);
-  return g_thunks.GetTimeTicksNow();
-}
-
-MojoResult MojoClose(MojoHandle handle) {
-  assert(g_thunks.Close);
-  return g_thunks.Close(handle);
-}
-
-MojoResult MojoQueryHandleSignalsState(
-    MojoHandle handle,
-    struct MojoHandleSignalsState* signals_state) {
-  assert(g_thunks.QueryHandleSignalsState);
-  return g_thunks.QueryHandleSignalsState(handle, signals_state);
-}
-
-MojoResult MojoCreateMessagePipe(const MojoCreateMessagePipeOptions* options,
-                                 MojoHandle* message_pipe_handle0,
-                                 MojoHandle* message_pipe_handle1) {
-  assert(g_thunks.CreateMessagePipe);
-  return g_thunks.CreateMessagePipe(options, message_pipe_handle0,
-                                    message_pipe_handle1);
-}
-
-MojoResult MojoWriteMessage(MojoHandle message_pipe_handle,
-                            const void* bytes,
-                            uint32_t num_bytes,
-                            const MojoHandle* handles,
-                            uint32_t num_handles,
-                            MojoWriteMessageFlags flags) {
-  assert(g_thunks.WriteMessage);
-  return g_thunks.WriteMessage(message_pipe_handle, bytes, num_bytes, handles,
-                               num_handles, flags);
-}
-
-MojoResult MojoReadMessage(MojoHandle message_pipe_handle,
-                           void* bytes,
-                           uint32_t* num_bytes,
-                           MojoHandle* handles,
-                           uint32_t* num_handles,
-                           MojoReadMessageFlags flags) {
-  assert(g_thunks.ReadMessage);
-  return g_thunks.ReadMessage(message_pipe_handle, bytes, num_bytes, handles,
-                              num_handles, flags);
-}
-
-MojoResult MojoCreateDataPipe(const MojoCreateDataPipeOptions* options,
-                              MojoHandle* data_pipe_producer_handle,
-                              MojoHandle* data_pipe_consumer_handle) {
-  assert(g_thunks.CreateDataPipe);
-  return g_thunks.CreateDataPipe(options, data_pipe_producer_handle,
-                                 data_pipe_consumer_handle);
-}
-
-MojoResult MojoWriteData(MojoHandle data_pipe_producer_handle,
-                         const void* elements,
-                         uint32_t* num_elements,
-                         MojoWriteDataFlags flags) {
-  assert(g_thunks.WriteData);
-  return g_thunks.WriteData(data_pipe_producer_handle, elements, num_elements,
-                            flags);
-}
-
-MojoResult MojoBeginWriteData(MojoHandle data_pipe_producer_handle,
-                              void** buffer,
-                              uint32_t* buffer_num_elements,
-                              MojoWriteDataFlags flags) {
-  assert(g_thunks.BeginWriteData);
-  return g_thunks.BeginWriteData(data_pipe_producer_handle, buffer,
-                                 buffer_num_elements, flags);
-}
-
-MojoResult MojoEndWriteData(MojoHandle data_pipe_producer_handle,
-                            uint32_t num_elements_written) {
-  assert(g_thunks.EndWriteData);
-  return g_thunks.EndWriteData(data_pipe_producer_handle, num_elements_written);
-}
-
-MojoResult MojoReadData(MojoHandle data_pipe_consumer_handle,
-                        void* elements,
-                        uint32_t* num_elements,
-                        MojoReadDataFlags flags) {
-  assert(g_thunks.ReadData);
-  return g_thunks.ReadData(data_pipe_consumer_handle, elements, num_elements,
-                           flags);
-}
-
-MojoResult MojoBeginReadData(MojoHandle data_pipe_consumer_handle,
-                             const void** buffer,
-                             uint32_t* buffer_num_elements,
-                             MojoReadDataFlags flags) {
-  assert(g_thunks.BeginReadData);
-  return g_thunks.BeginReadData(data_pipe_consumer_handle, buffer,
-                                buffer_num_elements, flags);
-}
-
-MojoResult MojoEndReadData(MojoHandle data_pipe_consumer_handle,
-                           uint32_t num_elements_read) {
-  assert(g_thunks.EndReadData);
-  return g_thunks.EndReadData(data_pipe_consumer_handle, num_elements_read);
-}
-
-MojoResult MojoCreateSharedBuffer(
-    const struct MojoCreateSharedBufferOptions* options,
-    uint64_t num_bytes,
-    MojoHandle* shared_buffer_handle) {
-  assert(g_thunks.CreateSharedBuffer);
-  return g_thunks.CreateSharedBuffer(options, num_bytes, shared_buffer_handle);
-}
-
-MojoResult MojoDuplicateBufferHandle(
-    MojoHandle buffer_handle,
-    const struct MojoDuplicateBufferHandleOptions* options,
-    MojoHandle* new_buffer_handle) {
-  assert(g_thunks.DuplicateBufferHandle);
-  return g_thunks.DuplicateBufferHandle(buffer_handle, options,
-                                        new_buffer_handle);
-}
-
-MojoResult MojoMapBuffer(MojoHandle buffer_handle,
-                         uint64_t offset,
-                         uint64_t num_bytes,
-                         void** buffer,
-                         MojoMapBufferFlags flags) {
-  assert(g_thunks.MapBuffer);
-  return g_thunks.MapBuffer(buffer_handle, offset, num_bytes, buffer, flags);
-}
-
-MojoResult MojoUnmapBuffer(void* buffer) {
-  assert(g_thunks.UnmapBuffer);
-  return g_thunks.UnmapBuffer(buffer);
-}
-
-MojoResult MojoCreateWatcher(MojoWatcherCallback callback,
-                             MojoHandle* watcher_handle) {
-  assert(g_thunks.CreateWatcher);
-  return g_thunks.CreateWatcher(callback, watcher_handle);
-}
-
-MojoResult MojoWatch(MojoHandle watcher_handle,
-                     MojoHandle handle,
-                     MojoHandleSignals signals,
-                     uintptr_t context) {
-  assert(g_thunks.Watch);
-  return g_thunks.Watch(watcher_handle, handle, signals, context);
-}
-
-MojoResult MojoCancelWatch(MojoHandle watcher_handle, uintptr_t context) {
-  assert(g_thunks.CancelWatch);
-  return g_thunks.CancelWatch(watcher_handle, context);
-}
-
-MojoResult MojoArmWatcher(MojoHandle watcher_handle,
-                          uint32_t* num_ready_contexts,
-                          uintptr_t* ready_contexts,
-                          MojoResult* ready_results,
-                          MojoHandleSignalsState* ready_signals_states) {
-  assert(g_thunks.ArmWatcher);
-  return g_thunks.ArmWatcher(watcher_handle, num_ready_contexts, ready_contexts,
-                             ready_results, ready_signals_states);
-}
-
-MojoResult MojoFuseMessagePipes(MojoHandle handle0, MojoHandle handle1) {
-  assert(g_thunks.FuseMessagePipes);
-  return g_thunks.FuseMessagePipes(handle0, handle1);
-}
-
-MojoResult MojoWriteMessageNew(MojoHandle message_pipe_handle,
-                               MojoMessageHandle message,
-                               MojoWriteMessageFlags flags) {
-  assert(g_thunks.WriteMessageNew);
-  return g_thunks.WriteMessageNew(message_pipe_handle, message, flags);
-}
-
-MojoResult MojoReadMessageNew(MojoHandle message_pipe_handle,
-                              MojoMessageHandle* message,
-                              uint32_t* num_bytes,
-                              MojoHandle* handles,
-                              uint32_t* num_handles,
-                              MojoReadMessageFlags flags) {
-  assert(g_thunks.ReadMessageNew);
-  return g_thunks.ReadMessageNew(message_pipe_handle, message, num_bytes,
-                                 handles, num_handles, flags);
-}
-
-MojoResult MojoAllocMessage(uint32_t num_bytes,
-                            const MojoHandle* handles,
-                            uint32_t num_handles,
-                            MojoAllocMessageFlags flags,
-                            MojoMessageHandle* message) {
-  assert(g_thunks.AllocMessage);
-  return g_thunks.AllocMessage(
-      num_bytes, handles, num_handles, flags, message);
-}
-
-MojoResult MojoFreeMessage(MojoMessageHandle message) {
-  assert(g_thunks.FreeMessage);
-  return g_thunks.FreeMessage(message);
-}
-
-MojoResult MojoGetMessageBuffer(MojoMessageHandle message, void** buffer) {
-  assert(g_thunks.GetMessageBuffer);
-  return g_thunks.GetMessageBuffer(message, buffer);
-}
-
-MojoResult MojoWrapPlatformHandle(
-    const struct MojoPlatformHandle* platform_handle,
-    MojoHandle* mojo_handle) {
-  assert(g_thunks.WrapPlatformHandle);
-  return g_thunks.WrapPlatformHandle(platform_handle, mojo_handle);
-}
-
-MojoResult MojoUnwrapPlatformHandle(
-    MojoHandle mojo_handle,
-    struct MojoPlatformHandle* platform_handle) {
-  assert(g_thunks.UnwrapPlatformHandle);
-  return g_thunks.UnwrapPlatformHandle(mojo_handle, platform_handle);
-}
-
-MojoResult MojoWrapPlatformSharedBufferHandle(
-    const struct MojoPlatformHandle* platform_handle,
-    size_t num_bytes,
-    MojoPlatformSharedBufferHandleFlags flags,
-    MojoHandle* mojo_handle) {
-  assert(g_thunks.WrapPlatformSharedBufferHandle);
-  return g_thunks.WrapPlatformSharedBufferHandle(platform_handle, num_bytes,
-                                                 flags, mojo_handle);
-}
-
-MojoResult MojoUnwrapPlatformSharedBufferHandle(
-    MojoHandle mojo_handle,
-    struct MojoPlatformHandle* platform_handle,
-    size_t* num_bytes,
-    MojoPlatformSharedBufferHandleFlags* flags) {
-  assert(g_thunks.UnwrapPlatformSharedBufferHandle);
-  return g_thunks.UnwrapPlatformSharedBufferHandle(mojo_handle, platform_handle,
-                                                   num_bytes, flags);
-}
-
-MojoResult MojoNotifyBadMessage(MojoMessageHandle message,
-                                const char* error,
-                                size_t error_num_bytes) {
-  assert(g_thunks.NotifyBadMessage);
-  return g_thunks.NotifyBadMessage(message, error, error_num_bytes);
-}
-
-MojoResult MojoGetProperty(MojoPropertyType type, void* value) {
-  assert(g_thunks.GetProperty);
-  return g_thunks.GetProperty(type, value);
-}
-
-}  // extern "C"
-
-size_t MojoEmbedderSetSystemThunks(const MojoSystemThunks* system_thunks) {
-  if (system_thunks->size >= sizeof(g_thunks))
-    g_thunks = *system_thunks;
-  return sizeof(g_thunks);
-}
diff --git a/mojo/public/c/system/thunks.h b/mojo/public/c/system/thunks.h
deleted file mode 100644
index e61bb46..0000000
--- a/mojo/public/c/system/thunks.h
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_THUNKS_H_
-#define MOJO_PUBLIC_C_SYSTEM_THUNKS_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "mojo/public/c/system/core.h"
-#include "mojo/public/c/system/system_export.h"
-
-// Structure used to bind the basic Mojo Core functions to an embedder
-// implementation. This is intended to eventually be used as a stable ABI
-// between a Mojo embedder and some loaded application code, but for now it is
-// still effectively safe to rearrange entries as needed.
-#pragma pack(push, 8)
-struct MojoSystemThunks {
-  size_t size;  // Should be set to sizeof(MojoSystemThunks).
-  MojoTimeTicks (*GetTimeTicksNow)();
-  MojoResult (*Close)(MojoHandle handle);
-  MojoResult (*QueryHandleSignalsState)(
-      MojoHandle handle,
-      struct MojoHandleSignalsState* signals_state);
-  MojoResult (*CreateMessagePipe)(
-      const struct MojoCreateMessagePipeOptions* options,
-      MojoHandle* message_pipe_handle0,
-      MojoHandle* message_pipe_handle1);
-  MojoResult (*WriteMessage)(MojoHandle message_pipe_handle,
-                             const void* bytes,
-                             uint32_t num_bytes,
-                             const MojoHandle* handles,
-                             uint32_t num_handles,
-                             MojoWriteMessageFlags flags);
-  MojoResult (*ReadMessage)(MojoHandle message_pipe_handle,
-                            void* bytes,
-                            uint32_t* num_bytes,
-                            MojoHandle* handles,
-                            uint32_t* num_handles,
-                            MojoReadMessageFlags flags);
-  MojoResult (*CreateDataPipe)(const struct MojoCreateDataPipeOptions* options,
-                               MojoHandle* data_pipe_producer_handle,
-                               MojoHandle* data_pipe_consumer_handle);
-  MojoResult (*WriteData)(MojoHandle data_pipe_producer_handle,
-                          const void* elements,
-                          uint32_t* num_elements,
-                          MojoWriteDataFlags flags);
-  MojoResult (*BeginWriteData)(MojoHandle data_pipe_producer_handle,
-                               void** buffer,
-                               uint32_t* buffer_num_elements,
-                               MojoWriteDataFlags flags);
-  MojoResult (*EndWriteData)(MojoHandle data_pipe_producer_handle,
-                             uint32_t num_elements_written);
-  MojoResult (*ReadData)(MojoHandle data_pipe_consumer_handle,
-                         void* elements,
-                         uint32_t* num_elements,
-                         MojoReadDataFlags flags);
-  MojoResult (*BeginReadData)(MojoHandle data_pipe_consumer_handle,
-                              const void** buffer,
-                              uint32_t* buffer_num_elements,
-                              MojoReadDataFlags flags);
-  MojoResult (*EndReadData)(MojoHandle data_pipe_consumer_handle,
-                            uint32_t num_elements_read);
-  MojoResult (*CreateSharedBuffer)(
-      const struct MojoCreateSharedBufferOptions* options,
-      uint64_t num_bytes,
-      MojoHandle* shared_buffer_handle);
-  MojoResult (*DuplicateBufferHandle)(
-      MojoHandle buffer_handle,
-      const struct MojoDuplicateBufferHandleOptions* options,
-      MojoHandle* new_buffer_handle);
-  MojoResult (*MapBuffer)(MojoHandle buffer_handle,
-                          uint64_t offset,
-                          uint64_t num_bytes,
-                          void** buffer,
-                          MojoMapBufferFlags flags);
-  MojoResult (*UnmapBuffer)(void* buffer);
-  MojoResult (*CreateWatcher)(MojoWatcherCallback callback,
-                              MojoHandle* watcher_handle);
-  MojoResult (*Watch)(MojoHandle watcher_handle,
-                      MojoHandle handle,
-                      MojoHandleSignals signals,
-                      uintptr_t context);
-  MojoResult (*CancelWatch)(MojoHandle watcher_handle, uintptr_t context);
-  MojoResult (*ArmWatcher)(MojoHandle watcher_handle,
-                           uint32_t* num_ready_contexts,
-                           uintptr_t* ready_contexts,
-                           MojoResult* ready_results,
-                           MojoHandleSignalsState* ready_signals_states);
-  MojoResult (*FuseMessagePipes)(MojoHandle handle0, MojoHandle handle1);
-  MojoResult (*WriteMessageNew)(MojoHandle message_pipe_handle,
-                                MojoMessageHandle message,
-                                MojoWriteMessageFlags flags);
-  MojoResult (*ReadMessageNew)(MojoHandle message_pipe_handle,
-                               MojoMessageHandle* message,
-                               uint32_t* num_bytes,
-                               MojoHandle* handles,
-                               uint32_t* num_handles,
-                               MojoReadMessageFlags flags);
-  MojoResult (*AllocMessage)(uint32_t num_bytes,
-                             const MojoHandle* handles,
-                             uint32_t num_handles,
-                             MojoAllocMessageFlags flags,
-                             MojoMessageHandle* message);
-  MojoResult (*FreeMessage)(MojoMessageHandle message);
-  MojoResult (*GetMessageBuffer)(MojoMessageHandle message, void** buffer);
-  MojoResult (*WrapPlatformHandle)(
-      const struct MojoPlatformHandle* platform_handle,
-      MojoHandle* mojo_handle);
-  MojoResult (*UnwrapPlatformHandle)(
-      MojoHandle mojo_handle,
-      struct MojoPlatformHandle* platform_handle);
-  MojoResult (*WrapPlatformSharedBufferHandle)(
-      const struct MojoPlatformHandle* platform_handle,
-      size_t num_bytes,
-      MojoPlatformSharedBufferHandleFlags flags,
-      MojoHandle* mojo_handle);
-  MojoResult (*UnwrapPlatformSharedBufferHandle)(
-      MojoHandle mojo_handle,
-      struct MojoPlatformHandle* platform_handle,
-      size_t* num_bytes,
-      MojoPlatformSharedBufferHandleFlags* flags);
-  MojoResult (*NotifyBadMessage)(MojoMessageHandle message,
-                                 const char* error,
-                                 size_t error_num_bytes);
-  MojoResult (*GetProperty)(MojoPropertyType type, void* value);
-};
-#pragma pack(pop)
-
-// Use this type for the function found by dynamically discovering it in
-// a DSO linked with mojo_system. For example:
-// MojoSetSystemThunksFn mojo_set_system_thunks_fn =
-//     reinterpret_cast<MojoSetSystemThunksFn>(app_library.GetFunctionPointer(
-//         "MojoSetSystemThunks"));
-// The expected size of |system_thunks| is returned.
-// The contents of |system_thunks| are copied.
-typedef size_t (*MojoSetSystemThunksFn)(
-    const struct MojoSystemThunks* system_thunks);
-
-// A function for setting up the embedder's own system thunks. This should only
-// be called by Mojo embedder code.
-MOJO_SYSTEM_EXPORT size_t MojoEmbedderSetSystemThunks(
-    const struct MojoSystemThunks* system_thunks);
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_THUNKS_H_
diff --git a/mojo/public/c/system/types.h b/mojo/public/c/system/types.h
deleted file mode 100644
index 15813b6..0000000
--- a/mojo/public/c/system/types.h
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains types and constants/macros common to different Mojo system
-// APIs.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_TYPES_H_
-#define MOJO_PUBLIC_C_SYSTEM_TYPES_H_
-
-#include <stdint.h>
-
-#include "mojo/public/c/system/macros.h"
-
-// |MojoTimeTicks|: A time delta, in microseconds, the meaning of which is
-// source-dependent.
-
-typedef int64_t MojoTimeTicks;
-
-// |MojoHandle|: Handles to Mojo objects.
-//   |MOJO_HANDLE_INVALID| - A value that is never a valid handle.
-
-typedef uint32_t MojoHandle;
-
-#ifdef __cplusplus
-const MojoHandle MOJO_HANDLE_INVALID = 0;
-#else
-#define MOJO_HANDLE_INVALID ((MojoHandle)0)
-#endif
-
-// |MojoResult|: Result codes for Mojo operations. The only success code is zero
-// (|MOJO_RESULT_OK|); all non-zero values should be considered as error/failure
-// codes (even if the value is not recognized).
-//   |MOJO_RESULT_OK| - Not an error; returned on success.
-//   |MOJO_RESULT_CANCELLED| - Operation was cancelled, typically by the caller.
-//   |MOJO_RESULT_UNKNOWN| - Unknown error (e.g., if not enough information is
-//       available for a more specific error).
-//   |MOJO_RESULT_INVALID_ARGUMENT| - Caller specified an invalid argument. This
-//       differs from |MOJO_RESULT_FAILED_PRECONDITION| in that the former
-//       indicates arguments that are invalid regardless of the state of the
-//       system.
-//   |MOJO_RESULT_DEADLINE_EXCEEDED| - Deadline expired before the operation
-//       could complete.
-//   |MOJO_RESULT_NOT_FOUND| - Some requested entity was not found (i.e., does
-//       not exist).
-//   |MOJO_RESULT_ALREADY_EXISTS| - Some entity or condition that we attempted
-//       to create already exists.
-//   |MOJO_RESULT_PERMISSION_DENIED| - The caller does not have permission to
-//       for the operation (use |MOJO_RESULT_RESOURCE_EXHAUSTED| for rejections
-//       caused by exhausting some resource instead).
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| - Some resource required for the call
-//       (possibly some quota) has been exhausted.
-//   |MOJO_RESULT_FAILED_PRECONDITION| - The system is not in a state required
-//       for the operation (use this if the caller must do something to rectify
-//       the state before retrying).
-//   |MOJO_RESULT_ABORTED| - The operation was aborted by the system, possibly
-//       due to a concurrency issue (use this if the caller may retry at a
-//       higher level).
-//   |MOJO_RESULT_OUT_OF_RANGE| - The operation was attempted past the valid
-//       range. Unlike |MOJO_RESULT_INVALID_ARGUMENT|, this indicates that the
-//       operation may be/become valid depending on the system state. (This
-//       error is similar to |MOJO_RESULT_FAILED_PRECONDITION|, but is more
-//       specific.)
-//   |MOJO_RESULT_UNIMPLEMENTED| - The operation is not implemented, supported,
-//       or enabled.
-//   |MOJO_RESULT_INTERNAL| - Internal error: this should never happen and
-//       indicates that some invariant expected by the system has been broken.
-//   |MOJO_RESULT_UNAVAILABLE| - The operation is (temporarily) currently
-//       unavailable. The caller may simply retry the operation (possibly with a
-//       backoff).
-//   |MOJO_RESULT_DATA_LOSS| - Unrecoverable data loss or corruption.
-//   |MOJO_RESULT_BUSY| - One of the resources involved is currently being used
-//       (possibly on another thread) in a way that prevents the current
-//       operation from proceeding, e.g., if the other operation may result in
-//       the resource being invalidated.
-//   |MOJO_RESULT_SHOULD_WAIT| - The request cannot currently be completed
-//       (e.g., if the data requested is not yet available). The caller should
-//       wait for it to be feasible using a watcher.
-//
-// The codes from |MOJO_RESULT_OK| to |MOJO_RESULT_DATA_LOSS| come from
-// Google3's canonical error codes.
-
-typedef uint32_t MojoResult;
-
-#ifdef __cplusplus
-const MojoResult MOJO_RESULT_OK = 0;
-const MojoResult MOJO_RESULT_CANCELLED = 1;
-const MojoResult MOJO_RESULT_UNKNOWN = 2;
-const MojoResult MOJO_RESULT_INVALID_ARGUMENT = 3;
-const MojoResult MOJO_RESULT_DEADLINE_EXCEEDED = 4;
-const MojoResult MOJO_RESULT_NOT_FOUND = 5;
-const MojoResult MOJO_RESULT_ALREADY_EXISTS = 6;
-const MojoResult MOJO_RESULT_PERMISSION_DENIED = 7;
-const MojoResult MOJO_RESULT_RESOURCE_EXHAUSTED = 8;
-const MojoResult MOJO_RESULT_FAILED_PRECONDITION = 9;
-const MojoResult MOJO_RESULT_ABORTED = 10;
-const MojoResult MOJO_RESULT_OUT_OF_RANGE = 11;
-const MojoResult MOJO_RESULT_UNIMPLEMENTED = 12;
-const MojoResult MOJO_RESULT_INTERNAL = 13;
-const MojoResult MOJO_RESULT_UNAVAILABLE = 14;
-const MojoResult MOJO_RESULT_DATA_LOSS = 15;
-const MojoResult MOJO_RESULT_BUSY = 16;
-const MojoResult MOJO_RESULT_SHOULD_WAIT = 17;
-#else
-#define MOJO_RESULT_OK ((MojoResult)0)
-#define MOJO_RESULT_CANCELLED ((MojoResult)1)
-#define MOJO_RESULT_UNKNOWN ((MojoResult)2)
-#define MOJO_RESULT_INVALID_ARGUMENT ((MojoResult)3)
-#define MOJO_RESULT_DEADLINE_EXCEEDED ((MojoResult)4)
-#define MOJO_RESULT_NOT_FOUND ((MojoResult)5)
-#define MOJO_RESULT_ALREADY_EXISTS ((MojoResult)6)
-#define MOJO_RESULT_PERMISSION_DENIED ((MojoResult)7)
-#define MOJO_RESULT_RESOURCE_EXHAUSTED ((MojoResult)8)
-#define MOJO_RESULT_FAILED_PRECONDITION ((MojoResult)9)
-#define MOJO_RESULT_ABORTED ((MojoResult)10)
-#define MOJO_RESULT_OUT_OF_RANGE ((MojoResult)11)
-#define MOJO_RESULT_UNIMPLEMENTED ((MojoResult)12)
-#define MOJO_RESULT_INTERNAL ((MojoResult)13)
-#define MOJO_RESULT_UNAVAILABLE ((MojoResult)14)
-#define MOJO_RESULT_DATA_LOSS ((MojoResult)15)
-#define MOJO_RESULT_BUSY ((MojoResult)16)
-#define MOJO_RESULT_SHOULD_WAIT ((MojoResult)17)
-#endif
-
-// |MojoDeadline|: Used to specify deadlines (timeouts), in microseconds (except
-// for |MOJO_DEADLINE_INDEFINITE|).
-//   |MOJO_DEADLINE_INDEFINITE| - Used to indicate "forever".
-
-typedef uint64_t MojoDeadline;
-
-#ifdef __cplusplus
-const MojoDeadline MOJO_DEADLINE_INDEFINITE = static_cast<MojoDeadline>(-1);
-#else
-#define MOJO_DEADLINE_INDEFINITE ((MojoDeadline) - 1)
-#endif
-
-// |MojoHandleSignals|: Used to specify signals that can be watched for on a
-// handle (and which can be triggered), e.g., the ability to read or write to
-// the handle.
-//   |MOJO_HANDLE_SIGNAL_NONE| - No flags. A registered watch will always fail
-//       to arm with |MOJO_RESULT_FAILED_PRECONDITION| when watching for this.
-//   |MOJO_HANDLE_SIGNAL_READABLE| - Can read (e.g., a message) from the handle.
-//   |MOJO_HANDLE_SIGNAL_WRITABLE| - Can write (e.g., a message) to the handle.
-//   |MOJO_HANDLE_SIGNAL_PEER_CLOSED| - The peer handle is closed.
-//   |MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE| - Can read data from a data pipe
-//       consumer handle (implying MOJO_HANDLE_SIGNAL_READABLE is also set),
-//       AND there is some nonzero quantity of new data available on the pipe
-//       since the last |MojoReadData()| or |MojoBeginReadData()| call on the
-//       handle.
-
-typedef uint32_t MojoHandleSignals;
-
-#ifdef __cplusplus
-const MojoHandleSignals MOJO_HANDLE_SIGNAL_NONE = 0;
-const MojoHandleSignals MOJO_HANDLE_SIGNAL_READABLE = 1 << 0;
-const MojoHandleSignals MOJO_HANDLE_SIGNAL_WRITABLE = 1 << 1;
-const MojoHandleSignals MOJO_HANDLE_SIGNAL_PEER_CLOSED = 1 << 2;
-const MojoHandleSignals MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE = 1 << 3;
-#else
-#define MOJO_HANDLE_SIGNAL_NONE ((MojoHandleSignals)0)
-#define MOJO_HANDLE_SIGNAL_READABLE ((MojoHandleSignals)1 << 0)
-#define MOJO_HANDLE_SIGNAL_WRITABLE ((MojoHandleSignals)1 << 1)
-#define MOJO_HANDLE_SIGNAL_PEER_CLOSED ((MojoHandleSignals)1 << 2)
-#define MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE ((MojoHandleSignals)1 << 3);
-#endif
-
-// |MojoHandleSignalsState|: Returned by watch notification callbacks and
-// |MojoQueryHandleSignalsState| functions to indicate the signaling state of
-// handles. Members are as follows:
-//   - |satisfied signals|: Bitmask of signals that were satisfied at some time
-//         before the call returned.
-//   - |satisfiable signals|: These are the signals that are possible to
-//         satisfy. For example, if the return value was
-//         |MOJO_RESULT_FAILED_PRECONDITION|, you can use this field to
-//         determine which, if any, of the signals can still be satisfied.
-// Note: This struct is not extensible (and only has 32-bit quantities), so it's
-// 32-bit-aligned.
-MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int32_t) == 4, "int32_t has weird alignment");
-struct MOJO_ALIGNAS(4) MojoHandleSignalsState {
-  MojoHandleSignals satisfied_signals;
-  MojoHandleSignals satisfiable_signals;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoHandleSignalsState) == 8,
-                   "MojoHandleSignalsState has wrong size");
-
-// |MojoWatcherNotificationFlags|: Passed to a callback invoked by a watcher
-// when some observed signals are raised or a watched handle is closed. May take
-// on any combination of the following values:
-//
-//   |MOJO_WATCHER_NOTIFICATION_FLAG_FROM_SYSTEM| - The callback is being
-//       invoked as a result of a system-level event rather than a direct API
-//       call from user code. This may be used as an indication that user code
-//       is safe to call without fear of reentry.
-
-typedef uint32_t MojoWatcherNotificationFlags;
-
-#ifdef __cplusplus
-const MojoWatcherNotificationFlags MOJO_WATCHER_NOTIFICATION_FLAG_NONE = 0;
-const MojoWatcherNotificationFlags MOJO_WATCHER_NOTIFICATION_FLAG_FROM_SYSTEM =
-    1 << 0;
-#else
-#define MOJO_WATCHER_NOTIFICATION_FLAG_NONE ((MojoWatcherNotificationFlags)0)
-#define MOJO_WATCHER_NOTIFICATION_FLAG_FROM_SYSTEM \
-  ((MojoWatcherNotificationFlags)1 << 0);
-#endif
-
-// |MojoPropertyType|: Property types that can be passed to |MojoGetProperty()|
-// to retrieve system properties. May take the following values:
-//   |MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED| - Whether making synchronous calls
-//       (i.e., blocking to wait for a response to an outbound message) is
-//       allowed. The property value is of boolean type. If the value is true,
-//       users should refrain from making sync calls.
-typedef uint32_t MojoPropertyType;
-
-#ifdef __cplusplus
-const MojoPropertyType MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED = 0;
-#else
-#define MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED ((MojoPropertyType)0)
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_TYPES_H_
diff --git a/mojo/public/c/system/watcher.h b/mojo/public/c/system/watcher.h
deleted file mode 100644
index e32856b..0000000
--- a/mojo/public/c/system/watcher.h
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_WATCHER_H_
-#define MOJO_PUBLIC_C_SYSTEM_WATCHER_H_
-
-#include <stdint.h>
-
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// A callback used to notify watchers about events on their watched handles.
-//
-// See documentation for |MojoWatcherNotificationFlags| for details regarding
-// the possible values of |flags|.
-//
-// See documentation for |MojoWatch()| for details regarding the other arguments
-// this callback receives when called.
-typedef void (*MojoWatcherCallback)(uintptr_t context,
-                                    MojoResult result,
-                                    struct MojoHandleSignalsState signals_state,
-                                    MojoWatcherNotificationFlags flags);
-
-// Creates a new watcher.
-//
-// Watchers are used to trigger arbitrary code execution when one or more
-// handles change state to meet certain conditions.
-//
-// A newly registered watcher is initially disarmed and may be armed using
-// |MojoArmWatcher()|. A watcher is also always disarmed immediately before any
-// invocation of one or more notification callbacks in response to a single
-// handle's state changing in some relevant way.
-//
-// Parameters:
-//   |callback|: The |MojoWatcherCallback| to invoke any time the watcher is
-//       notified of an event. See |MojoWatch()| for details regarding arguments
-//       passed to the callback. Note that this may be called from any arbitrary
-//       thread.
-//   |watcher_handle|: The address at which to store the MojoHandle
-//       corresponding to the new watcher if successfully created.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if the watcher has been successfully created.
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if a handle could not be allocated for
-//       this watcher.
-MOJO_SYSTEM_EXPORT MojoResult MojoCreateWatcher(MojoWatcherCallback callback,
-                                                MojoHandle* watcher_handle);
-
-// Adds a watch to a watcher. This allows the watcher to fire notifications
-// regarding state changes on the handle corresponding to the arguments given.
-//
-// Note that notifications for a given watch context are guaranteed to be
-// mutually exclusive in execution: the callback will never be entered for a
-// given context while another invocation of the callback is still executing for
-// the same context. As a result it is generally a good idea to ensure that
-// callbacks do as little work as necessary in order to process the
-// notification.
-//
-// Parameters:
-//   |watcher_handle|: The watcher to which |handle| is to be added.
-//   |handle|: The handle to add to the watcher.
-//   |signals|: The signals to watch for on |handle|.
-//   |context|: An arbitrary context value given to any invocation of the
-//       watcher's callback when invoked as a result of some state change
-//       relevant to this combination of |handle| and |signals|. Must be
-//       unique within any given watcher.
-//
-// Callback parameters (see |MojoWatcherNotificationCallback| above):
-//   When the watcher invokes its callback as a result of some notification
-//   relevant to this watch operation, |context| receives the value given here
-//   and |signals_state| receives the last known signals state of this handle.
-//
-//   |result| is one of the following:
-//     |MOJO_RESULT_OK| if at least one of the watched signals is satisfied. The
-//         watcher must be armed for this notification to fire.
-//     |MOJO_RESULT_FAILED_PRECONDITION| if all of the watched signals are
-//         permanently unsatisfiable. The watcher must be armed for this
-//         notification to fire.
-//     |MOJO_RESULT_CANCELLED| if the watch has been cancelled. The may occur if
-//         the watcher has been closed, the watched handle has been closed, or
-//         the watch for |context| has been explicitly cancelled. This is always
-//         the last result received for any given context, and it is guaranteed
-//         to be received exactly once per watch, regardless of how the watch
-//         was cancelled.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if the handle is now being watched by the watcher.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |watcher_handle| is not a watcher handle,
-//       |handle| is not a valid message pipe or data pipe handle.
-//   |MOJO_RESULT_ALREADY_EXISTS| if the watcher already has a watch registered
-//       for the given value of |context| or for the given |handle|.
-MOJO_SYSTEM_EXPORT MojoResult MojoWatch(MojoHandle watcher_handle,
-                                        MojoHandle handle,
-                                        MojoHandleSignals signals,
-                                        uintptr_t context);
-
-// Removes a watch from a watcher.
-//
-// This ensures that the watch is cancelled as soon as possible. Cancellation
-// may be deferred (or may even block) an aritrarily long time if the watch is
-// already dispatching one or more notifications.
-//
-// When cancellation is complete, the watcher's callback is invoked one final
-// time for |context|, with the result |MOJO_RESULT_CANCELLED|.
-//
-// The same behavior can be elicted by either closing the watched handle
-// associated with this context, or by closing |watcher_handle| itself. In the
-// lastter case, all registered contexts on the watcher are implicitly cancelled
-// in a similar fashion.
-//
-// Parameters:
-//   |watcher_handle|: The handle of the watcher from which to remove a watch.
-//   |context|: The context of the watch to be removed.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if the watch has been cancelled.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |watcher_handle| is not a watcher handle.
-//   |MOJO_RESULT_NOT_FOUND| if there is no watch registered on this watcher for
-//       the given value of |context|.
-MOJO_SYSTEM_EXPORT MojoResult MojoCancelWatch(MojoHandle watcher_handle,
-                                              uintptr_t context);
-
-// Arms a watcher, enabling a single future event on one of the watched handles
-// to trigger a single notification for each relevant watch context associated
-// with that handle.
-//
-// Parameters:
-//   |watcher_handle|: The handle of the watcher.
-//   |num_ready_contexts|: An address pointing to the number of elements
-//       available for storage in the remaining output buffers. Optional and
-//       only used on failure. See |MOJO_RESULT_FAILED_PRECONDITION| below for
-//       more details.
-//   |ready_contexts|: An output buffer for contexts corresponding to the
-//       watches which would have notified if the watcher were armed. Optional
-//       and only uesd on failure. See |MOJO_RESULT_FAILED_PRECONDITION| below
-//       for more details.
-//   |ready_results|: An output buffer for MojoResult values corresponding to
-//       each context in |ready_contexts|. Optional and only used on failure.
-//       See |MOJO_RESULT_FAILED_PRECONDITION| below for more details.
-//   |ready_signals_states|: An output buffer for |MojoHandleSignalsState|
-//       structures corresponding to each context in |ready_contexts|. Optional
-//       and only used on failure. See |MOJO_RESULT_FAILED_PRECONDITION| below
-//       for more details.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if the watcher has been successfully armed. All arguments
-//       other than |watcher_handle| are ignored in this case.
-//   |MOJO_RESULT_NOT_FOUND| if the watcher does not have any registered watch
-//       contexts. All arguments other than |watcher_handle| are ignored in this
-//       case.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |watcher_handle| is not a valid watcher
-//       handle, or if |num_ready_contexts| is non-null but any of the output
-//       buffer paramters is null.
-//   |MOJO_RESULT_FAILED_PRECONDITION| if one or more watches would have
-//       notified immediately upon arming the watcher. If |num_handles| is
-//       non-null, this assumes there is enough space for |*num_handles| entries
-//       in each of the subsequent output buffer arguments.
-//
-//       At most that many entries are placed in the output buffers,
-//       corresponding to the watches which would have signalled if the watcher
-//       had been armed successfully. The actual number of entries placed in the
-//       output buffers is written to |*num_ready_contexts| before returning.
-//
-//       If more than (input) |*num_ready_contexts| watch contexts were ready to
-//       notify, the subset presented in output buffers is arbitrary, but the
-//       implementation makes a best effort to circulate the outputs across
-//       consecutive calls so that callers may reliably avoid handle starvation.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoArmWatcher(MojoHandle watcher_handle,
-               uint32_t* num_ready_contexts,
-               uintptr_t* ready_contexts,
-               MojoResult* ready_results,
-               struct MojoHandleSignalsState* ready_signals_states);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_WATCHER_H_
diff --git a/mojo/public/c/test_support/BUILD.gn b/mojo/public/c/test_support/BUILD.gn
deleted file mode 100644
index e2abd58..0000000
--- a/mojo/public/c/test_support/BUILD.gn
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-static_library("test_support") {
-  output_name = "mojo_public_test_support"
-
-  sources = [
-    "test_support.h",
-
-    # TODO(vtl): Convert this to thunks http://crbug.com/386799
-    "../../tests/test_support_private.cc",
-    "../../tests/test_support_private.h",
-  ]
-}
diff --git a/mojo/public/c/test_support/test_support.h b/mojo/public/c/test_support/test_support.h
deleted file mode 100644
index 8e50441..0000000
--- a/mojo/public/c/test_support/test_support.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_C_TEST_SUPPORT_TEST_SUPPORT_H_
-#define MOJO_PUBLIC_C_TEST_SUPPORT_TEST_SUPPORT_H_
-
-// Note: This header should be compilable as C.
-
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// |sub_test_name| is optional. If not null, it usually describes one particular
-// configuration of the test. For example, if |test_name| is "TestPacketRate",
-// |sub_test_name| could be "100BytesPerPacket".
-// When the perf data is visualized by the performance dashboard, data with
-// different |sub_test_name|s (but the same |test_name|) are depicted as
-// different traces on the same chart.
-void MojoTestSupportLogPerfResult(
-    const char* test_name,
-    const char* sub_test_name,
-    double value,
-    const char* units);
-
-// Opens a "/"-delimited file path relative to the source root.
-FILE* MojoTestSupportOpenSourceRootRelativeFile(
-    const char* source_root_relative_path);
-
-// Enumerates a "/"-delimited directory path relative to the source root.
-// Returns only regular files. The return value is a heap-allocated array of
-// heap-allocated strings. Each must be free'd separately.
-//
-// The return value is built like so:
-//
-//   char** rv = (char**) calloc(N + 1, sizeof(char*));
-//   rv[0] = strdup("a");
-//   rv[1] = strdup("b");
-//   rv[2] = strdup("c");
-//   ...
-//   rv[N] = NULL;
-//
-char** MojoTestSupportEnumerateSourceRootRelativeDirectory(
-    const char* source_root_relative_path);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_TEST_SUPPORT_TEST_SUPPORT_H_
diff --git a/mojo/public/cpp/bindings/BUILD.gn b/mojo/public/cpp/bindings/BUILD.gn
deleted file mode 100644
index bd87965..0000000
--- a/mojo/public/cpp/bindings/BUILD.gn
+++ /dev/null
@@ -1,194 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-interfaces_bindings_gen_dir = "$root_gen_dir/mojo/public/interfaces/bindings"
-
-component("bindings") {
-  sources = [
-    # Normally, targets should depend on the source_sets generated by mojom
-    # targets. However, the generated source_sets use portions of the bindings
-    # library. In order to avoid linker warnings about locally-defined imports
-    # in Windows components build, this target depends on the generated C++
-    # files directly so that the EXPORT macro defintions match.
-    "$interfaces_bindings_gen_dir/interface_control_messages.mojom-shared-internal.h",
-    "$interfaces_bindings_gen_dir/interface_control_messages.mojom-shared.cc",
-    "$interfaces_bindings_gen_dir/interface_control_messages.mojom-shared.h",
-    "$interfaces_bindings_gen_dir/interface_control_messages.mojom.cc",
-    "$interfaces_bindings_gen_dir/interface_control_messages.mojom.h",
-    "$interfaces_bindings_gen_dir/pipe_control_messages.mojom-shared-internal.h",
-    "$interfaces_bindings_gen_dir/pipe_control_messages.mojom-shared.cc",
-    "$interfaces_bindings_gen_dir/pipe_control_messages.mojom-shared.h",
-    "$interfaces_bindings_gen_dir/pipe_control_messages.mojom.cc",
-    "$interfaces_bindings_gen_dir/pipe_control_messages.mojom.h",
-    "array_data_view.h",
-    "array_traits.h",
-    "array_traits_carray.h",
-    "array_traits_stl.h",
-    "associated_binding.h",
-    "associated_binding_set.h",
-    "associated_group.h",
-    "associated_group_controller.h",
-    "associated_interface_ptr.h",
-    "associated_interface_ptr_info.h",
-    "associated_interface_request.h",
-    "binding.h",
-    "binding_set.h",
-    "bindings_export.h",
-    "clone_traits.h",
-    "connection_error_callback.h",
-    "connector.h",
-    "disconnect_reason.h",
-    "filter_chain.h",
-    "interface_data_view.h",
-    "interface_endpoint_client.h",
-    "interface_endpoint_controller.h",
-    "interface_id.h",
-    "interface_ptr.h",
-    "interface_ptr_info.h",
-    "interface_ptr_set.h",
-    "interface_request.h",
-    "lib/array_internal.cc",
-    "lib/array_internal.h",
-    "lib/array_serialization.h",
-    "lib/associated_binding.cc",
-    "lib/associated_group.cc",
-    "lib/associated_group_controller.cc",
-    "lib/associated_interface_ptr.cc",
-    "lib/associated_interface_ptr_state.h",
-    "lib/binding_state.cc",
-    "lib/binding_state.h",
-    "lib/bindings_internal.h",
-    "lib/buffer.h",
-    "lib/connector.cc",
-    "lib/control_message_handler.cc",
-    "lib/control_message_handler.h",
-    "lib/control_message_proxy.cc",
-    "lib/control_message_proxy.h",
-    "lib/equals_traits.h",
-    "lib/filter_chain.cc",
-    "lib/fixed_buffer.cc",
-    "lib/fixed_buffer.h",
-    "lib/handle_interface_serialization.h",
-    "lib/hash_util.h",
-    "lib/interface_endpoint_client.cc",
-    "lib/interface_ptr_state.h",
-    "lib/map_data_internal.h",
-    "lib/map_serialization.h",
-    "lib/may_auto_lock.h",
-    "lib/message.cc",
-    "lib/message_buffer.cc",
-    "lib/message_buffer.h",
-    "lib/message_builder.cc",
-    "lib/message_builder.h",
-    "lib/message_header_validator.cc",
-    "lib/message_internal.h",
-    "lib/multiplex_router.cc",
-    "lib/multiplex_router.h",
-    "lib/native_enum_data.h",
-    "lib/native_enum_serialization.h",
-    "lib/native_struct.cc",
-    "lib/native_struct_data.cc",
-    "lib/native_struct_data.h",
-    "lib/native_struct_serialization.cc",
-    "lib/native_struct_serialization.h",
-    "lib/pipe_control_message_handler.cc",
-    "lib/pipe_control_message_proxy.cc",
-    "lib/scoped_interface_endpoint_handle.cc",
-    "lib/serialization.h",
-    "lib/serialization_context.cc",
-    "lib/serialization_context.h",
-    "lib/serialization_forward.h",
-    "lib/serialization_util.h",
-    "lib/string_serialization.h",
-    "lib/string_traits_string16.cc",
-    "lib/sync_call_restrictions.cc",
-    "lib/sync_event_watcher.cc",
-    "lib/sync_handle_registry.cc",
-    "lib/sync_handle_watcher.cc",
-    "lib/template_util.h",
-    "lib/union_accessor.h",
-    "lib/validate_params.h",
-    "lib/validation_context.cc",
-    "lib/validation_context.h",
-    "lib/validation_errors.cc",
-    "lib/validation_errors.h",
-    "lib/validation_util.cc",
-    "lib/validation_util.h",
-    "map.h",
-    "map_data_view.h",
-    "map_traits.h",
-    "map_traits_stl.h",
-    "message.h",
-    "message_header_validator.h",
-    "native_enum.h",
-    "native_struct.h",
-    "native_struct_data_view.h",
-    "pipe_control_message_handler.h",
-    "pipe_control_message_handler_delegate.h",
-    "pipe_control_message_proxy.h",
-    "raw_ptr_impl_ref_traits.h",
-    "scoped_interface_endpoint_handle.h",
-    "string_data_view.h",
-    "string_traits.h",
-    "string_traits_stl.h",
-    "string_traits_string16.h",
-    "string_traits_string_piece.h",
-    "strong_associated_binding.h",
-    "strong_binding.h",
-    "strong_binding_set.h",
-    "struct_ptr.h",
-    "sync_call_restrictions.h",
-    "sync_event_watcher.h",
-    "sync_handle_registry.h",
-    "sync_handle_watcher.h",
-    "thread_safe_interface_ptr.h",
-    "type_converter.h",
-    "union_traits.h",
-    "unique_ptr_impl_ref_traits.h",
-  ]
-
-  public_deps = [
-    ":struct_traits",
-    "//base",
-    "//ipc:param_traits",
-    "//mojo/public/cpp/system",
-  ]
-
-  deps = [
-    "//base",
-    "//mojo/public/interfaces/bindings:bindings__generator",
-    "//mojo/public/interfaces/bindings:bindings_shared__generator",
-  ]
-
-  defines = [ "MOJO_CPP_BINDINGS_IMPLEMENTATION" ]
-}
-
-source_set("struct_traits") {
-  sources = [
-    "enum_traits.h",
-    "struct_traits.h",
-  ]
-}
-
-if (!is_ios) {
-  # TODO(yzshen): crbug.com/617718 Consider moving this into blink.
-  source_set("wtf_support") {
-    sources = [
-      "array_traits_wtf_vector.h",
-      "lib/string_traits_wtf.cc",
-      "lib/wtf_clone_equals_util.h",
-      "lib/wtf_hash_util.h",
-      "lib/wtf_serialization.h",
-      "map_traits_wtf_hash_map.h",
-      "string_traits_wtf.h",
-    ]
-
-    public_deps = [
-      ":bindings",
-      "//third_party/WebKit/Source/wtf",
-    ]
-
-    public_configs = [ "//third_party/WebKit/Source:config" ]
-  }
-}
diff --git a/mojo/public/cpp/bindings/DEPS b/mojo/public/cpp/bindings/DEPS
deleted file mode 100644
index 36eba44..0000000
--- a/mojo/public/cpp/bindings/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+third_party/WebKit/Source/wtf",
-]
diff --git a/mojo/public/cpp/bindings/README.md b/mojo/public/cpp/bindings/README.md
deleted file mode 100644
index b37267a..0000000
--- a/mojo/public/cpp/bindings/README.md
+++ /dev/null
@@ -1,1231 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo C++ Bindings API
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-The Mojo C++ Bindings API leverages the
-[C++ System API](/mojo/public/cpp/system) to provide a more natural set of
-primitives for communicating over Mojo message pipes. Combined with generated
-code from the [Mojom IDL and bindings generator](/mojo/public/tools/bindings),
-users can easily connect interface clients and implementations across arbitrary
-intra- and inter-process bounaries.
-
-This document provides a detailed guide to bindings API usage with example code
-snippets. For a detailed API references please consult the headers in
-[//mojo/public/cpp/bindings](https://cs.chromium.org/chromium/src/mojo/public/cpp/bindings/).
-
-## Getting Started
-
-When a Mojom IDL file is processed by the bindings generator, C++ code is
-emitted in a series of `.h` and `.cc` files with names based on the input
-`.mojom` file. Suppose we create the following Mojom file at
-`//services/db/public/interfaces/db.mojom`:
-
-```
-module db.mojom;
-
-interface Table {
-  AddRow(int32 key, string data);
-};
-
-interface Database {
-  CreateTable(Table& table);
-};
-```
-
-And a GN target to generate the bindings in
-`//services/db/public/interfaces/BUILD.gn`:
-
-```
-import("//mojo/public/tools/bindings/mojom.gni")
-
-mojom("interfaces") {
-  sources = [
-    "db.mojom",
-  ]
-}
-```
-
-If we then build this target:
-
-```
-ninja -C out/r services/db/public/interfaces
-```
-
-This will produce several generated source files, some of which are relevant to
-C++ bindings. Two of these files are:
-
-```
-out/gen/services/business/public/interfaces/factory.mojom.cc
-out/gen/services/business/public/interfaces/factory.mojom.h
-```
-
-You can include the above generated header in your sources in order to use the
-definitions therein:
-
-``` cpp
-#include "services/business/public/interfaces/factory.mojom.h"
-
-class TableImpl : public db::mojom::Table {
-  // ...
-};
-```
-
-This document covers the different kinds of definitions generated by Mojom IDL
-for C++ consumers and how they can effectively be used to communicate across
-message pipes.
-
-*** note
-**NOTE:** Using C++ bindings from within Blink code is typically subject to
-special constraints which require the use of a different generated header.
-For details, see [Blink Type Mapping](#Blink-Type-Mapping).
-***
-
-## Interfaces
-
-Mojom IDL interfaces are translated to corresponding C++ (pure virtual) class
-interface definitions in the generated header, consisting of a single generated
-method signature for each request message on the interface. Internally there is
-also generated code for serialization and deserialization of messages, but this
-detail is hidden from bindings consumers.
-
-### Basic Usage
-
-Let's consider a new `//sample/logger.mojom` to define a simple logging
-interface which clients can use to log simple string messages:
-
-``` cpp
-module sample.mojom;
-
-interface Logger {
-  Log(string message);
-};
-```
-
-Running this through the bindings generator will produce a `logging.mojom.h`
-with the following definitions (modulo unimportant details):
-
-``` cpp
-namespace sample {
-namespace mojom {
-
-class Logger {
-  virtual ~Logger() {}
-
-  virtual void Log(const std::string& message) = 0;
-};
-
-using LoggerPtr = mojo::InterfacePtr<Logger>;
-using LoggerRequest = mojo::InterfaceRequest<Logger>;
-
-}  // namespace mojom
-}  // namespace sample
-```
-
-Makes sense. Let's take a closer look at those type aliases at the end.
-
-### InterfacePtr and InterfaceRequest
-
-You will notice the type aliases for `LoggerPtr` and
-`LoggerRequest` are using two of the most fundamental template types in the C++
-bindings library: **`InterfacePtr<T>`** and **`InterfaceRequest<T>`**.
-
-In the world of Mojo bindings libraries these are effectively strongly-typed
-message pipe endpoints. If an `InterfacePtr<T>` is bound to a message pipe
-endpoint, it can be dereferenced to make calls on an opaque `T` interface. These
-calls immediately serialize their arguments (using generated code) and write a
-corresponding message to the pipe.
-
-An `InterfaceRequest<T>` is essentially just a typed container to hold the other
-end of an `InterfacePtr<T>`'s pipe -- the receiving end -- until it can be
-routed to some implementation which will **bind** it. The `InterfaceRequest<T>`
-doesn't actually *do* anything other than hold onto a pipe endpoint and carry
-useful compile-time type information.
-
-![Diagram illustrating InterfacePtr and InterfaceRequest on either end of a message pipe](https://docs.google.com/drawings/d/17d5gvErbQ6DthEBMS7I1WhCh9bz0n12pvNjydzuRfTI/pub?w=600&h=100)
-
-So how do we create a strongly-typed message pipe?
-
-### Creating Interface Pipes
-
-One way to do this is by manually creating a pipe and binding each end:
-
-``` cpp
-#include "sample/logger.mojom.h"
-
-mojo::MessagePipe pipe;
-sample::mojom::LoggerPtr logger;
-sample::mojom::LoggerRequest request;
-
-logger.Bind(sample::mojom::LoggerPtrInfo(std::move(pipe.handle0), 0u));
-request.Bind(std::move(pipe.handle1));
-```
-
-That's pretty verbose, but the C++ Bindings library provides more convenient
-ways to accomplish the same thing. [interface_request.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/bindings/interface_request.h)
-defines a `MakeRequest` function:
-
-``` cpp
-sample::mojom::LoggerPtr logger;
-sample::mojom::LoggerRequest request = mojo::MakeRequest(&logger);
-```
-
-and the `InterfaceRequest<T>` constructor can also take an explicit
-`InterfacePtr<T>*` output argument:
-
-``` cpp
-sample::mojom::LoggerPtr logger;
-sample::mojom::LoggerRequest request(&logger);
-```
-
-Both of these last two snippets are equivalent to the first one.
-
-*** note
-**NOTE:** In the first example above you may notice usage of the `LoggerPtrInfo`
-type, which is a generated alias for `mojo::InterfacePtrInfo<Logger>`. This is
-similar to an `InterfaceRequest<T>` in that it merely holds onto a pipe handle
-and cannot actually read or write messages on the pipe. Both this type and
-`InterfaceRequest<T>` are safe to move freely from thread to thread, whereas a
-bound `InterfacePtr<T>` is bound to a single thread.
-
-An `InterfacePtr<T>` may be unbound by calling its `PassInterface()` method,
-which returns a new `InterfacePtrInfo<T>`. Conversely, an `InterfacePtr<T>` may
-bind (and thus take ownership of) an `InterfacePtrInfo<T>` so that interface
-calls can be made on the pipe.
-
-The thread-bound nature of `InterfacePtr<T>` is necessary to support safe
-dispatch of its [message responses](#Receiving-Responses) and
-[connection error notifications](#Connection-Errors).
-***
-
-Once the `LoggerPtr` is bound we can immediately begin calling `Logger`
-interface methods on it, which will immediately write messages into the pipe.
-These messages will stay queued on the receiving end of the pipe until someone
-binds to it and starts reading them.
-
-``` cpp
-logger->Log("Hello!");
-```
-
-This actually writes a `Log` message to the pipe.
-
-![Diagram illustrating a message traveling on a pipe from LoggerPtr to LoggerRequest](https://docs.google.com/a/google.com/drawings/d/1jWEc6jJIP2ed77Gg4JJ3EVC7hvnwcImNqQJywFwpT8g/pub?w=648&h=123)
-
-But as mentioned above, `InterfaceRequest` *doesn't actually do anything*, so
-that message will just sit on the pipe forever. We need a way to read messages
-off the other end of the pipe and dispatch them. We have to
-**bind the interface request**.
-
-### Binding an Interface Request
-
-There are many different helper classes in the bindings library for binding the
-receiving end of a message pipe. The most primitive among them is the aptly
-named `mojo::Binding<T>`. A `mojo::Binding<T>` bridges an implementation of `T`
-with a single bound message pipe endpoint (via a `mojo::InterfaceRequest<T>`),
-which it continuously watches for readability.
-
-Any time the bound pipe becomes readable, the `Binding` will schedule a task to
-read, deserialize (using generated code), and dispatch all available messages to
-the bound `T` implementation. Below is a sample implementation of the `Logger`
-interface. Notice that the implementation itself owns a `mojo::Binding`. This is
-a common pattern, since a bound implementation must outlive any `mojo::Binding`
-which binds it.
-
-``` cpp
-#include "base/logging.h"
-#include "base/macros.h"
-#include "sample/logger.mojom.h"
-
-class LoggerImpl : public sample::mojom::Logger {
- public:
-  // NOTE: A common pattern for interface implementations which have one
-  // instance per client is to take an InterfaceRequest in the constructor.
-
-  explicit LoggerImpl(sample::mojom::LoggerRequest request)
-      : binding_(this, std::move(request)) {}
-  ~Logger() override {}
-
-  // sample::mojom::Logger:
-  void Log(const std::string& message) override {
-    LOG(ERROR) << "[Logger] " << message;
-  }
-
- private:
-  mojo::Binding<sample::mojom::Logger> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(LoggerImpl);
-};
-```
-
-Now we can construct a `LoggerImpl` over our pending `LoggerRequest`, and the
-previously queued `Log` message will be dispatched ASAP on the `LoggerImpl`'s
-thread:
-
-``` cpp
-LoggerImpl impl(std::move(request));
-```
-
-The diagram below illustrates the following sequence of events, all set in
-motion by the above line of code:
-
-1. The `LoggerImpl` constructor is called, passing the `LoggerRequest` along
-   to the `Binding`.
-2. The `Binding` takes ownership of the `LoggerRequest`'s pipe endpoint and
-   begins watching it for readability. The pipe is readable immediately, so a
-   task is scheduled to read the pending `Log` message from the pipe ASAP.
-3. The `Log` message is read and deserialized, causing the `Binding` to invoke
-   the `Logger::Log` implementation on its bound `LoggerImpl`.
-
-![Diagram illustrating the progression of binding a request, reading a pending message, and dispatching it](https://docs.google.com/drawings/d/1c73-PegT4lmjfHoxhWrHTQXRvzxgb0wdeBa35WBwZ3Q/pub?w=550&h=500)
-
-As a result, our implementation will eventually log the client's `"Hello!"`
-message via `LOG(ERROR)`.
-
-*** note
-**NOTE:** Messages will only be read and dispatched from a pipe as long as the
-object which binds it (*i.e.* the `mojo::Binding` in the above example) remains
-alive.
-***
-
-### Receiving Responses
-
-Some Mojom interface methods expect a response. Suppose we modify our `Logger`
-interface so that the last logged line can be queried like so:
-
-``` cpp
-module sample.mojom;
-
-interface Logger {
-  Log(string message);
-  GetTail() => (string message);
-};
-```
-
-The generated C++ interface will now look like:
-
-``` cpp
-namespace sample {
-namespace mojom {
-
-class Logger {
- public:
-  virtual ~Logger() {}
-
-  virtual void Log(const std::string& message) = 0;
-
-  using GetTailCallback = base::Callback<void(const std::string& message)>;
-
-  virtual void GetTail(const GetTailCallback& callback) = 0;
-}
-
-}  // namespace mojom
-}  // namespace sample
-```
-
-As before, both clients and implementations of this interface use the same
-signature for the `GetTail` method: implementations use the `callback` argument
-to *respond* to the request, while clients pass a `callback` argument to
-asynchronously `receive` the response. Here's an updated implementation:
-
-```cpp
-class LoggerImpl : public sample::mojom::Logger {
- public:
-  // NOTE: A common pattern for interface implementations which have one
-  // instance per client is to take an InterfaceRequest in the constructor.
-
-  explicit LoggerImpl(sample::mojom::LoggerRequest request)
-      : binding_(this, std::move(request)) {}
-  ~Logger() override {}
-
-  // sample::mojom::Logger:
-  void Log(const std::string& message) override {
-    LOG(ERROR) << "[Logger] " << message;
-    lines_.push_back(message);
-  }
-
-  void GetTail(const GetTailCallback& callback) override {
-    callback.Run(lines_.back());
-  }
-
- private:
-  mojo::Binding<sample::mojom::Logger> binding_;
-  std::vector<std::string> lines_;
-
-  DISALLOW_COPY_AND_ASSIGN(LoggerImpl);
-};
-```
-
-And an updated client call:
-
-``` cpp
-void OnGetTail(const std::string& message) {
-  LOG(ERROR) << "Tail was: " << message;
-}
-
-logger->GetTail(base::Bind(&OnGetTail));
-```
-
-Behind the scenes, the implementation-side callback is actually serializing the
-response arguments and writing them onto the pipe for delivery back to the
-client. Meanwhile the client-side callback is invoked by some internal logic
-which watches the pipe for an incoming response message, reads and deserializes
-it once it arrives, and then invokes the callback with the deserialized
-parameters.
-
-### Connection Errors
-
-If there are no remaining messages available on a pipe and the remote end has
-been closed, a connection error will be triggered on the local end. Connection
-errors may also be triggered by automatic forced local pipe closure due to
-*e.g.* a validation error when processing a received message.
-
-Regardless of the underlying cause, when a connection error is encountered on
-a binding endpoint, that endpoint's **connection error handler** (if set) is
-invoked. This handler is a simple `base::Closure` and may only be invoked
-*once* as long as the endpoint is bound to the same pipe. Typically clients and
-implementations use this handler to do some kind of cleanup or -- particuarly if
-the error was unexpected -- create a new pipe and attempt to establish a new
-connection with it.
-
-All message pipe-binding C++ objects (*e.g.*, `mojo::Binding<T>`,
-`mojo::InterfacePtr<T>`, *etc.*) support setting their connection error handler
-via a `set_connection_error_handler` method.
-
-We can set up another end-to-end `Logger` example to demonstrate error handler
-invocation:
-
-``` cpp
-sample::mojom::LoggerPtr logger;
-LoggerImpl impl(mojo::MakeRequest(&logger));
-impl.set_connection_error_handler(base::Bind([] { LOG(ERROR) << "Bye."; }));
-logger->Log("OK cool");
-logger.reset();  // Closes the client end.
-```
-
-As long as `impl` stays alive here, it will eventually receive the `Log` message
-followed immediately by an invocation of the bound callback which outputs
-`"Bye."`. Like all other bindings callbacks, a connection error handler will
-**never** be invoked once its corresponding binding object has been destroyed.
-
-In fact, suppose instead that `LoggerImpl` had set up the following error
-handler within its constructor:
-
-``` cpp
-LoggerImpl::LoggerImpl(sample::mojom::LoggerRequest request)
-    : binding_(this, std::move(request)) {
-  binding_.set_connection_error_handler(
-      base::Bind(&LoggerImpl::OnError, base::Unretained(this)));
-}
-
-void LoggerImpl::OnError() {
-  LOG(ERROR) << "Client disconnected! Purging log lines.";
-  lines_.clear();
-}
-```
-
-The use of `base::Unretained` is *safe* because the error handler will never be
-invoked beyond the lifetime of `binding_`, and `this` owns `binding_`.
-
-### A Note About Ordering
-
-As mentioned in the previous section, closing one end of a pipe will eventually
-trigger a connection error on the other end. However it's important to note that
-this event is itself ordered with respect to any other event (*e.g.* writing a
-message) on the pipe.
-
-This means that it's safe to write something contrived like:
-
-``` cpp
-void GoBindALogger(sample::mojom::LoggerRequest request) {
-  LoggerImpl impl(std::move(request));
-  base::RunLoop loop;
-  impl.set_connection_error_handler(loop.QuitClosure());
-  loop.Run();
-}
-
-void LogSomething() {
-  sample::mojom::LoggerPtr logger;
-  bg_thread->task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&GoBindALogger, mojo::MakeRequest(&logger)));
-  logger->Log("OK Computer");
-}
-```
-
-When `logger` goes out of scope it immediately closes its end of the message
-pipe, but the impl-side won't notice this until it receives the sent `Log`
-message. Thus the `impl` above will first log our message and *then* see a
-connection error and break out of the run loop.
-
-### Sending Interfaces Over Interfaces
-
-Now we know how to create interface pipes and use their Ptr and Request
-endpoints in some interesting ways. This still doesn't add up to interesting
-IPC! The bread and butter of Mojo IPC is the ability to transfer interface
-endpoints across other interfaces, so let's take a look at how to accomplish
-that.
-
-#### Sending Interface Requests
-
-Consider a new example Mojom in `//sample/db.mojom`:
-
-``` cpp
-module db.mojom;
-
-interface Table {
-  void AddRow(int32 key, string data);
-};
-
-interface Database {
-  AddTable(Table& table);
-};
-```
-
-As noted in the
-[Mojom IDL documentation](/mojo/public/tools/bindings#Primitive-Types),
-the `Table&` syntax denotes a `Table` interface request. This corresponds
-precisely to the `InterfaceRequest<T>` type discussed in the sections above, and
-in fact the generated code for these interfaces is approximately:
-
-``` cpp
-namespace db {
-namespace mojom {
-
-class Table {
- public:
-  virtual ~Table() {}
-
-  virtual void AddRow(int32_t key, const std::string& data) = 0;
-}
-
-using TablePtr = mojo::InterfacePtr<Table>;
-using TableRequest = mojo::InterfaceRequest<Table>;
-
-class Database {
- public:
-  virtual ~Database() {}
-
-  virtual void AddTable(TableRequest table);
-};
-
-using DatabasePtr = mojo::InterfacePtr<Database>;
-using DatabaseRequest = mojo::InterfaceRequest<Database>;
-
-}  // namespace mojom
-}  // namespace db
-```
-
-We can put this all together now with an implementation of `Table` and
-`Database`:
-
-``` cpp
-#include "sample/db.mojom.h"
-
-class TableImpl : public db::mojom:Table {
- public:
-  explicit TableImpl(db::mojom::TableRequest request)
-      : binding_(this, std::move(request)) {}
-  ~TableImpl() override {}
-
-  // db::mojom::Table:
-  void AddRow(int32_t key, const std::string& data) override {
-    rows_.insert({key, data});
-  }
-
- private:
-  mojo::Binding<db::mojom::Table> binding_;
-  std::map<int32_t, std::string> rows_;
-};
-
-class DatabaseImpl : public db::mojom::Database {
- public:
-  explicit DatabaseImpl(db::mojom::DatabaseRequest request)
-      : binding_(this, std::move(request)) {}
-  ~DatabaseImpl() override {}
-
-  // db::mojom::Database:
-  void AddTable(db::mojom::TableRequest table) {
-    tables_.emplace_back(base::MakeUnique<TableImpl>(std::move(table)));
-  }
-
- private:
-  mojo::Binding<db::mojom::Database> binding_;
-  std::vector<std::unique_ptr<TableImpl>> tables_;
-};
-```
-
-Pretty straightforward. The `Table&` Mojom paramter to `AddTable` translates to
-a C++ `db::mojom::TableRequest`, aliased from
-`mojo::InterfaceRequest<db::mojom::Table>`, which we know is just a
-strongly-typed message pipe handle. When `DatabaseImpl` gets an `AddTable` call,
-it constructs a new `TableImpl` and binds it to the received `TableRequest`.
-
-Let's see how this can be used.
-
-``` cpp
-db::mojom::DatabasePtr database;
-DatabaseImpl db_impl(mojo::MakeRequest(&database));
-
-db::mojom::TablePtr table1, table2;
-database->AddTable(mojo::MakeRequest(&table1));
-database->AddTable(mojo::MakeRequest(&table2));
-
-table1->AddRow(1, "hiiiiiiii");
-table2->AddRow(2, "heyyyyyy");
-```
-
-Notice that we can again start using the new `Table` pipes immediately, even
-while their `TableRequest` endpoints are still in transit.
-
-#### Sending InterfacePtrs
-
-Of course we can also send `InterfacePtr`s:
-
-``` cpp
-interface TableListener {
-  OnRowAdded(int32 key, string data);
-};
-
-interface Table {
-  AddRow(int32 key, string data);
-
-  AddListener(TableListener listener);
-};
-```
-
-This would generate a `Table::AddListener` signature like so:
-
-``` cpp
-  virtual void AddListener(TableListenerPtr listener) = 0;
-```
-
-and this could be used like so:
-
-``` cpp
-db::mojom::TableListenerPtr listener;
-TableListenerImpl impl(mojo::MakeRequest(&listener));
-table->AddListener(std::move(listener));
-```
-
-## Other Interface Binding Types
-
-The [Interfaces](#Interfaces) section above covers basic usage of the most
-common bindings object types: `InterfacePtr`, `InterfaceRequest`, and `Binding`.
-While these types are probably the most commonly used in practice, there are
-several other ways of binding both client- and implementation-side interface
-pipes.
-
-### Strong Bindings
-
-A **strong binding** exists as a standalone object which owns its interface
-implementation and automatically cleans itself up when its bound interface
-endpoint detects an error. The
-[**`MakeStrongBinding`**](https://cs.chromim.org/chromium/src//mojo/public/cpp/bindings/strong_binding.h)
-function is used to create such a binding.
-.
-
-``` cpp
-class LoggerImpl : public sample::mojom::Logger {
- public:
-  LoggerImpl() {}
-  ~LoggerImpl() override {}
-
-  // sample::mojom::Logger:
-  void Log(const std::string& message) override {
-    LOG(ERROR) << "[Logger] " << message;
-  }
-
- private:
-  // NOTE: This doesn't own any Binding object!
-};
-
-db::mojom::LoggerPtr logger;
-mojo::MakeStrongBinding(base::MakeUnique<DatabaseImpl>(),
-                        mojo::MakeRequest(&logger));
-
-logger->Log("NOM NOM NOM MESSAGES");
-```
-
-Now as long as `logger` remains open somewhere in the system, the bound
-`DatabaseImpl` on the other end will remain alive.
-
-### Binding Sets
-
-Sometimes it's useful to share a single implementation instance with multiple
-clients. [**`BindingSet`**](https://cs.chromium.org/chromium/src/mojo/public/cpp/bindings/binding_set.h)
-makes this easy. Consider the Mojom:
-
-``` cpp
-module system.mojom;
-
-interface Logger {
-  Log(string message);
-};
-
-interface LoggerProvider {
-  GetLogger(Logger& logger);
-};
-```
-
-We can use `BindingSet` to bind multiple `Logger` requests to a single
-implementation instance:
-
-``` cpp
-class LogManager : public system::mojom::LoggerProvider,
-                   public system::mojom::Logger {
- public:
-  explicit LogManager(system::mojom::LoggerProviderRequest request)
-      : provider_binding_(this, std::move(request)) {}
-  ~LogManager() {}
-
-  // system::mojom::LoggerProvider:
-  void GetLogger(LoggerRequest request) override {
-    logger_bindings_.AddBinding(this, std::move(request));
-  }
-
-  // system::mojom::Logger:
-  void Log(const std::string& message) override {
-    LOG(ERROR) << "[Logger] " << message;
-  }
-
- private:
-  mojo::Binding<system::mojom::LoggerProvider> provider_binding_;
-  mojo::BindingSet<system::mojom::Logger> logger_bindings_;
-};
-
-```
-
-
-### InterfacePtr Sets
-
-Similar to the `BindingSet` above, sometimes it's useful to maintain a set of
-`InterfacePtr`s for *e.g.* a set of clients observing some event.
-[**`InterfacePtrSet`**](https://cs.chromium.org/chromium/src/mojo/public/cpp/bindings/interface_ptr_set.h)
-is here to help. Take the Mojom:
-
-``` cpp
-module db.mojom;
-
-interface TableListener {
-  OnRowAdded(int32 key, string data);
-};
-
-interface Table {
-  AddRow(int32 key, string data);
-  AddListener(TableListener listener);
-};
-```
-
-An implementation of `Table` might look something like like this:
-
-``` cpp
-class TableImpl : public db::mojom::Table {
- public:
-  TableImpl() {}
-  ~TableImpl() override {}
-
-  // db::mojom::Table:
-  void AddRow(int32_t key, const std::string& data) override {
-    rows_.insert({key, data});
-    listeners_.ForEach([key, &data](db::mojom::TableListener* listener) {
-      listener->OnRowAdded(key, data);
-    });
-  }
-
-  void AddListener(db::mojom::TableListenerPtr listener) {
-    listeners_.AddPtr(std::move(listener));
-  }
-
- private:
-  mojo::InterfacePtrSet<db::mojom::Table> listeners_;
-  std::map<int32_t, std::string> rows_;
-};
-```
-
-## Associated Interfaces
-
-See [this document](https://www.chromium.org/developers/design-documents/mojo/associated-interfaces).
-
-TODO: Move the above doc into the repository markdown docs.
-
-## Synchronous Calls
-
-See [this document](https://www.chromium.org/developers/design-documents/mojo/synchronous-calls)
-
-TODO: Move the above doc into the repository markdown docs.
-
-## Type Mapping
-
-In many instances you might prefer that your generated C++ bindings use a more
-natural type to represent certain Mojom types in your interface methods. For one
-example consider a Mojom struct such as the `Rect` below:
-
-``` cpp
-module gfx.mojom;
-
-struct Rect {
-  int32 x;
-  int32 y;
-  int32 width;
-  int32 height;
-};
-
-interface Canvas {
-  void FillRect(Rect rect);
-};
-```
-
-The `Canvas` Mojom interface would normally generate a C++ interface like:
-
-``` cpp
-class Canvas {
- public:
-  virtual void FillRect(RectPtr rect) = 0;
-};
-```
-
-However, the Chromium tree already defines a native
-[`gfx::Rect`](https://cs.chromium.org/chromium/src/ui/gfx/geometry/rect.h) which
-is equivalent in meaning but which also has useful helper methods. Instead of
-manually converting between a `gfx::Rect` and the Mojom-generated `RectPtr` at
-every message boundary, wouldn't it be nice if the Mojom bindings generator
-could instead generate:
-
-``` cpp
-class Canvas {
- public:
-  virtual void FillRect(const gfx::Rect& rect) = 0;
-}
-```
-
-The correct answer is, "Yes! That would be nice!" And fortunately, it can!
-
-### Global Configuration
-
-While this feature is quite powerful, it introduces some unavoidable complexity
-into build system. This stems from the fact that type-mapping is an inherently
-viral concept: if `gfx::mojom::Rect` is mapped to `gfx::Rect` anywhere, the
-mapping needs to apply *everywhere*.
-
-For this reason we have a few global typemap configurations defined in
-[chromium_bindings_configuration.gni](https://cs.chromium.com/chromium/src/mojo/public/tools/bindings/chromium_bindings_configuration.gni)
-and
-[blink_bindings_configuration.gni](https://cs.chromium.com/chromium/src/mojo/public/tools/bindings/blink_bindings_configuration.gni). These configure the two supported [variants](#Variants) of Mojom generated
-bindings in the repository. Read more on this in the sections that follow.
-
-For now, let's take a look at how to express the mapping from `gfx::mojom::Rect`
-to `gfx::Rect`.
-
-### Defining `StructTraits`
-
-In order to teach generated bindings code how to serialize an arbitrary native
-type `T` as an arbitrary Mojom type `mojom::U`, we need to define an appropriate
-specialization of the
-[`mojo::StructTraits`](https://cs.chromium.org/chromium/src/mojo/public/cpp/bindings/struct_traits.h)
-template.
-
-A valid specialization of `StructTraits` MUST define the following static
-methods:
-
-* A single static accessor for every field of the Mojom struct, with the exact
-  same name as the struct field. These accessors must all take a const ref to
-  an object of the native type, and must return a value compatible with the
-  Mojom struct field's type. This is used to safely and consistently extract
-  data from the native type during message serialization without incurring extra
-  copying costs.
-
-* A single static `Read` method which initializes an instance of the the native
-  type given a serialized representation of the Mojom struct. The `Read` method
-  must return a `bool` to indicate whether the incoming data is accepted
-  (`true`) or rejected (`false`).
-
-There are other methods a `StructTraits` specialization may define to satisfy
-some less common requirements. See
-[Advanced StructTraits Usage](#Advanced-StructTraits-Usage) for details.
-
-In order to define the mapping for `gfx::Rect`, we want the following
-`StructTraits` specialization, which we'll define in
-`//ui/gfx/geometry/mojo/geometry_struct_traits.h`:
-
-``` cpp
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/mojo/geometry.mojom.h"
-
-namespace mojo {
-
-template <>
-class StructTraits<gfx::mojom::RectDataView, gfx::Rect> {
- public:
-  static int32_t x(const gfx::Rect& r) { return r.x(); }
-  static int32_t y(const gfx::Rect& r) { return r.y(); }
-  static int32_t width(const gfx::Rect& r) { return r.width(); }
-  static int32_t height(const gfx::Rect& r) { return r.height(); }
-
-  static bool Read(gfx::mojom::RectDataView data, gfx::Rect* out_rect);
-};
-
-}  // namespace mojo
-```
-
-And in `//ui/gfx/geometry/mojo/geometry_struct_traits.cc`:
-
-``` cpp
-#include "ui/gfx/geometry/mojo/geometry_struct_traits.h"
-
-namespace mojo {
-
-// static
-template <>
-bool StructTraits<gfx::mojom::RectDataView, gfx::Rect>::Read(
-    gfx::mojom::RectDataView data,
-  gfx::Rect* out_rect) {
-  if (data.width() < 0 || data.height() < 0)
-    return false;
-
-  out_rect->SetRect(data.x(), data.y(), data.width(), data.height());
-  return true;
-};
-
-}  // namespace mojo
-```
-
-Note that the `Read()` method returns `false` if either the incoming `width` or
-`height` fields are negative. This acts as a validation step during
-deserialization: if a client sends a `gfx::Rect` with a negative width or
-height, its message will be rejected and the pipe will be closed. In this way,
-type mapping can serve to enable custom validation logic in addition to making
-callsites and interface implemention more convenient.
-
-### Enabling a New Type Mapping
-
-We've defined the `StructTraits` necessary, but we still need to teach the
-bindings generator (and hence the build system) about the mapping. To do this we
-must create a **typemap** file, which uses familiar GN syntax to describe the
-new type mapping.
-
-Let's place this `geometry.typemap` file alongside our Mojom file:
-
-```
-mojom = "//ui/gfx/geometry/mojo/geometry.mojom"
-public_headers = [ "//ui/gfx/geometry/rect.h" ]
-traits_headers = [ "//ui/gfx/geometry/mojo/geometry_struct_traits.h" ]
-sources = [ "//ui/gfx/geometry/mojo/geometry_struct_traits.cc" ]
-public_deps = [ "//ui/gfx/geometry" ]
-type_mappings = [
-  "gfx.mojom.Rect=gfx::Rect",
-]
-```
-
-Let's look at each of the variables above:
-
-* `mojom`: Specifies the `mojom` file to which the typemap applies. Many
-  typemaps may apply to the same `mojom` file, but any given typemap may only
-  apply to a single `mojom` file.
-* `public_headers`: Additional headers required by any code which would depend
-  on the Mojom definition of `gfx.mojom.Rect` now that the typemap is applied.
-  Any headers required for the native target type definition should be listed
-  here.
-* `traits_headers`: Headers which contain the relevant `StructTraits`
-  specialization(s) for any type mappings described by this file.
-* `sources`: Any private implementation sources needed for the `StructTraits`
-  definition.
-* `public_deps`: Target dependencies exposed by the `public_headers` and
-  `traits_headers`.
-* `deps`: Target dependencies exposed by `sources` but not already covered by
-  `public_deps`.
-* `type_mappings`: A list of type mappings to be applied for this typemap. The
-  strings in this list are of the format `"MojomType=CppType"`, where
-  `MojomType` must be a fully qualified Mojom typename and `CppType` must be a
-  fully qualified C++ typename. Additional attributes may be specified in square
-  brackets following the `CppType`:
-    * `move_only`: The `CppType` is move-only and should be passed by value
-      in any generated method signatures. Note that `move_only` is transitive,
-      so containers of `MojomType` will translate to containers of `CppType`
-      also passed by value.
-    * `copyable_pass_by_value`: Forces values of type `CppType` to be passed by
-      value without moving them. Unlike `move_only`, this is not transitive.
-    * `nullable_is_same_type`: By default a non-nullable `MojomType` will be
-      mapped to `CppType` while a nullable `MojomType?` will be mapped to
-      `base::Optional<CppType>`. If this attribute is set, the `base::Optional`
-      wrapper is omitted for nullable `MojomType?` values, but the
-      `StructTraits` definition for this type mapping must define additional
-      `IsNull` and `SetToNull` methods. See
-      [Specializing Nullability](#Specializing-Nullability) below.
-
-
-Now that we have the typemap file we need to add it to a local list of typemaps
-that can be added to the global configuration. We create a new
-`//ui/gfx/typemaps.gni` file with the following contents:
-
-```
-typemaps = [
-  "//ui/gfx/geometry/mojo/geometry.typemap",
-]
-```
-
-And finally we can reference this file in the global default (Chromium) bindings
-configuration by adding it to `_typemap_imports` in
-[chromium_bindings_configuration.gni](https://cs.chromium.com/chromium/src/mojo/public/tools/bindings/chromium_bindings_configuration.gni):
-
-```
-_typemap_imports = [
-  ...,
-  "//ui/gfx/typemaps.gni",
-  ...,
-]
-```
-
-### StructTraits Reference
-
-Each of a `StructTraits` specialization's static getter methods -- one per
-struct field -- must return a type which can be used as a data source for the
-field during serialization. This is a quick reference mapping Mojom field type
-to valid getter return types:
-
-| Mojom Field Type             | C++ Getter Return Type |
-|------------------------------|------------------------|
-| `bool`                       | `bool`
-| `int8`                       | `int8_t`
-| `uint8`                      | `uint8_t`
-| `int16`                      | `int16_t`
-| `uint16`                     | `uint16_t`
-| `int32`                      | `int32_t`
-| `uint32`                     | `uint32_t`
-| `int64`                      | `int64_t`
-| `uint64`                     | `uint64_t`
-| `float`                      | `float`
-| `double`                     | `double`
-| `handle`                     | `mojo::ScopedHandle`
-| `handle<message_pipe>`       | `mojo::ScopedMessagePipeHandle`
-| `handle<data_pipe_consumer>` | `mojo::ScopedDataPipeConsumerHandle`
-| `handle<data_pipe_producer>` | `mojo::ScopedDataPipeProducerHandle`
-| `handle<shared_buffer>`      | `mojo::ScopedSharedBufferHandle`
-| `FooInterface`               | `FooInterfacePtr`
-| `FooInterface&`              | `FooInterfaceRequest`
-| `associated FooInterface`    | `FooAssociatedInterfacePtr`
-| `associated FooInterface&`   | `FooAssociatedInterfaceRequest`
-| `string`                     | Value or reference to any type `T` that has a `mojo::StringTraits` specialization defined. By default this includes `std::string`, `base::StringPiece`, and `WTF::String` (Blink).
-| `array<T>`                   | Value or reference to any type `T` that has a `mojo::ArrayTraits` specialization defined. By default this includes `std::vector<T>`, `mojo::CArray<T>`, and `WTF::Vector<T>` (Blink).
-| `map<K, V>`                  | Value or reference to any type `T` that has a `mojo::MapTraits` specialization defined. By default this includes `std::map<T>`, `mojo::unordered_map<T>`, and `WTF::HashMap<T>` (Blink).
-| `FooEnum`                    | Value of any type that has an appropriate `EnumTraits` specialization defined. By default this inlcudes only the generated `FooEnum` type.
-| `FooStruct`                  | Value or reference to any type that has an appropriate `StructTraits` specialization defined. By default this includes only the generated `FooStructPtr` type.
-| `FooUnion`                   | Value of reference to any type that has an appropriate `UnionTraits` specialization defined. By default this includes only the generated `FooUnionPtr` type.
-
-### Using Generated DataView Types
-
-Static `Read` methods on `StructTraits` specializations get a generated
-`FooDataView` argument (such as the `RectDataView` in the example above) which
-exposes a direct view of the serialized Mojom structure within an incoming
-message's contents. In order to make this as easy to work with as possible, the
-generated `FooDataView` types have a generated method corresponding to every
-struct field:
-
-* For POD field types (*e.g.* bools, floats, integers) these are simple accessor
-  methods with names identical to the field name. Hence in the `Rect` example we
-  can access things like `data.x()` and `data.width()`. The return types
-  correspond exactly to the mappings listed in the table above, under
-  [StructTraits Reference](#StructTraits-Reference).
-
-* For handle and interface types (*e.g* `handle` or `FooInterface&`) these
-  are named `TakeFieldName` (for a field named `field_name`) and they return an
-  appropriate move-only handle type by value. The return types correspond
-  exactly to the mappings listed in the table above, under
-  [StructTraits Reference](#StructTraits-Reference).
-
-* For all other field types (*e.g.*, enums, strings, arrays, maps, structs)
-  these are named `ReadFieldName` (for a field named `field_name`) and they
-  return a `bool` (to indicate success or failure in reading). On success they
-  fill their output argument with the deserialized field value. The output
-  argument may be a pointer to any type with an appropriate `StructTraits`
-  specialization defined, as mentioned in the table above, under
-  [StructTraits Reference](#StructTraits-Reference).
-
-An example would be useful here. Suppose we introduced a new Mojom struct:
-
-``` cpp
-struct RectPair {
-  Rect left;
-  Rect right;
-};
-```
-
-and a corresponding C++ type:
-
-``` cpp
-class RectPair {
- public:
-  RectPair() {}
-
-  const gfx::Rect& left() const { return left_; }
-  const gfx::Rect& right() const { return right_; }
-
-  void Set(const gfx::Rect& left, const gfx::Rect& right) {
-    left_ = left;
-    right_ = right;
-  }
-
-  // ... some other stuff
-
- private:
-  gfx::Rect left_;
-  gfx::Rect right_;
-};
-```
-
-Our traits to map `gfx::mojom::RectPair` to `gfx::RectPair` might look like
-this:
-
-``` cpp
-namespace mojo {
-
-template <>
-class StructTraits
- public:
-  static const gfx::Rect& left(const gfx::RectPair& pair) {
-    return pair.left();
-  }
-
-  static const gfx::Rect& right(const gfx::RectPair& pair) {
-    return pair.right();
-  }
-
-  static bool Read(gfx::mojom::RectPairDataView data, gfx::RectPair* out_pair) {
-    gfx::Rect left, right;
-    if (!data.ReadLeft(&left) || !data.ReadRight(&right))
-      return false;
-    out_pair->Set(left, right);
-    return true;
-  }
-}  // namespace mojo
-```
-
-Generated `ReadFoo` methods always convert `multi_word_field_name` fields to
-`ReadMultiWordFieldName` methods.
-
-### Variants
-
-By now you may have noticed that additional C++ sources are generated when a
-Mojom is processed. These exist due to type mapping, and the source files we
-refer to throughout this docuemnt (namely `foo.mojom.cc` and `foo.mojom.h`) are
-really only one **variant** (the *default* or *chromium* variant) of the C++
-bindings for a given Mojom file.
-
-The only other variant currently defined in the tree is the *blink* variant,
-which produces a few additional files:
-
-```
-out/gen/sample/db.mojom-blink.cc
-out/gen/sample/db.mojom-blink.h
-```
-
-These files mirror the definitions in the default variant but with different
-C++ types in place of certain builtin field and parameter types. For example,
-Mojom strings are represented by `WTF::String` instead of `std::string`. To
-avoid symbol collisions, the variant's symbols are nested in an extra inner
-namespace, so Blink consumer of the interface might write something like:
-
-```
-#include "sample/db.mojom-blink.h"
-
-class TableImpl : public db::mojom::blink::Table {
- public:
-  void AddRow(int32_t key, const WTF::String& data) override {
-    // ...
-  }
-};
-```
-
-In addition to using different C++ types for builtin strings, arrays, and maps,
-the global typemap configuration for default and "blink" variants are completely
-separate. To add a typemap for the Blink configuration, you can modify
-[blink_bindings_configuration.gni](https://cs.chromium.org/chromium/src/mojo/public/tools/bindings/blink_bindings_configuration.gni).
-
-All variants share some definitions which are unaffected by differences in the
-type mapping configuration (enums, for example). These definitions are generated
-in *shared* sources:
-
-```
-out/gen/sample/db.mojom-shared.cc
-out/gen/sample/db.mojom-shared.h
-out/gen/sample/db.mojom-shared-internal.h
-```
-
-Including either variant's header (`db.mojom.h` or `db.mojom-blink.h`)
-implicitly includes the shared header, but you have on some occasions wish to
-include *only* the shared header in some instances.
-
-Finally, note that for `mojom` GN targets, there is implicitly a corresponding
-`mojom_{variant}` target defined for any supported bindings configuration. So
-for example if you've defined in `//sample/BUILD.gn`:
-
-```
-import("mojo/public/tools/bindings/mojom.gni")
-
-mojom("interfaces") {
-  sources = [
-    "db.mojom",
-  ]
-}
-```
-
-Code in Blink which wishes to use the generated Blink-variant definitions must
-depend on `"//sample:interfaces_blink"`.
-
-## Versioning Considerations
-
-For general documentation of versioning in the Mojom IDL see
-[Versioning](/mojo/public/tools/bindings#Versioning).
-
-This section briefly discusses some C++-specific considerations relevant to
-versioned Mojom types.
-
-### Querying Interface Versions
-
-`InterfacePtr` defines the following methods to query or assert remote interface
-version:
-
-```cpp
-void QueryVersion(const base::Callback<void(uint32_t)>& callback);
-```
-
-This queries the remote endpoint for the version number of its binding. When a
-response is received `callback` is invoked with the remote version number. Note
-that this value is cached by the `InterfacePtr` instance to avoid redundant
-queries.
-
-```cpp
-void RequireVersion(uint32_t version);
-```
-
-Informs the remote endpoint that a minimum version of `version` is required by
-the client. If the remote endpoint cannot support that version, it will close
-its end of the pipe immediately, preventing any other requests from being
-received.
-
-### Versioned Enums
-
-For convenience, every extensible enum has a generated helper function to
-determine whether a received enum value is known by the implementation's current
-version of the enum definition. For example:
-
-```cpp
-[Extensible]
-enum Department {
-  SALES,
-  DEV,
-  RESEARCH,
-};
-```
-
-generates the function in the same namespace as the generated C++ enum type:
-
-```cpp
-inline bool IsKnownEnumValue(Department value);
-```
-
-### Additional Documentation
-
-[Calling Mojo From Blink](https://www.chromium.org/developers/design-documents/mojo/calling-mojo-from-blink)
-:    A brief overview of what it looks like to use Mojom C++ bindings from
-     within Blink code.
diff --git a/mojo/public/cpp/bindings/array_data_view.h b/mojo/public/cpp/bindings/array_data_view.h
deleted file mode 100644
index d02a884..0000000
--- a/mojo/public/cpp/bindings/array_data_view.h
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_DATA_VIEW_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_DATA_VIEW_H_
-
-#include <type_traits>
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename T, typename EnableType = void>
-class ArrayDataViewImpl;
-
-template <typename T>
-class ArrayDataViewImpl<
-    T,
-    typename std::enable_if<
-        BelongsTo<T, MojomTypeCategory::POD>::value>::type> {
- public:
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  T operator[](size_t index) const { return data_->at(index); }
-
-  const T* data() const { return data_->storage(); }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-template <typename T>
-class ArrayDataViewImpl<
-    T,
-    typename std::enable_if<
-        BelongsTo<T, MojomTypeCategory::BOOLEAN>::value>::type> {
- public:
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  bool operator[](size_t index) const { return data_->at(index); }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-template <typename T>
-class ArrayDataViewImpl<
-    T,
-    typename std::enable_if<
-        BelongsTo<T, MojomTypeCategory::ENUM>::value>::type> {
- public:
-  static_assert(sizeof(T) == sizeof(int32_t), "Unexpected enum size");
-
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  T operator[](size_t index) const { return static_cast<T>(data_->at(index)); }
-
-  const T* data() const { return reinterpret_cast<const T*>(data_->storage()); }
-
-  template <typename U>
-  bool Read(size_t index, U* output) {
-    return Deserialize<T>(data_->at(index), output);
-  }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-template <typename T>
-class ArrayDataViewImpl<
-    T,
-    typename std::enable_if<
-        BelongsTo<T,
-                  MojomTypeCategory::ASSOCIATED_INTERFACE |
-                      MojomTypeCategory::ASSOCIATED_INTERFACE_REQUEST |
-                      MojomTypeCategory::INTERFACE |
-                      MojomTypeCategory::INTERFACE_REQUEST>::value>::type> {
- public:
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  template <typename U>
-  U Take(size_t index) {
-    U result;
-    bool ret = Deserialize<T>(&data_->at(index), &result, context_);
-    DCHECK(ret);
-    return result;
-  }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-template <typename T>
-class ArrayDataViewImpl<
-    T,
-    typename std::enable_if<
-        BelongsTo<T, MojomTypeCategory::HANDLE>::value>::type> {
- public:
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  T Take(size_t index) {
-    T result;
-    bool ret = Deserialize<T>(&data_->at(index), &result, context_);
-    DCHECK(ret);
-    return result;
-  }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-template <typename T>
-class ArrayDataViewImpl<T,
-                        typename std::enable_if<BelongsTo<
-                            T,
-                            MojomTypeCategory::ARRAY | MojomTypeCategory::MAP |
-                                MojomTypeCategory::STRING |
-                                MojomTypeCategory::STRUCT>::value>::type> {
- public:
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  void GetDataView(size_t index, T* output) {
-    *output = T(data_->at(index).Get(), context_);
-  }
-
-  template <typename U>
-  bool Read(size_t index, U* output) {
-    return Deserialize<T>(data_->at(index).Get(), output, context_);
-  }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-template <typename T>
-class ArrayDataViewImpl<
-    T,
-    typename std::enable_if<
-        BelongsTo<T, MojomTypeCategory::UNION>::value>::type> {
- public:
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  void GetDataView(size_t index, T* output) {
-    *output = T(&data_->at(index), context_);
-  }
-
-  template <typename U>
-  bool Read(size_t index, U* output) {
-    return Deserialize<T>(&data_->at(index), output, context_);
-  }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-}  // namespace internal
-
-template <typename K, typename V>
-class MapDataView;
-
-template <typename T>
-class ArrayDataView : public internal::ArrayDataViewImpl<T> {
- public:
-  using Element = T;
-  using Data_ = typename internal::ArrayDataViewImpl<T>::Data_;
-
-  ArrayDataView() : internal::ArrayDataViewImpl<T>(nullptr, nullptr) {}
-
-  ArrayDataView(Data_* data, internal::SerializationContext* context)
-      : internal::ArrayDataViewImpl<T>(data, context) {}
-
-  bool is_null() const { return !this->data_; }
-
-  size_t size() const { return this->data_->size(); }
-
-  // Methods to access elements are different for different element types. They
-  // are inherited from internal::ArrayDataViewImpl:
-
-  // POD types except boolean and enums:
-  //   T operator[](size_t index) const;
-  //   const T* data() const;
-
-  // Boolean:
-  //   bool operator[](size_t index) const;
-
-  // Enums:
-  //   T operator[](size_t index) const;
-  //   const T* data() const;
-  //   template <typename U>
-  //   bool Read(size_t index, U* output);
-
-  // Handles:
-  //   T Take(size_t index);
-
-  // Interfaces:
-  //   template <typename U>
-  //   U Take(size_t index);
-
-  // Object types:
-  //   void GetDataView(size_t index, T* output);
-  //   template <typename U>
-  //   bool Read(size_t index, U* output);
-
- private:
-  template <typename K, typename V>
-  friend class MapDataView;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_DATA_VIEW_H_
diff --git a/mojo/public/cpp/bindings/array_traits.h b/mojo/public/cpp/bindings/array_traits.h
deleted file mode 100644
index 594b2e0..0000000
--- a/mojo/public/cpp/bindings/array_traits.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_H_
-
-namespace mojo {
-
-// This must be specialized for any type |T| to be serialized/deserialized as
-// a mojom array.
-//
-// Usually you would like to do a partial specialization for a container (e.g.
-// vector) template. Imagine you want to specialize it for Container<>, you need
-// to implement:
-//
-//   template <typename T>
-//   struct ArrayTraits<Container<T>> {
-//     using Element = T;
-//     // These two statements are optional. Use them if you'd like to serialize
-//     // a container that supports iterators but does not support O(1) random
-//     // access and so GetAt(...) would be expensive.
-//     // using Iterator = T::iterator;
-//     // using ConstIterator = T::const_iterator;
-//
-//     // These two methods are optional. Please see comments in struct_traits.h
-//     static bool IsNull(const Container<T>& input);
-//     static void SetToNull(Container<T>* output);
-//
-//     static size_t GetSize(const Container<T>& input);
-//
-//     // These two methods are optional. They are used to access the
-//     // underlying storage of the array to speed up copy of POD types.
-//     static T* GetData(Container<T>& input);
-//     static const T* GetData(const Container<T>& input);
-//
-//     // The following six methods are optional if the GetAt(...) methods are
-//     // implemented. These methods specify how to read the elements of
-//     // Container in some sequential order specified by the iterator.
-//     //
-//     // Acquires an iterator positioned at the first element in the container.
-//     static ConstIterator GetBegin(const Container<T>& input);
-//     static Iterator GetBegin(Container<T>& input);
-//
-//     // Advances |iterator| to the next position within the container.
-//     static void AdvanceIterator(ConstIterator& iterator);
-//     static void AdvanceIterator(Iterator& iterator);
-//
-//     // Returns a reference to the value at the current position of
-//     // |iterator|. Optionally, the ConstIterator version of GetValue can
-//     // return by value instead of by reference if it makes sense for the
-//     // type.
-//     static const T& GetValue(ConstIterator& iterator);
-//     static T& GetValue(Iterator& iterator);
-//
-//     // These two methods are optional if the iterator methods are
-//     // implemented.
-//     static T& GetAt(Container<T>& input, size_t index);
-//     static const T& GetAt(const Container<T>& input, size_t index);
-//
-//     // Returning false results in deserialization failure and causes the
-//     // message pipe receiving it to be disconnected.
-//     static bool Resize(Container<T>& input, size_t size);
-//   };
-//
-template <typename T>
-struct ArrayTraits;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/array_traits_carray.h b/mojo/public/cpp/bindings/array_traits_carray.h
deleted file mode 100644
index 3ff694b..0000000
--- a/mojo/public/cpp/bindings/array_traits_carray.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_CARRAY_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_CARRAY_H_
-
-#include "mojo/public/cpp/bindings/array_traits.h"
-
-namespace mojo {
-
-template <typename T>
-struct CArray {
-  CArray() : size(0), max_size(0), data(nullptr) {}
-  CArray(size_t size, size_t max_size, T* data)
-      : size(size), max_size(max_size), data(data) {}
-  size_t size;
-  const size_t max_size;
-  T* data;
-};
-
-template <typename T>
-struct ConstCArray {
-  ConstCArray() : size(0), data(nullptr) {}
-  ConstCArray(size_t size, const T* data) : size(size), data(data) {}
-  size_t size;
-  const T* data;
-};
-
-template <typename T>
-struct ArrayTraits<CArray<T>> {
-  using Element = T;
-
-  static bool IsNull(const CArray<T>& input) { return !input.data; }
-
-  static void SetToNull(CArray<T>* output) { output->data = nullptr; }
-
-  static size_t GetSize(const CArray<T>& input) { return input.size; }
-
-  static T* GetData(CArray<T>& input) { return input.data; }
-
-  static const T* GetData(const CArray<T>& input) { return input.data; }
-
-  static T& GetAt(CArray<T>& input, size_t index) { return input.data[index]; }
-
-  static const T& GetAt(const CArray<T>& input, size_t index) {
-    return input.data[index];
-  }
-
-  static bool Resize(CArray<T>& input, size_t size) {
-    if (size > input.max_size)
-      return false;
-
-    input.size = size;
-    return true;
-  }
-};
-
-template <typename T>
-struct ArrayTraits<ConstCArray<T>> {
-  using Element = T;
-
-  static bool IsNull(const ConstCArray<T>& input) { return !input.data; }
-
-  static size_t GetSize(const ConstCArray<T>& input) { return input.size; }
-
-  static const T* GetData(const ConstCArray<T>& input) { return input.data; }
-
-  static const T& GetAt(const ConstCArray<T>& input, size_t index) {
-    return input.data[index];
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_CARRAY_H_
diff --git a/mojo/public/cpp/bindings/array_traits_stl.h b/mojo/public/cpp/bindings/array_traits_stl.h
deleted file mode 100644
index dec47bf..0000000
--- a/mojo/public/cpp/bindings/array_traits_stl.h
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_
-
-#include <map>
-#include <set>
-#include <vector>
-
-#include "mojo/public/cpp/bindings/array_traits.h"
-
-namespace mojo {
-
-template <typename T>
-struct ArrayTraits<std::vector<T>> {
-  using Element = T;
-
-  static bool IsNull(const std::vector<T>& input) {
-    // std::vector<> is always converted to non-null mojom array.
-    return false;
-  }
-
-  static void SetToNull(std::vector<T>* output) {
-    // std::vector<> doesn't support null state. Set it to empty instead.
-    output->clear();
-  }
-
-  static size_t GetSize(const std::vector<T>& input) { return input.size(); }
-
-  static T* GetData(std::vector<T>& input) { return input.data(); }
-
-  static const T* GetData(const std::vector<T>& input) { return input.data(); }
-
-  static typename std::vector<T>::reference GetAt(std::vector<T>& input,
-                                                  size_t index) {
-    return input[index];
-  }
-
-  static typename std::vector<T>::const_reference GetAt(
-      const std::vector<T>& input,
-      size_t index) {
-    return input[index];
-  }
-
-  static inline bool Resize(std::vector<T>& input, size_t size) {
-    // Instead of calling std::vector<T>::resize() directly, this is a hack to
-    // make compilers happy. Some compilers (e.g., Mac, Android, Linux MSan)
-    // currently don't allow resizing types like
-    // std::vector<std::vector<MoveOnlyType>>.
-    // Because the deserialization code doesn't care about the original contents
-    // of |input|, we discard them directly.
-    //
-    // The "inline" keyword of this method matters. Without it, we have observed
-    // significant perf regression with some tests on Mac. crbug.com/631415
-    if (input.size() != size) {
-      std::vector<T> temp(size);
-      input.swap(temp);
-    }
-
-    return true;
-  }
-};
-
-// This ArrayTraits specialization is used only for serialization.
-template <typename T>
-struct ArrayTraits<std::set<T>> {
-  using Element = T;
-  using ConstIterator = typename std::set<T>::const_iterator;
-
-  static bool IsNull(const std::set<T>& input) {
-    // std::set<> is always converted to non-null mojom array.
-    return false;
-  }
-
-  static size_t GetSize(const std::set<T>& input) { return input.size(); }
-
-  static ConstIterator GetBegin(const std::set<T>& input) {
-    return input.begin();
-  }
-  static void AdvanceIterator(ConstIterator& iterator) {
-    ++iterator;
-  }
-  static const T& GetValue(ConstIterator& iterator) {
-    return *iterator;
-  }
-};
-
-template <typename K, typename V>
-struct MapValuesArrayView {
-  explicit MapValuesArrayView(const std::map<K, V>& map) : map(map) {}
-  const std::map<K, V>& map;
-};
-
-// Convenience function to create a MapValuesArrayView<> that infers the
-// template arguments from its argument type.
-template <typename K, typename V>
-MapValuesArrayView<K, V> MapValuesToArray(const std::map<K, V>& map) {
-  return MapValuesArrayView<K, V>(map);
-}
-
-// This ArrayTraits specialization is used only for serialization and converts
-// a map<K, V> into an array<V>, discarding the keys.
-template <typename K, typename V>
-struct ArrayTraits<MapValuesArrayView<K, V>> {
-  using Element = V;
-  using ConstIterator = typename std::map<K, V>::const_iterator;
-
-  static bool IsNull(const MapValuesArrayView<K, V>& input) {
-    // std::map<> is always converted to non-null mojom array.
-    return false;
-  }
-
-  static size_t GetSize(const MapValuesArrayView<K, V>& input) {
-    return input.map.size();
-  }
-  static ConstIterator GetBegin(const MapValuesArrayView<K, V>& input) {
-    return input.map.begin();
-  }
-  static void AdvanceIterator(ConstIterator& iterator) { ++iterator; }
-  static const V& GetValue(ConstIterator& iterator) { return iterator->second; }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_
diff --git a/mojo/public/cpp/bindings/array_traits_wtf_vector.h b/mojo/public/cpp/bindings/array_traits_wtf_vector.h
deleted file mode 100644
index 6e20735..0000000
--- a/mojo/public/cpp/bindings/array_traits_wtf_vector.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_WTF_VECTOR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_WTF_VECTOR_H_
-
-#include "mojo/public/cpp/bindings/array_traits.h"
-#include "third_party/WebKit/Source/wtf/Vector.h"
-
-namespace mojo {
-
-template <typename U>
-struct ArrayTraits<WTF::Vector<U>> {
-  using Element = U;
-
-  static bool IsNull(const WTF::Vector<U>& input) {
-    // WTF::Vector<> is always converted to non-null mojom array.
-    return false;
-  }
-
-  static void SetToNull(WTF::Vector<U>* output) {
-    // WTF::Vector<> doesn't support null state. Set it to empty instead.
-    output->clear();
-  }
-
-  static size_t GetSize(const WTF::Vector<U>& input) { return input.size(); }
-
-  static U* GetData(WTF::Vector<U>& input) { return input.data(); }
-
-  static const U* GetData(const WTF::Vector<U>& input) { return input.data(); }
-
-  static U& GetAt(WTF::Vector<U>& input, size_t index) { return input[index]; }
-
-  static const U& GetAt(const WTF::Vector<U>& input, size_t index) {
-    return input[index];
-  }
-
-  static bool Resize(WTF::Vector<U>& input, size_t size) {
-    input.resize(size);
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_WTF_VECTOR_H_
diff --git a/mojo/public/cpp/bindings/associated_binding.h b/mojo/public/cpp/bindings/associated_binding.h
deleted file mode 100644
index 5941166..0000000
--- a/mojo/public/cpp/bindings/associated_binding.h
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_BINDING_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_BINDING_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-
-class MessageReceiver;
-
-// Base class used to factor out code in AssociatedBinding<T> expansions, in
-// particular for Bind().
-class MOJO_CPP_BINDINGS_EXPORT AssociatedBindingBase {
- public:
-  AssociatedBindingBase();
-  ~AssociatedBindingBase();
-
-  // Adds a message filter to be notified of each incoming message before
-  // dispatch. If a filter returns |false| from Accept(), the message is not
-  // dispatched and the pipe is closed. Filters cannot be removed.
-  void AddFilter(std::unique_ptr<MessageReceiver> filter);
-
-  // Closes the associated interface. Puts this object into a state where it can
-  // be rebound.
-  void Close();
-
-  // Similar to the method above, but also specifies a disconnect reason.
-  void CloseWithReason(uint32_t custom_reason, const std::string& description);
-
-  // Sets an error handler that will be called if a connection error occurs.
-  //
-  // This method may only be called after this AssociatedBinding has been bound
-  // to a message pipe. The error handler will be reset when this
-  // AssociatedBinding is unbound or closed.
-  void set_connection_error_handler(const base::Closure& error_handler);
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler);
-
-  // Indicates whether the associated binding has been completed.
-  bool is_bound() const { return !!endpoint_client_; }
-
-  // Sends a message on the underlying message pipe and runs the current
-  // message loop until its response is received. This can be used in tests to
-  // verify that no message was sent on a message pipe in response to some
-  // stimulus.
-  void FlushForTesting();
-
- protected:
-  void BindImpl(ScopedInterfaceEndpointHandle handle,
-                MessageReceiverWithResponderStatus* receiver,
-                std::unique_ptr<MessageReceiver> payload_validator,
-                bool expect_sync_requests,
-                scoped_refptr<base::SingleThreadTaskRunner> runner,
-                uint32_t interface_version);
-
-  std::unique_ptr<InterfaceEndpointClient> endpoint_client_;
-};
-
-// Represents the implementation side of an associated interface. It is similar
-// to Binding, except that it doesn't own a message pipe handle.
-//
-// When you bind this class to a request, optionally you can specify a
-// base::SingleThreadTaskRunner. This task runner must belong to the same
-// thread. It will be used to dispatch incoming method calls and connection
-// error notification. It is useful when you attach multiple task runners to a
-// single thread for the purposes of task scheduling. Please note that incoming
-// synchrounous method calls may not be run from this task runner, when they
-// reenter outgoing synchrounous calls on the same thread.
-template <typename Interface,
-          typename ImplRefTraits = RawPtrImplRefTraits<Interface>>
-class AssociatedBinding : public AssociatedBindingBase {
- public:
-  using ImplPointerType = typename ImplRefTraits::PointerType;
-
-  // Constructs an incomplete associated binding that will use the
-  // implementation |impl|. It may be completed with a subsequent call to the
-  // |Bind| method. Does not take ownership of |impl|, which must outlive this
-  // object.
-  explicit AssociatedBinding(ImplPointerType impl) { stub_.set_sink(impl); }
-
-  // Constructs a completed associated binding of |impl|. The output |ptr_info|
-  // should be sent by another interface. |impl| must outlive this object.
-  AssociatedBinding(ImplPointerType impl,
-                    AssociatedInterfacePtrInfo<Interface>* ptr_info,
-                    scoped_refptr<base::SingleThreadTaskRunner> runner =
-                        base::ThreadTaskRunnerHandle::Get())
-      : AssociatedBinding(std::move(impl)) {
-    Bind(ptr_info, std::move(runner));
-  }
-
-  // Constructs a completed associated binding of |impl|. |impl| must outlive
-  // the binding.
-  AssociatedBinding(ImplPointerType impl,
-                    AssociatedInterfaceRequest<Interface> request,
-                    scoped_refptr<base::SingleThreadTaskRunner> runner =
-                        base::ThreadTaskRunnerHandle::Get())
-      : AssociatedBinding(std::move(impl)) {
-    Bind(std::move(request), std::move(runner));
-  }
-
-  ~AssociatedBinding() {}
-
-  // Creates an associated inteface and sets up this object as the
-  // implementation side. The output |ptr_info| should be sent by another
-  // interface.
-  void Bind(AssociatedInterfacePtrInfo<Interface>* ptr_info,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    auto request = MakeRequest(ptr_info);
-    ptr_info->set_version(Interface::Version_);
-    Bind(std::move(request), std::move(runner));
-  }
-
-  // Sets up this object as the implementation side of an associated interface.
-  void Bind(AssociatedInterfaceRequest<Interface> request,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    BindImpl(request.PassHandle(), &stub_,
-             base::WrapUnique(new typename Interface::RequestValidator_()),
-             Interface::HasSyncMethods_, std::move(runner),
-             Interface::Version_);
-  }
-
-  // Unbinds and returns the associated interface request so it can be
-  // used in another context, such as on another thread or with a different
-  // implementation. Puts this object into a state where it can be rebound.
-  AssociatedInterfaceRequest<Interface> Unbind() {
-    DCHECK(endpoint_client_);
-
-    AssociatedInterfaceRequest<Interface> request;
-    request.Bind(endpoint_client_->PassHandle());
-
-    endpoint_client_.reset();
-
-    return request;
-  }
-
-  // Returns the interface implementation that was previously specified.
-  Interface* impl() { return ImplRefTraits::GetRawPointer(&stub_.sink()); }
-
- private:
-  typename Interface::template Stub_<ImplRefTraits> stub_;
-
-  DISALLOW_COPY_AND_ASSIGN(AssociatedBinding);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_BINDING_H_
diff --git a/mojo/public/cpp/bindings/associated_binding_set.h b/mojo/public/cpp/bindings/associated_binding_set.h
deleted file mode 100644
index 59600c6..0000000
--- a/mojo/public/cpp/bindings/associated_binding_set.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_BINDING_SET_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_BINDING_SET_H_
-
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-
-namespace mojo {
-
-template <typename Interface, typename ImplRefTraits>
-struct BindingSetTraits<AssociatedBinding<Interface, ImplRefTraits>> {
-  using ProxyType = AssociatedInterfacePtr<Interface>;
-  using RequestType = AssociatedInterfaceRequest<Interface>;
-  using BindingType = AssociatedBinding<Interface, ImplRefTraits>;
-  using ImplPointerType = typename BindingType::ImplPointerType;
-};
-
-template <typename Interface, typename ContextType = void>
-using AssociatedBindingSet =
-    BindingSetBase<Interface, AssociatedBinding<Interface>, ContextType>;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_BINDING_SET_H_
diff --git a/mojo/public/cpp/bindings/associated_group.h b/mojo/public/cpp/bindings/associated_group.h
deleted file mode 100644
index 14e78ec..0000000
--- a/mojo/public/cpp/bindings/associated_group.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_H_
-
-#include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-
-class AssociatedGroupController;
-
-// AssociatedGroup refers to all the interface endpoints running at one end of a
-// message pipe.
-// It is thread safe and cheap to make copies.
-class MOJO_CPP_BINDINGS_EXPORT AssociatedGroup {
- public:
-  AssociatedGroup();
-
-  explicit AssociatedGroup(scoped_refptr<AssociatedGroupController> controller);
-
-  explicit AssociatedGroup(const ScopedInterfaceEndpointHandle& handle);
-
-  AssociatedGroup(const AssociatedGroup& other);
-
-  ~AssociatedGroup();
-
-  AssociatedGroup& operator=(const AssociatedGroup& other);
-
-  // The return value of this getter if this object is initialized with a
-  // ScopedInterfaceEndpointHandle:
-  //   - If the handle is invalid, the return value will always be null.
-  //   - If the handle is valid and non-pending, the return value will be
-  //     non-null and remain unchanged even if the handle is later reset.
-  //   - If the handle is pending asssociation, the return value will initially
-  //     be null, change to non-null when/if the handle is associated, and
-  //     remain unchanged ever since.
-  AssociatedGroupController* GetController();
-
- private:
-  base::Callback<AssociatedGroupController*()> controller_getter_;
-  scoped_refptr<AssociatedGroupController> controller_;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_H_
diff --git a/mojo/public/cpp/bindings/associated_group_controller.h b/mojo/public/cpp/bindings/associated_group_controller.h
deleted file mode 100644
index d33c277..0000000
--- a/mojo/public/cpp/bindings/associated_group_controller.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_CONTROLLER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_CONTROLLER_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/disconnect_reason.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-
-class InterfaceEndpointClient;
-class InterfaceEndpointController;
-
-// An internal interface used to manage endpoints within an associated group,
-// which corresponds to one end of a message pipe.
-class MOJO_CPP_BINDINGS_EXPORT AssociatedGroupController
-    : public base::RefCountedThreadSafe<AssociatedGroupController> {
- public:
-  // Associates an interface with this AssociatedGroupController's message pipe.
-  // It takes ownership of |handle_to_send| and returns an interface ID that
-  // could be sent by any endpoints within the same associated group.
-  // If |handle_to_send| is not in pending association state, it returns
-  // kInvalidInterfaceId. Otherwise, the peer handle of |handle_to_send| joins
-  // the associated group and is no longer pending.
-  virtual InterfaceId AssociateInterface(
-      ScopedInterfaceEndpointHandle handle_to_send) = 0;
-
-  // Creates an interface endpoint handle from a given interface ID. The handle
-  // joins this associated group.
-  // Typically, this method is used to (1) create an endpoint handle for the
-  // master interface; or (2) create an endpoint handle on receiving an
-  // interface ID from the message pipe.
-  //
-  // On failure, the method returns an invalid handle. Usually that is because
-  // the ID has already been used to create a handle.
-  virtual ScopedInterfaceEndpointHandle CreateLocalEndpointHandle(
-      InterfaceId id) = 0;
-
-  // Closes an interface endpoint handle.
-  virtual void CloseEndpointHandle(
-      InterfaceId id,
-      const base::Optional<DisconnectReason>& reason) = 0;
-
-  // Attaches a client to the specified endpoint to send and receive messages.
-  // The returned object is still owned by the controller. It must only be used
-  // on the same thread as this call, and only before the client is detached
-  // using DetachEndpointClient().
-  virtual InterfaceEndpointController* AttachEndpointClient(
-      const ScopedInterfaceEndpointHandle& handle,
-      InterfaceEndpointClient* endpoint_client,
-      scoped_refptr<base::SingleThreadTaskRunner> runner) = 0;
-
-  // Detaches the client attached to the specified endpoint. It must be called
-  // on the same thread as the corresponding AttachEndpointClient() call.
-  virtual void DetachEndpointClient(
-      const ScopedInterfaceEndpointHandle& handle) = 0;
-
-  // Raises an error on the underlying message pipe. It disconnects the pipe
-  // and notifies all interfaces running on this pipe.
-  virtual void RaiseError() = 0;
-
- protected:
-  friend class base::RefCountedThreadSafe<AssociatedGroupController>;
-
-  // Creates a new ScopedInterfaceEndpointHandle within this associated group.
-  ScopedInterfaceEndpointHandle CreateScopedInterfaceEndpointHandle(
-      InterfaceId id);
-
-  // Notifies that the interface represented by |handle_to_send| and its peer
-  // has been associated with this AssociatedGroupController's message pipe, and
-  // |handle_to_send|'s peer has joined this associated group. (Note: it is the
-  // peer who has joined the associated group; |handle_to_send| will be sent to
-  // the remote side.)
-  // Returns false if |handle_to_send|'s peer has closed.
-  bool NotifyAssociation(ScopedInterfaceEndpointHandle* handle_to_send,
-                         InterfaceId id);
-
-  virtual ~AssociatedGroupController();
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_CONTROLLER_H_
diff --git a/mojo/public/cpp/bindings/associated_interface_ptr.h b/mojo/public/cpp/bindings/associated_interface_ptr.h
deleted file mode 100644
index 8806a3e..0000000
--- a/mojo/public/cpp/bindings/associated_interface_ptr.h
+++ /dev/null
@@ -1,283 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h"
-#include "mojo/public/cpp/bindings/lib/multiplex_router.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace mojo {
-
-// Represents the client side of an associated interface. It is similar to
-// InterfacePtr, except that it doesn't own a message pipe handle.
-template <typename Interface>
-class AssociatedInterfacePtr {
- public:
-  using InterfaceType = Interface;
-  using PtrInfoType = AssociatedInterfacePtrInfo<Interface>;
-
-  // Constructs an unbound AssociatedInterfacePtr.
-  AssociatedInterfacePtr() {}
-  AssociatedInterfacePtr(decltype(nullptr)) {}
-
-  AssociatedInterfacePtr(AssociatedInterfacePtr&& other) {
-    internal_state_.Swap(&other.internal_state_);
-  }
-
-  AssociatedInterfacePtr& operator=(AssociatedInterfacePtr&& other) {
-    reset();
-    internal_state_.Swap(&other.internal_state_);
-    return *this;
-  }
-
-  // Assigning nullptr to this class causes it to closes the associated
-  // interface (if any) and returns the pointer to the unbound state.
-  AssociatedInterfacePtr& operator=(decltype(nullptr)) {
-    reset();
-    return *this;
-  }
-
-  ~AssociatedInterfacePtr() {}
-
-  // Sets up this object as the client side of an associated interface.
-  // Calling with an invalid |info| has the same effect as reset(). In this
-  // case, the AssociatedInterfacePtr is not considered as bound.
-  //
-  // |runner| must belong to the same thread. It will be used to dispatch all
-  // callbacks and connection error notification. It is useful when you attach
-  // multiple task runners to a single thread for the purposes of task
-  // scheduling.
-  //
-  // NOTE: The corresponding AssociatedInterfaceRequest must be sent over
-  // another interface before using this object to make calls. Please see the
-  // comments of MakeRequest(AssociatedInterfacePtr<Interface>*) for more
-  // details.
-  void Bind(AssociatedInterfacePtrInfo<Interface> info,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    reset();
-
-    if (info.is_valid())
-      internal_state_.Bind(std::move(info), std::move(runner));
-  }
-
-  bool is_bound() const { return internal_state_.is_bound(); }
-
-  Interface* get() const { return internal_state_.instance(); }
-
-  // Functions like a pointer to Interface. Must already be bound.
-  Interface* operator->() const { return get(); }
-  Interface& operator*() const { return *get(); }
-
-  // Returns the version number of the interface that the remote side supports.
-  uint32_t version() const { return internal_state_.version(); }
-
-  // Queries the max version that the remote side supports. On completion, the
-  // result will be returned as the input of |callback|. The version number of
-  // this object will also be updated.
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback) {
-    internal_state_.QueryVersion(callback);
-  }
-
-  // If the remote side doesn't support the specified version, it will close the
-  // associated interface asynchronously. This does nothing if it's already
-  // known that the remote side supports the specified version, i.e., if
-  // |version <= this->version()|.
-  //
-  // After calling RequireVersion() with a version not supported by the remote
-  // side, all subsequent calls to interface methods will be ignored.
-  void RequireVersion(uint32_t version) {
-    internal_state_.RequireVersion(version);
-  }
-
-  // Sends a message on the underlying message pipe and runs the current
-  // message loop until its response is received. This can be used in tests to
-  // verify that no message was sent on a message pipe in response to some
-  // stimulus.
-  void FlushForTesting() { internal_state_.FlushForTesting(); }
-
-  // Closes the associated interface (if any) and returns the pointer to the
-  // unbound state.
-  void reset() {
-    State doomed;
-    internal_state_.Swap(&doomed);
-  }
-
-  // Similar to the method above, but also specifies a disconnect reason.
-  void ResetWithReason(uint32_t custom_reason, const std::string& description) {
-    if (internal_state_.is_bound())
-      internal_state_.CloseWithReason(custom_reason, description);
-    reset();
-  }
-
-  // Indicates whether an error has been encountered. If true, method calls made
-  // on this interface will be dropped (and may already have been dropped).
-  bool encountered_error() const { return internal_state_.encountered_error(); }
-
-  // Registers a handler to receive error notifications.
-  //
-  // This method may only be called after the AssociatedInterfacePtr has been
-  // bound.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    internal_state_.set_connection_error_handler(error_handler);
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    internal_state_.set_connection_error_with_reason_handler(error_handler);
-  }
-
-  // Unbinds and returns the associated interface pointer information which
-  // could be used to setup an AssociatedInterfacePtr again. This method may be
-  // used to move the proxy to a different thread.
-  //
-  // It is an error to call PassInterface() while there are pending responses.
-  // TODO: fix this restriction, it's not always obvious when there is a
-  // pending response.
-  AssociatedInterfacePtrInfo<Interface> PassInterface() {
-    DCHECK(!internal_state_.has_pending_callbacks());
-    State state;
-    internal_state_.Swap(&state);
-
-    return state.PassInterface();
-  }
-
-  // DO NOT USE. Exposed only for internal use and for testing.
-  internal::AssociatedInterfacePtrState<Interface>* internal_state() {
-    return &internal_state_;
-  }
-
-  // Allow AssociatedInterfacePtr<> to be used in boolean expressions, but not
-  // implicitly convertible to a real bool (which is dangerous).
- private:
-  // TODO(dcheng): Use an explicit conversion operator.
-  typedef internal::AssociatedInterfacePtrState<Interface>
-      AssociatedInterfacePtr::*Testable;
-
- public:
-  operator Testable() const {
-    return internal_state_.is_bound() ? &AssociatedInterfacePtr::internal_state_
-                                      : nullptr;
-  }
-
- private:
-  // Forbid the == and != operators explicitly, otherwise AssociatedInterfacePtr
-  // will be converted to Testable to do == or != comparison.
-  template <typename T>
-  bool operator==(const AssociatedInterfacePtr<T>& other) const = delete;
-  template <typename T>
-  bool operator!=(const AssociatedInterfacePtr<T>& other) const = delete;
-
-  typedef internal::AssociatedInterfacePtrState<Interface> State;
-  mutable State internal_state_;
-
-  DISALLOW_COPY_AND_ASSIGN(AssociatedInterfacePtr);
-};
-
-// Creates an associated interface. The returned request is supposed to be sent
-// over another interface (either associated or non-associated).
-//
-// NOTE: |ptr| must NOT be used to make calls before the request is sent.
-// Violating that will lead to crash. On the other hand, as soon as the request
-// is sent, |ptr| is usable. There is no need to wait until the request is bound
-// to an implementation at the remote side.
-template <typename Interface>
-AssociatedInterfaceRequest<Interface> MakeRequest(
-    AssociatedInterfacePtr<Interface>* ptr,
-    scoped_refptr<base::SingleThreadTaskRunner> runner =
-        base::ThreadTaskRunnerHandle::Get()) {
-  AssociatedInterfacePtrInfo<Interface> ptr_info;
-  auto request = MakeRequest(&ptr_info);
-  ptr->Bind(std::move(ptr_info), std::move(runner));
-  return request;
-}
-
-// Creates an associated interface. One of the two endpoints is supposed to be
-// sent over another interface (either associated or non-associated); while the
-// other is used locally.
-//
-// NOTE: If |ptr_info| is used locally and bound to an AssociatedInterfacePtr,
-// the interface pointer must NOT be used to make calls before the request is
-// sent. Please see NOTE of the previous function for more details.
-template <typename Interface>
-AssociatedInterfaceRequest<Interface> MakeRequest(
-    AssociatedInterfacePtrInfo<Interface>* ptr_info) {
-  ScopedInterfaceEndpointHandle handle0;
-  ScopedInterfaceEndpointHandle handle1;
-  ScopedInterfaceEndpointHandle::CreatePairPendingAssociation(&handle0,
-                                                              &handle1);
-
-  ptr_info->set_handle(std::move(handle0));
-  ptr_info->set_version(0);
-
-  AssociatedInterfaceRequest<Interface> request;
-  request.Bind(std::move(handle1));
-  return request;
-}
-
-// Like MakeRequest() above, but it creates a dedicated message pipe. The
-// returned request can be bound directly to an implementation, without being
-// first passed through a message pipe endpoint.
-//
-// This function has two main uses:
-//
-//  * In testing, where the returned request is bound to e.g. a mock and there
-//    are no other interfaces involved.
-//
-//  * When discarding messages sent on an interface, which can be done by
-//    discarding the returned request.
-template <typename Interface>
-AssociatedInterfaceRequest<Interface> MakeIsolatedRequest(
-    AssociatedInterfacePtr<Interface>* ptr) {
-  MessagePipe pipe;
-  scoped_refptr<internal::MultiplexRouter> router0 =
-      new internal::MultiplexRouter(std::move(pipe.handle0),
-                                    internal::MultiplexRouter::MULTI_INTERFACE,
-                                    false, base::ThreadTaskRunnerHandle::Get());
-  scoped_refptr<internal::MultiplexRouter> router1 =
-      new internal::MultiplexRouter(std::move(pipe.handle1),
-                                    internal::MultiplexRouter::MULTI_INTERFACE,
-                                    true, base::ThreadTaskRunnerHandle::Get());
-
-  ScopedInterfaceEndpointHandle endpoint0, endpoint1;
-  ScopedInterfaceEndpointHandle::CreatePairPendingAssociation(&endpoint0,
-                                                              &endpoint1);
-  InterfaceId id = router1->AssociateInterface(std::move(endpoint0));
-  endpoint0 = router0->CreateLocalEndpointHandle(id);
-
-  ptr->Bind(AssociatedInterfacePtrInfo<Interface>(std::move(endpoint0),
-                                                  Interface::Version_));
-
-  AssociatedInterfaceRequest<Interface> request;
-  request.Bind(std::move(endpoint1));
-  return request;
-}
-
-// |handle| is supposed to be the request of an associated interface. This
-// method associates the interface with a dedicated, disconnected message pipe.
-// That way, the corresponding associated interface pointer of |handle| can
-// safely make calls (although those calls are silently dropped).
-MOJO_CPP_BINDINGS_EXPORT void GetIsolatedInterface(
-    ScopedInterfaceEndpointHandle handle);
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_H_
diff --git a/mojo/public/cpp/bindings/associated_interface_ptr_info.h b/mojo/public/cpp/bindings/associated_interface_ptr_info.h
deleted file mode 100644
index 3c6ca54..0000000
--- a/mojo/public/cpp/bindings/associated_interface_ptr_info.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_INFO_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_INFO_H_
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-
-// AssociatedInterfacePtrInfo stores necessary information to construct an
-// associated interface pointer. It is similar to InterfacePtrInfo except that
-// it doesn't own a message pipe handle.
-template <typename Interface>
-class AssociatedInterfacePtrInfo {
- public:
-  AssociatedInterfacePtrInfo() : version_(0u) {}
-  AssociatedInterfacePtrInfo(std::nullptr_t) : version_(0u) {}
-
-  AssociatedInterfacePtrInfo(AssociatedInterfacePtrInfo&& other)
-      : handle_(std::move(other.handle_)), version_(other.version_) {
-    other.version_ = 0u;
-  }
-
-  AssociatedInterfacePtrInfo(ScopedInterfaceEndpointHandle handle,
-                             uint32_t version)
-      : handle_(std::move(handle)), version_(version) {}
-
-  ~AssociatedInterfacePtrInfo() {}
-
-  AssociatedInterfacePtrInfo& operator=(AssociatedInterfacePtrInfo&& other) {
-    if (this != &other) {
-      handle_ = std::move(other.handle_);
-      version_ = other.version_;
-      other.version_ = 0u;
-    }
-
-    return *this;
-  }
-
-  bool is_valid() const { return handle_.is_valid(); }
-
-  ScopedInterfaceEndpointHandle PassHandle() {
-    return std::move(handle_);
-  }
-  const ScopedInterfaceEndpointHandle& handle() const { return handle_; }
-  void set_handle(ScopedInterfaceEndpointHandle handle) {
-    handle_ = std::move(handle);
-  }
-
-  uint32_t version() const { return version_; }
-  void set_version(uint32_t version) { version_ = version; }
-
-  bool Equals(const AssociatedInterfacePtrInfo& other) const {
-    if (this == &other)
-      return true;
-
-    // Now that the two refer to different objects, they are equivalent if
-    // and only if they are both invalid.
-    return !is_valid() && !other.is_valid();
-  }
-
- private:
-  ScopedInterfaceEndpointHandle handle_;
-  uint32_t version_;
-
-  DISALLOW_COPY_AND_ASSIGN(AssociatedInterfacePtrInfo);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_INFO_H_
diff --git a/mojo/public/cpp/bindings/associated_interface_request.h b/mojo/public/cpp/bindings/associated_interface_request.h
deleted file mode 100644
index c37636c..0000000
--- a/mojo/public/cpp/bindings/associated_interface_request.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_REQUEST_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_REQUEST_H_
-
-#include <string>
-#include <utility>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-
-// AssociatedInterfaceRequest represents an associated interface request. It is
-// similar to InterfaceRequest except that it doesn't own a message pipe handle.
-template <typename Interface>
-class AssociatedInterfaceRequest {
- public:
-  // Constructs an empty AssociatedInterfaceRequest, representing that the
-  // client is not requesting an implementation of Interface.
-  AssociatedInterfaceRequest() {}
-  AssociatedInterfaceRequest(decltype(nullptr)) {}
-
-  // Takes the interface endpoint handle from another
-  // AssociatedInterfaceRequest.
-  AssociatedInterfaceRequest(AssociatedInterfaceRequest&& other) {
-    handle_ = std::move(other.handle_);
-  }
-  AssociatedInterfaceRequest& operator=(AssociatedInterfaceRequest&& other) {
-    if (this != &other)
-      handle_ = std::move(other.handle_);
-    return *this;
-  }
-
-  // Assigning to nullptr resets the AssociatedInterfaceRequest to an empty
-  // state, closing the interface endpoint handle currently bound to it (if
-  // any).
-  AssociatedInterfaceRequest& operator=(decltype(nullptr)) {
-    handle_.reset();
-    return *this;
-  }
-
-  // Indicates whether the request currently contains a valid interface endpoint
-  // handle.
-  bool is_pending() const { return handle_.is_valid(); }
-
-  void Bind(ScopedInterfaceEndpointHandle handle) {
-    handle_ = std::move(handle);
-  }
-
-  ScopedInterfaceEndpointHandle PassHandle() {
-    return std::move(handle_);
-  }
-
-  const ScopedInterfaceEndpointHandle& handle() const { return handle_; }
-
-  bool Equals(const AssociatedInterfaceRequest& other) const {
-    if (this == &other)
-      return true;
-
-    // Now that the two refer to different objects, they are equivalent if
-    // and only if they are both invalid.
-    return !is_pending() && !other.is_pending();
-  }
-
-  void ResetWithReason(uint32_t custom_reason, const std::string& description) {
-    handle_.ResetWithReason(custom_reason, description);
-  }
-
- private:
-  ScopedInterfaceEndpointHandle handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(AssociatedInterfaceRequest);
-};
-
-// Makes an AssociatedInterfaceRequest bound to the specified associated
-// endpoint.
-template <typename Interface>
-AssociatedInterfaceRequest<Interface> MakeAssociatedRequest(
-    ScopedInterfaceEndpointHandle handle) {
-  AssociatedInterfaceRequest<Interface> request;
-  request.Bind(std::move(handle));
-  return request;
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_REQUEST_H_
diff --git a/mojo/public/cpp/bindings/binding.h b/mojo/public/cpp/bindings/binding.h
deleted file mode 100644
index 88d2f4b..0000000
--- a/mojo/public/cpp/bindings/binding.h
+++ /dev/null
@@ -1,276 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_
-
-#include <string>
-#include <utility>
-
-#include "base/callback_forward.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/lib/binding_state.h"
-#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-
-class MessageReceiver;
-
-// Represents the binding of an interface implementation to a message pipe.
-// When the |Binding| object is destroyed, the binding between the message pipe
-// and the interface is torn down and the message pipe is closed, leaving the
-// interface implementation in an unbound state.
-//
-// Example:
-//
-//   #include "foo.mojom.h"
-//
-//   class FooImpl : public Foo {
-//    public:
-//     explicit FooImpl(InterfaceRequest<Foo> request)
-//         : binding_(this, std::move(request)) {}
-//
-//     // Foo implementation here.
-//
-//    private:
-//     Binding<Foo> binding_;
-//   };
-//
-//   class MyFooFactory : public InterfaceFactory<Foo> {
-//    public:
-//     void Create(..., InterfaceRequest<Foo> request) override {
-//       auto f = new FooImpl(std::move(request));
-//       // Do something to manage the lifetime of |f|. Use StrongBinding<> to
-//       // delete FooImpl on connection errors.
-//     }
-//   };
-//
-// This class is thread hostile while bound to a message pipe. All calls to this
-// class must be from the thread that bound it. The interface implementation's
-// methods will be called from the thread that bound this. If a Binding is not
-// bound to a message pipe, it may be bound or destroyed on any thread.
-//
-// When you bind this class to a message pipe, optionally you can specify a
-// base::SingleThreadTaskRunner. This task runner must belong to the same
-// thread. It will be used to dispatch incoming method calls and connection
-// error notification. It is useful when you attach multiple task runners to a
-// single thread for the purposes of task scheduling. Please note that incoming
-// synchrounous method calls may not be run from this task runner, when they
-// reenter outgoing synchrounous calls on the same thread.
-template <typename Interface,
-          typename ImplRefTraits = RawPtrImplRefTraits<Interface>>
-class Binding {
- public:
-  using ImplPointerType = typename ImplRefTraits::PointerType;
-
-  // Constructs an incomplete binding that will use the implementation |impl|.
-  // The binding may be completed with a subsequent call to the |Bind| method.
-  // Does not take ownership of |impl|, which must outlive the binding.
-  explicit Binding(ImplPointerType impl) : internal_state_(std::move(impl)) {}
-
-  // Constructs a completed binding of message pipe |handle| to implementation
-  // |impl|. Does not take ownership of |impl|, which must outlive the binding.
-  Binding(ImplPointerType impl,
-          ScopedMessagePipeHandle handle,
-          scoped_refptr<base::SingleThreadTaskRunner> runner =
-              base::ThreadTaskRunnerHandle::Get())
-      : Binding(std::move(impl)) {
-    Bind(std::move(handle), std::move(runner));
-  }
-
-  // Constructs a completed binding of |impl| to a new message pipe, passing the
-  // client end to |ptr|, which takes ownership of it. The caller is expected to
-  // pass |ptr| on to the client of the service. Does not take ownership of any
-  // of the parameters. |impl| must outlive the binding. |ptr| only needs to
-  // last until the constructor returns.
-  Binding(ImplPointerType impl,
-          InterfacePtr<Interface>* ptr,
-          scoped_refptr<base::SingleThreadTaskRunner> runner =
-              base::ThreadTaskRunnerHandle::Get())
-      : Binding(std::move(impl)) {
-    Bind(ptr, std::move(runner));
-  }
-
-  // Constructs a completed binding of |impl| to the message pipe endpoint in
-  // |request|, taking ownership of the endpoint. Does not take ownership of
-  // |impl|, which must outlive the binding.
-  Binding(ImplPointerType impl,
-          InterfaceRequest<Interface> request,
-          scoped_refptr<base::SingleThreadTaskRunner> runner =
-              base::ThreadTaskRunnerHandle::Get())
-      : Binding(std::move(impl)) {
-    Bind(request.PassMessagePipe(), std::move(runner));
-  }
-
-  // Tears down the binding, closing the message pipe and leaving the interface
-  // implementation unbound.
-  ~Binding() {}
-
-  // Returns an InterfacePtr bound to one end of a pipe whose other end is
-  // bound to |this|.
-  InterfacePtr<Interface> CreateInterfacePtrAndBind(
-      scoped_refptr<base::SingleThreadTaskRunner> runner =
-          base::ThreadTaskRunnerHandle::Get()) {
-    InterfacePtr<Interface> interface_ptr;
-    Bind(&interface_ptr, std::move(runner));
-    return interface_ptr;
-  }
-
-  // Completes a binding that was constructed with only an interface
-  // implementation. Takes ownership of |handle| and binds it to the previously
-  // specified implementation.
-  void Bind(ScopedMessagePipeHandle handle,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    internal_state_.Bind(std::move(handle), std::move(runner));
-  }
-
-  // Completes a binding that was constructed with only an interface
-  // implementation by creating a new message pipe, binding one end of it to the
-  // previously specified implementation, and passing the other to |ptr|, which
-  // takes ownership of it. The caller is expected to pass |ptr| on to the
-  // eventual client of the service. Does not take ownership of |ptr|.
-  void Bind(InterfacePtr<Interface>* ptr,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    MessagePipe pipe;
-    ptr->Bind(InterfacePtrInfo<Interface>(std::move(pipe.handle0),
-                                          Interface::Version_),
-              runner);
-    Bind(std::move(pipe.handle1), std::move(runner));
-  }
-
-  // Completes a binding that was constructed with only an interface
-  // implementation by removing the message pipe endpoint from |request| and
-  // binding it to the previously specified implementation.
-  void Bind(InterfaceRequest<Interface> request,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    Bind(request.PassMessagePipe(), std::move(runner));
-  }
-
-  // Adds a message filter to be notified of each incoming message before
-  // dispatch. If a filter returns |false| from Accept(), the message is not
-  // dispatched and the pipe is closed. Filters cannot be removed.
-  void AddFilter(std::unique_ptr<MessageReceiver> filter) {
-    DCHECK(is_bound());
-    internal_state_.AddFilter(std::move(filter));
-  }
-
-  // Whether there are any associated interfaces running on the pipe currently.
-  bool HasAssociatedInterfaces() const {
-    return internal_state_.HasAssociatedInterfaces();
-  }
-
-  // Stops processing incoming messages until
-  // ResumeIncomingMethodCallProcessing(), or WaitForIncomingMethodCall().
-  // Outgoing messages are still sent.
-  //
-  // No errors are detected on the message pipe while paused.
-  //
-  // This method may only be called if the object has been bound to a message
-  // pipe and there are no associated interfaces running.
-  void PauseIncomingMethodCallProcessing() {
-    CHECK(!HasAssociatedInterfaces());
-    internal_state_.PauseIncomingMethodCallProcessing();
-  }
-  void ResumeIncomingMethodCallProcessing() {
-    internal_state_.ResumeIncomingMethodCallProcessing();
-  }
-
-  // Blocks the calling thread until either a call arrives on the previously
-  // bound message pipe, the deadline is exceeded, or an error occurs. Returns
-  // true if a method was successfully read and dispatched.
-  //
-  // This method may only be called if the object has been bound to a message
-  // pipe. This returns once a message is received either on the master
-  // interface or any associated interfaces.
-  bool WaitForIncomingMethodCall(
-      MojoDeadline deadline = MOJO_DEADLINE_INDEFINITE) {
-    return internal_state_.WaitForIncomingMethodCall(deadline);
-  }
-
-  // Closes the message pipe that was previously bound. Put this object into a
-  // state where it can be rebound to a new pipe.
-  void Close() { internal_state_.Close(); }
-
-  // Similar to the method above, but also specifies a disconnect reason.
-  void CloseWithReason(uint32_t custom_reason, const std::string& description) {
-    internal_state_.CloseWithReason(custom_reason, description);
-  }
-
-  // Unbinds the underlying pipe from this binding and returns it so it can be
-  // used in another context, such as on another thread or with a different
-  // implementation. Put this object into a state where it can be rebound to a
-  // new pipe.
-  //
-  // This method may only be called if the object has been bound to a message
-  // pipe and there are no associated interfaces running.
-  //
-  // TODO(yzshen): For now, users need to make sure there is no one holding
-  // on to associated interface endpoint handles at both sides of the
-  // message pipe in order to call this method. We need a way to forcefully
-  // invalidate associated interface endpoint handles.
-  InterfaceRequest<Interface> Unbind() {
-    CHECK(!HasAssociatedInterfaces());
-    return internal_state_.Unbind();
-  }
-
-  // Sets an error handler that will be called if a connection error occurs on
-  // the bound message pipe.
-  //
-  // This method may only be called after this Binding has been bound to a
-  // message pipe. The error handler will be reset when this Binding is unbound
-  // or closed.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(is_bound());
-    internal_state_.set_connection_error_handler(error_handler);
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    DCHECK(is_bound());
-    internal_state_.set_connection_error_with_reason_handler(error_handler);
-  }
-
-  // Returns the interface implementation that was previously specified. Caller
-  // does not take ownership.
-  Interface* impl() { return internal_state_.impl(); }
-
-  // Indicates whether the binding has been completed (i.e., whether a message
-  // pipe has been bound to the implementation).
-  bool is_bound() const { return internal_state_.is_bound(); }
-
-  // Returns the value of the handle currently bound to this Binding which can
-  // be used to make explicit Wait/WaitMany calls. Requires that the Binding be
-  // bound. Ownership of the handle is retained by the Binding, it is not
-  // transferred to the caller.
-  MessagePipeHandle handle() const { return internal_state_.handle(); }
-
-  // Sends a no-op message on the underlying message pipe and runs the current
-  // message loop until its response is received. This can be used in tests to
-  // verify that no message was sent on a message pipe in response to some
-  // stimulus.
-  void FlushForTesting() { internal_state_.FlushForTesting(); }
-
-  // Exposed for testing, should not generally be used.
-  void EnableTestingMode() { internal_state_.EnableTestingMode(); }
-
- private:
-  internal::BindingState<Interface, ImplRefTraits> internal_state_;
-
-  DISALLOW_COPY_AND_ASSIGN(Binding);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_
diff --git a/mojo/public/cpp/bindings/binding_set.h b/mojo/public/cpp/bindings/binding_set.h
deleted file mode 100644
index 919f9c0..0000000
--- a/mojo/public/cpp/bindings/binding_set.h
+++ /dev/null
@@ -1,267 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_BINDING_SET_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_BINDING_SET_H_
-
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-
-template <typename BindingType>
-struct BindingSetTraits;
-
-template <typename Interface, typename ImplRefTraits>
-struct BindingSetTraits<Binding<Interface, ImplRefTraits>> {
-  using ProxyType = InterfacePtr<Interface>;
-  using RequestType = InterfaceRequest<Interface>;
-  using BindingType = Binding<Interface, ImplRefTraits>;
-  using ImplPointerType = typename BindingType::ImplPointerType;
-
-  static RequestType MakeRequest(ProxyType* proxy) {
-    return mojo::MakeRequest(proxy);
-  }
-};
-
-using BindingId = size_t;
-
-template <typename ContextType>
-struct BindingSetContextTraits {
-  using Type = ContextType;
-
-  static constexpr bool SupportsContext() { return true; }
-};
-
-template <>
-struct BindingSetContextTraits<void> {
-  // NOTE: This choice of Type only matters insofar as it affects the size of
-  // the |context_| field of a BindingSetBase::Entry with void context. The
-  // context value is never used in this case.
-  using Type = bool;
-
-  static constexpr bool SupportsContext() { return false; }
-};
-
-// Generic definition used for BindingSet and AssociatedBindingSet to own a
-// collection of bindings which point to the same implementation.
-//
-// If |ContextType| is non-void, then every added binding must include a context
-// value of that type, and |dispatch_context()| will return that value during
-// the extent of any message dispatch targeting that specific binding.
-template <typename Interface, typename BindingType, typename ContextType>
-class BindingSetBase {
- public:
-  using ContextTraits = BindingSetContextTraits<ContextType>;
-  using Context = typename ContextTraits::Type;
-  using PreDispatchCallback = base::Callback<void(const Context&)>;
-  using Traits = BindingSetTraits<BindingType>;
-  using ProxyType = typename Traits::ProxyType;
-  using RequestType = typename Traits::RequestType;
-  using ImplPointerType = typename Traits::ImplPointerType;
-
-  BindingSetBase() {}
-
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    error_handler_ = error_handler;
-    error_with_reason_handler_.Reset();
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    error_with_reason_handler_ = error_handler;
-    error_handler_.Reset();
-  }
-
-  // Sets a callback to be invoked immediately before dispatching any message or
-  // error received by any of the bindings in the set. This may only be used
-  // with a non-void |ContextType|.
-  void set_pre_dispatch_handler(const PreDispatchCallback& handler) {
-    static_assert(ContextTraits::SupportsContext(),
-                  "Pre-dispatch handler usage requires non-void context type.");
-    pre_dispatch_handler_ = handler;
-  }
-
-  // Adds a new binding to the set which binds |request| to |impl| with no
-  // additional context.
-  BindingId AddBinding(ImplPointerType impl, RequestType request) {
-    static_assert(!ContextTraits::SupportsContext(),
-                  "Context value required for non-void context type.");
-    return AddBindingImpl(std::move(impl), std::move(request), false);
-  }
-
-  // Adds a new binding associated with |context|.
-  BindingId AddBinding(ImplPointerType impl,
-                       RequestType request,
-                       Context context) {
-    static_assert(ContextTraits::SupportsContext(),
-                  "Context value unsupported for void context type.");
-    return AddBindingImpl(std::move(impl), std::move(request),
-                          std::move(context));
-  }
-
-  // Removes a binding from the set. Note that this is safe to call even if the
-  // binding corresponding to |id| has already been removed.
-  //
-  // Returns |true| if the binding was removed and |false| if it didn't exist.
-  bool RemoveBinding(BindingId id) {
-    auto it = bindings_.find(id);
-    if (it == bindings_.end())
-      return false;
-    bindings_.erase(it);
-    return true;
-  }
-
-  // Returns a proxy bound to one end of a pipe whose other end is bound to
-  // |this|. If |id_storage| is not null, |*id_storage| will be set to the ID
-  // of the added binding.
-  ProxyType CreateInterfacePtrAndBind(ImplPointerType impl,
-                                      BindingId* id_storage = nullptr) {
-    ProxyType proxy;
-    BindingId id = AddBinding(std::move(impl), Traits::MakeRequest(&proxy));
-    if (id_storage)
-      *id_storage = id;
-    return proxy;
-  }
-
-  void CloseAllBindings() { bindings_.clear(); }
-
-  bool empty() const { return bindings_.empty(); }
-
-  // Implementations may call this when processing a dispatched message or
-  // error. During the extent of message or error dispatch, this will return the
-  // context associated with the specific binding which received the message or
-  // error. Use AddBinding() to associated a context with a specific binding.
-  const Context& dispatch_context() const {
-    static_assert(ContextTraits::SupportsContext(),
-                  "dispatch_context() requires non-void context type.");
-    DCHECK(dispatch_context_);
-    return *dispatch_context_;
-  }
-
-  void FlushForTesting() {
-    for (auto& binding : bindings_)
-      binding.second->FlushForTesting();
-  }
-
- private:
-  friend class Entry;
-
-  class Entry {
-   public:
-    Entry(ImplPointerType impl,
-          RequestType request,
-          BindingSetBase* binding_set,
-          BindingId binding_id,
-          Context context)
-        : binding_(std::move(impl), std::move(request)),
-          binding_set_(binding_set),
-          binding_id_(binding_id),
-          context_(std::move(context)) {
-      if (ContextTraits::SupportsContext())
-        binding_.AddFilter(base::MakeUnique<DispatchFilter>(this));
-      binding_.set_connection_error_with_reason_handler(
-          base::Bind(&Entry::OnConnectionError, base::Unretained(this)));
-    }
-
-    void FlushForTesting() { binding_.FlushForTesting(); }
-
-   private:
-    class DispatchFilter : public MessageReceiver {
-     public:
-      explicit DispatchFilter(Entry* entry) : entry_(entry) {}
-      ~DispatchFilter() override {}
-
-     private:
-      // MessageReceiver:
-      bool Accept(Message* message) override {
-        entry_->WillDispatch();
-        return true;
-      }
-
-      Entry* entry_;
-
-      DISALLOW_COPY_AND_ASSIGN(DispatchFilter);
-    };
-
-    void WillDispatch() {
-      DCHECK(ContextTraits::SupportsContext());
-      binding_set_->SetDispatchContext(&context_);
-    }
-
-    void OnConnectionError(uint32_t custom_reason,
-                           const std::string& description) {
-      if (ContextTraits::SupportsContext())
-        WillDispatch();
-      binding_set_->OnConnectionError(binding_id_, custom_reason, description);
-    }
-
-    BindingType binding_;
-    BindingSetBase* const binding_set_;
-    const BindingId binding_id_;
-    Context const context_;
-
-    DISALLOW_COPY_AND_ASSIGN(Entry);
-  };
-
-  void SetDispatchContext(const Context* context) {
-    DCHECK(ContextTraits::SupportsContext());
-    dispatch_context_ = context;
-    if (!pre_dispatch_handler_.is_null())
-      pre_dispatch_handler_.Run(*context);
-  }
-
-  BindingId AddBindingImpl(ImplPointerType impl,
-                           RequestType request,
-                           Context context) {
-    BindingId id = next_binding_id_++;
-    DCHECK_GE(next_binding_id_, 0u);
-    auto entry = base::MakeUnique<Entry>(std::move(impl), std::move(request),
-                                         this, id, std::move(context));
-    bindings_.insert(std::make_pair(id, std::move(entry)));
-    return id;
-  }
-
-  void OnConnectionError(BindingId id,
-                         uint32_t custom_reason,
-                         const std::string& description) {
-    auto it = bindings_.find(id);
-    DCHECK(it != bindings_.end());
-
-    // We keep the Entry alive throughout error dispatch.
-    std::unique_ptr<Entry> entry = std::move(it->second);
-    bindings_.erase(it);
-
-    if (!error_handler_.is_null())
-      error_handler_.Run();
-    else if (!error_with_reason_handler_.is_null())
-      error_with_reason_handler_.Run(custom_reason, description);
-  }
-
-  base::Closure error_handler_;
-  ConnectionErrorWithReasonCallback error_with_reason_handler_;
-  PreDispatchCallback pre_dispatch_handler_;
-  BindingId next_binding_id_ = 0;
-  std::map<BindingId, std::unique_ptr<Entry>> bindings_;
-  const Context* dispatch_context_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(BindingSetBase);
-};
-
-template <typename Interface, typename ContextType = void>
-using BindingSet = BindingSetBase<Interface, Binding<Interface>, ContextType>;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_BINDING_SET_H_
diff --git a/mojo/public/cpp/bindings/bindings_export.h b/mojo/public/cpp/bindings/bindings_export.h
deleted file mode 100644
index 9fd7a27..0000000
--- a/mojo/public/cpp/bindings/bindings_export.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_BINDINGS_EXPORT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_BINDINGS_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-
-#if defined(WIN32)
-
-#if defined(MOJO_CPP_BINDINGS_IMPLEMENTATION)
-#define MOJO_CPP_BINDINGS_EXPORT __declspec(dllexport)
-#else
-#define MOJO_CPP_BINDINGS_EXPORT __declspec(dllimport)
-#endif
-
-#else  // !defined(WIN32)
-
-#if defined(MOJO_CPP_BINDINGS_IMPLEMENTATION)
-#define MOJO_CPP_BINDINGS_EXPORT __attribute((visibility("default")))
-#else
-#define MOJO_CPP_BINDINGS_EXPORT
-#endif
-
-#endif  // defined(WIN32)
-
-#else  // !defined(COMPONENT_BUILD)
-
-#define MOJO_CPP_BINDINGS_EXPORT
-
-#endif  // defined(COMPONENT_BUILD)
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_BINDINGS_EXPORT_H_
diff --git a/mojo/public/cpp/bindings/clone_traits.h b/mojo/public/cpp/bindings/clone_traits.h
deleted file mode 100644
index 203ab34..0000000
--- a/mojo/public/cpp/bindings/clone_traits.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_CLONE_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_CLONE_TRAITS_H_
-
-#include <type_traits>
-#include <unordered_map>
-#include <vector>
-
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-
-namespace mojo {
-
-template <typename T>
-struct HasCloneMethod {
-  template <typename U>
-  static char Test(decltype(&U::Clone));
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  internal::EnsureTypeIsComplete<T> check_t_;
-};
-
-template <typename T, bool has_clone_method = HasCloneMethod<T>::value>
-struct CloneTraits;
-
-template <typename T>
-T Clone(const T& input);
-
-template <typename T>
-struct CloneTraits<T, true> {
-  static T Clone(const T& input) { return input.Clone(); }
-};
-
-template <typename T>
-struct CloneTraits<T, false> {
-  static T Clone(const T& input) { return input; }
-};
-
-template <typename T>
-struct CloneTraits<base::Optional<T>, false> {
-  static base::Optional<T> Clone(const base::Optional<T>& input) {
-    if (!input)
-      return base::nullopt;
-
-    return base::Optional<T>(mojo::Clone(*input));
-  }
-};
-
-template <typename T>
-struct CloneTraits<std::vector<T>, false> {
-  static std::vector<T> Clone(const std::vector<T>& input) {
-    std::vector<T> result;
-    result.reserve(input.size());
-    for (const auto& element : input)
-      result.push_back(mojo::Clone(element));
-
-    return result;
-  }
-};
-
-template <typename K, typename V>
-struct CloneTraits<std::unordered_map<K, V>, false> {
-  static std::unordered_map<K, V> Clone(const std::unordered_map<K, V>& input) {
-    std::unordered_map<K, V> result;
-    for (const auto& element : input) {
-      result.insert(std::make_pair(mojo::Clone(element.first),
-                                   mojo::Clone(element.second)));
-    }
-    return result;
-  }
-};
-
-template <typename T>
-T Clone(const T& input) {
-  return CloneTraits<T>::Clone(input);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_CLONE_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/connection_error_callback.h b/mojo/public/cpp/bindings/connection_error_callback.h
deleted file mode 100644
index 306e99e..0000000
--- a/mojo/public/cpp/bindings/connection_error_callback.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_CONNECTION_ERROR_CALLBACK_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_CONNECTION_ERROR_CALLBACK_H_
-
-#include "base/callback.h"
-
-namespace mojo {
-
-// This callback type accepts user-defined disconnect reason and description. If
-// the other side specifies a reason on closing the connection, it will be
-// passed to the error handler.
-using ConnectionErrorWithReasonCallback =
-    base::Callback<void(uint32_t /* custom_reason */,
-                        const std::string& /* description */)>;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_CONNECTION_ERROR_CALLBACK_H_
diff --git a/mojo/public/cpp/bindings/connector.h b/mojo/public/cpp/bindings/connector.h
deleted file mode 100644
index cb065c1..0000000
--- a/mojo/public/cpp/bindings/connector.h
+++ /dev/null
@@ -1,241 +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.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_CONNECTOR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_CONNECTOR_H_
-
-#include <memory>
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/cpp/bindings/sync_handle_watcher.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-
-namespace base {
-class Lock;
-}
-
-namespace mojo {
-
-// The Connector class is responsible for performing read/write operations on a
-// MessagePipe. It writes messages it receives through the MessageReceiver
-// interface that it subclasses, and it forwards messages it reads through the
-// MessageReceiver interface assigned as its incoming receiver.
-//
-// NOTE:
-//   - MessagePipe I/O is non-blocking.
-//   - Sending messages can be configured to be thread safe (please see comments
-//     of the constructor). Other than that, the object should only be accessed
-//     on the creating thread.
-class MOJO_CPP_BINDINGS_EXPORT Connector
-    : NON_EXPORTED_BASE(public MessageReceiver) {
- public:
-  enum ConnectorConfig {
-    // Connector::Accept() is only called from a single thread.
-    SINGLE_THREADED_SEND,
-    // Connector::Accept() is allowed to be called from multiple threads.
-    MULTI_THREADED_SEND
-  };
-
-  // The Connector takes ownership of |message_pipe|.
-  Connector(ScopedMessagePipeHandle message_pipe,
-            ConnectorConfig config,
-            scoped_refptr<base::SingleThreadTaskRunner> runner);
-  ~Connector() override;
-
-  // Sets the receiver to handle messages read from the message pipe.  The
-  // Connector will read messages from the pipe regardless of whether or not an
-  // incoming receiver has been set.
-  void set_incoming_receiver(MessageReceiver* receiver) {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    incoming_receiver_ = receiver;
-  }
-
-  // Errors from incoming receivers will force the connector into an error
-  // state, where no more messages will be processed. This method is used
-  // during testing to prevent that from happening.
-  void set_enforce_errors_from_incoming_receiver(bool enforce) {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    enforce_errors_from_incoming_receiver_ = enforce;
-  }
-
-  // Sets the error handler to receive notifications when an error is
-  // encountered while reading from the pipe or waiting to read from the pipe.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    connection_error_handler_ = error_handler;
-  }
-
-  // Returns true if an error was encountered while reading from the pipe or
-  // waiting to read from the pipe.
-  bool encountered_error() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return error_;
-  }
-
-  // Closes the pipe. The connector is put into a quiescent state.
-  //
-  // Please note that this method shouldn't be called unless it results from an
-  // explicit request of the user of bindings (e.g., the user sets an
-  // InterfacePtr to null or closes a Binding).
-  void CloseMessagePipe();
-
-  // Releases the pipe. Connector is put into a quiescent state.
-  ScopedMessagePipeHandle PassMessagePipe();
-
-  // Enters the error state. The upper layer may do this for unrecoverable
-  // issues such as invalid messages are received. If a connection error handler
-  // has been set, it will be called asynchronously.
-  //
-  // It is a no-op if the connector is already in the error state or there isn't
-  // a bound message pipe. Otherwise, it closes the message pipe, which notifies
-  // the other end and also prevents potential danger (say, the caller raises
-  // an error because it believes the other end is malicious). In order to
-  // appear to the user that the connector still binds to a message pipe, it
-  // creates a new message pipe, closes one end and binds to the other.
-  void RaiseError();
-
-  // Is the connector bound to a MessagePipe handle?
-  bool is_valid() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return message_pipe_.is_valid();
-  }
-
-  // Waits for the next message on the pipe, blocking until one arrives,
-  // |deadline| elapses, or an error happens. Returns |true| if a message has
-  // been delivered, |false| otherwise.
-  bool WaitForIncomingMessage(MojoDeadline deadline);
-
-  // See Binding for details of pause/resume.
-  void PauseIncomingMethodCallProcessing();
-  void ResumeIncomingMethodCallProcessing();
-
-  // MessageReceiver implementation:
-  bool Accept(Message* message) override;
-
-  MessagePipeHandle handle() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return message_pipe_.get();
-  }
-
-  // Allows |message_pipe_| to be watched while others perform sync handle
-  // watching on the same thread. Please see comments of
-  // SyncHandleWatcher::AllowWokenUpBySyncWatchOnSameThread().
-  void AllowWokenUpBySyncWatchOnSameThread();
-
-  // Watches |message_pipe_| (as well as other handles registered to be watched
-  // together) synchronously.
-  // This method:
-  //   - returns true when |should_stop| is set to true;
-  //   - return false when any error occurs, including |message_pipe_| being
-  //     closed.
-  bool SyncWatch(const bool* should_stop);
-
-  // Whether currently the control flow is inside the sync handle watcher
-  // callback.
-  // It always returns false after CloseMessagePipe()/PassMessagePipe().
-  bool during_sync_handle_watcher_callback() const {
-    return sync_handle_watcher_callback_count_ > 0;
-  }
-
-  base::SingleThreadTaskRunner* task_runner() const {
-    return task_runner_.get();
-  }
-
-  // Sets the tag used by the heap profiler.
-  // |tag| must be a const string literal.
-  void SetWatcherHeapProfilerTag(const char* tag);
-
- private:
-  class ActiveDispatchTracker;
-  class MessageLoopNestingObserver;
-
-  // Callback of mojo::SimpleWatcher.
-  void OnWatcherHandleReady(MojoResult result);
-  // Callback of SyncHandleWatcher.
-  void OnSyncHandleWatcherHandleReady(MojoResult result);
-  void OnHandleReadyInternal(MojoResult result);
-
-  void WaitToReadMore();
-
-  // Returns false if it is impossible to receive more messages in the future.
-  // |this| may have been destroyed in that case.
-  WARN_UNUSED_RESULT bool ReadSingleMessage(MojoResult* read_result);
-
-  // |this| can be destroyed during message dispatch.
-  void ReadAllAvailableMessages();
-
-  // If |force_pipe_reset| is true, this method replaces the existing
-  // |message_pipe_| with a dummy message pipe handle (whose peer is closed).
-  // If |force_async_handler| is true, |connection_error_handler_| is called
-  // asynchronously.
-  void HandleError(bool force_pipe_reset, bool force_async_handler);
-
-  // Cancels any calls made to |waiter_|.
-  void CancelWait();
-
-  void EnsureSyncWatcherExists();
-
-  base::Closure connection_error_handler_;
-
-  ScopedMessagePipeHandle message_pipe_;
-  MessageReceiver* incoming_receiver_ = nullptr;
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  std::unique_ptr<SimpleWatcher> handle_watcher_;
-
-  bool error_ = false;
-  bool drop_writes_ = false;
-  bool enforce_errors_from_incoming_receiver_ = true;
-
-  bool paused_ = false;
-
-  // If sending messages is allowed from multiple threads, |lock_| is used to
-  // protect modifications to |message_pipe_| and |drop_writes_|.
-  base::Optional<base::Lock> lock_;
-
-  std::unique_ptr<SyncHandleWatcher> sync_watcher_;
-  bool allow_woken_up_by_others_ = false;
-  // If non-zero, currently the control flow is inside the sync handle watcher
-  // callback.
-  size_t sync_handle_watcher_callback_count_ = 0;
-
-  base::ThreadChecker thread_checker_;
-
-  base::Lock connected_lock_;
-  bool connected_ = true;
-
-  // The tag used to track heap allocations that originated from a Watcher
-  // notification.
-  const char* heap_profiler_tag_ = nullptr;
-
-  // A cached pointer to the MessageLoopNestingObserver for the MessageLoop on
-  // which this Connector was created.
-  MessageLoopNestingObserver* const nesting_observer_;
-
-  // |true| iff the Connector is currently dispatching a message. Used to detect
-  // nested dispatch operations.
-  bool is_dispatching_ = false;
-
-  // Create a single weak ptr and use it everywhere, to avoid the malloc/free
-  // cost of creating a new weak ptr whenever it is needed.
-  // NOTE: This weak pointer is invalidated when the message pipe is closed or
-  // transferred (i.e., when |connected_| is set to false).
-  base::WeakPtr<Connector> weak_self_;
-  base::WeakPtrFactory<Connector> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(Connector);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_CONNECTOR_H_
diff --git a/mojo/public/cpp/bindings/disconnect_reason.h b/mojo/public/cpp/bindings/disconnect_reason.h
deleted file mode 100644
index c04e8ad..0000000
--- a/mojo/public/cpp/bindings/disconnect_reason.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_DISCONNECT_REASON_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_DISCONNECT_REASON_H_
-
-#include <stdint.h>
-
-#include <string>
-
-namespace mojo {
-
-struct DisconnectReason {
- public:
-  DisconnectReason(uint32_t in_custom_reason, const std::string& in_description)
-      : custom_reason(in_custom_reason), description(in_description) {}
-
-  uint32_t custom_reason;
-  std::string description;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_DISCONNECT_REASON_H_
diff --git a/mojo/public/cpp/bindings/enum_traits.h b/mojo/public/cpp/bindings/enum_traits.h
deleted file mode 100644
index 2c528f3..0000000
--- a/mojo/public/cpp/bindings/enum_traits.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ENUM_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ENUM_TRAITS_H_
-
-namespace mojo {
-
-// This must be specialized for any type |T| to be serialized/deserialized as a
-// mojom enum |MojomType|. Each specialization needs to implement:
-//
-//   template <>
-//   struct EnumTraits<MojomType, T> {
-//     static MojomType ToMojom(T input);
-//
-//     // Returning false results in deserialization failure and causes the
-//     // message pipe receiving it to be disconnected.
-//     static bool FromMojom(MojomType input, T* output);
-//   };
-//
-template <typename MojomType, typename T>
-struct EnumTraits;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ENUM_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/filter_chain.h b/mojo/public/cpp/bindings/filter_chain.h
deleted file mode 100644
index 1262f39..0000000
--- a/mojo/public/cpp/bindings/filter_chain.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_FILTER_CHAIN_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_FILTER_CHAIN_H_
-
-#include <utility>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-
-class MOJO_CPP_BINDINGS_EXPORT FilterChain
-    : NON_EXPORTED_BASE(public MessageReceiver) {
- public:
-  // Doesn't take ownership of |sink|. Therefore |sink| has to stay alive while
-  // this object is alive.
-  explicit FilterChain(MessageReceiver* sink = nullptr);
-
-  FilterChain(FilterChain&& other);
-  FilterChain& operator=(FilterChain&& other);
-  ~FilterChain() override;
-
-  template <typename FilterType, typename... Args>
-  inline void Append(Args&&... args);
-
-  void Append(std::unique_ptr<MessageReceiver> filter);
-
-  // Doesn't take ownership of |sink|. Therefore |sink| has to stay alive while
-  // this object is alive.
-  void SetSink(MessageReceiver* sink);
-
-  // MessageReceiver:
-  bool Accept(Message* message) override;
-
- private:
-  std::vector<std::unique_ptr<MessageReceiver>> filters_;
-
-  MessageReceiver* sink_;
-
-  DISALLOW_COPY_AND_ASSIGN(FilterChain);
-};
-
-template <typename FilterType, typename... Args>
-inline void FilterChain::Append(Args&&... args) {
-  Append(base::MakeUnique<FilterType>(std::forward<Args>(args)...));
-}
-
-template <>
-inline void FilterChain::Append<PassThroughFilter>() {
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_FILTER_CHAIN_H_
diff --git a/mojo/public/cpp/bindings/interface_data_view.h b/mojo/public/cpp/bindings/interface_data_view.h
deleted file mode 100644
index ef12254..0000000
--- a/mojo/public/cpp/bindings/interface_data_view.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_DATA_VIEW_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_DATA_VIEW_H_
-
-namespace mojo {
-
-// They are used for type identification purpose only.
-template <typename Interface>
-class AssociatedInterfacePtrInfoDataView {};
-
-template <typename Interface>
-class AssociatedInterfaceRequestDataView {};
-
-template <typename Interface>
-class InterfacePtrDataView {};
-
-template <typename Interface>
-class InterfaceRequestDataView {};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_DATA_VIEW_H_
diff --git a/mojo/public/cpp/bindings/interface_endpoint_client.h b/mojo/public/cpp/bindings/interface_endpoint_client.h
deleted file mode 100644
index b519fe9..0000000
--- a/mojo/public/cpp/bindings/interface_endpoint_client.h
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ENDPOINT_CLIENT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ENDPOINT_CLIENT_H_
-
-#include <stdint.h>
-
-#include <map>
-#include <memory>
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/disconnect_reason.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
-#include "mojo/public/cpp/bindings/lib/control_message_proxy.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-
-class AssociatedGroup;
-class InterfaceEndpointController;
-
-// InterfaceEndpointClient handles message sending and receiving of an interface
-// endpoint, either the implementation side or the client side.
-// It should only be accessed and destructed on the creating thread.
-class MOJO_CPP_BINDINGS_EXPORT InterfaceEndpointClient
-    : NON_EXPORTED_BASE(public MessageReceiverWithResponder) {
- public:
-  // |receiver| is okay to be null. If it is not null, it must outlive this
-  // object.
-  InterfaceEndpointClient(ScopedInterfaceEndpointHandle handle,
-                          MessageReceiverWithResponderStatus* receiver,
-                          std::unique_ptr<MessageReceiver> payload_validator,
-                          bool expect_sync_requests,
-                          scoped_refptr<base::SingleThreadTaskRunner> runner,
-                          uint32_t interface_version);
-  ~InterfaceEndpointClient() override;
-
-  // Sets the error handler to receive notifications when an error is
-  // encountered.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    error_handler_ = error_handler;
-    error_with_reason_handler_.Reset();
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    error_with_reason_handler_ = error_handler;
-    error_handler_.Reset();
-  }
-
-  // Returns true if an error was encountered.
-  bool encountered_error() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return encountered_error_;
-  }
-
-  // Returns true if this endpoint has any pending callbacks.
-  bool has_pending_responders() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return !async_responders_.empty() || !sync_responses_.empty();
-  }
-
-  AssociatedGroup* associated_group();
-
-  // Adds a MessageReceiver which can filter a message after validation but
-  // before dispatch.
-  void AddFilter(std::unique_ptr<MessageReceiver> filter);
-
-  // After this call the object is in an invalid state and shouldn't be reused.
-  ScopedInterfaceEndpointHandle PassHandle();
-
-  // Raises an error on the underlying message pipe. It disconnects the pipe
-  // and notifies all interfaces running on this pipe.
-  void RaiseError();
-
-  void CloseWithReason(uint32_t custom_reason, const std::string& description);
-
-  // MessageReceiverWithResponder implementation:
-  // They must only be called when the handle is not in pending association
-  // state.
-  bool Accept(Message* message) override;
-  bool AcceptWithResponder(Message* message,
-                           std::unique_ptr<MessageReceiver> responder) override;
-
-  // The following methods are called by the router. They must be called
-  // outside of the router's lock.
-
-  // NOTE: |message| must have passed message header validation.
-  bool HandleIncomingMessage(Message* message);
-  void NotifyError(const base::Optional<DisconnectReason>& reason);
-
-  // The following methods send interface control messages.
-  // They must only be called when the handle is not in pending association
-  // state.
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback);
-  void RequireVersion(uint32_t version);
-  void FlushForTesting();
-
- private:
-  // Maps from the id of a response to the MessageReceiver that handles the
-  // response.
-  using AsyncResponderMap =
-      std::map<uint64_t, std::unique_ptr<MessageReceiver>>;
-
-  struct SyncResponseInfo {
-   public:
-    explicit SyncResponseInfo(bool* in_response_received);
-    ~SyncResponseInfo();
-
-    Message response;
-
-    // Points to a stack-allocated variable.
-    bool* response_received;
-
-   private:
-    DISALLOW_COPY_AND_ASSIGN(SyncResponseInfo);
-  };
-
-  using SyncResponseMap = std::map<uint64_t, std::unique_ptr<SyncResponseInfo>>;
-
-  // Used as the sink for |payload_validator_| and forwards messages to
-  // HandleValidatedMessage().
-  class HandleIncomingMessageThunk : public MessageReceiver {
-   public:
-    explicit HandleIncomingMessageThunk(InterfaceEndpointClient* owner);
-    ~HandleIncomingMessageThunk() override;
-
-    // MessageReceiver implementation:
-    bool Accept(Message* message) override;
-
-   private:
-    InterfaceEndpointClient* const owner_;
-
-    DISALLOW_COPY_AND_ASSIGN(HandleIncomingMessageThunk);
-  };
-
-  void InitControllerIfNecessary();
-
-  void OnAssociationEvent(
-      ScopedInterfaceEndpointHandle::AssociationEvent event);
-
-  bool HandleValidatedMessage(Message* message);
-
-  const bool expect_sync_requests_ = false;
-
-  ScopedInterfaceEndpointHandle handle_;
-  std::unique_ptr<AssociatedGroup> associated_group_;
-  InterfaceEndpointController* controller_ = nullptr;
-
-  MessageReceiverWithResponderStatus* const incoming_receiver_ = nullptr;
-  HandleIncomingMessageThunk thunk_;
-  FilterChain filters_;
-
-  AsyncResponderMap async_responders_;
-  SyncResponseMap sync_responses_;
-
-  uint64_t next_request_id_ = 1;
-
-  base::Closure error_handler_;
-  ConnectionErrorWithReasonCallback error_with_reason_handler_;
-  bool encountered_error_ = false;
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  internal::ControlMessageProxy control_message_proxy_;
-  internal::ControlMessageHandler control_message_handler_;
-
-  base::ThreadChecker thread_checker_;
-
-  base::WeakPtrFactory<InterfaceEndpointClient> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(InterfaceEndpointClient);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ENDPOINT_CLIENT_H_
diff --git a/mojo/public/cpp/bindings/interface_endpoint_controller.h b/mojo/public/cpp/bindings/interface_endpoint_controller.h
deleted file mode 100644
index 8d99d4a..0000000
--- a/mojo/public/cpp/bindings/interface_endpoint_controller.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ENDPOINT_CONTROLLER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ENDPOINT_CONTROLLER_H_
-
-namespace mojo {
-
-class Message;
-
-// A control interface exposed by AssociatedGroupController for interface
-// endpoints.
-class InterfaceEndpointController {
- public:
-  virtual ~InterfaceEndpointController() {}
-
-  virtual bool SendMessage(Message* message) = 0;
-
-  // Allows the interface endpoint to watch for incoming sync messages while
-  // others perform sync handle watching on the same thread. Please see comments
-  // of SyncHandleWatcher::AllowWokenUpBySyncWatchOnSameThread().
-  virtual void AllowWokenUpBySyncWatchOnSameThread() = 0;
-
-  // Watches the interface endpoint for incoming sync messages. (It also watches
-  // other other handles registered to be watched together.)
-  // This method:
-  //   - returns true when |should_stop| is set to true;
-  //   - return false otherwise, including
-  //     MultiplexRouter::DetachEndpointClient() being called for the same
-  //     interface endpoint.
-  virtual bool SyncWatch(const bool* should_stop) = 0;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ENDPOINT_CONTROLLER_H_
diff --git a/mojo/public/cpp/bindings/interface_id.h b/mojo/public/cpp/bindings/interface_id.h
deleted file mode 100644
index 53475d6..0000000
--- a/mojo/public/cpp/bindings/interface_id.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ID_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ID_H_
-
-#include <stdint.h>
-
-namespace mojo {
-
-// The size of the type matters because it is directly used in messages.
-using InterfaceId = uint32_t;
-
-// IDs of associated interface can be generated at both sides of the message
-// pipe. In order to avoid collision, the highest bit is used as namespace bit:
-// at the side where the client-side of the master interface lives, IDs are
-// generated with the namespace bit set to 1; at the opposite side IDs are
-// generated with the namespace bit set to 0.
-const uint32_t kInterfaceIdNamespaceMask = 0x80000000;
-
-const InterfaceId kMasterInterfaceId = 0x00000000;
-const InterfaceId kInvalidInterfaceId = 0xFFFFFFFF;
-
-inline bool IsMasterInterfaceId(InterfaceId id) {
-  return id == kMasterInterfaceId;
-}
-
-inline bool IsValidInterfaceId(InterfaceId id) {
-  return id != kInvalidInterfaceId;
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ID_H_
diff --git a/mojo/public/cpp/bindings/interface_ptr.h b/mojo/public/cpp/bindings/interface_ptr.h
deleted file mode 100644
index e88be74..0000000
--- a/mojo/public/cpp/bindings/interface_ptr.h
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <utility>
-
-#include "base/callback_forward.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/lib/interface_ptr_state.h"
-
-namespace mojo {
-
-// A pointer to a local proxy of a remote Interface implementation. Uses a
-// message pipe to communicate with the remote implementation, and automatically
-// closes the pipe and deletes the proxy on destruction. The pointer must be
-// bound to a message pipe before the interface methods can be called.
-//
-// This class is thread hostile, as is the local proxy it manages, while bound
-// to a message pipe. All calls to this class or the proxy should be from the
-// same thread that bound it. If you need to move the proxy to a different
-// thread, extract the InterfacePtrInfo (containing just the message pipe and
-// any version information) using PassInterface(), pass it to a different
-// thread, and create and bind a new InterfacePtr from that thread. If an
-// InterfacePtr is not bound to a message pipe, it may be bound or destroyed on
-// any thread.
-template <typename Interface>
-class InterfacePtr {
- public:
-  using InterfaceType = Interface;
-  using PtrInfoType = InterfacePtrInfo<Interface>;
-
-  // Constructs an unbound InterfacePtr.
-  InterfacePtr() {}
-  InterfacePtr(decltype(nullptr)) {}
-
-  // Takes over the binding of another InterfacePtr.
-  InterfacePtr(InterfacePtr&& other) {
-    internal_state_.Swap(&other.internal_state_);
-  }
-
-  // Takes over the binding of another InterfacePtr, and closes any message pipe
-  // already bound to this pointer.
-  InterfacePtr& operator=(InterfacePtr&& other) {
-    reset();
-    internal_state_.Swap(&other.internal_state_);
-    return *this;
-  }
-
-  // Assigning nullptr to this class causes it to close the currently bound
-  // message pipe (if any) and returns the pointer to the unbound state.
-  InterfacePtr& operator=(decltype(nullptr)) {
-    reset();
-    return *this;
-  }
-
-  // Closes the bound message pipe (if any) on destruction.
-  ~InterfacePtr() {}
-
-  // Binds the InterfacePtr to a remote implementation of Interface.
-  //
-  // Calling with an invalid |info| (containing an invalid message pipe handle)
-  // has the same effect as reset(). In this case, the InterfacePtr is not
-  // considered as bound.
-  //
-  // |runner| must belong to the same thread. It will be used to dispatch all
-  // callbacks and connection error notification. It is useful when you attach
-  // multiple task runners to a single thread for the purposes of task
-  // scheduling.
-  void Bind(InterfacePtrInfo<Interface> info,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    reset();
-    if (info.is_valid())
-      internal_state_.Bind(std::move(info), std::move(runner));
-  }
-
-  // Returns whether or not this InterfacePtr is bound to a message pipe.
-  bool is_bound() const { return internal_state_.is_bound(); }
-
-  // Returns a raw pointer to the local proxy. Caller does not take ownership.
-  // Note that the local proxy is thread hostile, as stated above.
-  Interface* get() const { return internal_state_.instance(); }
-
-  // Functions like a pointer to Interface. Must already be bound.
-  Interface* operator->() const { return get(); }
-  Interface& operator*() const { return *get(); }
-
-  // Returns the version number of the interface that the remote side supports.
-  uint32_t version() const { return internal_state_.version(); }
-
-  // Queries the max version that the remote side supports. On completion, the
-  // result will be returned as the input of |callback|. The version number of
-  // this interface pointer will also be updated.
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback) {
-    internal_state_.QueryVersion(callback);
-  }
-
-  // If the remote side doesn't support the specified version, it will close its
-  // end of the message pipe asynchronously. This does nothing if it's already
-  // known that the remote side supports the specified version, i.e., if
-  // |version <= this->version()|.
-  //
-  // After calling RequireVersion() with a version not supported by the remote
-  // side, all subsequent calls to interface methods will be ignored.
-  void RequireVersion(uint32_t version) {
-    internal_state_.RequireVersion(version);
-  }
-
-  // Sends a no-op message on the underlying message pipe and runs the current
-  // message loop until its response is received. This can be used in tests to
-  // verify that no message was sent on a message pipe in response to some
-  // stimulus.
-  void FlushForTesting() { internal_state_.FlushForTesting(); }
-
-  // Closes the bound message pipe (if any) and returns the pointer to the
-  // unbound state.
-  void reset() {
-    State doomed;
-    internal_state_.Swap(&doomed);
-  }
-
-  // Similar to the method above, but also specifies a disconnect reason.
-  void ResetWithReason(uint32_t custom_reason, const std::string& description) {
-    if (internal_state_.is_bound())
-      internal_state_.CloseWithReason(custom_reason, description);
-    reset();
-  }
-
-  // Whether there are any associated interfaces running on the pipe currently.
-  bool HasAssociatedInterfaces() const {
-    return internal_state_.HasAssociatedInterfaces();
-  }
-
-  // Indicates whether the message pipe has encountered an error. If true,
-  // method calls made on this interface will be dropped (and may already have
-  // been dropped).
-  bool encountered_error() const { return internal_state_.encountered_error(); }
-
-  // Registers a handler to receive error notifications. The handler will be
-  // called from the thread that owns this InterfacePtr.
-  //
-  // This method may only be called after the InterfacePtr has been bound to a
-  // message pipe.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    internal_state_.set_connection_error_handler(error_handler);
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    internal_state_.set_connection_error_with_reason_handler(error_handler);
-  }
-
-  // Unbinds the InterfacePtr and returns the information which could be used
-  // to setup an InterfacePtr again. This method may be used to move the proxy
-  // to a different thread (see class comments for details).
-  //
-  // It is an error to call PassInterface() while:
-  //   - there are pending responses; or
-  //     TODO: fix this restriction, it's not always obvious when there is a
-  //     pending response.
-  //   - there are associated interfaces running.
-  //     TODO(yzshen): For now, users need to make sure there is no one holding
-  //     on to associated interface endpoint handles at both sides of the
-  //     message pipe in order to call this method. We need a way to forcefully
-  //     invalidate associated interface endpoint handles.
-  InterfacePtrInfo<Interface> PassInterface() {
-    CHECK(!HasAssociatedInterfaces());
-    CHECK(!internal_state_.has_pending_callbacks());
-    State state;
-    internal_state_.Swap(&state);
-
-    return state.PassInterface();
-  }
-
-  bool Equals(const InterfacePtr& other) const {
-    if (this == &other)
-      return true;
-
-    // Now that the two refer to different objects, they are equivalent if
-    // and only if they are both null.
-    return !(*this) && !other;
-  }
-
-  // DO NOT USE. Exposed only for internal use and for testing.
-  internal::InterfacePtrState<Interface>* internal_state() {
-    return &internal_state_;
-  }
-
-  // Allow InterfacePtr<> to be used in boolean expressions, but not
-  // implicitly convertible to a real bool (which is dangerous).
- private:
-  // TODO(dcheng): Use an explicit conversion operator.
-  typedef internal::InterfacePtrState<Interface> InterfacePtr::*Testable;
-
- public:
-  operator Testable() const {
-    return internal_state_.is_bound() ? &InterfacePtr::internal_state_
-                                      : nullptr;
-  }
-
- private:
-  // Forbid the == and != operators explicitly, otherwise InterfacePtr will be
-  // converted to Testable to do == or != comparison.
-  template <typename T>
-  bool operator==(const InterfacePtr<T>& other) const = delete;
-  template <typename T>
-  bool operator!=(const InterfacePtr<T>& other) const = delete;
-
-  typedef internal::InterfacePtrState<Interface> State;
-  mutable State internal_state_;
-
-  DISALLOW_COPY_AND_ASSIGN(InterfacePtr);
-};
-
-// If |info| is valid (containing a valid message pipe handle), returns an
-// InterfacePtr bound to it. Otherwise, returns an unbound InterfacePtr.
-template <typename Interface>
-InterfacePtr<Interface> MakeProxy(
-    InterfacePtrInfo<Interface> info,
-    scoped_refptr<base::SingleThreadTaskRunner> runner =
-        base::ThreadTaskRunnerHandle::Get()) {
-  InterfacePtr<Interface> ptr;
-  if (info.is_valid())
-    ptr.Bind(std::move(info), std::move(runner));
-  return std::move(ptr);
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_
diff --git a/mojo/public/cpp/bindings/interface_ptr_info.h b/mojo/public/cpp/bindings/interface_ptr_info.h
deleted file mode 100644
index 0b2d808..0000000
--- a/mojo/public/cpp/bindings/interface_ptr_info.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_INFO_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_INFO_H_
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace mojo {
-
-// InterfacePtrInfo stores necessary information to communicate with a remote
-// interface implementation, which could be used to construct an InterfacePtr.
-template <typename Interface>
-class InterfacePtrInfo {
- public:
-  InterfacePtrInfo() : version_(0u) {}
-
-  InterfacePtrInfo(ScopedMessagePipeHandle handle, uint32_t version)
-      : handle_(std::move(handle)), version_(version) {}
-
-  InterfacePtrInfo(InterfacePtrInfo&& other)
-      : handle_(std::move(other.handle_)), version_(other.version_) {
-    other.version_ = 0u;
-  }
-
-  ~InterfacePtrInfo() {}
-
-  InterfacePtrInfo& operator=(InterfacePtrInfo&& other) {
-    if (this != &other) {
-      handle_ = std::move(other.handle_);
-      version_ = other.version_;
-      other.version_ = 0u;
-    }
-
-    return *this;
-  }
-
-  bool is_valid() const { return handle_.is_valid(); }
-
-  ScopedMessagePipeHandle PassHandle() { return std::move(handle_); }
-  const ScopedMessagePipeHandle& handle() const { return handle_; }
-  void set_handle(ScopedMessagePipeHandle handle) {
-    handle_ = std::move(handle);
-  }
-
-  uint32_t version() const { return version_; }
-  void set_version(uint32_t version) { version_ = version; }
-
- private:
-  ScopedMessagePipeHandle handle_;
-  uint32_t version_;
-
-  DISALLOW_COPY_AND_ASSIGN(InterfacePtrInfo);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_INFO_H_
diff --git a/mojo/public/cpp/bindings/interface_ptr_set.h b/mojo/public/cpp/bindings/interface_ptr_set.h
deleted file mode 100644
index 09a2682..0000000
--- a/mojo/public/cpp/bindings/interface_ptr_set.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_SET_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_SET_H_
-
-#include <utility>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-
-namespace mojo {
-namespace internal {
-
-// TODO(blundell): This class should be rewritten to be structured
-// similarly to BindingSet if possible, with PtrSet owning its
-// Elements and those Elements calling back into PtrSet on connection
-// error.
-template <typename Interface, template <typename> class Ptr>
-class PtrSet {
- public:
-  PtrSet() {}
-  ~PtrSet() { CloseAll(); }
-
-  void AddPtr(Ptr<Interface> ptr) {
-    auto weak_interface_ptr = new Element(std::move(ptr));
-    ptrs_.push_back(weak_interface_ptr->GetWeakPtr());
-    ClearNullPtrs();
-  }
-
-  template <typename FunctionType>
-  void ForAllPtrs(FunctionType function) {
-    for (const auto& it : ptrs_) {
-      if (it)
-        function(it->get());
-    }
-    ClearNullPtrs();
-  }
-
-  void CloseAll() {
-    for (const auto& it : ptrs_) {
-      if (it)
-        it->Close();
-    }
-    ptrs_.clear();
-  }
-
- private:
-  class Element {
-   public:
-    explicit Element(Ptr<Interface> ptr)
-        : ptr_(std::move(ptr)), weak_ptr_factory_(this) {
-      ptr_.set_connection_error_handler(base::Bind(&DeleteElement, this));
-    }
-
-    ~Element() {}
-
-    void Close() {
-      ptr_.reset();
-
-      // Resetting the interface ptr means that it won't call this object back
-      // on connection error anymore, so this object must delete itself now.
-      DeleteElement(this);
-    }
-
-    Interface* get() { return ptr_.get(); }
-
-    base::WeakPtr<Element> GetWeakPtr() {
-      return weak_ptr_factory_.GetWeakPtr();
-    }
-
-   private:
-    static void DeleteElement(Element* element) { delete element; }
-
-    Ptr<Interface> ptr_;
-    base::WeakPtrFactory<Element> weak_ptr_factory_;
-
-    DISALLOW_COPY_AND_ASSIGN(Element);
-  };
-
-  void ClearNullPtrs() {
-    ptrs_.erase(std::remove_if(ptrs_.begin(), ptrs_.end(),
-                               [](const base::WeakPtr<Element>& p) {
-                                 return p.get() == nullptr;
-                               }),
-                ptrs_.end());
-  }
-
-  std::vector<base::WeakPtr<Element>> ptrs_;
-};
-
-}  // namespace internal
-
-template <typename Interface>
-using InterfacePtrSet = internal::PtrSet<Interface, InterfacePtr>;
-
-template <typename Interface>
-using AssociatedInterfacePtrSet =
-    internal::PtrSet<Interface, AssociatedInterfacePtr>;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_SET_H_
diff --git a/mojo/public/cpp/bindings/interface_request.h b/mojo/public/cpp/bindings/interface_request.h
deleted file mode 100644
index 29d8836..0000000
--- a/mojo/public/cpp/bindings/interface_request.h
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_
-
-#include <string>
-#include <utility>
-
-#include "base/macros.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/disconnect_reason.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_proxy.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace mojo {
-
-// Represents a request from a remote client for an implementation of Interface
-// over a specified message pipe. The implementor of the interface should
-// remove the message pipe by calling PassMessagePipe() and bind it to the
-// implementation. If this is not done, the InterfaceRequest will automatically
-// close the pipe on destruction. Can also represent the absence of a request
-// if the client did not provide a message pipe.
-template <typename Interface>
-class InterfaceRequest {
- public:
-  // Constructs an empty InterfaceRequest, representing that the client is not
-  // requesting an implementation of Interface.
-  InterfaceRequest() {}
-  InterfaceRequest(decltype(nullptr)) {}
-
-  // Creates a new message pipe over which Interface is to be served, binding
-  // the specified InterfacePtr to one end of the message pipe and this
-  // InterfaceRequest to the other. For example usage, see comments on
-  // MakeRequest(InterfacePtr*) below.
-  explicit InterfaceRequest(InterfacePtr<Interface>* ptr,
-                            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                                base::ThreadTaskRunnerHandle::Get()) {
-    MessagePipe pipe;
-    ptr->Bind(InterfacePtrInfo<Interface>(std::move(pipe.handle0), 0u),
-              std::move(runner));
-    Bind(std::move(pipe.handle1));
-  }
-
-  // Takes the message pipe from another InterfaceRequest.
-  InterfaceRequest(InterfaceRequest&& other) {
-    handle_ = std::move(other.handle_);
-  }
-  InterfaceRequest& operator=(InterfaceRequest&& other) {
-    handle_ = std::move(other.handle_);
-    return *this;
-  }
-
-  // Assigning to nullptr resets the InterfaceRequest to an empty state,
-  // closing the message pipe currently bound to it (if any).
-  InterfaceRequest& operator=(decltype(nullptr)) {
-    handle_.reset();
-    return *this;
-  }
-
-  // Binds the request to a message pipe over which Interface is to be
-  // requested.  If the request is already bound to a message pipe, the current
-  // message pipe will be closed.
-  void Bind(ScopedMessagePipeHandle handle) { handle_ = std::move(handle); }
-
-  // Indicates whether the request currently contains a valid message pipe.
-  bool is_pending() const { return handle_.is_valid(); }
-
-  // Removes the message pipe from the request and returns it.
-  ScopedMessagePipeHandle PassMessagePipe() { return std::move(handle_); }
-
-  bool Equals(const InterfaceRequest& other) const {
-    if (this == &other)
-      return true;
-
-    // Now that the two refer to different objects, they are equivalent if
-    // and only if they are both invalid.
-    return !is_pending() && !other.is_pending();
-  }
-
-  void ResetWithReason(uint32_t custom_reason, const std::string& description) {
-    if (!handle_.is_valid())
-      return;
-
-    Message message =
-        PipeControlMessageProxy::ConstructPeerEndpointClosedMessage(
-            kMasterInterfaceId, DisconnectReason(custom_reason, description));
-    MojoResult result = WriteMessageNew(
-        handle_.get(), message.TakeMojoMessage(), MOJO_WRITE_MESSAGE_FLAG_NONE);
-    DCHECK_EQ(MOJO_RESULT_OK, result);
-
-    handle_.reset();
-  }
-
- private:
-  ScopedMessagePipeHandle handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(InterfaceRequest);
-};
-
-// Makes an InterfaceRequest bound to the specified message pipe. If |handle|
-// is empty or invalid, the resulting InterfaceRequest will represent the
-// absence of a request.
-template <typename Interface>
-InterfaceRequest<Interface> MakeRequest(ScopedMessagePipeHandle handle) {
-  InterfaceRequest<Interface> request;
-  request.Bind(std::move(handle));
-  return std::move(request);
-}
-
-// Creates a new message pipe over which Interface is to be served. Binds the
-// specified InterfacePtr to one end of the message pipe, and returns an
-// InterfaceRequest bound to the other. The InterfacePtr should be passed to
-// the client, and the InterfaceRequest should be passed to whatever will
-// provide the implementation. The implementation should typically be bound to
-// the InterfaceRequest using the Binding or StrongBinding classes. The client
-// may begin to issue calls even before an implementation has been bound, since
-// messages sent over the pipe will just queue up until they are consumed by
-// the implementation.
-//
-// Example #1: Requesting a remote implementation of an interface.
-// ===============================================================
-//
-// Given the following interface:
-//
-//   interface Database {
-//     OpenTable(Table& table);
-//   }
-//
-// The client would have code similar to the following:
-//
-//   DatabasePtr database = ...;  // Connect to database.
-//   TablePtr table;
-//   database->OpenTable(MakeRequest(&table));
-//
-// Upon return from MakeRequest, |table| is ready to have methods called on it.
-//
-// Example #2: Registering a local implementation with a remote service.
-// =====================================================================
-//
-// Given the following interface
-//   interface Collector {
-//     RegisterSource(Source source);
-//   }
-//
-// The client would have code similar to the following:
-//
-//   CollectorPtr collector = ...;  // Connect to Collector.
-//   SourcePtr source;
-//   InterfaceRequest<Source> source_request(&source);
-//   collector->RegisterSource(std::move(source));
-//   CreateSource(std::move(source_request));  // Create implementation locally.
-//
-template <typename Interface>
-InterfaceRequest<Interface> MakeRequest(
-    InterfacePtr<Interface>* ptr,
-    scoped_refptr<base::SingleThreadTaskRunner> runner =
-        base::ThreadTaskRunnerHandle::Get()) {
-  return InterfaceRequest<Interface>(ptr, runner);
-}
-
-// Fuses an InterfaceRequest<T> endpoint with an InterfacePtrInfo<T> endpoint.
-// Returns |true| on success or |false| on failure.
-template <typename Interface>
-bool FuseInterface(InterfaceRequest<Interface> request,
-                   InterfacePtrInfo<Interface> proxy_info) {
-  MojoResult result = FuseMessagePipes(request.PassMessagePipe(),
-                                       proxy_info.PassHandle());
-  return result == MOJO_RESULT_OK;
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_
diff --git a/mojo/public/cpp/bindings/lib/array_internal.cc b/mojo/public/cpp/bindings/lib/array_internal.cc
deleted file mode 100644
index dd24eac..0000000
--- a/mojo/public/cpp/bindings/lib/array_internal.cc
+++ /dev/null
@@ -1,59 +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.
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <sstream>
-
-namespace mojo {
-namespace internal {
-
-std::string MakeMessageWithArrayIndex(const char* message,
-                                      size_t size,
-                                      size_t index) {
-  std::ostringstream stream;
-  stream << message << ": array size - " << size << "; index - " << index;
-  return stream.str();
-}
-
-std::string MakeMessageWithExpectedArraySize(const char* message,
-                                             size_t size,
-                                             size_t expected_size) {
-  std::ostringstream stream;
-  stream << message << ": array size - " << size << "; expected size - "
-         << expected_size;
-  return stream.str();
-}
-
-ArrayDataTraits<bool>::BitRef::~BitRef() {
-}
-
-ArrayDataTraits<bool>::BitRef::BitRef(uint8_t* storage, uint8_t mask)
-    : storage_(storage), mask_(mask) {
-}
-
-ArrayDataTraits<bool>::BitRef& ArrayDataTraits<bool>::BitRef::operator=(
-    bool value) {
-  if (value) {
-    *storage_ |= mask_;
-  } else {
-    *storage_ &= ~mask_;
-  }
-  return *this;
-}
-
-ArrayDataTraits<bool>::BitRef& ArrayDataTraits<bool>::BitRef::operator=(
-    const BitRef& value) {
-  return (*this) = static_cast<bool>(value);
-}
-
-ArrayDataTraits<bool>::BitRef::operator bool() const {
-  return (*storage_ & mask_) != 0;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/array_internal.h b/mojo/public/cpp/bindings/lib/array_internal.h
deleted file mode 100644
index eecfcfb..0000000
--- a/mojo/public/cpp/bindings/lib/array_internal.h
+++ /dev/null
@@ -1,368 +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.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-#include <new>
-
-#include "base/logging.h"
-#include "mojo/public/c/system/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-#include "mojo/public/cpp/bindings/lib/validate_params.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename K, typename V>
-class Map_Data;
-
-MOJO_CPP_BINDINGS_EXPORT std::string
-MakeMessageWithArrayIndex(const char* message, size_t size, size_t index);
-
-MOJO_CPP_BINDINGS_EXPORT std::string MakeMessageWithExpectedArraySize(
-    const char* message,
-    size_t size,
-    size_t expected_size);
-
-template <typename T>
-struct ArrayDataTraits {
-  using StorageType = T;
-  using Ref = T&;
-  using ConstRef = const T&;
-
-  static const uint32_t kMaxNumElements =
-      (std::numeric_limits<uint32_t>::max() - sizeof(ArrayHeader)) /
-      sizeof(StorageType);
-
-  static uint32_t GetStorageSize(uint32_t num_elements) {
-    DCHECK(num_elements <= kMaxNumElements);
-    return sizeof(ArrayHeader) + sizeof(StorageType) * num_elements;
-  }
-  static Ref ToRef(StorageType* storage, size_t offset) {
-    return storage[offset];
-  }
-  static ConstRef ToConstRef(const StorageType* storage, size_t offset) {
-    return storage[offset];
-  }
-};
-
-// Specialization of Arrays for bools, optimized for space. It has the
-// following differences from a generalized Array:
-// * Each element takes up a single bit of memory.
-// * Accessing a non-const single element uses a helper class |BitRef|, which
-// emulates a reference to a bool.
-template <>
-struct ArrayDataTraits<bool> {
-  // Helper class to emulate a reference to a bool, used for direct element
-  // access.
-  class MOJO_CPP_BINDINGS_EXPORT BitRef {
-   public:
-    ~BitRef();
-    BitRef& operator=(bool value);
-    BitRef& operator=(const BitRef& value);
-    operator bool() const;
-
-   private:
-    friend struct ArrayDataTraits<bool>;
-    BitRef(uint8_t* storage, uint8_t mask);
-    BitRef();
-    uint8_t* storage_;
-    uint8_t mask_;
-  };
-
-  // Because each element consumes only 1/8 byte.
-  static const uint32_t kMaxNumElements = std::numeric_limits<uint32_t>::max();
-
-  using StorageType = uint8_t;
-  using Ref = BitRef;
-  using ConstRef = bool;
-
-  static uint32_t GetStorageSize(uint32_t num_elements) {
-    return sizeof(ArrayHeader) + ((num_elements + 7) / 8);
-  }
-  static BitRef ToRef(StorageType* storage, size_t offset) {
-    return BitRef(&storage[offset / 8], 1 << (offset % 8));
-  }
-  static bool ToConstRef(const StorageType* storage, size_t offset) {
-    return (storage[offset / 8] & (1 << (offset % 8))) != 0;
-  }
-};
-
-// What follows is code to support the serialization/validation of
-// Array_Data<T>. There are four interesting cases: arrays of primitives,
-// arrays of handles/interfaces, arrays of objects and arrays of unions.
-// Arrays of objects are represented as arrays of pointers to objects. Arrays
-// of unions are inlined so they are not pointers, but comparing with primitives
-// they require more work for serialization/validation.
-//
-// TODO(yzshen): Validation code should be organzied in a way similar to
-// Serializer<>, or merged into it. It should be templatized with the mojo
-// data view type instead of the data type, that way we can use MojomTypeTraits
-// to determine the categories.
-
-template <typename T, bool is_union, bool is_handle_or_interface>
-struct ArraySerializationHelper;
-
-template <typename T>
-struct ArraySerializationHelper<T, false, false> {
-  using ElementType = typename ArrayDataTraits<T>::StorageType;
-
-  static bool ValidateElements(const ArrayHeader* header,
-                               const ElementType* elements,
-                               ValidationContext* validation_context,
-                               const ContainerValidateParams* validate_params) {
-    DCHECK(!validate_params->element_is_nullable)
-        << "Primitive type should be non-nullable";
-    DCHECK(!validate_params->element_validate_params)
-        << "Primitive type should not have array validate params";
-
-    if (!validate_params->validate_enum_func)
-      return true;
-
-    // Enum validation.
-    for (uint32_t i = 0; i < header->num_elements; ++i) {
-      if (!validate_params->validate_enum_func(elements[i], validation_context))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename T>
-struct ArraySerializationHelper<T, false, true> {
-  using ElementType = typename ArrayDataTraits<T>::StorageType;
-
-  static bool ValidateElements(const ArrayHeader* header,
-                               const ElementType* elements,
-                               ValidationContext* validation_context,
-                               const ContainerValidateParams* validate_params) {
-    DCHECK(!validate_params->element_validate_params)
-        << "Handle or interface type should not have array validate params";
-
-    for (uint32_t i = 0; i < header->num_elements; ++i) {
-      if (!validate_params->element_is_nullable &&
-          !IsHandleOrInterfaceValid(elements[i])) {
-        static const ValidationError kError =
-            std::is_same<T, Interface_Data>::value ||
-                    std::is_same<T, Handle_Data>::value
-                ? VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE
-                : VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID;
-        ReportValidationError(
-            validation_context, kError,
-            MakeMessageWithArrayIndex(
-                "invalid handle or interface ID in array expecting valid "
-                "handles or interface IDs",
-                header->num_elements, i)
-                .c_str());
-        return false;
-      }
-      if (!ValidateHandleOrInterface(elements[i], validation_context))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename T>
-struct ArraySerializationHelper<Pointer<T>, false, false> {
-  using ElementType = typename ArrayDataTraits<Pointer<T>>::StorageType;
-
-  static bool ValidateElements(const ArrayHeader* header,
-                               const ElementType* elements,
-                               ValidationContext* validation_context,
-                               const ContainerValidateParams* validate_params) {
-    for (uint32_t i = 0; i < header->num_elements; ++i) {
-      if (!validate_params->element_is_nullable && !elements[i].offset) {
-        ReportValidationError(
-            validation_context,
-            VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-            MakeMessageWithArrayIndex("null in array expecting valid pointers",
-                                      header->num_elements,
-                                      i).c_str());
-        return false;
-      }
-      if (!ValidateCaller<T>::Run(elements[i], validation_context,
-                                  validate_params->element_validate_params)) {
-        return false;
-      }
-    }
-    return true;
-  }
-
- private:
-  template <typename U,
-            bool is_array_or_map = IsSpecializationOf<Array_Data, U>::value ||
-                                   IsSpecializationOf<Map_Data, U>::value>
-  struct ValidateCaller {
-    static bool Run(const Pointer<U>& data,
-                    ValidationContext* validation_context,
-                    const ContainerValidateParams* validate_params) {
-      DCHECK(!validate_params)
-          << "Struct type should not have array validate params";
-
-      return ValidateStruct(data, validation_context);
-    }
-  };
-
-  template <typename U>
-  struct ValidateCaller<U, true> {
-    static bool Run(const Pointer<U>& data,
-                    ValidationContext* validation_context,
-                    const ContainerValidateParams* validate_params) {
-      return ValidateContainer(data, validation_context, validate_params);
-    }
-  };
-};
-
-template <typename U>
-struct ArraySerializationHelper<U, true, false> {
-  using ElementType = typename ArrayDataTraits<U>::StorageType;
-
-  static bool ValidateElements(const ArrayHeader* header,
-                               const ElementType* elements,
-                               ValidationContext* validation_context,
-                               const ContainerValidateParams* validate_params) {
-    for (uint32_t i = 0; i < header->num_elements; ++i) {
-      if (!validate_params->element_is_nullable && elements[i].is_null()) {
-        ReportValidationError(
-            validation_context,
-            VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-            MakeMessageWithArrayIndex("null in array expecting valid unions",
-                                      header->num_elements, i)
-                .c_str());
-        return false;
-      }
-      if (!ValidateInlinedUnion(elements[i], validation_context))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename T>
-class Array_Data {
- public:
-  using Traits = ArrayDataTraits<T>;
-  using StorageType = typename Traits::StorageType;
-  using Ref = typename Traits::Ref;
-  using ConstRef = typename Traits::ConstRef;
-  using Helper = ArraySerializationHelper<
-      T,
-      IsUnionDataType<T>::value,
-      std::is_same<T, AssociatedInterface_Data>::value ||
-          std::is_same<T, AssociatedEndpointHandle_Data>::value ||
-          std::is_same<T, Interface_Data>::value ||
-          std::is_same<T, Handle_Data>::value>;
-  using Element = T;
-
-  // Returns null if |num_elements| or the corresponding storage size cannot be
-  // stored in uint32_t.
-  static Array_Data<T>* New(size_t num_elements, Buffer* buf) {
-    if (num_elements > Traits::kMaxNumElements)
-      return nullptr;
-
-    uint32_t num_bytes =
-        Traits::GetStorageSize(static_cast<uint32_t>(num_elements));
-    return new (buf->Allocate(num_bytes))
-        Array_Data<T>(num_bytes, static_cast<uint32_t>(num_elements));
-  }
-
-  static bool Validate(const void* data,
-                       ValidationContext* validation_context,
-                       const ContainerValidateParams* validate_params) {
-    if (!data)
-      return true;
-    if (!IsAligned(data)) {
-      ReportValidationError(validation_context,
-                            VALIDATION_ERROR_MISALIGNED_OBJECT);
-      return false;
-    }
-    if (!validation_context->IsValidRange(data, sizeof(ArrayHeader))) {
-      ReportValidationError(validation_context,
-                            VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
-      return false;
-    }
-    const ArrayHeader* header = static_cast<const ArrayHeader*>(data);
-    if (header->num_elements > Traits::kMaxNumElements ||
-        header->num_bytes < Traits::GetStorageSize(header->num_elements)) {
-      ReportValidationError(validation_context,
-                            VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER);
-      return false;
-    }
-    if (validate_params->expected_num_elements != 0 &&
-        header->num_elements != validate_params->expected_num_elements) {
-      ReportValidationError(
-          validation_context,
-          VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER,
-          MakeMessageWithExpectedArraySize(
-              "fixed-size array has wrong number of elements",
-              header->num_elements,
-              validate_params->expected_num_elements).c_str());
-      return false;
-    }
-    if (!validation_context->ClaimMemory(data, header->num_bytes)) {
-      ReportValidationError(validation_context,
-                            VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
-      return false;
-    }
-
-    const Array_Data<T>* object = static_cast<const Array_Data<T>*>(data);
-    return Helper::ValidateElements(&object->header_, object->storage(),
-                                    validation_context, validate_params);
-  }
-
-  size_t size() const { return header_.num_elements; }
-
-  Ref at(size_t offset) {
-    DCHECK(offset < static_cast<size_t>(header_.num_elements));
-    return Traits::ToRef(storage(), offset);
-  }
-
-  ConstRef at(size_t offset) const {
-    DCHECK(offset < static_cast<size_t>(header_.num_elements));
-    return Traits::ToConstRef(storage(), offset);
-  }
-
-  StorageType* storage() {
-    return reinterpret_cast<StorageType*>(reinterpret_cast<char*>(this) +
-                                          sizeof(*this));
-  }
-
-  const StorageType* storage() const {
-    return reinterpret_cast<const StorageType*>(
-        reinterpret_cast<const char*>(this) + sizeof(*this));
-  }
-
- private:
-  Array_Data(uint32_t num_bytes, uint32_t num_elements) {
-    header_.num_bytes = num_bytes;
-    header_.num_elements = num_elements;
-  }
-  ~Array_Data() = delete;
-
-  internal::ArrayHeader header_;
-
-  // Elements of type internal::ArrayDataTraits<T>::StorageType follow.
-};
-static_assert(sizeof(Array_Data<char>) == 8, "Bad sizeof(Array_Data)");
-
-// UTF-8 encoded
-using String_Data = Array_Data<char>;
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_
diff --git a/mojo/public/cpp/bindings/lib/array_serialization.h b/mojo/public/cpp/bindings/lib/array_serialization.h
deleted file mode 100644
index d2f8ecf..0000000
--- a/mojo/public/cpp/bindings/lib/array_serialization.h
+++ /dev/null
@@ -1,555 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_
-
-#include <stddef.h>
-#include <string.h>  // For |memcpy()|.
-
-#include <limits>
-#include <type_traits>
-#include <utility>
-#include <vector>
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/array_data_view.h"
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename Traits,
-          typename MaybeConstUserType,
-          bool HasGetBegin =
-              HasGetBeginMethod<Traits, MaybeConstUserType>::value>
-class ArrayIterator {};
-
-// Used as the UserTypeIterator template parameter of ArraySerializer.
-template <typename Traits, typename MaybeConstUserType>
-class ArrayIterator<Traits, MaybeConstUserType, true> {
- public:
-  using IteratorType = decltype(
-      CallGetBeginIfExists<Traits>(std::declval<MaybeConstUserType&>()));
-
-  explicit ArrayIterator(MaybeConstUserType& input)
-      : input_(input), iter_(CallGetBeginIfExists<Traits>(input)) {}
-  ~ArrayIterator() {}
-
-  size_t GetSize() const { return Traits::GetSize(input_); }
-
-  using GetNextResult =
-      decltype(Traits::GetValue(std::declval<IteratorType&>()));
-  GetNextResult GetNext() {
-    GetNextResult value = Traits::GetValue(iter_);
-    Traits::AdvanceIterator(iter_);
-    return value;
-  }
-
-  using GetDataIfExistsResult = decltype(
-      CallGetDataIfExists<Traits>(std::declval<MaybeConstUserType&>()));
-  GetDataIfExistsResult GetDataIfExists() {
-    return CallGetDataIfExists<Traits>(input_);
-  }
-
- private:
-  MaybeConstUserType& input_;
-  IteratorType iter_;
-};
-
-// Used as the UserTypeIterator template parameter of ArraySerializer.
-template <typename Traits, typename MaybeConstUserType>
-class ArrayIterator<Traits, MaybeConstUserType, false> {
- public:
-  explicit ArrayIterator(MaybeConstUserType& input) : input_(input), iter_(0) {}
-  ~ArrayIterator() {}
-
-  size_t GetSize() const { return Traits::GetSize(input_); }
-
-  using GetNextResult =
-      decltype(Traits::GetAt(std::declval<MaybeConstUserType&>(), 0));
-  GetNextResult GetNext() {
-    DCHECK_LT(iter_, Traits::GetSize(input_));
-    return Traits::GetAt(input_, iter_++);
-  }
-
-  using GetDataIfExistsResult = decltype(
-      CallGetDataIfExists<Traits>(std::declval<MaybeConstUserType&>()));
-  GetDataIfExistsResult GetDataIfExists() {
-    return CallGetDataIfExists<Traits>(input_);
-  }
-
- private:
-  MaybeConstUserType& input_;
-  size_t iter_;
-};
-
-// ArraySerializer is also used to serialize map keys and values. Therefore, it
-// has a UserTypeIterator parameter which is an adaptor for reading to hide the
-// difference between ArrayTraits and MapTraits.
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator,
-          typename EnableType = void>
-struct ArraySerializer;
-
-// Handles serialization and deserialization of arrays of pod types.
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator>
-struct ArraySerializer<
-    MojomType,
-    MaybeConstUserType,
-    UserTypeIterator,
-    typename std::enable_if<BelongsTo<typename MojomType::Element,
-                                      MojomTypeCategory::POD>::value>::type> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Data = typename MojomTypeTraits<MojomType>::Data;
-  using DataElement = typename Data::Element;
-  using Element = typename MojomType::Element;
-  using Traits = ArrayTraits<UserType>;
-
-  static_assert(std::is_same<Element, DataElement>::value,
-                "Incorrect array serializer");
-  static_assert(std::is_same<Element, typename Traits::Element>::value,
-                "Incorrect array serializer");
-
-  static size_t GetSerializedSize(UserTypeIterator* input,
-                                  SerializationContext* context) {
-    return sizeof(Data) + Align(input->GetSize() * sizeof(DataElement));
-  }
-
-  static void SerializeElements(UserTypeIterator* input,
-                                Buffer* buf,
-                                Data* output,
-                                const ContainerValidateParams* validate_params,
-                                SerializationContext* context) {
-    DCHECK(!validate_params->element_is_nullable)
-        << "Primitive type should be non-nullable";
-    DCHECK(!validate_params->element_validate_params)
-        << "Primitive type should not have array validate params";
-
-    size_t size = input->GetSize();
-    if (size == 0)
-      return;
-
-    auto data = input->GetDataIfExists();
-    if (data) {
-      memcpy(output->storage(), data, size * sizeof(DataElement));
-    } else {
-      for (size_t i = 0; i < size; ++i)
-        output->at(i) = input->GetNext();
-    }
-  }
-
-  static bool DeserializeElements(Data* input,
-                                  UserType* output,
-                                  SerializationContext* context) {
-    if (!Traits::Resize(*output, input->size()))
-      return false;
-    ArrayIterator<Traits, UserType> iterator(*output);
-    if (input->size()) {
-      auto data = iterator.GetDataIfExists();
-      if (data) {
-        memcpy(data, input->storage(), input->size() * sizeof(DataElement));
-      } else {
-        for (size_t i = 0; i < input->size(); ++i)
-          iterator.GetNext() = input->at(i);
-      }
-    }
-    return true;
-  }
-};
-
-// Handles serialization and deserialization of arrays of enum types.
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator>
-struct ArraySerializer<
-    MojomType,
-    MaybeConstUserType,
-    UserTypeIterator,
-    typename std::enable_if<BelongsTo<typename MojomType::Element,
-                                      MojomTypeCategory::ENUM>::value>::type> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Data = typename MojomTypeTraits<MojomType>::Data;
-  using DataElement = typename Data::Element;
-  using Element = typename MojomType::Element;
-  using Traits = ArrayTraits<UserType>;
-
-  static_assert(sizeof(Element) == sizeof(DataElement),
-                "Incorrect array serializer");
-
-  static size_t GetSerializedSize(UserTypeIterator* input,
-                                  SerializationContext* context) {
-    return sizeof(Data) + Align(input->GetSize() * sizeof(DataElement));
-  }
-
-  static void SerializeElements(UserTypeIterator* input,
-                                Buffer* buf,
-                                Data* output,
-                                const ContainerValidateParams* validate_params,
-                                SerializationContext* context) {
-    DCHECK(!validate_params->element_is_nullable)
-        << "Primitive type should be non-nullable";
-    DCHECK(!validate_params->element_validate_params)
-        << "Primitive type should not have array validate params";
-
-    size_t size = input->GetSize();
-    for (size_t i = 0; i < size; ++i)
-      Serialize<Element>(input->GetNext(), output->storage() + i);
-  }
-
-  static bool DeserializeElements(Data* input,
-                                  UserType* output,
-                                  SerializationContext* context) {
-    if (!Traits::Resize(*output, input->size()))
-      return false;
-    ArrayIterator<Traits, UserType> iterator(*output);
-    for (size_t i = 0; i < input->size(); ++i) {
-      if (!Deserialize<Element>(input->at(i), &iterator.GetNext()))
-        return false;
-    }
-    return true;
-  }
-};
-
-// Serializes and deserializes arrays of bools.
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator>
-struct ArraySerializer<MojomType,
-                       MaybeConstUserType,
-                       UserTypeIterator,
-                       typename std::enable_if<BelongsTo<
-                           typename MojomType::Element,
-                           MojomTypeCategory::BOOLEAN>::value>::type> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = ArrayTraits<UserType>;
-  using Data = typename MojomTypeTraits<MojomType>::Data;
-
-  static_assert(std::is_same<bool, typename Traits::Element>::value,
-                "Incorrect array serializer");
-
-  static size_t GetSerializedSize(UserTypeIterator* input,
-                                  SerializationContext* context) {
-    return sizeof(Data) + Align((input->GetSize() + 7) / 8);
-  }
-
-  static void SerializeElements(UserTypeIterator* input,
-                                Buffer* buf,
-                                Data* output,
-                                const ContainerValidateParams* validate_params,
-                                SerializationContext* context) {
-    DCHECK(!validate_params->element_is_nullable)
-        << "Primitive type should be non-nullable";
-    DCHECK(!validate_params->element_validate_params)
-        << "Primitive type should not have array validate params";
-
-    size_t size = input->GetSize();
-    for (size_t i = 0; i < size; ++i)
-      output->at(i) = input->GetNext();
-  }
-  static bool DeserializeElements(Data* input,
-                                  UserType* output,
-                                  SerializationContext* context) {
-    if (!Traits::Resize(*output, input->size()))
-      return false;
-    ArrayIterator<Traits, UserType> iterator(*output);
-    for (size_t i = 0; i < input->size(); ++i)
-      iterator.GetNext() = input->at(i);
-    return true;
-  }
-};
-
-// Serializes and deserializes arrays of handles or interfaces.
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator>
-struct ArraySerializer<
-    MojomType,
-    MaybeConstUserType,
-    UserTypeIterator,
-    typename std::enable_if<
-        BelongsTo<typename MojomType::Element,
-                  MojomTypeCategory::ASSOCIATED_INTERFACE |
-                      MojomTypeCategory::ASSOCIATED_INTERFACE_REQUEST |
-                      MojomTypeCategory::HANDLE |
-                      MojomTypeCategory::INTERFACE |
-                      MojomTypeCategory::INTERFACE_REQUEST>::value>::type> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Data = typename MojomTypeTraits<MojomType>::Data;
-  using Element = typename MojomType::Element;
-  using Traits = ArrayTraits<UserType>;
-
-  static size_t GetSerializedSize(UserTypeIterator* input,
-                                  SerializationContext* context) {
-    size_t element_count = input->GetSize();
-    if (BelongsTo<Element,
-                  MojomTypeCategory::ASSOCIATED_INTERFACE |
-                      MojomTypeCategory::ASSOCIATED_INTERFACE_REQUEST>::value) {
-      for (size_t i = 0; i < element_count; ++i) {
-        typename UserTypeIterator::GetNextResult next = input->GetNext();
-        size_t size = PrepareToSerialize<Element>(next, context);
-        DCHECK_EQ(size, 0u);
-      }
-    }
-    return sizeof(Data) + Align(element_count * sizeof(typename Data::Element));
-  }
-
-  static void SerializeElements(UserTypeIterator* input,
-                                Buffer* buf,
-                                Data* output,
-                                const ContainerValidateParams* validate_params,
-                                SerializationContext* context) {
-    DCHECK(!validate_params->element_validate_params)
-        << "Handle or interface type should not have array validate params";
-
-    size_t size = input->GetSize();
-    for (size_t i = 0; i < size; ++i) {
-      typename UserTypeIterator::GetNextResult next = input->GetNext();
-      Serialize<Element>(next, &output->at(i), context);
-
-      static const ValidationError kError =
-          BelongsTo<Element,
-                    MojomTypeCategory::ASSOCIATED_INTERFACE |
-                        MojomTypeCategory::ASSOCIATED_INTERFACE_REQUEST>::value
-              ? VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID
-              : VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE;
-      MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-          !validate_params->element_is_nullable &&
-              !IsHandleOrInterfaceValid(output->at(i)),
-          kError,
-          MakeMessageWithArrayIndex("invalid handle or interface ID in array "
-                                    "expecting valid handles or interface IDs",
-                                    size, i));
-    }
-  }
-  static bool DeserializeElements(Data* input,
-                                  UserType* output,
-                                  SerializationContext* context) {
-    if (!Traits::Resize(*output, input->size()))
-      return false;
-    ArrayIterator<Traits, UserType> iterator(*output);
-    for (size_t i = 0; i < input->size(); ++i) {
-      bool result =
-          Deserialize<Element>(&input->at(i), &iterator.GetNext(), context);
-      DCHECK(result);
-    }
-    return true;
-  }
-};
-
-// This template must only apply to pointer mojo entity (strings, structs,
-// arrays and maps).
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator>
-struct ArraySerializer<MojomType,
-                       MaybeConstUserType,
-                       UserTypeIterator,
-                       typename std::enable_if<BelongsTo<
-                           typename MojomType::Element,
-                           MojomTypeCategory::ARRAY | MojomTypeCategory::MAP |
-                               MojomTypeCategory::STRING |
-                               MojomTypeCategory::STRUCT>::value>::type> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Data = typename MojomTypeTraits<MojomType>::Data;
-  using Element = typename MojomType::Element;
-  using DataElementPtr = typename MojomTypeTraits<Element>::Data*;
-  using Traits = ArrayTraits<UserType>;
-
-  static size_t GetSerializedSize(UserTypeIterator* input,
-                                  SerializationContext* context) {
-    size_t element_count = input->GetSize();
-    size_t size = sizeof(Data) + element_count * sizeof(typename Data::Element);
-    for (size_t i = 0; i < element_count; ++i) {
-      typename UserTypeIterator::GetNextResult next = input->GetNext();
-      size += PrepareToSerialize<Element>(next, context);
-    }
-    return size;
-  }
-
-  static void SerializeElements(UserTypeIterator* input,
-                                Buffer* buf,
-                                Data* output,
-                                const ContainerValidateParams* validate_params,
-                                SerializationContext* context) {
-    size_t size = input->GetSize();
-    for (size_t i = 0; i < size; ++i) {
-      DataElementPtr data_ptr;
-      typename UserTypeIterator::GetNextResult next = input->GetNext();
-      SerializeCaller<Element>::Run(next, buf, &data_ptr,
-                                    validate_params->element_validate_params,
-                                    context);
-      output->at(i).Set(data_ptr);
-      MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-          !validate_params->element_is_nullable && !data_ptr,
-          VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-          MakeMessageWithArrayIndex("null in array expecting valid pointers",
-                                    size, i));
-    }
-  }
-  static bool DeserializeElements(Data* input,
-                                  UserType* output,
-                                  SerializationContext* context) {
-    if (!Traits::Resize(*output, input->size()))
-      return false;
-    ArrayIterator<Traits, UserType> iterator(*output);
-    for (size_t i = 0; i < input->size(); ++i) {
-      if (!Deserialize<Element>(input->at(i).Get(), &iterator.GetNext(),
-                                context))
-        return false;
-    }
-    return true;
-  }
-
- private:
-  template <typename T,
-            bool is_array_or_map = BelongsTo<T,
-                                             MojomTypeCategory::ARRAY |
-                                                 MojomTypeCategory::MAP>::value>
-  struct SerializeCaller {
-    template <typename InputElementType>
-    static void Run(InputElementType&& input,
-                    Buffer* buf,
-                    DataElementPtr* output,
-                    const ContainerValidateParams* validate_params,
-                    SerializationContext* context) {
-      Serialize<T>(std::forward<InputElementType>(input), buf, output, context);
-    }
-  };
-
-  template <typename T>
-  struct SerializeCaller<T, true> {
-    template <typename InputElementType>
-    static void Run(InputElementType&& input,
-                    Buffer* buf,
-                    DataElementPtr* output,
-                    const ContainerValidateParams* validate_params,
-                    SerializationContext* context) {
-      Serialize<T>(std::forward<InputElementType>(input), buf, output,
-                   validate_params, context);
-    }
-  };
-};
-
-// Handles serialization and deserialization of arrays of unions.
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator>
-struct ArraySerializer<
-    MojomType,
-    MaybeConstUserType,
-    UserTypeIterator,
-    typename std::enable_if<BelongsTo<typename MojomType::Element,
-                                      MojomTypeCategory::UNION>::value>::type> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Data = typename MojomTypeTraits<MojomType>::Data;
-  using Element = typename MojomType::Element;
-  using Traits = ArrayTraits<UserType>;
-
-  static size_t GetSerializedSize(UserTypeIterator* input,
-                                  SerializationContext* context) {
-    size_t element_count = input->GetSize();
-    size_t size = sizeof(Data);
-    for (size_t i = 0; i < element_count; ++i) {
-      // Call with |inlined| set to false, so that it will account for both the
-      // data in the union and the space in the array used to hold the union.
-      typename UserTypeIterator::GetNextResult next = input->GetNext();
-      size += PrepareToSerialize<Element>(next, false, context);
-    }
-    return size;
-  }
-
-  static void SerializeElements(UserTypeIterator* input,
-                                Buffer* buf,
-                                Data* output,
-                                const ContainerValidateParams* validate_params,
-                                SerializationContext* context) {
-    size_t size = input->GetSize();
-    for (size_t i = 0; i < size; ++i) {
-      typename Data::Element* result = output->storage() + i;
-      typename UserTypeIterator::GetNextResult next = input->GetNext();
-      Serialize<Element>(next, buf, &result, true, context);
-      MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-          !validate_params->element_is_nullable && output->at(i).is_null(),
-          VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-          MakeMessageWithArrayIndex("null in array expecting valid unions",
-                                    size, i));
-    }
-  }
-
-  static bool DeserializeElements(Data* input,
-                                  UserType* output,
-                                  SerializationContext* context) {
-    if (!Traits::Resize(*output, input->size()))
-      return false;
-    ArrayIterator<Traits, UserType> iterator(*output);
-    for (size_t i = 0; i < input->size(); ++i) {
-      if (!Deserialize<Element>(&input->at(i), &iterator.GetNext(), context))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename Element, typename MaybeConstUserType>
-struct Serializer<ArrayDataView<Element>, MaybeConstUserType> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = ArrayTraits<UserType>;
-  using Impl = ArraySerializer<ArrayDataView<Element>,
-                               MaybeConstUserType,
-                               ArrayIterator<Traits, MaybeConstUserType>>;
-  using Data = typename MojomTypeTraits<ArrayDataView<Element>>::Data;
-
-  static size_t PrepareToSerialize(MaybeConstUserType& input,
-                                   SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input))
-      return 0;
-    ArrayIterator<Traits, MaybeConstUserType> iterator(input);
-    return Impl::GetSerializedSize(&iterator, context);
-  }
-
-  static void Serialize(MaybeConstUserType& input,
-                        Buffer* buf,
-                        Data** output,
-                        const ContainerValidateParams* validate_params,
-                        SerializationContext* context) {
-    if (!CallIsNullIfExists<Traits>(input)) {
-      MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-          validate_params->expected_num_elements != 0 &&
-              Traits::GetSize(input) != validate_params->expected_num_elements,
-          internal::VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER,
-          internal::MakeMessageWithExpectedArraySize(
-              "fixed-size array has wrong number of elements",
-              Traits::GetSize(input), validate_params->expected_num_elements));
-      Data* result = Data::New(Traits::GetSize(input), buf);
-      if (result) {
-        ArrayIterator<Traits, MaybeConstUserType> iterator(input);
-        Impl::SerializeElements(&iterator, buf, result, validate_params,
-                                context);
-      }
-      *output = result;
-    } else {
-      *output = nullptr;
-    }
-  }
-
-  static bool Deserialize(Data* input,
-                          UserType* output,
-                          SerializationContext* context) {
-    if (!input)
-      return CallSetToNullIfExists<Traits>(output);
-    return Impl::DeserializeElements(input, output, context);
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/associated_binding.cc b/mojo/public/cpp/bindings/lib/associated_binding.cc
deleted file mode 100644
index 6788e68..0000000
--- a/mojo/public/cpp/bindings/lib/associated_binding.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/associated_binding.h"
-
-namespace mojo {
-
-AssociatedBindingBase::AssociatedBindingBase() {}
-
-AssociatedBindingBase::~AssociatedBindingBase() {}
-
-void AssociatedBindingBase::AddFilter(std::unique_ptr<MessageReceiver> filter) {
-  DCHECK(endpoint_client_);
-  endpoint_client_->AddFilter(std::move(filter));
-}
-
-void AssociatedBindingBase::Close() {
-  endpoint_client_.reset();
-}
-
-void AssociatedBindingBase::CloseWithReason(uint32_t custom_reason,
-                                            const std::string& description) {
-  if (endpoint_client_)
-    endpoint_client_->CloseWithReason(custom_reason, description);
-  Close();
-}
-
-void AssociatedBindingBase::set_connection_error_handler(
-    const base::Closure& error_handler) {
-  DCHECK(is_bound());
-  endpoint_client_->set_connection_error_handler(error_handler);
-}
-
-void AssociatedBindingBase::set_connection_error_with_reason_handler(
-    const ConnectionErrorWithReasonCallback& error_handler) {
-  DCHECK(is_bound());
-  endpoint_client_->set_connection_error_with_reason_handler(error_handler);
-}
-
-void AssociatedBindingBase::FlushForTesting() {
-  endpoint_client_->FlushForTesting();
-}
-
-void AssociatedBindingBase::BindImpl(
-    ScopedInterfaceEndpointHandle handle,
-    MessageReceiverWithResponderStatus* receiver,
-    std::unique_ptr<MessageReceiver> payload_validator,
-    bool expect_sync_requests,
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
-    uint32_t interface_version) {
-  if (!handle.is_valid()) {
-    endpoint_client_.reset();
-    return;
-  }
-
-  endpoint_client_.reset(new InterfaceEndpointClient(
-      std::move(handle), receiver, std::move(payload_validator),
-      expect_sync_requests, std::move(runner), interface_version));
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/associated_group.cc b/mojo/public/cpp/bindings/lib/associated_group.cc
deleted file mode 100644
index 3e95eeb..0000000
--- a/mojo/public/cpp/bindings/lib/associated_group.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/associated_group.h"
-
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-
-namespace mojo {
-
-AssociatedGroup::AssociatedGroup() = default;
-
-AssociatedGroup::AssociatedGroup(
-    scoped_refptr<AssociatedGroupController> controller)
-    : controller_(std::move(controller)) {}
-
-AssociatedGroup::AssociatedGroup(const ScopedInterfaceEndpointHandle& handle)
-    : controller_getter_(handle.CreateGroupControllerGetter()) {}
-
-AssociatedGroup::AssociatedGroup(const AssociatedGroup& other) = default;
-
-AssociatedGroup::~AssociatedGroup() = default;
-
-AssociatedGroup& AssociatedGroup::operator=(const AssociatedGroup& other) =
-    default;
-
-AssociatedGroupController* AssociatedGroup::GetController() {
-  if (controller_)
-    return controller_.get();
-
-  return controller_getter_.Run();
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/associated_group_controller.cc b/mojo/public/cpp/bindings/lib/associated_group_controller.cc
deleted file mode 100644
index f4a9aa2..0000000
--- a/mojo/public/cpp/bindings/lib/associated_group_controller.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-
-#include "mojo/public/cpp/bindings/associated_group.h"
-
-namespace mojo {
-
-AssociatedGroupController::~AssociatedGroupController() {}
-
-ScopedInterfaceEndpointHandle
-AssociatedGroupController::CreateScopedInterfaceEndpointHandle(InterfaceId id) {
-  return ScopedInterfaceEndpointHandle(id, this);
-}
-
-bool AssociatedGroupController::NotifyAssociation(
-    ScopedInterfaceEndpointHandle* handle_to_send,
-    InterfaceId id) {
-  return handle_to_send->NotifyAssociation(id, this);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/associated_interface_ptr.cc b/mojo/public/cpp/bindings/lib/associated_interface_ptr.cc
deleted file mode 100644
index 78281ed..0000000
--- a/mojo/public/cpp/bindings/lib/associated_interface_ptr.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-
-namespace mojo {
-
-void GetIsolatedInterface(ScopedInterfaceEndpointHandle handle) {
-  MessagePipe pipe;
-  scoped_refptr<internal::MultiplexRouter> router =
-      new internal::MultiplexRouter(std::move(pipe.handle0),
-                                    internal::MultiplexRouter::MULTI_INTERFACE,
-                                    false, base::ThreadTaskRunnerHandle::Get());
-  router->AssociateInterface(std::move(handle));
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h b/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h
deleted file mode 100644
index a4b5188..0000000
--- a/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_LIB_ASSOCIATED_INTERFACE_PTR_STATE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_ASSOCIATED_INTERFACE_PTR_STATE_H_
-
-#include <stdint.h>
-
-#include <algorithm>  // For |std::swap()|.
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback_forward.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "mojo/public/cpp/bindings/associated_group.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename Interface>
-class AssociatedInterfacePtrState {
- public:
-  AssociatedInterfacePtrState() : version_(0u) {}
-
-  ~AssociatedInterfacePtrState() {
-    endpoint_client_.reset();
-    proxy_.reset();
-  }
-
-  Interface* instance() {
-    // This will be null if the object is not bound.
-    return proxy_.get();
-  }
-
-  uint32_t version() const { return version_; }
-
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback) {
-    // It is safe to capture |this| because the callback won't be run after this
-    // object goes away.
-    endpoint_client_->QueryVersion(
-        base::Bind(&AssociatedInterfacePtrState::OnQueryVersion,
-                   base::Unretained(this), callback));
-  }
-
-  void RequireVersion(uint32_t version) {
-    if (version <= version_)
-      return;
-
-    version_ = version;
-    endpoint_client_->RequireVersion(version);
-  }
-
-  void FlushForTesting() { endpoint_client_->FlushForTesting(); }
-
-  void CloseWithReason(uint32_t custom_reason, const std::string& description) {
-    endpoint_client_->CloseWithReason(custom_reason, description);
-  }
-
-  void Swap(AssociatedInterfacePtrState* other) {
-    using std::swap;
-    swap(other->endpoint_client_, endpoint_client_);
-    swap(other->proxy_, proxy_);
-    swap(other->version_, version_);
-  }
-
-  void Bind(AssociatedInterfacePtrInfo<Interface> info,
-            scoped_refptr<base::SingleThreadTaskRunner> runner) {
-    DCHECK(!endpoint_client_);
-    DCHECK(!proxy_);
-    DCHECK_EQ(0u, version_);
-    DCHECK(info.is_valid());
-
-    version_ = info.version();
-    // The version is only queried from the client so the value passed here
-    // will not be used.
-    endpoint_client_.reset(new InterfaceEndpointClient(
-        info.PassHandle(), nullptr,
-        base::WrapUnique(new typename Interface::ResponseValidator_()), false,
-        std::move(runner), 0u));
-    proxy_.reset(new Proxy(endpoint_client_.get()));
-  }
-
-  // After this method is called, the object is in an invalid state and
-  // shouldn't be reused.
-  AssociatedInterfacePtrInfo<Interface> PassInterface() {
-    ScopedInterfaceEndpointHandle handle = endpoint_client_->PassHandle();
-    endpoint_client_.reset();
-    proxy_.reset();
-    return AssociatedInterfacePtrInfo<Interface>(std::move(handle), version_);
-  }
-
-  bool is_bound() const { return !!endpoint_client_; }
-
-  bool encountered_error() const {
-    return endpoint_client_ ? endpoint_client_->encountered_error() : false;
-  }
-
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(endpoint_client_);
-    endpoint_client_->set_connection_error_handler(error_handler);
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    DCHECK(endpoint_client_);
-    endpoint_client_->set_connection_error_with_reason_handler(error_handler);
-  }
-
-  // Returns true if bound and awaiting a response to a message.
-  bool has_pending_callbacks() const {
-    return endpoint_client_ && endpoint_client_->has_pending_responders();
-  }
-
-  AssociatedGroup* associated_group() {
-    return endpoint_client_ ? endpoint_client_->associated_group() : nullptr;
-  }
-
-  void ForwardMessage(Message message) { endpoint_client_->Accept(&message); }
-
-  void ForwardMessageWithResponder(Message message,
-                                   std::unique_ptr<MessageReceiver> responder) {
-    endpoint_client_->AcceptWithResponder(&message, std::move(responder));
-  }
-
- private:
-  using Proxy = typename Interface::Proxy_;
-
-  void OnQueryVersion(const base::Callback<void(uint32_t)>& callback,
-                      uint32_t version) {
-    version_ = version;
-    callback.Run(version);
-  }
-
-  std::unique_ptr<InterfaceEndpointClient> endpoint_client_;
-  std::unique_ptr<Proxy> proxy_;
-
-  uint32_t version_;
-
-  DISALLOW_COPY_AND_ASSIGN(AssociatedInterfacePtrState);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_ASSOCIATED_INTERFACE_PTR_STATE_H_
diff --git a/mojo/public/cpp/bindings/lib/binding_state.cc b/mojo/public/cpp/bindings/lib/binding_state.cc
deleted file mode 100644
index b34cb47..0000000
--- a/mojo/public/cpp/bindings/lib/binding_state.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/binding_state.h"
-
-namespace mojo {
-namespace internal {
-
-BindingStateBase::BindingStateBase() = default;
-
-BindingStateBase::~BindingStateBase() = default;
-
-void BindingStateBase::AddFilter(std::unique_ptr<MessageReceiver> filter) {
-  DCHECK(endpoint_client_);
-  endpoint_client_->AddFilter(std::move(filter));
-}
-
-bool BindingStateBase::HasAssociatedInterfaces() const {
-  return router_ ? router_->HasAssociatedEndpoints() : false;
-}
-
-void BindingStateBase::PauseIncomingMethodCallProcessing() {
-  DCHECK(router_);
-  router_->PauseIncomingMethodCallProcessing();
-}
-void BindingStateBase::ResumeIncomingMethodCallProcessing() {
-  DCHECK(router_);
-  router_->ResumeIncomingMethodCallProcessing();
-}
-
-bool BindingStateBase::WaitForIncomingMethodCall(MojoDeadline deadline) {
-  DCHECK(router_);
-  return router_->WaitForIncomingMessage(deadline);
-}
-
-void BindingStateBase::Close() {
-  if (!router_)
-    return;
-
-  endpoint_client_.reset();
-  router_->CloseMessagePipe();
-  router_ = nullptr;
-}
-
-void BindingStateBase::CloseWithReason(uint32_t custom_reason,
-                                       const std::string& description) {
-  if (endpoint_client_)
-    endpoint_client_->CloseWithReason(custom_reason, description);
-
-  Close();
-}
-
-void BindingStateBase::FlushForTesting() {
-  endpoint_client_->FlushForTesting();
-}
-
-void BindingStateBase::EnableTestingMode() {
-  DCHECK(is_bound());
-  router_->EnableTestingMode();
-}
-
-void BindingStateBase::BindInternal(
-    ScopedMessagePipeHandle handle,
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
-    const char* interface_name,
-    std::unique_ptr<MessageReceiver> request_validator,
-    bool passes_associated_kinds,
-    bool has_sync_methods,
-    MessageReceiverWithResponderStatus* stub,
-    uint32_t interface_version) {
-  DCHECK(!router_);
-
-  MultiplexRouter::Config config =
-      passes_associated_kinds
-          ? MultiplexRouter::MULTI_INTERFACE
-          : (has_sync_methods
-                 ? MultiplexRouter::SINGLE_INTERFACE_WITH_SYNC_METHODS
-                 : MultiplexRouter::SINGLE_INTERFACE);
-  router_ = new MultiplexRouter(std::move(handle), config, false, runner);
-  router_->SetMasterInterfaceName(interface_name);
-
-  endpoint_client_.reset(new InterfaceEndpointClient(
-      router_->CreateLocalEndpointHandle(kMasterInterfaceId), stub,
-      std::move(request_validator), has_sync_methods, std::move(runner),
-      interface_version));
-}
-
-}  // namesapce internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/binding_state.h b/mojo/public/cpp/bindings/lib/binding_state.h
deleted file mode 100644
index 0b0dbee..0000000
--- a/mojo/public/cpp/bindings/lib/binding_state.h
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDING_STATE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDING_STATE_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/lib/multiplex_router.h"
-#include "mojo/public/cpp/bindings/message_header_validator.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-namespace internal {
-
-class MOJO_CPP_BINDINGS_EXPORT BindingStateBase {
- public:
-  BindingStateBase();
-  ~BindingStateBase();
-
-  void AddFilter(std::unique_ptr<MessageReceiver> filter);
-
-  bool HasAssociatedInterfaces() const;
-
-  void PauseIncomingMethodCallProcessing();
-  void ResumeIncomingMethodCallProcessing();
-
-  bool WaitForIncomingMethodCall(
-      MojoDeadline deadline = MOJO_DEADLINE_INDEFINITE);
-
-  void Close();
-  void CloseWithReason(uint32_t custom_reason, const std::string& description);
-
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(is_bound());
-    endpoint_client_->set_connection_error_handler(error_handler);
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    DCHECK(is_bound());
-    endpoint_client_->set_connection_error_with_reason_handler(error_handler);
-  }
-
-  bool is_bound() const { return !!router_; }
-
-  MessagePipeHandle handle() const {
-    DCHECK(is_bound());
-    return router_->handle();
-  }
-
-  void FlushForTesting();
-
-  void EnableTestingMode();
-
- protected:
-  void BindInternal(ScopedMessagePipeHandle handle,
-                    scoped_refptr<base::SingleThreadTaskRunner> runner,
-                    const char* interface_name,
-                    std::unique_ptr<MessageReceiver> request_validator,
-                    bool passes_associated_kinds,
-                    bool has_sync_methods,
-                    MessageReceiverWithResponderStatus* stub,
-                    uint32_t interface_version);
-
-  scoped_refptr<internal::MultiplexRouter> router_;
-  std::unique_ptr<InterfaceEndpointClient> endpoint_client_;
-};
-
-template <typename Interface, typename ImplRefTraits>
-class BindingState : public BindingStateBase {
- public:
-  using ImplPointerType = typename ImplRefTraits::PointerType;
-
-  explicit BindingState(ImplPointerType impl) {
-    stub_.set_sink(std::move(impl));
-  }
-
-  ~BindingState() { Close(); }
-
-  void Bind(ScopedMessagePipeHandle handle,
-            scoped_refptr<base::SingleThreadTaskRunner> runner) {
-    BindingStateBase::BindInternal(
-        std::move(handle), runner, Interface::Name_,
-        base::MakeUnique<typename Interface::RequestValidator_>(),
-        Interface::PassesAssociatedKinds_, Interface::HasSyncMethods_, &stub_,
-        Interface::Version_);
-  }
-
-  InterfaceRequest<Interface> Unbind() {
-    endpoint_client_.reset();
-    InterfaceRequest<Interface> request =
-        MakeRequest<Interface>(router_->PassMessagePipe());
-    router_ = nullptr;
-    return request;
-  }
-
-  Interface* impl() { return ImplRefTraits::GetRawPointer(&stub_.sink()); }
-
- private:
-  typename Interface::template Stub_<ImplRefTraits> stub_;
-
-  DISALLOW_COPY_AND_ASSIGN(BindingState);
-};
-
-}  // namesapce internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDING_STATE_H_
diff --git a/mojo/public/cpp/bindings/lib/bindings_internal.h b/mojo/public/cpp/bindings/lib/bindings_internal.h
deleted file mode 100644
index 631daec..0000000
--- a/mojo/public/cpp/bindings/lib/bindings_internal.h
+++ /dev/null
@@ -1,336 +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.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_
-
-#include <stdint.h>
-
-#include <functional>
-
-#include "base/template_util.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-
-template <typename T>
-class ArrayDataView;
-
-template <typename T>
-class AssociatedInterfacePtrInfoDataView;
-
-template <typename T>
-class AssociatedInterfaceRequestDataView;
-
-template <typename T>
-class InterfacePtrDataView;
-
-template <typename T>
-class InterfaceRequestDataView;
-
-template <typename K, typename V>
-class MapDataView;
-
-class NativeStructDataView;
-
-class StringDataView;
-
-namespace internal {
-
-// Please note that this is a different value than |mojo::kInvalidHandleValue|,
-// which is the "decoded" invalid handle.
-const uint32_t kEncodedInvalidHandleValue = static_cast<uint32_t>(-1);
-
-// A serialized union always takes 16 bytes:
-//   4-byte size + 4-byte tag + 8-byte payload.
-const uint32_t kUnionDataSize = 16;
-
-template <typename T>
-class Array_Data;
-
-template <typename K, typename V>
-class Map_Data;
-
-class NativeStruct_Data;
-
-using String_Data = Array_Data<char>;
-
-inline size_t Align(size_t size) {
-  return (size + 7) & ~0x7;
-}
-
-inline bool IsAligned(const void* ptr) {
-  return !(reinterpret_cast<uintptr_t>(ptr) & 0x7);
-}
-
-// Pointers are encoded as relative offsets. The offsets are relative to the
-// address of where the offset value is stored, such that the pointer may be
-// recovered with the expression:
-//
-//   ptr = reinterpret_cast<char*>(offset) + *offset
-//
-// A null pointer is encoded as an offset value of 0.
-//
-inline void EncodePointer(const void* ptr, uint64_t* offset) {
-  if (!ptr) {
-    *offset = 0;
-    return;
-  }
-
-  const char* p_obj = reinterpret_cast<const char*>(ptr);
-  const char* p_slot = reinterpret_cast<const char*>(offset);
-  DCHECK(p_obj > p_slot);
-
-  *offset = static_cast<uint64_t>(p_obj - p_slot);
-}
-
-// Note: This function doesn't validate the encoded pointer value.
-inline const void* DecodePointer(const uint64_t* offset) {
-  if (!*offset)
-    return nullptr;
-  return reinterpret_cast<const char*>(offset) + *offset;
-}
-
-#pragma pack(push, 1)
-
-struct StructHeader {
-  uint32_t num_bytes;
-  uint32_t version;
-};
-static_assert(sizeof(StructHeader) == 8, "Bad sizeof(StructHeader)");
-
-struct ArrayHeader {
-  uint32_t num_bytes;
-  uint32_t num_elements;
-};
-static_assert(sizeof(ArrayHeader) == 8, "Bad_sizeof(ArrayHeader)");
-
-template <typename T>
-struct Pointer {
-  using BaseType = T;
-
-  void Set(T* ptr) { EncodePointer(ptr, &offset); }
-  const T* Get() const { return static_cast<const T*>(DecodePointer(&offset)); }
-  T* Get() {
-    return static_cast<T*>(const_cast<void*>(DecodePointer(&offset)));
-  }
-
-  bool is_null() const { return offset == 0; }
-
-  uint64_t offset;
-};
-static_assert(sizeof(Pointer<char>) == 8, "Bad_sizeof(Pointer)");
-
-using GenericPointer = Pointer<void>;
-
-struct Handle_Data {
-  Handle_Data() = default;
-  explicit Handle_Data(uint32_t value) : value(value) {}
-
-  bool is_valid() const { return value != kEncodedInvalidHandleValue; }
-
-  uint32_t value;
-};
-static_assert(sizeof(Handle_Data) == 4, "Bad_sizeof(Handle_Data)");
-
-struct Interface_Data {
-  Handle_Data handle;
-  uint32_t version;
-};
-static_assert(sizeof(Interface_Data) == 8, "Bad_sizeof(Interface_Data)");
-
-struct AssociatedEndpointHandle_Data {
-  AssociatedEndpointHandle_Data() = default;
-  explicit AssociatedEndpointHandle_Data(uint32_t value) : value(value) {}
-
-  bool is_valid() const { return value != kEncodedInvalidHandleValue; }
-
-  uint32_t value;
-};
-static_assert(sizeof(AssociatedEndpointHandle_Data) == 4,
-              "Bad_sizeof(AssociatedEndpointHandle_Data)");
-
-struct AssociatedInterface_Data {
-  AssociatedEndpointHandle_Data handle;
-  uint32_t version;
-};
-static_assert(sizeof(AssociatedInterface_Data) == 8,
-              "Bad_sizeof(AssociatedInterface_Data)");
-
-#pragma pack(pop)
-
-template <typename T>
-T FetchAndReset(T* ptr) {
-  T temp = *ptr;
-  *ptr = T();
-  return temp;
-}
-
-template <typename T>
-struct IsUnionDataType {
- private:
-  template <typename U>
-  static YesType Test(const typename U::MojomUnionDataType*);
-
-  template <typename U>
-  static NoType Test(...);
-
-  EnsureTypeIsComplete<T> check_t_;
-
- public:
-  static const bool value =
-      sizeof(Test<T>(0)) == sizeof(YesType) && !IsConst<T>::value;
-};
-
-enum class MojomTypeCategory : uint32_t {
-  ARRAY = 1 << 0,
-  ASSOCIATED_INTERFACE = 1 << 1,
-  ASSOCIATED_INTERFACE_REQUEST = 1 << 2,
-  BOOLEAN = 1 << 3,
-  ENUM = 1 << 4,
-  HANDLE = 1 << 5,
-  INTERFACE = 1 << 6,
-  INTERFACE_REQUEST = 1 << 7,
-  MAP = 1 << 8,
-  // POD except boolean and enum.
-  POD = 1 << 9,
-  STRING = 1 << 10,
-  STRUCT = 1 << 11,
-  UNION = 1 << 12
-};
-
-inline constexpr MojomTypeCategory operator&(MojomTypeCategory x,
-                                             MojomTypeCategory y) {
-  return static_cast<MojomTypeCategory>(static_cast<uint32_t>(x) &
-                                        static_cast<uint32_t>(y));
-}
-
-inline constexpr MojomTypeCategory operator|(MojomTypeCategory x,
-                                             MojomTypeCategory y) {
-  return static_cast<MojomTypeCategory>(static_cast<uint32_t>(x) |
-                                        static_cast<uint32_t>(y));
-}
-
-template <typename T, bool is_enum = std::is_enum<T>::value>
-struct MojomTypeTraits {
-  using Data = T;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category = MojomTypeCategory::POD;
-};
-
-template <typename T>
-struct MojomTypeTraits<ArrayDataView<T>, false> {
-  using Data = Array_Data<typename MojomTypeTraits<T>::DataAsArrayElement>;
-  using DataAsArrayElement = Pointer<Data>;
-
-  static const MojomTypeCategory category = MojomTypeCategory::ARRAY;
-};
-
-template <typename T>
-struct MojomTypeTraits<AssociatedInterfacePtrInfoDataView<T>, false> {
-  using Data = AssociatedInterface_Data;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category =
-      MojomTypeCategory::ASSOCIATED_INTERFACE;
-};
-
-template <typename T>
-struct MojomTypeTraits<AssociatedInterfaceRequestDataView<T>, false> {
-  using Data = AssociatedEndpointHandle_Data;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category =
-      MojomTypeCategory::ASSOCIATED_INTERFACE_REQUEST;
-};
-
-template <>
-struct MojomTypeTraits<bool, false> {
-  using Data = bool;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category = MojomTypeCategory::BOOLEAN;
-};
-
-template <typename T>
-struct MojomTypeTraits<T, true> {
-  using Data = int32_t;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category = MojomTypeCategory::ENUM;
-};
-
-template <typename T>
-struct MojomTypeTraits<ScopedHandleBase<T>, false> {
-  using Data = Handle_Data;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category = MojomTypeCategory::HANDLE;
-};
-
-template <typename T>
-struct MojomTypeTraits<InterfacePtrDataView<T>, false> {
-  using Data = Interface_Data;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category = MojomTypeCategory::INTERFACE;
-};
-
-template <typename T>
-struct MojomTypeTraits<InterfaceRequestDataView<T>, false> {
-  using Data = Handle_Data;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category =
-      MojomTypeCategory::INTERFACE_REQUEST;
-};
-
-template <typename K, typename V>
-struct MojomTypeTraits<MapDataView<K, V>, false> {
-  using Data = Map_Data<typename MojomTypeTraits<K>::DataAsArrayElement,
-                        typename MojomTypeTraits<V>::DataAsArrayElement>;
-  using DataAsArrayElement = Pointer<Data>;
-
-  static const MojomTypeCategory category = MojomTypeCategory::MAP;
-};
-
-template <>
-struct MojomTypeTraits<NativeStructDataView, false> {
-  using Data = internal::NativeStruct_Data;
-  using DataAsArrayElement = Pointer<Data>;
-
-  static const MojomTypeCategory category = MojomTypeCategory::STRUCT;
-};
-
-template <>
-struct MojomTypeTraits<StringDataView, false> {
-  using Data = String_Data;
-  using DataAsArrayElement = Pointer<Data>;
-
-  static const MojomTypeCategory category = MojomTypeCategory::STRING;
-};
-
-template <typename T, MojomTypeCategory categories>
-struct BelongsTo {
-  static const bool value =
-      static_cast<uint32_t>(MojomTypeTraits<T>::category & categories) != 0;
-};
-
-template <typename T>
-struct EnumHashImpl {
-  static_assert(std::is_enum<T>::value, "Incorrect hash function.");
-
-  size_t operator()(T input) const {
-    using UnderlyingType = typename base::underlying_type<T>::type;
-    return std::hash<UnderlyingType>()(static_cast<UnderlyingType>(input));
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_
diff --git a/mojo/public/cpp/bindings/lib/buffer.h b/mojo/public/cpp/bindings/lib/buffer.h
deleted file mode 100644
index 213a445..0000000
--- a/mojo/public/cpp/bindings/lib/buffer.h
+++ /dev/null
@@ -1,70 +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.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BUFFER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_BUFFER_H_
-
-#include <stddef.h>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-
-namespace mojo {
-namespace internal {
-
-// Buffer provides an interface to allocate memory blocks which are 8-byte
-// aligned and zero-initialized. It doesn't own the underlying memory. Users
-// must ensure that the memory stays valid while using the allocated blocks from
-// Buffer.
-class Buffer {
- public:
-  Buffer() {}
-
-  // The memory must have been zero-initialized. |data| must be 8-byte
-  // aligned.
-  void Initialize(void* data, size_t size) {
-    DCHECK(IsAligned(data));
-
-    data_ = data;
-    size_ = size;
-    cursor_ = reinterpret_cast<uintptr_t>(data);
-    data_end_ = cursor_ + size;
-  }
-
-  size_t size() const { return size_; }
-
-  void* data() const { return data_; }
-
-  // Allocates |num_bytes| from the buffer and returns a pointer to the start of
-  // the allocated block.
-  // The resulting address is 8-byte aligned, and the content of the memory is
-  // zero-filled.
-  void* Allocate(size_t num_bytes) {
-    num_bytes = Align(num_bytes);
-    uintptr_t result = cursor_;
-    cursor_ += num_bytes;
-    if (cursor_ > data_end_ || cursor_ < result) {
-      NOTREACHED();
-      cursor_ -= num_bytes;
-      return nullptr;
-    }
-
-    return reinterpret_cast<void*>(result);
-  }
-
- private:
-  void* data_ = nullptr;
-  size_t size_ = 0;
-
-  uintptr_t cursor_ = 0;
-  uintptr_t data_end_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(Buffer);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_BUFFER_H_
diff --git a/mojo/public/cpp/bindings/lib/connector.cc b/mojo/public/cpp/bindings/lib/connector.cc
deleted file mode 100644
index d93e45e..0000000
--- a/mojo/public/cpp/bindings/lib/connector.cc
+++ /dev/null
@@ -1,493 +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.
-
-#include "mojo/public/cpp/bindings/connector.h"
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/thread_local.h"
-#include "mojo/public/cpp/bindings/lib/may_auto_lock.h"
-#include "mojo/public/cpp/bindings/sync_handle_watcher.h"
-#include "mojo/public/cpp/system/wait.h"
-
-namespace mojo {
-
-namespace {
-
-// The NestingObserver for each thread. Note that this is always a
-// Connector::MessageLoopNestingObserver; we use the base type here because that
-// subclass is private to Connector.
-base::LazyInstance<
-    base::ThreadLocalPointer<base::MessageLoop::NestingObserver>>::Leaky
-    g_tls_nesting_observer = LAZY_INSTANCE_INITIALIZER;
-
-}  // namespace
-
-// Used to efficiently maintain a doubly-linked list of all Connectors
-// currently dispatching on any given thread.
-class Connector::ActiveDispatchTracker {
- public:
-  explicit ActiveDispatchTracker(const base::WeakPtr<Connector>& connector);
-  ~ActiveDispatchTracker();
-
-  void NotifyBeginNesting();
-
- private:
-  const base::WeakPtr<Connector> connector_;
-  MessageLoopNestingObserver* const nesting_observer_;
-  ActiveDispatchTracker* outer_tracker_ = nullptr;
-  ActiveDispatchTracker* inner_tracker_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(ActiveDispatchTracker);
-};
-
-// Watches the MessageLoop on the current thread. Notifies the current chain of
-// ActiveDispatchTrackers when a nested message loop is started.
-class Connector::MessageLoopNestingObserver
-    : public base::MessageLoop::NestingObserver,
-      public base::MessageLoop::DestructionObserver {
- public:
-  MessageLoopNestingObserver() {
-    base::MessageLoop::current()->AddNestingObserver(this);
-    base::MessageLoop::current()->AddDestructionObserver(this);
-  }
-
-  ~MessageLoopNestingObserver() override {}
-
-  // base::MessageLoop::NestingObserver:
-  void OnBeginNestedMessageLoop() override {
-    if (top_tracker_)
-      top_tracker_->NotifyBeginNesting();
-  }
-
-  // base::MessageLoop::DestructionObserver:
-  void WillDestroyCurrentMessageLoop() override {
-    base::MessageLoop::current()->RemoveNestingObserver(this);
-    base::MessageLoop::current()->RemoveDestructionObserver(this);
-    DCHECK_EQ(this, g_tls_nesting_observer.Get().Get());
-    g_tls_nesting_observer.Get().Set(nullptr);
-    delete this;
-  }
-
-  static MessageLoopNestingObserver* GetForThread() {
-    if (!base::MessageLoop::current() ||
-        !base::MessageLoop::current()->nesting_allowed())
-      return nullptr;
-    auto* observer = static_cast<MessageLoopNestingObserver*>(
-        g_tls_nesting_observer.Get().Get());
-    if (!observer) {
-      observer = new MessageLoopNestingObserver;
-      g_tls_nesting_observer.Get().Set(observer);
-    }
-    return observer;
-  }
-
- private:
-  friend class ActiveDispatchTracker;
-
-  ActiveDispatchTracker* top_tracker_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageLoopNestingObserver);
-};
-
-Connector::ActiveDispatchTracker::ActiveDispatchTracker(
-    const base::WeakPtr<Connector>& connector)
-    : connector_(connector), nesting_observer_(connector_->nesting_observer_) {
-  DCHECK(nesting_observer_);
-  if (nesting_observer_->top_tracker_) {
-    outer_tracker_ = nesting_observer_->top_tracker_;
-    outer_tracker_->inner_tracker_ = this;
-  }
-  nesting_observer_->top_tracker_ = this;
-}
-
-Connector::ActiveDispatchTracker::~ActiveDispatchTracker() {
-  if (nesting_observer_->top_tracker_ == this)
-    nesting_observer_->top_tracker_ = outer_tracker_;
-  else if (inner_tracker_)
-    inner_tracker_->outer_tracker_ = outer_tracker_;
-  if (outer_tracker_)
-    outer_tracker_->inner_tracker_ = inner_tracker_;
-}
-
-void Connector::ActiveDispatchTracker::NotifyBeginNesting() {
-  if (connector_ && connector_->handle_watcher_)
-    connector_->handle_watcher_->ArmOrNotify();
-  if (outer_tracker_)
-    outer_tracker_->NotifyBeginNesting();
-}
-
-Connector::Connector(ScopedMessagePipeHandle message_pipe,
-                     ConnectorConfig config,
-                     scoped_refptr<base::SingleThreadTaskRunner> runner)
-    : message_pipe_(std::move(message_pipe)),
-      task_runner_(std::move(runner)),
-      nesting_observer_(MessageLoopNestingObserver::GetForThread()),
-      weak_factory_(this) {
-  if (config == MULTI_THREADED_SEND)
-    lock_.emplace();
-
-  weak_self_ = weak_factory_.GetWeakPtr();
-  // Even though we don't have an incoming receiver, we still want to monitor
-  // the message pipe to know if is closed or encounters an error.
-  WaitToReadMore();
-}
-
-Connector::~Connector() {
-  {
-    // Allow for quick destruction on any thread if the pipe is already closed.
-    base::AutoLock lock(connected_lock_);
-    if (!connected_)
-      return;
-  }
-
-  DCHECK(thread_checker_.CalledOnValidThread());
-  CancelWait();
-}
-
-void Connector::CloseMessagePipe() {
-  // Throw away the returned message pipe.
-  PassMessagePipe();
-}
-
-ScopedMessagePipeHandle Connector::PassMessagePipe() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  CancelWait();
-  internal::MayAutoLock locker(&lock_);
-  ScopedMessagePipeHandle message_pipe = std::move(message_pipe_);
-  weak_factory_.InvalidateWeakPtrs();
-  sync_handle_watcher_callback_count_ = 0;
-
-  base::AutoLock lock(connected_lock_);
-  connected_ = false;
-  return message_pipe;
-}
-
-void Connector::RaiseError() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  HandleError(true, true);
-}
-
-bool Connector::WaitForIncomingMessage(MojoDeadline deadline) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (error_)
-    return false;
-
-  ResumeIncomingMethodCallProcessing();
-
-  // TODO(rockot): Use a timed Wait here. Nobody uses anything but 0 or
-  // INDEFINITE deadlines at present, so we only support those.
-  DCHECK(deadline == 0 || deadline == MOJO_DEADLINE_INDEFINITE);
-
-  MojoResult rv = MOJO_RESULT_UNKNOWN;
-  if (deadline == 0 && !message_pipe_->QuerySignalsState().readable())
-    return false;
-
-  if (deadline == MOJO_DEADLINE_INDEFINITE) {
-    rv = Wait(message_pipe_.get(), MOJO_HANDLE_SIGNAL_READABLE);
-    if (rv != MOJO_RESULT_OK) {
-      // Users that call WaitForIncomingMessage() should expect their code to be
-      // re-entered, so we call the error handler synchronously.
-      HandleError(rv != MOJO_RESULT_FAILED_PRECONDITION, false);
-      return false;
-    }
-  }
-
-  ignore_result(ReadSingleMessage(&rv));
-  return (rv == MOJO_RESULT_OK);
-}
-
-void Connector::PauseIncomingMethodCallProcessing() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (paused_)
-    return;
-
-  paused_ = true;
-  CancelWait();
-}
-
-void Connector::ResumeIncomingMethodCallProcessing() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (!paused_)
-    return;
-
-  paused_ = false;
-  WaitToReadMore();
-}
-
-bool Connector::Accept(Message* message) {
-  DCHECK(lock_ || thread_checker_.CalledOnValidThread());
-
-  // It shouldn't hurt even if |error_| may be changed by a different thread at
-  // the same time. The outcome is that we may write into |message_pipe_| after
-  // encountering an error, which should be fine.
-  if (error_)
-    return false;
-
-  internal::MayAutoLock locker(&lock_);
-
-  if (!message_pipe_.is_valid() || drop_writes_)
-    return true;
-
-  MojoResult rv =
-      WriteMessageNew(message_pipe_.get(), message->TakeMojoMessage(),
-                      MOJO_WRITE_MESSAGE_FLAG_NONE);
-
-  switch (rv) {
-    case MOJO_RESULT_OK:
-      break;
-    case MOJO_RESULT_FAILED_PRECONDITION:
-      // There's no point in continuing to write to this pipe since the other
-      // end is gone. Avoid writing any future messages. Hide write failures
-      // from the caller since we'd like them to continue consuming any backlog
-      // of incoming messages before regarding the message pipe as closed.
-      drop_writes_ = true;
-      break;
-    case MOJO_RESULT_BUSY:
-      // We'd get a "busy" result if one of the message's handles is:
-      //   - |message_pipe_|'s own handle;
-      //   - simultaneously being used on another thread; or
-      //   - in a "busy" state that prohibits it from being transferred (e.g.,
-      //     a data pipe handle in the middle of a two-phase read/write,
-      //     regardless of which thread that two-phase read/write is happening
-      //     on).
-      // TODO(vtl): I wonder if this should be a |DCHECK()|. (But, until
-      // crbug.com/389666, etc. are resolved, this will make tests fail quickly
-      // rather than hanging.)
-      CHECK(false) << "Race condition or other bug detected";
-      return false;
-    default:
-      // This particular write was rejected, presumably because of bad input.
-      // The pipe is not necessarily in a bad state.
-      return false;
-  }
-  return true;
-}
-
-void Connector::AllowWokenUpBySyncWatchOnSameThread() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  allow_woken_up_by_others_ = true;
-
-  EnsureSyncWatcherExists();
-  sync_watcher_->AllowWokenUpBySyncWatchOnSameThread();
-}
-
-bool Connector::SyncWatch(const bool* should_stop) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (error_)
-    return false;
-
-  ResumeIncomingMethodCallProcessing();
-
-  EnsureSyncWatcherExists();
-  return sync_watcher_->SyncWatch(should_stop);
-}
-
-void Connector::SetWatcherHeapProfilerTag(const char* tag) {
-  heap_profiler_tag_ = tag;
-  if (handle_watcher_) {
-    handle_watcher_->set_heap_profiler_tag(tag);
-  }
-}
-
-void Connector::OnWatcherHandleReady(MojoResult result) {
-  OnHandleReadyInternal(result);
-}
-
-void Connector::OnSyncHandleWatcherHandleReady(MojoResult result) {
-  base::WeakPtr<Connector> weak_self(weak_self_);
-
-  sync_handle_watcher_callback_count_++;
-  OnHandleReadyInternal(result);
-  // At this point, this object might have been deleted.
-  if (weak_self) {
-    DCHECK_LT(0u, sync_handle_watcher_callback_count_);
-    sync_handle_watcher_callback_count_--;
-  }
-}
-
-void Connector::OnHandleReadyInternal(MojoResult result) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (result != MOJO_RESULT_OK) {
-    HandleError(result != MOJO_RESULT_FAILED_PRECONDITION, false);
-    return;
-  }
-
-  ReadAllAvailableMessages();
-  // At this point, this object might have been deleted. Return.
-}
-
-void Connector::WaitToReadMore() {
-  CHECK(!paused_);
-  DCHECK(!handle_watcher_);
-
-  handle_watcher_.reset(new SimpleWatcher(
-      FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL, task_runner_));
-  if (heap_profiler_tag_)
-    handle_watcher_->set_heap_profiler_tag(heap_profiler_tag_);
-  MojoResult rv = handle_watcher_->Watch(
-      message_pipe_.get(), MOJO_HANDLE_SIGNAL_READABLE,
-      base::Bind(&Connector::OnWatcherHandleReady, base::Unretained(this)));
-
-  if (rv != MOJO_RESULT_OK) {
-    // If the watch failed because the handle is invalid or its conditions can
-    // no longer be met, we signal the error asynchronously to avoid reentry.
-    task_runner_->PostTask(
-        FROM_HERE,
-        base::Bind(&Connector::OnWatcherHandleReady, weak_self_, rv));
-  } else {
-    handle_watcher_->ArmOrNotify();
-  }
-
-  if (allow_woken_up_by_others_) {
-    EnsureSyncWatcherExists();
-    sync_watcher_->AllowWokenUpBySyncWatchOnSameThread();
-  }
-}
-
-bool Connector::ReadSingleMessage(MojoResult* read_result) {
-  CHECK(!paused_);
-
-  bool receiver_result = false;
-
-  // Detect if |this| was destroyed or the message pipe was closed/transferred
-  // during message dispatch.
-  base::WeakPtr<Connector> weak_self = weak_self_;
-
-  Message message;
-  const MojoResult rv = ReadMessage(message_pipe_.get(), &message);
-  *read_result = rv;
-
-  if (rv == MOJO_RESULT_OK) {
-    base::Optional<ActiveDispatchTracker> dispatch_tracker;
-    if (!is_dispatching_ && nesting_observer_) {
-      is_dispatching_ = true;
-      dispatch_tracker.emplace(weak_self);
-    }
-
-    receiver_result =
-        incoming_receiver_ && incoming_receiver_->Accept(&message);
-
-    if (!weak_self)
-      return false;
-
-    if (dispatch_tracker) {
-      is_dispatching_ = false;
-      dispatch_tracker.reset();
-    }
-  } else if (rv == MOJO_RESULT_SHOULD_WAIT) {
-    return true;
-  } else {
-    HandleError(rv != MOJO_RESULT_FAILED_PRECONDITION, false);
-    return false;
-  }
-
-  if (enforce_errors_from_incoming_receiver_ && !receiver_result) {
-    HandleError(true, false);
-    return false;
-  }
-  return true;
-}
-
-void Connector::ReadAllAvailableMessages() {
-  while (!error_) {
-    base::WeakPtr<Connector> weak_self = weak_self_;
-    MojoResult rv;
-
-    // May delete |this.|
-    if (!ReadSingleMessage(&rv))
-      return;
-
-    if (!weak_self || paused_)
-      return;
-
-    DCHECK(rv == MOJO_RESULT_OK || rv == MOJO_RESULT_SHOULD_WAIT);
-
-    if (rv == MOJO_RESULT_SHOULD_WAIT) {
-      // Attempt to re-arm the Watcher.
-      MojoResult ready_result;
-      MojoResult arm_result = handle_watcher_->Arm(&ready_result);
-      if (arm_result == MOJO_RESULT_OK)
-        return;
-
-      // The watcher is already ready to notify again.
-      DCHECK_EQ(MOJO_RESULT_FAILED_PRECONDITION, arm_result);
-
-      if (ready_result == MOJO_RESULT_FAILED_PRECONDITION) {
-        HandleError(false, false);
-        return;
-      }
-
-      // There's more to read now, so we'll just keep looping.
-      DCHECK_EQ(MOJO_RESULT_OK, ready_result);
-    }
-  }
-}
-
-void Connector::CancelWait() {
-  handle_watcher_.reset();
-  sync_watcher_.reset();
-}
-
-void Connector::HandleError(bool force_pipe_reset, bool force_async_handler) {
-  if (error_ || !message_pipe_.is_valid())
-    return;
-
-  if (paused_) {
-    // Enforce calling the error handler asynchronously if the user has paused
-    // receiving messages. We need to wait until the user starts receiving
-    // messages again.
-    force_async_handler = true;
-  }
-
-  if (!force_pipe_reset && force_async_handler)
-    force_pipe_reset = true;
-
-  if (force_pipe_reset) {
-    CancelWait();
-    internal::MayAutoLock locker(&lock_);
-    message_pipe_.reset();
-    MessagePipe dummy_pipe;
-    message_pipe_ = std::move(dummy_pipe.handle0);
-  } else {
-    CancelWait();
-  }
-
-  if (force_async_handler) {
-    if (!paused_)
-      WaitToReadMore();
-  } else {
-    error_ = true;
-    if (!connection_error_handler_.is_null())
-      connection_error_handler_.Run();
-  }
-}
-
-void Connector::EnsureSyncWatcherExists() {
-  if (sync_watcher_)
-    return;
-  sync_watcher_.reset(new SyncHandleWatcher(
-      message_pipe_.get(), MOJO_HANDLE_SIGNAL_READABLE,
-      base::Bind(&Connector::OnSyncHandleWatcherHandleReady,
-                 base::Unretained(this))));
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/control_message_handler.cc b/mojo/public/cpp/bindings/lib/control_message_handler.cc
deleted file mode 100644
index 1b7bb78..0000000
--- a/mojo/public/cpp/bindings/lib/control_message_handler.cc
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/lib/control_message_handler.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <utility>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
-
-namespace mojo {
-namespace internal {
-namespace {
-
-bool ValidateControlRequestWithResponse(Message* message) {
-  ValidationContext validation_context(message->payload(),
-                                       message->payload_num_bytes(), 0, 0,
-                                       message, "ControlRequestValidator");
-  if (!ValidateMessageIsRequestExpectingResponse(message, &validation_context))
-    return false;
-
-  switch (message->header()->name) {
-    case interface_control::kRunMessageId:
-      return ValidateMessagePayload<
-          interface_control::internal::RunMessageParams_Data>(
-          message, &validation_context);
-  }
-  return false;
-}
-
-bool ValidateControlRequestWithoutResponse(Message* message) {
-  ValidationContext validation_context(message->payload(),
-                                       message->payload_num_bytes(), 0, 0,
-                                       message, "ControlRequestValidator");
-  if (!ValidateMessageIsRequestWithoutResponse(message, &validation_context))
-    return false;
-
-  switch (message->header()->name) {
-    case interface_control::kRunOrClosePipeMessageId:
-      return ValidateMessageIsRequestWithoutResponse(message,
-                                                     &validation_context) &&
-             ValidateMessagePayload<
-                 interface_control::internal::RunOrClosePipeMessageParams_Data>(
-                 message, &validation_context);
-  }
-  return false;
-}
-
-}  // namespace
-
-// static
-bool ControlMessageHandler::IsControlMessage(const Message* message) {
-  return message->header()->name == interface_control::kRunMessageId ||
-         message->header()->name == interface_control::kRunOrClosePipeMessageId;
-}
-
-ControlMessageHandler::ControlMessageHandler(uint32_t interface_version)
-    : interface_version_(interface_version) {
-}
-
-ControlMessageHandler::~ControlMessageHandler() {
-}
-
-bool ControlMessageHandler::Accept(Message* message) {
-  if (!ValidateControlRequestWithoutResponse(message))
-    return false;
-
-  if (message->header()->name == interface_control::kRunOrClosePipeMessageId)
-    return RunOrClosePipe(message);
-
-  NOTREACHED();
-  return false;
-}
-
-bool ControlMessageHandler::AcceptWithResponder(
-    Message* message,
-    std::unique_ptr<MessageReceiverWithStatus> responder) {
-  if (!ValidateControlRequestWithResponse(message))
-    return false;
-
-  if (message->header()->name == interface_control::kRunMessageId)
-    return Run(message, std::move(responder));
-
-  NOTREACHED();
-  return false;
-}
-
-bool ControlMessageHandler::Run(
-    Message* message,
-    std::unique_ptr<MessageReceiverWithStatus> responder) {
-  interface_control::internal::RunMessageParams_Data* params =
-      reinterpret_cast<interface_control::internal::RunMessageParams_Data*>(
-          message->mutable_payload());
-  interface_control::RunMessageParamsPtr params_ptr;
-  Deserialize<interface_control::RunMessageParamsDataView>(params, &params_ptr,
-                                                           &context_);
-  auto& input = *params_ptr->input;
-  interface_control::RunOutputPtr output = interface_control::RunOutput::New();
-  if (input.is_query_version()) {
-    output->set_query_version_result(
-        interface_control::QueryVersionResult::New());
-    output->get_query_version_result()->version = interface_version_;
-  } else if (input.is_flush_for_testing()) {
-    output.reset();
-  } else {
-    output.reset();
-  }
-
-  auto response_params_ptr = interface_control::RunResponseMessageParams::New();
-  response_params_ptr->output = std::move(output);
-  size_t size =
-      PrepareToSerialize<interface_control::RunResponseMessageParamsDataView>(
-          response_params_ptr, &context_);
-  MessageBuilder builder(interface_control::kRunMessageId,
-                         Message::kFlagIsResponse, size, 0);
-  builder.message()->set_request_id(message->request_id());
-
-  interface_control::internal::RunResponseMessageParams_Data* response_params =
-      nullptr;
-  Serialize<interface_control::RunResponseMessageParamsDataView>(
-      response_params_ptr, builder.buffer(), &response_params, &context_);
-  ignore_result(responder->Accept(builder.message()));
-
-  return true;
-}
-
-bool ControlMessageHandler::RunOrClosePipe(Message* message) {
-  interface_control::internal::RunOrClosePipeMessageParams_Data* params =
-      reinterpret_cast<
-          interface_control::internal::RunOrClosePipeMessageParams_Data*>(
-          message->mutable_payload());
-  interface_control::RunOrClosePipeMessageParamsPtr params_ptr;
-  Deserialize<interface_control::RunOrClosePipeMessageParamsDataView>(
-      params, &params_ptr, &context_);
-  auto& input = *params_ptr->input;
-  if (input.is_require_version())
-    return interface_version_ >= input.get_require_version()->version;
-
-  return false;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/control_message_handler.h b/mojo/public/cpp/bindings/lib/control_message_handler.h
deleted file mode 100644
index 5d1f716..0000000
--- a/mojo/public/cpp/bindings/lib/control_message_handler.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_HANDLER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_HANDLER_H_
-
-#include <stdint.h>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-namespace internal {
-
-// Handlers for request messages defined in interface_control_messages.mojom.
-class MOJO_CPP_BINDINGS_EXPORT ControlMessageHandler
-    : NON_EXPORTED_BASE(public MessageReceiverWithResponderStatus) {
- public:
-  static bool IsControlMessage(const Message* message);
-
-  explicit ControlMessageHandler(uint32_t interface_version);
-  ~ControlMessageHandler() override;
-
-  // Call the following methods only if IsControlMessage() returned true.
-  bool Accept(Message* message) override;
-  bool AcceptWithResponder(
-      Message* message,
-      std::unique_ptr<MessageReceiverWithStatus> responder) override;
-
- private:
-  bool Run(Message* message,
-           std::unique_ptr<MessageReceiverWithStatus> responder);
-  bool RunOrClosePipe(Message* message);
-
-  uint32_t interface_version_;
-  SerializationContext context_;
-
-  DISALLOW_COPY_AND_ASSIGN(ControlMessageHandler);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_HANDLER_H_
diff --git a/mojo/public/cpp/bindings/lib/control_message_proxy.cc b/mojo/public/cpp/bindings/lib/control_message_proxy.cc
deleted file mode 100644
index d082b49..0000000
--- a/mojo/public/cpp/bindings/lib/control_message_proxy.cc
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/lib/control_message_proxy.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
-
-namespace mojo {
-namespace internal {
-
-namespace {
-
-bool ValidateControlResponse(Message* message) {
-  ValidationContext validation_context(message->payload(),
-                                       message->payload_num_bytes(), 0, 0,
-                                       message, "ControlResponseValidator");
-  if (!ValidateMessageIsResponse(message, &validation_context))
-    return false;
-
-  switch (message->header()->name) {
-    case interface_control::kRunMessageId:
-      return ValidateMessagePayload<
-          interface_control::internal::RunResponseMessageParams_Data>(
-          message, &validation_context);
-  }
-  return false;
-}
-
-using RunCallback =
-    base::Callback<void(interface_control::RunResponseMessageParamsPtr)>;
-
-class RunResponseForwardToCallback : public MessageReceiver {
- public:
-  explicit RunResponseForwardToCallback(const RunCallback& callback)
-      : callback_(callback) {}
-  bool Accept(Message* message) override;
-
- private:
-  RunCallback callback_;
-  DISALLOW_COPY_AND_ASSIGN(RunResponseForwardToCallback);
-};
-
-bool RunResponseForwardToCallback::Accept(Message* message) {
-  if (!ValidateControlResponse(message))
-    return false;
-
-  interface_control::internal::RunResponseMessageParams_Data* params =
-      reinterpret_cast<
-          interface_control::internal::RunResponseMessageParams_Data*>(
-          message->mutable_payload());
-  interface_control::RunResponseMessageParamsPtr params_ptr;
-  SerializationContext context;
-  Deserialize<interface_control::RunResponseMessageParamsDataView>(
-      params, &params_ptr, &context);
-
-  callback_.Run(std::move(params_ptr));
-  return true;
-}
-
-void SendRunMessage(MessageReceiverWithResponder* receiver,
-                    interface_control::RunInputPtr input_ptr,
-                    const RunCallback& callback) {
-  SerializationContext context;
-
-  auto params_ptr = interface_control::RunMessageParams::New();
-  params_ptr->input = std::move(input_ptr);
-  size_t size = PrepareToSerialize<interface_control::RunMessageParamsDataView>(
-      params_ptr, &context);
-  MessageBuilder builder(interface_control::kRunMessageId,
-                         Message::kFlagExpectsResponse, size, 0);
-
-  interface_control::internal::RunMessageParams_Data* params = nullptr;
-  Serialize<interface_control::RunMessageParamsDataView>(
-      params_ptr, builder.buffer(), &params, &context);
-  std::unique_ptr<MessageReceiver> responder =
-      base::MakeUnique<RunResponseForwardToCallback>(callback);
-  ignore_result(
-      receiver->AcceptWithResponder(builder.message(), std::move(responder)));
-}
-
-Message ConstructRunOrClosePipeMessage(
-    interface_control::RunOrClosePipeInputPtr input_ptr) {
-  SerializationContext context;
-
-  auto params_ptr = interface_control::RunOrClosePipeMessageParams::New();
-  params_ptr->input = std::move(input_ptr);
-
-  size_t size = PrepareToSerialize<
-      interface_control::RunOrClosePipeMessageParamsDataView>(params_ptr,
-                                                              &context);
-  MessageBuilder builder(interface_control::kRunOrClosePipeMessageId, 0, size,
-                         0);
-
-  interface_control::internal::RunOrClosePipeMessageParams_Data* params =
-      nullptr;
-  Serialize<interface_control::RunOrClosePipeMessageParamsDataView>(
-      params_ptr, builder.buffer(), &params, &context);
-  return std::move(*builder.message());
-}
-
-void SendRunOrClosePipeMessage(
-    MessageReceiverWithResponder* receiver,
-    interface_control::RunOrClosePipeInputPtr input_ptr) {
-  Message message(ConstructRunOrClosePipeMessage(std::move(input_ptr)));
-
-  ignore_result(receiver->Accept(&message));
-}
-
-void RunVersionCallback(
-    const base::Callback<void(uint32_t)>& callback,
-    interface_control::RunResponseMessageParamsPtr run_response) {
-  uint32_t version = 0u;
-  if (run_response->output && run_response->output->is_query_version_result())
-    version = run_response->output->get_query_version_result()->version;
-  callback.Run(version);
-}
-
-void RunClosure(const base::Closure& callback,
-                interface_control::RunResponseMessageParamsPtr run_response) {
-  callback.Run();
-}
-
-}  // namespace
-
-ControlMessageProxy::ControlMessageProxy(MessageReceiverWithResponder* receiver)
-    : receiver_(receiver) {
-}
-
-ControlMessageProxy::~ControlMessageProxy() = default;
-
-void ControlMessageProxy::QueryVersion(
-    const base::Callback<void(uint32_t)>& callback) {
-  auto input_ptr = interface_control::RunInput::New();
-  input_ptr->set_query_version(interface_control::QueryVersion::New());
-  SendRunMessage(receiver_, std::move(input_ptr),
-                 base::Bind(&RunVersionCallback, callback));
-}
-
-void ControlMessageProxy::RequireVersion(uint32_t version) {
-  auto require_version = interface_control::RequireVersion::New();
-  require_version->version = version;
-  auto input_ptr = interface_control::RunOrClosePipeInput::New();
-  input_ptr->set_require_version(std::move(require_version));
-  SendRunOrClosePipeMessage(receiver_, std::move(input_ptr));
-}
-
-void ControlMessageProxy::FlushForTesting() {
-  if (encountered_error_)
-    return;
-
-  auto input_ptr = interface_control::RunInput::New();
-  input_ptr->set_flush_for_testing(interface_control::FlushForTesting::New());
-  base::RunLoop run_loop;
-  run_loop_quit_closure_ = run_loop.QuitClosure();
-  SendRunMessage(
-      receiver_, std::move(input_ptr),
-      base::Bind(&RunClosure,
-                 base::Bind(&ControlMessageProxy::RunFlushForTestingClosure,
-                            base::Unretained(this))));
-  run_loop.Run();
-}
-
-void ControlMessageProxy::RunFlushForTestingClosure() {
-  DCHECK(!run_loop_quit_closure_.is_null());
-  base::ResetAndReturn(&run_loop_quit_closure_).Run();
-}
-
-void ControlMessageProxy::OnConnectionError() {
-  encountered_error_ = true;
-  if (!run_loop_quit_closure_.is_null())
-    RunFlushForTestingClosure();
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/control_message_proxy.h b/mojo/public/cpp/bindings/lib/control_message_proxy.h
deleted file mode 100644
index 2f9314e..0000000
--- a/mojo/public/cpp/bindings/lib/control_message_proxy.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_PROXY_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_PROXY_H_
-
-#include <stdint.h>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-
-namespace mojo {
-
-class MessageReceiverWithResponder;
-
-namespace internal {
-
-// Proxy for request messages defined in interface_control_messages.mojom.
-class MOJO_CPP_BINDINGS_EXPORT ControlMessageProxy {
- public:
-  // Doesn't take ownership of |receiver|. It must outlive this object.
-  explicit ControlMessageProxy(MessageReceiverWithResponder* receiver);
-  ~ControlMessageProxy();
-
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback);
-  void RequireVersion(uint32_t version);
-
-  void FlushForTesting();
-  void OnConnectionError();
-
- private:
-  void RunFlushForTestingClosure();
-
-  // Not owned.
-  MessageReceiverWithResponder* receiver_;
-  bool encountered_error_ = false;
-
-  base::Closure run_loop_quit_closure_;
-
-  DISALLOW_COPY_AND_ASSIGN(ControlMessageProxy);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_PROXY_H_
diff --git a/mojo/public/cpp/bindings/lib/equals_traits.h b/mojo/public/cpp/bindings/lib/equals_traits.h
deleted file mode 100644
index 53c7dce..0000000
--- a/mojo/public/cpp/bindings/lib/equals_traits.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_EQUALS_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_EQUALS_TRAITS_H_
-
-#include <type_traits>
-#include <unordered_map>
-#include <vector>
-
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename T>
-struct HasEqualsMethod {
-  template <typename U>
-  static char Test(decltype(&U::Equals));
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <typename T, bool has_equals_method = HasEqualsMethod<T>::value>
-struct EqualsTraits;
-
-template <typename T>
-bool Equals(const T& a, const T& b);
-
-template <typename T>
-struct EqualsTraits<T, true> {
-  static bool Equals(const T& a, const T& b) { return a.Equals(b); }
-};
-
-template <typename T>
-struct EqualsTraits<T, false> {
-  static bool Equals(const T& a, const T& b) { return a == b; }
-};
-
-template <typename T>
-struct EqualsTraits<base::Optional<T>, false> {
-  static bool Equals(const base::Optional<T>& a, const base::Optional<T>& b) {
-    if (!a && !b)
-      return true;
-    if (!a || !b)
-      return false;
-
-    return internal::Equals(*a, *b);
-  }
-};
-
-template <typename T>
-struct EqualsTraits<std::vector<T>, false> {
-  static bool Equals(const std::vector<T>& a, const std::vector<T>& b) {
-    if (a.size() != b.size())
-      return false;
-    for (size_t i = 0; i < a.size(); ++i) {
-      if (!internal::Equals(a[i], b[i]))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename K, typename V>
-struct EqualsTraits<std::unordered_map<K, V>, false> {
-  static bool Equals(const std::unordered_map<K, V>& a,
-                     const std::unordered_map<K, V>& b) {
-    if (a.size() != b.size())
-      return false;
-    for (const auto& element : a) {
-      auto iter = b.find(element.first);
-      if (iter == b.end() || !internal::Equals(element.second, iter->second))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename T>
-bool Equals(const T& a, const T& b) {
-  return EqualsTraits<T>::Equals(a, b);
-}
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_EQUALS_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/lib/filter_chain.cc b/mojo/public/cpp/bindings/lib/filter_chain.cc
deleted file mode 100644
index 5d919fe..0000000
--- a/mojo/public/cpp/bindings/lib/filter_chain.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/filter_chain.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-
-namespace mojo {
-
-FilterChain::FilterChain(MessageReceiver* sink) : sink_(sink) {
-}
-
-FilterChain::FilterChain(FilterChain&& other) : sink_(other.sink_) {
-  other.sink_ = nullptr;
-  filters_.swap(other.filters_);
-}
-
-FilterChain& FilterChain::operator=(FilterChain&& other) {
-  std::swap(sink_, other.sink_);
-  filters_.swap(other.filters_);
-  return *this;
-}
-
-FilterChain::~FilterChain() {
-}
-
-void FilterChain::SetSink(MessageReceiver* sink) {
-  DCHECK(!sink_);
-  sink_ = sink;
-}
-
-bool FilterChain::Accept(Message* message) {
-  DCHECK(sink_);
-  for (auto& filter : filters_)
-    if (!filter->Accept(message))
-      return false;
-  return sink_->Accept(message);
-}
-
-void FilterChain::Append(std::unique_ptr<MessageReceiver> filter) {
-  filters_.emplace_back(std::move(filter));
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/fixed_buffer.cc b/mojo/public/cpp/bindings/lib/fixed_buffer.cc
deleted file mode 100644
index 725a193..0000000
--- a/mojo/public/cpp/bindings/lib/fixed_buffer.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-
-#include <stdlib.h>
-
-namespace mojo {
-namespace internal {
-
-FixedBufferForTesting::FixedBufferForTesting(size_t size) {
-  size = internal::Align(size);
-  // Use calloc here to ensure all message memory is zero'd out.
-  void* ptr = calloc(size, 1);
-  Initialize(ptr, size);
-}
-
-FixedBufferForTesting::~FixedBufferForTesting() {
-  free(data());
-}
-
-void* FixedBufferForTesting::Leak() {
-  void* ptr = data();
-  Initialize(nullptr, 0);
-  return ptr;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/fixed_buffer.h b/mojo/public/cpp/bindings/lib/fixed_buffer.h
deleted file mode 100644
index 070b0c8..0000000
--- a/mojo/public/cpp/bindings/lib/fixed_buffer.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_
-
-#include <stddef.h>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-
-namespace mojo {
-namespace internal {
-
-// FixedBufferForTesting owns its buffer. The Leak method may be used to steal
-// the underlying memory.
-class MOJO_CPP_BINDINGS_EXPORT FixedBufferForTesting
-    : NON_EXPORTED_BASE(public Buffer) {
- public:
-  explicit FixedBufferForTesting(size_t size);
-  ~FixedBufferForTesting();
-
-  // Returns the internal memory owned by the Buffer to the caller. The Buffer
-  // relinquishes its pointer, effectively resetting the state of the Buffer
-  // and leaving the caller responsible for freeing the returned memory address
-  // when no longer needed.
-  void* Leak();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FixedBufferForTesting);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_
diff --git a/mojo/public/cpp/bindings/lib/handle_interface_serialization.h b/mojo/public/cpp/bindings/lib/handle_interface_serialization.h
deleted file mode 100644
index 14ed21f..0000000
--- a/mojo/public/cpp/bindings/lib/handle_interface_serialization.h
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_HANDLE_INTERFACE_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_HANDLE_INTERFACE_SERIALIZATION_H_
-
-#include <type_traits>
-
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/interface_data_view.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename Base, typename T>
-struct Serializer<AssociatedInterfacePtrInfoDataView<Base>,
-                  AssociatedInterfacePtrInfo<T>> {
-  static_assert(std::is_base_of<Base, T>::value, "Interface type mismatch.");
-
-  static size_t PrepareToSerialize(const AssociatedInterfacePtrInfo<T>& input,
-                                   SerializationContext* context) {
-    if (input.handle().is_valid())
-      context->associated_endpoint_count++;
-    return 0;
-  }
-
-  static void Serialize(AssociatedInterfacePtrInfo<T>& input,
-                        AssociatedInterface_Data* output,
-                        SerializationContext* context) {
-    DCHECK(!input.handle().is_valid() || input.handle().pending_association());
-    if (input.handle().is_valid()) {
-      // Set to the index of the element pushed to the back of the vector.
-      output->handle.value =
-          static_cast<uint32_t>(context->associated_endpoint_handles.size());
-      context->associated_endpoint_handles.push_back(input.PassHandle());
-    } else {
-      output->handle.value = kEncodedInvalidHandleValue;
-    }
-    output->version = input.version();
-  }
-
-  static bool Deserialize(AssociatedInterface_Data* input,
-                          AssociatedInterfacePtrInfo<T>* output,
-                          SerializationContext* context) {
-    if (input->handle.is_valid()) {
-      DCHECK_LT(input->handle.value,
-                context->associated_endpoint_handles.size());
-      output->set_handle(
-          std::move(context->associated_endpoint_handles[input->handle.value]));
-    } else {
-      output->set_handle(ScopedInterfaceEndpointHandle());
-    }
-    output->set_version(input->version);
-    return true;
-  }
-};
-
-template <typename Base, typename T>
-struct Serializer<AssociatedInterfaceRequestDataView<Base>,
-                  AssociatedInterfaceRequest<T>> {
-  static_assert(std::is_base_of<Base, T>::value, "Interface type mismatch.");
-
-  static size_t PrepareToSerialize(const AssociatedInterfaceRequest<T>& input,
-                                   SerializationContext* context) {
-    if (input.handle().is_valid())
-      context->associated_endpoint_count++;
-    return 0;
-  }
-
-  static void Serialize(AssociatedInterfaceRequest<T>& input,
-                        AssociatedEndpointHandle_Data* output,
-                        SerializationContext* context) {
-    DCHECK(!input.handle().is_valid() || input.handle().pending_association());
-    if (input.handle().is_valid()) {
-      // Set to the index of the element pushed to the back of the vector.
-      output->value =
-          static_cast<uint32_t>(context->associated_endpoint_handles.size());
-      context->associated_endpoint_handles.push_back(input.PassHandle());
-    } else {
-      output->value = kEncodedInvalidHandleValue;
-    }
-  }
-
-  static bool Deserialize(AssociatedEndpointHandle_Data* input,
-                          AssociatedInterfaceRequest<T>* output,
-                          SerializationContext* context) {
-    if (input->is_valid()) {
-      DCHECK_LT(input->value, context->associated_endpoint_handles.size());
-      output->Bind(
-          std::move(context->associated_endpoint_handles[input->value]));
-    } else {
-      output->Bind(ScopedInterfaceEndpointHandle());
-    }
-    return true;
-  }
-};
-
-template <typename Base, typename T>
-struct Serializer<InterfacePtrDataView<Base>, InterfacePtr<T>> {
-  static_assert(std::is_base_of<Base, T>::value, "Interface type mismatch.");
-
-  static size_t PrepareToSerialize(const InterfacePtr<T>& input,
-                                   SerializationContext* context) {
-    return 0;
-  }
-
-  static void Serialize(InterfacePtr<T>& input,
-                        Interface_Data* output,
-                        SerializationContext* context) {
-    InterfacePtrInfo<T> info = input.PassInterface();
-    output->handle = context->handles.AddHandle(info.PassHandle().release());
-    output->version = info.version();
-  }
-
-  static bool Deserialize(Interface_Data* input,
-                          InterfacePtr<T>* output,
-                          SerializationContext* context) {
-    output->Bind(InterfacePtrInfo<T>(
-        context->handles.TakeHandleAs<mojo::MessagePipeHandle>(input->handle),
-        input->version));
-    return true;
-  }
-};
-
-template <typename Base, typename T>
-struct Serializer<InterfaceRequestDataView<Base>, InterfaceRequest<T>> {
-  static_assert(std::is_base_of<Base, T>::value, "Interface type mismatch.");
-
-  static size_t PrepareToSerialize(const InterfaceRequest<T>& input,
-                                   SerializationContext* context) {
-    return 0;
-  }
-
-  static void Serialize(InterfaceRequest<T>& input,
-                        Handle_Data* output,
-                        SerializationContext* context) {
-    *output = context->handles.AddHandle(input.PassMessagePipe().release());
-  }
-
-  static bool Deserialize(Handle_Data* input,
-                          InterfaceRequest<T>* output,
-                          SerializationContext* context) {
-    output->Bind(context->handles.TakeHandleAs<MessagePipeHandle>(*input));
-    return true;
-  }
-};
-
-template <typename T>
-struct Serializer<ScopedHandleBase<T>, ScopedHandleBase<T>> {
-  static size_t PrepareToSerialize(const ScopedHandleBase<T>& input,
-                                   SerializationContext* context) {
-    return 0;
-  }
-
-  static void Serialize(ScopedHandleBase<T>& input,
-                        Handle_Data* output,
-                        SerializationContext* context) {
-    *output = context->handles.AddHandle(input.release());
-  }
-
-  static bool Deserialize(Handle_Data* input,
-                          ScopedHandleBase<T>* output,
-                          SerializationContext* context) {
-    *output = context->handles.TakeHandleAs<T>(*input);
-    return true;
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_HANDLE_INTERFACE_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/hash_util.h b/mojo/public/cpp/bindings/lib/hash_util.h
deleted file mode 100644
index 93280d6..0000000
--- a/mojo/public/cpp/bindings/lib/hash_util.h
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_HASH_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_HASH_UTIL_H_
-
-#include <cstring>
-#include <functional>
-#include <type_traits>
-#include <vector>
-
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename T>
-size_t HashCombine(size_t seed, const T& value) {
-  // Based on proposal in:
-  // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
-  return seed ^ (std::hash<T>()(value) + (seed << 6) + (seed >> 2));
-}
-
-template <typename T>
-struct HasHashMethod {
-  template <typename U>
-  static char Test(decltype(&U::Hash));
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <typename T, bool has_hash_method = HasHashMethod<T>::value>
-struct HashTraits;
-
-template <typename T>
-size_t Hash(size_t seed, const T& value);
-
-template <typename T>
-struct HashTraits<T, true> {
-  static size_t Hash(size_t seed, const T& value) { return value.Hash(seed); }
-};
-
-template <typename T>
-struct HashTraits<T, false> {
-  static size_t Hash(size_t seed, const T& value) {
-    return HashCombine(seed, value);
-  }
-};
-
-template <typename T>
-struct HashTraits<std::vector<T>, false> {
-  static size_t Hash(size_t seed, const std::vector<T>& value) {
-    for (const auto& element : value) {
-      seed = HashCombine(seed, element);
-    }
-    return seed;
-  }
-};
-
-template <typename T>
-struct HashTraits<base::Optional<std::vector<T>>, false> {
-  static size_t Hash(size_t seed, const base::Optional<std::vector<T>>& value) {
-    if (!value)
-      return HashCombine(seed, 0);
-
-    return Hash(seed, *value);
-  }
-};
-
-template <typename T>
-size_t Hash(size_t seed, const T& value) {
-  return HashTraits<T>::Hash(seed, value);
-}
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_HASH_UTIL_H_
diff --git a/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc b/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc
deleted file mode 100644
index 4682e72..0000000
--- a/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc
+++ /dev/null
@@ -1,412 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/interface_endpoint_client.h"
-
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/single_thread_task_runner.h"
-#include "base/stl_util.h"
-#include "mojo/public/cpp/bindings/associated_group.h"
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_controller.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-#include "mojo/public/cpp/bindings/sync_call_restrictions.h"
-
-namespace mojo {
-
-// ----------------------------------------------------------------------------
-
-namespace {
-
-void DCheckIfInvalid(const base::WeakPtr<InterfaceEndpointClient>& client,
-                   const std::string& message) {
-  bool is_valid = client && !client->encountered_error();
-  DCHECK(!is_valid) << message;
-}
-
-// When receiving an incoming message which expects a repsonse,
-// InterfaceEndpointClient creates a ResponderThunk object and passes it to the
-// incoming message receiver. When the receiver finishes processing the message,
-// it can provide a response using this object.
-class ResponderThunk : public MessageReceiverWithStatus {
- public:
-  explicit ResponderThunk(
-      const base::WeakPtr<InterfaceEndpointClient>& endpoint_client,
-      scoped_refptr<base::SingleThreadTaskRunner> runner)
-      : endpoint_client_(endpoint_client),
-        accept_was_invoked_(false),
-        task_runner_(std::move(runner)) {}
-  ~ResponderThunk() override {
-    if (!accept_was_invoked_) {
-      // The Service handled a message that was expecting a response
-      // but did not send a response.
-      // We raise an error to signal the calling application that an error
-      // condition occurred. Without this the calling application would have no
-      // way of knowing it should stop waiting for a response.
-      if (task_runner_->RunsTasksOnCurrentThread()) {
-        // Please note that even if this code is run from a different task
-        // runner on the same thread as |task_runner_|, it is okay to directly
-        // call InterfaceEndpointClient::RaiseError(), because it will raise
-        // error from the correct task runner asynchronously.
-        if (endpoint_client_) {
-          endpoint_client_->RaiseError();
-        }
-      } else {
-        task_runner_->PostTask(
-            FROM_HERE,
-            base::Bind(&InterfaceEndpointClient::RaiseError, endpoint_client_));
-      }
-    }
-  }
-
-  // MessageReceiver implementation:
-  bool Accept(Message* message) override {
-    DCHECK(task_runner_->RunsTasksOnCurrentThread());
-    accept_was_invoked_ = true;
-    DCHECK(message->has_flag(Message::kFlagIsResponse));
-
-    bool result = false;
-
-    if (endpoint_client_)
-      result = endpoint_client_->Accept(message);
-
-    return result;
-  }
-
-  // MessageReceiverWithStatus implementation:
-  bool IsValid() override {
-    DCHECK(task_runner_->RunsTasksOnCurrentThread());
-    return endpoint_client_ && !endpoint_client_->encountered_error();
-  }
-
-  void DCheckInvalid(const std::string& message) override {
-    if (task_runner_->RunsTasksOnCurrentThread()) {
-      DCheckIfInvalid(endpoint_client_, message);
-    } else {
-      task_runner_->PostTask(
-          FROM_HERE, base::Bind(&DCheckIfInvalid, endpoint_client_, message));
-    }
- }
-
- private:
-  base::WeakPtr<InterfaceEndpointClient> endpoint_client_;
-  bool accept_was_invoked_;
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  DISALLOW_COPY_AND_ASSIGN(ResponderThunk);
-};
-
-}  // namespace
-
-// ----------------------------------------------------------------------------
-
-InterfaceEndpointClient::SyncResponseInfo::SyncResponseInfo(
-    bool* in_response_received)
-    : response_received(in_response_received) {}
-
-InterfaceEndpointClient::SyncResponseInfo::~SyncResponseInfo() {}
-
-// ----------------------------------------------------------------------------
-
-InterfaceEndpointClient::HandleIncomingMessageThunk::HandleIncomingMessageThunk(
-    InterfaceEndpointClient* owner)
-    : owner_(owner) {}
-
-InterfaceEndpointClient::HandleIncomingMessageThunk::
-    ~HandleIncomingMessageThunk() {}
-
-bool InterfaceEndpointClient::HandleIncomingMessageThunk::Accept(
-    Message* message) {
-  return owner_->HandleValidatedMessage(message);
-}
-
-// ----------------------------------------------------------------------------
-
-InterfaceEndpointClient::InterfaceEndpointClient(
-    ScopedInterfaceEndpointHandle handle,
-    MessageReceiverWithResponderStatus* receiver,
-    std::unique_ptr<MessageReceiver> payload_validator,
-    bool expect_sync_requests,
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
-    uint32_t interface_version)
-    : expect_sync_requests_(expect_sync_requests),
-      handle_(std::move(handle)),
-      incoming_receiver_(receiver),
-      thunk_(this),
-      filters_(&thunk_),
-      task_runner_(std::move(runner)),
-      control_message_proxy_(this),
-      control_message_handler_(interface_version),
-      weak_ptr_factory_(this) {
-  DCHECK(handle_.is_valid());
-
-  // TODO(yzshen): the way to use validator (or message filter in general)
-  // directly is a little awkward.
-  if (payload_validator)
-    filters_.Append(std::move(payload_validator));
-
-  if (handle_.pending_association()) {
-    handle_.SetAssociationEventHandler(base::Bind(
-        &InterfaceEndpointClient::OnAssociationEvent, base::Unretained(this)));
-  } else {
-    InitControllerIfNecessary();
-  }
-}
-
-InterfaceEndpointClient::~InterfaceEndpointClient() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (controller_)
-    handle_.group_controller()->DetachEndpointClient(handle_);
-}
-
-AssociatedGroup* InterfaceEndpointClient::associated_group() {
-  if (!associated_group_)
-    associated_group_ = base::MakeUnique<AssociatedGroup>(handle_);
-  return associated_group_.get();
-}
-
-ScopedInterfaceEndpointHandle InterfaceEndpointClient::PassHandle() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(!has_pending_responders());
-
-  if (!handle_.is_valid())
-    return ScopedInterfaceEndpointHandle();
-
-  handle_.SetAssociationEventHandler(
-      ScopedInterfaceEndpointHandle::AssociationEventCallback());
-
-  if (controller_) {
-    controller_ = nullptr;
-    handle_.group_controller()->DetachEndpointClient(handle_);
-  }
-
-  return std::move(handle_);
-}
-
-void InterfaceEndpointClient::AddFilter(
-    std::unique_ptr<MessageReceiver> filter) {
-  filters_.Append(std::move(filter));
-}
-
-void InterfaceEndpointClient::RaiseError() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (!handle_.pending_association())
-    handle_.group_controller()->RaiseError();
-}
-
-void InterfaceEndpointClient::CloseWithReason(uint32_t custom_reason,
-                                              const std::string& description) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  auto handle = PassHandle();
-  handle.ResetWithReason(custom_reason, description);
-}
-
-bool InterfaceEndpointClient::Accept(Message* message) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(!message->has_flag(Message::kFlagExpectsResponse));
-  DCHECK(!handle_.pending_association());
-
-  // This has to been done even if connection error has occurred. For example,
-  // the message contains a pending associated request. The user may try to use
-  // the corresponding associated interface pointer after sending this message.
-  // That associated interface pointer has to join an associated group in order
-  // to work properly.
-  if (!message->associated_endpoint_handles()->empty())
-    message->SerializeAssociatedEndpointHandles(handle_.group_controller());
-
-  if (encountered_error_)
-    return false;
-
-  InitControllerIfNecessary();
-
-  return controller_->SendMessage(message);
-}
-
-bool InterfaceEndpointClient::AcceptWithResponder(
-    Message* message,
-    std::unique_ptr<MessageReceiver> responder) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(message->has_flag(Message::kFlagExpectsResponse));
-  DCHECK(!handle_.pending_association());
-
-  // Please see comments in Accept().
-  if (!message->associated_endpoint_handles()->empty())
-    message->SerializeAssociatedEndpointHandles(handle_.group_controller());
-
-  if (encountered_error_)
-    return false;
-
-  InitControllerIfNecessary();
-
-  // Reserve 0 in case we want it to convey special meaning in the future.
-  uint64_t request_id = next_request_id_++;
-  if (request_id == 0)
-    request_id = next_request_id_++;
-
-  message->set_request_id(request_id);
-
-  bool is_sync = message->has_flag(Message::kFlagIsSync);
-  if (!controller_->SendMessage(message))
-    return false;
-
-  if (!is_sync) {
-    async_responders_[request_id] = std::move(responder);
-    return true;
-  }
-
-  SyncCallRestrictions::AssertSyncCallAllowed();
-
-  bool response_received = false;
-  sync_responses_.insert(std::make_pair(
-      request_id, base::MakeUnique<SyncResponseInfo>(&response_received)));
-
-  base::WeakPtr<InterfaceEndpointClient> weak_self =
-      weak_ptr_factory_.GetWeakPtr();
-  controller_->SyncWatch(&response_received);
-  // Make sure that this instance hasn't been destroyed.
-  if (weak_self) {
-    DCHECK(base::ContainsKey(sync_responses_, request_id));
-    auto iter = sync_responses_.find(request_id);
-    DCHECK_EQ(&response_received, iter->second->response_received);
-    if (response_received)
-      ignore_result(responder->Accept(&iter->second->response));
-    sync_responses_.erase(iter);
-  }
-
-  return true;
-}
-
-bool InterfaceEndpointClient::HandleIncomingMessage(Message* message) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return filters_.Accept(message);
-}
-
-void InterfaceEndpointClient::NotifyError(
-    const base::Optional<DisconnectReason>& reason) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (encountered_error_)
-    return;
-  encountered_error_ = true;
-
-  // Response callbacks may hold on to resource, and there's no need to keep
-  // them alive any longer. Note that it's allowed that a pending response
-  // callback may own this endpoint, so we simply move the responders onto the
-  // stack here and let them be destroyed when the stack unwinds.
-  AsyncResponderMap responders = std::move(async_responders_);
-
-  control_message_proxy_.OnConnectionError();
-
-  if (!error_handler_.is_null()) {
-    base::Closure error_handler = std::move(error_handler_);
-    error_handler.Run();
-  } else if (!error_with_reason_handler_.is_null()) {
-    ConnectionErrorWithReasonCallback error_with_reason_handler =
-        std::move(error_with_reason_handler_);
-    if (reason) {
-      error_with_reason_handler.Run(reason->custom_reason, reason->description);
-    } else {
-      error_with_reason_handler.Run(0, std::string());
-    }
-  }
-}
-
-void InterfaceEndpointClient::QueryVersion(
-    const base::Callback<void(uint32_t)>& callback) {
-  control_message_proxy_.QueryVersion(callback);
-}
-
-void InterfaceEndpointClient::RequireVersion(uint32_t version) {
-  control_message_proxy_.RequireVersion(version);
-}
-
-void InterfaceEndpointClient::FlushForTesting() {
-  control_message_proxy_.FlushForTesting();
-}
-
-void InterfaceEndpointClient::InitControllerIfNecessary() {
-  if (controller_ || handle_.pending_association())
-    return;
-
-  controller_ = handle_.group_controller()->AttachEndpointClient(handle_, this,
-                                                                 task_runner_);
-  if (expect_sync_requests_)
-    controller_->AllowWokenUpBySyncWatchOnSameThread();
-}
-
-void InterfaceEndpointClient::OnAssociationEvent(
-    ScopedInterfaceEndpointHandle::AssociationEvent event) {
-  if (event == ScopedInterfaceEndpointHandle::ASSOCIATED) {
-    InitControllerIfNecessary();
-  } else if (event ==
-             ScopedInterfaceEndpointHandle::PEER_CLOSED_BEFORE_ASSOCIATION) {
-    task_runner_->PostTask(FROM_HERE,
-                           base::Bind(&InterfaceEndpointClient::NotifyError,
-                                      weak_ptr_factory_.GetWeakPtr(),
-                                      handle_.disconnect_reason()));
-  }
-}
-
-bool InterfaceEndpointClient::HandleValidatedMessage(Message* message) {
-  DCHECK_EQ(handle_.id(), message->interface_id());
-
-  if (encountered_error_) {
-    // This message is received after error has been encountered. For associated
-    // interfaces, this means the remote side sends a
-    // PeerAssociatedEndpointClosed event but continues to send more messages
-    // for the same interface. Close the pipe because this shouldn't happen.
-    DVLOG(1) << "A message is received for an interface after it has been "
-             << "disconnected. Closing the pipe.";
-    return false;
-  }
-
-  if (message->has_flag(Message::kFlagExpectsResponse)) {
-    std::unique_ptr<MessageReceiverWithStatus> responder =
-        base::MakeUnique<ResponderThunk>(weak_ptr_factory_.GetWeakPtr(),
-                                         task_runner_);
-    if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
-      return control_message_handler_.AcceptWithResponder(message,
-                                                          std::move(responder));
-    } else {
-      return incoming_receiver_->AcceptWithResponder(message,
-                                                     std::move(responder));
-    }
-  } else if (message->has_flag(Message::kFlagIsResponse)) {
-    uint64_t request_id = message->request_id();
-
-    if (message->has_flag(Message::kFlagIsSync)) {
-      auto it = sync_responses_.find(request_id);
-      if (it == sync_responses_.end())
-        return false;
-      it->second->response = std::move(*message);
-      *it->second->response_received = true;
-      return true;
-    }
-
-    auto it = async_responders_.find(request_id);
-    if (it == async_responders_.end())
-      return false;
-    std::unique_ptr<MessageReceiver> responder = std::move(it->second);
-    async_responders_.erase(it);
-    return responder->Accept(message);
-  } else {
-    if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
-      return control_message_handler_.Accept(message);
-
-    return incoming_receiver_->Accept(message);
-  }
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/interface_ptr_state.h b/mojo/public/cpp/bindings/lib/interface_ptr_state.h
deleted file mode 100644
index fa54979..0000000
--- a/mojo/public/cpp/bindings/lib/interface_ptr_state.h
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_INTERFACE_PTR_STATE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_INTERFACE_PTR_STATE_H_
-
-#include <stdint.h>
-
-#include <algorithm>  // For |std::swap()|.
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback_forward.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "mojo/public/cpp/bindings/associated_group.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/lib/multiplex_router.h"
-#include "mojo/public/cpp/bindings/message_header_validator.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename Interface>
-class InterfacePtrState {
- public:
-  InterfacePtrState() : version_(0u) {}
-
-  ~InterfacePtrState() {
-    endpoint_client_.reset();
-    proxy_.reset();
-    if (router_)
-      router_->CloseMessagePipe();
-  }
-
-  Interface* instance() {
-    ConfigureProxyIfNecessary();
-
-    // This will be null if the object is not bound.
-    return proxy_.get();
-  }
-
-  uint32_t version() const { return version_; }
-
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback) {
-    ConfigureProxyIfNecessary();
-
-    // It is safe to capture |this| because the callback won't be run after this
-    // object goes away.
-    endpoint_client_->QueryVersion(base::Bind(
-        &InterfacePtrState::OnQueryVersion, base::Unretained(this), callback));
-  }
-
-  void RequireVersion(uint32_t version) {
-    ConfigureProxyIfNecessary();
-
-    if (version <= version_)
-      return;
-
-    version_ = version;
-    endpoint_client_->RequireVersion(version);
-  }
-
-  void FlushForTesting() {
-    ConfigureProxyIfNecessary();
-    endpoint_client_->FlushForTesting();
-  }
-
-  void CloseWithReason(uint32_t custom_reason, const std::string& description) {
-    ConfigureProxyIfNecessary();
-    endpoint_client_->CloseWithReason(custom_reason, description);
-  }
-
-  void Swap(InterfacePtrState* other) {
-    using std::swap;
-    swap(other->router_, router_);
-    swap(other->endpoint_client_, endpoint_client_);
-    swap(other->proxy_, proxy_);
-    handle_.swap(other->handle_);
-    runner_.swap(other->runner_);
-    swap(other->version_, version_);
-  }
-
-  void Bind(InterfacePtrInfo<Interface> info,
-            scoped_refptr<base::SingleThreadTaskRunner> runner) {
-    DCHECK(!router_);
-    DCHECK(!endpoint_client_);
-    DCHECK(!proxy_);
-    DCHECK(!handle_.is_valid());
-    DCHECK_EQ(0u, version_);
-    DCHECK(info.is_valid());
-
-    handle_ = info.PassHandle();
-    version_ = info.version();
-    runner_ = std::move(runner);
-  }
-
-  bool HasAssociatedInterfaces() const {
-    return router_ ? router_->HasAssociatedEndpoints() : false;
-  }
-
-  // After this method is called, the object is in an invalid state and
-  // shouldn't be reused.
-  InterfacePtrInfo<Interface> PassInterface() {
-    endpoint_client_.reset();
-    proxy_.reset();
-    return InterfacePtrInfo<Interface>(
-        router_ ? router_->PassMessagePipe() : std::move(handle_), version_);
-  }
-
-  bool is_bound() const { return handle_.is_valid() || endpoint_client_; }
-
-  bool encountered_error() const {
-    return endpoint_client_ ? endpoint_client_->encountered_error() : false;
-  }
-
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    ConfigureProxyIfNecessary();
-
-    DCHECK(endpoint_client_);
-    endpoint_client_->set_connection_error_handler(error_handler);
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    ConfigureProxyIfNecessary();
-
-    DCHECK(endpoint_client_);
-    endpoint_client_->set_connection_error_with_reason_handler(error_handler);
-  }
-
-  // Returns true if bound and awaiting a response to a message.
-  bool has_pending_callbacks() const {
-    return endpoint_client_ && endpoint_client_->has_pending_responders();
-  }
-
-  AssociatedGroup* associated_group() {
-    ConfigureProxyIfNecessary();
-    return endpoint_client_->associated_group();
-  }
-
-  void EnableTestingMode() {
-    ConfigureProxyIfNecessary();
-    router_->EnableTestingMode();
-  }
-
-  void ForwardMessage(Message message) {
-    ConfigureProxyIfNecessary();
-    endpoint_client_->Accept(&message);
-  }
-
-  void ForwardMessageWithResponder(Message message,
-                                   std::unique_ptr<MessageReceiver> responder) {
-    ConfigureProxyIfNecessary();
-    endpoint_client_->AcceptWithResponder(&message, std::move(responder));
-  }
-
- private:
-  using Proxy = typename Interface::Proxy_;
-
-  void ConfigureProxyIfNecessary() {
-    // The proxy has been configured.
-    if (proxy_) {
-      DCHECK(router_);
-      DCHECK(endpoint_client_);
-      return;
-    }
-    // The object hasn't been bound.
-    if (!handle_.is_valid())
-      return;
-
-    MultiplexRouter::Config config =
-        Interface::PassesAssociatedKinds_
-            ? MultiplexRouter::MULTI_INTERFACE
-            : (Interface::HasSyncMethods_
-                   ? MultiplexRouter::SINGLE_INTERFACE_WITH_SYNC_METHODS
-                   : MultiplexRouter::SINGLE_INTERFACE);
-    router_ = new MultiplexRouter(std::move(handle_), config, true, runner_);
-    router_->SetMasterInterfaceName(Interface::Name_);
-    endpoint_client_.reset(new InterfaceEndpointClient(
-        router_->CreateLocalEndpointHandle(kMasterInterfaceId), nullptr,
-        base::WrapUnique(new typename Interface::ResponseValidator_()), false,
-        std::move(runner_),
-        // The version is only queried from the client so the value passed here
-        // will not be used.
-        0u));
-    proxy_.reset(new Proxy(endpoint_client_.get()));
-  }
-
-  void OnQueryVersion(const base::Callback<void(uint32_t)>& callback,
-                      uint32_t version) {
-    version_ = version;
-    callback.Run(version);
-  }
-
-  scoped_refptr<MultiplexRouter> router_;
-
-  std::unique_ptr<InterfaceEndpointClient> endpoint_client_;
-  std::unique_ptr<Proxy> proxy_;
-
-  // |router_| (as well as other members above) is not initialized until
-  // read/write with the message pipe handle is needed. |handle_| is valid
-  // between the Bind() call and the initialization of |router_|.
-  ScopedMessagePipeHandle handle_;
-  scoped_refptr<base::SingleThreadTaskRunner> runner_;
-
-  uint32_t version_;
-
-  DISALLOW_COPY_AND_ASSIGN(InterfacePtrState);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_INTERFACE_PTR_STATE_H_
diff --git a/mojo/public/cpp/bindings/lib/map_data_internal.h b/mojo/public/cpp/bindings/lib/map_data_internal.h
deleted file mode 100644
index f8e3d29..0000000
--- a/mojo/public/cpp/bindings/lib/map_data_internal.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MAP_DATA_INTERNAL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MAP_DATA_INTERNAL_H_
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/validate_params.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-
-namespace mojo {
-namespace internal {
-
-// Map serializes into a struct which has two arrays as struct fields, the keys
-// and the values.
-template <typename Key, typename Value>
-class Map_Data {
- public:
-  static Map_Data* New(Buffer* buf) {
-    return new (buf->Allocate(sizeof(Map_Data))) Map_Data();
-  }
-
-  // |validate_params| must have non-null |key_validate_params| and
-  // |element_validate_params| members.
-  static bool Validate(const void* data,
-                       ValidationContext* validation_context,
-                       const ContainerValidateParams* validate_params) {
-    if (!data)
-      return true;
-
-    if (!ValidateStructHeaderAndClaimMemory(data, validation_context))
-      return false;
-
-    const Map_Data* object = static_cast<const Map_Data*>(data);
-    if (object->header_.num_bytes != sizeof(Map_Data) ||
-        object->header_.version != 0) {
-      ReportValidationError(validation_context,
-                            VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
-      return false;
-    }
-
-    if (!ValidatePointerNonNullable(
-            object->keys, "null key array in map struct", validation_context) ||
-        !ValidateContainer(object->keys, validation_context,
-                           validate_params->key_validate_params)) {
-      return false;
-    }
-
-    if (!ValidatePointerNonNullable(object->values,
-                                    "null value array in map struct",
-                                    validation_context) ||
-        !ValidateContainer(object->values, validation_context,
-                           validate_params->element_validate_params)) {
-      return false;
-    }
-
-    if (object->keys.Get()->size() != object->values.Get()->size()) {
-      ReportValidationError(validation_context,
-                            VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP);
-      return false;
-    }
-
-    return true;
-  }
-
-  StructHeader header_;
-
-  Pointer<Array_Data<Key>> keys;
-  Pointer<Array_Data<Value>> values;
-
- private:
-  Map_Data() {
-    header_.num_bytes = sizeof(*this);
-    header_.version = 0;
-  }
-  ~Map_Data() = delete;
-};
-static_assert(sizeof(Map_Data<char, char>) == 24, "Bad sizeof(Map_Data)");
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MAP_DATA_INTERNAL_H_
diff --git a/mojo/public/cpp/bindings/lib/map_serialization.h b/mojo/public/cpp/bindings/lib/map_serialization.h
deleted file mode 100644
index 718a763..0000000
--- a/mojo/public/cpp/bindings/lib/map_serialization.h
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MAP_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MAP_SERIALIZATION_H_
-
-#include <type_traits>
-#include <vector>
-
-#include "mojo/public/cpp/bindings/array_data_view.h"
-#include "mojo/public/cpp/bindings/lib/array_serialization.h"
-#include "mojo/public/cpp/bindings/lib/map_data_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-#include "mojo/public/cpp/bindings/map_data_view.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename MaybeConstUserType>
-class MapReaderBase {
- public:
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = MapTraits<UserType>;
-  using MaybeConstIterator =
-      decltype(Traits::GetBegin(std::declval<MaybeConstUserType&>()));
-
-  explicit MapReaderBase(MaybeConstUserType& input)
-      : input_(input), iter_(Traits::GetBegin(input_)) {}
-  ~MapReaderBase() {}
-
-  size_t GetSize() const { return Traits::GetSize(input_); }
-
-  // Return null because key or value elements are not stored continuously in
-  // memory.
-  void* GetDataIfExists() { return nullptr; }
-
- protected:
-  MaybeConstUserType& input_;
-  MaybeConstIterator iter_;
-};
-
-// Used as the UserTypeReader template parameter of ArraySerializer.
-template <typename MaybeConstUserType>
-class MapKeyReader : public MapReaderBase<MaybeConstUserType> {
- public:
-  using Base = MapReaderBase<MaybeConstUserType>;
-  using Traits = typename Base::Traits;
-  using MaybeConstIterator = typename Base::MaybeConstIterator;
-
-  explicit MapKeyReader(MaybeConstUserType& input) : Base(input) {}
-  ~MapKeyReader() {}
-
-  using GetNextResult =
-      decltype(Traits::GetKey(std::declval<MaybeConstIterator&>()));
-  GetNextResult GetNext() {
-    GetNextResult key = Traits::GetKey(this->iter_);
-    Traits::AdvanceIterator(this->iter_);
-    return key;
-  }
-};
-
-// Used as the UserTypeReader template parameter of ArraySerializer.
-template <typename MaybeConstUserType>
-class MapValueReader : public MapReaderBase<MaybeConstUserType> {
- public:
-  using Base = MapReaderBase<MaybeConstUserType>;
-  using Traits = typename Base::Traits;
-  using MaybeConstIterator = typename Base::MaybeConstIterator;
-
-  explicit MapValueReader(MaybeConstUserType& input) : Base(input) {}
-  ~MapValueReader() {}
-
-  using GetNextResult =
-      decltype(Traits::GetValue(std::declval<MaybeConstIterator&>()));
-  GetNextResult GetNext() {
-    GetNextResult value = Traits::GetValue(this->iter_);
-    Traits::AdvanceIterator(this->iter_);
-    return value;
-  }
-};
-
-template <typename Key, typename Value, typename MaybeConstUserType>
-struct Serializer<MapDataView<Key, Value>, MaybeConstUserType> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = MapTraits<UserType>;
-  using UserKey = typename Traits::Key;
-  using UserValue = typename Traits::Value;
-  using Data = typename MojomTypeTraits<MapDataView<Key, Value>>::Data;
-  using KeyArraySerializer = ArraySerializer<ArrayDataView<Key>,
-                                             std::vector<UserKey>,
-                                             MapKeyReader<MaybeConstUserType>>;
-  using ValueArraySerializer =
-      ArraySerializer<ArrayDataView<Value>,
-                      std::vector<UserValue>,
-                      MapValueReader<MaybeConstUserType>>;
-
-  static size_t PrepareToSerialize(MaybeConstUserType& input,
-                                   SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input))
-      return 0;
-
-    size_t struct_overhead = sizeof(Data);
-    MapKeyReader<MaybeConstUserType> key_reader(input);
-    size_t keys_size =
-        KeyArraySerializer::GetSerializedSize(&key_reader, context);
-    MapValueReader<MaybeConstUserType> value_reader(input);
-    size_t values_size =
-        ValueArraySerializer::GetSerializedSize(&value_reader, context);
-
-    return struct_overhead + keys_size + values_size;
-  }
-
-  static void Serialize(MaybeConstUserType& input,
-                        Buffer* buf,
-                        Data** output,
-                        const ContainerValidateParams* validate_params,
-                        SerializationContext* context) {
-    DCHECK(validate_params->key_validate_params);
-    DCHECK(validate_params->element_validate_params);
-    if (CallIsNullIfExists<Traits>(input)) {
-      *output = nullptr;
-      return;
-    }
-
-    auto result = Data::New(buf);
-    if (result) {
-      auto keys_ptr = MojomTypeTraits<ArrayDataView<Key>>::Data::New(
-          Traits::GetSize(input), buf);
-      if (keys_ptr) {
-        MapKeyReader<MaybeConstUserType> key_reader(input);
-        KeyArraySerializer::SerializeElements(
-            &key_reader, buf, keys_ptr, validate_params->key_validate_params,
-            context);
-        result->keys.Set(keys_ptr);
-      }
-
-      auto values_ptr = MojomTypeTraits<ArrayDataView<Value>>::Data::New(
-          Traits::GetSize(input), buf);
-      if (values_ptr) {
-        MapValueReader<MaybeConstUserType> value_reader(input);
-        ValueArraySerializer::SerializeElements(
-            &value_reader, buf, values_ptr,
-            validate_params->element_validate_params, context);
-        result->values.Set(values_ptr);
-      }
-    }
-    *output = result;
-  }
-
-  static bool Deserialize(Data* input,
-                          UserType* output,
-                          SerializationContext* context) {
-    if (!input)
-      return CallSetToNullIfExists<Traits>(output);
-
-    std::vector<UserKey> keys;
-    std::vector<UserValue> values;
-
-    if (!KeyArraySerializer::DeserializeElements(input->keys.Get(), &keys,
-                                                 context) ||
-        !ValueArraySerializer::DeserializeElements(input->values.Get(), &values,
-                                                   context)) {
-      return false;
-    }
-
-    DCHECK_EQ(keys.size(), values.size());
-    size_t size = keys.size();
-    Traits::SetToEmpty(output);
-
-    for (size_t i = 0; i < size; ++i) {
-      if (!Traits::Insert(*output, std::move(keys[i]), std::move(values[i])))
-        return false;
-    }
-    return true;
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MAP_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/may_auto_lock.h b/mojo/public/cpp/bindings/lib/may_auto_lock.h
deleted file mode 100644
index 06091fe..0000000
--- a/mojo/public/cpp/bindings/lib/may_auto_lock.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MAY_AUTO_LOCK_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MAY_AUTO_LOCK_H_
-
-#include "base/macros.h"
-#include "base/optional.h"
-#include "base/synchronization/lock.h"
-
-namespace mojo {
-namespace internal {
-
-// Similar to base::AutoLock, except that it does nothing if |lock| passed into
-// the constructor is null.
-class MayAutoLock {
- public:
-  explicit MayAutoLock(base::Optional<base::Lock>* lock)
-      : lock_(lock->has_value() ? &lock->value() : nullptr) {
-    if (lock_)
-      lock_->Acquire();
-  }
-
-  ~MayAutoLock() {
-    if (lock_) {
-      lock_->AssertAcquired();
-      lock_->Release();
-    }
-  }
-
- private:
-  base::Lock* lock_;
-  DISALLOW_COPY_AND_ASSIGN(MayAutoLock);
-};
-
-// Similar to base::AutoUnlock, except that it does nothing if |lock| passed
-// into the constructor is null.
-class MayAutoUnlock {
- public:
-  explicit MayAutoUnlock(base::Optional<base::Lock>* lock)
-      : lock_(lock->has_value() ? &lock->value() : nullptr) {
-    if (lock_) {
-      lock_->AssertAcquired();
-      lock_->Release();
-    }
-  }
-
-  ~MayAutoUnlock() {
-    if (lock_)
-      lock_->Acquire();
-  }
-
- private:
-  base::Lock* lock_;
-  DISALLOW_COPY_AND_ASSIGN(MayAutoUnlock);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MAY_AUTO_LOCK_H_
diff --git a/mojo/public/cpp/bindings/lib/message.cc b/mojo/public/cpp/bindings/lib/message.cc
deleted file mode 100644
index e5f3808..0000000
--- a/mojo/public/cpp/bindings/lib/message.cc
+++ /dev/null
@@ -1,332 +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.
-
-#include "mojo/public/cpp/bindings/message.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include <algorithm>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/strings/stringprintf.h"
-#include "base/threading/thread_local.h"
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-
-namespace mojo {
-
-namespace {
-
-base::LazyInstance<base::ThreadLocalPointer<internal::MessageDispatchContext>>::
-    DestructorAtExit g_tls_message_dispatch_context = LAZY_INSTANCE_INITIALIZER;
-
-base::LazyInstance<base::ThreadLocalPointer<SyncMessageResponseContext>>::
-    DestructorAtExit g_tls_sync_response_context = LAZY_INSTANCE_INITIALIZER;
-
-void DoNotifyBadMessage(Message message, const std::string& error) {
-  message.NotifyBadMessage(error);
-}
-
-}  // namespace
-
-Message::Message() {
-}
-
-Message::Message(Message&& other)
-    : buffer_(std::move(other.buffer_)),
-      handles_(std::move(other.handles_)),
-      associated_endpoint_handles_(
-          std::move(other.associated_endpoint_handles_)) {}
-
-Message::~Message() {
-  CloseHandles();
-}
-
-Message& Message::operator=(Message&& other) {
-  Reset();
-  std::swap(other.buffer_, buffer_);
-  std::swap(other.handles_, handles_);
-  std::swap(other.associated_endpoint_handles_, associated_endpoint_handles_);
-  return *this;
-}
-
-void Message::Reset() {
-  CloseHandles();
-  handles_.clear();
-  associated_endpoint_handles_.clear();
-  buffer_.reset();
-}
-
-void Message::Initialize(size_t capacity, bool zero_initialized) {
-  DCHECK(!buffer_);
-  buffer_.reset(new internal::MessageBuffer(capacity, zero_initialized));
-}
-
-void Message::InitializeFromMojoMessage(ScopedMessageHandle message,
-                                        uint32_t num_bytes,
-                                        std::vector<Handle>* handles) {
-  DCHECK(!buffer_);
-  buffer_.reset(new internal::MessageBuffer(std::move(message), num_bytes));
-  handles_.swap(*handles);
-}
-
-const uint8_t* Message::payload() const {
-  if (version() < 2)
-    return data() + header()->num_bytes;
-
-  return static_cast<const uint8_t*>(header_v2()->payload.Get());
-}
-
-uint32_t Message::payload_num_bytes() const {
-  DCHECK_GE(data_num_bytes(), header()->num_bytes);
-  size_t num_bytes;
-  if (version() < 2) {
-    num_bytes = data_num_bytes() - header()->num_bytes;
-  } else {
-    auto payload = reinterpret_cast<uintptr_t>(header_v2()->payload.Get());
-    if (!payload) {
-      num_bytes = 0;
-    } else {
-      auto payload_end =
-          reinterpret_cast<uintptr_t>(header_v2()->payload_interface_ids.Get());
-      if (!payload_end)
-        payload_end = reinterpret_cast<uintptr_t>(data() + data_num_bytes());
-      DCHECK_GE(payload_end, payload);
-      num_bytes = payload_end - payload;
-    }
-  }
-  DCHECK_LE(num_bytes, std::numeric_limits<uint32_t>::max());
-  return static_cast<uint32_t>(num_bytes);
-}
-
-uint32_t Message::payload_num_interface_ids() const {
-  auto* array_pointer =
-      version() < 2 ? nullptr : header_v2()->payload_interface_ids.Get();
-  return array_pointer ? static_cast<uint32_t>(array_pointer->size()) : 0;
-}
-
-const uint32_t* Message::payload_interface_ids() const {
-  auto* array_pointer =
-      version() < 2 ? nullptr : header_v2()->payload_interface_ids.Get();
-  return array_pointer ? array_pointer->storage() : nullptr;
-}
-
-ScopedMessageHandle Message::TakeMojoMessage() {
-  // If there are associated endpoints transferred,
-  // SerializeAssociatedEndpointHandles() must be called before this method.
-  DCHECK(associated_endpoint_handles_.empty());
-
-  if (handles_.empty())  // Fast path for the common case: No handles.
-    return buffer_->TakeMessage();
-
-  // Allocate a new message with space for the handles, then copy the buffer
-  // contents into it.
-  //
-  // TODO(rockot): We could avoid this copy by extending GetSerializedSize()
-  // behavior to collect handles. It's unoptimized for now because it's much
-  // more common to have messages with no handles.
-  ScopedMessageHandle new_message;
-  MojoResult rv = AllocMessage(
-      data_num_bytes(),
-      handles_.empty() ? nullptr
-                       : reinterpret_cast<const MojoHandle*>(handles_.data()),
-      handles_.size(),
-      MOJO_ALLOC_MESSAGE_FLAG_NONE,
-      &new_message);
-  CHECK_EQ(rv, MOJO_RESULT_OK);
-  handles_.clear();
-
-  void* new_buffer = nullptr;
-  rv = GetMessageBuffer(new_message.get(), &new_buffer);
-  CHECK_EQ(rv, MOJO_RESULT_OK);
-
-  memcpy(new_buffer, data(), data_num_bytes());
-  buffer_.reset();
-
-  return new_message;
-}
-
-void Message::NotifyBadMessage(const std::string& error) {
-  DCHECK(buffer_);
-  buffer_->NotifyBadMessage(error);
-}
-
-void Message::CloseHandles() {
-  for (std::vector<Handle>::iterator it = handles_.begin();
-       it != handles_.end(); ++it) {
-    if (it->is_valid())
-      CloseRaw(*it);
-  }
-}
-
-void Message::SerializeAssociatedEndpointHandles(
-    AssociatedGroupController* group_controller) {
-  if (associated_endpoint_handles_.empty())
-    return;
-
-  DCHECK_GE(version(), 2u);
-  DCHECK(header_v2()->payload_interface_ids.is_null());
-
-  size_t size = associated_endpoint_handles_.size();
-  auto* data = internal::Array_Data<uint32_t>::New(size, buffer());
-  header_v2()->payload_interface_ids.Set(data);
-
-  for (size_t i = 0; i < size; ++i) {
-    ScopedInterfaceEndpointHandle& handle = associated_endpoint_handles_[i];
-
-    DCHECK(handle.pending_association());
-    data->storage()[i] =
-        group_controller->AssociateInterface(std::move(handle));
-  }
-  associated_endpoint_handles_.clear();
-}
-
-bool Message::DeserializeAssociatedEndpointHandles(
-    AssociatedGroupController* group_controller) {
-  associated_endpoint_handles_.clear();
-
-  uint32_t num_ids = payload_num_interface_ids();
-  if (num_ids == 0)
-    return true;
-
-  associated_endpoint_handles_.reserve(num_ids);
-  uint32_t* ids = header_v2()->payload_interface_ids.Get()->storage();
-  bool result = true;
-  for (uint32_t i = 0; i < num_ids; ++i) {
-    auto handle = group_controller->CreateLocalEndpointHandle(ids[i]);
-    if (IsValidInterfaceId(ids[i]) && !handle.is_valid()) {
-      // |ids[i]| itself is valid but handle creation failed. In that case, mark
-      // deserialization as failed but continue to deserialize the rest of
-      // handles.
-      result = false;
-    }
-
-    associated_endpoint_handles_.push_back(std::move(handle));
-    ids[i] = kInvalidInterfaceId;
-  }
-  return result;
-}
-
-PassThroughFilter::PassThroughFilter() {}
-
-PassThroughFilter::~PassThroughFilter() {}
-
-bool PassThroughFilter::Accept(Message* message) { return true; }
-
-SyncMessageResponseContext::SyncMessageResponseContext()
-    : outer_context_(current()) {
-  g_tls_sync_response_context.Get().Set(this);
-}
-
-SyncMessageResponseContext::~SyncMessageResponseContext() {
-  DCHECK_EQ(current(), this);
-  g_tls_sync_response_context.Get().Set(outer_context_);
-}
-
-// static
-SyncMessageResponseContext* SyncMessageResponseContext::current() {
-  return g_tls_sync_response_context.Get().Get();
-}
-
-void SyncMessageResponseContext::ReportBadMessage(const std::string& error) {
-  GetBadMessageCallback().Run(error);
-}
-
-const ReportBadMessageCallback&
-SyncMessageResponseContext::GetBadMessageCallback() {
-  if (bad_message_callback_.is_null()) {
-    bad_message_callback_ =
-        base::Bind(&DoNotifyBadMessage, base::Passed(&response_));
-  }
-  return bad_message_callback_;
-}
-
-MojoResult ReadMessage(MessagePipeHandle handle, Message* message) {
-  MojoResult rv;
-
-  std::vector<Handle> handles;
-  ScopedMessageHandle mojo_message;
-  uint32_t num_bytes = 0, num_handles = 0;
-  rv = ReadMessageNew(handle,
-                      &mojo_message,
-                      &num_bytes,
-                      nullptr,
-                      &num_handles,
-                      MOJO_READ_MESSAGE_FLAG_NONE);
-  if (rv == MOJO_RESULT_RESOURCE_EXHAUSTED) {
-    DCHECK_GT(num_handles, 0u);
-    handles.resize(num_handles);
-    rv = ReadMessageNew(handle,
-                        &mojo_message,
-                        &num_bytes,
-                        reinterpret_cast<MojoHandle*>(handles.data()),
-                        &num_handles,
-                        MOJO_READ_MESSAGE_FLAG_NONE);
-  }
-
-  if (rv != MOJO_RESULT_OK)
-    return rv;
-
-  message->InitializeFromMojoMessage(
-      std::move(mojo_message), num_bytes, &handles);
-  return MOJO_RESULT_OK;
-}
-
-void ReportBadMessage(const std::string& error) {
-  internal::MessageDispatchContext* context =
-      internal::MessageDispatchContext::current();
-  DCHECK(context);
-  context->GetBadMessageCallback().Run(error);
-}
-
-ReportBadMessageCallback GetBadMessageCallback() {
-  internal::MessageDispatchContext* context =
-      internal::MessageDispatchContext::current();
-  DCHECK(context);
-  return context->GetBadMessageCallback();
-}
-
-namespace internal {
-
-MessageHeaderV2::MessageHeaderV2() = default;
-
-MessageDispatchContext::MessageDispatchContext(Message* message)
-    : outer_context_(current()), message_(message) {
-  g_tls_message_dispatch_context.Get().Set(this);
-}
-
-MessageDispatchContext::~MessageDispatchContext() {
-  DCHECK_EQ(current(), this);
-  g_tls_message_dispatch_context.Get().Set(outer_context_);
-}
-
-// static
-MessageDispatchContext* MessageDispatchContext::current() {
-  return g_tls_message_dispatch_context.Get().Get();
-}
-
-const ReportBadMessageCallback&
-MessageDispatchContext::GetBadMessageCallback() {
-  if (bad_message_callback_.is_null()) {
-    bad_message_callback_ =
-        base::Bind(&DoNotifyBadMessage, base::Passed(message_));
-  }
-  return bad_message_callback_;
-}
-
-// static
-void SyncMessageResponseSetup::SetCurrentSyncResponseMessage(Message* message) {
-  SyncMessageResponseContext* context = SyncMessageResponseContext::current();
-  if (context)
-    context->response_ = std::move(*message);
-}
-
-}  // namespace internal
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/message_buffer.cc b/mojo/public/cpp/bindings/lib/message_buffer.cc
deleted file mode 100644
index cc12ef6..0000000
--- a/mojo/public/cpp/bindings/lib/message_buffer.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/message_buffer.h"
-
-#include <limits>
-
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-
-namespace mojo {
-namespace internal {
-
-MessageBuffer::MessageBuffer(size_t capacity, bool zero_initialized) {
-  DCHECK_LE(capacity, std::numeric_limits<uint32_t>::max());
-
-  MojoResult rv = AllocMessage(capacity, nullptr, 0,
-                               MOJO_ALLOC_MESSAGE_FLAG_NONE, &message_);
-  CHECK_EQ(rv, MOJO_RESULT_OK);
-
-  void* buffer = nullptr;
-  if (capacity != 0) {
-    rv = GetMessageBuffer(message_.get(), &buffer);
-    CHECK_EQ(rv, MOJO_RESULT_OK);
-
-    if (zero_initialized)
-      memset(buffer, 0, capacity);
-  }
-  Initialize(buffer, capacity);
-}
-
-MessageBuffer::MessageBuffer(ScopedMessageHandle message, uint32_t num_bytes) {
-  message_ = std::move(message);
-
-  void* buffer = nullptr;
-  if (num_bytes != 0) {
-    MojoResult rv = GetMessageBuffer(message_.get(), &buffer);
-    CHECK_EQ(rv, MOJO_RESULT_OK);
-  }
-  Initialize(buffer, num_bytes);
-}
-
-MessageBuffer::~MessageBuffer() {}
-
-void MessageBuffer::NotifyBadMessage(const std::string& error) {
-  DCHECK(message_.is_valid());
-  MojoResult result = mojo::NotifyBadMessage(message_.get(), error);
-  DCHECK_EQ(result, MOJO_RESULT_OK);
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/message_buffer.h b/mojo/public/cpp/bindings/lib/message_buffer.h
deleted file mode 100644
index 96d5140..0000000
--- a/mojo/public/cpp/bindings/lib/message_buffer.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_LIB_MESSAGE_BUFFER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_LIB_MESSAGE_BUFFER_H_
-
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-#include "mojo/public/cpp/system/message.h"
-
-namespace mojo {
-namespace internal {
-
-// A fixed-size Buffer using a Mojo message object for storage.
-class MessageBuffer : public Buffer {
- public:
-  // Initializes this buffer to carry a fixed byte capacity and no handles.
-  MessageBuffer(size_t capacity, bool zero_initialized);
-
-  // Initializes this buffer from an existing Mojo MessageHandle.
-  MessageBuffer(ScopedMessageHandle message, uint32_t num_bytes);
-
-  ~MessageBuffer();
-
-  ScopedMessageHandle TakeMessage() { return std::move(message_); }
-
-  void NotifyBadMessage(const std::string& error);
-
- private:
-  ScopedMessageHandle message_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageBuffer);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_LIB_MESSAGE_BUFFER_H_
diff --git a/mojo/public/cpp/bindings/lib/message_builder.cc b/mojo/public/cpp/bindings/lib/message_builder.cc
deleted file mode 100644
index 6806a73..0000000
--- a/mojo/public/cpp/bindings/lib/message_builder.cc
+++ /dev/null
@@ -1,69 +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.
-
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-#include "mojo/public/cpp/bindings/lib/message_internal.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename Header>
-void Allocate(Buffer* buf, Header** header) {
-  *header = static_cast<Header*>(buf->Allocate(sizeof(Header)));
-  (*header)->num_bytes = sizeof(Header);
-}
-
-MessageBuilder::MessageBuilder(uint32_t name,
-                               uint32_t flags,
-                               size_t payload_size,
-                               size_t payload_interface_id_count) {
-  if (payload_interface_id_count > 0) {
-    // Version 2
-    InitializeMessage(
-        sizeof(MessageHeaderV2) + Align(payload_size) +
-        ArrayDataTraits<uint32_t>::GetStorageSize(
-            static_cast<uint32_t>(payload_interface_id_count)));
-
-    MessageHeaderV2* header;
-    Allocate(message_.buffer(), &header);
-    header->version = 2;
-    header->name = name;
-    header->flags = flags;
-    // The payload immediately follows the header.
-    header->payload.Set(header + 1);
-  } else if (flags &
-             (Message::kFlagExpectsResponse | Message::kFlagIsResponse)) {
-    // Version 1
-    InitializeMessage(sizeof(MessageHeaderV1) + payload_size);
-
-    MessageHeaderV1* header;
-    Allocate(message_.buffer(), &header);
-    header->version = 1;
-    header->name = name;
-    header->flags = flags;
-  } else {
-    InitializeMessage(sizeof(MessageHeader) + payload_size);
-
-    MessageHeader* header;
-    Allocate(message_.buffer(), &header);
-    header->version = 0;
-    header->name = name;
-    header->flags = flags;
-  }
-}
-
-MessageBuilder::~MessageBuilder() {
-}
-
-void MessageBuilder::InitializeMessage(size_t size) {
-  message_.Initialize(static_cast<uint32_t>(Align(size)),
-                      true /* zero_initialized */);
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/message_builder.h b/mojo/public/cpp/bindings/lib/message_builder.h
deleted file mode 100644
index 8a4d5c4..0000000
--- a/mojo/public/cpp/bindings/lib/message_builder.h
+++ /dev/null
@@ -1,45 +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.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_BUILDER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_BUILDER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-
-class Message;
-
-namespace internal {
-
-class Buffer;
-
-class MOJO_CPP_BINDINGS_EXPORT MessageBuilder {
- public:
-  MessageBuilder(uint32_t name,
-                 uint32_t flags,
-                 size_t payload_size,
-                 size_t payload_interface_id_count);
-  ~MessageBuilder();
-
-  Buffer* buffer() { return message_.buffer(); }
-  Message* message() { return &message_; }
-
- private:
-  void InitializeMessage(size_t size);
-
-  Message message_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageBuilder);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_BUILDER_H_
diff --git a/mojo/public/cpp/bindings/lib/message_header_validator.cc b/mojo/public/cpp/bindings/lib/message_header_validator.cc
deleted file mode 100644
index 9f8c627..0000000
--- a/mojo/public/cpp/bindings/lib/message_header_validator.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/message_header_validator.h"
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/validate_params.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-
-namespace mojo {
-namespace {
-
-// TODO(yzshen): Define a mojom struct for message header and use the generated
-// validation and data view code.
-bool IsValidMessageHeader(const internal::MessageHeader* header,
-                          internal::ValidationContext* validation_context) {
-  // NOTE: Our goal is to preserve support for future extension of the message
-  // header. If we encounter fields we do not understand, we must ignore them.
-
-  // Extra validation of the struct header:
-  do {
-    if (header->version == 0) {
-      if (header->num_bytes == sizeof(internal::MessageHeader))
-        break;
-    } else if (header->version == 1) {
-      if (header->num_bytes == sizeof(internal::MessageHeaderV1))
-        break;
-    } else if (header->version == 2) {
-      if (header->num_bytes == sizeof(internal::MessageHeaderV2))
-        break;
-    } else if (header->version > 2) {
-      if (header->num_bytes >= sizeof(internal::MessageHeaderV2))
-        break;
-    }
-    internal::ReportValidationError(
-        validation_context,
-        internal::VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
-    return false;
-  } while (false);
-
-  // Validate flags (allow unknown bits):
-
-  // These flags require a RequestID.
-  constexpr uint32_t kRequestIdFlags =
-      Message::kFlagExpectsResponse | Message::kFlagIsResponse;
-  if (header->version == 0 && (header->flags & kRequestIdFlags)) {
-    internal::ReportValidationError(
-        validation_context,
-        internal::VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID);
-    return false;
-  }
-
-  // These flags are mutually exclusive.
-  if ((header->flags & kRequestIdFlags) == kRequestIdFlags) {
-    internal::ReportValidationError(
-        validation_context,
-        internal::VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS);
-    return false;
-  }
-
-  if (header->version < 2)
-    return true;
-
-  auto* header_v2 = static_cast<const internal::MessageHeaderV2*>(header);
-  // For the payload pointer:
-  // - Check that the pointer can be safely decoded.
-  // - Claim one byte that the pointer points to. It makes sure not only the
-  //   address is within the message, but also the address precedes the array
-  //   storing interface IDs (which is important for safely calculating the
-  //   payload size).
-  // - Validation of the payload contents will be done separately based on the
-  //   payload type.
-  if (!header_v2->payload.is_null() &&
-      (!internal::ValidatePointer(header_v2->payload, validation_context) ||
-       !validation_context->ClaimMemory(header_v2->payload.Get(), 1))) {
-    return false;
-  }
-
-  const internal::ContainerValidateParams validate_params(0, false, nullptr);
-  if (!internal::ValidateContainer(header_v2->payload_interface_ids,
-                                   validation_context, &validate_params)) {
-    return false;
-  }
-
-  if (!header_v2->payload_interface_ids.is_null()) {
-    size_t num_ids = header_v2->payload_interface_ids.Get()->size();
-    const uint32_t* ids = header_v2->payload_interface_ids.Get()->storage();
-    for (size_t i = 0; i < num_ids; ++i) {
-      if (!IsValidInterfaceId(ids[i]) || IsMasterInterfaceId(ids[i])) {
-        internal::ReportValidationError(
-            validation_context,
-            internal::VALIDATION_ERROR_ILLEGAL_INTERFACE_ID);
-        return false;
-      }
-    }
-  }
-
-  return true;
-}
-
-}  // namespace
-
-MessageHeaderValidator::MessageHeaderValidator()
-    : MessageHeaderValidator("MessageHeaderValidator") {}
-
-MessageHeaderValidator::MessageHeaderValidator(const std::string& description)
-    : description_(description) {
-}
-
-void MessageHeaderValidator::SetDescription(const std::string& description) {
-  description_ = description;
-}
-
-bool MessageHeaderValidator::Accept(Message* message) {
-  // Pass 0 as number of handles and associated endpoint handles because we
-  // don't expect any in the header, even if |message| contains handles.
-  internal::ValidationContext validation_context(
-      message->data(), message->data_num_bytes(), 0, 0, message, description_);
-
-  if (!internal::ValidateStructHeaderAndClaimMemory(message->data(),
-                                                    &validation_context))
-    return false;
-
-  if (!IsValidMessageHeader(message->header(), &validation_context))
-    return false;
-
-  return true;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/message_internal.h b/mojo/public/cpp/bindings/lib/message_internal.h
deleted file mode 100644
index 6693198..0000000
--- a/mojo/public/cpp/bindings/lib/message_internal.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_INTERNAL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_INTERNAL_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-
-namespace mojo {
-
-class Message;
-
-namespace internal {
-
-template <typename T>
-class Array_Data;
-
-#pragma pack(push, 1)
-
-struct MessageHeader : internal::StructHeader {
-  // Interface ID for identifying multiple interfaces running on the same
-  // message pipe.
-  uint32_t interface_id;
-  // Message name, which is scoped to the interface that the message belongs to.
-  uint32_t name;
-  // 0 or either of the enum values defined above.
-  uint32_t flags;
-  // Unused padding to make the struct size a multiple of 8 bytes.
-  uint32_t padding;
-};
-static_assert(sizeof(MessageHeader) == 24, "Bad sizeof(MessageHeader)");
-
-struct MessageHeaderV1 : MessageHeader {
-  // Only used if either kFlagExpectsResponse or kFlagIsResponse is set in
-  // order to match responses with corresponding requests.
-  uint64_t request_id;
-};
-static_assert(sizeof(MessageHeaderV1) == 32, "Bad sizeof(MessageHeaderV1)");
-
-struct MessageHeaderV2 : MessageHeaderV1 {
-  MessageHeaderV2();
-  GenericPointer payload;
-  Pointer<Array_Data<uint32_t>> payload_interface_ids;
-};
-static_assert(sizeof(MessageHeaderV2) == 48, "Bad sizeof(MessageHeaderV2)");
-
-#pragma pack(pop)
-
-class MOJO_CPP_BINDINGS_EXPORT MessageDispatchContext {
- public:
-  explicit MessageDispatchContext(Message* message);
-  ~MessageDispatchContext();
-
-  static MessageDispatchContext* current();
-
-  const base::Callback<void(const std::string&)>& GetBadMessageCallback();
-
- private:
-  MessageDispatchContext* outer_context_;
-  Message* message_;
-  base::Callback<void(const std::string&)> bad_message_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageDispatchContext);
-};
-
-class MOJO_CPP_BINDINGS_EXPORT SyncMessageResponseSetup {
- public:
-  static void SetCurrentSyncResponseMessage(Message* message);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_INTERNAL_H_
diff --git a/mojo/public/cpp/bindings/lib/multiplex_router.cc b/mojo/public/cpp/bindings/lib/multiplex_router.cc
deleted file mode 100644
index ff7c678..0000000
--- a/mojo/public/cpp/bindings/lib/multiplex_router.cc
+++ /dev/null
@@ -1,960 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/lib/multiplex_router.h"
-
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/single_thread_task_runner.h"
-#include "base/stl_util.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_controller.h"
-#include "mojo/public/cpp/bindings/lib/may_auto_lock.h"
-#include "mojo/public/cpp/bindings/sync_event_watcher.h"
-
-namespace mojo {
-namespace internal {
-
-// InterfaceEndpoint stores the information of an interface endpoint registered
-// with the router.
-// No one other than the router's |endpoints_| and |tasks_| should hold refs to
-// this object.
-class MultiplexRouter::InterfaceEndpoint
-    : public base::RefCountedThreadSafe<InterfaceEndpoint>,
-      public InterfaceEndpointController {
- public:
-  InterfaceEndpoint(MultiplexRouter* router, InterfaceId id)
-      : router_(router),
-        id_(id),
-        closed_(false),
-        peer_closed_(false),
-        handle_created_(false),
-        client_(nullptr) {}
-
-  // ---------------------------------------------------------------------------
-  // The following public methods are safe to call from any threads without
-  // locking.
-
-  InterfaceId id() const { return id_; }
-
-  // ---------------------------------------------------------------------------
-  // The following public methods are called under the router's lock.
-
-  bool closed() const { return closed_; }
-  void set_closed() {
-    router_->AssertLockAcquired();
-    closed_ = true;
-  }
-
-  bool peer_closed() const { return peer_closed_; }
-  void set_peer_closed() {
-    router_->AssertLockAcquired();
-    peer_closed_ = true;
-  }
-
-  bool handle_created() const { return handle_created_; }
-  void set_handle_created() {
-    router_->AssertLockAcquired();
-    handle_created_ = true;
-  }
-
-  const base::Optional<DisconnectReason>& disconnect_reason() const {
-    return disconnect_reason_;
-  }
-  void set_disconnect_reason(
-      const base::Optional<DisconnectReason>& disconnect_reason) {
-    router_->AssertLockAcquired();
-    disconnect_reason_ = disconnect_reason;
-  }
-
-  base::SingleThreadTaskRunner* task_runner() const {
-    return task_runner_.get();
-  }
-
-  InterfaceEndpointClient* client() const { return client_; }
-
-  void AttachClient(InterfaceEndpointClient* client,
-                    scoped_refptr<base::SingleThreadTaskRunner> runner) {
-    router_->AssertLockAcquired();
-    DCHECK(!client_);
-    DCHECK(!closed_);
-    DCHECK(runner->BelongsToCurrentThread());
-
-    task_runner_ = std::move(runner);
-    client_ = client;
-  }
-
-  // This method must be called on the same thread as the corresponding
-  // AttachClient() call.
-  void DetachClient() {
-    router_->AssertLockAcquired();
-    DCHECK(client_);
-    DCHECK(task_runner_->BelongsToCurrentThread());
-    DCHECK(!closed_);
-
-    task_runner_ = nullptr;
-    client_ = nullptr;
-    sync_watcher_.reset();
-  }
-
-  void SignalSyncMessageEvent() {
-    router_->AssertLockAcquired();
-    if (sync_message_event_signaled_)
-      return;
-    sync_message_event_signaled_ = true;
-    if (sync_message_event_)
-      sync_message_event_->Signal();
-  }
-
-  void ResetSyncMessageSignal() {
-    router_->AssertLockAcquired();
-    if (!sync_message_event_signaled_)
-      return;
-    sync_message_event_signaled_ = false;
-    if (sync_message_event_)
-      sync_message_event_->Reset();
-  }
-
-  // ---------------------------------------------------------------------------
-  // The following public methods (i.e., InterfaceEndpointController
-  // implementation) are called by the client on the same thread as the
-  // AttachClient() call. They are called outside of the router's lock.
-
-  bool SendMessage(Message* message) override {
-    DCHECK(task_runner_->BelongsToCurrentThread());
-    message->set_interface_id(id_);
-    return router_->connector_.Accept(message);
-  }
-
-  void AllowWokenUpBySyncWatchOnSameThread() override {
-    DCHECK(task_runner_->BelongsToCurrentThread());
-
-    EnsureSyncWatcherExists();
-    sync_watcher_->AllowWokenUpBySyncWatchOnSameThread();
-  }
-
-  bool SyncWatch(const bool* should_stop) override {
-    DCHECK(task_runner_->BelongsToCurrentThread());
-
-    EnsureSyncWatcherExists();
-    return sync_watcher_->SyncWatch(should_stop);
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<InterfaceEndpoint>;
-
-  ~InterfaceEndpoint() override {
-    router_->AssertLockAcquired();
-
-    DCHECK(!client_);
-    DCHECK(closed_);
-    DCHECK(peer_closed_);
-    DCHECK(!sync_watcher_);
-  }
-
-  void OnSyncEventSignaled() {
-    DCHECK(task_runner_->BelongsToCurrentThread());
-    scoped_refptr<MultiplexRouter> router_protector(router_);
-
-    MayAutoLock locker(&router_->lock_);
-    scoped_refptr<InterfaceEndpoint> self_protector(this);
-
-    bool more_to_process = router_->ProcessFirstSyncMessageForEndpoint(id_);
-
-    if (!more_to_process)
-      ResetSyncMessageSignal();
-
-    // Currently there are no queued sync messages and the peer has closed so
-    // there won't be incoming sync messages in the future.
-    if (!more_to_process && peer_closed_) {
-      // If a SyncWatch() call (or multiple ones) of this interface endpoint is
-      // on the call stack, resetting the sync watcher will allow it to exit
-      // when the call stack unwinds to that frame.
-      sync_watcher_.reset();
-    }
-  }
-
-  void EnsureSyncWatcherExists() {
-    DCHECK(task_runner_->BelongsToCurrentThread());
-    if (sync_watcher_)
-      return;
-
-    {
-      MayAutoLock locker(&router_->lock_);
-      if (!sync_message_event_) {
-        sync_message_event_.emplace(
-            base::WaitableEvent::ResetPolicy::MANUAL,
-            base::WaitableEvent::InitialState::NOT_SIGNALED);
-        if (sync_message_event_signaled_)
-          sync_message_event_->Signal();
-      }
-    }
-    sync_watcher_.reset(
-        new SyncEventWatcher(&sync_message_event_.value(),
-                             base::Bind(&InterfaceEndpoint::OnSyncEventSignaled,
-                                        base::Unretained(this))));
-  }
-
-  // ---------------------------------------------------------------------------
-  // The following members are safe to access from any threads.
-
-  MultiplexRouter* const router_;
-  const InterfaceId id_;
-
-  // ---------------------------------------------------------------------------
-  // The following members are accessed under the router's lock.
-
-  // Whether the endpoint has been closed.
-  bool closed_;
-  // Whether the peer endpoint has been closed.
-  bool peer_closed_;
-
-  // Whether there is already a ScopedInterfaceEndpointHandle created for this
-  // endpoint.
-  bool handle_created_;
-
-  base::Optional<DisconnectReason> disconnect_reason_;
-
-  // The task runner on which |client_|'s methods can be called.
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  // Not owned. It is null if no client is attached to this endpoint.
-  InterfaceEndpointClient* client_;
-
-  // An event used to signal that sync messages are available. The event is
-  // initialized under the router's lock and remains unchanged afterwards. It
-  // may be accessed outside of the router's lock later.
-  base::Optional<base::WaitableEvent> sync_message_event_;
-  bool sync_message_event_signaled_ = false;
-
-  // ---------------------------------------------------------------------------
-  // The following members are only valid while a client is attached. They are
-  // used exclusively on the client's thread. They may be accessed outside of
-  // the router's lock.
-
-  std::unique_ptr<SyncEventWatcher> sync_watcher_;
-
-  DISALLOW_COPY_AND_ASSIGN(InterfaceEndpoint);
-};
-
-// MessageWrapper objects are always destroyed under the router's lock. On
-// destruction, if the message it wrappers contains
-// ScopedInterfaceEndpointHandles (which cannot be destructed under the
-// router's lock), the wrapper unlocks to clean them up.
-class MultiplexRouter::MessageWrapper {
- public:
-  MessageWrapper() = default;
-
-  MessageWrapper(MultiplexRouter* router, Message message)
-      : router_(router), value_(std::move(message)) {}
-
-  MessageWrapper(MessageWrapper&& other)
-      : router_(other.router_), value_(std::move(other.value_)) {}
-
-  ~MessageWrapper() {
-    if (value_.associated_endpoint_handles()->empty())
-      return;
-
-    router_->AssertLockAcquired();
-    {
-      MayAutoUnlock unlocker(&router_->lock_);
-      value_.mutable_associated_endpoint_handles()->clear();
-    }
-  }
-
-  MessageWrapper& operator=(MessageWrapper&& other) {
-    router_ = other.router_;
-    value_ = std::move(other.value_);
-    return *this;
-  }
-
-  Message& value() { return value_; }
-
- private:
-  MultiplexRouter* router_ = nullptr;
-  Message value_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageWrapper);
-};
-
-struct MultiplexRouter::Task {
- public:
-  // Doesn't take ownership of |message| but takes its contents.
-  static std::unique_ptr<Task> CreateMessageTask(
-      MessageWrapper message_wrapper) {
-    Task* task = new Task(MESSAGE);
-    task->message_wrapper = std::move(message_wrapper);
-    return base::WrapUnique(task);
-  }
-  static std::unique_ptr<Task> CreateNotifyErrorTask(
-      InterfaceEndpoint* endpoint) {
-    Task* task = new Task(NOTIFY_ERROR);
-    task->endpoint_to_notify = endpoint;
-    return base::WrapUnique(task);
-  }
-
-  ~Task() {}
-
-  bool IsMessageTask() const { return type == MESSAGE; }
-  bool IsNotifyErrorTask() const { return type == NOTIFY_ERROR; }
-
-  MessageWrapper message_wrapper;
-  scoped_refptr<InterfaceEndpoint> endpoint_to_notify;
-
-  enum Type { MESSAGE, NOTIFY_ERROR };
-  Type type;
-
- private:
-  explicit Task(Type in_type) : type(in_type) {}
-
-  DISALLOW_COPY_AND_ASSIGN(Task);
-};
-
-MultiplexRouter::MultiplexRouter(
-    ScopedMessagePipeHandle message_pipe,
-    Config config,
-    bool set_interface_id_namesapce_bit,
-    scoped_refptr<base::SingleThreadTaskRunner> runner)
-    : set_interface_id_namespace_bit_(set_interface_id_namesapce_bit),
-      task_runner_(runner),
-      header_validator_(nullptr),
-      filters_(this),
-      connector_(std::move(message_pipe),
-                 config == MULTI_INTERFACE ? Connector::MULTI_THREADED_SEND
-                                           : Connector::SINGLE_THREADED_SEND,
-                 std::move(runner)),
-      control_message_handler_(this),
-      control_message_proxy_(&connector_),
-      next_interface_id_value_(1),
-      posted_to_process_tasks_(false),
-      encountered_error_(false),
-      paused_(false),
-      testing_mode_(false) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  if (config == MULTI_INTERFACE)
-    lock_.emplace();
-
-  if (config == SINGLE_INTERFACE_WITH_SYNC_METHODS ||
-      config == MULTI_INTERFACE) {
-    // Always participate in sync handle watching in multi-interface mode,
-    // because even if it doesn't expect sync requests during sync handle
-    // watching, it may still need to dispatch messages to associated endpoints
-    // on a different thread.
-    connector_.AllowWokenUpBySyncWatchOnSameThread();
-  }
-  connector_.set_incoming_receiver(&filters_);
-  connector_.set_connection_error_handler(
-      base::Bind(&MultiplexRouter::OnPipeConnectionError,
-                 base::Unretained(this)));
-
-  std::unique_ptr<MessageHeaderValidator> header_validator =
-      base::MakeUnique<MessageHeaderValidator>();
-  header_validator_ = header_validator.get();
-  filters_.Append(std::move(header_validator));
-}
-
-MultiplexRouter::~MultiplexRouter() {
-  MayAutoLock locker(&lock_);
-
-  sync_message_tasks_.clear();
-  tasks_.clear();
-
-  for (auto iter = endpoints_.begin(); iter != endpoints_.end();) {
-    InterfaceEndpoint* endpoint = iter->second.get();
-    // Increment the iterator before calling UpdateEndpointStateMayRemove()
-    // because it may remove the corresponding value from the map.
-    ++iter;
-
-    if (!endpoint->closed()) {
-      // This happens when a NotifyPeerEndpointClosed message been received, but
-      // the interface ID hasn't been used to create local endpoint handle.
-      DCHECK(!endpoint->client());
-      DCHECK(endpoint->peer_closed());
-      UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED);
-    } else {
-      UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
-    }
-  }
-
-  DCHECK(endpoints_.empty());
-}
-
-void MultiplexRouter::SetMasterInterfaceName(const char* name) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  header_validator_->SetDescription(
-      std::string(name) + " [master] MessageHeaderValidator");
-  control_message_handler_.SetDescription(
-      std::string(name) + " [master] PipeControlMessageHandler");
-  connector_.SetWatcherHeapProfilerTag(name);
-}
-
-InterfaceId MultiplexRouter::AssociateInterface(
-    ScopedInterfaceEndpointHandle handle_to_send) {
-  if (!handle_to_send.pending_association())
-    return kInvalidInterfaceId;
-
-  uint32_t id = 0;
-  {
-    MayAutoLock locker(&lock_);
-    do {
-      if (next_interface_id_value_ >= kInterfaceIdNamespaceMask)
-        next_interface_id_value_ = 1;
-      id = next_interface_id_value_++;
-      if (set_interface_id_namespace_bit_)
-        id |= kInterfaceIdNamespaceMask;
-    } while (base::ContainsKey(endpoints_, id));
-
-    InterfaceEndpoint* endpoint = new InterfaceEndpoint(this, id);
-    endpoints_[id] = endpoint;
-    if (encountered_error_)
-      UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
-    endpoint->set_handle_created();
-  }
-
-  if (!NotifyAssociation(&handle_to_send, id)) {
-    // The peer handle of |handle_to_send|, which is supposed to join this
-    // associated group, has been closed.
-    {
-      MayAutoLock locker(&lock_);
-      InterfaceEndpoint* endpoint = FindEndpoint(id);
-      if (endpoint)
-        UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED);
-    }
-
-    control_message_proxy_.NotifyPeerEndpointClosed(
-        id, handle_to_send.disconnect_reason());
-  }
-  return id;
-}
-
-ScopedInterfaceEndpointHandle MultiplexRouter::CreateLocalEndpointHandle(
-    InterfaceId id) {
-  if (!IsValidInterfaceId(id))
-    return ScopedInterfaceEndpointHandle();
-
-  MayAutoLock locker(&lock_);
-  bool inserted = false;
-  InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, &inserted);
-  if (inserted) {
-    DCHECK(!endpoint->handle_created());
-
-    if (encountered_error_)
-      UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
-  } else {
-    // If the endpoint already exist, it is because we have received a
-    // notification that the peer endpoint has closed.
-    CHECK(!endpoint->closed());
-    CHECK(endpoint->peer_closed());
-
-    if (endpoint->handle_created())
-      return ScopedInterfaceEndpointHandle();
-  }
-
-  endpoint->set_handle_created();
-  return CreateScopedInterfaceEndpointHandle(id);
-}
-
-void MultiplexRouter::CloseEndpointHandle(
-    InterfaceId id,
-    const base::Optional<DisconnectReason>& reason) {
-  if (!IsValidInterfaceId(id))
-    return;
-
-  MayAutoLock locker(&lock_);
-  DCHECK(base::ContainsKey(endpoints_, id));
-  InterfaceEndpoint* endpoint = endpoints_[id].get();
-  DCHECK(!endpoint->client());
-  DCHECK(!endpoint->closed());
-  UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED);
-
-  if (!IsMasterInterfaceId(id) || reason) {
-    MayAutoUnlock unlocker(&lock_);
-    control_message_proxy_.NotifyPeerEndpointClosed(id, reason);
-  }
-
-  ProcessTasks(NO_DIRECT_CLIENT_CALLS, nullptr);
-}
-
-InterfaceEndpointController* MultiplexRouter::AttachEndpointClient(
-    const ScopedInterfaceEndpointHandle& handle,
-    InterfaceEndpointClient* client,
-    scoped_refptr<base::SingleThreadTaskRunner> runner) {
-  const InterfaceId id = handle.id();
-
-  DCHECK(IsValidInterfaceId(id));
-  DCHECK(client);
-
-  MayAutoLock locker(&lock_);
-  DCHECK(base::ContainsKey(endpoints_, id));
-
-  InterfaceEndpoint* endpoint = endpoints_[id].get();
-  endpoint->AttachClient(client, std::move(runner));
-
-  if (endpoint->peer_closed())
-    tasks_.push_back(Task::CreateNotifyErrorTask(endpoint));
-  ProcessTasks(NO_DIRECT_CLIENT_CALLS, nullptr);
-
-  return endpoint;
-}
-
-void MultiplexRouter::DetachEndpointClient(
-    const ScopedInterfaceEndpointHandle& handle) {
-  const InterfaceId id = handle.id();
-
-  DCHECK(IsValidInterfaceId(id));
-
-  MayAutoLock locker(&lock_);
-  DCHECK(base::ContainsKey(endpoints_, id));
-
-  InterfaceEndpoint* endpoint = endpoints_[id].get();
-  endpoint->DetachClient();
-}
-
-void MultiplexRouter::RaiseError() {
-  if (task_runner_->BelongsToCurrentThread()) {
-    connector_.RaiseError();
-  } else {
-    task_runner_->PostTask(FROM_HERE,
-                           base::Bind(&MultiplexRouter::RaiseError, this));
-  }
-}
-
-void MultiplexRouter::CloseMessagePipe() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  connector_.CloseMessagePipe();
-  // CloseMessagePipe() above won't trigger connection error handler.
-  // Explicitly call OnPipeConnectionError() so that associated endpoints will
-  // get notified.
-  OnPipeConnectionError();
-}
-
-void MultiplexRouter::PauseIncomingMethodCallProcessing() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  connector_.PauseIncomingMethodCallProcessing();
-
-  MayAutoLock locker(&lock_);
-  paused_ = true;
-
-  for (auto iter = endpoints_.begin(); iter != endpoints_.end(); ++iter)
-    iter->second->ResetSyncMessageSignal();
-}
-
-void MultiplexRouter::ResumeIncomingMethodCallProcessing() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  connector_.ResumeIncomingMethodCallProcessing();
-
-  MayAutoLock locker(&lock_);
-  paused_ = false;
-
-  for (auto iter = endpoints_.begin(); iter != endpoints_.end(); ++iter) {
-    auto sync_iter = sync_message_tasks_.find(iter->first);
-    if (iter->second->peer_closed() ||
-        (sync_iter != sync_message_tasks_.end() &&
-         !sync_iter->second.empty())) {
-      iter->second->SignalSyncMessageEvent();
-    }
-  }
-
-  ProcessTasks(NO_DIRECT_CLIENT_CALLS, nullptr);
-}
-
-bool MultiplexRouter::HasAssociatedEndpoints() const {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  MayAutoLock locker(&lock_);
-
-  if (endpoints_.size() > 1)
-    return true;
-  if (endpoints_.size() == 0)
-    return false;
-
-  return !base::ContainsKey(endpoints_, kMasterInterfaceId);
-}
-
-void MultiplexRouter::EnableTestingMode() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  MayAutoLock locker(&lock_);
-
-  testing_mode_ = true;
-  connector_.set_enforce_errors_from_incoming_receiver(false);
-}
-
-bool MultiplexRouter::Accept(Message* message) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (!message->DeserializeAssociatedEndpointHandles(this))
-    return false;
-
-  scoped_refptr<MultiplexRouter> protector(this);
-  MayAutoLock locker(&lock_);
-
-  DCHECK(!paused_);
-
-  ClientCallBehavior client_call_behavior =
-      connector_.during_sync_handle_watcher_callback()
-          ? ALLOW_DIRECT_CLIENT_CALLS_FOR_SYNC_MESSAGES
-          : ALLOW_DIRECT_CLIENT_CALLS;
-
-  bool processed =
-      tasks_.empty() && ProcessIncomingMessage(message, client_call_behavior,
-                                               connector_.task_runner());
-
-  if (!processed) {
-    // Either the task queue is not empty or we cannot process the message
-    // directly. In both cases, there is no need to call ProcessTasks().
-    tasks_.push_back(
-        Task::CreateMessageTask(MessageWrapper(this, std::move(*message))));
-    Task* task = tasks_.back().get();
-
-    if (task->message_wrapper.value().has_flag(Message::kFlagIsSync)) {
-      InterfaceId id = task->message_wrapper.value().interface_id();
-      sync_message_tasks_[id].push_back(task);
-      InterfaceEndpoint* endpoint = FindEndpoint(id);
-      if (endpoint)
-        endpoint->SignalSyncMessageEvent();
-    }
-  } else if (!tasks_.empty()) {
-    // Processing the message may result in new tasks (for error notification)
-    // being added to the queue. In this case, we have to attempt to process the
-    // tasks.
-    ProcessTasks(client_call_behavior, connector_.task_runner());
-  }
-
-  // Always return true. If we see errors during message processing, we will
-  // explicitly call Connector::RaiseError() to disconnect the message pipe.
-  return true;
-}
-
-bool MultiplexRouter::OnPeerAssociatedEndpointClosed(
-    InterfaceId id,
-    const base::Optional<DisconnectReason>& reason) {
-  DCHECK(!IsMasterInterfaceId(id) || reason);
-
-  MayAutoLock locker(&lock_);
-  InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, nullptr);
-
-  if (reason)
-    endpoint->set_disconnect_reason(reason);
-
-  // It is possible that this endpoint has been set as peer closed. That is
-  // because when the message pipe is closed, all the endpoints are updated with
-  // PEER_ENDPOINT_CLOSED. We continue to process remaining tasks in the queue,
-  // as long as there are refs keeping the router alive. If there is a
-  // PeerAssociatedEndpointClosedEvent control message in the queue, we will get
-  // here and see that the endpoint has been marked as peer closed.
-  if (!endpoint->peer_closed()) {
-    if (endpoint->client())
-      tasks_.push_back(Task::CreateNotifyErrorTask(endpoint));
-    UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
-  }
-
-  // No need to trigger a ProcessTasks() because it is already on the stack.
-
-  return true;
-}
-
-void MultiplexRouter::OnPipeConnectionError() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  scoped_refptr<MultiplexRouter> protector(this);
-  MayAutoLock locker(&lock_);
-
-  encountered_error_ = true;
-
-  for (auto iter = endpoints_.begin(); iter != endpoints_.end();) {
-    InterfaceEndpoint* endpoint = iter->second.get();
-    // Increment the iterator before calling UpdateEndpointStateMayRemove()
-    // because it may remove the corresponding value from the map.
-    ++iter;
-
-    if (endpoint->client())
-      tasks_.push_back(Task::CreateNotifyErrorTask(endpoint));
-
-    UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
-  }
-
-  ProcessTasks(connector_.during_sync_handle_watcher_callback()
-                   ? ALLOW_DIRECT_CLIENT_CALLS_FOR_SYNC_MESSAGES
-                   : ALLOW_DIRECT_CLIENT_CALLS,
-               connector_.task_runner());
-}
-
-void MultiplexRouter::ProcessTasks(
-    ClientCallBehavior client_call_behavior,
-    base::SingleThreadTaskRunner* current_task_runner) {
-  AssertLockAcquired();
-
-  if (posted_to_process_tasks_)
-    return;
-
-  while (!tasks_.empty() && !paused_) {
-    std::unique_ptr<Task> task(std::move(tasks_.front()));
-    tasks_.pop_front();
-
-    InterfaceId id = kInvalidInterfaceId;
-    bool sync_message =
-        task->IsMessageTask() && !task->message_wrapper.value().IsNull() &&
-        task->message_wrapper.value().has_flag(Message::kFlagIsSync);
-    if (sync_message) {
-      id = task->message_wrapper.value().interface_id();
-      auto& sync_message_queue = sync_message_tasks_[id];
-      DCHECK_EQ(task.get(), sync_message_queue.front());
-      sync_message_queue.pop_front();
-    }
-
-    bool processed =
-        task->IsNotifyErrorTask()
-            ? ProcessNotifyErrorTask(task.get(), client_call_behavior,
-                                     current_task_runner)
-            : ProcessIncomingMessage(&task->message_wrapper.value(),
-                                     client_call_behavior, current_task_runner);
-
-    if (!processed) {
-      if (sync_message) {
-        auto& sync_message_queue = sync_message_tasks_[id];
-        sync_message_queue.push_front(task.get());
-      }
-      tasks_.push_front(std::move(task));
-      break;
-    } else {
-      if (sync_message) {
-        auto iter = sync_message_tasks_.find(id);
-        if (iter != sync_message_tasks_.end() && iter->second.empty())
-          sync_message_tasks_.erase(iter);
-      }
-    }
-  }
-}
-
-bool MultiplexRouter::ProcessFirstSyncMessageForEndpoint(InterfaceId id) {
-  AssertLockAcquired();
-
-  auto iter = sync_message_tasks_.find(id);
-  if (iter == sync_message_tasks_.end())
-    return false;
-
-  if (paused_)
-    return true;
-
-  MultiplexRouter::Task* task = iter->second.front();
-  iter->second.pop_front();
-
-  DCHECK(task->IsMessageTask());
-  MessageWrapper message_wrapper = std::move(task->message_wrapper);
-
-  // Note: after this call, |task| and |iter| may be invalidated.
-  bool processed = ProcessIncomingMessage(
-      &message_wrapper.value(), ALLOW_DIRECT_CLIENT_CALLS_FOR_SYNC_MESSAGES,
-      nullptr);
-  DCHECK(processed);
-
-  iter = sync_message_tasks_.find(id);
-  if (iter == sync_message_tasks_.end())
-    return false;
-
-  if (iter->second.empty()) {
-    sync_message_tasks_.erase(iter);
-    return false;
-  }
-
-  return true;
-}
-
-bool MultiplexRouter::ProcessNotifyErrorTask(
-    Task* task,
-    ClientCallBehavior client_call_behavior,
-    base::SingleThreadTaskRunner* current_task_runner) {
-  DCHECK(!current_task_runner || current_task_runner->BelongsToCurrentThread());
-  DCHECK(!paused_);
-
-  AssertLockAcquired();
-  InterfaceEndpoint* endpoint = task->endpoint_to_notify.get();
-  if (!endpoint->client())
-    return true;
-
-  if (client_call_behavior != ALLOW_DIRECT_CLIENT_CALLS ||
-      endpoint->task_runner() != current_task_runner) {
-    MaybePostToProcessTasks(endpoint->task_runner());
-    return false;
-  }
-
-  DCHECK(endpoint->task_runner()->BelongsToCurrentThread());
-
-  InterfaceEndpointClient* client = endpoint->client();
-  base::Optional<DisconnectReason> disconnect_reason(
-      endpoint->disconnect_reason());
-
-  {
-    // We must unlock before calling into |client| because it may call this
-    // object within NotifyError(). Holding the lock will lead to deadlock.
-    //
-    // It is safe to call into |client| without the lock. Because |client| is
-    // always accessed on the same thread, including DetachEndpointClient().
-    MayAutoUnlock unlocker(&lock_);
-    client->NotifyError(disconnect_reason);
-  }
-  return true;
-}
-
-bool MultiplexRouter::ProcessIncomingMessage(
-    Message* message,
-    ClientCallBehavior client_call_behavior,
-    base::SingleThreadTaskRunner* current_task_runner) {
-  DCHECK(!current_task_runner || current_task_runner->BelongsToCurrentThread());
-  DCHECK(!paused_);
-  DCHECK(message);
-  AssertLockAcquired();
-
-  if (message->IsNull()) {
-    // This is a sync message and has been processed during sync handle
-    // watching.
-    return true;
-  }
-
-  if (PipeControlMessageHandler::IsPipeControlMessage(message)) {
-    bool result = false;
-
-    {
-      MayAutoUnlock unlocker(&lock_);
-      result = control_message_handler_.Accept(message);
-    }
-
-    if (!result)
-      RaiseErrorInNonTestingMode();
-
-    return true;
-  }
-
-  InterfaceId id = message->interface_id();
-  DCHECK(IsValidInterfaceId(id));
-
-  InterfaceEndpoint* endpoint = FindEndpoint(id);
-  if (!endpoint || endpoint->closed())
-    return true;
-
-  if (!endpoint->client()) {
-    // We need to wait until a client is attached in order to dispatch further
-    // messages.
-    return false;
-  }
-
-  bool can_direct_call;
-  if (message->has_flag(Message::kFlagIsSync)) {
-    can_direct_call = client_call_behavior != NO_DIRECT_CLIENT_CALLS &&
-                      endpoint->task_runner()->BelongsToCurrentThread();
-  } else {
-    can_direct_call = client_call_behavior == ALLOW_DIRECT_CLIENT_CALLS &&
-                      endpoint->task_runner() == current_task_runner;
-  }
-
-  if (!can_direct_call) {
-    MaybePostToProcessTasks(endpoint->task_runner());
-    return false;
-  }
-
-  DCHECK(endpoint->task_runner()->BelongsToCurrentThread());
-
-  InterfaceEndpointClient* client = endpoint->client();
-  bool result = false;
-  {
-    // We must unlock before calling into |client| because it may call this
-    // object within HandleIncomingMessage(). Holding the lock will lead to
-    // deadlock.
-    //
-    // It is safe to call into |client| without the lock. Because |client| is
-    // always accessed on the same thread, including DetachEndpointClient().
-    MayAutoUnlock unlocker(&lock_);
-    result = client->HandleIncomingMessage(message);
-  }
-  if (!result)
-    RaiseErrorInNonTestingMode();
-
-  return true;
-}
-
-void MultiplexRouter::MaybePostToProcessTasks(
-    base::SingleThreadTaskRunner* task_runner) {
-  AssertLockAcquired();
-  if (posted_to_process_tasks_)
-    return;
-
-  posted_to_process_tasks_ = true;
-  posted_to_task_runner_ = task_runner;
-  task_runner->PostTask(
-      FROM_HERE, base::Bind(&MultiplexRouter::LockAndCallProcessTasks, this));
-}
-
-void MultiplexRouter::LockAndCallProcessTasks() {
-  // There is no need to hold a ref to this class in this case because this is
-  // always called using base::Bind(), which holds a ref.
-  MayAutoLock locker(&lock_);
-  posted_to_process_tasks_ = false;
-  scoped_refptr<base::SingleThreadTaskRunner> runner(
-      std::move(posted_to_task_runner_));
-  ProcessTasks(ALLOW_DIRECT_CLIENT_CALLS, runner.get());
-}
-
-void MultiplexRouter::UpdateEndpointStateMayRemove(
-    InterfaceEndpoint* endpoint,
-    EndpointStateUpdateType type) {
-  if (type == ENDPOINT_CLOSED) {
-    endpoint->set_closed();
-  } else {
-    endpoint->set_peer_closed();
-    // If the interface endpoint is performing a sync watch, this makes sure
-    // it is notified and eventually exits the sync watch.
-    endpoint->SignalSyncMessageEvent();
-  }
-  if (endpoint->closed() && endpoint->peer_closed())
-    endpoints_.erase(endpoint->id());
-}
-
-void MultiplexRouter::RaiseErrorInNonTestingMode() {
-  AssertLockAcquired();
-  if (!testing_mode_)
-    RaiseError();
-}
-
-MultiplexRouter::InterfaceEndpoint* MultiplexRouter::FindOrInsertEndpoint(
-    InterfaceId id,
-    bool* inserted) {
-  AssertLockAcquired();
-  // Either |inserted| is nullptr or it points to a boolean initialized as
-  // false.
-  DCHECK(!inserted || !*inserted);
-
-  InterfaceEndpoint* endpoint = FindEndpoint(id);
-  if (!endpoint) {
-    endpoint = new InterfaceEndpoint(this, id);
-    endpoints_[id] = endpoint;
-    if (inserted)
-      *inserted = true;
-  }
-
-  return endpoint;
-}
-
-MultiplexRouter::InterfaceEndpoint* MultiplexRouter::FindEndpoint(
-    InterfaceId id) {
-  AssertLockAcquired();
-  auto iter = endpoints_.find(id);
-  return iter != endpoints_.end() ? iter->second.get() : nullptr;
-}
-
-void MultiplexRouter::AssertLockAcquired() {
-#if DCHECK_IS_ON()
-  if (lock_)
-    lock_->AssertAcquired();
-#endif
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/multiplex_router.h b/mojo/public/cpp/bindings/lib/multiplex_router.h
deleted file mode 100644
index cac138b..0000000
--- a/mojo/public/cpp/bindings/lib/multiplex_router.h
+++ /dev/null
@@ -1,275 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_
-
-#include <stdint.h>
-
-#include <deque>
-#include <map>
-#include <memory>
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/connector.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/message_header_validator.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_handler.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_proxy.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace mojo {
-
-namespace internal {
-
-// MultiplexRouter supports routing messages for multiple interfaces over a
-// single message pipe.
-//
-// It is created on the thread where the master interface of the message pipe
-// lives. Although it is ref-counted, it is guarateed to be destructed on the
-// same thread.
-// Some public methods are only allowed to be called on the creating thread;
-// while the others are safe to call from any threads. Please see the method
-// comments for more details.
-//
-// NOTE: CloseMessagePipe() or PassMessagePipe() MUST be called on |runner|'s
-// thread before this object is destroyed.
-class MOJO_CPP_BINDINGS_EXPORT MultiplexRouter
-    : NON_EXPORTED_BASE(public MessageReceiver),
-      public AssociatedGroupController,
-      NON_EXPORTED_BASE(public PipeControlMessageHandlerDelegate) {
- public:
-  enum Config {
-    // There is only the master interface running on this router. Please note
-    // that because of interface versioning, the other side of the message pipe
-    // may use a newer master interface definition which passes associated
-    // interfaces. In that case, this router may still receive pipe control
-    // messages or messages targetting associated interfaces.
-    SINGLE_INTERFACE,
-    // Similar to the mode above, there is only the master interface running on
-    // this router. Besides, the master interface has sync methods.
-    SINGLE_INTERFACE_WITH_SYNC_METHODS,
-    // There may be associated interfaces running on this router.
-    MULTI_INTERFACE
-  };
-
-  // If |set_interface_id_namespace_bit| is true, the interface IDs generated by
-  // this router will have the highest bit set.
-  MultiplexRouter(ScopedMessagePipeHandle message_pipe,
-                  Config config,
-                  bool set_interface_id_namespace_bit,
-                  scoped_refptr<base::SingleThreadTaskRunner> runner);
-
-  // Sets the master interface name for this router. Only used when reporting
-  // message header or control message validation errors.
-  // |name| must be a string literal.
-  void SetMasterInterfaceName(const char* name);
-
-  // ---------------------------------------------------------------------------
-  // The following public methods are safe to call from any threads.
-
-  // AssociatedGroupController implementation:
-  InterfaceId AssociateInterface(
-      ScopedInterfaceEndpointHandle handle_to_send) override;
-  ScopedInterfaceEndpointHandle CreateLocalEndpointHandle(
-      InterfaceId id) override;
-  void CloseEndpointHandle(
-      InterfaceId id,
-      const base::Optional<DisconnectReason>& reason) override;
-  InterfaceEndpointController* AttachEndpointClient(
-      const ScopedInterfaceEndpointHandle& handle,
-      InterfaceEndpointClient* endpoint_client,
-      scoped_refptr<base::SingleThreadTaskRunner> runner) override;
-  void DetachEndpointClient(
-      const ScopedInterfaceEndpointHandle& handle) override;
-  void RaiseError() override;
-
-  // ---------------------------------------------------------------------------
-  // The following public methods are called on the creating thread.
-
-  // Please note that this method shouldn't be called unless it results from an
-  // explicit request of the user of bindings (e.g., the user sets an
-  // InterfacePtr to null or closes a Binding).
-  void CloseMessagePipe();
-
-  // Extracts the underlying message pipe.
-  ScopedMessagePipeHandle PassMessagePipe() {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    DCHECK(!HasAssociatedEndpoints());
-    return connector_.PassMessagePipe();
-  }
-
-  // Blocks the current thread until the first incoming message, or |deadline|.
-  bool WaitForIncomingMessage(MojoDeadline deadline) {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return connector_.WaitForIncomingMessage(deadline);
-  }
-
-  // See Binding for details of pause/resume.
-  void PauseIncomingMethodCallProcessing();
-  void ResumeIncomingMethodCallProcessing();
-
-  // Whether there are any associated interfaces running currently.
-  bool HasAssociatedEndpoints() const;
-
-  // Sets this object to testing mode.
-  // In testing mode, the object doesn't disconnect the underlying message pipe
-  // when it receives unexpected or invalid messages.
-  void EnableTestingMode();
-
-  // Is the router bound to a message pipe handle?
-  bool is_valid() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return connector_.is_valid();
-  }
-
-  // TODO(yzshen): consider removing this getter.
-  MessagePipeHandle handle() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return connector_.handle();
-  }
-
-  bool SimulateReceivingMessageForTesting(Message* message) {
-    return filters_.Accept(message);
-  }
-
- private:
-  class InterfaceEndpoint;
-  class MessageWrapper;
-  struct Task;
-
-  ~MultiplexRouter() override;
-
-  // MessageReceiver implementation:
-  bool Accept(Message* message) override;
-
-  // PipeControlMessageHandlerDelegate implementation:
-  bool OnPeerAssociatedEndpointClosed(
-      InterfaceId id,
-      const base::Optional<DisconnectReason>& reason) override;
-
-  void OnPipeConnectionError();
-
-  // Specifies whether we are allowed to directly call into
-  // InterfaceEndpointClient (given that we are already on the same thread as
-  // the client).
-  enum ClientCallBehavior {
-    // Don't call any InterfaceEndpointClient methods directly.
-    NO_DIRECT_CLIENT_CALLS,
-    // Only call InterfaceEndpointClient::HandleIncomingMessage directly to
-    // handle sync messages.
-    ALLOW_DIRECT_CLIENT_CALLS_FOR_SYNC_MESSAGES,
-    // Allow to call any InterfaceEndpointClient methods directly.
-    ALLOW_DIRECT_CLIENT_CALLS
-  };
-
-  // Processes enqueued tasks (incoming messages and error notifications).
-  // |current_task_runner| is only used when |client_call_behavior| is
-  // ALLOW_DIRECT_CLIENT_CALLS to determine whether we are on the right task
-  // runner to make client calls for async messages or connection error
-  // notifications.
-  //
-  // Note: Because calling into InterfaceEndpointClient may lead to destruction
-  // of this object, if direct calls are allowed, the caller needs to hold on to
-  // a ref outside of |lock_| before calling this method.
-  void ProcessTasks(ClientCallBehavior client_call_behavior,
-                    base::SingleThreadTaskRunner* current_task_runner);
-
-  // Processes the first queued sync message for the endpoint corresponding to
-  // |id|; returns whether there are more sync messages for that endpoint in the
-  // queue.
-  //
-  // This method is only used by enpoints during sync watching. Therefore, not
-  // all sync messages are handled by it.
-  bool ProcessFirstSyncMessageForEndpoint(InterfaceId id);
-
-  // Returns true to indicate that |task|/|message| has been processed.
-  bool ProcessNotifyErrorTask(
-      Task* task,
-      ClientCallBehavior client_call_behavior,
-      base::SingleThreadTaskRunner* current_task_runner);
-  bool ProcessIncomingMessage(
-      Message* message,
-      ClientCallBehavior client_call_behavior,
-      base::SingleThreadTaskRunner* current_task_runner);
-
-  void MaybePostToProcessTasks(base::SingleThreadTaskRunner* task_runner);
-  void LockAndCallProcessTasks();
-
-  // Updates the state of |endpoint|. If both the endpoint and its peer have
-  // been closed, removes it from |endpoints_|.
-  // NOTE: The method may invalidate |endpoint|.
-  enum EndpointStateUpdateType { ENDPOINT_CLOSED, PEER_ENDPOINT_CLOSED };
-  void UpdateEndpointStateMayRemove(InterfaceEndpoint* endpoint,
-                                    EndpointStateUpdateType type);
-
-  void RaiseErrorInNonTestingMode();
-
-  InterfaceEndpoint* FindOrInsertEndpoint(InterfaceId id, bool* inserted);
-  InterfaceEndpoint* FindEndpoint(InterfaceId id);
-
-  void AssertLockAcquired();
-
-  // Whether to set the namespace bit when generating interface IDs. Please see
-  // comments of kInterfaceIdNamespaceMask.
-  const bool set_interface_id_namespace_bit_;
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  // Owned by |filters_| below.
-  MessageHeaderValidator* header_validator_;
-
-  FilterChain filters_;
-  Connector connector_;
-
-  base::ThreadChecker thread_checker_;
-
-  // Protects the following members.
-  // Not set in Config::SINGLE_INTERFACE* mode.
-  mutable base::Optional<base::Lock> lock_;
-  PipeControlMessageHandler control_message_handler_;
-
-  // NOTE: It is unsafe to call into this object while holding |lock_|.
-  PipeControlMessageProxy control_message_proxy_;
-
-  std::map<InterfaceId, scoped_refptr<InterfaceEndpoint>> endpoints_;
-  uint32_t next_interface_id_value_;
-
-  std::deque<std::unique_ptr<Task>> tasks_;
-  // It refers to tasks in |tasks_| and doesn't own any of them.
-  std::map<InterfaceId, std::deque<Task*>> sync_message_tasks_;
-
-  bool posted_to_process_tasks_;
-  scoped_refptr<base::SingleThreadTaskRunner> posted_to_task_runner_;
-
-  bool encountered_error_;
-
-  bool paused_;
-
-  bool testing_mode_;
-
-  DISALLOW_COPY_AND_ASSIGN(MultiplexRouter);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_
diff --git a/mojo/public/cpp/bindings/lib/native_enum_data.h b/mojo/public/cpp/bindings/lib/native_enum_data.h
deleted file mode 100644
index dcafce2..0000000
--- a/mojo/public/cpp/bindings/lib/native_enum_data.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_ENUM_DATA_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_ENUM_DATA_H_
-
-namespace mojo {
-namespace internal {
-
-class ValidationContext;
-
-class NativeEnum_Data {
- public:
-  static bool const kIsExtensible = true;
-
-  static bool IsKnownValue(int32_t value) { return false; }
-
-  static bool Validate(int32_t value,
-                       ValidationContext* validation_context) { return true; }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_ENUM_DATA_H_
diff --git a/mojo/public/cpp/bindings/lib/native_enum_serialization.h b/mojo/public/cpp/bindings/lib/native_enum_serialization.h
deleted file mode 100644
index 4faf957..0000000
--- a/mojo/public/cpp/bindings/lib/native_enum_serialization.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_ENUM_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_ENUM_SERIALIZATION_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <type_traits>
-
-#include "base/logging.h"
-#include "base/pickle.h"
-#include "ipc/ipc_param_traits.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-#include "mojo/public/cpp/bindings/native_enum.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename MaybeConstUserType>
-struct NativeEnumSerializerImpl {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = IPC::ParamTraits<UserType>;
-
-  // IPC_ENUM_TRAITS* macros serialize enum as int, make sure that fits into
-  // mojo native-only enum.
-  static_assert(sizeof(NativeEnum) >= sizeof(int),
-                "Cannot store the serialization result in NativeEnum.");
-
-  static void Serialize(UserType input, int32_t* output) {
-    base::Pickle pickle;
-    Traits::Write(&pickle, input);
-
-    CHECK_GE(sizeof(int32_t), pickle.payload_size());
-    *output = 0;
-    memcpy(reinterpret_cast<char*>(output), pickle.payload(),
-           pickle.payload_size());
-  }
-
-  struct PickleData {
-    uint32_t payload_size;
-    int32_t value;
-  };
-  static_assert(sizeof(PickleData) == 8, "PickleData size mismatch.");
-
-  static bool Deserialize(int32_t input, UserType* output) {
-    PickleData data = {sizeof(int32_t), input};
-    base::Pickle pickle_view(reinterpret_cast<const char*>(&data),
-                             sizeof(PickleData));
-    base::PickleIterator iter(pickle_view);
-    return Traits::Read(&pickle_view, &iter, output);
-  }
-};
-
-struct UnmappedNativeEnumSerializerImpl {
-  static void Serialize(NativeEnum input, int32_t* output) {
-    *output = static_cast<int32_t>(input);
-  }
-  static bool Deserialize(int32_t input, NativeEnum* output) {
-    *output = static_cast<NativeEnum>(input);
-    return true;
-  }
-};
-
-template <>
-struct NativeEnumSerializerImpl<NativeEnum>
-    : public UnmappedNativeEnumSerializerImpl {};
-
-template <>
-struct NativeEnumSerializerImpl<const NativeEnum>
-    : public UnmappedNativeEnumSerializerImpl {};
-
-template <typename MaybeConstUserType>
-struct Serializer<NativeEnum, MaybeConstUserType>
-    : public NativeEnumSerializerImpl<MaybeConstUserType> {};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_ENUM_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/native_struct.cc b/mojo/public/cpp/bindings/lib/native_struct.cc
deleted file mode 100644
index 7b1a1a6..0000000
--- a/mojo/public/cpp/bindings/lib/native_struct.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/native_struct.h"
-
-#include "mojo/public/cpp/bindings/lib/hash_util.h"
-
-namespace mojo {
-
-// static
-NativeStructPtr NativeStruct::New() {
-  return NativeStructPtr(base::in_place);
-}
-
-NativeStruct::NativeStruct() {}
-
-NativeStruct::~NativeStruct() {}
-
-NativeStructPtr NativeStruct::Clone() const {
-  NativeStructPtr rv(New());
-  rv->data = data;
-  return rv;
-}
-
-bool NativeStruct::Equals(const NativeStruct& other) const {
-  return data == other.data;
-}
-
-size_t NativeStruct::Hash(size_t seed) const {
-  return internal::Hash(seed, data);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/native_struct_data.cc b/mojo/public/cpp/bindings/lib/native_struct_data.cc
deleted file mode 100644
index 0e5d245..0000000
--- a/mojo/public/cpp/bindings/lib/native_struct_data.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/native_struct_data.h"
-
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-
-namespace mojo {
-namespace internal {
-
-// static
-bool NativeStruct_Data::Validate(const void* data,
-                                 ValidationContext* validation_context) {
-  const ContainerValidateParams data_validate_params(0, false, nullptr);
-  return Array_Data<uint8_t>::Validate(data, validation_context,
-                                       &data_validate_params);
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/native_struct_data.h b/mojo/public/cpp/bindings/lib/native_struct_data.h
deleted file mode 100644
index 1c7cd81..0000000
--- a/mojo/public/cpp/bindings/lib/native_struct_data.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_STRUCT_DATA_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_STRUCT_DATA_H_
-
-#include <vector>
-
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace mojo {
-namespace internal {
-
-class ValidationContext;
-
-class MOJO_CPP_BINDINGS_EXPORT NativeStruct_Data {
- public:
-  static bool Validate(const void* data, ValidationContext* validation_context);
-
-  // Unlike normal structs, the memory layout is exactly the same as an array
-  // of uint8_t.
-  Array_Data<uint8_t> data;
-
- private:
-  NativeStruct_Data() = delete;
-  ~NativeStruct_Data() = delete;
-};
-
-static_assert(sizeof(Array_Data<uint8_t>) == sizeof(NativeStruct_Data),
-              "Mismatched NativeStruct_Data and Array_Data<uint8_t> size");
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_STRUCT_DATA_H_
diff --git a/mojo/public/cpp/bindings/lib/native_struct_serialization.cc b/mojo/public/cpp/bindings/lib/native_struct_serialization.cc
deleted file mode 100644
index fa0dbf3..0000000
--- a/mojo/public/cpp/bindings/lib/native_struct_serialization.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/native_struct_serialization.h"
-
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-
-namespace mojo {
-namespace internal {
-
-// static
-size_t UnmappedNativeStructSerializerImpl::PrepareToSerialize(
-    const NativeStructPtr& input,
-    SerializationContext* context) {
-  if (!input)
-    return 0;
-  return internal::PrepareToSerialize<ArrayDataView<uint8_t>>(input->data,
-                                                              context);
-}
-
-// static
-void UnmappedNativeStructSerializerImpl::Serialize(
-    const NativeStructPtr& input,
-    Buffer* buffer,
-    NativeStruct_Data** output,
-    SerializationContext* context) {
-  if (!input) {
-    *output = nullptr;
-    return;
-  }
-
-  Array_Data<uint8_t>* data = nullptr;
-  const ContainerValidateParams params(0, false, nullptr);
-  internal::Serialize<ArrayDataView<uint8_t>>(input->data, buffer, &data,
-                                              &params, context);
-  *output = reinterpret_cast<NativeStruct_Data*>(data);
-}
-
-// static
-bool UnmappedNativeStructSerializerImpl::Deserialize(
-    NativeStruct_Data* input,
-    NativeStructPtr* output,
-    SerializationContext* context) {
-  Array_Data<uint8_t>* data = reinterpret_cast<Array_Data<uint8_t>*>(input);
-
-  NativeStructPtr result(NativeStruct::New());
-  if (!internal::Deserialize<ArrayDataView<uint8_t>>(data, &result->data,
-                                                     context)) {
-    output = nullptr;
-    return false;
-  }
-  if (!result->data)
-    *output = nullptr;
-  else
-    result.Swap(output);
-  return true;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/native_struct_serialization.h b/mojo/public/cpp/bindings/lib/native_struct_serialization.h
deleted file mode 100644
index 457435b..0000000
--- a/mojo/public/cpp/bindings/lib/native_struct_serialization.h
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_STRUCT_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_STRUCT_SERIALIZATION_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-
-#include "base/logging.h"
-#include "base/pickle.h"
-#include "ipc/ipc_param_traits.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/native_struct_data.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/native_struct.h"
-#include "mojo/public/cpp/bindings/native_struct_data_view.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename MaybeConstUserType>
-struct NativeStructSerializerImpl {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = IPC::ParamTraits<UserType>;
-
-  static size_t PrepareToSerialize(MaybeConstUserType& value,
-                                   SerializationContext* context) {
-    base::PickleSizer sizer;
-    Traits::GetSize(&sizer, value);
-    return Align(sizer.payload_size() + sizeof(ArrayHeader));
-  }
-
-  static void Serialize(MaybeConstUserType& value,
-                        Buffer* buffer,
-                        NativeStruct_Data** out,
-                        SerializationContext* context) {
-    base::Pickle pickle;
-    Traits::Write(&pickle, value);
-
-#if DCHECK_IS_ON()
-    base::PickleSizer sizer;
-    Traits::GetSize(&sizer, value);
-    DCHECK_EQ(sizer.payload_size(), pickle.payload_size());
-#endif
-
-    size_t total_size = pickle.payload_size() + sizeof(ArrayHeader);
-    DCHECK_LT(total_size, std::numeric_limits<uint32_t>::max());
-
-    // Allocate a uint8 array, initialize its header, and copy the Pickle in.
-    ArrayHeader* header =
-        reinterpret_cast<ArrayHeader*>(buffer->Allocate(total_size));
-    header->num_bytes = static_cast<uint32_t>(total_size);
-    header->num_elements = static_cast<uint32_t>(pickle.payload_size());
-    memcpy(reinterpret_cast<char*>(header) + sizeof(ArrayHeader),
-           pickle.payload(), pickle.payload_size());
-
-    *out = reinterpret_cast<NativeStruct_Data*>(header);
-  }
-
-  static bool Deserialize(NativeStruct_Data* data,
-                          UserType* out,
-                          SerializationContext* context) {
-    if (!data)
-      return false;
-
-    // Construct a temporary base::Pickle view over the array data. Note that
-    // the Array_Data is laid out like this:
-    //
-    //   [num_bytes (4 bytes)] [num_elements (4 bytes)] [elements...]
-    //
-    // and base::Pickle expects to view data like this:
-    //
-    //   [payload_size (4 bytes)] [header bytes ...] [payload...]
-    //
-    // Because ArrayHeader's num_bytes includes the length of the header and
-    // Pickle's payload_size does not, we need to adjust the stored value
-    // momentarily so Pickle can view the data.
-    ArrayHeader* header = reinterpret_cast<ArrayHeader*>(data);
-    DCHECK_GE(header->num_bytes, sizeof(ArrayHeader));
-    header->num_bytes -= sizeof(ArrayHeader);
-
-    {
-      // Construct a view over the full Array_Data, including our hacked up
-      // header. Pickle will infer from this that the header is 8 bytes long,
-      // and the payload will contain all of the pickled bytes.
-      base::Pickle pickle_view(reinterpret_cast<const char*>(header),
-                               header->num_bytes + sizeof(ArrayHeader));
-      base::PickleIterator iter(pickle_view);
-      if (!Traits::Read(&pickle_view, &iter, out))
-        return false;
-    }
-
-    // Return the header to its original state.
-    header->num_bytes += sizeof(ArrayHeader);
-
-    return true;
-  }
-};
-
-struct MOJO_CPP_BINDINGS_EXPORT UnmappedNativeStructSerializerImpl {
-  static size_t PrepareToSerialize(const NativeStructPtr& input,
-                                   SerializationContext* context);
-  static void Serialize(const NativeStructPtr& input,
-                        Buffer* buffer,
-                        NativeStruct_Data** output,
-                        SerializationContext* context);
-  static bool Deserialize(NativeStruct_Data* input,
-                          NativeStructPtr* output,
-                          SerializationContext* context);
-};
-
-template <>
-struct NativeStructSerializerImpl<NativeStructPtr>
-    : public UnmappedNativeStructSerializerImpl {};
-
-template <>
-struct NativeStructSerializerImpl<const NativeStructPtr>
-    : public UnmappedNativeStructSerializerImpl {};
-
-template <typename MaybeConstUserType>
-struct Serializer<NativeStructDataView, MaybeConstUserType>
-    : public NativeStructSerializerImpl<MaybeConstUserType> {};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_STRUCT_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/pipe_control_message_handler.cc b/mojo/public/cpp/bindings/lib/pipe_control_message_handler.cc
deleted file mode 100644
index d451c05..0000000
--- a/mojo/public/cpp/bindings/lib/pipe_control_message_handler.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/pipe_control_message_handler.h"
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h"
-#include "mojo/public/interfaces/bindings/pipe_control_messages.mojom.h"
-
-namespace mojo {
-
-PipeControlMessageHandler::PipeControlMessageHandler(
-    PipeControlMessageHandlerDelegate* delegate)
-    : delegate_(delegate) {}
-
-PipeControlMessageHandler::~PipeControlMessageHandler() {}
-
-void PipeControlMessageHandler::SetDescription(const std::string& description) {
-  description_ = description;
-}
-
-// static
-bool PipeControlMessageHandler::IsPipeControlMessage(const Message* message) {
-  return !IsValidInterfaceId(message->interface_id());
-}
-
-bool PipeControlMessageHandler::Accept(Message* message) {
-  if (!Validate(message))
-    return false;
-
-  if (message->name() == pipe_control::kRunOrClosePipeMessageId)
-    return RunOrClosePipe(message);
-
-  NOTREACHED();
-  return false;
-}
-
-bool PipeControlMessageHandler::Validate(Message* message) {
-  internal::ValidationContext validation_context(message->payload(),
-                                                 message->payload_num_bytes(),
-                                                 0, 0, message, description_);
-
-  if (message->name() == pipe_control::kRunOrClosePipeMessageId) {
-    if (!internal::ValidateMessageIsRequestWithoutResponse(
-            message, &validation_context)) {
-      return false;
-    }
-    return internal::ValidateMessagePayload<
-        pipe_control::internal::RunOrClosePipeMessageParams_Data>(
-            message, &validation_context);
-  }
-
-  return false;
-}
-
-bool PipeControlMessageHandler::RunOrClosePipe(Message* message) {
-  internal::SerializationContext context;
-  pipe_control::internal::RunOrClosePipeMessageParams_Data* params =
-      reinterpret_cast<
-          pipe_control::internal::RunOrClosePipeMessageParams_Data*>(
-          message->mutable_payload());
-  pipe_control::RunOrClosePipeMessageParamsPtr params_ptr;
-  internal::Deserialize<pipe_control::RunOrClosePipeMessageParamsDataView>(
-      params, &params_ptr, &context);
-
-  if (params_ptr->input->is_peer_associated_endpoint_closed_event()) {
-    const auto& event =
-        params_ptr->input->get_peer_associated_endpoint_closed_event();
-
-    base::Optional<DisconnectReason> reason;
-    if (event->disconnect_reason) {
-      reason.emplace(event->disconnect_reason->custom_reason,
-                     event->disconnect_reason->description);
-    }
-    return delegate_->OnPeerAssociatedEndpointClosed(event->id, reason);
-  }
-
-  DVLOG(1) << "Unsupported command in a RunOrClosePipe message pipe control "
-           << "message. Closing the pipe.";
-  return false;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/pipe_control_message_proxy.cc b/mojo/public/cpp/bindings/lib/pipe_control_message_proxy.cc
deleted file mode 100644
index 1029c2c..0000000
--- a/mojo/public/cpp/bindings/lib/pipe_control_message_proxy.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/pipe_control_message_proxy.h"
-
-#include <stddef.h>
-#include <utility>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/interfaces/bindings/pipe_control_messages.mojom.h"
-
-namespace mojo {
-namespace {
-
-Message ConstructRunOrClosePipeMessage(
-    pipe_control::RunOrClosePipeInputPtr input_ptr) {
-  internal::SerializationContext context;
-
-  auto params_ptr = pipe_control::RunOrClosePipeMessageParams::New();
-  params_ptr->input = std::move(input_ptr);
-
-  size_t size = internal::PrepareToSerialize<
-      pipe_control::RunOrClosePipeMessageParamsDataView>(params_ptr, &context);
-  internal::MessageBuilder builder(pipe_control::kRunOrClosePipeMessageId, 0,
-                                   size, 0);
-
-  pipe_control::internal::RunOrClosePipeMessageParams_Data* params = nullptr;
-  internal::Serialize<pipe_control::RunOrClosePipeMessageParamsDataView>(
-      params_ptr, builder.buffer(), &params, &context);
-  builder.message()->set_interface_id(kInvalidInterfaceId);
-  return std::move(*builder.message());
-}
-
-}  // namespace
-
-PipeControlMessageProxy::PipeControlMessageProxy(MessageReceiver* receiver)
-    : receiver_(receiver) {}
-
-void PipeControlMessageProxy::NotifyPeerEndpointClosed(
-    InterfaceId id,
-    const base::Optional<DisconnectReason>& reason) {
-  Message message(ConstructPeerEndpointClosedMessage(id, reason));
-  ignore_result(receiver_->Accept(&message));
-}
-
-// static
-Message PipeControlMessageProxy::ConstructPeerEndpointClosedMessage(
-    InterfaceId id,
-    const base::Optional<DisconnectReason>& reason) {
-  auto event = pipe_control::PeerAssociatedEndpointClosedEvent::New();
-  event->id = id;
-  if (reason) {
-    event->disconnect_reason = pipe_control::DisconnectReason::New();
-    event->disconnect_reason->custom_reason = reason->custom_reason;
-    event->disconnect_reason->description = reason->description;
-  }
-
-  auto input = pipe_control::RunOrClosePipeInput::New();
-  input->set_peer_associated_endpoint_closed_event(std::move(event));
-
-  return ConstructRunOrClosePipeMessage(std::move(input));
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/scoped_interface_endpoint_handle.cc b/mojo/public/cpp/bindings/lib/scoped_interface_endpoint_handle.cc
deleted file mode 100644
index c134507..0000000
--- a/mojo/public/cpp/bindings/lib/scoped_interface_endpoint_handle.cc
+++ /dev/null
@@ -1,382 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/synchronization/lock.h"
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-#include "mojo/public/cpp/bindings/lib/may_auto_lock.h"
-
-namespace mojo {
-
-// ScopedInterfaceEndpointHandle::State ----------------------------------------
-
-// State could be called from multiple threads.
-class ScopedInterfaceEndpointHandle::State
-    : public base::RefCountedThreadSafe<State> {
- public:
-  State() = default;
-
-  State(InterfaceId id,
-        scoped_refptr<AssociatedGroupController> group_controller)
-      : id_(id), group_controller_(group_controller) {}
-
-  void InitPendingState(scoped_refptr<State> peer) {
-    DCHECK(!lock_);
-    DCHECK(!pending_association_);
-
-    lock_.emplace();
-    pending_association_ = true;
-    peer_state_ = std::move(peer);
-  }
-
-  void Close(const base::Optional<DisconnectReason>& reason) {
-    scoped_refptr<AssociatedGroupController> cached_group_controller;
-    InterfaceId cached_id = kInvalidInterfaceId;
-    scoped_refptr<State> cached_peer_state;
-
-    {
-      internal::MayAutoLock locker(&lock_);
-
-      if (!association_event_handler_.is_null()) {
-        association_event_handler_.Reset();
-        runner_ = nullptr;
-      }
-
-      if (!pending_association_) {
-        if (IsValidInterfaceId(id_)) {
-          // Intentionally keep |group_controller_| unchanged.
-          // That is because the callback created by
-          // CreateGroupControllerGetter() could still be used after this point,
-          // potentially from another thread. We would like it to continue
-          // returning the same group controller.
-          //
-          // Imagine there is a ThreadSafeForwarder A:
-          // (1) On the IO thread, A's underlying associated interface pointer
-          //     is closed.
-          // (2) On the proxy thread, the user makes a call on A to pass an
-          //     associated request B_asso_req. The callback returned by
-          //     CreateGroupControllerGetter() is used to associate B_asso_req.
-          // (3) On the proxy thread, the user immediately binds B_asso_ptr_info
-          //     to B_asso_ptr and makes calls on it.
-          //
-          // If we reset |group_controller_| in step (1), step (2) won't be able
-          // to associate B_asso_req. Therefore, in step (3) B_asso_ptr won't be
-          // able to serialize associated endpoints or send message because it
-          // is still in "pending_association" state and doesn't have a group
-          // controller.
-          //
-          // We could "address" this issue by ignoring messages if there isn't a
-          // group controller. But the side effect is that we cannot detect
-          // programming errors of "using associated interface pointer before
-          // sending associated request".
-
-          cached_group_controller = group_controller_;
-          cached_id = id_;
-          id_ = kInvalidInterfaceId;
-        }
-      } else {
-        pending_association_ = false;
-        cached_peer_state = std::move(peer_state_);
-      }
-    }
-
-    if (cached_group_controller) {
-      cached_group_controller->CloseEndpointHandle(cached_id, reason);
-    } else if (cached_peer_state) {
-      cached_peer_state->OnPeerClosedBeforeAssociation(reason);
-    }
-  }
-
-  void SetAssociationEventHandler(AssociationEventCallback handler) {
-    internal::MayAutoLock locker(&lock_);
-
-    if (!pending_association_ && !IsValidInterfaceId(id_))
-      return;
-
-    association_event_handler_ = std::move(handler);
-    if (association_event_handler_.is_null()) {
-      runner_ = nullptr;
-      return;
-    }
-
-    runner_ = base::ThreadTaskRunnerHandle::Get();
-    if (!pending_association_) {
-      runner_->PostTask(
-          FROM_HERE,
-          base::Bind(
-              &ScopedInterfaceEndpointHandle::State::RunAssociationEventHandler,
-              this, runner_, ASSOCIATED));
-    } else if (!peer_state_) {
-      runner_->PostTask(
-          FROM_HERE,
-          base::Bind(
-              &ScopedInterfaceEndpointHandle::State::RunAssociationEventHandler,
-              this, runner_, PEER_CLOSED_BEFORE_ASSOCIATION));
-    }
-  }
-
-  bool NotifyAssociation(
-      InterfaceId id,
-      scoped_refptr<AssociatedGroupController> peer_group_controller) {
-    scoped_refptr<State> cached_peer_state;
-    {
-      internal::MayAutoLock locker(&lock_);
-
-      DCHECK(pending_association_);
-      pending_association_ = false;
-      cached_peer_state = std::move(peer_state_);
-    }
-
-    if (cached_peer_state) {
-      cached_peer_state->OnAssociated(id, std::move(peer_group_controller));
-      return true;
-    }
-    return false;
-  }
-
-  bool is_valid() const {
-    internal::MayAutoLock locker(&lock_);
-    return pending_association_ || IsValidInterfaceId(id_);
-  }
-
-  bool pending_association() const {
-    internal::MayAutoLock locker(&lock_);
-    return pending_association_;
-  }
-
-  InterfaceId id() const {
-    internal::MayAutoLock locker(&lock_);
-    return id_;
-  }
-
-  AssociatedGroupController* group_controller() const {
-    internal::MayAutoLock locker(&lock_);
-    return group_controller_.get();
-  }
-
-  const base::Optional<DisconnectReason>& disconnect_reason() const {
-    internal::MayAutoLock locker(&lock_);
-    return disconnect_reason_;
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<State>;
-
-  ~State() {
-    DCHECK(!pending_association_);
-    DCHECK(!IsValidInterfaceId(id_));
-  }
-
-  // Called by the peer, maybe from a different thread.
-  void OnAssociated(InterfaceId id,
-                    scoped_refptr<AssociatedGroupController> group_controller) {
-    AssociationEventCallback handler;
-    {
-      internal::MayAutoLock locker(&lock_);
-
-      // There may be race between Close() of endpoint A and
-      // NotifyPeerAssociation() of endpoint A_peer on different threads.
-      // Therefore, it is possible that endpoint A has been closed but it
-      // still gets OnAssociated() call from its peer.
-      if (!pending_association_)
-        return;
-
-      pending_association_ = false;
-      peer_state_ = nullptr;
-      id_ = id;
-      group_controller_ = std::move(group_controller);
-
-      if (!association_event_handler_.is_null()) {
-        if (runner_->BelongsToCurrentThread()) {
-          handler = std::move(association_event_handler_);
-          runner_ = nullptr;
-        } else {
-          runner_->PostTask(FROM_HERE,
-                            base::Bind(&ScopedInterfaceEndpointHandle::State::
-                                           RunAssociationEventHandler,
-                                       this, runner_, ASSOCIATED));
-        }
-      }
-    }
-
-    if (!handler.is_null())
-      std::move(handler).Run(ASSOCIATED);
-  }
-
-  // Called by the peer, maybe from a different thread.
-  void OnPeerClosedBeforeAssociation(
-      const base::Optional<DisconnectReason>& reason) {
-    AssociationEventCallback handler;
-    {
-      internal::MayAutoLock locker(&lock_);
-
-      // There may be race between Close()/NotifyPeerAssociation() of endpoint
-      // A and Close() of endpoint A_peer on different threads.
-      // Therefore, it is possible that endpoint A is not in pending association
-      // state but still gets OnPeerClosedBeforeAssociation() call from its
-      // peer.
-      if (!pending_association_)
-        return;
-
-      disconnect_reason_ = reason;
-      // NOTE: This handle itself is still pending.
-      peer_state_ = nullptr;
-
-      if (!association_event_handler_.is_null()) {
-        if (runner_->BelongsToCurrentThread()) {
-          handler = std::move(association_event_handler_);
-          runner_ = nullptr;
-        } else {
-          runner_->PostTask(
-              FROM_HERE,
-              base::Bind(&ScopedInterfaceEndpointHandle::State::
-                             RunAssociationEventHandler,
-                         this, runner_, PEER_CLOSED_BEFORE_ASSOCIATION));
-        }
-      }
-    }
-
-    if (!handler.is_null())
-      std::move(handler).Run(PEER_CLOSED_BEFORE_ASSOCIATION);
-  }
-
-  void RunAssociationEventHandler(
-      scoped_refptr<base::SingleThreadTaskRunner> posted_to_runner,
-      AssociationEvent event) {
-    AssociationEventCallback handler;
-
-    {
-      internal::MayAutoLock locker(&lock_);
-      if (posted_to_runner == runner_) {
-        runner_ = nullptr;
-        handler = std::move(association_event_handler_);
-      }
-    }
-
-    if (!handler.is_null())
-      std::move(handler).Run(event);
-  }
-
-  // Protects the following members if the handle is initially set to pending
-  // association.
-  mutable base::Optional<base::Lock> lock_;
-
-  bool pending_association_ = false;
-  base::Optional<DisconnectReason> disconnect_reason_;
-
-  scoped_refptr<State> peer_state_;
-
-  AssociationEventCallback association_event_handler_;
-  scoped_refptr<base::SingleThreadTaskRunner> runner_;
-
-  InterfaceId id_ = kInvalidInterfaceId;
-  scoped_refptr<AssociatedGroupController> group_controller_;
-
-  DISALLOW_COPY_AND_ASSIGN(State);
-};
-
-// ScopedInterfaceEndpointHandle -----------------------------------------------
-
-// static
-void ScopedInterfaceEndpointHandle::CreatePairPendingAssociation(
-    ScopedInterfaceEndpointHandle* handle0,
-    ScopedInterfaceEndpointHandle* handle1) {
-  ScopedInterfaceEndpointHandle result0;
-  ScopedInterfaceEndpointHandle result1;
-  result0.state_->InitPendingState(result1.state_);
-  result1.state_->InitPendingState(result0.state_);
-
-  *handle0 = std::move(result0);
-  *handle1 = std::move(result1);
-}
-
-ScopedInterfaceEndpointHandle::ScopedInterfaceEndpointHandle()
-    : state_(new State) {}
-
-ScopedInterfaceEndpointHandle::ScopedInterfaceEndpointHandle(
-    ScopedInterfaceEndpointHandle&& other)
-    : state_(new State) {
-  state_.swap(other.state_);
-}
-
-ScopedInterfaceEndpointHandle::~ScopedInterfaceEndpointHandle() {
-  state_->Close(base::nullopt);
-}
-
-ScopedInterfaceEndpointHandle& ScopedInterfaceEndpointHandle::operator=(
-    ScopedInterfaceEndpointHandle&& other) {
-  reset();
-  state_.swap(other.state_);
-  return *this;
-}
-
-bool ScopedInterfaceEndpointHandle::is_valid() const {
-  return state_->is_valid();
-}
-
-bool ScopedInterfaceEndpointHandle::pending_association() const {
-  return state_->pending_association();
-}
-
-InterfaceId ScopedInterfaceEndpointHandle::id() const {
-  return state_->id();
-}
-
-AssociatedGroupController* ScopedInterfaceEndpointHandle::group_controller()
-    const {
-  return state_->group_controller();
-}
-
-const base::Optional<DisconnectReason>&
-ScopedInterfaceEndpointHandle::disconnect_reason() const {
-  return state_->disconnect_reason();
-}
-
-void ScopedInterfaceEndpointHandle::SetAssociationEventHandler(
-    AssociationEventCallback handler) {
-  state_->SetAssociationEventHandler(std::move(handler));
-}
-
-void ScopedInterfaceEndpointHandle::reset() {
-  ResetInternal(base::nullopt);
-}
-
-void ScopedInterfaceEndpointHandle::ResetWithReason(
-    uint32_t custom_reason,
-    const std::string& description) {
-  ResetInternal(DisconnectReason(custom_reason, description));
-}
-
-ScopedInterfaceEndpointHandle::ScopedInterfaceEndpointHandle(
-    InterfaceId id,
-    scoped_refptr<AssociatedGroupController> group_controller)
-    : state_(new State(id, std::move(group_controller))) {
-  DCHECK(!IsValidInterfaceId(state_->id()) || state_->group_controller());
-}
-
-bool ScopedInterfaceEndpointHandle::NotifyAssociation(
-    InterfaceId id,
-    scoped_refptr<AssociatedGroupController> peer_group_controller) {
-  return state_->NotifyAssociation(id, peer_group_controller);
-}
-
-void ScopedInterfaceEndpointHandle::ResetInternal(
-    const base::Optional<DisconnectReason>& reason) {
-  scoped_refptr<State> new_state(new State);
-  state_->Close(reason);
-  state_.swap(new_state);
-}
-
-base::Callback<AssociatedGroupController*()>
-ScopedInterfaceEndpointHandle::CreateGroupControllerGetter() const {
-  // We allow this callback to be run on any thread. If this handle is created
-  // in non-pending state, we don't have a lock but it should still be safe
-  // because the group controller never changes.
-  return base::Bind(&State::group_controller, state_);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/serialization.h b/mojo/public/cpp/bindings/lib/serialization.h
deleted file mode 100644
index 2a7d288..0000000
--- a/mojo/public/cpp/bindings/lib/serialization.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_H_
-
-#include <string.h>
-
-#include "mojo/public/cpp/bindings/array_traits_carray.h"
-#include "mojo/public/cpp/bindings/array_traits_stl.h"
-#include "mojo/public/cpp/bindings/lib/array_serialization.h"
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-#include "mojo/public/cpp/bindings/lib/handle_interface_serialization.h"
-#include "mojo/public/cpp/bindings/lib/map_serialization.h"
-#include "mojo/public/cpp/bindings/lib/native_enum_serialization.h"
-#include "mojo/public/cpp/bindings/lib/native_struct_serialization.h"
-#include "mojo/public/cpp/bindings/lib/string_serialization.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-#include "mojo/public/cpp/bindings/map_traits_stl.h"
-#include "mojo/public/cpp/bindings/string_traits_stl.h"
-#include "mojo/public/cpp/bindings/string_traits_string16.h"
-#include "mojo/public/cpp/bindings/string_traits_string_piece.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename MojomType, typename DataArrayType, typename UserType>
-DataArrayType StructSerializeImpl(UserType* input) {
-  static_assert(BelongsTo<MojomType, MojomTypeCategory::STRUCT>::value,
-                "Unexpected type.");
-
-  SerializationContext context;
-  size_t size = PrepareToSerialize<MojomType>(*input, &context);
-  DCHECK_EQ(size, Align(size));
-
-  DataArrayType result(size);
-  if (size == 0)
-    return result;
-
-  void* result_buffer = &result.front();
-  // The serialization logic requires that the buffer is 8-byte aligned. If the
-  // result buffer is not properly aligned, we have to do an extra copy. In
-  // practice, this should never happen for std::vector.
-  bool need_copy = !IsAligned(result_buffer);
-
-  if (need_copy) {
-    // calloc sets the memory to all zero.
-    result_buffer = calloc(size, 1);
-    DCHECK(IsAligned(result_buffer));
-  }
-
-  Buffer buffer;
-  buffer.Initialize(result_buffer, size);
-  typename MojomTypeTraits<MojomType>::Data* data = nullptr;
-  Serialize<MojomType>(*input, &buffer, &data, &context);
-
-  if (need_copy) {
-    memcpy(&result.front(), result_buffer, size);
-    free(result_buffer);
-  }
-
-  return result;
-}
-
-template <typename MojomType, typename DataArrayType, typename UserType>
-bool StructDeserializeImpl(const DataArrayType& input,
-                           UserType* output,
-                           bool (*validate_func)(const void*,
-                                                 ValidationContext*)) {
-  static_assert(BelongsTo<MojomType, MojomTypeCategory::STRUCT>::value,
-                "Unexpected type.");
-  using DataType = typename MojomTypeTraits<MojomType>::Data;
-
-  // TODO(sammc): Use DataArrayType::empty() once WTF::Vector::empty() exists.
-  void* input_buffer =
-      input.size() == 0
-          ? nullptr
-          : const_cast<void*>(reinterpret_cast<const void*>(&input.front()));
-
-  // Please see comments in StructSerializeImpl.
-  bool need_copy = !IsAligned(input_buffer);
-
-  if (need_copy) {
-    input_buffer = malloc(input.size());
-    DCHECK(IsAligned(input_buffer));
-    memcpy(input_buffer, &input.front(), input.size());
-  }
-
-  ValidationContext validation_context(input_buffer, input.size(), 0, 0);
-  bool result = false;
-  if (validate_func(input_buffer, &validation_context)) {
-    auto data = reinterpret_cast<DataType*>(input_buffer);
-    SerializationContext context;
-    result = Deserialize<MojomType>(data, output, &context);
-  }
-
-  if (need_copy)
-    free(input_buffer);
-
-  return result;
-}
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/serialization_context.cc b/mojo/public/cpp/bindings/lib/serialization_context.cc
deleted file mode 100644
index e2fd5c6..0000000
--- a/mojo/public/cpp/bindings/lib/serialization_context.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-
-#include <limits>
-
-#include "base/logging.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-namespace internal {
-
-SerializedHandleVector::SerializedHandleVector() {}
-
-SerializedHandleVector::~SerializedHandleVector() {
-  for (auto handle : handles_) {
-    if (handle.is_valid()) {
-      MojoResult rv = MojoClose(handle.value());
-      DCHECK_EQ(rv, MOJO_RESULT_OK);
-    }
-  }
-}
-
-Handle_Data SerializedHandleVector::AddHandle(mojo::Handle handle) {
-  Handle_Data data;
-  if (!handle.is_valid()) {
-    data.value = kEncodedInvalidHandleValue;
-  } else {
-    DCHECK_LT(handles_.size(), std::numeric_limits<uint32_t>::max());
-    data.value = static_cast<uint32_t>(handles_.size());
-    handles_.push_back(handle);
-  }
-  return data;
-}
-
-mojo::Handle SerializedHandleVector::TakeHandle(
-    const Handle_Data& encoded_handle) {
-  if (!encoded_handle.is_valid())
-    return mojo::Handle();
-  DCHECK_LT(encoded_handle.value, handles_.size());
-  return FetchAndReset(&handles_[encoded_handle.value]);
-}
-
-void SerializedHandleVector::Swap(std::vector<mojo::Handle>* other) {
-  handles_.swap(*other);
-}
-
-SerializationContext::SerializationContext() {}
-
-SerializationContext::~SerializationContext() {
-  DCHECK(!custom_contexts || custom_contexts->empty());
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/serialization_context.h b/mojo/public/cpp/bindings/lib/serialization_context.h
deleted file mode 100644
index a34fe3d..0000000
--- a/mojo/public/cpp/bindings/lib/serialization_context.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_SERIALIZATION_CONTEXT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_SERIALIZATION_CONTEXT_H_
-
-#include <stddef.h>
-
-#include <memory>
-#include <queue>
-#include <vector>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace mojo {
-namespace internal {
-
-// A container for handles during serialization/deserialization.
-class MOJO_CPP_BINDINGS_EXPORT SerializedHandleVector {
- public:
-  SerializedHandleVector();
-  ~SerializedHandleVector();
-
-  size_t size() const { return handles_.size(); }
-
-  // Adds a handle to the handle list and returns its index for encoding.
-  Handle_Data AddHandle(mojo::Handle handle);
-
-  // Takes a handle from the list of serialized handle data.
-  mojo::Handle TakeHandle(const Handle_Data& encoded_handle);
-
-  // Takes a handle from the list of serialized handle data and returns it in
-  // |*out_handle| as a specific scoped handle type.
-  template <typename T>
-  ScopedHandleBase<T> TakeHandleAs(const Handle_Data& encoded_handle) {
-    return MakeScopedHandle(T(TakeHandle(encoded_handle).value()));
-  }
-
-  // Swaps all owned handles out with another Handle vector.
-  void Swap(std::vector<mojo::Handle>* other);
-
- private:
-  // Handles are owned by this object.
-  std::vector<mojo::Handle> handles_;
-
-  DISALLOW_COPY_AND_ASSIGN(SerializedHandleVector);
-};
-
-// Context information for serialization/deserialization routines.
-struct MOJO_CPP_BINDINGS_EXPORT SerializationContext {
-  SerializationContext();
-
-  ~SerializationContext();
-
-  // Opaque context pointers returned by StringTraits::SetUpContext().
-  std::unique_ptr<std::queue<void*>> custom_contexts;
-
-  // Stashes handles encoded in a message by index.
-  SerializedHandleVector handles;
-
-  // The number of ScopedInterfaceEndpointHandles that need to be serialized.
-  // It is calculated by PrepareToSerialize().
-  uint32_t associated_endpoint_count = 0;
-
-  // Stashes ScopedInterfaceEndpointHandles encoded in a message by index.
-  std::vector<ScopedInterfaceEndpointHandle> associated_endpoint_handles;
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_SERIALIZATION_CONTEXT_H_
diff --git a/mojo/public/cpp/bindings/lib/serialization_forward.h b/mojo/public/cpp/bindings/lib/serialization_forward.h
deleted file mode 100644
index 55c9982..0000000
--- a/mojo/public/cpp/bindings/lib/serialization_forward.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_FORWARD_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_FORWARD_H_
-
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/array_traits.h"
-#include "mojo/public/cpp/bindings/enum_traits.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-#include "mojo/public/cpp/bindings/map_traits.h"
-#include "mojo/public/cpp/bindings/string_traits.h"
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/union_traits.h"
-
-// This file is included by serialization implementation files to avoid circular
-// includes.
-// Users of the serialization funtions should include serialization.h (and also
-// wtf_serialization.h if necessary).
-
-namespace mojo {
-namespace internal {
-
-template <typename MojomType, typename MaybeConstUserType>
-struct Serializer;
-
-template <typename T>
-struct IsOptionalWrapper {
-  static const bool value = IsSpecializationOf<
-      base::Optional,
-      typename std::remove_const<
-          typename std::remove_reference<T>::type>::type>::value;
-};
-
-// PrepareToSerialize() must be matched by a Serialize() for the same input
-// later. Moreover, within the same SerializationContext if PrepareToSerialize()
-// is called for |input_1|, ..., |input_n|, Serialize() must be called for
-// those objects in the exact same order.
-template <typename MojomType,
-          typename InputUserType,
-          typename... Args,
-          typename std::enable_if<
-              !IsOptionalWrapper<InputUserType>::value>::type* = nullptr>
-size_t PrepareToSerialize(InputUserType&& input, Args&&... args) {
-  return Serializer<MojomType,
-                    typename std::remove_reference<InputUserType>::type>::
-      PrepareToSerialize(std::forward<InputUserType>(input),
-                         std::forward<Args>(args)...);
-}
-
-template <typename MojomType,
-          typename InputUserType,
-          typename... Args,
-          typename std::enable_if<
-              !IsOptionalWrapper<InputUserType>::value>::type* = nullptr>
-void Serialize(InputUserType&& input, Args&&... args) {
-  Serializer<MojomType, typename std::remove_reference<InputUserType>::type>::
-      Serialize(std::forward<InputUserType>(input),
-                std::forward<Args>(args)...);
-}
-
-template <typename MojomType,
-          typename DataType,
-          typename InputUserType,
-          typename... Args,
-          typename std::enable_if<
-              !IsOptionalWrapper<InputUserType>::value>::type* = nullptr>
-bool Deserialize(DataType&& input, InputUserType* output, Args&&... args) {
-  return Serializer<MojomType, InputUserType>::Deserialize(
-      std::forward<DataType>(input), output, std::forward<Args>(args)...);
-}
-
-// Specialization that unwraps base::Optional<>.
-template <typename MojomType,
-          typename InputUserType,
-          typename... Args,
-          typename std::enable_if<
-              IsOptionalWrapper<InputUserType>::value>::type* = nullptr>
-size_t PrepareToSerialize(InputUserType&& input, Args&&... args) {
-  if (!input)
-    return 0;
-  return PrepareToSerialize<MojomType>(*input, std::forward<Args>(args)...);
-}
-
-template <typename MojomType,
-          typename InputUserType,
-          typename DataType,
-          typename... Args,
-          typename std::enable_if<
-              IsOptionalWrapper<InputUserType>::value>::type* = nullptr>
-void Serialize(InputUserType&& input,
-               Buffer* buffer,
-               DataType** output,
-               Args&&... args) {
-  if (!input) {
-    *output = nullptr;
-    return;
-  }
-  Serialize<MojomType>(*input, buffer, output, std::forward<Args>(args)...);
-}
-
-template <typename MojomType,
-          typename DataType,
-          typename InputUserType,
-          typename... Args,
-          typename std::enable_if<
-              IsOptionalWrapper<InputUserType>::value>::type* = nullptr>
-bool Deserialize(DataType&& input, InputUserType* output, Args&&... args) {
-  if (!input) {
-    *output = base::nullopt;
-    return true;
-  }
-  if (!*output)
-    output->emplace();
-  return Deserialize<MojomType>(std::forward<DataType>(input), &output->value(),
-                                std::forward<Args>(args)...);
-}
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_FORWARD_H_
diff --git a/mojo/public/cpp/bindings/lib/serialization_util.h b/mojo/public/cpp/bindings/lib/serialization_util.h
deleted file mode 100644
index 4820a01..0000000
--- a/mojo/public/cpp/bindings/lib/serialization_util.h
+++ /dev/null
@@ -1,213 +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.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_UTIL_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <queue>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename T>
-struct HasIsNullMethod {
-  template <typename U>
-  static char Test(decltype(U::IsNull)*);
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <
-    typename Traits,
-    typename UserType,
-    typename std::enable_if<HasIsNullMethod<Traits>::value>::type* = nullptr>
-bool CallIsNullIfExists(const UserType& input) {
-  return Traits::IsNull(input);
-}
-
-template <
-    typename Traits,
-    typename UserType,
-    typename std::enable_if<!HasIsNullMethod<Traits>::value>::type* = nullptr>
-bool CallIsNullIfExists(const UserType& input) {
-  return false;
-}
-template <typename T>
-struct HasSetToNullMethod {
-  template <typename U>
-  static char Test(decltype(U::SetToNull)*);
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <
-    typename Traits,
-    typename UserType,
-    typename std::enable_if<HasSetToNullMethod<Traits>::value>::type* = nullptr>
-bool CallSetToNullIfExists(UserType* output) {
-  Traits::SetToNull(output);
-  return true;
-}
-
-template <typename Traits,
-          typename UserType,
-          typename std::enable_if<!HasSetToNullMethod<Traits>::value>::type* =
-              nullptr>
-bool CallSetToNullIfExists(UserType* output) {
-  LOG(ERROR) << "A null value is received. But the Struct/Array/StringTraits "
-             << "class doesn't define a SetToNull() function and therefore is "
-             << "unable to deserialize the value.";
-  return false;
-}
-
-template <typename T>
-struct HasSetUpContextMethod {
-  template <typename U>
-  static char Test(decltype(U::SetUpContext)*);
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <typename Traits,
-          bool has_context = HasSetUpContextMethod<Traits>::value>
-struct CustomContextHelper;
-
-template <typename Traits>
-struct CustomContextHelper<Traits, true> {
-  template <typename MaybeConstUserType>
-  static void* SetUp(MaybeConstUserType& input, SerializationContext* context) {
-    void* custom_context = Traits::SetUpContext(input);
-    if (!context->custom_contexts)
-      context->custom_contexts.reset(new std::queue<void*>());
-    context->custom_contexts->push(custom_context);
-    return custom_context;
-  }
-
-  static void* GetNext(SerializationContext* context) {
-    void* custom_context = context->custom_contexts->front();
-    context->custom_contexts->pop();
-    return custom_context;
-  }
-
-  template <typename MaybeConstUserType>
-  static void TearDown(MaybeConstUserType& input, void* custom_context) {
-    Traits::TearDownContext(input, custom_context);
-  }
-};
-
-template <typename Traits>
-struct CustomContextHelper<Traits, false> {
-  template <typename MaybeConstUserType>
-  static void* SetUp(MaybeConstUserType& input, SerializationContext* context) {
-    return nullptr;
-  }
-
-  static void* GetNext(SerializationContext* context) { return nullptr; }
-
-  template <typename MaybeConstUserType>
-  static void TearDown(MaybeConstUserType& input, void* custom_context) {
-    DCHECK(!custom_context);
-  }
-};
-
-template <typename ReturnType, typename ParamType, typename InputUserType>
-ReturnType CallWithContext(ReturnType (*f)(ParamType, void*),
-                           InputUserType&& input,
-                           void* context) {
-  return f(std::forward<InputUserType>(input), context);
-}
-
-template <typename ReturnType, typename ParamType, typename InputUserType>
-ReturnType CallWithContext(ReturnType (*f)(ParamType),
-                           InputUserType&& input,
-                           void* context) {
-  return f(std::forward<InputUserType>(input));
-}
-
-template <typename T, typename MaybeConstUserType>
-struct HasGetBeginMethod {
-  template <typename U>
-  static char Test(decltype(U::GetBegin(std::declval<MaybeConstUserType&>()))*);
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <
-    typename Traits,
-    typename MaybeConstUserType,
-    typename std::enable_if<
-        HasGetBeginMethod<Traits, MaybeConstUserType>::value>::type* = nullptr>
-decltype(Traits::GetBegin(std::declval<MaybeConstUserType&>()))
-CallGetBeginIfExists(MaybeConstUserType& input) {
-  return Traits::GetBegin(input);
-}
-
-template <
-    typename Traits,
-    typename MaybeConstUserType,
-    typename std::enable_if<
-        !HasGetBeginMethod<Traits, MaybeConstUserType>::value>::type* = nullptr>
-size_t CallGetBeginIfExists(MaybeConstUserType& input) {
-  return 0;
-}
-
-template <typename T, typename MaybeConstUserType>
-struct HasGetDataMethod {
-  template <typename U>
-  static char Test(decltype(U::GetData(std::declval<MaybeConstUserType&>()))*);
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <
-    typename Traits,
-    typename MaybeConstUserType,
-    typename std::enable_if<
-        HasGetDataMethod<Traits, MaybeConstUserType>::value>::type* = nullptr>
-decltype(Traits::GetData(std::declval<MaybeConstUserType&>()))
-CallGetDataIfExists(MaybeConstUserType& input) {
-  return Traits::GetData(input);
-}
-
-template <
-    typename Traits,
-    typename MaybeConstUserType,
-    typename std::enable_if<
-        !HasGetDataMethod<Traits, MaybeConstUserType>::value>::type* = nullptr>
-void* CallGetDataIfExists(MaybeConstUserType& input) {
-  return nullptr;
-}
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_UTIL_H_
diff --git a/mojo/public/cpp/bindings/lib/string_serialization.h b/mojo/public/cpp/bindings/lib/string_serialization.h
deleted file mode 100644
index 6e0c758..0000000
--- a/mojo/public/cpp/bindings/lib/string_serialization.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_
-
-#include <stddef.h>
-#include <string.h>
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/string_data_view.h"
-#include "mojo/public/cpp/bindings/string_traits.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename MaybeConstUserType>
-struct Serializer<StringDataView, MaybeConstUserType> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = StringTraits<UserType>;
-
-  static size_t PrepareToSerialize(MaybeConstUserType& input,
-                                   SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input))
-      return 0;
-
-    void* custom_context = CustomContextHelper<Traits>::SetUp(input, context);
-    return Align(sizeof(String_Data) +
-                 CallWithContext(Traits::GetSize, input, custom_context));
-  }
-
-  static void Serialize(MaybeConstUserType& input,
-                        Buffer* buffer,
-                        String_Data** output,
-                        SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input)) {
-      *output = nullptr;
-      return;
-    }
-
-    void* custom_context = CustomContextHelper<Traits>::GetNext(context);
-
-    String_Data* result = String_Data::New(
-        CallWithContext(Traits::GetSize, input, custom_context), buffer);
-    if (result) {
-      memcpy(result->storage(),
-             CallWithContext(Traits::GetData, input, custom_context),
-             CallWithContext(Traits::GetSize, input, custom_context));
-    }
-    *output = result;
-
-    CustomContextHelper<Traits>::TearDown(input, custom_context);
-  }
-
-  static bool Deserialize(String_Data* input,
-                          UserType* output,
-                          SerializationContext* context) {
-    if (!input)
-      return CallSetToNullIfExists<Traits>(output);
-    return Traits::Read(StringDataView(input, context), output);
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/string_traits_string16.cc b/mojo/public/cpp/bindings/lib/string_traits_string16.cc
deleted file mode 100644
index 95ff6cc..0000000
--- a/mojo/public/cpp/bindings/lib/string_traits_string16.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/string_traits_string16.h"
-
-#include <string>
-
-#include "base/strings/utf_string_conversions.h"
-
-namespace mojo {
-
-// static
-void* StringTraits<base::string16>::SetUpContext(const base::string16& input) {
-  return new std::string(base::UTF16ToUTF8(input));
-}
-
-// static
-void StringTraits<base::string16>::TearDownContext(const base::string16& input,
-                                                   void* context) {
-  delete static_cast<std::string*>(context);
-}
-
-// static
-size_t StringTraits<base::string16>::GetSize(const base::string16& input,
-                                             void* context) {
-  return static_cast<std::string*>(context)->size();
-}
-
-// static
-const char* StringTraits<base::string16>::GetData(const base::string16& input,
-                                                  void* context) {
-  return static_cast<std::string*>(context)->data();
-}
-
-// static
-bool StringTraits<base::string16>::Read(StringDataView input,
-                                        base::string16* output) {
-  return base::UTF8ToUTF16(input.storage(), input.size(), output);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/string_traits_wtf.cc b/mojo/public/cpp/bindings/lib/string_traits_wtf.cc
deleted file mode 100644
index 203f6f5..0000000
--- a/mojo/public/cpp/bindings/lib/string_traits_wtf.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/string_traits_wtf.h"
-
-#include <string.h>
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "third_party/WebKit/Source/wtf/text/StringUTF8Adaptor.h"
-
-namespace mojo {
-namespace {
-
-struct UTF8AdaptorInfo {
-  explicit UTF8AdaptorInfo(const WTF::String& input) : utf8_adaptor(input) {
-#if DCHECK_IS_ON()
-    original_size_in_bytes = input.charactersSizeInBytes();
-#endif
-  }
-
-  ~UTF8AdaptorInfo() {}
-
-  WTF::StringUTF8Adaptor utf8_adaptor;
-
-#if DCHECK_IS_ON()
-  // For sanity check only.
-  size_t original_size_in_bytes;
-#endif
-};
-
-UTF8AdaptorInfo* ToAdaptor(const WTF::String& input, void* context) {
-  UTF8AdaptorInfo* adaptor = static_cast<UTF8AdaptorInfo*>(context);
-
-#if DCHECK_IS_ON()
-  DCHECK_EQ(adaptor->original_size_in_bytes, input.charactersSizeInBytes());
-#endif
-  return adaptor;
-}
-
-}  // namespace
-
-// static
-void StringTraits<WTF::String>::SetToNull(WTF::String* output) {
-  if (output->isNull())
-    return;
-
-  WTF::String result;
-  output->swap(result);
-}
-
-// static
-void* StringTraits<WTF::String>::SetUpContext(const WTF::String& input) {
-  return new UTF8AdaptorInfo(input);
-}
-
-// static
-void StringTraits<WTF::String>::TearDownContext(const WTF::String& input,
-                                                void* context) {
-  delete ToAdaptor(input, context);
-}
-
-// static
-size_t StringTraits<WTF::String>::GetSize(const WTF::String& input,
-                                          void* context) {
-  return ToAdaptor(input, context)->utf8_adaptor.length();
-}
-
-// static
-const char* StringTraits<WTF::String>::GetData(const WTF::String& input,
-                                               void* context) {
-  return ToAdaptor(input, context)->utf8_adaptor.data();
-}
-
-// static
-bool StringTraits<WTF::String>::Read(StringDataView input,
-                                     WTF::String* output) {
-  WTF::String result = WTF::String::fromUTF8(input.storage(), input.size());
-  output->swap(result);
-  return true;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/sync_call_restrictions.cc b/mojo/public/cpp/bindings/lib/sync_call_restrictions.cc
deleted file mode 100644
index 585a8f0..0000000
--- a/mojo/public/cpp/bindings/lib/sync_call_restrictions.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/sync_call_restrictions.h"
-
-#if ENABLE_SYNC_CALL_RESTRICTIONS
-
-#include "base/debug/leak_annotations.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/threading/thread_local.h"
-#include "mojo/public/c/system/core.h"
-
-namespace mojo {
-
-namespace {
-
-class SyncCallSettings {
- public:
-  static SyncCallSettings* current();
-
-  bool allowed() const {
-    return scoped_allow_count_ > 0 || system_defined_value_;
-  }
-
-  void IncreaseScopedAllowCount() { scoped_allow_count_++; }
-  void DecreaseScopedAllowCount() {
-    DCHECK_LT(0u, scoped_allow_count_);
-    scoped_allow_count_--;
-  }
-
- private:
-  SyncCallSettings();
-  ~SyncCallSettings();
-
-  bool system_defined_value_ = true;
-  size_t scoped_allow_count_ = 0;
-};
-
-base::LazyInstance<base::ThreadLocalPointer<SyncCallSettings>>::DestructorAtExit
-    g_sync_call_settings = LAZY_INSTANCE_INITIALIZER;
-
-// static
-SyncCallSettings* SyncCallSettings::current() {
-  SyncCallSettings* result = g_sync_call_settings.Pointer()->Get();
-  if (!result) {
-    result = new SyncCallSettings();
-    ANNOTATE_LEAKING_OBJECT_PTR(result);
-    DCHECK_EQ(result, g_sync_call_settings.Pointer()->Get());
-  }
-  return result;
-}
-
-SyncCallSettings::SyncCallSettings() {
-  MojoResult result = MojoGetProperty(MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED,
-                                      &system_defined_value_);
-  DCHECK_EQ(MOJO_RESULT_OK, result);
-
-  DCHECK(!g_sync_call_settings.Pointer()->Get());
-  g_sync_call_settings.Pointer()->Set(this);
-}
-
-SyncCallSettings::~SyncCallSettings() {
-  g_sync_call_settings.Pointer()->Set(nullptr);
-}
-
-}  // namespace
-
-// static
-void SyncCallRestrictions::AssertSyncCallAllowed() {
-  if (!SyncCallSettings::current()->allowed()) {
-      LOG(FATAL) << "Mojo sync calls are not allowed in this process because "
-                 << "they can lead to jank and deadlock. If you must make an "
-                 << "exception, please see "
-                 << "SyncCallRestrictions::ScopedAllowSyncCall and consult "
-                 << "mojo/OWNERS.";
-  }
-}
-
-// static
-void SyncCallRestrictions::IncreaseScopedAllowCount() {
-  SyncCallSettings::current()->IncreaseScopedAllowCount();
-}
-
-// static
-void SyncCallRestrictions::DecreaseScopedAllowCount() {
-  SyncCallSettings::current()->DecreaseScopedAllowCount();
-}
-
-}  // namespace mojo
-
-#endif  // ENABLE_SYNC_CALL_RESTRICTIONS
diff --git a/mojo/public/cpp/bindings/lib/sync_event_watcher.cc b/mojo/public/cpp/bindings/lib/sync_event_watcher.cc
deleted file mode 100644
index b1c97e3..0000000
--- a/mojo/public/cpp/bindings/lib/sync_event_watcher.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/sync_event_watcher.h"
-
-#include "base/logging.h"
-
-namespace mojo {
-
-SyncEventWatcher::SyncEventWatcher(base::WaitableEvent* event,
-                                   const base::Closure& callback)
-    : event_(event),
-      callback_(callback),
-      registry_(SyncHandleRegistry::current()),
-      destroyed_(new base::RefCountedData<bool>(false)) {}
-
-SyncEventWatcher::~SyncEventWatcher() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  if (registered_)
-    registry_->UnregisterEvent(event_);
-  destroyed_->data = true;
-}
-
-void SyncEventWatcher::AllowWokenUpBySyncWatchOnSameThread() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  IncrementRegisterCount();
-}
-
-bool SyncEventWatcher::SyncWatch(const bool* should_stop) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  IncrementRegisterCount();
-  if (!registered_) {
-    DecrementRegisterCount();
-    return false;
-  }
-
-  // This object may be destroyed during the Wait() call. So we have to preserve
-  // the boolean that Wait uses.
-  auto destroyed = destroyed_;
-  const bool* should_stop_array[] = {should_stop, &destroyed->data};
-  bool result = registry_->Wait(should_stop_array, 2);
-
-  // This object has been destroyed.
-  if (destroyed->data)
-    return false;
-
-  DecrementRegisterCount();
-  return result;
-}
-
-void SyncEventWatcher::IncrementRegisterCount() {
-  register_request_count_++;
-  if (!registered_)
-    registered_ = registry_->RegisterEvent(event_, callback_);
-}
-
-void SyncEventWatcher::DecrementRegisterCount() {
-  DCHECK_GT(register_request_count_, 0u);
-  register_request_count_--;
-  if (register_request_count_ == 0 && registered_) {
-    registry_->UnregisterEvent(event_);
-    registered_ = false;
-  }
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/sync_handle_registry.cc b/mojo/public/cpp/bindings/lib/sync_handle_registry.cc
deleted file mode 100644
index fd3df39..0000000
--- a/mojo/public/cpp/bindings/lib/sync_handle_registry.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/sync_handle_registry.h"
-
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/stl_util.h"
-#include "base/threading/thread_local.h"
-#include "mojo/public/c/system/core.h"
-
-namespace mojo {
-namespace {
-
-base::LazyInstance<base::ThreadLocalPointer<SyncHandleRegistry>>::Leaky
-    g_current_sync_handle_watcher = LAZY_INSTANCE_INITIALIZER;
-
-}  // namespace
-
-// static
-scoped_refptr<SyncHandleRegistry> SyncHandleRegistry::current() {
-  scoped_refptr<SyncHandleRegistry> result(
-      g_current_sync_handle_watcher.Pointer()->Get());
-  if (!result) {
-    result = new SyncHandleRegistry();
-    DCHECK_EQ(result.get(), g_current_sync_handle_watcher.Pointer()->Get());
-  }
-  return result;
-}
-
-bool SyncHandleRegistry::RegisterHandle(const Handle& handle,
-                                        MojoHandleSignals handle_signals,
-                                        const HandleCallback& callback) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (base::ContainsKey(handles_, handle))
-    return false;
-
-  MojoResult result = wait_set_.AddHandle(handle, handle_signals);
-  if (result != MOJO_RESULT_OK)
-    return false;
-
-  handles_[handle] = callback;
-  return true;
-}
-
-void SyncHandleRegistry::UnregisterHandle(const Handle& handle) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  if (!base::ContainsKey(handles_, handle))
-    return;
-
-  MojoResult result = wait_set_.RemoveHandle(handle);
-  DCHECK_EQ(MOJO_RESULT_OK, result);
-  handles_.erase(handle);
-}
-
-bool SyncHandleRegistry::RegisterEvent(base::WaitableEvent* event,
-                                       const base::Closure& callback) {
-  auto result = events_.insert({event, callback});
-  DCHECK(result.second);
-  MojoResult rv = wait_set_.AddEvent(event);
-  if (rv == MOJO_RESULT_OK)
-    return true;
-  DCHECK_EQ(MOJO_RESULT_ALREADY_EXISTS, rv);
-  return false;
-}
-
-void SyncHandleRegistry::UnregisterEvent(base::WaitableEvent* event) {
-  auto it = events_.find(event);
-  DCHECK(it != events_.end());
-  events_.erase(it);
-  MojoResult rv = wait_set_.RemoveEvent(event);
-  DCHECK_EQ(MOJO_RESULT_OK, rv);
-}
-
-bool SyncHandleRegistry::Wait(const bool* should_stop[], size_t count) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  size_t num_ready_handles;
-  Handle ready_handle;
-  MojoResult ready_handle_result;
-
-  scoped_refptr<SyncHandleRegistry> preserver(this);
-  while (true) {
-    for (size_t i = 0; i < count; ++i)
-      if (*should_stop[i])
-        return true;
-
-    // TODO(yzshen): Theoretically it can reduce sync call re-entrancy if we
-    // give priority to the handle that is waiting for sync response.
-    base::WaitableEvent* ready_event = nullptr;
-    num_ready_handles = 1;
-    wait_set_.Wait(&ready_event, &num_ready_handles, &ready_handle,
-                   &ready_handle_result);
-    if (num_ready_handles) {
-      DCHECK_EQ(1u, num_ready_handles);
-      const auto iter = handles_.find(ready_handle);
-      iter->second.Run(ready_handle_result);
-    }
-
-    if (ready_event) {
-      const auto iter = events_.find(ready_event);
-      DCHECK(iter != events_.end());
-      iter->second.Run();
-    }
-  };
-
-  return false;
-}
-
-SyncHandleRegistry::SyncHandleRegistry() {
-  DCHECK(!g_current_sync_handle_watcher.Pointer()->Get());
-  g_current_sync_handle_watcher.Pointer()->Set(this);
-}
-
-SyncHandleRegistry::~SyncHandleRegistry() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // This object may be destructed after the thread local storage slot used by
-  // |g_current_sync_handle_watcher| is reset during thread shutdown.
-  // For example, another slot in the thread local storage holds a referrence to
-  // this object, and that slot is cleaned up after
-  // |g_current_sync_handle_watcher|.
-  if (!g_current_sync_handle_watcher.Pointer()->Get())
-    return;
-
-  // If this breaks, it is likely that the global variable is bulit into and
-  // accessed from multiple modules.
-  DCHECK_EQ(this, g_current_sync_handle_watcher.Pointer()->Get());
-
-  g_current_sync_handle_watcher.Pointer()->Set(nullptr);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/sync_handle_watcher.cc b/mojo/public/cpp/bindings/lib/sync_handle_watcher.cc
deleted file mode 100644
index f20af56..0000000
--- a/mojo/public/cpp/bindings/lib/sync_handle_watcher.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/sync_handle_watcher.h"
-
-#include "base/logging.h"
-
-namespace mojo {
-
-SyncHandleWatcher::SyncHandleWatcher(
-    const Handle& handle,
-    MojoHandleSignals handle_signals,
-    const SyncHandleRegistry::HandleCallback& callback)
-    : handle_(handle),
-      handle_signals_(handle_signals),
-      callback_(callback),
-      registered_(false),
-      register_request_count_(0),
-      registry_(SyncHandleRegistry::current()),
-      destroyed_(new base::RefCountedData<bool>(false)) {}
-
-SyncHandleWatcher::~SyncHandleWatcher() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  if (registered_)
-    registry_->UnregisterHandle(handle_);
-
-  destroyed_->data = true;
-}
-
-void SyncHandleWatcher::AllowWokenUpBySyncWatchOnSameThread() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  IncrementRegisterCount();
-}
-
-bool SyncHandleWatcher::SyncWatch(const bool* should_stop) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  IncrementRegisterCount();
-  if (!registered_) {
-    DecrementRegisterCount();
-    return false;
-  }
-
-  // This object may be destroyed during the Wait() call. So we have to preserve
-  // the boolean that Wait uses.
-  auto destroyed = destroyed_;
-  const bool* should_stop_array[] = {should_stop, &destroyed->data};
-  bool result = registry_->Wait(should_stop_array, 2);
-
-  // This object has been destroyed.
-  if (destroyed->data)
-    return false;
-
-  DecrementRegisterCount();
-  return result;
-}
-
-void SyncHandleWatcher::IncrementRegisterCount() {
-  register_request_count_++;
-  if (!registered_) {
-    registered_ =
-        registry_->RegisterHandle(handle_, handle_signals_, callback_);
-  }
-}
-
-void SyncHandleWatcher::DecrementRegisterCount() {
-  DCHECK_GT(register_request_count_, 0u);
-
-  register_request_count_--;
-  if (register_request_count_ == 0 && registered_) {
-    registry_->UnregisterHandle(handle_);
-    registered_ = false;
-  }
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/template_util.h b/mojo/public/cpp/bindings/lib/template_util.h
deleted file mode 100644
index 5151123..0000000
--- a/mojo/public/cpp/bindings/lib/template_util.h
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_TEMPLATE_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_TEMPLATE_UTIL_H_
-
-#include <type_traits>
-
-namespace mojo {
-namespace internal {
-
-template <class T, T v>
-struct IntegralConstant {
-  static const T value = v;
-};
-
-template <class T, T v>
-const T IntegralConstant<T, v>::value;
-
-typedef IntegralConstant<bool, true> TrueType;
-typedef IntegralConstant<bool, false> FalseType;
-
-template <class T>
-struct IsConst : FalseType {};
-template <class T>
-struct IsConst<const T> : TrueType {};
-
-template <class T>
-struct IsPointer : FalseType {};
-template <class T>
-struct IsPointer<T*> : TrueType {};
-
-template <bool B, typename T = void>
-struct EnableIf {};
-
-template <typename T>
-struct EnableIf<true, T> {
-  typedef T type;
-};
-
-// Types YesType and NoType are guaranteed such that sizeof(YesType) <
-// sizeof(NoType).
-typedef char YesType;
-
-struct NoType {
-  YesType dummy[2];
-};
-
-// A helper template to determine if given type is non-const move-only-type,
-// i.e. if a value of the given type should be passed via std::move() in a
-// destructive way.
-template <typename T>
-struct IsMoveOnlyType {
-  static const bool value = std::is_constructible<T, T&&>::value &&
-                            !std::is_constructible<T, const T&>::value;
-};
-
-// This goop is a trick used to implement a template that can be used to
-// determine if a given class is the base class of another given class.
-template <typename, typename>
-struct IsSame {
-  static bool const value = false;
-};
-template <typename A>
-struct IsSame<A, A> {
-  static bool const value = true;
-};
-
-template <typename T>
-struct EnsureTypeIsComplete {
-  // sizeof() cannot be applied to incomplete types, this line will fail
-  // compilation if T is forward declaration.
-  using CheckSize = char (*)[sizeof(T)];
-};
-
-template <typename Base, typename Derived>
-struct IsBaseOf {
- private:
-  static Derived* CreateDerived();
-  static char(&Check(Base*))[1];
-  static char(&Check(...))[2];
-
-  EnsureTypeIsComplete<Base> check_base_;
-  EnsureTypeIsComplete<Derived> check_derived_;
-
- public:
-  static bool const value = sizeof Check(CreateDerived()) == 1 &&
-                            !IsSame<Base const, void const>::value;
-};
-
-template <class T>
-struct RemovePointer {
-  typedef T type;
-};
-template <class T>
-struct RemovePointer<T*> {
-  typedef T type;
-};
-
-template <template <typename...> class Template, typename T>
-struct IsSpecializationOf : FalseType {};
-
-template <template <typename...> class Template, typename... Args>
-struct IsSpecializationOf<Template, Template<Args...>> : TrueType {};
-
-template <bool B, typename T, typename F>
-struct Conditional {
-  typedef T type;
-};
-
-template <typename T, typename F>
-struct Conditional<false, T, F> {
-  typedef F type;
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_TEMPLATE_UTIL_H_
diff --git a/mojo/public/cpp/bindings/lib/union_accessor.h b/mojo/public/cpp/bindings/lib/union_accessor.h
deleted file mode 100644
index 821aede..0000000
--- a/mojo/public/cpp/bindings/lib/union_accessor.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_LIB_UNION_ACCESSOR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_UNION_ACCESSOR_H_
-
-namespace mojo {
-namespace internal {
-
-// When serializing and deserializing Unions, it is necessary to access
-// the private fields and methods of the Union. This allows us to do that
-// without leaking those same fields and methods in the Union interface.
-// All Union wrappers are friends of this class allowing such access.
-template <typename U>
-class UnionAccessor {
- public:
-  explicit UnionAccessor(U* u) : u_(u) {}
-
-  typename U::Union_* data() { return &(u_->data_); }
-
-  typename U::Tag* tag() { return &(u_->tag_); }
-
-  void SwitchActive(typename U::Tag new_tag) { u_->SwitchActive(new_tag); }
-
- private:
-  U* u_;
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_UNION_ACCESSOR_H_
diff --git a/mojo/public/cpp/bindings/lib/validate_params.h b/mojo/public/cpp/bindings/lib/validate_params.h
deleted file mode 100644
index c0ee8e0..0000000
--- a/mojo/public/cpp/bindings/lib/validate_params.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATE_PARAMS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATE_PARAMS_H_
-
-#include <stdint.h>
-
-#include "base/macros.h"
-
-namespace mojo {
-namespace internal {
-
-class ValidationContext;
-
-using ValidateEnumFunc = bool (*)(int32_t, ValidationContext*);
-
-class ContainerValidateParams {
- public:
-  // Validates a map. A map is validated as a pair of arrays, one for the keys
-  // and one for the values. Both arguments must be non-null.
-  //
-  // ContainerValidateParams takes ownership of |in_key_validate params| and
-  // |in_element_validate params|.
-  ContainerValidateParams(ContainerValidateParams* in_key_validate_params,
-                          ContainerValidateParams* in_element_validate_params)
-      : key_validate_params(in_key_validate_params),
-        element_validate_params(in_element_validate_params) {
-    DCHECK(in_key_validate_params)
-        << "Map validate params require key validate params";
-    DCHECK(in_element_validate_params)
-        << "Map validate params require element validate params";
-  }
-
-  // Validates an array.
-  //
-  // ContainerValidateParams takes ownership of |in_element_validate params|.
-  ContainerValidateParams(uint32_t in_expected_num_elements,
-                          bool in_element_is_nullable,
-                          ContainerValidateParams* in_element_validate_params)
-      : expected_num_elements(in_expected_num_elements),
-        element_is_nullable(in_element_is_nullable),
-        element_validate_params(in_element_validate_params) {}
-
-  // Validates an array of enums.
-  ContainerValidateParams(uint32_t in_expected_num_elements,
-                          ValidateEnumFunc in_validate_enum_func)
-      : expected_num_elements(in_expected_num_elements),
-        validate_enum_func(in_validate_enum_func) {}
-
-  ~ContainerValidateParams() {
-    if (element_validate_params)
-      delete element_validate_params;
-    if (key_validate_params)
-      delete key_validate_params;
-  }
-
-  // If |expected_num_elements| is not 0, the array is expected to have exactly
-  // that number of elements.
-  uint32_t expected_num_elements = 0;
-
-  // Whether the elements are nullable.
-  bool element_is_nullable = false;
-
-  // Validation information for the map key array. May contain other
-  // ArrayValidateParams e.g. if the keys are strings.
-  ContainerValidateParams* key_validate_params = nullptr;
-
-  // For arrays: validation information for elements. It is either a pointer to
-  // another instance of ArrayValidateParams (if elements are arrays or maps),
-  // or nullptr.
-  //
-  // For maps: validation information for the whole value array. May contain
-  // other ArrayValidateParams e.g. if the values are arrays or maps.
-  ContainerValidateParams* element_validate_params = nullptr;
-
-  // Validation function for enum elements.
-  ValidateEnumFunc validate_enum_func = nullptr;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ContainerValidateParams);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATE_PARAMS_H_
diff --git a/mojo/public/cpp/bindings/lib/validation_context.cc b/mojo/public/cpp/bindings/lib/validation_context.cc
deleted file mode 100644
index ad0a364..0000000
--- a/mojo/public/cpp/bindings/lib/validation_context.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace internal {
-
-ValidationContext::ValidationContext(const void* data,
-                                     size_t data_num_bytes,
-                                     size_t num_handles,
-                                     size_t num_associated_endpoint_handles,
-                                     Message* message,
-                                     const base::StringPiece& description,
-                                     int stack_depth)
-    : message_(message),
-      description_(description),
-      data_begin_(reinterpret_cast<uintptr_t>(data)),
-      data_end_(data_begin_ + data_num_bytes),
-      handle_begin_(0),
-      handle_end_(static_cast<uint32_t>(num_handles)),
-      associated_endpoint_handle_begin_(0),
-      associated_endpoint_handle_end_(
-          static_cast<uint32_t>(num_associated_endpoint_handles)),
-      stack_depth_(stack_depth) {
-  // Check whether the calculation of |data_end_| or static_cast from size_t to
-  // uint32_t causes overflow.
-  // They shouldn't happen but they do, set the corresponding range to empty.
-  if (data_end_ < data_begin_) {
-    NOTREACHED();
-    data_end_ = data_begin_;
-  }
-  if (handle_end_ < num_handles) {
-    NOTREACHED();
-    handle_end_ = 0;
-  }
-  if (associated_endpoint_handle_end_ < num_associated_endpoint_handles) {
-    NOTREACHED();
-    associated_endpoint_handle_end_ = 0;
-  }
-}
-
-ValidationContext::~ValidationContext() {
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/validation_context.h b/mojo/public/cpp/bindings/lib/validation_context.h
deleted file mode 100644
index ed6c654..0000000
--- a/mojo/public/cpp/bindings/lib/validation_context.h
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_CONTEXT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_CONTEXT_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-
-static const int kMaxRecursionDepth = 100;
-
-namespace mojo {
-
-class Message;
-
-namespace internal {
-
-// ValidationContext is used when validating object sizes, pointers and handle
-// indices in the payload of incoming messages.
-class MOJO_CPP_BINDINGS_EXPORT ValidationContext {
- public:
-  // [data, data + data_num_bytes) specifies the initial valid memory range.
-  // [0, num_handles) specifies the initial valid range of handle indices.
-  // [0, num_associated_endpoint_handles) specifies the initial valid range of
-  // associated endpoint handle indices.
-  //
-  // If provided, |message| and |description| provide additional information
-  // to use when reporting validation errors. In addition if |message| is
-  // provided, the MojoNotifyBadMessage API will be used to notify the system of
-  // such errors.
-  ValidationContext(const void* data,
-                    size_t data_num_bytes,
-                    size_t num_handles,
-                    size_t num_associated_endpoint_handles,
-                    Message* message = nullptr,
-                    const base::StringPiece& description = "",
-                    int stack_depth = 0);
-
-  ~ValidationContext();
-
-  // Claims the specified memory range.
-  // The method succeeds if the range is valid to claim. (Please see
-  // the comments for IsValidRange().)
-  // On success, the valid memory range is shrinked to begin right after the end
-  // of the claimed range.
-  bool ClaimMemory(const void* position, uint32_t num_bytes) {
-    uintptr_t begin = reinterpret_cast<uintptr_t>(position);
-    uintptr_t end = begin + num_bytes;
-
-    if (!InternalIsValidRange(begin, end))
-      return false;
-
-    data_begin_ = end;
-    return true;
-  }
-
-  // Claims the specified encoded handle (which is basically a handle index).
-  // The method succeeds if:
-  // - |encoded_handle|'s value is |kEncodedInvalidHandleValue|.
-  // - the handle is contained inside the valid range of handle indices. In this
-  // case, the valid range is shinked to begin right after the claimed handle.
-  bool ClaimHandle(const Handle_Data& encoded_handle) {
-    uint32_t index = encoded_handle.value;
-    if (index == kEncodedInvalidHandleValue)
-      return true;
-
-    if (index < handle_begin_ || index >= handle_end_)
-      return false;
-
-    // |index| + 1 shouldn't overflow, because |index| is not the max value of
-    // uint32_t (it is less than |handle_end_|).
-    handle_begin_ = index + 1;
-    return true;
-  }
-
-  // Claims the specified encoded associated endpoint handle.
-  // The method succeeds if:
-  // - |encoded_handle|'s value is |kEncodedInvalidHandleValue|.
-  // - the handle is contained inside the valid range of associated endpoint
-  //   handle indices. In this case, the valid range is shinked to begin right
-  //   after the claimed handle.
-  bool ClaimAssociatedEndpointHandle(
-      const AssociatedEndpointHandle_Data& encoded_handle) {
-    uint32_t index = encoded_handle.value;
-    if (index == kEncodedInvalidHandleValue)
-      return true;
-
-    if (index < associated_endpoint_handle_begin_ ||
-        index >= associated_endpoint_handle_end_)
-      return false;
-
-    // |index| + 1 shouldn't overflow, because |index| is not the max value of
-    // uint32_t (it is less than |associated_endpoint_handle_end_|).
-    associated_endpoint_handle_begin_ = index + 1;
-    return true;
-  }
-
-  // Returns true if the specified range is not empty, and the range is
-  // contained inside the valid memory range.
-  bool IsValidRange(const void* position, uint32_t num_bytes) const {
-    uintptr_t begin = reinterpret_cast<uintptr_t>(position);
-    uintptr_t end = begin + num_bytes;
-
-    return InternalIsValidRange(begin, end);
-  }
-
-  // This object should be created on the stack once every time we recurse down
-  // into a subfield during validation to make sure we don't recurse too deep
-  // and blow the stack.
-  class ScopedDepthTracker {
-   public:
-    // |ctx| must outlive this object.
-    explicit ScopedDepthTracker(ValidationContext* ctx) : ctx_(ctx) {
-      ++ctx_->stack_depth_;
-    }
-
-    ~ScopedDepthTracker() { --ctx_->stack_depth_; }
-
-   private:
-    ValidationContext* ctx_;
-
-    DISALLOW_COPY_AND_ASSIGN(ScopedDepthTracker);
-  };
-
-  // Returns true if the recursion depth limit has been reached.
-  bool ExceedsMaxDepth() WARN_UNUSED_RESULT {
-    return stack_depth_ > kMaxRecursionDepth;
-  }
-
-  Message* message() const { return message_; }
-  const base::StringPiece& description() const { return description_; }
-
- private:
-  bool InternalIsValidRange(uintptr_t begin, uintptr_t end) const {
-    return end > begin && begin >= data_begin_ && end <= data_end_;
-  }
-
-  Message* const message_;
-  const base::StringPiece description_;
-
-  // [data_begin_, data_end_) is the valid memory range.
-  uintptr_t data_begin_;
-  uintptr_t data_end_;
-
-  // [handle_begin_, handle_end_) is the valid handle index range.
-  uint32_t handle_begin_;
-  uint32_t handle_end_;
-
-  // [associated_endpoint_handle_begin_, associated_endpoint_handle_end_) is the
-  // valid associated endpoint handle index range.
-  uint32_t associated_endpoint_handle_begin_;
-  uint32_t associated_endpoint_handle_end_;
-
-  int stack_depth_;
-
-  DISALLOW_COPY_AND_ASSIGN(ValidationContext);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_CONTEXT_H_
diff --git a/mojo/public/cpp/bindings/lib/validation_errors.cc b/mojo/public/cpp/bindings/lib/validation_errors.cc
deleted file mode 100644
index 904f5e4..0000000
--- a/mojo/public/cpp/bindings/lib/validation_errors.cc
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-
-#include "base/strings/stringprintf.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-namespace internal {
-namespace {
-
-ValidationErrorObserverForTesting* g_validation_error_observer = nullptr;
-SerializationWarningObserverForTesting* g_serialization_warning_observer =
-    nullptr;
-bool g_suppress_logging = false;
-
-}  // namespace
-
-const char* ValidationErrorToString(ValidationError error) {
-  switch (error) {
-    case VALIDATION_ERROR_NONE:
-      return "VALIDATION_ERROR_NONE";
-    case VALIDATION_ERROR_MISALIGNED_OBJECT:
-      return "VALIDATION_ERROR_MISALIGNED_OBJECT";
-    case VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE:
-      return "VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE";
-    case VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER:
-      return "VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER";
-    case VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER:
-      return "VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER";
-    case VALIDATION_ERROR_ILLEGAL_HANDLE:
-      return "VALIDATION_ERROR_ILLEGAL_HANDLE";
-    case VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE:
-      return "VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE";
-    case VALIDATION_ERROR_ILLEGAL_POINTER:
-      return "VALIDATION_ERROR_ILLEGAL_POINTER";
-    case VALIDATION_ERROR_UNEXPECTED_NULL_POINTER:
-      return "VALIDATION_ERROR_UNEXPECTED_NULL_POINTER";
-    case VALIDATION_ERROR_ILLEGAL_INTERFACE_ID:
-      return "VALIDATION_ERROR_ILLEGAL_INTERFACE_ID";
-    case VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID:
-      return "VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID";
-    case VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS:
-      return "VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS";
-    case VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID:
-      return "VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID";
-    case VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD:
-      return "VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD";
-    case VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP:
-      return "VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP";
-    case VALIDATION_ERROR_UNKNOWN_UNION_TAG:
-      return "VALIDATION_ERROR_UNKNOWN_UNION_TAG";
-    case VALIDATION_ERROR_UNKNOWN_ENUM_VALUE:
-      return "VALIDATION_ERROR_UNKNOWN_ENUM_VALUE";
-    case VALIDATION_ERROR_DESERIALIZATION_FAILED:
-      return "VALIDATION_ERROR_DESERIALIZATION_FAILED";
-    case VALIDATION_ERROR_MAX_RECURSION_DEPTH:
-      return "VALIDATION_ERROR_MAX_RECURSION_DEPTH";
-  }
-
-  return "Unknown error";
-}
-
-void ReportValidationError(ValidationContext* context,
-                           ValidationError error,
-                           const char* description) {
-  if (g_validation_error_observer) {
-    g_validation_error_observer->set_last_error(error);
-    return;
-  }
-
-  if (description) {
-    if (!g_suppress_logging) {
-      LOG(ERROR) << "Invalid message: " << ValidationErrorToString(error)
-                 << " (" << description << ")";
-    }
-    if (context->message()) {
-      context->message()->NotifyBadMessage(
-          base::StringPrintf("Validation failed for %s [%s (%s)]",
-                             context->description().data(),
-                             ValidationErrorToString(error), description));
-    }
-  } else {
-    if (!g_suppress_logging)
-      LOG(ERROR) << "Invalid message: " << ValidationErrorToString(error);
-    if (context->message()) {
-      context->message()->NotifyBadMessage(
-          base::StringPrintf("Validation failed for %s [%s]",
-                             context->description().data(),
-                             ValidationErrorToString(error)));
-    }
-  }
-}
-
-void ReportValidationErrorForMessage(
-    mojo::Message* message,
-    ValidationError error,
-    const char* description) {
-  ValidationContext validation_context(nullptr, 0, 0, 0, message, description);
-  ReportValidationError(&validation_context, error);
-}
-
-ScopedSuppressValidationErrorLoggingForTests
-    ::ScopedSuppressValidationErrorLoggingForTests()
-    : was_suppressed_(g_suppress_logging) {
-  g_suppress_logging = true;
-}
-
-ScopedSuppressValidationErrorLoggingForTests
-    ::~ScopedSuppressValidationErrorLoggingForTests() {
-  g_suppress_logging = was_suppressed_;
-}
-
-ValidationErrorObserverForTesting::ValidationErrorObserverForTesting(
-    const base::Closure& callback)
-    : last_error_(VALIDATION_ERROR_NONE), callback_(callback) {
-  DCHECK(!g_validation_error_observer);
-  g_validation_error_observer = this;
-}
-
-ValidationErrorObserverForTesting::~ValidationErrorObserverForTesting() {
-  DCHECK(g_validation_error_observer == this);
-  g_validation_error_observer = nullptr;
-}
-
-bool ReportSerializationWarning(ValidationError error) {
-  if (g_serialization_warning_observer) {
-    g_serialization_warning_observer->set_last_warning(error);
-    return true;
-  }
-
-  return false;
-}
-
-SerializationWarningObserverForTesting::SerializationWarningObserverForTesting()
-    : last_warning_(VALIDATION_ERROR_NONE) {
-  DCHECK(!g_serialization_warning_observer);
-  g_serialization_warning_observer = this;
-}
-
-SerializationWarningObserverForTesting::
-    ~SerializationWarningObserverForTesting() {
-  DCHECK(g_serialization_warning_observer == this);
-  g_serialization_warning_observer = nullptr;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/validation_errors.h b/mojo/public/cpp/bindings/lib/validation_errors.h
deleted file mode 100644
index 122418d..0000000
--- a/mojo/public/cpp/bindings/lib/validation_errors.h
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_ERRORS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_ERRORS_H_
-
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-
-namespace mojo {
-
-class Message;
-
-namespace internal {
-
-enum ValidationError {
-  // There is no validation error.
-  VALIDATION_ERROR_NONE,
-  // An object (struct or array) is not 8-byte aligned.
-  VALIDATION_ERROR_MISALIGNED_OBJECT,
-  // An object is not contained inside the message data, or it overlaps other
-  // objects.
-  VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE,
-  // A struct header doesn't make sense, for example:
-  // - |num_bytes| is smaller than the size of the struct header.
-  // - |num_bytes| and |version| don't match.
-  // TODO(yzshen): Consider splitting it into two different error codes. Because
-  // the former indicates someone is misbehaving badly whereas the latter could
-  // be due to an inappropriately-modified .mojom file.
-  VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER,
-  // An array header doesn't make sense, for example:
-  // - |num_bytes| is smaller than the size of the header plus the size required
-  // to store |num_elements| elements.
-  // - For fixed-size arrays, |num_elements| is different than the specified
-  // size.
-  VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER,
-  // An encoded handle is illegal.
-  VALIDATION_ERROR_ILLEGAL_HANDLE,
-  // A non-nullable handle field is set to invalid handle.
-  VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-  // An encoded pointer is illegal.
-  VALIDATION_ERROR_ILLEGAL_POINTER,
-  // A non-nullable pointer field is set to null.
-  VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-  // An interface ID is illegal.
-  VALIDATION_ERROR_ILLEGAL_INTERFACE_ID,
-  // A non-nullable interface ID field is set to invalid.
-  VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID,
-  // |flags| in the message header is invalid. The flags are either
-  // inconsistent with one another, inconsistent with other parts of the
-  // message, or unexpected for the message receiver.  For example the
-  // receiver is expecting a request message but the flags indicate that
-  // the message is a response message.
-  VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS,
-  // |flags| in the message header indicates that a request ID is required but
-  // there isn't one.
-  VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID,
-  // The |name| field in a message header contains an unexpected value.
-  VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD,
-  // Two parallel arrays which are supposed to represent a map have different
-  // lengths.
-  VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP,
-  // Attempted to deserialize a tagged union with an unknown tag.
-  VALIDATION_ERROR_UNKNOWN_UNION_TAG,
-  // A value of a non-extensible enum type is unknown.
-  VALIDATION_ERROR_UNKNOWN_ENUM_VALUE,
-  // Message deserialization failure, for example due to rejection by custom
-  // validation logic.
-  VALIDATION_ERROR_DESERIALIZATION_FAILED,
-  // The message contains a too deeply nested value, for example a recursively
-  // defined field which runtime value is too large.
-  VALIDATION_ERROR_MAX_RECURSION_DEPTH,
-};
-
-MOJO_CPP_BINDINGS_EXPORT const char* ValidationErrorToString(
-    ValidationError error);
-
-MOJO_CPP_BINDINGS_EXPORT void ReportValidationError(
-    ValidationContext* context,
-    ValidationError error,
-    const char* description = nullptr);
-
-MOJO_CPP_BINDINGS_EXPORT void ReportValidationErrorForMessage(
-    mojo::Message* message,
-    ValidationError error,
-    const char* description = nullptr);
-
-// This class may be used by tests to suppress validation error logging. This is
-// not thread-safe and must only be instantiated on the main thread with no
-// other threads using Mojo bindings at the time of construction or destruction.
-class MOJO_CPP_BINDINGS_EXPORT ScopedSuppressValidationErrorLoggingForTests {
- public:
-  ScopedSuppressValidationErrorLoggingForTests();
-  ~ScopedSuppressValidationErrorLoggingForTests();
-
- private:
-  const bool was_suppressed_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedSuppressValidationErrorLoggingForTests);
-};
-
-// Only used by validation tests and when there is only one thread doing message
-// validation.
-class MOJO_CPP_BINDINGS_EXPORT ValidationErrorObserverForTesting {
- public:
-  explicit ValidationErrorObserverForTesting(const base::Closure& callback);
-  ~ValidationErrorObserverForTesting();
-
-  ValidationError last_error() const { return last_error_; }
-  void set_last_error(ValidationError error) {
-    last_error_ = error;
-    callback_.Run();
-  }
-
- private:
-  ValidationError last_error_;
-  base::Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(ValidationErrorObserverForTesting);
-};
-
-// Used only by MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING. Don't use it directly.
-//
-// The function returns true if the error is recorded (by a
-// SerializationWarningObserverForTesting object), false otherwise.
-MOJO_CPP_BINDINGS_EXPORT bool ReportSerializationWarning(ValidationError error);
-
-// Only used by serialization tests and when there is only one thread doing
-// message serialization.
-class MOJO_CPP_BINDINGS_EXPORT SerializationWarningObserverForTesting {
- public:
-  SerializationWarningObserverForTesting();
-  ~SerializationWarningObserverForTesting();
-
-  ValidationError last_warning() const { return last_warning_; }
-  void set_last_warning(ValidationError error) { last_warning_ = error; }
-
- private:
-  ValidationError last_warning_;
-
-  DISALLOW_COPY_AND_ASSIGN(SerializationWarningObserverForTesting);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-// In debug build, logs a serialization warning if |condition| evaluates to
-// true:
-//   - if there is a SerializationWarningObserverForTesting object alive,
-//     records |error| in it;
-//   - otherwise, logs a fatal-level message.
-// |error| is the validation error that will be triggered by the receiver
-// of the serialzation result.
-//
-// In non-debug build, does nothing (not even compiling |condition|).
-#define MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(condition, error,    \
-                                                 description)         \
-  DLOG_IF(FATAL, (condition) && !ReportSerializationWarning(error))   \
-      << "The outgoing message will trigger "                         \
-      << ValidationErrorToString(error) << " at the receiving side (" \
-      << description << ").";
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_ERRORS_H_
diff --git a/mojo/public/cpp/bindings/lib/validation_util.cc b/mojo/public/cpp/bindings/lib/validation_util.cc
deleted file mode 100644
index 7614df5..0000000
--- a/mojo/public/cpp/bindings/lib/validation_util.cc
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/lib/validation_util.h"
-
-#include <stdint.h>
-
-#include <limits>
-
-#include "mojo/public/cpp/bindings/lib/message_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
-
-namespace mojo {
-namespace internal {
-
-bool ValidateStructHeaderAndClaimMemory(const void* data,
-                                        ValidationContext* validation_context) {
-  if (!IsAligned(data)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MISALIGNED_OBJECT);
-    return false;
-  }
-  if (!validation_context->IsValidRange(data, sizeof(StructHeader))) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
-    return false;
-  }
-
-  const StructHeader* header = static_cast<const StructHeader*>(data);
-
-  if (header->num_bytes < sizeof(StructHeader)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
-    return false;
-  }
-
-  if (!validation_context->ClaimMemory(data, header->num_bytes)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
-    return false;
-  }
-
-  return true;
-}
-
-bool ValidateNonInlinedUnionHeaderAndClaimMemory(
-    const void* data,
-    ValidationContext* validation_context) {
-  if (!IsAligned(data)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MISALIGNED_OBJECT);
-    return false;
-  }
-
-  if (!validation_context->ClaimMemory(data, kUnionDataSize) ||
-      *static_cast<const uint32_t*>(data) != kUnionDataSize) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
-    return false;
-  }
-
-  return true;
-}
-
-bool ValidateMessageIsRequestWithoutResponse(
-    const Message* message,
-    ValidationContext* validation_context) {
-  if (message->has_flag(Message::kFlagIsResponse) ||
-      message->has_flag(Message::kFlagExpectsResponse)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS);
-    return false;
-  }
-  return true;
-}
-
-bool ValidateMessageIsRequestExpectingResponse(
-    const Message* message,
-    ValidationContext* validation_context) {
-  if (message->has_flag(Message::kFlagIsResponse) ||
-      !message->has_flag(Message::kFlagExpectsResponse)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS);
-    return false;
-  }
-  return true;
-}
-
-bool ValidateMessageIsResponse(const Message* message,
-                               ValidationContext* validation_context) {
-  if (message->has_flag(Message::kFlagExpectsResponse) ||
-      !message->has_flag(Message::kFlagIsResponse)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS);
-    return false;
-  }
-  return true;
-}
-
-bool IsHandleOrInterfaceValid(const AssociatedInterface_Data& input) {
-  return input.handle.is_valid();
-}
-
-bool IsHandleOrInterfaceValid(const AssociatedEndpointHandle_Data& input) {
-  return input.is_valid();
-}
-
-bool IsHandleOrInterfaceValid(const Interface_Data& input) {
-  return input.handle.is_valid();
-}
-
-bool IsHandleOrInterfaceValid(const Handle_Data& input) {
-  return input.is_valid();
-}
-
-bool ValidateHandleOrInterfaceNonNullable(
-    const AssociatedInterface_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context) {
-  if (IsHandleOrInterfaceValid(input))
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID,
-                        error_message);
-  return false;
-}
-
-bool ValidateHandleOrInterfaceNonNullable(
-    const AssociatedEndpointHandle_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context) {
-  if (IsHandleOrInterfaceValid(input))
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID,
-                        error_message);
-  return false;
-}
-
-bool ValidateHandleOrInterfaceNonNullable(
-    const Interface_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context) {
-  if (IsHandleOrInterfaceValid(input))
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-                        error_message);
-  return false;
-}
-
-bool ValidateHandleOrInterfaceNonNullable(
-    const Handle_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context) {
-  if (IsHandleOrInterfaceValid(input))
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-                        error_message);
-  return false;
-}
-
-bool ValidateHandleOrInterface(const AssociatedInterface_Data& input,
-                               ValidationContext* validation_context) {
-  if (validation_context->ClaimAssociatedEndpointHandle(input.handle))
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_ILLEGAL_INTERFACE_ID);
-  return false;
-}
-
-bool ValidateHandleOrInterface(const AssociatedEndpointHandle_Data& input,
-                               ValidationContext* validation_context) {
-  if (validation_context->ClaimAssociatedEndpointHandle(input))
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_ILLEGAL_INTERFACE_ID);
-  return false;
-}
-
-bool ValidateHandleOrInterface(const Interface_Data& input,
-                               ValidationContext* validation_context) {
-  if (validation_context->ClaimHandle(input.handle))
-    return true;
-
-  ReportValidationError(validation_context, VALIDATION_ERROR_ILLEGAL_HANDLE);
-  return false;
-}
-
-bool ValidateHandleOrInterface(const Handle_Data& input,
-                               ValidationContext* validation_context) {
-  if (validation_context->ClaimHandle(input))
-    return true;
-
-  ReportValidationError(validation_context, VALIDATION_ERROR_ILLEGAL_HANDLE);
-  return false;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/validation_util.h b/mojo/public/cpp/bindings/lib/validation_util.h
deleted file mode 100644
index ea5a991..0000000
--- a/mojo/public/cpp/bindings/lib/validation_util.h
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_UTIL_H_
-
-#include <stdint.h>
-
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/lib/validate_params.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-namespace internal {
-
-// Checks whether decoding the pointer will overflow and produce a pointer
-// smaller than |offset|.
-inline bool ValidateEncodedPointer(const uint64_t* offset) {
-  // - Make sure |*offset| is no more than 32-bits.
-  // - Cast |offset| to uintptr_t so overflow behavior is well defined across
-  //   32-bit and 64-bit systems.
-  return *offset <= std::numeric_limits<uint32_t>::max() &&
-         (reinterpret_cast<uintptr_t>(offset) +
-              static_cast<uint32_t>(*offset) >=
-          reinterpret_cast<uintptr_t>(offset));
-}
-
-template <typename T>
-bool ValidatePointer(const Pointer<T>& input,
-                     ValidationContext* validation_context) {
-  bool result = ValidateEncodedPointer(&input.offset);
-  if (!result)
-    ReportValidationError(validation_context, VALIDATION_ERROR_ILLEGAL_POINTER);
-
-  return result;
-}
-
-// Validates that |data| contains a valid struct header, in terms of alignment
-// and size (i.e., the |num_bytes| field of the header is sufficient for storing
-// the header itself). Besides, it checks that the memory range
-// [data, data + num_bytes) is not marked as occupied by other objects in
-// |validation_context|. On success, the memory range is marked as occupied.
-// Note: Does not verify |version| or that |num_bytes| is correct for the
-// claimed version.
-MOJO_CPP_BINDINGS_EXPORT bool ValidateStructHeaderAndClaimMemory(
-    const void* data,
-    ValidationContext* validation_context);
-
-// Validates that |data| contains a valid union header, in terms of alignment
-// and size. It checks that the memory range [data, data + kUnionDataSize) is
-// not marked as occupied by other objects in |validation_context|. On success,
-// the memory range is marked as occupied.
-MOJO_CPP_BINDINGS_EXPORT bool ValidateNonInlinedUnionHeaderAndClaimMemory(
-    const void* data,
-    ValidationContext* validation_context);
-
-// Validates that the message is a request which doesn't expect a response.
-MOJO_CPP_BINDINGS_EXPORT bool ValidateMessageIsRequestWithoutResponse(
-    const Message* message,
-    ValidationContext* validation_context);
-
-// Validates that the message is a request expecting a response.
-MOJO_CPP_BINDINGS_EXPORT bool ValidateMessageIsRequestExpectingResponse(
-    const Message* message,
-    ValidationContext* validation_context);
-
-// Validates that the message is a response.
-MOJO_CPP_BINDINGS_EXPORT bool ValidateMessageIsResponse(
-    const Message* message,
-    ValidationContext* validation_context);
-
-// Validates that the message payload is a valid struct of type ParamsType.
-template <typename ParamsType>
-bool ValidateMessagePayload(const Message* message,
-                            ValidationContext* validation_context) {
-  return ParamsType::Validate(message->payload(), validation_context);
-}
-
-// The following Validate.*NonNullable() functions validate that the given
-// |input| is not null/invalid.
-template <typename T>
-bool ValidatePointerNonNullable(const T& input,
-                                const char* error_message,
-                                ValidationContext* validation_context) {
-  if (input.offset)
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-                        error_message);
-  return false;
-}
-
-template <typename T>
-bool ValidateInlinedUnionNonNullable(const T& input,
-                                     const char* error_message,
-                                     ValidationContext* validation_context) {
-  if (!input.is_null())
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-                        error_message);
-  return false;
-}
-
-MOJO_CPP_BINDINGS_EXPORT bool IsHandleOrInterfaceValid(
-    const AssociatedInterface_Data& input);
-MOJO_CPP_BINDINGS_EXPORT bool IsHandleOrInterfaceValid(
-    const AssociatedEndpointHandle_Data& input);
-MOJO_CPP_BINDINGS_EXPORT bool IsHandleOrInterfaceValid(
-    const Interface_Data& input);
-MOJO_CPP_BINDINGS_EXPORT bool IsHandleOrInterfaceValid(
-    const Handle_Data& input);
-
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterfaceNonNullable(
-    const AssociatedInterface_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context);
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterfaceNonNullable(
-    const AssociatedEndpointHandle_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context);
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterfaceNonNullable(
-    const Interface_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context);
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterfaceNonNullable(
-    const Handle_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context);
-
-template <typename T>
-bool ValidateContainer(const Pointer<T>& input,
-                       ValidationContext* validation_context,
-                       const ContainerValidateParams* validate_params) {
-  ValidationContext::ScopedDepthTracker depth_tracker(validation_context);
-  if (validation_context->ExceedsMaxDepth()) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MAX_RECURSION_DEPTH);
-    return false;
-  }
-  return ValidatePointer(input, validation_context) &&
-         T::Validate(input.Get(), validation_context, validate_params);
-}
-
-template <typename T>
-bool ValidateStruct(const Pointer<T>& input,
-                    ValidationContext* validation_context) {
-  ValidationContext::ScopedDepthTracker depth_tracker(validation_context);
-  if (validation_context->ExceedsMaxDepth()) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MAX_RECURSION_DEPTH);
-    return false;
-  }
-  return ValidatePointer(input, validation_context) &&
-         T::Validate(input.Get(), validation_context);
-}
-
-template <typename T>
-bool ValidateInlinedUnion(const T& input,
-                          ValidationContext* validation_context) {
-  ValidationContext::ScopedDepthTracker depth_tracker(validation_context);
-  if (validation_context->ExceedsMaxDepth()) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MAX_RECURSION_DEPTH);
-    return false;
-  }
-  return T::Validate(&input, validation_context, true);
-}
-
-template <typename T>
-bool ValidateNonInlinedUnion(const Pointer<T>& input,
-                             ValidationContext* validation_context) {
-  ValidationContext::ScopedDepthTracker depth_tracker(validation_context);
-  if (validation_context->ExceedsMaxDepth()) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MAX_RECURSION_DEPTH);
-    return false;
-  }
-  return ValidatePointer(input, validation_context) &&
-         T::Validate(input.Get(), validation_context, false);
-}
-
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterface(
-    const AssociatedInterface_Data& input,
-    ValidationContext* validation_context);
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterface(
-    const AssociatedEndpointHandle_Data& input,
-    ValidationContext* validation_context);
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterface(
-    const Interface_Data& input,
-    ValidationContext* validation_context);
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterface(
-    const Handle_Data& input,
-    ValidationContext* validation_context);
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_UTIL_H_
diff --git a/mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h b/mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h
deleted file mode 100644
index cb24bc4..0000000
--- a/mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_CLONE_EQUALS_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_CLONE_EQUALS_UTIL_H_
-
-#include <type_traits>
-
-#include "mojo/public/cpp/bindings/clone_traits.h"
-#include "mojo/public/cpp/bindings/lib/equals_traits.h"
-#include "third_party/WebKit/Source/wtf/HashMap.h"
-#include "third_party/WebKit/Source/wtf/Optional.h"
-#include "third_party/WebKit/Source/wtf/Vector.h"
-#include "third_party/WebKit/Source/wtf/text/WTFString.h"
-
-namespace mojo {
-
-template <typename T>
-struct CloneTraits<WTF::Vector<T>, false> {
-  static WTF::Vector<T> Clone(const WTF::Vector<T>& input) {
-    WTF::Vector<T> result;
-    result.reserveCapacity(input.size());
-    for (const auto& element : input)
-      result.push_back(mojo::Clone(element));
-
-    return result;
-  }
-};
-
-template <typename K, typename V>
-struct CloneTraits<WTF::HashMap<K, V>, false> {
-  static WTF::HashMap<K, V> Clone(const WTF::HashMap<K, V>& input) {
-    WTF::HashMap<K, V> result;
-    auto input_end = input.end();
-    for (auto it = input.begin(); it != input_end; ++it)
-      result.add(mojo::Clone(it->key), mojo::Clone(it->value));
-    return result;
-  }
-};
-
-namespace internal {
-
-template <typename T>
-struct EqualsTraits<WTF::Vector<T>, false> {
-  static bool Equals(const WTF::Vector<T>& a, const WTF::Vector<T>& b) {
-    if (a.size() != b.size())
-      return false;
-    for (size_t i = 0; i < a.size(); ++i) {
-      if (!internal::Equals(a[i], b[i]))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename K, typename V>
-struct EqualsTraits<WTF::HashMap<K, V>, false> {
-  static bool Equals(const WTF::HashMap<K, V>& a, const WTF::HashMap<K, V>& b) {
-    if (a.size() != b.size())
-      return false;
-
-    auto a_end = a.end();
-    auto b_end = b.end();
-
-    for (auto iter = a.begin(); iter != a_end; ++iter) {
-      auto b_iter = b.find(iter->key);
-      if (b_iter == b_end || !internal::Equals(iter->value, b_iter->value))
-        return false;
-    }
-    return true;
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_CLONE_EQUALS_UTIL_H_
diff --git a/mojo/public/cpp/bindings/lib/wtf_hash_util.h b/mojo/public/cpp/bindings/lib/wtf_hash_util.h
deleted file mode 100644
index cc590da..0000000
--- a/mojo/public/cpp/bindings/lib/wtf_hash_util.h
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_HASH_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_HASH_UTIL_H_
-
-#include <type_traits>
-
-#include "mojo/public/cpp/bindings/lib/hash_util.h"
-#include "mojo/public/cpp/bindings/struct_ptr.h"
-#include "third_party/WebKit/Source/wtf/HashFunctions.h"
-#include "third_party/WebKit/Source/wtf/text/StringHash.h"
-#include "third_party/WebKit/Source/wtf/text/WTFString.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename T>
-size_t WTFHashCombine(size_t seed, const T& value) {
-  // Based on proposal in:
-  // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
-  //
-  // TODO(tibell): We'd like to use WTF::DefaultHash instead of std::hash, but
-  //     there is no general template specialization of DefaultHash for enums
-  //     and there can't be an instance for bool.
-  return seed ^ (std::hash<T>()(value) + (seed << 6) + (seed >> 2));
-}
-
-template <typename T, bool has_hash_method = HasHashMethod<T>::value>
-struct WTFHashTraits;
-
-template <typename T>
-size_t WTFHash(size_t seed, const T& value);
-
-template <typename T>
-struct WTFHashTraits<T, true> {
-  static size_t Hash(size_t seed, const T& value) { return value.Hash(seed); }
-};
-
-template <typename T>
-struct WTFHashTraits<T, false> {
-  static size_t Hash(size_t seed, const T& value) {
-    return WTFHashCombine(seed, value);
-  }
-};
-
-template <>
-struct WTFHashTraits<WTF::String, false> {
-  static size_t Hash(size_t seed, const WTF::String& value) {
-    return HashCombine(seed, WTF::StringHash::hash(value));
-  }
-};
-
-template <typename T>
-size_t WTFHash(size_t seed, const T& value) {
-  return WTFHashTraits<T>::Hash(seed, value);
-}
-
-template <typename T>
-struct StructPtrHashFn {
-  static unsigned hash(const StructPtr<T>& value) {
-    return value.Hash(kHashSeed);
-  }
-  static bool equal(const StructPtr<T>& left, const StructPtr<T>& right) {
-    return left.Equals(right);
-  }
-  static const bool safeToCompareToEmptyOrDeleted = false;
-};
-
-template <typename T>
-struct InlinedStructPtrHashFn {
-  static unsigned hash(const InlinedStructPtr<T>& value) {
-    return value.Hash(kHashSeed);
-  }
-  static bool equal(const InlinedStructPtr<T>& left,
-                    const InlinedStructPtr<T>& right) {
-    return left.Equals(right);
-  }
-  static const bool safeToCompareToEmptyOrDeleted = false;
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-namespace WTF {
-
-template <typename T>
-struct DefaultHash<mojo::StructPtr<T>> {
-  using Hash = mojo::internal::StructPtrHashFn<T>;
-};
-
-template <typename T>
-struct HashTraits<mojo::StructPtr<T>>
-    : public GenericHashTraits<mojo::StructPtr<T>> {
-  static const bool hasIsEmptyValueFunction = true;
-  static bool isEmptyValue(const mojo::StructPtr<T>& value) {
-    return value.is_null();
-  }
-  static void constructDeletedValue(mojo::StructPtr<T>& slot, bool) {
-    mojo::internal::StructPtrWTFHelper<T>::ConstructDeletedValue(slot);
-  }
-  static bool isDeletedValue(const mojo::StructPtr<T>& value) {
-    return mojo::internal::StructPtrWTFHelper<T>::IsHashTableDeletedValue(
-        value);
-  }
-};
-
-template <typename T>
-struct DefaultHash<mojo::InlinedStructPtr<T>> {
-  using Hash = mojo::internal::InlinedStructPtrHashFn<T>;
-};
-
-template <typename T>
-struct HashTraits<mojo::InlinedStructPtr<T>>
-    : public GenericHashTraits<mojo::InlinedStructPtr<T>> {
-  static const bool hasIsEmptyValueFunction = true;
-  static bool isEmptyValue(const mojo::InlinedStructPtr<T>& value) {
-    return value.is_null();
-  }
-  static void constructDeletedValue(mojo::InlinedStructPtr<T>& slot, bool) {
-    mojo::internal::InlinedStructPtrWTFHelper<T>::ConstructDeletedValue(slot);
-  }
-  static bool isDeletedValue(const mojo::InlinedStructPtr<T>& value) {
-    return mojo::internal::InlinedStructPtrWTFHelper<
-        T>::IsHashTableDeletedValue(value);
-  }
-};
-
-}  // namespace WTF
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_HASH_UTIL_H_
diff --git a/mojo/public/cpp/bindings/lib/wtf_serialization.h b/mojo/public/cpp/bindings/lib/wtf_serialization.h
deleted file mode 100644
index 0f112b9..0000000
--- a/mojo/public/cpp/bindings/lib/wtf_serialization.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_SERIALIZATION_H_
-
-#include "mojo/public/cpp/bindings/array_traits_wtf_vector.h"
-#include "mojo/public/cpp/bindings/map_traits_wtf_hash_map.h"
-#include "mojo/public/cpp/bindings/string_traits_wtf.h"
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/map.h b/mojo/public/cpp/bindings/map.h
deleted file mode 100644
index c1ba075..0000000
--- a/mojo/public/cpp/bindings/map.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MAP_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MAP_H_
-
-#include <map>
-#include <unordered_map>
-#include <utility>
-
-namespace mojo {
-
-// TODO(yzshen): These conversion functions should be removed and callsites
-// should be revisited and changed to use the same map type.
-template <typename Key, typename Value>
-std::unordered_map<Key, Value> MapToUnorderedMap(
-    const std::map<Key, Value>& input) {
-  return std::unordered_map<Key, Value>(input.begin(), input.end());
-}
-
-template <typename Key, typename Value>
-std::unordered_map<Key, Value> MapToUnorderedMap(std::map<Key, Value>&& input) {
-  return std::unordered_map<Key, Value>(std::make_move_iterator(input.begin()),
-                                        std::make_move_iterator(input.end()));
-}
-
-template <typename Key, typename Value>
-std::map<Key, Value> UnorderedMapToMap(
-    const std::unordered_map<Key, Value>& input) {
-  return std::map<Key, Value>(input.begin(), input.end());
-}
-
-template <typename Key, typename Value>
-std::map<Key, Value> UnorderedMapToMap(std::unordered_map<Key, Value>&& input) {
-  return std::map<Key, Value>(std::make_move_iterator(input.begin()),
-                              std::make_move_iterator(input.end()));
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MAP_H_
diff --git a/mojo/public/cpp/bindings/map_data_view.h b/mojo/public/cpp/bindings/map_data_view.h
deleted file mode 100644
index a65bb9e..0000000
--- a/mojo/public/cpp/bindings/map_data_view.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MAP_DATA_VIEW_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MAP_DATA_VIEW_H_
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/array_data_view.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/map_data_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-
-namespace mojo {
-
-template <typename K, typename V>
-class MapDataView {
- public:
-  using Data_ = typename internal::MojomTypeTraits<MapDataView<K, V>>::Data;
-
-  MapDataView() {}
-
-  MapDataView(Data_* data, internal::SerializationContext* context)
-      : keys_(data ? data->keys.Get() : nullptr, context),
-        values_(data ? data->values.Get() : nullptr, context) {}
-
-  bool is_null() const {
-    DCHECK_EQ(keys_.is_null(), values_.is_null());
-    return keys_.is_null();
-  }
-
-  size_t size() const {
-    DCHECK_EQ(keys_.size(), values_.size());
-    return keys_.size();
-  }
-
-  ArrayDataView<K>& keys() { return keys_; }
-  const ArrayDataView<K>& keys() const { return keys_; }
-
-  template <typename U>
-  bool ReadKeys(U* output) {
-    return internal::Deserialize<ArrayDataView<K>>(keys_.data_, output,
-                                                   keys_.context_);
-  }
-
-  ArrayDataView<V>& values() { return values_; }
-  const ArrayDataView<V>& values() const { return values_; }
-
-  template <typename U>
-  bool ReadValues(U* output) {
-    return internal::Deserialize<ArrayDataView<V>>(values_.data_, output,
-                                                   values_.context_);
-  }
-
- private:
-  ArrayDataView<K> keys_;
-  ArrayDataView<V> values_;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MAP_DATA_VIEW_H_
diff --git a/mojo/public/cpp/bindings/map_traits.h b/mojo/public/cpp/bindings/map_traits.h
deleted file mode 100644
index 5c0d8b2..0000000
--- a/mojo/public/cpp/bindings/map_traits.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_H_
-
-namespace mojo {
-
-// This must be specialized for any type |T| to be serialized/deserialized as
-// a mojom map.
-//
-// Usually you would like to do a partial specialization for a map template.
-// Imagine you want to specialize it for CustomMap<>, you need to implement:
-//
-//   template <typename K, typename V>
-//   struct MapTraits<CustomMap<K, V>> {
-//     using Key = K;
-//     using Value = V;
-//
-//     // These two methods are optional. Please see comments in struct_traits.h
-//     static bool IsNull(const CustomMap<K, V>& input);
-//     static void SetToNull(CustomMap<K, V>* output);
-//
-//     static size_t GetSize(const CustomMap<K, V>& input);
-//
-//     static CustomConstIterator GetBegin(const CustomMap<K, V>& input);
-//     static CustomIterator GetBegin(CustomMap<K, V>& input);
-//
-//     static void AdvanceIterator(CustomConstIterator& iterator);
-//     static void AdvanceIterator(CustomIterator& iterator);
-//
-//     static const K& GetKey(CustomIterator& iterator);
-//     static const K& GetKey(CustomConstIterator& iterator);
-//
-//     static V& GetValue(CustomIterator& iterator);
-//     static const V& GetValue(CustomConstIterator& iterator);
-//
-//     // Returning false results in deserialization failure and causes the
-//     // message pipe receiving it to be disconnected. |IK| and |IV| are
-//     // separate input key/value template parameters that allows for the
-//     // the key/value types to be forwarded.
-//     template <typename IK, typename IV>
-//     static bool Insert(CustomMap<K, V>& input,
-//                        IK&& key,
-//                        IV&& value);
-//
-//     static void SetToEmpty(CustomMap<K, V>* output);
-//   };
-//
-template <typename T>
-struct MapTraits;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/map_traits_stl.h b/mojo/public/cpp/bindings/map_traits_stl.h
deleted file mode 100644
index 83a4399..0000000
--- a/mojo/public/cpp/bindings/map_traits_stl.h
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STL_H_
-
-#include <map>
-#include <unordered_map>
-
-#include "mojo/public/cpp/bindings/map_traits.h"
-
-namespace mojo {
-
-template <typename K, typename V>
-struct MapTraits<std::map<K, V>> {
-  using Key = K;
-  using Value = V;
-  using Iterator = typename std::map<K, V>::iterator;
-  using ConstIterator = typename std::map<K, V>::const_iterator;
-
-  static bool IsNull(const std::map<K, V>& input) {
-    // std::map<> is always converted to non-null mojom map.
-    return false;
-  }
-
-  static void SetToNull(std::map<K, V>* output) {
-    // std::map<> doesn't support null state. Set it to empty instead.
-    output->clear();
-  }
-
-  static size_t GetSize(const std::map<K, V>& input) { return input.size(); }
-
-  static ConstIterator GetBegin(const std::map<K, V>& input) {
-    return input.begin();
-  }
-  static Iterator GetBegin(std::map<K, V>& input) { return input.begin(); }
-
-  static void AdvanceIterator(ConstIterator& iterator) { iterator++; }
-  static void AdvanceIterator(Iterator& iterator) { iterator++; }
-
-  static const K& GetKey(Iterator& iterator) { return iterator->first; }
-  static const K& GetKey(ConstIterator& iterator) { return iterator->first; }
-
-  static V& GetValue(Iterator& iterator) { return iterator->second; }
-  static const V& GetValue(ConstIterator& iterator) { return iterator->second; }
-
-  static bool Insert(std::map<K, V>& input, const K& key, V&& value) {
-    input.insert(std::make_pair(key, std::forward<V>(value)));
-    return true;
-  }
-  static bool Insert(std::map<K, V>& input, const K& key, const V& value) {
-    input.insert(std::make_pair(key, value));
-    return true;
-  }
-
-  static void SetToEmpty(std::map<K, V>* output) { output->clear(); }
-};
-
-template <typename K, typename V>
-struct MapTraits<std::unordered_map<K, V>> {
-  using Key = K;
-  using Value = V;
-  using Iterator = typename std::unordered_map<K, V>::iterator;
-  using ConstIterator = typename std::unordered_map<K, V>::const_iterator;
-
-  static bool IsNull(const std::unordered_map<K, V>& input) {
-    // std::unordered_map<> is always converted to non-null mojom map.
-    return false;
-  }
-
-  static void SetToNull(std::unordered_map<K, V>* output) {
-    // std::unordered_map<> doesn't support null state. Set it to empty instead.
-    output->clear();
-  }
-
-  static size_t GetSize(const std::unordered_map<K, V>& input) {
-    return input.size();
-  }
-
-  static ConstIterator GetBegin(const std::unordered_map<K, V>& input) {
-    return input.begin();
-  }
-  static Iterator GetBegin(std::unordered_map<K, V>& input) {
-    return input.begin();
-  }
-
-  static void AdvanceIterator(ConstIterator& iterator) { iterator++; }
-  static void AdvanceIterator(Iterator& iterator) { iterator++; }
-
-  static const K& GetKey(Iterator& iterator) { return iterator->first; }
-  static const K& GetKey(ConstIterator& iterator) { return iterator->first; }
-
-  static V& GetValue(Iterator& iterator) { return iterator->second; }
-  static const V& GetValue(ConstIterator& iterator) { return iterator->second; }
-
-  template <typename IK, typename IV>
-  static bool Insert(std::unordered_map<K, V>& input, IK&& key, IV&& value) {
-    input.insert(
-        std::make_pair(std::forward<IK>(key), std::forward<IV>(value)));
-    return true;
-  }
-
-  static void SetToEmpty(std::unordered_map<K, V>* output) { output->clear(); }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STL_H_
diff --git a/mojo/public/cpp/bindings/map_traits_wtf_hash_map.h b/mojo/public/cpp/bindings/map_traits_wtf_hash_map.h
deleted file mode 100644
index dd68b36..0000000
--- a/mojo/public/cpp/bindings/map_traits_wtf_hash_map.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_WTF_HASH_MAP_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_WTF_HASH_MAP_H_
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/map_traits.h"
-#include "third_party/WebKit/Source/wtf/HashMap.h"
-
-namespace mojo {
-
-template <typename K, typename V>
-struct MapTraits<WTF::HashMap<K, V>> {
-  using Key = K;
-  using Value = V;
-  using Iterator = typename WTF::HashMap<K, V>::iterator;
-  using ConstIterator = typename WTF::HashMap<K, V>::const_iterator;
-
-  static bool IsNull(const WTF::HashMap<K, V>& input) {
-    // WTF::HashMap<> is always converted to non-null mojom map.
-    return false;
-  }
-
-  static void SetToNull(WTF::HashMap<K, V>* output) {
-    // WTF::HashMap<> doesn't support null state. Set it to empty instead.
-    output->clear();
-  }
-
-  static size_t GetSize(const WTF::HashMap<K, V>& input) {
-    return input.size();
-  }
-
-  static ConstIterator GetBegin(const WTF::HashMap<K, V>& input) {
-    return input.begin();
-  }
-  static Iterator GetBegin(WTF::HashMap<K, V>& input) { return input.begin(); }
-
-  static void AdvanceIterator(ConstIterator& iterator) { ++iterator; }
-  static void AdvanceIterator(Iterator& iterator) { ++iterator; }
-
-  static const K& GetKey(Iterator& iterator) { return iterator->key; }
-  static const K& GetKey(ConstIterator& iterator) { return iterator->key; }
-
-  static V& GetValue(Iterator& iterator) { return iterator->value; }
-  static const V& GetValue(ConstIterator& iterator) { return iterator->value; }
-
-  template <typename IK, typename IV>
-  static bool Insert(WTF::HashMap<K, V>& input, IK&& key, IV&& value) {
-    if (!WTF::HashMap<K, V>::isValidKey(key)) {
-      LOG(ERROR) << "The key value is disallowed by WTF::HashMap";
-      return false;
-    }
-    input.insert(std::forward<IK>(key), std::forward<IV>(value));
-    return true;
-  }
-
-  static void SetToEmpty(WTF::HashMap<K, V>* output) { output->clear(); }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_WTF_HASH_MAP_H_
diff --git a/mojo/public/cpp/bindings/message.h b/mojo/public/cpp/bindings/message.h
deleted file mode 100644
index 48e6900..0000000
--- a/mojo/public/cpp/bindings/message.h
+++ /dev/null
@@ -1,302 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/message_buffer.h"
-#include "mojo/public/cpp/bindings/lib/message_internal.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-#include "mojo/public/cpp/system/message.h"
-
-namespace mojo {
-
-class AssociatedGroupController;
-
-using ReportBadMessageCallback = base::Callback<void(const std::string& error)>;
-
-// Message is a holder for the data and handles to be sent over a MessagePipe.
-// Message owns its data and handles, but a consumer of Message is free to
-// mutate the data and handles. The message's data is comprised of a header
-// followed by payload.
-class MOJO_CPP_BINDINGS_EXPORT Message {
- public:
-  static const uint32_t kFlagExpectsResponse = 1 << 0;
-  static const uint32_t kFlagIsResponse = 1 << 1;
-  static const uint32_t kFlagIsSync = 1 << 2;
-
-  Message();
-  Message(Message&& other);
-
-  ~Message();
-
-  Message& operator=(Message&& other);
-
-  // Resets the Message to an uninitialized state. Upon reset, the Message
-  // exists as if it were default-constructed: it has no data buffer and owns no
-  // handles.
-  void Reset();
-
-  // Indicates whether this Message is uninitialized.
-  bool IsNull() const { return !buffer_; }
-
-  // Initializes a Message with enough space for |capacity| bytes.
-  void Initialize(size_t capacity, bool zero_initialized);
-
-  // Initializes a Message from an existing Mojo MessageHandle.
-  void InitializeFromMojoMessage(ScopedMessageHandle message,
-                                 uint32_t num_bytes,
-                                 std::vector<Handle>* handles);
-
-  uint32_t data_num_bytes() const {
-    return static_cast<uint32_t>(buffer_->size());
-  }
-
-  // Access the raw bytes of the message.
-  const uint8_t* data() const {
-    return static_cast<const uint8_t*>(buffer_->data());
-  }
-
-  uint8_t* mutable_data() { return static_cast<uint8_t*>(buffer_->data()); }
-
-  // Access the header.
-  const internal::MessageHeader* header() const {
-    return static_cast<const internal::MessageHeader*>(buffer_->data());
-  }
-  internal::MessageHeader* header() {
-    return static_cast<internal::MessageHeader*>(buffer_->data());
-  }
-
-  const internal::MessageHeaderV1* header_v1() const {
-    DCHECK_GE(version(), 1u);
-    return static_cast<const internal::MessageHeaderV1*>(buffer_->data());
-  }
-  internal::MessageHeaderV1* header_v1() {
-    DCHECK_GE(version(), 1u);
-    return static_cast<internal::MessageHeaderV1*>(buffer_->data());
-  }
-
-  const internal::MessageHeaderV2* header_v2() const {
-    DCHECK_GE(version(), 2u);
-    return static_cast<const internal::MessageHeaderV2*>(buffer_->data());
-  }
-  internal::MessageHeaderV2* header_v2() {
-    DCHECK_GE(version(), 2u);
-    return static_cast<internal::MessageHeaderV2*>(buffer_->data());
-  }
-
-  uint32_t version() const { return header()->version; }
-
-  uint32_t interface_id() const { return header()->interface_id; }
-  void set_interface_id(uint32_t id) { header()->interface_id = id; }
-
-  uint32_t name() const { return header()->name; }
-  bool has_flag(uint32_t flag) const { return !!(header()->flags & flag); }
-
-  // Access the request_id field (if present).
-  uint64_t request_id() const { return header_v1()->request_id; }
-  void set_request_id(uint64_t request_id) {
-    header_v1()->request_id = request_id;
-  }
-
-  // Access the payload.
-  const uint8_t* payload() const;
-  uint8_t* mutable_payload() { return const_cast<uint8_t*>(payload()); }
-  uint32_t payload_num_bytes() const;
-
-  uint32_t payload_num_interface_ids() const;
-  const uint32_t* payload_interface_ids() const;
-
-  // Access the handles.
-  const std::vector<Handle>* handles() const { return &handles_; }
-  std::vector<Handle>* mutable_handles() { return &handles_; }
-
-  const std::vector<ScopedInterfaceEndpointHandle>*
-  associated_endpoint_handles() const {
-    return &associated_endpoint_handles_;
-  }
-  std::vector<ScopedInterfaceEndpointHandle>*
-  mutable_associated_endpoint_handles() {
-    return &associated_endpoint_handles_;
-  }
-
-  // Access the underlying Buffer interface.
-  internal::Buffer* buffer() { return buffer_.get(); }
-
-  // Takes a scoped MessageHandle which may be passed to |WriteMessageNew()| for
-  // transmission. Note that this invalidates this Message object, taking
-  // ownership of its internal storage and any attached handles.
-  ScopedMessageHandle TakeMojoMessage();
-
-  // Notifies the system that this message is "bad," in this case meaning it was
-  // rejected by bindings validation code.
-  void NotifyBadMessage(const std::string& error);
-
-  // Serializes |associated_endpoint_handles_| into the payload_interface_ids
-  // field.
-  void SerializeAssociatedEndpointHandles(
-      AssociatedGroupController* group_controller);
-
-  // Deserializes |associated_endpoint_handles_| from the payload_interface_ids
-  // field.
-  bool DeserializeAssociatedEndpointHandles(
-      AssociatedGroupController* group_controller);
-
- private:
-  void CloseHandles();
-
-  std::unique_ptr<internal::MessageBuffer> buffer_;
-  std::vector<Handle> handles_;
-  std::vector<ScopedInterfaceEndpointHandle> associated_endpoint_handles_;
-
-  DISALLOW_COPY_AND_ASSIGN(Message);
-};
-
-class MessageReceiver {
- public:
-  virtual ~MessageReceiver() {}
-
-  // The receiver may mutate the given message.  Returns true if the message
-  // was accepted and false otherwise, indicating that the message was invalid
-  // or malformed.
-  virtual bool Accept(Message* message) WARN_UNUSED_RESULT = 0;
-};
-
-class MessageReceiverWithResponder : public MessageReceiver {
- public:
-  ~MessageReceiverWithResponder() override {}
-
-  // A variant on Accept that registers a MessageReceiver (known as the
-  // responder) to handle the response message generated from the given
-  // message. The responder's Accept method may be called during
-  // AcceptWithResponder or some time after its return.
-  virtual bool AcceptWithResponder(Message* message,
-                                   std::unique_ptr<MessageReceiver> responder)
-      WARN_UNUSED_RESULT = 0;
-};
-
-// A MessageReceiver that is also able to provide status about the state
-// of the underlying MessagePipe to which it will be forwarding messages
-// received via the |Accept()| call.
-class MessageReceiverWithStatus : public MessageReceiver {
- public:
-  ~MessageReceiverWithStatus() override {}
-
-  // Returns |true| if this MessageReceiver is currently bound to a MessagePipe,
-  // the pipe has not been closed, and the pipe has not encountered an error.
-  virtual bool IsValid() = 0;
-
-  // DCHECKs if this MessageReceiver is currently bound to a MessagePipe, the
-  // pipe has not been closed, and the pipe has not encountered an error.
-  // This function may be called on any thread.
-  virtual void DCheckInvalid(const std::string& message) = 0;
-};
-
-// An alternative to MessageReceiverWithResponder for cases in which it
-// is necessary for the implementor of this interface to know about the status
-// of the MessagePipe which will carry the responses.
-class MessageReceiverWithResponderStatus : public MessageReceiver {
- public:
-  ~MessageReceiverWithResponderStatus() override {}
-
-  // A variant on Accept that registers a MessageReceiverWithStatus (known as
-  // the responder) to handle the response message generated from the given
-  // message. Any of the responder's methods (Accept or IsValid) may be called
-  // during  AcceptWithResponder or some time after its return.
-  virtual bool AcceptWithResponder(Message* message,
-                                   std::unique_ptr<MessageReceiverWithStatus>
-                                       responder) WARN_UNUSED_RESULT = 0;
-};
-
-class MOJO_CPP_BINDINGS_EXPORT PassThroughFilter
-    : NON_EXPORTED_BASE(public MessageReceiver) {
- public:
-  PassThroughFilter();
-  ~PassThroughFilter() override;
-
-  // MessageReceiver:
-  bool Accept(Message* message) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PassThroughFilter);
-};
-
-namespace internal {
-class SyncMessageResponseSetup;
-}
-
-// An object which should be constructed on the stack immediately before making
-// a sync request for which the caller wishes to perform custom validation of
-// the response value(s). It is illegal to make more than one sync call during
-// the lifetime of the topmost SyncMessageResponseContext, but it is legal to
-// nest contexts to support reentrancy.
-//
-// Usage should look something like:
-//
-//     SyncMessageResponseContext response_context;
-//     foo_interface->SomeSyncCall(&response_value);
-//     if (response_value.IsBad())
-//       response_context.ReportBadMessage("Bad response_value!");
-//
-class MOJO_CPP_BINDINGS_EXPORT SyncMessageResponseContext {
- public:
-  SyncMessageResponseContext();
-  ~SyncMessageResponseContext();
-
-  static SyncMessageResponseContext* current();
-
-  void ReportBadMessage(const std::string& error);
-
-  const ReportBadMessageCallback& GetBadMessageCallback();
-
- private:
-  friend class internal::SyncMessageResponseSetup;
-
-  SyncMessageResponseContext* outer_context_;
-  Message response_;
-  ReportBadMessageCallback bad_message_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(SyncMessageResponseContext);
-};
-
-// Read a single message from the pipe. The caller should have created the
-// Message, but not called Initialize(). Returns MOJO_RESULT_SHOULD_WAIT if
-// the caller should wait on the handle to become readable. Returns
-// MOJO_RESULT_OK if the message was read successfully and should be
-// dispatched, otherwise returns an error code if something went wrong.
-//
-// NOTE: The message hasn't been validated and may be malformed!
-MojoResult ReadMessage(MessagePipeHandle handle, Message* message);
-
-// Reports the currently dispatching Message as bad. Note that this is only
-// legal to call from directly within the stack frame of a message dispatch. If
-// you need to do asynchronous work before you can determine the legitimacy of
-// a message, use TakeBadMessageCallback() and retain its result until you're
-// ready to invoke or discard it.
-MOJO_CPP_BINDINGS_EXPORT
-void ReportBadMessage(const std::string& error);
-
-// Acquires a callback which may be run to report the currently dispatching
-// Message as bad. Note that this is only legal to call from directly within the
-// stack frame of a message dispatch, but the returned callback may be called
-// exactly once any time thereafter to report the message as bad. This may only
-// be called once per message.
-MOJO_CPP_BINDINGS_EXPORT
-ReportBadMessageCallback GetBadMessageCallback();
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_
diff --git a/mojo/public/cpp/bindings/message_header_validator.h b/mojo/public/cpp/bindings/message_header_validator.h
deleted file mode 100644
index 50c19db..0000000
--- a/mojo/public/cpp/bindings/message_header_validator.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_HEADER_VALIDATOR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_HEADER_VALIDATOR_H_
-
-#include "base/compiler_specific.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-
-class MOJO_CPP_BINDINGS_EXPORT MessageHeaderValidator
-    : NON_EXPORTED_BASE(public MessageReceiver) {
- public:
-  MessageHeaderValidator();
-  explicit MessageHeaderValidator(const std::string& description);
-
-  // Sets the description associated with this validator. Used for reporting
-  // more detailed validation errors.
-  void SetDescription(const std::string& description);
-
-  bool Accept(Message* message) override;
-
- private:
-  std::string description_;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_HEADER_VALIDATOR_H_
diff --git a/mojo/public/cpp/bindings/native_enum.h b/mojo/public/cpp/bindings/native_enum.h
deleted file mode 100644
index 08b43b7..0000000
--- a/mojo/public/cpp/bindings/native_enum.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_NATIVE_ENUM_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_NATIVE_ENUM_H_
-
-#include <functional>
-
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/native_enum_data.h"
-
-namespace mojo {
-
-// Native-only enums correspond to "[Native] enum Foo;" definitions in mojom.
-enum class NativeEnum : int32_t {};
-
-}  // namespace mojo
-
-namespace std {
-
-template <>
-struct hash<mojo::NativeEnum>
-    : public mojo::internal::EnumHashImpl<mojo::NativeEnum> {};
-
-}  // namespace std
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_NATIVE_ENUM_H_
diff --git a/mojo/public/cpp/bindings/native_struct.h b/mojo/public/cpp/bindings/native_struct.h
deleted file mode 100644
index ac27250..0000000
--- a/mojo/public/cpp/bindings/native_struct.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_NATIVE_STRUCT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_NATIVE_STRUCT_H_
-
-#include <vector>
-
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/native_struct_data.h"
-#include "mojo/public/cpp/bindings/struct_ptr.h"
-#include "mojo/public/cpp/bindings/type_converter.h"
-
-namespace mojo {
-
-class NativeStruct;
-using NativeStructPtr = StructPtr<NativeStruct>;
-
-// Native-only structs correspond to "[Native] struct Foo;" definitions in
-// mojom.
-class MOJO_CPP_BINDINGS_EXPORT NativeStruct {
- public:
-  using Data_ = internal::NativeStruct_Data;
-
-  static NativeStructPtr New();
-
-  template <typename U>
-  static NativeStructPtr From(const U& u) {
-    return TypeConverter<NativeStructPtr, U>::Convert(u);
-  }
-
-  template <typename U>
-  U To() const {
-    return TypeConverter<U, NativeStruct>::Convert(*this);
-  }
-
-  NativeStruct();
-  ~NativeStruct();
-
-  NativeStructPtr Clone() const;
-  bool Equals(const NativeStruct& other) const;
-  size_t Hash(size_t seed) const;
-
-  base::Optional<std::vector<uint8_t>> data;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_NATIVE_STRUCT_H_
diff --git a/mojo/public/cpp/bindings/native_struct_data_view.h b/mojo/public/cpp/bindings/native_struct_data_view.h
deleted file mode 100644
index 613bd7a..0000000
--- a/mojo/public/cpp/bindings/native_struct_data_view.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_NATIVE_STRUCT_DATA_VIEW_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_NATIVE_STRUCT_DATA_VIEW_H_
-
-#include "mojo/public/cpp/bindings/lib/native_struct_data.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-
-namespace mojo {
-
-class NativeStructDataView {
- public:
-  using Data_ = internal::NativeStruct_Data;
-
-  NativeStructDataView() {}
-
-  NativeStructDataView(Data_* data, internal::SerializationContext* context)
-      : data_(data) {}
-
-  bool is_null() const { return !data_; }
-
-  size_t size() const { return data_->data.size(); }
-
-  uint8_t operator[](size_t index) const { return data_->data.at(index); }
-
-  const uint8_t* data() const { return data_->data.storage(); }
-
- private:
-  Data_* data_ = nullptr;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_NATIVE_STRUCT_DATA_VIEW_H_
diff --git a/mojo/public/cpp/bindings/pipe_control_message_handler.h b/mojo/public/cpp/bindings/pipe_control_message_handler.h
deleted file mode 100644
index a5c04da..0000000
--- a/mojo/public/cpp/bindings/pipe_control_message_handler.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_HANDLER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_HANDLER_H_
-
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-
-class PipeControlMessageHandlerDelegate;
-
-// Handler for messages defined in pipe_control_messages.mojom.
-class MOJO_CPP_BINDINGS_EXPORT PipeControlMessageHandler
-    : NON_EXPORTED_BASE(public MessageReceiver) {
- public:
-  explicit PipeControlMessageHandler(
-      PipeControlMessageHandlerDelegate* delegate);
-  ~PipeControlMessageHandler() override;
-
-  // Sets the description for this handler. Used only when reporting validation
-  // errors.
-  void SetDescription(const std::string& description);
-
-  // NOTE: |message| must have passed message header validation.
-  static bool IsPipeControlMessage(const Message* message);
-
-  // MessageReceiver implementation:
-
-  // NOTE: |message| must:
-  //   - have passed message header validation; and
-  //   - be a pipe control message (i.e., IsPipeControlMessage() returns true).
-  // If the method returns false, the message pipe should be closed.
-  bool Accept(Message* message) override;
-
- private:
-  // |message| must have passed message header validation.
-  bool Validate(Message* message);
-  bool RunOrClosePipe(Message* message);
-
-  std::string description_;
-  PipeControlMessageHandlerDelegate* const delegate_;
-
-  DISALLOW_COPY_AND_ASSIGN(PipeControlMessageHandler);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_HANDLER_H_
diff --git a/mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h b/mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h
deleted file mode 100644
index 16fd918..0000000
--- a/mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_HANDLER_DELEGATE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_HANDLER_DELEGATE_H_
-
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/disconnect_reason.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-
-namespace mojo {
-
-class PipeControlMessageHandlerDelegate {
- public:
-  // The implementation of the following methods should return false if the
-  // notification is unexpected. In that case, the user of this delegate is
-  // expected to close the message pipe.
-  virtual bool OnPeerAssociatedEndpointClosed(
-      InterfaceId id,
-      const base::Optional<DisconnectReason>& reason) = 0;
-
- protected:
-  virtual ~PipeControlMessageHandlerDelegate() {}
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_HANDLER_DELEGATE_H_
diff --git a/mojo/public/cpp/bindings/pipe_control_message_proxy.h b/mojo/public/cpp/bindings/pipe_control_message_proxy.h
deleted file mode 100644
index 52c408f..0000000
--- a/mojo/public/cpp/bindings/pipe_control_message_proxy.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_PROXY_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_PROXY_H_
-
-#include "base/macros.h"
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/disconnect_reason.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-
-class MessageReceiver;
-
-// Proxy for request messages defined in pipe_control_messages.mojom.
-//
-// NOTE: This object may be used from multiple threads.
-class MOJO_CPP_BINDINGS_EXPORT PipeControlMessageProxy {
- public:
-  // Doesn't take ownership of |receiver|. If This PipeControlMessageProxy will
-  // be used from multiple threads, |receiver| must be thread-safe.
-  explicit PipeControlMessageProxy(MessageReceiver* receiver);
-
-  void NotifyPeerEndpointClosed(InterfaceId id,
-                                const base::Optional<DisconnectReason>& reason);
-
-  static Message ConstructPeerEndpointClosedMessage(
-      InterfaceId id,
-      const base::Optional<DisconnectReason>& reason);
-
- private:
-  // Not owned.
-  MessageReceiver* receiver_;
-
-  DISALLOW_COPY_AND_ASSIGN(PipeControlMessageProxy);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_PROXY_H_
diff --git a/mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h b/mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h
deleted file mode 100644
index 4d40cdf..0000000
--- a/mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_RAW_PTR_IMPL_REF_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_RAW_PTR_IMPL_REF_TRAITS_H_
-
-namespace mojo {
-
-// Default traits for a binding's implementation reference type. This
-// corresponds to a raw pointer.
-template <typename Interface>
-struct RawPtrImplRefTraits {
-  using PointerType = Interface*;
-
-  static bool IsNull(PointerType ptr) { return !ptr; }
-  static Interface* GetRawPointer(PointerType* ptr) { return *ptr; }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_RAW_PTR_IMPL_REF_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h b/mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h
deleted file mode 100644
index 16527cf..0000000
--- a/mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_SCOPED_INTERFACE_ENDPOINT_HANDLE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_SCOPED_INTERFACE_ENDPOINT_HANDLE_H_
-
-#include <string>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/disconnect_reason.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-
-namespace mojo {
-
-class AssociatedGroupController;
-
-// ScopedInterfaceEndpointHandle refers to one end of an interface, either the
-// implementation side or the client side.
-// Threading: At any given time, a ScopedInterfaceEndpointHandle should only
-// be accessed from a single thread.
-class MOJO_CPP_BINDINGS_EXPORT ScopedInterfaceEndpointHandle {
- public:
-  // Creates a pair of handles representing the two endpoints of an interface,
-  // which are not yet associated with a message pipe.
-  static void CreatePairPendingAssociation(
-      ScopedInterfaceEndpointHandle* handle0,
-      ScopedInterfaceEndpointHandle* handle1);
-
-  // Creates an invalid endpoint handle.
-  ScopedInterfaceEndpointHandle();
-
-  ScopedInterfaceEndpointHandle(ScopedInterfaceEndpointHandle&& other);
-
-  ~ScopedInterfaceEndpointHandle();
-
-  ScopedInterfaceEndpointHandle& operator=(
-      ScopedInterfaceEndpointHandle&& other);
-
-  bool is_valid() const;
-
-  // Returns true if the interface hasn't associated with a message pipe.
-  bool pending_association() const;
-
-  // Returns kInvalidInterfaceId when in pending association state or the handle
-  // is invalid.
-  InterfaceId id() const;
-
-  // Returns null when in pending association state or the handle is invalid.
-  AssociatedGroupController* group_controller() const;
-
-  // Returns the disconnect reason if the peer handle is closed before
-  // association and specifies a custom disconnect reason.
-  const base::Optional<DisconnectReason>& disconnect_reason() const;
-
-  enum AssociationEvent {
-    // The interface has been associated with a message pipe.
-    ASSOCIATED,
-    // The peer of this object has been closed before association.
-    PEER_CLOSED_BEFORE_ASSOCIATION
-  };
-
-  using AssociationEventCallback = base::OnceCallback<void(AssociationEvent)>;
-  // Note:
-  // - |handler| won't run if the handle is invalid. Otherwise, |handler| is run
-  //   on the calling thread asynchronously, even if the interface has already
-  //   been associated or the peer has been closed before association.
-  // - |handler| won't be called after this object is destroyed or reset.
-  // - A null |handler| can be used to cancel the previous callback.
-  void SetAssociationEventHandler(AssociationEventCallback handler);
-
-  void reset();
-  void ResetWithReason(uint32_t custom_reason, const std::string& description);
-
- private:
-  friend class AssociatedGroupController;
-  friend class AssociatedGroup;
-
-  class State;
-
-  // Used by AssociatedGroupController.
-  ScopedInterfaceEndpointHandle(
-      InterfaceId id,
-      scoped_refptr<AssociatedGroupController> group_controller);
-
-  // Used by AssociatedGroupController.
-  // The peer of this handle will join |peer_group_controller|.
-  bool NotifyAssociation(
-      InterfaceId id,
-      scoped_refptr<AssociatedGroupController> peer_group_controller);
-
-  void ResetInternal(const base::Optional<DisconnectReason>& reason);
-
-  // Used by AssociatedGroup.
-  // It is safe to run the returned callback on any thread, or after this handle
-  // is destroyed.
-  // The return value of the getter:
-  //   - If the getter is retrieved when the handle is invalid, the return value
-  //     of the getter will always be null.
-  //   - If the getter is retrieved when the handle is valid and non-pending,
-  //     the return value of the getter will be non-null and remain unchanged
-  //     even if the handle is later reset.
-  //   - If the getter is retrieved when the handle is valid but pending
-  //     asssociation, the return value of the getter will initially be null,
-  //     change to non-null when the handle is associated, and remain unchanged
-  //     ever since.
-  base::Callback<AssociatedGroupController*()> CreateGroupControllerGetter()
-      const;
-
-  scoped_refptr<State> state_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedInterfaceEndpointHandle);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_SCOPED_INTERFACE_ENDPOINT_HANDLE_H_
diff --git a/mojo/public/cpp/bindings/string_data_view.h b/mojo/public/cpp/bindings/string_data_view.h
deleted file mode 100644
index 2b091b4..0000000
--- a/mojo/public/cpp/bindings/string_data_view.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_DATA_VIEW_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRING_DATA_VIEW_H_
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-
-namespace mojo {
-
-// Access to the contents of a serialized string.
-class StringDataView {
- public:
-  StringDataView() {}
-
-  StringDataView(internal::String_Data* data,
-                 internal::SerializationContext* context)
-      : data_(data) {}
-
-  bool is_null() const { return !data_; }
-
-  const char* storage() const { return data_->storage(); }
-
-  size_t size() const { return data_->size(); }
-
- private:
-  internal::String_Data* data_ = nullptr;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_DATA_VIEW_H_
diff --git a/mojo/public/cpp/bindings/string_traits.h b/mojo/public/cpp/bindings/string_traits.h
deleted file mode 100644
index 7d3075a..0000000
--- a/mojo/public/cpp/bindings/string_traits.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_H_
-
-#include "mojo/public/cpp/bindings/string_data_view.h"
-
-namespace mojo {
-
-// This must be specialized for any type |T| to be serialized/deserialized as
-// a mojom string.
-//
-// Imagine you want to specialize it for CustomString, usually you need to
-// implement:
-//
-//   template <T>
-//   struct StringTraits<CustomString> {
-//     // These two methods are optional. Please see comments in struct_traits.h
-//     static bool IsNull(const CustomString& input);
-//     static void SetToNull(CustomString* output);
-//
-//     static size_t GetSize(const CustomString& input);
-//     static const char* GetData(const CustomString& input);
-//
-//     // The caller guarantees that |!input.is_null()|.
-//     static bool Read(StringDataView input, CustomString* output);
-//   };
-//
-// In some cases, you may need to do conversion before you can return the size
-// and data as 8-bit characters for serialization. (For example, CustomString is
-// UTF-16 string). In that case, you can add two optional methods:
-//
-//   static void* SetUpContext(const CustomString& input);
-//   static void TearDownContext(const CustomString& input, void* context);
-//
-// And then you append a second parameter, void* context, to GetSize() and
-// GetData():
-//
-//   static size_t GetSize(const CustomString& input, void* context);
-//   static const char* GetData(const CustomString& input, void* context);
-//
-// If a CustomString instance is not null, the serialization code will call
-// SetUpContext() at the beginning, and pass the resulting context pointer to
-// GetSize()/GetData(). After serialization is done, it calls TearDownContext()
-// so that you can do any necessary cleanup.
-//
-template <typename T>
-struct StringTraits;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/string_traits_stl.h b/mojo/public/cpp/bindings/string_traits_stl.h
deleted file mode 100644
index f6cc8ad..0000000
--- a/mojo/public/cpp/bindings/string_traits_stl.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STL_H_
-
-#include <string>
-
-#include "mojo/public/cpp/bindings/string_traits.h"
-
-namespace mojo {
-
-template <>
-struct StringTraits<std::string> {
-  static bool IsNull(const std::string& input) {
-    // std::string is always converted to non-null mojom string.
-    return false;
-  }
-
-  static void SetToNull(std::string* output) {
-    // std::string doesn't support null state. Set it to empty instead.
-    output->clear();
-  }
-
-  static size_t GetSize(const std::string& input) { return input.size(); }
-
-  static const char* GetData(const std::string& input) { return input.data(); }
-
-  static bool Read(StringDataView input, std::string* output) {
-    output->assign(input.storage(), input.size());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STL_H_
diff --git a/mojo/public/cpp/bindings/string_traits_string16.h b/mojo/public/cpp/bindings/string_traits_string16.h
deleted file mode 100644
index f96973a..0000000
--- a/mojo/public/cpp/bindings/string_traits_string16.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING16_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING16_H_
-
-#include "base/strings/string16.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/string_traits.h"
-
-namespace mojo {
-
-template <>
-struct MOJO_CPP_BINDINGS_EXPORT StringTraits<base::string16> {
-  static bool IsNull(const base::string16& input) {
-    // base::string16 is always converted to non-null mojom string.
-    return false;
-  }
-
-  static void SetToNull(base::string16* output) {
-    // Convert null to an "empty" base::string16.
-    output->clear();
-  }
-
-  static void* SetUpContext(const base::string16& input);
-  static void TearDownContext(const base::string16& input, void* context);
-
-  static size_t GetSize(const base::string16& input, void* context);
-  static const char* GetData(const base::string16& input, void* context);
-
-  static bool Read(StringDataView input, base::string16* output);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING16_H_
diff --git a/mojo/public/cpp/bindings/string_traits_string_piece.h b/mojo/public/cpp/bindings/string_traits_string_piece.h
deleted file mode 100644
index af6be89..0000000
--- a/mojo/public/cpp/bindings/string_traits_string_piece.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING_PIECE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING_PIECE_H_
-
-#include "base/strings/string_piece.h"
-#include "mojo/public/cpp/bindings/string_traits.h"
-
-namespace mojo {
-
-template <>
-struct StringTraits<base::StringPiece> {
-  static bool IsNull(const base::StringPiece& input) {
-    // base::StringPiece is always converted to non-null mojom string. We could
-    // have let StringPiece containing a null data pointer map to null mojom
-    // string, but StringPiece::empty() returns true in this case. It seems
-    // confusing to mix the concept of empty and null strings, especially
-    // because they mean different things in mojom.
-    return false;
-  }
-
-  static void SetToNull(base::StringPiece* output) {
-    // Convert null to an "empty" base::StringPiece.
-    output->set(nullptr, 0);
-  }
-
-  static size_t GetSize(const base::StringPiece& input) { return input.size(); }
-
-  static const char* GetData(const base::StringPiece& input) {
-    return input.data();
-  }
-
-  static bool Read(StringDataView input, base::StringPiece* output) {
-    output->set(input.storage(), input.size());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING_PIECE_H_
diff --git a/mojo/public/cpp/bindings/string_traits_wtf.h b/mojo/public/cpp/bindings/string_traits_wtf.h
deleted file mode 100644
index 238c2eb..0000000
--- a/mojo/public/cpp/bindings/string_traits_wtf.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_WTF_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_WTF_H_
-
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/string_traits.h"
-#include "third_party/WebKit/Source/wtf/text/WTFString.h"
-
-namespace mojo {
-
-template <>
-struct StringTraits<WTF::String> {
-  static bool IsNull(const WTF::String& input) { return input.isNull(); }
-  static void SetToNull(WTF::String* output);
-
-  static void* SetUpContext(const WTF::String& input);
-  static void TearDownContext(const WTF::String& input, void* context);
-
-  static size_t GetSize(const WTF::String& input, void* context);
-
-  static const char* GetData(const WTF::String& input, void* context);
-
-  static bool Read(StringDataView input, WTF::String* output);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_WTF_H_
diff --git a/mojo/public/cpp/bindings/strong_associated_binding.h b/mojo/public/cpp/bindings/strong_associated_binding.h
deleted file mode 100644
index a1e299b..0000000
--- a/mojo/public/cpp/bindings/strong_associated_binding.h
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRONG_ASSOCIATED_BINDING_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRONG_ASSOCIATED_BINDING_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-
-template <typename Interface>
-class StrongAssociatedBinding;
-
-template <typename Interface>
-using StrongAssociatedBindingPtr =
-    base::WeakPtr<StrongAssociatedBinding<Interface>>;
-
-// This connects an interface implementation strongly to an associated pipe.
-// When a connection error is detected the implementation is deleted. If the
-// task runner that a StrongAssociatedBinding is bound on is stopped, the
-// connection error handler will not be invoked and the implementation will not
-// be deleted.
-//
-// To use, call StrongAssociatedBinding<T>::Create() (see below) or the helper
-// MakeStrongAssociatedBinding function:
-//
-//   mojo::MakeStrongAssociatedBinding(base::MakeUnique<FooImpl>(),
-//                                     std::move(foo_request));
-//
-template <typename Interface>
-class StrongAssociatedBinding {
- public:
-  // Create a new StrongAssociatedBinding instance. The instance owns itself,
-  // cleaning up only in the event of a pipe connection error. Returns a WeakPtr
-  // to the new StrongAssociatedBinding instance.
-  static StrongAssociatedBindingPtr<Interface> Create(
-      std::unique_ptr<Interface> impl,
-      AssociatedInterfaceRequest<Interface> request) {
-    StrongAssociatedBinding* binding =
-        new StrongAssociatedBinding(std::move(impl), std::move(request));
-    return binding->weak_factory_.GetWeakPtr();
-  }
-
-  // Note: The error handler must not delete the interface implementation.
-  //
-  // This method may only be called after this StrongAssociatedBinding has been
-  // bound to a message pipe.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(binding_.is_bound());
-    connection_error_handler_ = error_handler;
-    connection_error_with_reason_handler_.Reset();
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    DCHECK(binding_.is_bound());
-    connection_error_with_reason_handler_ = error_handler;
-    connection_error_handler_.Reset();
-  }
-
-  // Forces the binding to close. This destroys the StrongBinding instance.
-  void Close() { delete this; }
-
-  Interface* impl() { return impl_.get(); }
-
-  // Sends a message on the underlying message pipe and runs the current
-  // message loop until its response is received. This can be used in tests to
-  // verify that no message was sent on a message pipe in response to some
-  // stimulus.
-  void FlushForTesting() { binding_.FlushForTesting(); }
-
- private:
-  StrongAssociatedBinding(std::unique_ptr<Interface> impl,
-                          AssociatedInterfaceRequest<Interface> request)
-      : impl_(std::move(impl)),
-        binding_(impl_.get(), std::move(request)),
-        weak_factory_(this) {
-    binding_.set_connection_error_with_reason_handler(base::Bind(
-        &StrongAssociatedBinding::OnConnectionError, base::Unretained(this)));
-  }
-
-  ~StrongAssociatedBinding() {}
-
-  void OnConnectionError(uint32_t custom_reason,
-                         const std::string& description) {
-    if (!connection_error_handler_.is_null())
-      connection_error_handler_.Run();
-    else if (!connection_error_with_reason_handler_.is_null())
-      connection_error_with_reason_handler_.Run(custom_reason, description);
-    Close();
-  }
-
-  std::unique_ptr<Interface> impl_;
-  base::Closure connection_error_handler_;
-  ConnectionErrorWithReasonCallback connection_error_with_reason_handler_;
-  AssociatedBinding<Interface> binding_;
-  base::WeakPtrFactory<StrongAssociatedBinding> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(StrongAssociatedBinding);
-};
-
-template <typename Interface, typename Impl>
-StrongAssociatedBindingPtr<Interface> MakeStrongAssociatedBinding(
-    std::unique_ptr<Impl> impl,
-    AssociatedInterfaceRequest<Interface> request) {
-  return StrongAssociatedBinding<Interface>::Create(std::move(impl),
-                                                    std::move(request));
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRONG_ASSOCIATED_BINDING_H_
diff --git a/mojo/public/cpp/bindings/strong_binding.h b/mojo/public/cpp/bindings/strong_binding.h
deleted file mode 100644
index f4b4a06..0000000
--- a/mojo/public/cpp/bindings/strong_binding.h
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/message_header_validator.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-
-template <typename Interface>
-class StrongBinding;
-
-template <typename Interface>
-using StrongBindingPtr = base::WeakPtr<StrongBinding<Interface>>;
-
-// This connects an interface implementation strongly to a pipe. When a
-// connection error is detected the implementation is deleted. If the task
-// runner that a StrongBinding is bound on is stopped, the connection error
-// handler will not be invoked and the implementation will not be deleted.
-//
-// To use, call StrongBinding<T>::Create() (see below) or the helper
-// MakeStrongBinding function:
-//
-//   mojo::MakeStrongBinding(base::MakeUnique<FooImpl>(),
-//                           std::move(foo_request));
-//
-template <typename Interface>
-class StrongBinding {
- public:
-  // Create a new StrongBinding instance. The instance owns itself, cleaning up
-  // only in the event of a pipe connection error. Returns a WeakPtr to the new
-  // StrongBinding instance.
-  static StrongBindingPtr<Interface> Create(
-      std::unique_ptr<Interface> impl,
-      InterfaceRequest<Interface> request) {
-    StrongBinding* binding =
-        new StrongBinding(std::move(impl), std::move(request));
-    return binding->weak_factory_.GetWeakPtr();
-  }
-
-  // Note: The error handler must not delete the interface implementation.
-  //
-  // This method may only be called after this StrongBinding has been bound to a
-  // message pipe.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(binding_.is_bound());
-    connection_error_handler_ = error_handler;
-    connection_error_with_reason_handler_.Reset();
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    DCHECK(binding_.is_bound());
-    connection_error_with_reason_handler_ = error_handler;
-    connection_error_handler_.Reset();
-  }
-
-  // Forces the binding to close. This destroys the StrongBinding instance.
-  void Close() { delete this; }
-
-  Interface* impl() { return impl_.get(); }
-
-  // Sends a message on the underlying message pipe and runs the current
-  // message loop until its response is received. This can be used in tests to
-  // verify that no message was sent on a message pipe in response to some
-  // stimulus.
-  void FlushForTesting() { binding_.FlushForTesting(); }
-
- private:
-  StrongBinding(std::unique_ptr<Interface> impl,
-                InterfaceRequest<Interface> request)
-      : impl_(std::move(impl)),
-        binding_(impl_.get(), std::move(request)),
-        weak_factory_(this) {
-    binding_.set_connection_error_with_reason_handler(
-        base::Bind(&StrongBinding::OnConnectionError, base::Unretained(this)));
-  }
-
-  ~StrongBinding() {}
-
-  void OnConnectionError(uint32_t custom_reason,
-                         const std::string& description) {
-    if (!connection_error_handler_.is_null())
-      connection_error_handler_.Run();
-    else if (!connection_error_with_reason_handler_.is_null())
-      connection_error_with_reason_handler_.Run(custom_reason, description);
-    Close();
-  }
-
-  std::unique_ptr<Interface> impl_;
-  base::Closure connection_error_handler_;
-  ConnectionErrorWithReasonCallback connection_error_with_reason_handler_;
-  Binding<Interface> binding_;
-  base::WeakPtrFactory<StrongBinding> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(StrongBinding);
-};
-
-template <typename Interface, typename Impl>
-StrongBindingPtr<Interface> MakeStrongBinding(
-    std::unique_ptr<Impl> impl,
-    InterfaceRequest<Interface> request) {
-  return StrongBinding<Interface>::Create(std::move(impl), std::move(request));
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_
diff --git a/mojo/public/cpp/bindings/strong_binding_set.h b/mojo/public/cpp/bindings/strong_binding_set.h
deleted file mode 100644
index f6bcd52..0000000
--- a/mojo/public/cpp/bindings/strong_binding_set.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_SET_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_SET_H_
-
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/unique_ptr_impl_ref_traits.h"
-
-namespace mojo {
-
-// This class manages a set of bindings. When the pipe a binding is bound to is
-// disconnected, the binding is automatically destroyed and removed from the
-// set, and the interface implementation is deleted. When the StrongBindingSet
-// is destructed, all outstanding bindings in the set are destroyed and all the
-// bound interface implementations are automatically deleted.
-template <typename Interface, typename ContextType = void>
-using StrongBindingSet =
-    BindingSetBase<Interface,
-                   Binding<Interface, UniquePtrImplRefTraits<Interface>>,
-                   ContextType>;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_SET_H_
diff --git a/mojo/public/cpp/bindings/struct_ptr.h b/mojo/public/cpp/bindings/struct_ptr.h
deleted file mode 100644
index b135312..0000000
--- a/mojo/public/cpp/bindings/struct_ptr.h
+++ /dev/null
@@ -1,283 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRUCT_PTR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRUCT_PTR_H_
-
-#include <functional>
-#include <memory>
-#include <new>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/lib/hash_util.h"
-#include "mojo/public/cpp/bindings/type_converter.h"
-
-namespace mojo {
-namespace internal {
-
-constexpr size_t kHashSeed = 31;
-
-template <typename Struct>
-class StructPtrWTFHelper;
-
-template <typename Struct>
-class InlinedStructPtrWTFHelper;
-
-}  // namespace internal
-
-// Smart pointer wrapping a mojom structure with move-only semantics.
-template <typename S>
-class StructPtr {
- public:
-  using Struct = S;
-
-  StructPtr() = default;
-  StructPtr(decltype(nullptr)) {}
-
-  ~StructPtr() = default;
-
-  StructPtr& operator=(decltype(nullptr)) {
-    reset();
-    return *this;
-  }
-
-  StructPtr(StructPtr&& other) { Take(&other); }
-  StructPtr& operator=(StructPtr&& other) {
-    Take(&other);
-    return *this;
-  }
-
-  template <typename... Args>
-  StructPtr(base::in_place_t, Args&&... args)
-      : ptr_(new Struct(std::forward<Args>(args)...)) {}
-
-  template <typename U>
-  U To() const {
-    return TypeConverter<U, StructPtr>::Convert(*this);
-  }
-
-  void reset() { ptr_.reset(); }
-
-  bool is_null() const { return !ptr_; }
-
-  Struct& operator*() const {
-    DCHECK(ptr_);
-    return *ptr_;
-  }
-  Struct* operator->() const {
-    DCHECK(ptr_);
-    return ptr_.get();
-  }
-  Struct* get() const { return ptr_.get(); }
-
-  void Swap(StructPtr* other) { std::swap(ptr_, other->ptr_); }
-
-  // Please note that calling this method will fail compilation if the value
-  // type |Struct| doesn't have a Clone() method defined (which usually means
-  // that it contains Mojo handles).
-  StructPtr Clone() const { return is_null() ? StructPtr() : ptr_->Clone(); }
-
-  // Compares the pointees (which might both be null).
-  // TODO(tibell): Get rid of Equals in favor of the operator. Same for Hash.
-  bool Equals(const StructPtr& other) const {
-    if (is_null() || other.is_null())
-      return is_null() && other.is_null();
-    return ptr_->Equals(*other.ptr_);
-  }
-
-  // Hashes based on the pointee (which might be null).
-  size_t Hash(size_t seed) const {
-    if (is_null())
-      return internal::HashCombine(seed, 0);
-    return ptr_->Hash(seed);
-  }
-
-  explicit operator bool() const { return !is_null(); }
-
- private:
-  friend class internal::StructPtrWTFHelper<Struct>;
-  void Take(StructPtr* other) {
-    reset();
-    Swap(other);
-  }
-
-  std::unique_ptr<Struct> ptr_;
-
-  DISALLOW_COPY_AND_ASSIGN(StructPtr);
-};
-
-template <typename T>
-bool operator==(const StructPtr<T>& lhs, const StructPtr<T>& rhs) {
-  return lhs.Equals(rhs);
-}
-template <typename T>
-bool operator!=(const StructPtr<T>& lhs, const StructPtr<T>& rhs) {
-  return !(lhs == rhs);
-}
-
-// Designed to be used when Struct is small and copyable.
-template <typename S>
-class InlinedStructPtr {
- public:
-  using Struct = S;
-
-  InlinedStructPtr() : state_(NIL) {}
-  InlinedStructPtr(decltype(nullptr)) : state_(NIL) {}
-
-  ~InlinedStructPtr() {}
-
-  InlinedStructPtr& operator=(decltype(nullptr)) {
-    reset();
-    return *this;
-  }
-
-  InlinedStructPtr(InlinedStructPtr&& other) : state_(NIL) { Take(&other); }
-  InlinedStructPtr& operator=(InlinedStructPtr&& other) {
-    Take(&other);
-    return *this;
-  }
-
-  template <typename... Args>
-  InlinedStructPtr(base::in_place_t, Args&&... args)
-      : value_(std::forward<Args>(args)...), state_(VALID) {}
-
-  template <typename U>
-  U To() const {
-    return TypeConverter<U, InlinedStructPtr>::Convert(*this);
-  }
-
-  void reset() {
-    state_ = NIL;
-    value_. ~Struct();
-    new (&value_) Struct();
-  }
-
-  bool is_null() const { return state_ == NIL; }
-
-  Struct& operator*() const {
-    DCHECK(state_ == VALID);
-    return value_;
-  }
-  Struct* operator->() const {
-    DCHECK(state_ == VALID);
-    return &value_;
-  }
-  Struct* get() const { return &value_; }
-
-  void Swap(InlinedStructPtr* other) {
-    std::swap(value_, other->value_);
-    std::swap(state_, other->state_);
-  }
-
-  InlinedStructPtr Clone() const {
-    return is_null() ? InlinedStructPtr() : value_.Clone();
-  }
-
-  // Compares the pointees (which might both be null).
-  bool Equals(const InlinedStructPtr& other) const {
-    if (is_null() || other.is_null())
-      return is_null() && other.is_null();
-    return value_.Equals(other.value_);
-  }
-
-  // Hashes based on the pointee (which might be null).
-  size_t Hash(size_t seed) const {
-    if (is_null())
-      return internal::HashCombine(seed, 0);
-    return value_.Hash(seed);
-  }
-
-  explicit operator bool() const { return !is_null(); }
-
- private:
-  friend class internal::InlinedStructPtrWTFHelper<Struct>;
-  void Take(InlinedStructPtr* other) {
-    reset();
-    Swap(other);
-  }
-
-  enum State {
-    VALID,
-    NIL,
-    DELETED,  // For use in WTF::HashMap only
-  };
-
-  mutable Struct value_;
-  State state_;
-
-  DISALLOW_COPY_AND_ASSIGN(InlinedStructPtr);
-};
-
-template <typename T>
-bool operator==(const InlinedStructPtr<T>& lhs,
-                const InlinedStructPtr<T>& rhs) {
-  return lhs.Equals(rhs);
-}
-template <typename T>
-bool operator!=(const InlinedStructPtr<T>& lhs,
-                const InlinedStructPtr<T>& rhs) {
-  return !(lhs == rhs);
-}
-
-namespace internal {
-
-template <typename Struct>
-class StructPtrWTFHelper {
- public:
-  static bool IsHashTableDeletedValue(const StructPtr<Struct>& value) {
-    return value.ptr_.get() == reinterpret_cast<Struct*>(1u);
-  }
-
-  static void ConstructDeletedValue(mojo::StructPtr<Struct>& slot) {
-    // |slot| refers to a previous, real value that got deleted and had its
-    // destructor run, so this is the first time the "deleted value" has its
-    // constructor called.
-    //
-    // Dirty trick: implant an invalid pointer in |ptr_|. Destructor isn't
-    // called for deleted buckets, so this is okay.
-    new (&slot) StructPtr<Struct>();
-    slot.ptr_.reset(reinterpret_cast<Struct*>(1u));
-  }
-};
-
-template <typename Struct>
-class InlinedStructPtrWTFHelper {
- public:
-  static bool IsHashTableDeletedValue(const InlinedStructPtr<Struct>& value) {
-    return value.state_ == InlinedStructPtr<Struct>::DELETED;
-  }
-
-  static void ConstructDeletedValue(mojo::InlinedStructPtr<Struct>& slot) {
-    // |slot| refers to a previous, real value that got deleted and had its
-    // destructor run, so this is the first time the "deleted value" has its
-    // constructor called.
-    new (&slot) InlinedStructPtr<Struct>();
-    slot.state_ = InlinedStructPtr<Struct>::DELETED;
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-namespace std {
-
-template <typename T>
-struct hash<mojo::StructPtr<T>> {
-  size_t operator()(const mojo::StructPtr<T>& value) const {
-    return value.Hash(mojo::internal::kHashSeed);
-  }
-};
-
-template <typename T>
-struct hash<mojo::InlinedStructPtr<T>> {
-  size_t operator()(const mojo::InlinedStructPtr<T>& value) const {
-    return value.Hash(mojo::internal::kHashSeed);
-  }
-};
-
-}  // namespace std
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRUCT_PTR_H_
diff --git a/mojo/public/cpp/bindings/struct_traits.h b/mojo/public/cpp/bindings/struct_traits.h
deleted file mode 100644
index 6cc070f..0000000
--- a/mojo/public/cpp/bindings/struct_traits.h
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_STRUCT_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRUCT_TRAITS_H_
-
-namespace mojo {
-
-// This must be specialized for any type |T| to be serialized/deserialized as
-// a mojom struct. |DataViewType| is the corresponding data view type of the
-// mojom struct. For example, if the mojom struct is example.Foo,
-// |DataViewType| will be example::FooDataView, which can also be referred to by
-// example::Foo::DataView (in chromium) and example::blink::Foo::DataView (in
-// blink).
-//
-// Each specialization needs to implement a few things:
-//   1. Static getters for each field in the Mojom type. These should be
-//      of the form:
-//
-//        static <return type> <field name>(const T& input);
-//
-//      and should return a serializable form of the named field as extracted
-//      from |input|.
-//
-//      Serializable form of a field:
-//        Value or reference of the same type used in the generated stuct
-//        wrapper type, or the following alternatives:
-//        - string:
-//          Value or reference of any type that has a StringTraits defined.
-//          Supported by default: base::StringPiece, std::string,
-//          WTF::String (in blink).
-//
-//        - array:
-//          Value or reference of any type that has an ArrayTraits defined.
-//          Supported by default: std::vector, CArray, WTF::Vector (in blink)
-//
-//        - map:
-//          Value or reference of any type that has a MapTraits defined.
-//          Supported by default: std::map, std::unordered_map,
-//          WTF::HashMap (in blink).
-//
-//        - struct:
-//          Value or reference of any type that has a StructTraits defined.
-//
-//        - enum:
-//          Value of any type that has an EnumTraits defined.
-//
-//      For any nullable string/struct/array/map/union field you could also
-//      return value or reference of base::Optional<T>/WTF::Optional<T>, if T
-//      has the right *Traits defined.
-//
-//      During serialization, getters for string/struct/array/map/union fields
-//      are called twice (one for size calculation and one for actual
-//      serialization). If you want to return a value (as opposed to a
-//      reference) from these getters, you have to be sure that constructing and
-//      copying the returned object is really cheap.
-//
-//      Getters for fields of other types are called once.
-//
-//   2. A static Read() method to set the contents of a |T| instance from a
-//      DataViewType.
-//
-//        static bool Read(DataViewType data, T* output);
-//
-//      The generated DataViewType provides a convenient, inexpensive view of a
-//      serialized struct's field data. The caller guarantees that
-//      |!data.is_null()|.
-//
-//      Returning false indicates invalid incoming data and causes the message
-//      pipe receiving it to be disconnected. Therefore, you can do custom
-//      validation for |T| in this method.
-//
-//   3. [Optional] A static IsNull() method indicating whether a given |T|
-//      instance is null:
-//
-//        static bool IsNull(const T& input);
-//
-//      If this method returns true, it is guaranteed that none of the getters
-//      (described in section 1) will be called for the same |input|. So you
-//      don't have to check whether |input| is null in those getters.
-//
-//      If it is not defined, |T| instances are always considered non-null.
-//
-//      [Optional] A static SetToNull() method to set the contents of a given
-//      |T| instance to null.
-//
-//        static void SetToNull(T* output);
-//
-//      When a null serialized struct is received, the deserialization code
-//      calls this method instead of Read().
-//
-//      NOTE: It is to set |*output|'s contents to a null state, not to set the
-//      |output| pointer itself to null. "Null state" means whatever state you
-//      think it makes sense to map a null serialized struct to.
-//
-//      If it is not defined, null is not allowed to be converted to |T|. In
-//      that case, an incoming null value is considered invalid and causes the
-//      message pipe to be disconnected.
-//
-//   4. [Optional] As mentioned above, getters for string/struct/array/map/union
-//      fields are called multiple times (twice to be exact). If you need to do
-//      some expensive calculation/conversion, you probably want to cache the
-//      result across multiple calls. You can introduce an arbitrary context
-//      object by adding two optional methods:
-//        static void* SetUpContext(const T& input);
-//        static void TearDownContext(const T& input, void* context);
-//
-//      And then you append a second parameter, void* context, to getters:
-//        static <return type> <field name>(const T& input, void* context);
-//
-//      If a T instance is not null, the serialization code will call
-//      SetUpContext() at the beginning, and pass the resulting context pointer
-//      to getters. After serialization is done, it calls TearDownContext() so
-//      that you can do any necessary cleanup.
-//
-// In the description above, methods having an |input| parameter define it as
-// const reference of T. Actually, it can be a non-const reference of T too.
-// E.g., if T contains Mojo handles or interfaces whose ownership needs to be
-// transferred. Correspondingly, it requies you to always give non-const T
-// reference/value to the Mojo bindings for serialization:
-//    - if T is used in the "type_mappings" section of a typemap config file,
-//      you need to declare it as pass-by-value:
-//        type_mappings = [ "MojomType=T[move_only]" ]
-//      or
-//        type_mappings = [ "MojomType=T[copyable_pass_by_value]" ]
-//
-//    - if another type U's StructTraits/UnionTraits has a getter for T, it
-//      needs to return non-const reference/value.
-//
-// EXAMPLE:
-//
-// Mojom definition:
-//   struct Bar {};
-//   struct Foo {
-//     int32 f_integer;
-//     string f_string;
-//     array<string> f_string_array;
-//     Bar f_bar;
-//   };
-//
-// StructTraits for Foo:
-//   template <>
-//   struct StructTraits<FooDataView, CustomFoo> {
-//     // Optional methods dealing with null:
-//     static bool IsNull(const CustomFoo& input);
-//     static void SetToNull(CustomFoo* output);
-//
-//     // Field getters:
-//     static int32_t f_integer(const CustomFoo& input);
-//     static const std::string& f_string(const CustomFoo& input);
-//     static const std::vector<std::string>& f_string_array(
-//         const CustomFoo& input);
-//     // Assuming there is a StructTraits<Bar, CustomBar> defined.
-//     static const CustomBar& f_bar(const CustomFoo& input);
-//
-//     static bool Read(FooDataView data, CustomFoo* output);
-//   };
-//
-template <typename DataViewType, typename T>
-struct StructTraits;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRUCT_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/sync_call_restrictions.h b/mojo/public/cpp/bindings/sync_call_restrictions.h
deleted file mode 100644
index 5529042..0000000
--- a/mojo/public/cpp/bindings/sync_call_restrictions.h
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_SYNC_CALL_RESTRICTIONS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_SYNC_CALL_RESTRICTIONS_H_
-
-#include "base/macros.h"
-#include "base/threading/thread_restrictions.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-
-#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
-#define ENABLE_SYNC_CALL_RESTRICTIONS 1
-#else
-#define ENABLE_SYNC_CALL_RESTRICTIONS 0
-#endif
-
-namespace leveldb {
-class LevelDBMojoProxy;
-}
-
-namespace prefs {
-class PersistentPrefStoreClient;
-}
-
-namespace ui {
-class Gpu;
-}
-
-namespace views {
-class ClipboardMus;
-}
-
-namespace mojo {
-
-// In some processes, sync calls are disallowed. For example, in the browser
-// process we don't want any sync calls to child processes for performance,
-// security and stability reasons. SyncCallRestrictions helps to enforce such
-// rules.
-//
-// Before processing a sync call, the bindings call
-// SyncCallRestrictions::AssertSyncCallAllowed() to check whether sync calls are
-// allowed. By default, it is determined by the mojo system property
-// MOJO_PROPERTY_SYNC_CALL_ALLOWED. If the default setting says no but you have
-// a very compelling reason to disregard that (which should be very very rare),
-// you can override it by constructing a ScopedAllowSyncCall object, which
-// allows making sync calls on the current thread during its lifetime.
-class MOJO_CPP_BINDINGS_EXPORT SyncCallRestrictions {
- public:
-#if ENABLE_SYNC_CALL_RESTRICTIONS
-  // Checks whether the current thread is allowed to make sync calls, and causes
-  // a DCHECK if not.
-  static void AssertSyncCallAllowed();
-#else
-  // Inline the empty definitions of functions so that they can be compiled out.
-  static void AssertSyncCallAllowed() {}
-#endif
-
- private:
-  // DO NOT ADD ANY OTHER FRIEND STATEMENTS, talk to mojo/OWNERS first.
-  // BEGIN ALLOWED USAGE.
-  friend class ui::Gpu;  // http://crbug.com/620058
-  // LevelDBMojoProxy makes same-process sync calls from the DB thread.
-  friend class leveldb::LevelDBMojoProxy;
-  // Pref service connection is sync at startup.
-  friend class prefs::PersistentPrefStoreClient;
-
-  // END ALLOWED USAGE.
-
-  // BEGIN USAGE THAT NEEDS TO BE FIXED.
-  // In the non-mus case, we called blocking OS functions in the ui::Clipboard
-  // implementation which weren't caught by sync call restrictions. Our blocking
-  // calls to mus, however, are.
-  friend class views::ClipboardMus;
-  // END USAGE THAT NEEDS TO BE FIXED.
-
-#if ENABLE_SYNC_CALL_RESTRICTIONS
-  static void IncreaseScopedAllowCount();
-  static void DecreaseScopedAllowCount();
-#else
-  static void IncreaseScopedAllowCount() {}
-  static void DecreaseScopedAllowCount() {}
-#endif
-
-  // If a process is configured to disallow sync calls in general, constructing
-  // a ScopedAllowSyncCall object temporarily allows making sync calls on the
-  // current thread. Doing this is almost always incorrect, which is why we
-  // limit who can use this through friend. If you find yourself needing to use
-  // this, talk to mojo/OWNERS.
-  class ScopedAllowSyncCall {
-   public:
-    ScopedAllowSyncCall() { IncreaseScopedAllowCount(); }
-    ~ScopedAllowSyncCall() { DecreaseScopedAllowCount(); }
-
-   private:
-#if ENABLE_SYNC_CALL_RESTRICTIONS
-    base::ThreadRestrictions::ScopedAllowWait allow_wait_;
-#endif
-
-    DISALLOW_COPY_AND_ASSIGN(ScopedAllowSyncCall);
-  };
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(SyncCallRestrictions);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_SYNC_CALL_RESTRICTIONS_H_
diff --git a/mojo/public/cpp/bindings/sync_event_watcher.h b/mojo/public/cpp/bindings/sync_event_watcher.h
deleted file mode 100644
index 6e25484..0000000
--- a/mojo/public/cpp/bindings/sync_event_watcher.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_SYNC_EVENT_WATCHER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_SYNC_EVENT_WATCHER_H_
-
-#include <stddef.h>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/sync_handle_registry.h"
-
-namespace mojo {
-
-// SyncEventWatcher supports waiting on a base::WaitableEvent to signal while
-// also allowing other SyncEventWatchers and SyncHandleWatchers on the same
-// thread to wake up as needed.
-//
-// This class is not thread safe.
-class MOJO_CPP_BINDINGS_EXPORT SyncEventWatcher {
- public:
-  SyncEventWatcher(base::WaitableEvent* event, const base::Closure& callback);
-
-  ~SyncEventWatcher();
-
-  // Registers |event_| with SyncHandleRegistry, so that when others perform
-  // sync watching on the same thread, |event_| will be watched along with them.
-  void AllowWokenUpBySyncWatchOnSameThread();
-
-  // Waits on |event_| plus all other events and handles registered with this
-  // thread's SyncHandleRegistry, running callbacks synchronously for any ready
-  // events and handles.
-  // This method:
-  //   - returns true when |should_stop| is set to true;
-  //   - return false when any error occurs, including this object being
-  //     destroyed during a callback.
-  bool SyncWatch(const bool* should_stop);
-
- private:
-  void IncrementRegisterCount();
-  void DecrementRegisterCount();
-
-  base::WaitableEvent* const event_;
-  const base::Closure callback_;
-
-  // Whether |event_| has been registered with SyncHandleRegistry.
-  bool registered_ = false;
-
-  // If non-zero, |event_| should be registered with SyncHandleRegistry.
-  size_t register_request_count_ = 0;
-
-  scoped_refptr<SyncHandleRegistry> registry_;
-
-  scoped_refptr<base::RefCountedData<bool>> destroyed_;
-
-  base::ThreadChecker thread_checker_;
-
-  DISALLOW_COPY_AND_ASSIGN(SyncEventWatcher);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_SYNC_EVENT_WATCHER_H_
diff --git a/mojo/public/cpp/bindings/sync_handle_registry.h b/mojo/public/cpp/bindings/sync_handle_registry.h
deleted file mode 100644
index afb3b56..0000000
--- a/mojo/public/cpp/bindings/sync_handle_registry.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_REGISTRY_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_REGISTRY_H_
-
-#include <map>
-#include <unordered_map>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/wait_set.h"
-
-namespace mojo {
-
-// SyncHandleRegistry is a thread-local storage to register handles that want to
-// be watched together.
-//
-// This class is not thread safe.
-class MOJO_CPP_BINDINGS_EXPORT SyncHandleRegistry
-    : public base::RefCounted<SyncHandleRegistry> {
- public:
-  // Returns a thread-local object.
-  static scoped_refptr<SyncHandleRegistry> current();
-
-  using HandleCallback = base::Callback<void(MojoResult)>;
-  bool RegisterHandle(const Handle& handle,
-                      MojoHandleSignals handle_signals,
-                      const HandleCallback& callback);
-
-  void UnregisterHandle(const Handle& handle);
-
-  // Registers a |base::WaitableEvent| which can be used to wake up
-  // Wait() before any handle signals. |event| is not owned, and if it signals
-  // during Wait(), |callback| is invoked. Returns |true| if registered
-  // successfully or |false| if |event| was already registered.
-  bool RegisterEvent(base::WaitableEvent* event, const base::Closure& callback);
-
-  void UnregisterEvent(base::WaitableEvent* event);
-
-  // Waits on all the registered handles and events and runs callbacks
-  // synchronously for any that become ready.
-  // The method:
-  //   - returns true when any element of |should_stop| is set to true;
-  //   - returns false when any error occurs.
-  bool Wait(const bool* should_stop[], size_t count);
-
- private:
-  friend class base::RefCounted<SyncHandleRegistry>;
-
-  SyncHandleRegistry();
-  ~SyncHandleRegistry();
-
-  WaitSet wait_set_;
-  std::map<Handle, HandleCallback> handles_;
-  std::map<base::WaitableEvent*, base::Closure> events_;
-
-  base::ThreadChecker thread_checker_;
-
-  DISALLOW_COPY_AND_ASSIGN(SyncHandleRegistry);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_REGISTRY_H_
diff --git a/mojo/public/cpp/bindings/sync_handle_watcher.h b/mojo/public/cpp/bindings/sync_handle_watcher.h
deleted file mode 100644
index eff73dd..0000000
--- a/mojo/public/cpp/bindings/sync_handle_watcher.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_WATCHER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_WATCHER_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/sync_handle_registry.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-
-// SyncHandleWatcher supports watching a handle synchronously. It also supports
-// registering the handle with a thread-local storage (SyncHandleRegistry), so
-// that when other SyncHandleWatcher instances on the same thread perform sync
-// handle watching, this handle will be watched together.
-//
-// SyncHandleWatcher is used for sync methods. While a sync call is waiting for
-// response, we would like to block the thread. On the other hand, we need
-// incoming sync method requests on the same thread to be able to reenter. We
-// also need master interface endpoints to continue dispatching messages for
-// associated endpoints on different threads.
-//
-// This class is not thread safe.
-class MOJO_CPP_BINDINGS_EXPORT SyncHandleWatcher {
- public:
-  // Note: |handle| must outlive this object.
-  SyncHandleWatcher(const Handle& handle,
-                    MojoHandleSignals handle_signals,
-                    const SyncHandleRegistry::HandleCallback& callback);
-
-  ~SyncHandleWatcher();
-
-  // Registers |handle_| with SyncHandleRegistry, so that when others perform
-  // sync handle watching on the same thread, |handle_| will be watched
-  // together.
-  void AllowWokenUpBySyncWatchOnSameThread();
-
-  // Waits on |handle_| plus all handles registered with SyncHandleRegistry and
-  // runs callbacks synchronously for those ready handles.
-  // This method:
-  //   - returns true when |should_stop| is set to true;
-  //   - return false when any error occurs, including this object being
-  //     destroyed during a callback.
-  bool SyncWatch(const bool* should_stop);
-
- private:
-  void IncrementRegisterCount();
-  void DecrementRegisterCount();
-
-  const Handle handle_;
-  const MojoHandleSignals handle_signals_;
-  SyncHandleRegistry::HandleCallback callback_;
-
-  // Whether |handle_| has been registered with SyncHandleRegistry.
-  bool registered_;
-  // If non-zero, |handle_| should be registered with SyncHandleRegistry.
-  size_t register_request_count_;
-
-  scoped_refptr<SyncHandleRegistry> registry_;
-
-  scoped_refptr<base::RefCountedData<bool>> destroyed_;
-
-  base::ThreadChecker thread_checker_;
-
-  DISALLOW_COPY_AND_ASSIGN(SyncHandleWatcher);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_WATCHER_H_
diff --git a/mojo/public/cpp/bindings/tests/BUILD.gn b/mojo/public/cpp/bindings/tests/BUILD.gn
deleted file mode 100644
index 668ca6d..0000000
--- a/mojo/public/cpp/bindings/tests/BUILD.gn
+++ /dev/null
@@ -1,146 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("tests") {
-  testonly = true
-
-  sources = [
-    "associated_interface_unittest.cc",
-    "bind_task_runner_unittest.cc",
-    "binding_callback_unittest.cc",
-    "binding_set_unittest.cc",
-    "binding_unittest.cc",
-    "buffer_unittest.cc",
-    "connector_unittest.cc",
-    "constant_unittest.cc",
-    "container_test_util.cc",
-    "container_test_util.h",
-    "data_view_unittest.cc",
-    "equals_unittest.cc",
-    "handle_passing_unittest.cc",
-    "hash_unittest.cc",
-    "interface_ptr_unittest.cc",
-    "map_unittest.cc",
-    "message_queue.cc",
-    "message_queue.h",
-    "multiplex_router_unittest.cc",
-    "report_bad_message_unittest.cc",
-    "request_response_unittest.cc",
-    "router_test_util.cc",
-    "router_test_util.h",
-    "sample_service_unittest.cc",
-    "serialization_warning_unittest.cc",
-    "struct_unittest.cc",
-    "sync_method_unittest.cc",
-    "type_conversion_unittest.cc",
-    "union_unittest.cc",
-    "validation_context_unittest.cc",
-    "validation_unittest.cc",
-    "variant_test_util.h",
-  ]
-
-  deps = [
-    ":mojo_public_bindings_test_utils",
-    "//base/test:test_support",
-    "//mojo/edk/system",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/system",
-    "//mojo/public/cpp/test_support:test_utils",
-    "//mojo/public/interfaces/bindings/tests:test_associated_interfaces",
-    "//mojo/public/interfaces/bindings/tests:test_export_component",
-    "//mojo/public/interfaces/bindings/tests:test_export_component2",
-    "//mojo/public/interfaces/bindings/tests:test_exported_import",
-    "//mojo/public/interfaces/bindings/tests:test_interfaces",
-    "//mojo/public/interfaces/bindings/tests:test_struct_traits_interfaces",
-    "//testing/gtest",
-  ]
-
-  data = [
-    "//mojo/public/interfaces/bindings/tests/data/validation/",
-  ]
-
-  if (is_ios) {
-    assert_no_deps = [ "//third_party/WebKit/*" ]
-  } else {
-    sources += [
-      "pickle_unittest.cc",
-      "struct_traits_unittest.cc",
-    ]
-
-    deps += [ "//mojo/public/interfaces/bindings/tests:test_interfaces_blink" ]
-  }
-}
-
-if (!is_ios) {
-  source_set("for_blink_tests") {
-    testonly = true
-
-    sources = [
-      "container_test_util.cc",
-      "container_test_util.h",
-      "variant_test_util.h",
-      "wtf_hash_unittest.cc",
-      "wtf_map_unittest.cc",
-      "wtf_types_unittest.cc",
-    ]
-
-    deps = [
-      "//mojo/public/cpp/bindings",
-      "//mojo/public/cpp/system",
-      "//mojo/public/interfaces/bindings/tests:test_export_blink_component",
-      "//mojo/public/interfaces/bindings/tests:test_exported_import_blink",
-      "//mojo/public/interfaces/bindings/tests:test_interfaces",
-      "//mojo/public/interfaces/bindings/tests:test_interfaces_blink",
-      "//mojo/public/interfaces/bindings/tests:test_wtf_types",
-      "//mojo/public/interfaces/bindings/tests:test_wtf_types_blink",
-      "//testing/gtest",
-    ]
-  }
-}
-
-source_set("struct_with_traits_impl") {
-  sources = [
-    "struct_with_traits_impl.cc",
-    "struct_with_traits_impl.h",
-  ]
-
-  deps = [
-    "//base",
-    "//mojo/public/cpp/system:system",
-  ]
-}
-
-source_set("perftests") {
-  testonly = true
-
-  sources = [
-    "bindings_perftest.cc",
-  ]
-
-  if (!is_ios) {
-    sources += [ "e2e_perftest.cc" ]
-  }
-
-  deps = [
-    "//base/test:test_support",
-    "//mojo/edk/system",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/system",
-    "//mojo/public/cpp/test_support:test_utils",
-    "//mojo/public/interfaces/bindings/tests:test_interfaces",
-    "//testing/gtest",
-  ]
-}
-
-source_set("mojo_public_bindings_test_utils") {
-  sources = [
-    "validation_test_input_parser.cc",
-    "validation_test_input_parser.h",
-  ]
-
-  deps = [
-    "//mojo/public/c/system",
-  ]
-}
diff --git a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
deleted file mode 100644
index be225e4..0000000
--- a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
+++ /dev/null
@@ -1,1189 +0,0 @@
-// Copyright 2015 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 <stddef.h>
-#include <stdint.h>
-#include <algorithm>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/callback_helpers.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/lib/multiplex_router.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"
-#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-using mojo::internal::MultiplexRouter;
-
-class IntegerSenderImpl : public IntegerSender {
- public:
-  explicit IntegerSenderImpl(AssociatedInterfaceRequest<IntegerSender> request)
-      : binding_(this, std::move(request)) {}
-
-  ~IntegerSenderImpl() override {}
-
-  void set_notify_send_method_called(
-      const base::Callback<void(int32_t)>& callback) {
-    notify_send_method_called_ = callback;
-  }
-
-  void Echo(int32_t value, const EchoCallback& callback) override {
-    callback.Run(value);
-  }
-  void Send(int32_t value) override { notify_send_method_called_.Run(value); }
-
-  AssociatedBinding<IntegerSender>* binding() { return &binding_; }
-
-  void set_connection_error_handler(const base::Closure& handler) {
-    binding_.set_connection_error_handler(handler);
-  }
-
- private:
-  AssociatedBinding<IntegerSender> binding_;
-  base::Callback<void(int32_t)> notify_send_method_called_;
-};
-
-class IntegerSenderConnectionImpl : public IntegerSenderConnection {
- public:
-  explicit IntegerSenderConnectionImpl(
-      InterfaceRequest<IntegerSenderConnection> request)
-      : binding_(this, std::move(request)) {}
-
-  ~IntegerSenderConnectionImpl() override {}
-
-  void GetSender(AssociatedInterfaceRequest<IntegerSender> sender) override {
-    IntegerSenderImpl* sender_impl = new IntegerSenderImpl(std::move(sender));
-    sender_impl->set_connection_error_handler(
-        base::Bind(&DeleteSender, sender_impl));
-  }
-
-  void AsyncGetSender(const AsyncGetSenderCallback& callback) override {
-    IntegerSenderAssociatedPtrInfo ptr_info;
-    auto request = MakeRequest(&ptr_info);
-    GetSender(std::move(request));
-    callback.Run(std::move(ptr_info));
-  }
-
-  Binding<IntegerSenderConnection>* binding() { return &binding_; }
-
- private:
-  static void DeleteSender(IntegerSenderImpl* sender) { delete sender; }
-
-  Binding<IntegerSenderConnection> binding_;
-};
-
-class AssociatedInterfaceTest : public testing::Test {
- public:
-  AssociatedInterfaceTest() {}
-  ~AssociatedInterfaceTest() override { base::RunLoop().RunUntilIdle(); }
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
-  template <typename T>
-  AssociatedInterfacePtrInfo<T> EmulatePassingAssociatedPtrInfo(
-      AssociatedInterfacePtrInfo<T> ptr_info,
-      scoped_refptr<MultiplexRouter> source,
-      scoped_refptr<MultiplexRouter> target) {
-    ScopedInterfaceEndpointHandle handle = ptr_info.PassHandle();
-    CHECK(handle.pending_association());
-    auto id = source->AssociateInterface(std::move(handle));
-    return AssociatedInterfacePtrInfo<T>(target->CreateLocalEndpointHandle(id),
-                                         ptr_info.version());
-  }
-
-  void CreateRouterPair(scoped_refptr<MultiplexRouter>* router0,
-                        scoped_refptr<MultiplexRouter>* router1) {
-    MessagePipe pipe;
-    *router0 = new MultiplexRouter(std::move(pipe.handle0),
-                                   MultiplexRouter::MULTI_INTERFACE, true,
-                                   base::ThreadTaskRunnerHandle::Get());
-    *router1 = new MultiplexRouter(std::move(pipe.handle1),
-                                   MultiplexRouter::MULTI_INTERFACE, false,
-                                   base::ThreadTaskRunnerHandle::Get());
-  }
-
-  void CreateIntegerSenderWithExistingRouters(
-      scoped_refptr<MultiplexRouter> router0,
-      IntegerSenderAssociatedPtrInfo* ptr_info0,
-      scoped_refptr<MultiplexRouter> router1,
-      IntegerSenderAssociatedRequest* request1) {
-    *request1 = MakeRequest(ptr_info0);
-    *ptr_info0 = EmulatePassingAssociatedPtrInfo(std::move(*ptr_info0), router1,
-                                                 router0);
-  }
-
-  void CreateIntegerSender(IntegerSenderAssociatedPtrInfo* ptr_info,
-                           IntegerSenderAssociatedRequest* request) {
-    scoped_refptr<MultiplexRouter> router0;
-    scoped_refptr<MultiplexRouter> router1;
-    CreateRouterPair(&router0, &router1);
-    CreateIntegerSenderWithExistingRouters(router1, ptr_info, router0, request);
-  }
-
-  // Okay to call from any thread.
-  void QuitRunLoop(base::RunLoop* run_loop) {
-    if (loop_.task_runner()->BelongsToCurrentThread()) {
-      run_loop->Quit();
-    } else {
-      loop_.task_runner()->PostTask(
-          FROM_HERE,
-          base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                     base::Unretained(this), base::Unretained(run_loop)));
-    }
-  }
-
- private:
-  base::MessageLoop loop_;
-};
-
-void DoSetFlagAndRunClosure(bool* flag, const base::Closure& closure) {
-  *flag = true;
-  closure.Run();
-}
-
-void DoExpectValueSetFlagAndRunClosure(int32_t expected_value,
-                                       bool* flag,
-                                       const base::Closure& closure,
-                                       int32_t value) {
-  EXPECT_EQ(expected_value, value);
-  DoSetFlagAndRunClosure(flag, closure);
-}
-
-base::Closure SetFlagAndRunClosure(bool* flag, const base::Closure& closure) {
-  return base::Bind(&DoSetFlagAndRunClosure, flag, closure);
-}
-
-base::Callback<void(int32_t)> ExpectValueSetFlagAndRunClosure(
-    int32_t expected_value,
-    bool* flag,
-    const base::Closure& closure) {
-  return base::Bind(
-      &DoExpectValueSetFlagAndRunClosure, expected_value, flag, closure);
-}
-
-void Fail() {
-  FAIL() << "Unexpected connection error";
-}
-
-TEST_F(AssociatedInterfaceTest, InterfacesAtBothEnds) {
-  // Bind to the same pipe two associated interfaces, whose implementation lives
-  // at different ends. Test that the two don't interfere with each other.
-
-  scoped_refptr<MultiplexRouter> router0;
-  scoped_refptr<MultiplexRouter> router1;
-  CreateRouterPair(&router0, &router1);
-
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSenderWithExistingRouters(router1, &ptr_info, router0, &request);
-
-  IntegerSenderImpl impl0(std::move(request));
-  AssociatedInterfacePtr<IntegerSender> ptr0;
-  ptr0.Bind(std::move(ptr_info));
-
-  CreateIntegerSenderWithExistingRouters(router0, &ptr_info, router1, &request);
-
-  IntegerSenderImpl impl1(std::move(request));
-  AssociatedInterfacePtr<IntegerSender> ptr1;
-  ptr1.Bind(std::move(ptr_info));
-
-  base::RunLoop run_loop, run_loop2;
-  bool ptr0_callback_run = false;
-  ptr0->Echo(123, ExpectValueSetFlagAndRunClosure(123, &ptr0_callback_run,
-                                                  run_loop.QuitClosure()));
-
-  bool ptr1_callback_run = false;
-  ptr1->Echo(456, ExpectValueSetFlagAndRunClosure(456, &ptr1_callback_run,
-                                                  run_loop2.QuitClosure()));
-
-  run_loop.Run();
-  run_loop2.Run();
-  EXPECT_TRUE(ptr0_callback_run);
-  EXPECT_TRUE(ptr1_callback_run);
-
-  bool ptr0_error_callback_run = false;
-  base::RunLoop run_loop3;
-  ptr0.set_connection_error_handler(
-      SetFlagAndRunClosure(&ptr0_error_callback_run, run_loop3.QuitClosure()));
-
-  impl0.binding()->Close();
-  run_loop3.Run();
-  EXPECT_TRUE(ptr0_error_callback_run);
-
-  bool impl1_error_callback_run = false;
-  base::RunLoop run_loop4;
-  impl1.binding()->set_connection_error_handler(
-      SetFlagAndRunClosure(&impl1_error_callback_run, run_loop4.QuitClosure()));
-
-  ptr1.reset();
-  run_loop4.Run();
-  EXPECT_TRUE(impl1_error_callback_run);
-}
-
-class TestSender {
- public:
-  TestSender()
-      : sender_thread_("TestSender"),
-        next_sender_(nullptr),
-        max_value_to_send_(-1) {
-    sender_thread_.Start();
-  }
-
-  // The following three methods are called on the corresponding sender thread.
-  void SetUp(IntegerSenderAssociatedPtrInfo ptr_info,
-             TestSender* next_sender,
-             int32_t max_value_to_send) {
-    CHECK(sender_thread_.task_runner()->BelongsToCurrentThread());
-
-    ptr_.Bind(std::move(ptr_info));
-    next_sender_ = next_sender ? next_sender : this;
-    max_value_to_send_ = max_value_to_send;
-  }
-
-  void Send(int32_t value) {
-    CHECK(sender_thread_.task_runner()->BelongsToCurrentThread());
-
-    if (value > max_value_to_send_)
-      return;
-
-    ptr_->Send(value);
-
-    next_sender_->sender_thread()->task_runner()->PostTask(
-        FROM_HERE,
-        base::Bind(&TestSender::Send, base::Unretained(next_sender_), ++value));
-  }
-
-  void TearDown() {
-    CHECK(sender_thread_.task_runner()->BelongsToCurrentThread());
-
-    ptr_.reset();
-  }
-
-  base::Thread* sender_thread() { return &sender_thread_; }
-
- private:
-  base::Thread sender_thread_;
-  TestSender* next_sender_;
-  int32_t max_value_to_send_;
-
-  AssociatedInterfacePtr<IntegerSender> ptr_;
-};
-
-class TestReceiver {
- public:
-  TestReceiver() : receiver_thread_("TestReceiver"), expected_calls_(0) {
-    receiver_thread_.Start();
-  }
-
-  void SetUp(AssociatedInterfaceRequest<IntegerSender> request0,
-             AssociatedInterfaceRequest<IntegerSender> request1,
-             size_t expected_calls,
-             const base::Closure& notify_finish) {
-    CHECK(receiver_thread_.task_runner()->BelongsToCurrentThread());
-
-    impl0_.reset(new IntegerSenderImpl(std::move(request0)));
-    impl0_->set_notify_send_method_called(
-        base::Bind(&TestReceiver::SendMethodCalled, base::Unretained(this)));
-    impl1_.reset(new IntegerSenderImpl(std::move(request1)));
-    impl1_->set_notify_send_method_called(
-        base::Bind(&TestReceiver::SendMethodCalled, base::Unretained(this)));
-
-    expected_calls_ = expected_calls;
-    notify_finish_ = notify_finish;
-  }
-
-  void TearDown() {
-    CHECK(receiver_thread_.task_runner()->BelongsToCurrentThread());
-
-    impl0_.reset();
-    impl1_.reset();
-  }
-
-  base::Thread* receiver_thread() { return &receiver_thread_; }
-  const std::vector<int32_t>& values() const { return values_; }
-
- private:
-  void SendMethodCalled(int32_t value) {
-    values_.push_back(value);
-
-    if (values_.size() >= expected_calls_)
-      notify_finish_.Run();
-  }
-
-  base::Thread receiver_thread_;
-  size_t expected_calls_;
-
-  std::unique_ptr<IntegerSenderImpl> impl0_;
-  std::unique_ptr<IntegerSenderImpl> impl1_;
-
-  std::vector<int32_t> values_;
-
-  base::Closure notify_finish_;
-};
-
-class NotificationCounter {
- public:
-  NotificationCounter(size_t total_count, const base::Closure& notify_finish)
-      : total_count_(total_count),
-        current_count_(0),
-        notify_finish_(notify_finish) {}
-
-  ~NotificationCounter() {}
-
-  // Okay to call from any thread.
-  void OnGotNotification() {
-    bool finshed = false;
-    {
-      base::AutoLock locker(lock_);
-      CHECK_LT(current_count_, total_count_);
-      current_count_++;
-      finshed = current_count_ == total_count_;
-    }
-
-    if (finshed)
-      notify_finish_.Run();
-  }
-
- private:
-  base::Lock lock_;
-  const size_t total_count_;
-  size_t current_count_;
-  base::Closure notify_finish_;
-};
-
-TEST_F(AssociatedInterfaceTest, MultiThreadAccess) {
-  // Set up four associated interfaces on a message pipe. Use the inteface
-  // pointers on four threads in parallel; run the interface implementations on
-  // two threads. Test that multi-threaded access works.
-
-  const int32_t kMaxValue = 1000;
-  MessagePipe pipe;
-  scoped_refptr<MultiplexRouter> router0;
-  scoped_refptr<MultiplexRouter> router1;
-  CreateRouterPair(&router0, &router1);
-
-  AssociatedInterfaceRequest<IntegerSender> requests[4];
-  IntegerSenderAssociatedPtrInfo ptr_infos[4];
-  for (size_t i = 0; i < 4; ++i) {
-    CreateIntegerSenderWithExistingRouters(router1, &ptr_infos[i], router0,
-                                           &requests[i]);
-  }
-
-  TestSender senders[4];
-  for (size_t i = 0; i < 4; ++i) {
-    senders[i].sender_thread()->task_runner()->PostTask(
-        FROM_HERE, base::Bind(&TestSender::SetUp, base::Unretained(&senders[i]),
-                              base::Passed(&ptr_infos[i]), nullptr,
-                              kMaxValue * (i + 1) / 4));
-  }
-
-  base::RunLoop run_loop;
-  TestReceiver receivers[2];
-  NotificationCounter counter(
-      2, base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                    base::Unretained(this), base::Unretained(&run_loop)));
-  for (size_t i = 0; i < 2; ++i) {
-    receivers[i].receiver_thread()->task_runner()->PostTask(
-        FROM_HERE,
-        base::Bind(&TestReceiver::SetUp, base::Unretained(&receivers[i]),
-                   base::Passed(&requests[2 * i]),
-                   base::Passed(&requests[2 * i + 1]),
-                   static_cast<size_t>(kMaxValue / 2),
-                   base::Bind(&NotificationCounter::OnGotNotification,
-                              base::Unretained(&counter))));
-  }
-
-  for (size_t i = 0; i < 4; ++i) {
-    senders[i].sender_thread()->task_runner()->PostTask(
-        FROM_HERE, base::Bind(&TestSender::Send, base::Unretained(&senders[i]),
-                              kMaxValue * i / 4 + 1));
-  }
-
-  run_loop.Run();
-
-  for (size_t i = 0; i < 4; ++i) {
-    base::RunLoop run_loop;
-    senders[i].sender_thread()->task_runner()->PostTaskAndReply(
-        FROM_HERE,
-        base::Bind(&TestSender::TearDown, base::Unretained(&senders[i])),
-        base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                   base::Unretained(this), base::Unretained(&run_loop)));
-    run_loop.Run();
-  }
-
-  for (size_t i = 0; i < 2; ++i) {
-    base::RunLoop run_loop;
-    receivers[i].receiver_thread()->task_runner()->PostTaskAndReply(
-        FROM_HERE,
-        base::Bind(&TestReceiver::TearDown, base::Unretained(&receivers[i])),
-        base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                   base::Unretained(this), base::Unretained(&run_loop)));
-    run_loop.Run();
-  }
-
-  EXPECT_EQ(static_cast<size_t>(kMaxValue / 2), receivers[0].values().size());
-  EXPECT_EQ(static_cast<size_t>(kMaxValue / 2), receivers[1].values().size());
-
-  std::vector<int32_t> all_values;
-  all_values.insert(all_values.end(), receivers[0].values().begin(),
-                    receivers[0].values().end());
-  all_values.insert(all_values.end(), receivers[1].values().begin(),
-                    receivers[1].values().end());
-
-  std::sort(all_values.begin(), all_values.end());
-  for (size_t i = 0; i < all_values.size(); ++i)
-    ASSERT_EQ(static_cast<int32_t>(i + 1), all_values[i]);
-}
-
-TEST_F(AssociatedInterfaceTest, FIFO) {
-  // Set up four associated interfaces on a message pipe. Use the inteface
-  // pointers on four threads; run the interface implementations on two threads.
-  // Take turns to make calls using the four pointers. Test that FIFO-ness is
-  // preserved.
-
-  const int32_t kMaxValue = 100;
-  MessagePipe pipe;
-  scoped_refptr<MultiplexRouter> router0;
-  scoped_refptr<MultiplexRouter> router1;
-  CreateRouterPair(&router0, &router1);
-
-  AssociatedInterfaceRequest<IntegerSender> requests[4];
-  IntegerSenderAssociatedPtrInfo ptr_infos[4];
-  for (size_t i = 0; i < 4; ++i) {
-    CreateIntegerSenderWithExistingRouters(router1, &ptr_infos[i], router0,
-                                           &requests[i]);
-  }
-
-  TestSender senders[4];
-  for (size_t i = 0; i < 4; ++i) {
-    senders[i].sender_thread()->task_runner()->PostTask(
-        FROM_HERE,
-        base::Bind(&TestSender::SetUp, base::Unretained(&senders[i]),
-                   base::Passed(&ptr_infos[i]),
-                   base::Unretained(&senders[(i + 1) % 4]), kMaxValue));
-  }
-
-  base::RunLoop run_loop;
-  TestReceiver receivers[2];
-  NotificationCounter counter(
-      2, base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                    base::Unretained(this), base::Unretained(&run_loop)));
-  for (size_t i = 0; i < 2; ++i) {
-    receivers[i].receiver_thread()->task_runner()->PostTask(
-        FROM_HERE,
-        base::Bind(&TestReceiver::SetUp, base::Unretained(&receivers[i]),
-                   base::Passed(&requests[2 * i]),
-                   base::Passed(&requests[2 * i + 1]),
-                   static_cast<size_t>(kMaxValue / 2),
-                   base::Bind(&NotificationCounter::OnGotNotification,
-                              base::Unretained(&counter))));
-  }
-
-  senders[0].sender_thread()->task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&TestSender::Send, base::Unretained(&senders[0]), 1));
-
-  run_loop.Run();
-
-  for (size_t i = 0; i < 4; ++i) {
-    base::RunLoop run_loop;
-    senders[i].sender_thread()->task_runner()->PostTaskAndReply(
-        FROM_HERE,
-        base::Bind(&TestSender::TearDown, base::Unretained(&senders[i])),
-        base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                   base::Unretained(this), base::Unretained(&run_loop)));
-    run_loop.Run();
-  }
-
-  for (size_t i = 0; i < 2; ++i) {
-    base::RunLoop run_loop;
-    receivers[i].receiver_thread()->task_runner()->PostTaskAndReply(
-        FROM_HERE,
-        base::Bind(&TestReceiver::TearDown, base::Unretained(&receivers[i])),
-        base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                   base::Unretained(this), base::Unretained(&run_loop)));
-    run_loop.Run();
-  }
-
-  EXPECT_EQ(static_cast<size_t>(kMaxValue / 2), receivers[0].values().size());
-  EXPECT_EQ(static_cast<size_t>(kMaxValue / 2), receivers[1].values().size());
-
-  for (size_t i = 0; i < 2; ++i) {
-    for (size_t j = 1; j < receivers[i].values().size(); ++j)
-      EXPECT_LT(receivers[i].values()[j - 1], receivers[i].values()[j]);
-  }
-}
-
-void CaptureInt32(int32_t* storage,
-                  const base::Closure& closure,
-                  int32_t value) {
-  *storage = value;
-  closure.Run();
-}
-
-void CaptureSenderPtrInfo(IntegerSenderAssociatedPtr* storage,
-                          const base::Closure& closure,
-                          IntegerSenderAssociatedPtrInfo info) {
-  storage->Bind(std::move(info));
-  closure.Run();
-}
-
-TEST_F(AssociatedInterfaceTest, PassAssociatedInterfaces) {
-  IntegerSenderConnectionPtr connection_ptr;
-  IntegerSenderConnectionImpl connection(MakeRequest(&connection_ptr));
-
-  IntegerSenderAssociatedPtr sender0;
-  connection_ptr->GetSender(MakeRequest(&sender0));
-
-  int32_t echoed_value = 0;
-  base::RunLoop run_loop;
-  sender0->Echo(123, base::Bind(&CaptureInt32, &echoed_value,
-                                run_loop.QuitClosure()));
-  run_loop.Run();
-  EXPECT_EQ(123, echoed_value);
-
-  IntegerSenderAssociatedPtr sender1;
-  base::RunLoop run_loop2;
-  connection_ptr->AsyncGetSender(
-      base::Bind(&CaptureSenderPtrInfo, &sender1, run_loop2.QuitClosure()));
-  run_loop2.Run();
-  EXPECT_TRUE(sender1);
-
-  base::RunLoop run_loop3;
-  sender1->Echo(456, base::Bind(&CaptureInt32, &echoed_value,
-                                run_loop3.QuitClosure()));
-  run_loop3.Run();
-  EXPECT_EQ(456, echoed_value);
-}
-
-TEST_F(AssociatedInterfaceTest, BindingWaitAndPauseWhenNoAssociatedInterfaces) {
-  IntegerSenderConnectionPtr connection_ptr;
-  IntegerSenderConnectionImpl connection(MakeRequest(&connection_ptr));
-
-  IntegerSenderAssociatedPtr sender0;
-  connection_ptr->GetSender(MakeRequest(&sender0));
-
-  EXPECT_FALSE(connection.binding()->HasAssociatedInterfaces());
-  // There are no associated interfaces running on the pipe yet. It is okay to
-  // pause.
-  connection.binding()->PauseIncomingMethodCallProcessing();
-  connection.binding()->ResumeIncomingMethodCallProcessing();
-
-  // There are no associated interfaces running on the pipe yet. It is okay to
-  // wait.
-  EXPECT_TRUE(connection.binding()->WaitForIncomingMethodCall());
-
-  // The previous wait has dispatched the GetSender request message, therefore
-  // an associated interface has been set up on the pipe. It is not allowed to
-  // wait or pause.
-  EXPECT_TRUE(connection.binding()->HasAssociatedInterfaces());
-}
-
-class PingServiceImpl : public PingService {
- public:
-  explicit PingServiceImpl(PingServiceAssociatedRequest request)
-      : binding_(this, std::move(request)) {}
-  ~PingServiceImpl() override {}
-
-  AssociatedBinding<PingService>& binding() { return binding_; }
-
-  void set_ping_handler(const base::Closure& handler) {
-    ping_handler_ = handler;
-  }
-
-  // PingService:
-  void Ping(const PingCallback& callback) override {
-    if (!ping_handler_.is_null())
-      ping_handler_.Run();
-    callback.Run();
-  }
-
- private:
-  AssociatedBinding<PingService> binding_;
-  base::Closure ping_handler_;
-};
-
-class PingProviderImpl : public AssociatedPingProvider {
- public:
-  explicit PingProviderImpl(AssociatedPingProviderRequest request)
-      : binding_(this, std::move(request)) {}
-  ~PingProviderImpl() override {}
-
-  // AssociatedPingProvider:
-  void GetPing(PingServiceAssociatedRequest request) override {
-    ping_services_.emplace_back(new PingServiceImpl(std::move(request)));
-
-    if (expected_bindings_count_ > 0 &&
-        ping_services_.size() == expected_bindings_count_ &&
-        !quit_waiting_.is_null()) {
-      expected_bindings_count_ = 0;
-      base::ResetAndReturn(&quit_waiting_).Run();
-    }
-  }
-
-  std::vector<std::unique_ptr<PingServiceImpl>>& ping_services() {
-    return ping_services_;
-  }
-
-  void WaitForBindings(size_t count) {
-    DCHECK(quit_waiting_.is_null());
-
-    expected_bindings_count_ = count;
-    base::RunLoop loop;
-    quit_waiting_ = loop.QuitClosure();
-    loop.Run();
-  }
-
- private:
-  Binding<AssociatedPingProvider> binding_;
-  std::vector<std::unique_ptr<PingServiceImpl>> ping_services_;
-  size_t expected_bindings_count_ = 0;
-  base::Closure quit_waiting_;
-};
-
-class CallbackFilter : public MessageReceiver {
- public:
-  explicit CallbackFilter(const base::Closure& callback)
-      : callback_(callback) {}
-  ~CallbackFilter() override {}
-
-  static std::unique_ptr<CallbackFilter> Wrap(const base::Closure& callback) {
-    return base::MakeUnique<CallbackFilter>(callback);
-  }
-
-  // MessageReceiver:
-  bool Accept(Message* message) override {
-    callback_.Run();
-    return true;
-  }
-
- private:
-  const base::Closure callback_;
-};
-
-// Verifies that filters work as expected on associated bindings, i.e. that
-// they're notified in order, before dispatch; and that each associated
-// binding in a group operates with its own set of filters.
-TEST_F(AssociatedInterfaceTest, BindingWithFilters) {
-  AssociatedPingProviderPtr provider;
-  PingProviderImpl provider_impl(MakeRequest(&provider));
-
-  PingServiceAssociatedPtr ping_a, ping_b;
-  provider->GetPing(MakeRequest(&ping_a));
-  provider->GetPing(MakeRequest(&ping_b));
-  provider_impl.WaitForBindings(2);
-
-  ASSERT_EQ(2u, provider_impl.ping_services().size());
-  PingServiceImpl& ping_a_impl = *provider_impl.ping_services()[0];
-  PingServiceImpl& ping_b_impl = *provider_impl.ping_services()[1];
-
-  int a_status, b_status;
-  auto handler_helper = [] (int* a_status, int* b_status, int expected_a_status,
-                            int new_a_status, int expected_b_status,
-                            int new_b_status) {
-    EXPECT_EQ(expected_a_status, *a_status);
-    EXPECT_EQ(expected_b_status, *b_status);
-    *a_status = new_a_status;
-    *b_status = new_b_status;
-  };
-  auto create_handler = [&] (int expected_a_status, int new_a_status,
-                             int expected_b_status, int new_b_status) {
-    return base::Bind(handler_helper, &a_status, &b_status, expected_a_status,
-                      new_a_status, expected_b_status, new_b_status);
-  };
-
-  ping_a_impl.binding().AddFilter(
-      CallbackFilter::Wrap(create_handler(0, 1, 0, 0)));
-  ping_a_impl.binding().AddFilter(
-      CallbackFilter::Wrap(create_handler(1, 2, 0, 0)));
-  ping_a_impl.set_ping_handler(create_handler(2, 3, 0, 0));
-
-  ping_b_impl.binding().AddFilter(
-      CallbackFilter::Wrap(create_handler(3, 3, 0, 1)));
-  ping_b_impl.binding().AddFilter(
-      CallbackFilter::Wrap(create_handler(3, 3, 1, 2)));
-  ping_b_impl.set_ping_handler(create_handler(3, 3, 2, 3));
-
-  for (int i = 0; i < 10; ++i) {
-    a_status = 0;
-    b_status = 0;
-
-    {
-      base::RunLoop loop;
-      ping_a->Ping(loop.QuitClosure());
-      loop.Run();
-    }
-
-    EXPECT_EQ(3, a_status);
-    EXPECT_EQ(0, b_status);
-
-    {
-      base::RunLoop loop;
-      ping_b->Ping(loop.QuitClosure());
-      loop.Run();
-    }
-
-    EXPECT_EQ(3, a_status);
-    EXPECT_EQ(3, b_status);
-  }
-}
-
-TEST_F(AssociatedInterfaceTest, AssociatedPtrFlushForTesting) {
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSender(&ptr_info, &request);
-
-  IntegerSenderImpl impl0(std::move(request));
-  AssociatedInterfacePtr<IntegerSender> ptr0;
-  ptr0.Bind(std::move(ptr_info));
-  ptr0.set_connection_error_handler(base::Bind(&Fail));
-
-  bool ptr0_callback_run = false;
-  ptr0->Echo(123, ExpectValueSetFlagAndRunClosure(
-                      123, &ptr0_callback_run, base::Bind(&base::DoNothing)));
-  ptr0.FlushForTesting();
-  EXPECT_TRUE(ptr0_callback_run);
-}
-
-void SetBool(bool* value) {
-  *value = true;
-}
-
-template <typename T>
-void SetBoolWithUnusedParameter(bool* value, T unused) {
-  *value = true;
-}
-
-TEST_F(AssociatedInterfaceTest, AssociatedPtrFlushForTestingWithClosedPeer) {
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSender(&ptr_info, &request);
-
-  AssociatedInterfacePtr<IntegerSender> ptr0;
-  ptr0.Bind(std::move(ptr_info));
-  bool called = false;
-  ptr0.set_connection_error_handler(base::Bind(&SetBool, &called));
-  request = nullptr;
-
-  ptr0.FlushForTesting();
-  EXPECT_TRUE(called);
-  ptr0.FlushForTesting();
-}
-
-TEST_F(AssociatedInterfaceTest, AssociatedBindingFlushForTesting) {
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSender(&ptr_info, &request);
-
-  IntegerSenderImpl impl0(std::move(request));
-  impl0.set_connection_error_handler(base::Bind(&Fail));
-  AssociatedInterfacePtr<IntegerSender> ptr0;
-  ptr0.Bind(std::move(ptr_info));
-
-  bool ptr0_callback_run = false;
-  ptr0->Echo(123, ExpectValueSetFlagAndRunClosure(
-                      123, &ptr0_callback_run, base::Bind(&base::DoNothing)));
-  // Because the flush is sent from the binding, it only guarantees that the
-  // request has been received, not the response. The second flush waits for the
-  // response to be received.
-  impl0.binding()->FlushForTesting();
-  impl0.binding()->FlushForTesting();
-  EXPECT_TRUE(ptr0_callback_run);
-}
-
-TEST_F(AssociatedInterfaceTest,
-       AssociatedBindingFlushForTestingWithClosedPeer) {
-  scoped_refptr<MultiplexRouter> router0;
-  scoped_refptr<MultiplexRouter> router1;
-  CreateRouterPair(&router0, &router1);
-
-  AssociatedInterfaceRequest<IntegerSender> request;
-  {
-    IntegerSenderAssociatedPtrInfo ptr_info;
-    CreateIntegerSenderWithExistingRouters(router1, &ptr_info, router0,
-                                           &request);
-  }
-
-  IntegerSenderImpl impl(std::move(request));
-  bool called = false;
-  impl.set_connection_error_handler(base::Bind(&SetBool, &called));
-  impl.binding()->FlushForTesting();
-  EXPECT_TRUE(called);
-  impl.binding()->FlushForTesting();
-}
-
-TEST_F(AssociatedInterfaceTest, BindingFlushForTesting) {
-  IntegerSenderConnectionPtr ptr;
-  IntegerSenderConnectionImpl impl(MakeRequest(&ptr));
-  bool called = false;
-  ptr->AsyncGetSender(base::Bind(
-      &SetBoolWithUnusedParameter<IntegerSenderAssociatedPtrInfo>, &called));
-  EXPECT_FALSE(called);
-  impl.binding()->set_connection_error_handler(base::Bind(&Fail));
-  // Because the flush is sent from the binding, it only guarantees that the
-  // request has been received, not the response. The second flush waits for the
-  // response to be received.
-  impl.binding()->FlushForTesting();
-  impl.binding()->FlushForTesting();
-  EXPECT_TRUE(called);
-}
-
-TEST_F(AssociatedInterfaceTest, BindingFlushForTestingWithClosedPeer) {
-  IntegerSenderConnectionPtr ptr;
-  IntegerSenderConnectionImpl impl(MakeRequest(&ptr));
-  bool called = false;
-  impl.binding()->set_connection_error_handler(base::Bind(&SetBool, &called));
-  ptr.reset();
-  EXPECT_FALSE(called);
-  impl.binding()->FlushForTesting();
-  EXPECT_TRUE(called);
-  impl.binding()->FlushForTesting();
-}
-
-TEST_F(AssociatedInterfaceTest, StrongBindingFlushForTesting) {
-  IntegerSenderConnectionPtr ptr;
-  auto binding =
-      MakeStrongBinding(base::MakeUnique<IntegerSenderConnectionImpl>(
-                            IntegerSenderConnectionRequest{}),
-                        MakeRequest(&ptr));
-  bool called = false;
-  IntegerSenderAssociatedPtr sender_ptr;
-  ptr->GetSender(MakeRequest(&sender_ptr));
-  sender_ptr->Echo(1, base::Bind(&SetBoolWithUnusedParameter<int>, &called));
-  EXPECT_FALSE(called);
-  // Because the flush is sent from the binding, it only guarantees that the
-  // request has been received, not the response. The second flush waits for the
-  // response to be received.
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  EXPECT_TRUE(called);
-}
-
-TEST_F(AssociatedInterfaceTest, StrongBindingFlushForTestingWithClosedPeer) {
-  IntegerSenderConnectionPtr ptr;
-  bool called = false;
-  auto binding =
-      MakeStrongBinding(base::MakeUnique<IntegerSenderConnectionImpl>(
-                            IntegerSenderConnectionRequest{}),
-                        MakeRequest(&ptr));
-  binding->set_connection_error_handler(base::Bind(&SetBool, &called));
-  ptr.reset();
-  EXPECT_FALSE(called);
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  EXPECT_TRUE(called);
-  ASSERT_FALSE(binding);
-}
-
-TEST_F(AssociatedInterfaceTest, PtrFlushForTesting) {
-  IntegerSenderConnectionPtr ptr;
-  IntegerSenderConnectionImpl impl(MakeRequest(&ptr));
-  bool called = false;
-  ptr.set_connection_error_handler(base::Bind(&Fail));
-  ptr->AsyncGetSender(base::Bind(
-      &SetBoolWithUnusedParameter<IntegerSenderAssociatedPtrInfo>, &called));
-  EXPECT_FALSE(called);
-  ptr.FlushForTesting();
-  EXPECT_TRUE(called);
-}
-
-TEST_F(AssociatedInterfaceTest, PtrFlushForTestingWithClosedPeer) {
-  IntegerSenderConnectionPtr ptr;
-  MakeRequest(&ptr);
-  bool called = false;
-  ptr.set_connection_error_handler(base::Bind(&SetBool, &called));
-  EXPECT_FALSE(called);
-  ptr.FlushForTesting();
-  EXPECT_TRUE(called);
-  ptr.FlushForTesting();
-}
-
-TEST_F(AssociatedInterfaceTest, AssociatedBindingConnectionErrorWithReason) {
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSender(&ptr_info, &request);
-
-  IntegerSenderImpl impl(std::move(request));
-  AssociatedInterfacePtr<IntegerSender> ptr;
-  ptr.Bind(std::move(ptr_info));
-
-  base::RunLoop run_loop;
-  impl.binding()->set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(123u, custom_reason);
-        EXPECT_EQ("farewell", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  ptr.ResetWithReason(123u, "farewell");
-
-  run_loop.Run();
-}
-
-TEST_F(AssociatedInterfaceTest,
-       PendingAssociatedBindingConnectionErrorWithReason) {
-  // Test that AssociatedBinding is notified with connection error when the
-  // interface hasn't associated with a message pipe and the peer is closed.
-
-  IntegerSenderAssociatedPtr ptr;
-  IntegerSenderImpl impl(MakeRequest(&ptr));
-
-  base::RunLoop run_loop;
-  impl.binding()->set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(123u, custom_reason);
-        EXPECT_EQ("farewell", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  ptr.ResetWithReason(123u, "farewell");
-
-  run_loop.Run();
-}
-
-TEST_F(AssociatedInterfaceTest, AssociatedPtrConnectionErrorWithReason) {
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSender(&ptr_info, &request);
-
-  IntegerSenderImpl impl(std::move(request));
-  AssociatedInterfacePtr<IntegerSender> ptr;
-  ptr.Bind(std::move(ptr_info));
-
-  base::RunLoop run_loop;
-  ptr.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(456u, custom_reason);
-        EXPECT_EQ("farewell", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  impl.binding()->CloseWithReason(456u, "farewell");
-
-  run_loop.Run();
-}
-
-TEST_F(AssociatedInterfaceTest, PendingAssociatedPtrConnectionErrorWithReason) {
-  // Test that AssociatedInterfacePtr is notified with connection error when the
-  // interface hasn't associated with a message pipe and the peer is closed.
-
-  IntegerSenderAssociatedPtr ptr;
-  auto request = MakeRequest(&ptr);
-
-  base::RunLoop run_loop;
-  ptr.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(456u, custom_reason);
-        EXPECT_EQ("farewell", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  request.ResetWithReason(456u, "farewell");
-
-  run_loop.Run();
-}
-
-TEST_F(AssociatedInterfaceTest, AssociatedRequestResetWithReason) {
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSender(&ptr_info, &request);
-
-  AssociatedInterfacePtr<IntegerSender> ptr;
-  ptr.Bind(std::move(ptr_info));
-
-  base::RunLoop run_loop;
-  ptr.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(789u, custom_reason);
-        EXPECT_EQ("long time no see", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  request.ResetWithReason(789u, "long time no see");
-
-  run_loop.Run();
-}
-
-TEST_F(AssociatedInterfaceTest, ThreadSafeAssociatedInterfacePtr) {
-  IntegerSenderConnectionPtr connection_ptr;
-  IntegerSenderConnectionImpl connection(MakeRequest(&connection_ptr));
-
-  IntegerSenderAssociatedPtr sender;
-  connection_ptr->GetSender(MakeRequest(&sender));
-
-  scoped_refptr<ThreadSafeIntegerSenderAssociatedPtr> thread_safe_sender =
-      ThreadSafeIntegerSenderAssociatedPtr::Create(std::move(sender));
-
-  {
-    // Test the thread safe pointer can be used from the interface ptr thread.
-    int32_t echoed_value = 0;
-    base::RunLoop run_loop;
-    (*thread_safe_sender)
-        ->Echo(123, base::Bind(&CaptureInt32, &echoed_value,
-                               run_loop.QuitClosure()));
-    run_loop.Run();
-    EXPECT_EQ(123, echoed_value);
-  }
-
-  // Test the thread safe pointer can be used from another thread.
-  base::RunLoop run_loop;
-  base::Thread other_thread("service test thread");
-  other_thread.Start();
-
-  auto run_method = base::Bind(
-      [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-         const base::Closure& quit_closure,
-         const scoped_refptr<ThreadSafeIntegerSenderAssociatedPtr>&
-             thread_safe_sender) {
-        auto done_callback = base::Bind(
-            [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-               const base::Closure& quit_closure,
-               base::PlatformThreadId thread_id, int32_t result) {
-              EXPECT_EQ(123, result);
-              // Validate the callback is invoked on the calling thread.
-              EXPECT_EQ(thread_id, base::PlatformThread::CurrentId());
-              // Notify the run_loop to quit.
-              main_task_runner->PostTask(FROM_HERE, quit_closure);
-            });
-        (*thread_safe_sender)
-            ->Echo(123,
-                   base::Bind(done_callback, main_task_runner, quit_closure,
-                              base::PlatformThread::CurrentId()));
-      },
-      base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(),
-      thread_safe_sender);
-  other_thread.message_loop()->task_runner()->PostTask(FROM_HERE, run_method);
-
-  // Block until the method callback is called on the background thread.
-  run_loop.Run();
-}
-
-struct ForwarderTestContext {
-  IntegerSenderConnectionPtr connection_ptr;
-  std::unique_ptr<IntegerSenderConnectionImpl> interface_impl;
-  IntegerSenderAssociatedRequest sender_request;
-};
-
-TEST_F(AssociatedInterfaceTest,
-       ThreadSafeAssociatedInterfacePtrWithTaskRunner) {
-  // Start the thread from where we'll bind the interface pointer.
-  base::Thread other_thread("service test thread");
-  other_thread.Start();
-  const scoped_refptr<base::SingleThreadTaskRunner>& other_thread_task_runner =
-      other_thread.message_loop()->task_runner();
-
-  ForwarderTestContext* context = new ForwarderTestContext();
-  IntegerSenderAssociatedPtrInfo sender_info;
-  base::WaitableEvent sender_info_bound_event(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  auto setup = [](base::WaitableEvent* sender_info_bound_event,
-                  IntegerSenderAssociatedPtrInfo* sender_info,
-                  ForwarderTestContext* context) {
-    context->interface_impl = base::MakeUnique<IntegerSenderConnectionImpl>(
-        MakeRequest(&context->connection_ptr));
-
-    auto sender_request = MakeRequest(sender_info);
-    context->connection_ptr->GetSender(std::move(sender_request));
-
-    // Unblock the main thread as soon as |sender_info| is set.
-    sender_info_bound_event->Signal();
-  };
-  other_thread_task_runner->PostTask(
-      FROM_HERE,
-      base::Bind(setup, &sender_info_bound_event, &sender_info, context));
-  sender_info_bound_event.Wait();
-
-  // Create a ThreadSafeAssociatedPtr that binds on the background thread and is
-  // associated with |connection_ptr| there.
-  scoped_refptr<ThreadSafeIntegerSenderAssociatedPtr> thread_safe_ptr =
-      ThreadSafeIntegerSenderAssociatedPtr::Create(std::move(sender_info),
-                                                   other_thread_task_runner);
-
-  // Issue a call on the thread-safe ptr immediately. Note that this may happen
-  // before the interface is bound on the background thread, and that must be
-  // OK.
-  {
-    auto echo_callback =
-        base::Bind([](const base::Closure& quit_closure, int32_t result) {
-          EXPECT_EQ(123, result);
-          quit_closure.Run();
-        });
-    base::RunLoop run_loop;
-    (*thread_safe_ptr)
-        ->Echo(123, base::Bind(echo_callback, run_loop.QuitClosure()));
-
-    // Block until the method callback is called.
-    run_loop.Run();
-  }
-
-  other_thread_task_runner->DeleteSoon(FROM_HERE, context);
-
-  // Reset the pointer now so the InterfacePtr associated resources can be
-  // deleted before the background thread's message loop is invalidated.
-  thread_safe_ptr = nullptr;
-}
-
-class DiscardingAssociatedPingProviderProvider
-    : public AssociatedPingProviderProvider {
- public:
-  void GetPingProvider(
-      AssociatedPingProviderAssociatedRequest request) override {}
-};
-
-TEST_F(AssociatedInterfaceTest, CloseWithoutBindingAssociatedRequest) {
-  DiscardingAssociatedPingProviderProvider ping_provider_provider;
-  mojo::Binding<AssociatedPingProviderProvider> binding(
-      &ping_provider_provider);
-  auto provider_provider = binding.CreateInterfacePtrAndBind();
-  AssociatedPingProviderAssociatedPtr provider;
-  provider_provider->GetPingProvider(mojo::MakeRequest(&provider));
-  PingServiceAssociatedPtr ping;
-  provider->GetPing(mojo::MakeRequest(&ping));
-  base::RunLoop run_loop;
-  ping.set_connection_error_handler(run_loop.QuitClosure());
-  run_loop.Run();
-}
-
-TEST_F(AssociatedInterfaceTest, GetIsolatedInterface) {
-  IntegerSenderAssociatedPtr sender;
-  GetIsolatedInterface(MakeRequest(&sender).PassHandle());
-  sender->Send(42);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc b/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc
deleted file mode 100644
index 569eb51..0000000
--- a/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc
+++ /dev/null
@@ -1,395 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/message_loop/message_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class TestTaskRunner : public base::SingleThreadTaskRunner {
- public:
-  TestTaskRunner()
-      : thread_id_(base::PlatformThread::CurrentRef()),
-        quit_called_(false),
-        task_ready_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
-                    base::WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::OnceClosure task,
-                                  base::TimeDelta delay) override {
-    NOTREACHED();
-    return false;
-  }
-
-  bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::OnceClosure task,
-                       base::TimeDelta delay) override {
-    {
-      base::AutoLock locker(lock_);
-      tasks_.push(std::move(task));
-    }
-    task_ready_.Signal();
-    return true;
-  }
-  bool RunsTasksOnCurrentThread() const override {
-    return base::PlatformThread::CurrentRef() == thread_id_;
-  }
-
-  // Only quits when Quit() is called.
-  void Run() {
-    DCHECK(RunsTasksOnCurrentThread());
-    quit_called_ = false;
-
-    while (true) {
-      {
-        base::AutoLock locker(lock_);
-        while (!tasks_.empty()) {
-          auto task = std::move(tasks_.front());
-          tasks_.pop();
-
-          {
-            base::AutoUnlock unlocker(lock_);
-            std::move(task).Run();
-            if (quit_called_)
-              return;
-          }
-        }
-      }
-      task_ready_.Wait();
-    }
-  }
-
-  void Quit() {
-    DCHECK(RunsTasksOnCurrentThread());
-    quit_called_ = true;
-  }
-
-  // Waits until one task is ready and runs it.
-  void RunOneTask() {
-    DCHECK(RunsTasksOnCurrentThread());
-
-    while (true) {
-      {
-        base::AutoLock locker(lock_);
-        if (!tasks_.empty()) {
-          auto task = std::move(tasks_.front());
-          tasks_.pop();
-
-          {
-            base::AutoUnlock unlocker(lock_);
-            std::move(task).Run();
-            return;
-          }
-        }
-      }
-      task_ready_.Wait();
-    }
-  }
-
- private:
-  ~TestTaskRunner() override {}
-
-  const base::PlatformThreadRef thread_id_;
-  bool quit_called_;
-  base::WaitableEvent task_ready_;
-
-  // Protect |tasks_|.
-  base::Lock lock_;
-  std::queue<base::OnceClosure> tasks_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestTaskRunner);
-};
-
-template <typename BindingType, typename RequestType>
-class IntegerSenderImpl : public IntegerSender {
- public:
-  IntegerSenderImpl(RequestType request,
-                    scoped_refptr<base::SingleThreadTaskRunner> runner)
-      : binding_(this, std::move(request), std::move(runner)) {}
-
-  ~IntegerSenderImpl() override {}
-
-  using EchoHandler = base::Callback<void(int32_t, const EchoCallback&)>;
-
-  void set_echo_handler(const EchoHandler& handler) { echo_handler_ = handler; }
-
-  void Echo(int32_t value, const EchoCallback& callback) override {
-    if (echo_handler_.is_null())
-      callback.Run(value);
-    else
-      echo_handler_.Run(value, callback);
-  }
-  void Send(int32_t value) override { NOTREACHED(); }
-
-  BindingType* binding() { return &binding_; }
-
- private:
-  BindingType binding_;
-  EchoHandler echo_handler_;
-};
-
-class IntegerSenderConnectionImpl : public IntegerSenderConnection {
- public:
-  using SenderType = IntegerSenderImpl<AssociatedBinding<IntegerSender>,
-                                       IntegerSenderAssociatedRequest>;
-
-  explicit IntegerSenderConnectionImpl(
-      IntegerSenderConnectionRequest request,
-      scoped_refptr<base::SingleThreadTaskRunner> runner,
-      scoped_refptr<base::SingleThreadTaskRunner> sender_runner)
-      : binding_(this, std::move(request), std::move(runner)),
-        sender_runner_(std::move(sender_runner)) {}
-
-  ~IntegerSenderConnectionImpl() override {}
-
-  void set_get_sender_notification(const base::Closure& notification) {
-    get_sender_notification_ = notification;
-  }
-  void GetSender(IntegerSenderAssociatedRequest sender) override {
-    sender_impl_.reset(new SenderType(std::move(sender), sender_runner_));
-    get_sender_notification_.Run();
-  }
-
-  void AsyncGetSender(const AsyncGetSenderCallback& callback) override {
-    NOTREACHED();
-  }
-
-  Binding<IntegerSenderConnection>* binding() { return &binding_; }
-
-  SenderType* sender_impl() { return sender_impl_.get(); }
-
- private:
-  Binding<IntegerSenderConnection> binding_;
-  std::unique_ptr<SenderType> sender_impl_;
-  scoped_refptr<base::SingleThreadTaskRunner> sender_runner_;
-  base::Closure get_sender_notification_;
-};
-
-class BindTaskRunnerTest : public testing::Test {
- protected:
-  void SetUp() override {
-    binding_task_runner_ = scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-    ptr_task_runner_ = scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-
-    auto request = MakeRequest(&ptr_, ptr_task_runner_);
-    impl_.reset(new ImplType(std::move(request), binding_task_runner_));
-  }
-
-  base::MessageLoop loop_;
-  scoped_refptr<TestTaskRunner> binding_task_runner_;
-  scoped_refptr<TestTaskRunner> ptr_task_runner_;
-
-  IntegerSenderPtr ptr_;
-  using ImplType =
-      IntegerSenderImpl<Binding<IntegerSender>, IntegerSenderRequest>;
-  std::unique_ptr<ImplType> impl_;
-};
-
-class AssociatedBindTaskRunnerTest : public testing::Test {
- protected:
-  void SetUp() override {
-    connection_binding_task_runner_ =
-        scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-    connection_ptr_task_runner_ =
-        scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-    sender_binding_task_runner_ =
-        scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-    sender_ptr_task_runner_ = scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-
-    auto connection_request =
-        MakeRequest(&connection_ptr_, connection_ptr_task_runner_);
-    connection_impl_.reset(new IntegerSenderConnectionImpl(
-        std::move(connection_request), connection_binding_task_runner_,
-        sender_binding_task_runner_));
-
-    connection_impl_->set_get_sender_notification(
-        base::Bind(&AssociatedBindTaskRunnerTest::QuitTaskRunner,
-                   base::Unretained(this)));
-
-    connection_ptr_->GetSender(
-        MakeRequest(&sender_ptr_, sender_ptr_task_runner_));
-    connection_binding_task_runner_->Run();
-  }
-
-  void QuitTaskRunner() {
-    connection_binding_task_runner_->Quit();
-  }
-
-  base::MessageLoop loop_;
-  scoped_refptr<TestTaskRunner> connection_binding_task_runner_;
-  scoped_refptr<TestTaskRunner> connection_ptr_task_runner_;
-  scoped_refptr<TestTaskRunner> sender_binding_task_runner_;
-  scoped_refptr<TestTaskRunner> sender_ptr_task_runner_;
-
-  IntegerSenderConnectionPtr connection_ptr_;
-  std::unique_ptr<IntegerSenderConnectionImpl> connection_impl_;
-  IntegerSenderAssociatedPtr sender_ptr_;
-};
-
-void DoSetFlagAndQuitTaskRunner(bool* flag,
-                                scoped_refptr<TestTaskRunner> task_runner) {
-  *flag = true;
-  if (task_runner)
-    task_runner->Quit();
-}
-
-void DoExpectValueSetFlagAndQuitTaskRunner(
-    int32_t expected_value,
-    bool* flag,
-    scoped_refptr<TestTaskRunner> task_runner,
-    int32_t value) {
-  EXPECT_EQ(expected_value, value);
-  DoSetFlagAndQuitTaskRunner(flag, task_runner);
-}
-
-void DoExpectValueSetFlagForwardValueAndQuitTaskRunner(
-    int32_t expected_value,
-    bool* flag,
-    scoped_refptr<TestTaskRunner> task_runner,
-    int32_t value,
-    const IntegerSender::EchoCallback& callback) {
-  EXPECT_EQ(expected_value, value);
-  *flag = true;
-  callback.Run(value);
-  task_runner->Quit();
-}
-
-base::Closure SetFlagAndQuitTaskRunner(
-    bool* flag,
-    scoped_refptr<TestTaskRunner> task_runner) {
-  return base::Bind(&DoSetFlagAndQuitTaskRunner, flag, task_runner);
-}
-
-base::Callback<void(int32_t)> ExpectValueSetFlagAndQuitTaskRunner(
-    int32_t expected_value,
-    bool* flag,
-    scoped_refptr<TestTaskRunner> task_runner) {
-  return base::Bind(&DoExpectValueSetFlagAndQuitTaskRunner, expected_value,
-                    flag, task_runner);
-}
-
-TEST_F(BindTaskRunnerTest, MethodCall) {
-  bool echo_called = false;
-  impl_->set_echo_handler(
-      base::Bind(&DoExpectValueSetFlagForwardValueAndQuitTaskRunner,
-                 1024, &echo_called, binding_task_runner_));
-  bool echo_replied = false;
-  ptr_->Echo(1024, ExpectValueSetFlagAndQuitTaskRunner(1024, &echo_replied,
-                                                       ptr_task_runner_));
-  binding_task_runner_->Run();
-  EXPECT_TRUE(echo_called);
-  ptr_task_runner_->Run();
-  EXPECT_TRUE(echo_replied);
-}
-
-TEST_F(BindTaskRunnerTest, BindingConnectionError) {
-  bool connection_error_called = false;
-  impl_->binding()->set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&connection_error_called, binding_task_runner_));
-  ptr_.reset();
-  binding_task_runner_->Run();
-  EXPECT_TRUE(connection_error_called);
-}
-
-TEST_F(BindTaskRunnerTest, PtrConnectionError) {
-  bool connection_error_called = false;
-  ptr_.set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&connection_error_called, ptr_task_runner_));
-  impl_->binding()->Close();
-  ptr_task_runner_->Run();
-  EXPECT_TRUE(connection_error_called);
-}
-
-void ExpectValueSetFlagAndForward(int32_t expected_value,
-                                  bool* flag,
-                                  int32_t value,
-                                  const IntegerSender::EchoCallback& callback) {
-  EXPECT_EQ(expected_value, value);
-  *flag = true;
-  callback.Run(value);
-}
-
-TEST_F(AssociatedBindTaskRunnerTest, MethodCall) {
-  bool echo_called = false;
-  connection_impl_->sender_impl()->set_echo_handler(
-      base::Bind(&ExpectValueSetFlagAndForward, 1024, &echo_called));
-
-  bool echo_replied = false;
-  sender_ptr_->Echo(
-      1024, ExpectValueSetFlagAndQuitTaskRunner(1024, &echo_replied, nullptr));
-
-  // The Echo request first arrives at the master endpoint's task runner, and
-  // then is forwarded to the associated endpoint's task runner.
-  connection_binding_task_runner_->RunOneTask();
-  sender_binding_task_runner_->RunOneTask();
-  EXPECT_TRUE(echo_called);
-
-  // Similarly, the Echo response arrives at the master endpoint's task runner
-  // and then is forwarded to the associated endpoint's task runner.
-  connection_ptr_task_runner_->RunOneTask();
-  sender_ptr_task_runner_->RunOneTask();
-  EXPECT_TRUE(echo_replied);
-}
-
-TEST_F(AssociatedBindTaskRunnerTest, BindingConnectionError) {
-  bool sender_impl_error = false;
-  connection_impl_->sender_impl()->binding()->set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&sender_impl_error,
-                               sender_binding_task_runner_));
-  bool connection_impl_error = false;
-  connection_impl_->binding()->set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&connection_impl_error,
-                               connection_binding_task_runner_));
-  bool sender_ptr_error = false;
-  sender_ptr_.set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&sender_ptr_error, sender_ptr_task_runner_));
-  connection_ptr_.reset();
-  sender_ptr_task_runner_->Run();
-  EXPECT_TRUE(sender_ptr_error);
-  connection_binding_task_runner_->Run();
-  EXPECT_TRUE(connection_impl_error);
-  sender_binding_task_runner_->Run();
-  EXPECT_TRUE(sender_impl_error);
-}
-
-TEST_F(AssociatedBindTaskRunnerTest, PtrConnectionError) {
-  bool sender_impl_error = false;
-  connection_impl_->sender_impl()->binding()->set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&sender_impl_error,
-                               sender_binding_task_runner_));
-  bool connection_ptr_error = false;
-  connection_ptr_.set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&connection_ptr_error,
-                               connection_ptr_task_runner_));
-  bool sender_ptr_error = false;
-  sender_ptr_.set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&sender_ptr_error, sender_ptr_task_runner_));
-  connection_impl_->binding()->Close();
-  sender_binding_task_runner_->Run();
-  EXPECT_TRUE(sender_impl_error);
-  connection_ptr_task_runner_->Run();
-  EXPECT_TRUE(connection_ptr_error);
-  sender_ptr_task_runner_->Run();
-  EXPECT_TRUE(sender_ptr_error);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/binding_callback_unittest.cc b/mojo/public/cpp/bindings/tests/binding_callback_unittest.cc
deleted file mode 100644
index 43122ce..0000000
--- a/mojo/public/cpp/bindings/tests/binding_callback_unittest.cc
+++ /dev/null
@@ -1,338 +0,0 @@
-// Copyright 2015 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 <stdint.h>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/test/gtest_util.h"
-#include "build/build_config.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "mojo/public/cpp/test_support/test_support.h"
-#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-///////////////////////////////////////////////////////////////////////////////
-//
-// The tests in this file are designed to test the interaction between a
-// Callback and its associated Binding. If a Callback is deleted before
-// being used we DCHECK fail--unless the associated Binding has already
-// been closed or deleted. This contract must be explained to the Mojo
-// application developer. For example it is the developer's responsibility to
-// ensure that the Binding is destroyed before an unused Callback is destroyed.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-namespace mojo {
-namespace test {
-namespace {
-
-void SaveValue(int32_t* storage, const base::Closure& closure, int32_t value) {
-  *storage = value;
-  if (!closure.is_null())
-    closure.Run();
-}
-
-base::Callback<void(int32_t)> BindValueSaver(int32_t* last_value_seen,
-                                             const base::Closure& closure) {
-  return base::Bind(&SaveValue, last_value_seen, closure);
-}
-
-// An implementation of sample::Provider used on the server side.
-// It only implements one of the methods: EchoInt().
-// All it does is save the values and Callbacks it sees.
-class InterfaceImpl : public sample::Provider {
- public:
-  InterfaceImpl()
-      : last_server_value_seen_(0),
-        callback_saved_(new EchoIntCallback) {}
-
-  ~InterfaceImpl() override {
-    if (callback_saved_) {
-      delete callback_saved_;
-    }
-  }
-
-  // Run's the callback previously saved from the last invocation
-  // of |EchoInt()|.
-  bool RunCallback() {
-    if (callback_saved_) {
-      callback_saved_->Run(last_server_value_seen_);
-      return true;
-    }
-    return false;
-  }
-
-  // Delete's the previously saved callback.
-  void DeleteCallback() {
-    delete callback_saved_;
-    callback_saved_ = nullptr;
-  }
-
-  // sample::Provider implementation
-
-  // Saves its two input values in member variables and does nothing else.
-  void EchoInt(int32_t x, const EchoIntCallback& callback) override {
-    last_server_value_seen_ = x;
-    *callback_saved_ = callback;
-    if (!closure_.is_null()) {
-      closure_.Run();
-      closure_.Reset();
-    }
-  }
-
-  void EchoString(const std::string& a,
-                  const EchoStringCallback& callback) override {
-    CHECK(false) << "Not implemented.";
-  }
-
-  void EchoStrings(const std::string& a,
-                   const std::string& b,
-                   const EchoStringsCallback& callback) override {
-    CHECK(false) << "Not implemented.";
-  }
-
-  void EchoMessagePipeHandle(
-      ScopedMessagePipeHandle a,
-      const EchoMessagePipeHandleCallback& callback) override {
-    CHECK(false) << "Not implemented.";
-  }
-
-  void EchoEnum(sample::Enum a, const EchoEnumCallback& callback) override {
-    CHECK(false) << "Not implemented.";
-  }
-
-  void resetLastServerValueSeen() { last_server_value_seen_ = 0; }
-
-  int32_t last_server_value_seen() const { return last_server_value_seen_; }
-
-  void set_closure(const base::Closure& closure) { closure_ = closure; }
-
- private:
-  int32_t last_server_value_seen_;
-  EchoIntCallback* callback_saved_;
-  base::Closure closure_;
-};
-
-class BindingCallbackTest : public testing::Test {
- public:
-  BindingCallbackTest() {}
-  ~BindingCallbackTest() override {}
-
- protected:
-  int32_t last_client_callback_value_seen_;
-  sample::ProviderPtr interface_ptr_;
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
- private:
-  base::MessageLoop loop_;
-};
-
-// Tests that the InterfacePtr and the Binding can communicate with each
-// other normally.
-TEST_F(BindingCallbackTest, Basic) {
-  // Create the ServerImpl and the Binding.
-  InterfaceImpl server_impl;
-  Binding<sample::Provider> binding(&server_impl, MakeRequest(&interface_ptr_));
-
-  // Initialize the test values.
-  server_impl.resetLastServerValueSeen();
-  last_client_callback_value_seen_ = 0;
-
-  // Invoke the Echo method.
-  base::RunLoop run_loop, run_loop2;
-  server_impl.set_closure(run_loop.QuitClosure());
-  interface_ptr_->EchoInt(
-      7,
-      BindValueSaver(&last_client_callback_value_seen_,
-                     run_loop2.QuitClosure()));
-  run_loop.Run();
-
-  // Check that server saw the correct value, but the client has not yet.
-  EXPECT_EQ(7, server_impl.last_server_value_seen());
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  // Now run the Callback.
-  server_impl.RunCallback();
-  run_loop2.Run();
-
-  // Check that the client has now seen the correct value.
-  EXPECT_EQ(7, last_client_callback_value_seen_);
-
-  // Initialize the test values again.
-  server_impl.resetLastServerValueSeen();
-  last_client_callback_value_seen_ = 0;
-
-  // Invoke the Echo method again.
-  base::RunLoop run_loop3, run_loop4;
-  server_impl.set_closure(run_loop3.QuitClosure());
-  interface_ptr_->EchoInt(
-      13,
-      BindValueSaver(&last_client_callback_value_seen_,
-                     run_loop4.QuitClosure()));
-  run_loop3.Run();
-
-  // Check that server saw the correct value, but the client has not yet.
-  EXPECT_EQ(13, server_impl.last_server_value_seen());
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  // Now run the Callback again.
-  server_impl.RunCallback();
-  run_loop4.Run();
-
-  // Check that the client has now seen the correct value again.
-  EXPECT_EQ(13, last_client_callback_value_seen_);
-}
-
-// Tests that running the Callback after the Binding has been deleted
-// results in a clean failure.
-TEST_F(BindingCallbackTest, DeleteBindingThenRunCallback) {
-  // Create the ServerImpl.
-  InterfaceImpl server_impl;
-  base::RunLoop run_loop;
-  {
-    // Create the binding in an inner scope so it can be deleted first.
-    Binding<sample::Provider> binding(&server_impl,
-                                      MakeRequest(&interface_ptr_));
-    interface_ptr_.set_connection_error_handler(run_loop.QuitClosure());
-
-    // Initialize the test values.
-    server_impl.resetLastServerValueSeen();
-    last_client_callback_value_seen_ = 0;
-
-    // Invoke the Echo method.
-    base::RunLoop run_loop2;
-    server_impl.set_closure(run_loop2.QuitClosure());
-    interface_ptr_->EchoInt(
-        7,
-        BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
-    run_loop2.Run();
-  }
-  // The binding has now been destroyed and the pipe is closed.
-
-  // Check that server saw the correct value, but the client has not yet.
-  EXPECT_EQ(7, server_impl.last_server_value_seen());
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  // Now try to run the Callback. This should do nothing since the pipe
-  // is closed.
-  EXPECT_TRUE(server_impl.RunCallback());
-  PumpMessages();
-
-  // Check that the client has still not seen the correct value.
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  // Attempt to invoke the method again and confirm that an error was
-  // encountered.
-  interface_ptr_->EchoInt(
-      13,
-      BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
-  run_loop.Run();
-  EXPECT_TRUE(interface_ptr_.encountered_error());
-}
-
-// Tests that deleting a Callback without running it after the corresponding
-// binding has already been deleted does not result in a crash.
-TEST_F(BindingCallbackTest, DeleteBindingThenDeleteCallback) {
-  // Create the ServerImpl.
-  InterfaceImpl server_impl;
-  {
-    // Create the binding in an inner scope so it can be deleted first.
-    Binding<sample::Provider> binding(&server_impl,
-                                      MakeRequest(&interface_ptr_));
-
-    // Initialize the test values.
-    server_impl.resetLastServerValueSeen();
-    last_client_callback_value_seen_ = 0;
-
-    // Invoke the Echo method.
-    base::RunLoop run_loop;
-    server_impl.set_closure(run_loop.QuitClosure());
-    interface_ptr_->EchoInt(
-        7,
-        BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
-    run_loop.Run();
-  }
-  // The binding has now been destroyed and the pipe is closed.
-
-  // Check that server saw the correct value, but the client has not yet.
-  EXPECT_EQ(7, server_impl.last_server_value_seen());
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  // Delete the callback without running it. This should not
-  // cause a problem because the insfrastructure can detect that the
-  // binding has already been destroyed and the pipe is closed.
-  server_impl.DeleteCallback();
-}
-
-// Tests that closing a Binding allows us to delete a callback
-// without running it without encountering a crash.
-TEST_F(BindingCallbackTest, CloseBindingBeforeDeletingCallback) {
-  // Create the ServerImpl and the Binding.
-  InterfaceImpl server_impl;
-  Binding<sample::Provider> binding(&server_impl, MakeRequest(&interface_ptr_));
-
-  // Initialize the test values.
-  server_impl.resetLastServerValueSeen();
-  last_client_callback_value_seen_ = 0;
-
-  // Invoke the Echo method.
-  base::RunLoop run_loop;
-  server_impl.set_closure(run_loop.QuitClosure());
-  interface_ptr_->EchoInt(
-      7,
-      BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
-  run_loop.Run();
-
-  // Check that server saw the correct value, but the client has not yet.
-  EXPECT_EQ(7, server_impl.last_server_value_seen());
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  // Now close the Binding.
-  binding.Close();
-
-  // Delete the callback without running it. This should not
-  // cause a crash because the insfrastructure can detect that the
-  // binding has already been closed.
-  server_impl.DeleteCallback();
-
-  // Check that the client has still not seen the correct value.
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-}
-
-// Tests that deleting a Callback without using it before the
-// Binding has been destroyed or closed results in a DCHECK.
-TEST_F(BindingCallbackTest, DeleteCallbackBeforeBindingDeathTest) {
-  // Create the ServerImpl and the Binding.
-  InterfaceImpl server_impl;
-  Binding<sample::Provider> binding(&server_impl, MakeRequest(&interface_ptr_));
-
-  // Initialize the test values.
-  server_impl.resetLastServerValueSeen();
-  last_client_callback_value_seen_ = 0;
-
-  // Invoke the Echo method.
-  base::RunLoop run_loop;
-  server_impl.set_closure(run_loop.QuitClosure());
-  interface_ptr_->EchoInt(
-      7,
-      BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
-  run_loop.Run();
-
-  // Check that server saw the correct value, but the client has not yet.
-  EXPECT_EQ(7, server_impl.last_server_value_seen());
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  EXPECT_DCHECK_DEATH(server_impl.DeleteCallback());
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/binding_set_unittest.cc b/mojo/public/cpp/bindings/tests/binding_set_unittest.cc
deleted file mode 100644
index 07acfbe..0000000
--- a/mojo/public/cpp/bindings/tests/binding_set_unittest.cc
+++ /dev/null
@@ -1,416 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <utility>
-
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/associated_binding_set.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/strong_binding_set.h"
-#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class BindingSetTest : public testing::Test {
- public:
-  BindingSetTest() {}
-  ~BindingSetTest() override {}
-
-  base::MessageLoop& loop() { return loop_; }
-
- private:
-  base::MessageLoop loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(BindingSetTest);
-};
-
-template <typename BindingSetType, typename ContextType>
-void ExpectContextHelper(BindingSetType* binding_set,
-                         ContextType expected_context) {
-  EXPECT_EQ(expected_context, binding_set->dispatch_context());
-}
-
-template <typename BindingSetType, typename ContextType>
-base::Closure ExpectContext(BindingSetType* binding_set,
-                            ContextType expected_context) {
-  return base::Bind(
-      &ExpectContextHelper<BindingSetType, ContextType>, binding_set,
-      expected_context);
-}
-
-base::Closure Sequence(const base::Closure& first,
-                       const base::Closure& second) {
-  return base::Bind(
-      [] (const base::Closure& first, const base::Closure& second) {
-        first.Run();
-        second.Run();
-      }, first, second);
-}
-
-class PingImpl : public PingService {
- public:
-  PingImpl() {}
-  ~PingImpl() override {}
-
-  void set_ping_handler(const base::Closure& handler) {
-    ping_handler_ = handler;
-  }
-
- private:
-  // PingService:
-  void Ping(const PingCallback& callback) override {
-    if (!ping_handler_.is_null())
-      ping_handler_.Run();
-    callback.Run();
-  }
-
-  base::Closure ping_handler_;
-};
-
-TEST_F(BindingSetTest, BindingSetContext) {
-  PingImpl impl;
-
-  BindingSet<PingService, int> bindings;
-  PingServicePtr ping_a, ping_b;
-  bindings.AddBinding(&impl, MakeRequest(&ping_a), 1);
-  bindings.AddBinding(&impl, MakeRequest(&ping_b), 2);
-
-  {
-    impl.set_ping_handler(ExpectContext(&bindings, 1));
-    base::RunLoop loop;
-    ping_a->Ping(loop.QuitClosure());
-    loop.Run();
-  }
-
-  {
-    impl.set_ping_handler(ExpectContext(&bindings, 2));
-    base::RunLoop loop;
-    ping_b->Ping(loop.QuitClosure());
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectContext(&bindings, 1), loop.QuitClosure()));
-    ping_a.reset();
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectContext(&bindings, 2), loop.QuitClosure()));
-    ping_b.reset();
-    loop.Run();
-  }
-
-  EXPECT_TRUE(bindings.empty());
-}
-
-TEST_F(BindingSetTest, BindingSetConnectionErrorWithReason) {
-  PingImpl impl;
-  PingServicePtr ptr;
-  BindingSet<PingService> bindings;
-  bindings.AddBinding(&impl, MakeRequest(&ptr));
-
-  base::RunLoop run_loop;
-  bindings.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(1024u, custom_reason);
-        EXPECT_EQ("bye", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  ptr.ResetWithReason(1024u, "bye");
-}
-
-class PingProviderImpl : public AssociatedPingProvider, public PingService {
- public:
-  PingProviderImpl() {}
-  ~PingProviderImpl() override {}
-
-  void set_new_ping_context(int context) { new_ping_context_ = context; }
-
-  void set_new_ping_handler(const base::Closure& handler) {
-    new_ping_handler_ = handler;
-  }
-
-  void set_ping_handler(const base::Closure& handler) {
-    ping_handler_ = handler;
-  }
-
-  AssociatedBindingSet<PingService, int>& ping_bindings() {
-    return ping_bindings_;
-  }
-
- private:
-  // AssociatedPingProvider:
-  void GetPing(PingServiceAssociatedRequest request) override {
-    ping_bindings_.AddBinding(this, std::move(request), new_ping_context_);
-    if (!new_ping_handler_.is_null())
-      new_ping_handler_.Run();
-  }
-
-  // PingService:
-  void Ping(const PingCallback& callback) override {
-    if (!ping_handler_.is_null())
-      ping_handler_.Run();
-    callback.Run();
-  }
-
-  AssociatedBindingSet<PingService, int> ping_bindings_;
-  int new_ping_context_ = -1;
-  base::Closure ping_handler_;
-  base::Closure new_ping_handler_;
-};
-
-TEST_F(BindingSetTest, AssociatedBindingSetContext) {
-  AssociatedPingProviderPtr provider;
-  PingProviderImpl impl;
-  Binding<AssociatedPingProvider> binding(&impl, MakeRequest(&provider));
-
-  PingServiceAssociatedPtr ping_a;
-  {
-    base::RunLoop loop;
-    impl.set_new_ping_context(1);
-    impl.set_new_ping_handler(loop.QuitClosure());
-    provider->GetPing(MakeRequest(&ping_a));
-    loop.Run();
-  }
-
-  PingServiceAssociatedPtr ping_b;
-  {
-    base::RunLoop loop;
-    impl.set_new_ping_context(2);
-    impl.set_new_ping_handler(loop.QuitClosure());
-    provider->GetPing(MakeRequest(&ping_b));
-    loop.Run();
-  }
-
-  {
-    impl.set_ping_handler(ExpectContext(&impl.ping_bindings(), 1));
-    base::RunLoop loop;
-    ping_a->Ping(loop.QuitClosure());
-    loop.Run();
-  }
-
-  {
-    impl.set_ping_handler(ExpectContext(&impl.ping_bindings(), 2));
-    base::RunLoop loop;
-    ping_b->Ping(loop.QuitClosure());
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    impl.ping_bindings().set_connection_error_handler(
-        Sequence(ExpectContext(&impl.ping_bindings(), 1), loop.QuitClosure()));
-    ping_a.reset();
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    impl.ping_bindings().set_connection_error_handler(
-        Sequence(ExpectContext(&impl.ping_bindings(), 2), loop.QuitClosure()));
-    ping_b.reset();
-    loop.Run();
-  }
-
-  EXPECT_TRUE(impl.ping_bindings().empty());
-}
-
-TEST_F(BindingSetTest, MasterInterfaceBindingSetContext) {
-  AssociatedPingProviderPtr provider_a, provider_b;
-  PingProviderImpl impl;
-  BindingSet<AssociatedPingProvider, int> bindings;
-
-  bindings.AddBinding(&impl, MakeRequest(&provider_a), 1);
-  bindings.AddBinding(&impl, MakeRequest(&provider_b), 2);
-
-  {
-    PingServiceAssociatedPtr ping;
-    base::RunLoop loop;
-    impl.set_new_ping_handler(
-        Sequence(ExpectContext(&bindings, 1), loop.QuitClosure()));
-    provider_a->GetPing(MakeRequest(&ping));
-    loop.Run();
-  }
-
-  {
-    PingServiceAssociatedPtr ping;
-    base::RunLoop loop;
-    impl.set_new_ping_handler(
-        Sequence(ExpectContext(&bindings, 2), loop.QuitClosure()));
-    provider_b->GetPing(MakeRequest(&ping));
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectContext(&bindings, 1), loop.QuitClosure()));
-    provider_a.reset();
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectContext(&bindings, 2), loop.QuitClosure()));
-    provider_b.reset();
-    loop.Run();
-  }
-
-  EXPECT_TRUE(bindings.empty());
-}
-
-TEST_F(BindingSetTest, PreDispatchHandler) {
-  PingImpl impl;
-
-  BindingSet<PingService, int> bindings;
-  PingServicePtr ping_a, ping_b;
-  bindings.AddBinding(&impl, MakeRequest(&ping_a), 1);
-  bindings.AddBinding(&impl, MakeRequest(&ping_b), 2);
-
-  {
-    bindings.set_pre_dispatch_handler(base::Bind([] (const int& context) {
-      EXPECT_EQ(1, context);
-    }));
-    base::RunLoop loop;
-    ping_a->Ping(loop.QuitClosure());
-    loop.Run();
-  }
-
-  {
-    bindings.set_pre_dispatch_handler(base::Bind([] (const int& context) {
-      EXPECT_EQ(2, context);
-    }));
-    base::RunLoop loop;
-    ping_b->Ping(loop.QuitClosure());
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    bindings.set_pre_dispatch_handler(
-        base::Bind([](base::RunLoop* loop, const int& context) {
-          EXPECT_EQ(1, context);
-          loop->Quit();
-        }, &loop));
-    ping_a.reset();
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    bindings.set_pre_dispatch_handler(
-        base::Bind([](base::RunLoop* loop, const int& context) {
-          EXPECT_EQ(2, context);
-          loop->Quit();
-        }, &loop));
-    ping_b.reset();
-    loop.Run();
-  }
-
-  EXPECT_TRUE(bindings.empty());
-}
-
-TEST_F(BindingSetTest, AssociatedBindingSetConnectionErrorWithReason) {
-  AssociatedPingProviderPtr master_ptr;
-  PingProviderImpl master_impl;
-  Binding<AssociatedPingProvider> master_binding(&master_impl, &master_ptr);
-
-  base::RunLoop run_loop;
-  master_impl.ping_bindings().set_connection_error_with_reason_handler(
-      base::Bind(
-          [](const base::Closure& quit_closure, uint32_t custom_reason,
-             const std::string& description) {
-            EXPECT_EQ(2048u, custom_reason);
-            EXPECT_EQ("bye", description);
-            quit_closure.Run();
-          },
-          run_loop.QuitClosure()));
-
-  PingServiceAssociatedPtr ptr;
-  master_ptr->GetPing(MakeRequest(&ptr));
-
-  ptr.ResetWithReason(2048u, "bye");
-
-  run_loop.Run();
-}
-
-class PingInstanceCounter : public PingService {
- public:
-  PingInstanceCounter() { ++instance_count; }
-  ~PingInstanceCounter() override { --instance_count; }
-
-  void Ping(const PingCallback& callback) override {}
-
-  static int instance_count;
-};
-int PingInstanceCounter::instance_count = 0;
-
-TEST_F(BindingSetTest, StrongBinding_Destructor) {
-  PingServicePtr ping_a, ping_b;
-  auto bindings = base::MakeUnique<StrongBindingSet<PingService>>();
-
-  bindings->AddBinding(base::MakeUnique<PingInstanceCounter>(),
-                       mojo::MakeRequest(&ping_a));
-  EXPECT_EQ(1, PingInstanceCounter::instance_count);
-
-  bindings->AddBinding(base::MakeUnique<PingInstanceCounter>(),
-                       mojo::MakeRequest(&ping_b));
-  EXPECT_EQ(2, PingInstanceCounter::instance_count);
-
-  bindings.reset();
-  EXPECT_EQ(0, PingInstanceCounter::instance_count);
-}
-
-TEST_F(BindingSetTest, StrongBinding_ConnectionError) {
-  PingServicePtr ping_a, ping_b;
-  StrongBindingSet<PingService> bindings;
-  bindings.AddBinding(base::MakeUnique<PingInstanceCounter>(),
-                      mojo::MakeRequest(&ping_a));
-  bindings.AddBinding(base::MakeUnique<PingInstanceCounter>(),
-                      mojo::MakeRequest(&ping_b));
-  EXPECT_EQ(2, PingInstanceCounter::instance_count);
-
-  ping_a.reset();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(1, PingInstanceCounter::instance_count);
-
-  ping_b.reset();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(0, PingInstanceCounter::instance_count);
-}
-
-TEST_F(BindingSetTest, StrongBinding_RemoveBinding) {
-  PingServicePtr ping_a, ping_b;
-  StrongBindingSet<PingService> bindings;
-  BindingId binding_id_a = bindings.AddBinding(
-      base::MakeUnique<PingInstanceCounter>(), mojo::MakeRequest(&ping_a));
-  BindingId binding_id_b = bindings.AddBinding(
-      base::MakeUnique<PingInstanceCounter>(), mojo::MakeRequest(&ping_b));
-  EXPECT_EQ(2, PingInstanceCounter::instance_count);
-
-  EXPECT_TRUE(bindings.RemoveBinding(binding_id_a));
-  EXPECT_EQ(1, PingInstanceCounter::instance_count);
-
-  EXPECT_TRUE(bindings.RemoveBinding(binding_id_b));
-  EXPECT_EQ(0, PingInstanceCounter::instance_count);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/binding_unittest.cc b/mojo/public/cpp/bindings/tests/binding_unittest.cc
deleted file mode 100644
index e76993b..0000000
--- a/mojo/public/cpp/bindings/tests/binding_unittest.cc
+++ /dev/null
@@ -1,611 +0,0 @@
-// Copyright 2015 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.
-
-// Note: This file tests both binding.h (mojo::Binding) and strong_binding.h
-// (mojo::StrongBinding).
-
-#include "mojo/public/cpp/bindings/binding.h"
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/weak_ptr.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-class BindingTestBase : public testing::Test {
- public:
-  BindingTestBase() {}
-  ~BindingTestBase() override {}
-
-  base::MessageLoop& loop() { return loop_; }
-
- private:
-  base::MessageLoop loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(BindingTestBase);
-};
-
-class ServiceImpl : public sample::Service {
- public:
-  explicit ServiceImpl(bool* was_deleted = nullptr)
-      : was_deleted_(was_deleted) {}
-  ~ServiceImpl() override {
-    if (was_deleted_)
-      *was_deleted_ = true;
-  }
-
- private:
-  // sample::Service implementation
-  void Frobinate(sample::FooPtr foo,
-                 BazOptions options,
-                 sample::PortPtr port,
-                 const FrobinateCallback& callback) override {
-    callback.Run(1);
-  }
-  void GetPort(InterfaceRequest<sample::Port> port) override {}
-
-  bool* const was_deleted_;
-
-  DISALLOW_COPY_AND_ASSIGN(ServiceImpl);
-};
-
-template <typename... Args>
-void DoSetFlagAndRunClosure(bool* flag,
-                            const base::Closure& closure,
-                            Args... args) {
-  *flag = true;
-  if (!closure.is_null())
-    closure.Run();
-}
-
-template <typename... Args>
-base::Callback<void(Args...)> SetFlagAndRunClosure(
-    bool* flag,
-    const base::Closure& callback = base::Closure()) {
-  return base::Bind(&DoSetFlagAndRunClosure<Args...>, flag, callback);
-}
-
-// BindingTest -----------------------------------------------------------------
-
-using BindingTest = BindingTestBase;
-
-TEST_F(BindingTest, Close) {
-  bool called = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  base::RunLoop run_loop;
-  ptr.set_connection_error_handler(
-      SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-
-  binding.Close();
-  EXPECT_FALSE(called);
-  run_loop.Run();
-  EXPECT_TRUE(called);
-}
-
-// Tests that destroying a mojo::Binding closes the bound message pipe handle.
-TEST_F(BindingTest, DestroyClosesMessagePipe) {
-  bool encountered_error = false;
-  ServiceImpl impl;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  base::RunLoop run_loop;
-  ptr.set_connection_error_handler(
-      SetFlagAndRunClosure(&encountered_error, run_loop.QuitClosure()));
-  bool called = false;
-  base::RunLoop run_loop2;
-  {
-    Binding<sample::Service> binding(&impl, std::move(request));
-    ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                   SetFlagAndRunClosure<int32_t>(&called,
-                                                 run_loop2.QuitClosure()));
-    run_loop2.Run();
-    EXPECT_TRUE(called);
-    EXPECT_FALSE(encountered_error);
-  }
-  // Now that the Binding is out of scope we should detect an error on the other
-  // end of the pipe.
-  run_loop.Run();
-  EXPECT_TRUE(encountered_error);
-
-  // And calls should fail.
-  called = false;
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop2.QuitClosure()));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(called);
-}
-
-// Tests that the binding's connection error handler gets called when the other
-// end is closed.
-TEST_F(BindingTest, ConnectionError) {
-  bool called = false;
-  {
-    ServiceImpl impl;
-    sample::ServicePtr ptr;
-    Binding<sample::Service> binding(&impl, MakeRequest(&ptr));
-    base::RunLoop run_loop;
-    binding.set_connection_error_handler(
-        SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
-    ptr.reset();
-    EXPECT_FALSE(called);
-    run_loop.Run();
-    EXPECT_TRUE(called);
-    // We want to make sure that it isn't called again during destruction.
-    called = false;
-  }
-  EXPECT_FALSE(called);
-}
-
-// Tests that calling Close doesn't result in the connection error handler being
-// called.
-TEST_F(BindingTest, CloseDoesntCallConnectionErrorHandler) {
-  ServiceImpl impl;
-  sample::ServicePtr ptr;
-  Binding<sample::Service> binding(&impl, MakeRequest(&ptr));
-  bool called = false;
-  binding.set_connection_error_handler(SetFlagAndRunClosure(&called));
-  binding.Close();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(called);
-
-  // We can also close the other end, and the error handler still won't be
-  // called.
-  ptr.reset();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(called);
-}
-
-class ServiceImplWithBinding : public ServiceImpl {
- public:
-  ServiceImplWithBinding(bool* was_deleted,
-                         const base::Closure& closure,
-                         InterfaceRequest<sample::Service> request)
-      : ServiceImpl(was_deleted),
-        binding_(this, std::move(request)),
-        closure_(closure) {
-    binding_.set_connection_error_handler(
-        base::Bind(&ServiceImplWithBinding::OnConnectionError,
-                   base::Unretained(this)));
-  }
-
- private:
-  ~ServiceImplWithBinding() override{
-    closure_.Run();
-  }
-
-  void OnConnectionError() { delete this; }
-
-  Binding<sample::Service> binding_;
-  base::Closure closure_;
-
-  DISALLOW_COPY_AND_ASSIGN(ServiceImplWithBinding);
-};
-
-// Tests that the binding may be deleted in the connection error handler.
-TEST_F(BindingTest, SelfDeleteOnConnectionError) {
-  bool was_deleted = false;
-  sample::ServicePtr ptr;
-  // This should delete itself on connection error.
-  base::RunLoop run_loop;
-  new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(),
-                             MakeRequest(&ptr));
-  ptr.reset();
-  EXPECT_FALSE(was_deleted);
-  run_loop.Run();
-  EXPECT_TRUE(was_deleted);
-}
-
-// Tests that explicitly calling Unbind followed by rebinding works.
-TEST_F(BindingTest, Unbind) {
-  ServiceImpl impl;
-  sample::ServicePtr ptr;
-  Binding<sample::Service> binding(&impl, MakeRequest(&ptr));
-
-  bool called = false;
-  base::RunLoop run_loop;
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop.QuitClosure()));
-  run_loop.Run();
-  EXPECT_TRUE(called);
-
-  called = false;
-  auto request = binding.Unbind();
-  EXPECT_FALSE(binding.is_bound());
-  // All calls should fail when not bound...
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop.QuitClosure()));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(called);
-
-  called = false;
-  binding.Bind(std::move(request));
-  EXPECT_TRUE(binding.is_bound());
-  // ...and should succeed again when the rebound.
-  base::RunLoop run_loop2;
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop2.QuitClosure()));
-  run_loop2.Run();
-  EXPECT_TRUE(called);
-}
-
-class IntegerAccessorImpl : public sample::IntegerAccessor {
- public:
-  IntegerAccessorImpl() {}
-  ~IntegerAccessorImpl() override {}
-
- private:
-  // sample::IntegerAccessor implementation.
-  void GetInteger(const GetIntegerCallback& callback) override {
-    callback.Run(1, sample::Enum::VALUE);
-  }
-  void SetInteger(int64_t data, sample::Enum type) override {}
-
-  DISALLOW_COPY_AND_ASSIGN(IntegerAccessorImpl);
-};
-
-TEST_F(BindingTest, SetInterfacePtrVersion) {
-  IntegerAccessorImpl impl;
-  sample::IntegerAccessorPtr ptr;
-  Binding<sample::IntegerAccessor> binding(&impl, &ptr);
-  EXPECT_EQ(3u, ptr.version());
-}
-
-TEST_F(BindingTest, PauseResume) {
-  bool called = false;
-  base::RunLoop run_loop;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-  binding.PauseIncomingMethodCallProcessing();
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop.QuitClosure()));
-  EXPECT_FALSE(called);
-  base::RunLoop().RunUntilIdle();
-  // Frobinate() should not be called as the binding is paused.
-  EXPECT_FALSE(called);
-
-  // Resume the binding, which should trigger processing.
-  binding.ResumeIncomingMethodCallProcessing();
-  run_loop.Run();
-  EXPECT_TRUE(called);
-}
-
-// Verifies the connection error handler is not run while a binding is paused.
-TEST_F(BindingTest, ErrorHandleNotRunWhilePaused) {
-  bool called = false;
-  base::RunLoop run_loop;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-  binding.set_connection_error_handler(
-      SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
-  binding.PauseIncomingMethodCallProcessing();
-
-  ptr.reset();
-  base::RunLoop().RunUntilIdle();
-  // The connection error handle should not be called as the binding is paused.
-  EXPECT_FALSE(called);
-
-  // Resume the binding, which should trigger the error handler.
-  binding.ResumeIncomingMethodCallProcessing();
-  run_loop.Run();
-  EXPECT_TRUE(called);
-}
-
-class PingServiceImpl : public test::PingService {
- public:
-  PingServiceImpl() {}
-  ~PingServiceImpl() override {}
-
-  // test::PingService:
-  void Ping(const PingCallback& callback) override {
-    if (!ping_handler_.is_null())
-      ping_handler_.Run();
-    callback.Run();
-  }
-
-  void set_ping_handler(const base::Closure& handler) {
-    ping_handler_ = handler;
-  }
-
- private:
-  base::Closure ping_handler_;
-
-  DISALLOW_COPY_AND_ASSIGN(PingServiceImpl);
-};
-
-class CallbackFilter : public MessageReceiver {
- public:
-  explicit CallbackFilter(const base::Closure& callback)
-      : callback_(callback) {}
-  ~CallbackFilter() override {}
-
-  static std::unique_ptr<CallbackFilter> Wrap(const base::Closure& callback) {
-    return base::MakeUnique<CallbackFilter>(callback);
-  }
-
-  // MessageReceiver:
-  bool Accept(Message* message) override {
-    callback_.Run();
-    return true;
-  }
-
- private:
-  const base::Closure callback_;
-};
-
-// Verifies that message filters are notified in the order they were added and
-// are always notified before a message is dispatched.
-TEST_F(BindingTest, MessageFilter) {
-  test::PingServicePtr ptr;
-  PingServiceImpl impl;
-  mojo::Binding<test::PingService> binding(&impl, MakeRequest(&ptr));
-
-  int status = 0;
-  auto handler_helper = [] (int* status, int expected_status, int new_status) {
-    EXPECT_EQ(expected_status, *status);
-    *status = new_status;
-  };
-  auto create_handler = [&] (int expected_status, int new_status) {
-    return base::Bind(handler_helper, &status, expected_status, new_status);
-  };
-
-  binding.AddFilter(CallbackFilter::Wrap(create_handler(0, 1)));
-  binding.AddFilter(CallbackFilter::Wrap(create_handler(1, 2)));
-  impl.set_ping_handler(create_handler(2, 3));
-
-  for (int i = 0; i < 10; ++i) {
-    status = 0;
-    base::RunLoop loop;
-    ptr->Ping(loop.QuitClosure());
-    loop.Run();
-    EXPECT_EQ(3, status);
-  }
-}
-
-void Fail() {
-  FAIL() << "Unexpected connection error";
-}
-
-TEST_F(BindingTest, FlushForTesting) {
-  bool called = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-  binding.set_connection_error_handler(base::Bind(&Fail));
-
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called));
-  EXPECT_FALSE(called);
-  // Because the flush is sent from the binding, it only guarantees that the
-  // request has been received, not the response. The second flush waits for the
-  // response to be received.
-  binding.FlushForTesting();
-  binding.FlushForTesting();
-  EXPECT_TRUE(called);
-}
-
-TEST_F(BindingTest, FlushForTestingWithClosedPeer) {
-  bool called = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-  binding.set_connection_error_handler(SetFlagAndRunClosure(&called));
-  ptr.reset();
-
-  EXPECT_FALSE(called);
-  binding.FlushForTesting();
-  EXPECT_TRUE(called);
-  binding.FlushForTesting();
-}
-
-TEST_F(BindingTest, ConnectionErrorWithReason) {
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-
-  base::RunLoop run_loop;
-  binding.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(1234u, custom_reason);
-        EXPECT_EQ("hello", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  ptr.ResetWithReason(1234u, "hello");
-
-  run_loop.Run();
-}
-
-template <typename T>
-struct WeakPtrImplRefTraits {
-  using PointerType = base::WeakPtr<T>;
-
-  static bool IsNull(const base::WeakPtr<T>& ptr) { return !ptr; }
-  static T* GetRawPointer(base::WeakPtr<T>* ptr) { return ptr->get(); }
-};
-
-template <typename T>
-using WeakBinding = Binding<T, WeakPtrImplRefTraits<T>>;
-
-TEST_F(BindingTest, CustomImplPointerType) {
-  PingServiceImpl impl;
-  base::WeakPtrFactory<test::PingService> weak_factory(&impl);
-
-  test::PingServicePtr proxy;
-  WeakBinding<test::PingService> binding(weak_factory.GetWeakPtr(),
-                                         MakeRequest(&proxy));
-
-  {
-    // Ensure the binding is functioning.
-    base::RunLoop run_loop;
-    proxy->Ping(run_loop.QuitClosure());
-    run_loop.Run();
-  }
-
-  {
-    // Attempt to dispatch another message after the WeakPtr is invalidated.
-    base::Closure assert_not_reached = base::Bind([] { NOTREACHED(); });
-    impl.set_ping_handler(assert_not_reached);
-    proxy->Ping(assert_not_reached);
-
-    // The binding will close its end of the pipe which will trigger a
-    // connection error on |proxy|.
-    base::RunLoop run_loop;
-    proxy.set_connection_error_handler(run_loop.QuitClosure());
-    weak_factory.InvalidateWeakPtrs();
-    run_loop.Run();
-  }
-}
-
-// StrongBindingTest -----------------------------------------------------------
-
-using StrongBindingTest = BindingTestBase;
-
-// Tests that destroying a mojo::StrongBinding closes the bound message pipe
-// handle but does *not* destroy the implementation object.
-TEST_F(StrongBindingTest, DestroyClosesMessagePipe) {
-  base::RunLoop run_loop;
-  bool encountered_error = false;
-  bool was_deleted = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ptr.set_connection_error_handler(
-      SetFlagAndRunClosure(&encountered_error, run_loop.QuitClosure()));
-  bool called = false;
-  base::RunLoop run_loop2;
-
-  auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted),
-                                   std::move(request));
-  ptr->Frobinate(
-      nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-      SetFlagAndRunClosure<int32_t>(&called, run_loop2.QuitClosure()));
-  run_loop2.Run();
-  EXPECT_TRUE(called);
-  EXPECT_FALSE(encountered_error);
-  binding->Close();
-
-  // Now that the StrongBinding is closed we should detect an error on the other
-  // end of the pipe.
-  run_loop.Run();
-  EXPECT_TRUE(encountered_error);
-
-  // Destroying the StrongBinding also destroys the impl.
-  ASSERT_TRUE(was_deleted);
-}
-
-// Tests the typical case, where the implementation object owns the
-// StrongBinding (and should be destroyed on connection error).
-TEST_F(StrongBindingTest, ConnectionErrorDestroysImpl) {
-  sample::ServicePtr ptr;
-  bool was_deleted = false;
-  // Will delete itself.
-  base::RunLoop run_loop;
-  new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(),
-                             MakeRequest(&ptr));
-
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(was_deleted);
-
-  ptr.reset();
-  EXPECT_FALSE(was_deleted);
-  run_loop.Run();
-  EXPECT_TRUE(was_deleted);
-}
-
-TEST_F(StrongBindingTest, FlushForTesting) {
-  bool called = false;
-  bool was_deleted = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted),
-                                   std::move(request));
-  binding->set_connection_error_handler(base::Bind(&Fail));
-
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called));
-  EXPECT_FALSE(called);
-  // Because the flush is sent from the binding, it only guarantees that the
-  // request has been received, not the response. The second flush waits for the
-  // response to be received.
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  EXPECT_TRUE(called);
-  EXPECT_FALSE(was_deleted);
-  ptr.reset();
-  ASSERT_TRUE(binding);
-  binding->set_connection_error_handler(base::Closure());
-  binding->FlushForTesting();
-  EXPECT_TRUE(was_deleted);
-}
-
-TEST_F(StrongBindingTest, FlushForTestingWithClosedPeer) {
-  bool called = false;
-  bool was_deleted = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted),
-                                   std::move(request));
-  binding->set_connection_error_handler(SetFlagAndRunClosure(&called));
-  ptr.reset();
-
-  EXPECT_FALSE(called);
-  EXPECT_FALSE(was_deleted);
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  EXPECT_TRUE(called);
-  EXPECT_TRUE(was_deleted);
-  ASSERT_FALSE(binding);
-}
-
-TEST_F(StrongBindingTest, ConnectionErrorWithReason) {
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  auto binding =
-      MakeStrongBinding(base::MakeUnique<ServiceImpl>(), std::move(request));
-  base::RunLoop run_loop;
-  binding->set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(5678u, custom_reason);
-        EXPECT_EQ("hello", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  ptr.ResetWithReason(5678u, "hello");
-
-  run_loop.Run();
-}
-
-}  // namespace
-}  // mojo
diff --git a/mojo/public/cpp/bindings/tests/bindings_perftest.cc b/mojo/public/cpp/bindings/tests/bindings_perftest.cc
deleted file mode 100644
index 65b3c8c..0000000
--- a/mojo/public/cpp/bindings/tests/bindings_perftest.cc
+++ /dev/null
@@ -1,286 +0,0 @@
-// Copyright 2015 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 <stddef.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/multiplex_router.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/cpp/test_support/test_support.h"
-#include "mojo/public/cpp/test_support/test_utils.h"
-#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-const double kMojoTicksPerSecond = 1000000.0;
-
-double MojoTicksToSeconds(MojoTimeTicks ticks) {
-  return ticks / kMojoTicksPerSecond;
-}
-
-class PingServiceImpl : public test::PingService {
- public:
-  PingServiceImpl() {}
-  ~PingServiceImpl() override {}
-
-  // |PingService| methods:
-  void Ping(const PingCallback& callback) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PingServiceImpl);
-};
-
-void PingServiceImpl::Ping(const PingCallback& callback) {
-  callback.Run();
-}
-
-class PingPongTest {
- public:
-  explicit PingPongTest(test::PingServicePtr service);
-
-  void Run(unsigned int iterations);
-
- private:
-  void OnPingDone();
-
-  test::PingServicePtr service_;
-  unsigned int iterations_to_run_;
-  unsigned int current_iterations_;
-
-  base::Closure quit_closure_;
-
-  DISALLOW_COPY_AND_ASSIGN(PingPongTest);
-};
-
-PingPongTest::PingPongTest(test::PingServicePtr service)
-    : service_(std::move(service)) {}
-
-void PingPongTest::Run(unsigned int iterations) {
-  iterations_to_run_ = iterations;
-  current_iterations_ = 0;
-
-  base::RunLoop run_loop;
-  quit_closure_ = run_loop.QuitClosure();
-  service_->Ping(base::Bind(&PingPongTest::OnPingDone, base::Unretained(this)));
-  run_loop.Run();
-}
-
-void PingPongTest::OnPingDone() {
-  current_iterations_++;
-  if (current_iterations_ >= iterations_to_run_) {
-    quit_closure_.Run();
-    return;
-  }
-
-  service_->Ping(base::Bind(&PingPongTest::OnPingDone, base::Unretained(this)));
-}
-
-struct BoundPingService {
-  BoundPingService() : binding(&impl) { binding.Bind(MakeRequest(&service)); }
-
-  PingServiceImpl impl;
-  test::PingServicePtr service;
-  Binding<test::PingService> binding;
-};
-
-class MojoBindingsPerftest : public testing::Test {
- public:
-  MojoBindingsPerftest() {}
-
- protected:
-  base::MessageLoop loop_;
-};
-
-TEST_F(MojoBindingsPerftest, InProcessPingPong) {
-  test::PingServicePtr service;
-  PingServiceImpl impl;
-  Binding<test::PingService> binding(&impl, MakeRequest(&service));
-  PingPongTest test(std::move(service));
-
-  {
-    const unsigned int kIterations = 100000;
-    const MojoTimeTicks start_time = MojoGetTimeTicksNow();
-    test.Run(kIterations);
-    const MojoTimeTicks end_time = MojoGetTimeTicksNow();
-    test::LogPerfResult(
-        "InProcessPingPong", "0_Inactive",
-        kIterations / MojoTicksToSeconds(end_time - start_time),
-        "pings/second");
-  }
-
-  {
-    const size_t kNumInactiveServices = 1000;
-    BoundPingService* inactive_services =
-        new BoundPingService[kNumInactiveServices];
-
-    const unsigned int kIterations = 10000;
-    const MojoTimeTicks start_time = MojoGetTimeTicksNow();
-    test.Run(kIterations);
-    const MojoTimeTicks end_time = MojoGetTimeTicksNow();
-    test::LogPerfResult(
-        "InProcessPingPong", "1000_Inactive",
-        kIterations / MojoTicksToSeconds(end_time - start_time),
-        "pings/second");
-
-    delete[] inactive_services;
-  }
-}
-
-class PingPongPaddle : public MessageReceiverWithResponderStatus {
- public:
-  PingPongPaddle(MessageReceiver* sender) : sender_(sender) {}
-
-  void set_sender(MessageReceiver* sender) { sender_ = sender; }
-
-  bool Accept(Message* message) override {
-    uint32_t count = message->header()->name;
-    if (!quit_closure_.is_null()) {
-      count++;
-      if (count >= expected_count_) {
-        end_time_ = base::TimeTicks::Now();
-        quit_closure_.Run();
-        return true;
-      }
-    }
-
-    internal::MessageBuilder builder(count, 0, 8, 0);
-    bool result = sender_->Accept(builder.message());
-    DCHECK(result);
-    return true;
-  }
-
-  bool AcceptWithResponder(
-      Message* message,
-      std::unique_ptr<MessageReceiverWithStatus> responder) override {
-    NOTREACHED();
-    return true;
-  }
-
-  base::TimeDelta Serve(uint32_t expected_count) {
-    base::RunLoop run_loop;
-
-    expected_count_ = expected_count;
-    quit_closure_ = run_loop.QuitClosure();
-
-    start_time_ = base::TimeTicks::Now();
-    internal::MessageBuilder builder(0, 0, 8, 0);
-    bool result = sender_->Accept(builder.message());
-    DCHECK(result);
-
-    run_loop.Run();
-
-    return end_time_ - start_time_;
-  }
-
- private:
-  base::TimeTicks start_time_;
-  base::TimeTicks end_time_;
-  uint32_t expected_count_ = 0;
-  MessageReceiver* sender_;
-  base::Closure quit_closure_;
-};
-
-TEST_F(MojoBindingsPerftest, MultiplexRouterPingPong) {
-  MessagePipe pipe;
-  scoped_refptr<internal::MultiplexRouter> router0(
-      new internal::MultiplexRouter(std::move(pipe.handle0),
-                                    internal::MultiplexRouter::SINGLE_INTERFACE,
-                                    true, base::ThreadTaskRunnerHandle::Get()));
-  scoped_refptr<internal::MultiplexRouter> router1(
-      new internal::MultiplexRouter(
-          std::move(pipe.handle1), internal::MultiplexRouter::SINGLE_INTERFACE,
-          false, base::ThreadTaskRunnerHandle::Get()));
-
-  PingPongPaddle paddle0(nullptr);
-  PingPongPaddle paddle1(nullptr);
-
-  InterfaceEndpointClient client0(
-      router0->CreateLocalEndpointHandle(kMasterInterfaceId), &paddle0, nullptr,
-      false, base::ThreadTaskRunnerHandle::Get(), 0u);
-  InterfaceEndpointClient client1(
-      router1->CreateLocalEndpointHandle(kMasterInterfaceId), &paddle1, nullptr,
-      false, base::ThreadTaskRunnerHandle::Get(), 0u);
-
-  paddle0.set_sender(&client0);
-  paddle1.set_sender(&client1);
-
-  static const uint32_t kWarmUpIterations = 1000;
-  static const uint32_t kTestIterations = 1000000;
-
-  paddle0.Serve(kWarmUpIterations);
-
-  base::TimeDelta duration = paddle0.Serve(kTestIterations);
-
-  test::LogPerfResult("MultiplexRouterPingPong", nullptr,
-                      kTestIterations / duration.InSecondsF(), "pings/second");
-}
-
-class CounterReceiver : public MessageReceiverWithResponderStatus {
- public:
-  bool Accept(Message* message) override {
-    counter_++;
-    return true;
-  }
-
-  bool AcceptWithResponder(
-      Message* message,
-      std::unique_ptr<MessageReceiverWithStatus> responder) override {
-    NOTREACHED();
-    return true;
-  }
-
-  uint32_t counter() const { return counter_; }
-
-  void Reset() { counter_ = 0; }
-
- private:
-  uint32_t counter_ = 0;
-};
-
-TEST_F(MojoBindingsPerftest, MultiplexRouterDispatchCost) {
-  MessagePipe pipe;
-  scoped_refptr<internal::MultiplexRouter> router(new internal::MultiplexRouter(
-      std::move(pipe.handle0), internal::MultiplexRouter::SINGLE_INTERFACE,
-      true, base::ThreadTaskRunnerHandle::Get()));
-  CounterReceiver receiver;
-  InterfaceEndpointClient client(
-      router->CreateLocalEndpointHandle(kMasterInterfaceId), &receiver, nullptr,
-      false, base::ThreadTaskRunnerHandle::Get(), 0u);
-
-  static const uint32_t kIterations[] = {1000, 3000000};
-
-  for (size_t i = 0; i < 2; ++i) {
-    receiver.Reset();
-    base::TimeTicks start_time = base::TimeTicks::Now();
-    for (size_t j = 0; j < kIterations[i]; ++j) {
-      internal::MessageBuilder builder(0, 0, 8, 0);
-      bool result =
-          router->SimulateReceivingMessageForTesting(builder.message());
-      DCHECK(result);
-    }
-
-    base::TimeTicks end_time = base::TimeTicks::Now();
-    base::TimeDelta duration = end_time - start_time;
-    CHECK_EQ(kIterations[i], receiver.counter());
-
-    if (i == 1) {
-      test::LogPerfResult("MultiplexRouterDispatchCost", nullptr,
-                          kIterations[i] / duration.InSecondsF(),
-                          "times/second");
-    }
-  }
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/blink_typemaps.gni b/mojo/public/cpp/bindings/tests/blink_typemaps.gni
deleted file mode 100644
index b71dcf8..0000000
--- a/mojo/public/cpp/bindings/tests/blink_typemaps.gni
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-typemaps = [
-  "//mojo/public/cpp/bindings/tests/rect_blink.typemap",
-  "//mojo/public/cpp/bindings/tests/test_native_types_blink.typemap",
-]
diff --git a/mojo/public/cpp/bindings/tests/buffer_unittest.cc b/mojo/public/cpp/bindings/tests/buffer_unittest.cc
deleted file mode 100644
index d75bdd0..0000000
--- a/mojo/public/cpp/bindings/tests/buffer_unittest.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include <limits>
-
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-bool IsZero(void* p_buf, size_t size) {
-  char* buf = reinterpret_cast<char*>(p_buf);
-  for (size_t i = 0; i < size; ++i) {
-    if (buf[i] != 0)
-      return false;
-  }
-  return true;
-}
-
-// Tests that FixedBuffer allocates memory aligned to 8 byte boundaries.
-TEST(FixedBufferTest, Alignment) {
-  internal::FixedBufferForTesting buf(internal::Align(10) * 2);
-  ASSERT_EQ(buf.size(), 16u * 2);
-
-  void* a = buf.Allocate(10);
-  ASSERT_TRUE(a);
-  EXPECT_TRUE(IsZero(a, 10));
-  EXPECT_EQ(0, reinterpret_cast<ptrdiff_t>(a) % 8);
-
-  void* b = buf.Allocate(10);
-  ASSERT_TRUE(b);
-  EXPECT_TRUE(IsZero(b, 10));
-  EXPECT_EQ(0, reinterpret_cast<ptrdiff_t>(b) % 8);
-
-  // Any more allocations would result in an assert, but we can't test that.
-}
-
-// Tests that FixedBufferForTesting::Leak passes ownership to the caller.
-TEST(FixedBufferTest, Leak) {
-  void* ptr = nullptr;
-  void* buf_ptr = nullptr;
-  {
-    internal::FixedBufferForTesting buf(8);
-    ASSERT_EQ(8u, buf.size());
-
-    ptr = buf.Allocate(8);
-    ASSERT_TRUE(ptr);
-    buf_ptr = buf.Leak();
-
-    // The buffer should point to the first element allocated.
-    // TODO(mpcomplete): Is this a reasonable expectation?
-    EXPECT_EQ(ptr, buf_ptr);
-
-    // The FixedBufferForTesting should be empty now.
-    EXPECT_EQ(0u, buf.size());
-    EXPECT_FALSE(buf.Leak());
-  }
-
-  // Since we called Leak, ptr is still writable after FixedBufferForTesting
-  // went out of scope.
-  memset(ptr, 1, 8);
-  free(buf_ptr);
-}
-
-#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
-TEST(FixedBufferTest, TooBig) {
-  internal::FixedBufferForTesting buf(24);
-
-  // A little bit too large.
-  EXPECT_EQ(reinterpret_cast<void*>(0), buf.Allocate(32));
-
-  // Move the cursor forward.
-  EXPECT_NE(reinterpret_cast<void*>(0), buf.Allocate(16));
-
-  // A lot too large.
-  EXPECT_EQ(reinterpret_cast<void*>(0),
-            buf.Allocate(std::numeric_limits<size_t>::max() - 1024u));
-
-  // A lot too large, leading to possible integer overflow.
-  EXPECT_EQ(reinterpret_cast<void*>(0),
-            buf.Allocate(std::numeric_limits<size_t>::max() - 8u));
-}
-#endif
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/chromium_typemaps.gni b/mojo/public/cpp/bindings/tests/chromium_typemaps.gni
deleted file mode 100644
index 1da7cbf..0000000
--- a/mojo/public/cpp/bindings/tests/chromium_typemaps.gni
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-typemaps = [
-  "//mojo/public/cpp/bindings/tests/rect_chromium.typemap",
-  "//mojo/public/cpp/bindings/tests/struct_with_traits.typemap",
-  "//mojo/public/cpp/bindings/tests/test_native_types_chromium.typemap",
-]
diff --git a/mojo/public/cpp/bindings/tests/connector_unittest.cc b/mojo/public/cpp/bindings/tests/connector_unittest.cc
deleted file mode 100644
index 74ecb7a..0000000
--- a/mojo/public/cpp/bindings/tests/connector_unittest.cc
+++ /dev/null
@@ -1,599 +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.
-
-#include "mojo/public/cpp/bindings/connector.h"
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/callback_helpers.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/tests/message_queue.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class MessageAccumulator : public MessageReceiver {
- public:
-  MessageAccumulator() {}
-  explicit MessageAccumulator(const base::Closure& closure)
-      : closure_(closure) {}
-
-  bool Accept(Message* message) override {
-    queue_.Push(message);
-    if (!closure_.is_null())
-      base::ResetAndReturn(&closure_).Run();
-    return true;
-  }
-
-  bool IsEmpty() const { return queue_.IsEmpty(); }
-
-  void Pop(Message* message) { queue_.Pop(message); }
-
-  void set_closure(const base::Closure& closure) { closure_ = closure; }
-
-  size_t size() const { return queue_.size(); }
-
- private:
-  MessageQueue queue_;
-  base::Closure closure_;
-};
-
-class ConnectorDeletingMessageAccumulator : public MessageAccumulator {
- public:
-  ConnectorDeletingMessageAccumulator(Connector** connector)
-      : connector_(connector) {}
-
-  bool Accept(Message* message) override {
-    delete *connector_;
-    *connector_ = nullptr;
-    return MessageAccumulator::Accept(message);
-  }
-
- private:
-  Connector** connector_;
-};
-
-class ReentrantMessageAccumulator : public MessageAccumulator {
- public:
-  ReentrantMessageAccumulator(Connector* connector)
-      : connector_(connector), number_of_calls_(0) {}
-
-  bool Accept(Message* message) override {
-    if (!MessageAccumulator::Accept(message))
-      return false;
-    number_of_calls_++;
-    if (number_of_calls_ == 1) {
-      return connector_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-    }
-    return true;
-  }
-
-  int number_of_calls() { return number_of_calls_; }
-
- private:
-  Connector* connector_;
-  int number_of_calls_;
-};
-
-class ConnectorTest : public testing::Test {
- public:
-  ConnectorTest() {}
-
-  void SetUp() override {
-    CreateMessagePipe(nullptr, &handle0_, &handle1_);
-  }
-
-  void TearDown() override {}
-
-  void AllocMessage(const char* text, Message* message) {
-    size_t payload_size = strlen(text) + 1;  // Plus null terminator.
-    internal::MessageBuilder builder(1, 0, payload_size, 0);
-    memcpy(builder.buffer()->Allocate(payload_size), text, payload_size);
-
-    *message = std::move(*builder.message());
-  }
-
- protected:
-  ScopedMessagePipeHandle handle0_;
-  ScopedMessagePipeHandle handle1_;
-
- private:
-  base::MessageLoop loop_;
-};
-
-TEST_F(ConnectorTest, Basic) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  Message message;
-  AllocMessage(kText, &message);
-
-  connector0.Accept(&message);
-
-  base::RunLoop run_loop;
-  MessageAccumulator accumulator(run_loop.QuitClosure());
-  connector1.set_incoming_receiver(&accumulator);
-
-  run_loop.Run();
-
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-}
-
-TEST_F(ConnectorTest, Basic_Synchronous) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  Message message;
-  AllocMessage(kText, &message);
-
-  connector0.Accept(&message);
-
-  MessageAccumulator accumulator;
-  connector1.set_incoming_receiver(&accumulator);
-
-  connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-}
-
-TEST_F(ConnectorTest, Basic_EarlyIncomingReceiver) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  base::RunLoop run_loop;
-  MessageAccumulator accumulator(run_loop.QuitClosure());
-  connector1.set_incoming_receiver(&accumulator);
-
-  const char kText[] = "hello world";
-
-  Message message;
-  AllocMessage(kText, &message);
-
-  connector0.Accept(&message);
-
-  run_loop.Run();
-
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-}
-
-TEST_F(ConnectorTest, Basic_TwoMessages) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char* kText[] = {"hello", "world"};
-
-  for (size_t i = 0; i < arraysize(kText); ++i) {
-    Message message;
-    AllocMessage(kText[i], &message);
-
-    connector0.Accept(&message);
-  }
-
-  MessageAccumulator accumulator;
-  connector1.set_incoming_receiver(&accumulator);
-
-  for (size_t i = 0; i < arraysize(kText); ++i) {
-    if (accumulator.IsEmpty()) {
-      base::RunLoop run_loop;
-      accumulator.set_closure(run_loop.QuitClosure());
-      run_loop.Run();
-    }
-    ASSERT_FALSE(accumulator.IsEmpty());
-
-    Message message_received;
-    accumulator.Pop(&message_received);
-
-    EXPECT_EQ(
-        std::string(kText[i]),
-        std::string(reinterpret_cast<const char*>(message_received.payload())));
-  }
-}
-
-TEST_F(ConnectorTest, Basic_TwoMessages_Synchronous) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char* kText[] = {"hello", "world"};
-
-  for (size_t i = 0; i < arraysize(kText); ++i) {
-    Message message;
-    AllocMessage(kText[i], &message);
-
-    connector0.Accept(&message);
-  }
-
-  MessageAccumulator accumulator;
-  connector1.set_incoming_receiver(&accumulator);
-
-  connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText[0]),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-
-  ASSERT_TRUE(accumulator.IsEmpty());
-}
-
-TEST_F(ConnectorTest, WriteToClosedPipe) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  Message message;
-  AllocMessage(kText, &message);
-
-  // Close the other end of the pipe.
-  handle1_.reset();
-
-  // Not observed yet because we haven't spun the message loop yet.
-  EXPECT_FALSE(connector0.encountered_error());
-
-  // Write failures are not reported.
-  bool ok = connector0.Accept(&message);
-  EXPECT_TRUE(ok);
-
-  // Still not observed.
-  EXPECT_FALSE(connector0.encountered_error());
-
-  // Spin the message loop, and then we should start observing the closed pipe.
-  base::RunLoop run_loop;
-  connector0.set_connection_error_handler(run_loop.QuitClosure());
-  run_loop.Run();
-
-  EXPECT_TRUE(connector0.encountered_error());
-}
-
-TEST_F(ConnectorTest, MessageWithHandles) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  Message message1;
-  AllocMessage(kText, &message1);
-
-  MessagePipe pipe;
-  message1.mutable_handles()->push_back(pipe.handle0.release());
-
-  connector0.Accept(&message1);
-
-  // The message should have been transferred, releasing the handles.
-  EXPECT_TRUE(message1.handles()->empty());
-
-  base::RunLoop run_loop;
-  MessageAccumulator accumulator(run_loop.QuitClosure());
-  connector1.set_incoming_receiver(&accumulator);
-
-  run_loop.Run();
-
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-  ASSERT_EQ(1U, message_received.handles()->size());
-
-  // Now send a message to the transferred handle and confirm it's sent through
-  // to the orginal pipe.
-  // TODO(vtl): Do we need a better way of "downcasting" the handle types?
-  ScopedMessagePipeHandle smph;
-  smph.reset(MessagePipeHandle(message_received.handles()->front().value()));
-  message_received.mutable_handles()->front() = Handle();
-  // |smph| now owns this handle.
-
-  Connector connector_received(std::move(smph), Connector::SINGLE_THREADED_SEND,
-                               base::ThreadTaskRunnerHandle::Get());
-  Connector connector_original(std::move(pipe.handle1),
-                               Connector::SINGLE_THREADED_SEND,
-                               base::ThreadTaskRunnerHandle::Get());
-
-  Message message2;
-  AllocMessage(kText, &message2);
-
-  connector_received.Accept(&message2);
-  base::RunLoop run_loop2;
-  MessageAccumulator accumulator2(run_loop2.QuitClosure());
-  connector_original.set_incoming_receiver(&accumulator2);
-  run_loop2.Run();
-
-  ASSERT_FALSE(accumulator2.IsEmpty());
-
-  accumulator2.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-}
-
-TEST_F(ConnectorTest, WaitForIncomingMessageWithError) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  // Close the other end of the pipe.
-  handle1_.reset();
-  ASSERT_FALSE(connector0.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE));
-}
-
-TEST_F(ConnectorTest, WaitForIncomingMessageWithDeletion) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector* connector1 =
-      new Connector(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                    base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  Message message;
-  AllocMessage(kText, &message);
-
-  connector0.Accept(&message);
-
-  ConnectorDeletingMessageAccumulator accumulator(&connector1);
-  connector1->set_incoming_receiver(&accumulator);
-
-  connector1->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-
-  ASSERT_FALSE(connector1);
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-}
-
-TEST_F(ConnectorTest, WaitForIncomingMessageWithReentrancy) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char* kText[] = {"hello", "world"};
-
-  for (size_t i = 0; i < arraysize(kText); ++i) {
-    Message message;
-    AllocMessage(kText[i], &message);
-
-    connector0.Accept(&message);
-  }
-
-  ReentrantMessageAccumulator accumulator(&connector1);
-  connector1.set_incoming_receiver(&accumulator);
-
-  for (size_t i = 0; i < arraysize(kText); ++i) {
-    if (accumulator.IsEmpty()) {
-      base::RunLoop run_loop;
-      accumulator.set_closure(run_loop.QuitClosure());
-      run_loop.Run();
-    }
-    ASSERT_FALSE(accumulator.IsEmpty());
-
-    Message message_received;
-    accumulator.Pop(&message_received);
-
-    EXPECT_EQ(
-        std::string(kText[i]),
-        std::string(reinterpret_cast<const char*>(message_received.payload())));
-  }
-
-  ASSERT_EQ(2, accumulator.number_of_calls());
-}
-
-void ForwardErrorHandler(bool* called, const base::Closure& callback) {
-  *called = true;
-  callback.Run();
-}
-
-TEST_F(ConnectorTest, RaiseError) {
-  base::RunLoop run_loop, run_loop2;
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  bool error_handler_called0 = false;
-  connector0.set_connection_error_handler(
-      base::Bind(&ForwardErrorHandler, &error_handler_called0,
-                 run_loop.QuitClosure()));
-
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  bool error_handler_called1 = false;
-  connector1.set_connection_error_handler(
-      base::Bind(&ForwardErrorHandler, &error_handler_called1,
-                 run_loop2.QuitClosure()));
-
-  const char kText[] = "hello world";
-
-  Message message;
-  AllocMessage(kText, &message);
-
-  connector0.Accept(&message);
-  connector0.RaiseError();
-
-  base::RunLoop run_loop3;
-  MessageAccumulator accumulator(run_loop3.QuitClosure());
-  connector1.set_incoming_receiver(&accumulator);
-
-  run_loop3.Run();
-
-  // Messages sent prior to RaiseError() still arrive at the other end.
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-
-  run_loop.Run();
-  run_loop2.Run();
-
-  // Connection error handler is called at both sides.
-  EXPECT_TRUE(error_handler_called0);
-  EXPECT_TRUE(error_handler_called1);
-
-  // The error flag is set at both sides.
-  EXPECT_TRUE(connector0.encountered_error());
-  EXPECT_TRUE(connector1.encountered_error());
-
-  // The message pipe handle is valid at both sides.
-  EXPECT_TRUE(connector0.is_valid());
-  EXPECT_TRUE(connector1.is_valid());
-}
-
-void PauseConnectorAndRunClosure(Connector* connector,
-                                 const base::Closure& closure) {
-  connector->PauseIncomingMethodCallProcessing();
-  closure.Run();
-}
-
-TEST_F(ConnectorTest, PauseWithQueuedMessages) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  // Queue up two messages.
-  Message message;
-  AllocMessage(kText, &message);
-  connector0.Accept(&message);
-  AllocMessage(kText, &message);
-  connector0.Accept(&message);
-
-  base::RunLoop run_loop;
-  // Configure the accumulator such that it pauses after the first message is
-  // received.
-  MessageAccumulator accumulator(
-      base::Bind(&PauseConnectorAndRunClosure, &connector1,
-                 run_loop.QuitClosure()));
-  connector1.set_incoming_receiver(&accumulator);
-
-  run_loop.Run();
-
-  // As we paused after the first message we should only have gotten one
-  // message.
-  ASSERT_EQ(1u, accumulator.size());
-}
-
-void AccumulateWithNestedLoop(MessageAccumulator* accumulator,
-                              const base::Closure& closure) {
-  base::RunLoop nested_run_loop;
-  base::MessageLoop::ScopedNestableTaskAllower allow(
-      base::MessageLoop::current());
-  accumulator->set_closure(nested_run_loop.QuitClosure());
-  nested_run_loop.Run();
-  closure.Run();
-}
-
-TEST_F(ConnectorTest, ProcessWhenNested) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  // Queue up two messages.
-  Message message;
-  AllocMessage(kText, &message);
-  connector0.Accept(&message);
-  AllocMessage(kText, &message);
-  connector0.Accept(&message);
-
-  base::RunLoop run_loop;
-  MessageAccumulator accumulator;
-  // When the accumulator gets the first message it spins a nested message
-  // loop. The loop is quit when another message is received.
-  accumulator.set_closure(base::Bind(&AccumulateWithNestedLoop, &accumulator,
-                                     run_loop.QuitClosure()));
-  connector1.set_incoming_receiver(&accumulator);
-
-  run_loop.Run();
-
-  ASSERT_EQ(2u, accumulator.size());
-}
-
-TEST_F(ConnectorTest, DestroyOnDifferentThreadAfterClose) {
-  std::unique_ptr<Connector> connector(
-      new Connector(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                    base::ThreadTaskRunnerHandle::Get()));
-
-  connector->CloseMessagePipe();
-
-  base::Thread another_thread("ThreadForDestroyingConnector");
-  another_thread.Start();
-
-  base::RunLoop run_loop;
-  another_thread.task_runner()->PostTaskAndReply(
-      FROM_HERE,
-      base::Bind(
-          [](std::unique_ptr<Connector> connector) { connector.reset(); },
-          base::Passed(std::move(connector))),
-      run_loop.QuitClosure());
-
-  run_loop.Run();
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/constant_unittest.cc b/mojo/public/cpp/bindings/tests/constant_unittest.cc
deleted file mode 100644
index caa6464..0000000
--- a/mojo/public/cpp/bindings/tests/constant_unittest.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2015 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 <cmath>
-
-#include "base/strings/string_piece.h"
-#include "mojo/public/interfaces/bindings/tests/test_constants.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-
-TEST(ConstantTest, GlobalConstants) {
-  // Compile-time constants.
-  static_assert(kBoolValue == true, "");
-  static_assert(kInt8Value == -2, "");
-  static_assert(kUint8Value == 128U, "");
-  static_assert(kInt16Value == -233, "");
-  static_assert(kUint16Value == 44204U, "");
-  static_assert(kInt32Value == -44204, "");
-  static_assert(kUint32Value == 4294967295U, "");
-  static_assert(kInt64Value == -9223372036854775807, "");
-  static_assert(kUint64Value == 9999999999999999999ULL, "");
-  static_assert(kDoubleValue == 3.14159, "");
-  static_assert(kFloatValue == 2.71828f, "");
-
-  EXPECT_EQ(base::StringPiece(kStringValue), "test string contents");
-  EXPECT_TRUE(std::isnan(kDoubleNaN));
-  EXPECT_TRUE(std::isinf(kDoubleInfinity));
-  EXPECT_TRUE(std::isinf(kDoubleNegativeInfinity));
-  EXPECT_NE(kDoubleInfinity, kDoubleNegativeInfinity);
-  EXPECT_TRUE(std::isnan(kFloatNaN));
-  EXPECT_TRUE(std::isinf(kFloatInfinity));
-  EXPECT_TRUE(std::isinf(kFloatNegativeInfinity));
-  EXPECT_NE(kFloatInfinity, kFloatNegativeInfinity);
-}
-
-TEST(ConstantTest, StructConstants) {
-  // Compile-time constants.
-  static_assert(StructWithConstants::kInt8Value == 5U, "");
-  static_assert(StructWithConstants::kFloatValue == 765.432f, "");
-
-  EXPECT_EQ(base::StringPiece(StructWithConstants::kStringValue),
-            "struct test string contents");
-}
-
-TEST(ConstantTest, InterfaceConstants) {
-  // Compile-time constants.
-  static_assert(InterfaceWithConstants::kUint32Value == 20100722, "");
-  static_assert(InterfaceWithConstants::kDoubleValue == 12.34567, "");
-
-  EXPECT_EQ(base::StringPiece(InterfaceWithConstants::kStringValue),
-            "interface test string contents");
-  EXPECT_EQ(base::StringPiece(InterfaceWithConstants::Name_),
-            "mojo::test::InterfaceWithConstants");
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/container_test_util.cc b/mojo/public/cpp/bindings/tests/container_test_util.cc
deleted file mode 100644
index a53d351..0000000
--- a/mojo/public/cpp/bindings/tests/container_test_util.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include "mojo/public/cpp/bindings/tests/container_test_util.h"
-
-namespace mojo {
-
-size_t CopyableType::num_instances_ = 0;
-size_t MoveOnlyType::num_instances_ = 0;
-
-CopyableType::CopyableType() : copied_(false), ptr_(this) {
-  num_instances_++;
-}
-
-CopyableType::CopyableType(const CopyableType& other)
-    : copied_(true), ptr_(other.ptr()) {
-  num_instances_++;
-}
-
-CopyableType& CopyableType::operator=(const CopyableType& other) {
-  copied_ = true;
-  ptr_ = other.ptr();
-  return *this;
-}
-
-CopyableType::~CopyableType() {
-  num_instances_--;
-}
-
-MoveOnlyType::MoveOnlyType() : moved_(false), ptr_(this) {
-  num_instances_++;
-}
-
-MoveOnlyType::MoveOnlyType(MoveOnlyType&& other)
-    : moved_(true), ptr_(other.ptr()) {
-  num_instances_++;
-}
-
-MoveOnlyType& MoveOnlyType::operator=(MoveOnlyType&& other) {
-  moved_ = true;
-  ptr_ = other.ptr();
-  return *this;
-}
-
-MoveOnlyType::~MoveOnlyType() {
-  num_instances_--;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/container_test_util.h b/mojo/public/cpp/bindings/tests/container_test_util.h
deleted file mode 100644
index f709c15..0000000
--- a/mojo/public/cpp/bindings/tests/container_test_util.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_CONTAINER_TEST_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_CONTAINER_TEST_UTIL_H_
-
-#include <stddef.h>
-
-#include "base/macros.h"
-
-namespace mojo {
-
-class CopyableType {
- public:
-  CopyableType();
-  CopyableType(const CopyableType& other);
-  CopyableType& operator=(const CopyableType& other);
-  ~CopyableType();
-
-  bool copied() const { return copied_; }
-  static size_t num_instances() { return num_instances_; }
-  CopyableType* ptr() const { return ptr_; }
-  void ResetCopied() { copied_ = false; }
-
- private:
-  bool copied_;
-  static size_t num_instances_;
-  CopyableType* ptr_;
-};
-
-class MoveOnlyType {
- public:
-  typedef MoveOnlyType Data_;
-  MoveOnlyType();
-  MoveOnlyType(MoveOnlyType&& other);
-  MoveOnlyType& operator=(MoveOnlyType&& other);
-  ~MoveOnlyType();
-
-  bool moved() const { return moved_; }
-  static size_t num_instances() { return num_instances_; }
-  MoveOnlyType* ptr() const { return ptr_; }
-  void ResetMoved() { moved_ = false; }
-
- private:
-  bool moved_;
-  static size_t num_instances_;
-  MoveOnlyType* ptr_;
-
-  DISALLOW_COPY_AND_ASSIGN(MoveOnlyType);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_CONTAINER_TEST_UTIL_H_
diff --git a/mojo/public/cpp/bindings/tests/data_view_unittest.cc b/mojo/public/cpp/bindings/tests/data_view_unittest.cc
deleted file mode 100644
index 0ebfda5..0000000
--- a/mojo/public/cpp/bindings/tests/data_view_unittest.cc
+++ /dev/null
@@ -1,303 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <string>
-#include <unordered_map>
-#include <vector>
-
-#include "base/message_loop/message_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/interfaces/bindings/tests/test_data_view.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace data_view {
-namespace {
-
-class DataViewTest : public testing::Test {
- private:
-  base::MessageLoop message_loop_;
-};
-
-struct DataViewHolder {
-  std::unique_ptr<TestStructDataView> data_view;
-  std::unique_ptr<mojo::internal::FixedBufferForTesting> buf;
-  mojo::internal::SerializationContext context;
-};
-
-std::unique_ptr<DataViewHolder> SerializeTestStruct(TestStructPtr input) {
-  std::unique_ptr<DataViewHolder> result(new DataViewHolder);
-
-  size_t size = mojo::internal::PrepareToSerialize<TestStructDataView>(
-      input, &result->context);
-
-  result->buf.reset(new mojo::internal::FixedBufferForTesting(size));
-  internal::TestStruct_Data* data = nullptr;
-  mojo::internal::Serialize<TestStructDataView>(input, result->buf.get(), &data,
-                                                &result->context);
-
-  result->data_view.reset(new TestStructDataView(data, &result->context));
-  return result;
-}
-
-class TestInterfaceImpl : public TestInterface {
- public:
-  explicit TestInterfaceImpl(TestInterfaceRequest request)
-      : binding_(this, std::move(request)) {}
-  ~TestInterfaceImpl() override {}
-
-  // TestInterface implementation:
-  void Echo(int32_t value, const EchoCallback& callback) override {
-    callback.Run(value);
-  }
-
- private:
-  Binding<TestInterface> binding_;
-};
-
-}  // namespace
-
-TEST_F(DataViewTest, String) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_string = "hello";
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  StringDataView string_data_view;
-  data_view.GetFStringDataView(&string_data_view);
-
-  ASSERT_FALSE(string_data_view.is_null());
-  EXPECT_EQ(std::string("hello"),
-            std::string(string_data_view.storage(), string_data_view.size()));
-}
-
-TEST_F(DataViewTest, NestedStruct) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_struct = NestedStruct::New();
-  obj->f_struct->f_int32 = 42;
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  NestedStructDataView struct_data_view;
-  data_view.GetFStructDataView(&struct_data_view);
-
-  ASSERT_FALSE(struct_data_view.is_null());
-  EXPECT_EQ(42, struct_data_view.f_int32());
-}
-
-TEST_F(DataViewTest, NativeStruct) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_native_struct = NativeStruct::New();
-  obj->f_native_struct->data = std::vector<uint8_t>({3, 2, 1});
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  NativeStructDataView struct_data_view;
-  data_view.GetFNativeStructDataView(&struct_data_view);
-
-  ASSERT_FALSE(struct_data_view.is_null());
-  ASSERT_EQ(3u, struct_data_view.size());
-  EXPECT_EQ(3, struct_data_view[0]);
-  EXPECT_EQ(2, struct_data_view[1]);
-  EXPECT_EQ(1, struct_data_view[2]);
-  EXPECT_EQ(3, *struct_data_view.data());
-}
-
-TEST_F(DataViewTest, BoolArray) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_bool_array = {true, false};
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<bool> array_data_view;
-  data_view.GetFBoolArrayDataView(&array_data_view);
-
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(2u, array_data_view.size());
-  EXPECT_TRUE(array_data_view[0]);
-  EXPECT_FALSE(array_data_view[1]);
-}
-
-TEST_F(DataViewTest, IntegerArray) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_int32_array = {1024, 128};
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<int32_t> array_data_view;
-  data_view.GetFInt32ArrayDataView(&array_data_view);
-
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(2u, array_data_view.size());
-  EXPECT_EQ(1024, array_data_view[0]);
-  EXPECT_EQ(128, array_data_view[1]);
-  EXPECT_EQ(1024, *array_data_view.data());
-}
-
-TEST_F(DataViewTest, EnumArray) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_enum_array = {TestEnum::VALUE_1, TestEnum::VALUE_0};
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<TestEnum> array_data_view;
-  data_view.GetFEnumArrayDataView(&array_data_view);
-
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(2u, array_data_view.size());
-  EXPECT_EQ(TestEnum::VALUE_1, array_data_view[0]);
-  EXPECT_EQ(TestEnum::VALUE_0, array_data_view[1]);
-  EXPECT_EQ(TestEnum::VALUE_0, *(array_data_view.data() + 1));
-
-  TestEnum output;
-  ASSERT_TRUE(array_data_view.Read(0, &output));
-  EXPECT_EQ(TestEnum::VALUE_1, output);
-}
-
-TEST_F(DataViewTest, InterfaceArray) {
-  TestInterfacePtr ptr;
-  TestInterfaceImpl impl(MakeRequest(&ptr));
-
-  TestStructPtr obj(TestStruct::New());
-  obj->f_interface_array.push_back(std::move(ptr));
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<TestInterfacePtrDataView> array_data_view;
-  data_view.GetFInterfaceArrayDataView(&array_data_view);
-
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(1u, array_data_view.size());
-
-  TestInterfacePtr ptr2 = array_data_view.Take<TestInterfacePtr>(0);
-  ASSERT_TRUE(ptr2);
-  int32_t result = 0;
-  ASSERT_TRUE(ptr2->Echo(42, &result));
-  EXPECT_EQ(42, result);
-}
-
-TEST_F(DataViewTest, NestedArray) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_nested_array = {{3, 4}, {2}};
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<ArrayDataView<int32_t>> array_data_view;
-  data_view.GetFNestedArrayDataView(&array_data_view);
-
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(2u, array_data_view.size());
-
-  ArrayDataView<int32_t> nested_array_data_view;
-  array_data_view.GetDataView(0, &nested_array_data_view);
-  ASSERT_FALSE(nested_array_data_view.is_null());
-  ASSERT_EQ(2u, nested_array_data_view.size());
-  EXPECT_EQ(4, nested_array_data_view[1]);
-
-  std::vector<int32_t> vec;
-  ASSERT_TRUE(array_data_view.Read(1, &vec));
-  ASSERT_EQ(1u, vec.size());
-  EXPECT_EQ(2, vec[0]);
-}
-
-TEST_F(DataViewTest, StructArray) {
-  NestedStructPtr nested_struct(NestedStruct::New());
-  nested_struct->f_int32 = 42;
-
-  TestStructPtr obj(TestStruct::New());
-  obj->f_struct_array.push_back(std::move(nested_struct));
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<NestedStructDataView> array_data_view;
-  data_view.GetFStructArrayDataView(&array_data_view);
-
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(1u, array_data_view.size());
-
-  NestedStructDataView struct_data_view;
-  array_data_view.GetDataView(0, &struct_data_view);
-  ASSERT_FALSE(struct_data_view.is_null());
-  EXPECT_EQ(42, struct_data_view.f_int32());
-
-  NestedStructPtr nested_struct2;
-  ASSERT_TRUE(array_data_view.Read(0, &nested_struct2));
-  ASSERT_TRUE(nested_struct2);
-  EXPECT_EQ(42, nested_struct2->f_int32);
-}
-
-TEST_F(DataViewTest, Map) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_map["1"] = 1;
-  obj->f_map["2"] = 2;
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  MapDataView<StringDataView, int32_t> map_data_view;
-  data_view.GetFMapDataView(&map_data_view);
-
-  ASSERT_FALSE(map_data_view.is_null());
-  ASSERT_EQ(2u, map_data_view.size());
-
-  ASSERT_FALSE(map_data_view.keys().is_null());
-  ASSERT_EQ(2u, map_data_view.keys().size());
-
-  ASSERT_FALSE(map_data_view.values().is_null());
-  ASSERT_EQ(2u, map_data_view.values().size());
-
-  std::vector<std::string> keys;
-  ASSERT_TRUE(map_data_view.ReadKeys(&keys));
-  std::vector<int32_t> values;
-  ASSERT_TRUE(map_data_view.ReadValues(&values));
-
-  std::unordered_map<std::string, int32_t> map;
-  for (size_t i = 0; i < 2; ++i)
-    map[keys[i]] = values[i];
-
-  EXPECT_EQ(1, map["1"]);
-  EXPECT_EQ(2, map["2"]);
-}
-
-TEST_F(DataViewTest, UnionArray) {
-  TestUnionPtr union_ptr(TestUnion::New());
-  union_ptr->set_f_int32(1024);
-
-  TestStructPtr obj(TestStruct::New());
-  obj->f_union_array.push_back(std::move(union_ptr));
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<TestUnionDataView> array_data_view;
-  data_view.GetFUnionArrayDataView(&array_data_view);
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(1u, array_data_view.size());
-
-  TestUnionDataView union_data_view;
-  array_data_view.GetDataView(0, &union_data_view);
-  ASSERT_FALSE(union_data_view.is_null());
-
-  TestUnionPtr union_ptr2;
-  ASSERT_TRUE(array_data_view.Read(0, &union_ptr2));
-  ASSERT_TRUE(union_ptr2->is_f_int32());
-  EXPECT_EQ(1024, union_ptr2->get_f_int32());
-}
-
-}  // namespace data_view
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/e2e_perftest.cc b/mojo/public/cpp/bindings/tests/e2e_perftest.cc
deleted file mode 100644
index bc69e0f..0000000
--- a/mojo/public/cpp/bindings/tests/e2e_perftest.cc
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/perf_time_logger.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-class EchoServiceImpl : public test::EchoService {
- public:
-  explicit EchoServiceImpl(const base::Closure& quit_closure);
-  ~EchoServiceImpl() override;
-
-  // |EchoService| methods:
-  void Echo(const std::string& test_data,
-            const EchoCallback& callback) override;
-
- private:
-  const base::Closure quit_closure_;
-};
-
-EchoServiceImpl::EchoServiceImpl(const base::Closure& quit_closure)
-    : quit_closure_(quit_closure) {}
-
-EchoServiceImpl::~EchoServiceImpl() {
-  quit_closure_.Run();
-}
-
-void EchoServiceImpl::Echo(const std::string& test_data,
-                           const EchoCallback& callback) {
-  callback.Run(test_data);
-}
-
-class PingPongTest {
- public:
-  explicit PingPongTest(test::EchoServicePtr service);
-
-  void RunTest(int iterations, int batch_size, int message_size);
-
- private:
-  void DoPing();
-  void OnPingDone(const std::string& reply);
-
-  test::EchoServicePtr service_;
-  const base::Callback<void(const std::string&)> ping_done_callback_;
-
-  int iterations_;
-  int batch_size_;
-  std::string message_;
-
-  int current_iterations_;
-  int calls_outstanding_;
-
-  base::Closure quit_closure_;
-};
-
-PingPongTest::PingPongTest(test::EchoServicePtr service)
-    : service_(std::move(service)),
-      ping_done_callback_(
-          base::Bind(&PingPongTest::OnPingDone, base::Unretained(this))) {}
-
-void PingPongTest::RunTest(int iterations, int batch_size, int message_size) {
-  iterations_ = iterations;
-  batch_size_ = batch_size;
-  message_ = std::string(message_size, 'a');
-  current_iterations_ = 0;
-  calls_outstanding_ = 0;
-
-  base::MessageLoop::current()->SetNestableTasksAllowed(true);
-  base::RunLoop run_loop;
-  quit_closure_ = run_loop.QuitClosure();
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::Bind(&PingPongTest::DoPing, base::Unretained(this)));
-  run_loop.Run();
-}
-
-void PingPongTest::DoPing() {
-  DCHECK_EQ(0, calls_outstanding_);
-  current_iterations_++;
-  if (current_iterations_ > iterations_) {
-    quit_closure_.Run();
-    return;
-  }
-
-  calls_outstanding_ = batch_size_;
-  for (int i = 0; i < batch_size_; i++) {
-    service_->Echo(message_, ping_done_callback_);
-  }
-}
-
-void PingPongTest::OnPingDone(const std::string& reply) {
-  DCHECK_GT(calls_outstanding_, 0);
-  calls_outstanding_--;
-
-  if (!calls_outstanding_)
-    DoPing();
-}
-
-class MojoE2EPerftest : public edk::test::MojoTestBase {
- public:
-  void RunTestOnTaskRunner(base::TaskRunner* runner,
-                           MojoHandle client_mp,
-                           const std::string& test_name) {
-    if (runner == base::ThreadTaskRunnerHandle::Get().get()) {
-      RunTests(client_mp, test_name);
-    } else {
-      base::RunLoop run_loop;
-      runner->PostTaskAndReply(
-          FROM_HERE, base::Bind(&MojoE2EPerftest::RunTests,
-                                base::Unretained(this), client_mp, test_name),
-          run_loop.QuitClosure());
-      run_loop.Run();
-    }
-  }
-
- protected:
-  base::MessageLoop message_loop_;
-
- private:
-  void RunTests(MojoHandle client_mp, const std::string& test_name) {
-    const int kMessages = 10000;
-    const int kBatchSizes[] = {1, 10, 100};
-    const int kMessageSizes[] = {8, 64, 512, 4096, 65536};
-
-    test::EchoServicePtr service;
-    service.Bind(InterfacePtrInfo<test::EchoService>(
-        ScopedMessagePipeHandle(MessagePipeHandle(client_mp)),
-        service.version()));
-    PingPongTest test(std::move(service));
-
-    for (int batch_size : kBatchSizes) {
-      for (int message_size : kMessageSizes) {
-        int num_messages = kMessages;
-        if (message_size == 65536)
-          num_messages /= 10;
-        std::string sub_test_name = base::StringPrintf(
-            "%s/%dx%d/%dbytes", test_name.c_str(), num_messages / batch_size,
-            batch_size, message_size);
-        base::PerfTimeLogger timer(sub_test_name.c_str());
-        test.RunTest(num_messages / batch_size, batch_size, message_size);
-      }
-    }
-  }
-};
-
-void CreateAndRunService(InterfaceRequest<test::EchoService> request,
-                         const base::Closure& cb) {
-  MakeStrongBinding(base::MakeUnique<EchoServiceImpl>(cb), std::move(request));
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(PingService, MojoE2EPerftest, mp) {
-  MojoHandle service_mp;
-  EXPECT_EQ("hello", ReadMessageWithHandles(mp, &service_mp, 1));
-
-  InterfaceRequest<test::EchoService> request;
-  request.Bind(ScopedMessagePipeHandle(MessagePipeHandle(service_mp)));
-  base::RunLoop run_loop;
-  edk::GetIOTaskRunner()->PostTask(
-      FROM_HERE,
-      base::Bind(&CreateAndRunService, base::Passed(&request),
-                 base::Bind(base::IgnoreResult(&base::TaskRunner::PostTask),
-                            message_loop_.task_runner(), FROM_HERE,
-                            run_loop.QuitClosure())));
-  run_loop.Run();
-}
-
-TEST_F(MojoE2EPerftest, MultiProcessEchoMainThread) {
-  RUN_CHILD_ON_PIPE(PingService, mp)
-    MojoHandle client_mp, service_mp;
-    CreateMessagePipe(&client_mp, &service_mp);
-    WriteMessageWithHandles(mp, "hello", &service_mp, 1);
-    RunTestOnTaskRunner(message_loop_.task_runner().get(), client_mp,
-                        "MultiProcessEchoMainThread");
-  END_CHILD()
-}
-
-TEST_F(MojoE2EPerftest, MultiProcessEchoIoThread) {
-  RUN_CHILD_ON_PIPE(PingService, mp)
-    MojoHandle client_mp, service_mp;
-    CreateMessagePipe(&client_mp, &service_mp);
-    WriteMessageWithHandles(mp, "hello", &service_mp, 1);
-    RunTestOnTaskRunner(edk::GetIOTaskRunner().get(), client_mp,
-                        "MultiProcessEchoIoThread");
-  END_CHILD()
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/equals_unittest.cc b/mojo/public/cpp/bindings/tests/equals_unittest.cc
deleted file mode 100644
index 6483baf..0000000
--- a/mojo/public/cpp/bindings/tests/equals_unittest.cc
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-
-#include "base/message_loop/message_loop.h"
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-
-namespace {
-
-RectPtr CreateRect() {
-  return Rect::New(1, 2, 3, 4);
-}
-
-using EqualsTest = testing::Test;
-
-}  // namespace
-
-TEST_F(EqualsTest, NullStruct) {
-  RectPtr r1;
-  RectPtr r2;
-  EXPECT_TRUE(r1.Equals(r2));
-  EXPECT_TRUE(r2.Equals(r1));
-
-  r1 = CreateRect();
-  EXPECT_FALSE(r1.Equals(r2));
-  EXPECT_FALSE(r2.Equals(r1));
-}
-
-TEST_F(EqualsTest, Struct) {
-  RectPtr r1(CreateRect());
-  RectPtr r2(r1.Clone());
-  EXPECT_TRUE(r1.Equals(r2));
-  r2->y = 1;
-  EXPECT_FALSE(r1.Equals(r2));
-  r2.reset();
-  EXPECT_FALSE(r1.Equals(r2));
-}
-
-TEST_F(EqualsTest, StructNested) {
-  RectPairPtr p1(RectPair::New(CreateRect(), CreateRect()));
-  RectPairPtr p2(p1.Clone());
-  EXPECT_TRUE(p1.Equals(p2));
-  p2->second->width = 0;
-  EXPECT_FALSE(p1.Equals(p2));
-  p2->second.reset();
-  EXPECT_FALSE(p1.Equals(p2));
-}
-
-TEST_F(EqualsTest, Array) {
-  std::vector<RectPtr> rects;
-  rects.push_back(CreateRect());
-  NamedRegionPtr n1(NamedRegion::New(std::string("n1"), std::move(rects)));
-  NamedRegionPtr n2(n1.Clone());
-  EXPECT_TRUE(n1.Equals(n2));
-
-  n2->rects = base::nullopt;
-  EXPECT_FALSE(n1.Equals(n2));
-  n2->rects.emplace();
-  EXPECT_FALSE(n1.Equals(n2));
-
-  n2->rects->push_back(CreateRect());
-  n2->rects->push_back(CreateRect());
-  EXPECT_FALSE(n1.Equals(n2));
-
-  n2->rects->resize(1);
-  (*n2->rects)[0]->width = 0;
-  EXPECT_FALSE(n1.Equals(n2));
-
-  (*n2->rects)[0] = CreateRect();
-  EXPECT_TRUE(n1.Equals(n2));
-}
-
-TEST_F(EqualsTest, InterfacePtr) {
-  base::MessageLoop message_loop;
-
-  SomeInterfacePtr inf1;
-  SomeInterfacePtr inf2;
-
-  EXPECT_TRUE(inf1.Equals(inf1));
-  EXPECT_TRUE(inf1.Equals(inf2));
-
-  auto inf1_request = MakeRequest(&inf1);
-  ALLOW_UNUSED_LOCAL(inf1_request);
-
-  EXPECT_TRUE(inf1.Equals(inf1));
-  EXPECT_FALSE(inf1.Equals(inf2));
-
-  auto inf2_request = MakeRequest(&inf2);
-  ALLOW_UNUSED_LOCAL(inf2_request);
-
-  EXPECT_FALSE(inf1.Equals(inf2));
-}
-
-TEST_F(EqualsTest, InterfaceRequest) {
-  base::MessageLoop message_loop;
-
-  InterfaceRequest<SomeInterface> req1;
-  InterfaceRequest<SomeInterface> req2;
-
-  EXPECT_TRUE(req1.Equals(req1));
-  EXPECT_TRUE(req1.Equals(req2));
-
-  SomeInterfacePtr inf1;
-  req1 = MakeRequest(&inf1);
-
-  EXPECT_TRUE(req1.Equals(req1));
-  EXPECT_FALSE(req1.Equals(req2));
-
-  SomeInterfacePtr inf2;
-  req2 = MakeRequest(&inf2);
-
-  EXPECT_FALSE(req1.Equals(req2));
-}
-
-}  // test
-}  // mojo
diff --git a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc b/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
deleted file mode 100644
index ef977af..0000000
--- a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
+++ /dev/null
@@ -1,356 +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.
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "mojo/public/cpp/test_support/test_utils.h"
-#include "mojo/public/interfaces/bindings/tests/sample_factory.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-const char kText1[] = "hello";
-const char kText2[] = "world";
-
-void RecordString(std::string* storage,
-                  const base::Closure& closure,
-                  const std::string& str) {
-  *storage = str;
-  closure.Run();
-}
-
-base::Callback<void(const std::string&)> MakeStringRecorder(
-    std::string* storage,
-    const base::Closure& closure) {
-  return base::Bind(&RecordString, storage, closure);
-}
-
-class ImportedInterfaceImpl : public imported::ImportedInterface {
- public:
-  ImportedInterfaceImpl(
-      InterfaceRequest<imported::ImportedInterface> request,
-      const base::Closure& closure)
-      : binding_(this, std::move(request)), closure_(closure) {}
-
-  void DoSomething() override {
-    do_something_count_++;
-    closure_.Run();
-  }
-
-  static int do_something_count() { return do_something_count_; }
-
- private:
-  static int do_something_count_;
-  Binding<ImportedInterface> binding_;
-  base::Closure closure_;
-};
-int ImportedInterfaceImpl::do_something_count_ = 0;
-
-class SampleNamedObjectImpl : public sample::NamedObject {
- public:
-  SampleNamedObjectImpl() {}
-
-  void SetName(const std::string& name) override { name_ = name; }
-
-  void GetName(const GetNameCallback& callback) override {
-    callback.Run(name_);
-  }
-
- private:
-  std::string name_;
-};
-
-class SampleFactoryImpl : public sample::Factory {
- public:
-  explicit SampleFactoryImpl(InterfaceRequest<sample::Factory> request)
-      : binding_(this, std::move(request)) {}
-
-  void DoStuff(sample::RequestPtr request,
-               ScopedMessagePipeHandle pipe,
-               const DoStuffCallback& callback) override {
-    std::string text1;
-    if (pipe.is_valid())
-      EXPECT_TRUE(ReadTextMessage(pipe.get(), &text1));
-
-    std::string text2;
-    if (request->pipe.is_valid()) {
-      EXPECT_TRUE(ReadTextMessage(request->pipe.get(), &text2));
-
-      // Ensure that simply accessing request->pipe does not close it.
-      EXPECT_TRUE(request->pipe.is_valid());
-    }
-
-    ScopedMessagePipeHandle pipe0;
-    if (!text2.empty()) {
-      CreateMessagePipe(nullptr, &pipe0, &pipe1_);
-      EXPECT_TRUE(WriteTextMessage(pipe1_.get(), text2));
-    }
-
-    sample::ResponsePtr response(sample::Response::New(2, std::move(pipe0)));
-    callback.Run(std::move(response), text1);
-
-    if (request->obj)
-      request->obj->DoSomething();
-  }
-
-  void DoStuff2(ScopedDataPipeConsumerHandle pipe,
-                const DoStuff2Callback& callback) override {
-    // Read the data from the pipe, writing the response (as a string) to
-    // DidStuff2().
-    ASSERT_TRUE(pipe.is_valid());
-    uint32_t data_size = 0;
-
-    MojoHandleSignalsState state;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              mojo::Wait(pipe.get(), MOJO_HANDLE_SIGNAL_READABLE, &state));
-    ASSERT_TRUE(state.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE);
-    ASSERT_EQ(MOJO_RESULT_OK,
-              ReadDataRaw(
-                  pipe.get(), nullptr, &data_size, MOJO_READ_DATA_FLAG_QUERY));
-    ASSERT_NE(0, static_cast<int>(data_size));
-    char data[64];
-    ASSERT_LT(static_cast<int>(data_size), 64);
-    ASSERT_EQ(
-        MOJO_RESULT_OK,
-        ReadDataRaw(
-            pipe.get(), data, &data_size, MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-    callback.Run(data);
-  }
-
-  void CreateNamedObject(
-      InterfaceRequest<sample::NamedObject> object_request) override {
-    EXPECT_TRUE(object_request.is_pending());
-    MakeStrongBinding(base::MakeUnique<SampleNamedObjectImpl>(),
-                      std::move(object_request));
-  }
-
-  // These aren't called or implemented, but exist here to test that the
-  // methods are generated with the correct argument types for imported
-  // interfaces.
-  void RequestImportedInterface(
-      InterfaceRequest<imported::ImportedInterface> imported,
-      const RequestImportedInterfaceCallback& callback) override {}
-  void TakeImportedInterface(
-      imported::ImportedInterfacePtr imported,
-      const TakeImportedInterfaceCallback& callback) override {}
-
- private:
-  ScopedMessagePipeHandle pipe1_;
-  Binding<sample::Factory> binding_;
-};
-
-class HandlePassingTest : public testing::Test {
- public:
-  HandlePassingTest() {}
-
-  void TearDown() override { PumpMessages(); }
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
- private:
-  base::MessageLoop loop_;
-};
-
-void DoStuff(bool* got_response,
-             std::string* got_text_reply,
-             const base::Closure& closure,
-             sample::ResponsePtr response,
-             const std::string& text_reply) {
-  *got_text_reply = text_reply;
-
-  if (response->pipe.is_valid()) {
-    std::string text2;
-    EXPECT_TRUE(ReadTextMessage(response->pipe.get(), &text2));
-
-    // Ensure that simply accessing response.pipe does not close it.
-    EXPECT_TRUE(response->pipe.is_valid());
-
-    EXPECT_EQ(std::string(kText2), text2);
-
-    // Do some more tests of handle passing:
-    ScopedMessagePipeHandle p = std::move(response->pipe);
-    EXPECT_TRUE(p.is_valid());
-    EXPECT_FALSE(response->pipe.is_valid());
-  }
-
-  *got_response = true;
-  closure.Run();
-}
-
-void DoStuff2(bool* got_response,
-              std::string* got_text_reply,
-              const base::Closure& closure,
-              const std::string& text_reply) {
-  *got_response = true;
-  *got_text_reply = text_reply;
-  closure.Run();
-}
-
-TEST_F(HandlePassingTest, Basic) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
-
-  MessagePipe pipe0;
-  EXPECT_TRUE(WriteTextMessage(pipe0.handle1.get(), kText1));
-
-  MessagePipe pipe1;
-  EXPECT_TRUE(WriteTextMessage(pipe1.handle1.get(), kText2));
-
-  imported::ImportedInterfacePtr imported;
-  base::RunLoop run_loop;
-  ImportedInterfaceImpl imported_impl(MakeRequest(&imported),
-                                      run_loop.QuitClosure());
-
-  sample::RequestPtr request(sample::Request::New(
-      1, std::move(pipe1.handle0), base::nullopt, std::move(imported)));
-  bool got_response = false;
-  std::string got_text_reply;
-  base::RunLoop run_loop2;
-  factory->DoStuff(std::move(request), std::move(pipe0.handle0),
-                   base::Bind(&DoStuff, &got_response, &got_text_reply,
-                              run_loop2.QuitClosure()));
-
-  EXPECT_FALSE(got_response);
-  int count_before = ImportedInterfaceImpl::do_something_count();
-
-  run_loop.Run();
-  run_loop2.Run();
-
-  EXPECT_TRUE(got_response);
-  EXPECT_EQ(kText1, got_text_reply);
-  EXPECT_EQ(1, ImportedInterfaceImpl::do_something_count() - count_before);
-}
-
-TEST_F(HandlePassingTest, PassInvalid) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
-
-  sample::RequestPtr request(
-      sample::Request::New(1, ScopedMessagePipeHandle(), base::nullopt,
-                           imported::ImportedInterfacePtr()));
-  bool got_response = false;
-  std::string got_text_reply;
-  base::RunLoop run_loop;
-  factory->DoStuff(std::move(request), ScopedMessagePipeHandle(),
-                   base::Bind(&DoStuff, &got_response, &got_text_reply,
-                              run_loop.QuitClosure()));
-
-  EXPECT_FALSE(got_response);
-
-  run_loop.Run();
-
-  EXPECT_TRUE(got_response);
-}
-
-// Verifies DataPipeConsumer can be passed and read from.
-TEST_F(HandlePassingTest, DataPipe) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
-
-  // Writes a string to a data pipe and passes the data pipe (consumer) to the
-  // factory.
-  ScopedDataPipeProducerHandle producer_handle;
-  ScopedDataPipeConsumerHandle consumer_handle;
-  MojoCreateDataPipeOptions options = {sizeof(MojoCreateDataPipeOptions),
-                                       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,
-                                       1,
-                                       1024};
-  ASSERT_EQ(MOJO_RESULT_OK,
-            CreateDataPipe(&options, &producer_handle, &consumer_handle));
-  std::string expected_text_reply = "got it";
-  // +1 for \0.
-  uint32_t data_size = static_cast<uint32_t>(expected_text_reply.size() + 1);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WriteDataRaw(producer_handle.get(),
-                         expected_text_reply.c_str(),
-                         &data_size,
-                         MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
-
-  bool got_response = false;
-  std::string got_text_reply;
-  base::RunLoop run_loop;
-  factory->DoStuff2(std::move(consumer_handle),
-                    base::Bind(&DoStuff2, &got_response, &got_text_reply,
-                               run_loop.QuitClosure()));
-
-  EXPECT_FALSE(got_response);
-
-  run_loop.Run();
-
-  EXPECT_TRUE(got_response);
-  EXPECT_EQ(expected_text_reply, got_text_reply);
-}
-
-TEST_F(HandlePassingTest, PipesAreClosed) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
-
-  MessagePipe extra_pipe;
-
-  MojoHandle handle0_value = extra_pipe.handle0.get().value();
-  MojoHandle handle1_value = extra_pipe.handle1.get().value();
-
-  {
-    std::vector<ScopedMessagePipeHandle> pipes(2);
-    pipes[0] = std::move(extra_pipe.handle0);
-    pipes[1] = std::move(extra_pipe.handle1);
-
-    sample::RequestPtr request(sample::Request::New());
-    request->more_pipes = std::move(pipes);
-
-    factory->DoStuff(std::move(request), ScopedMessagePipeHandle(),
-                     sample::Factory::DoStuffCallback());
-  }
-
-  // We expect the pipes to have been closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handle0_value));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handle1_value));
-}
-
-TEST_F(HandlePassingTest, CreateNamedObject) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
-
-  sample::NamedObjectPtr object1;
-  EXPECT_FALSE(object1);
-
-  InterfaceRequest<sample::NamedObject> object1_request(&object1);
-  EXPECT_TRUE(object1_request.is_pending());
-  factory->CreateNamedObject(std::move(object1_request));
-  EXPECT_FALSE(object1_request.is_pending());  // We've passed the request.
-
-  ASSERT_TRUE(object1);
-  object1->SetName("object1");
-
-  sample::NamedObjectPtr object2;
-  factory->CreateNamedObject(MakeRequest(&object2));
-  object2->SetName("object2");
-
-  base::RunLoop run_loop, run_loop2;
-  std::string name1;
-  object1->GetName(MakeStringRecorder(&name1, run_loop.QuitClosure()));
-
-  std::string name2;
-  object2->GetName(MakeStringRecorder(&name2, run_loop2.QuitClosure()));
-
-  run_loop.Run();
-  run_loop2.Run();
-
-  EXPECT_EQ(std::string("object1"), name1);
-  EXPECT_EQ(std::string("object2"), name2);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/hash_unittest.cc b/mojo/public/cpp/bindings/tests/hash_unittest.cc
deleted file mode 100644
index 9ce1f5b..0000000
--- a/mojo/public/cpp/bindings/tests/hash_unittest.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/hash_util.h"
-
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-using HashTest = testing::Test;
-
-TEST_F(HashTest, NestedStruct) {
-  // Just check that this template instantiation compiles.
-  ASSERT_EQ(
-      ::mojo::internal::Hash(::mojo::internal::kHashSeed,
-                             SimpleNestedStruct::New(ContainsOther::New(1))),
-      ::mojo::internal::Hash(::mojo::internal::kHashSeed,
-                             SimpleNestedStruct::New(ContainsOther::New(1))));
-}
-
-TEST_F(HashTest, UnmappedNativeStruct) {
-  // Just check that this template instantiation compiles.
-  ASSERT_EQ(::mojo::internal::Hash(::mojo::internal::kHashSeed,
-                                   UnmappedNativeStruct::New()),
-            ::mojo::internal::Hash(::mojo::internal::kHashSeed,
-                                   UnmappedNativeStruct::New()));
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc b/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc
deleted file mode 100644
index 431a844..0000000
--- a/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc
+++ /dev/null
@@ -1,937 +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.
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"
-#include "mojo/public/interfaces/bindings/tests/math_calculator.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/scoping.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-typedef base::Callback<void(double)> CalcCallback;
-
-class MathCalculatorImpl : public math::Calculator {
- public:
-  explicit MathCalculatorImpl(InterfaceRequest<math::Calculator> request)
-      : total_(0.0), binding_(this, std::move(request)) {}
-  ~MathCalculatorImpl() override {}
-
-  void Clear(const CalcCallback& callback) override {
-    total_ = 0.0;
-    callback.Run(total_);
-  }
-
-  void Add(double value, const CalcCallback& callback) override {
-    total_ += value;
-    callback.Run(total_);
-  }
-
-  void Multiply(double value, const CalcCallback& callback) override {
-    total_ *= value;
-    callback.Run(total_);
-  }
-
-  Binding<math::Calculator>* binding() { return &binding_; }
-
- private:
-  double total_;
-  Binding<math::Calculator> binding_;
-};
-
-class MathCalculatorUI {
- public:
-  explicit MathCalculatorUI(math::CalculatorPtr calculator)
-      : calculator_(std::move(calculator)),
-        output_(0.0) {}
-
-  bool encountered_error() const { return calculator_.encountered_error(); }
-  void set_connection_error_handler(const base::Closure& closure) {
-    calculator_.set_connection_error_handler(closure);
-  }
-
-  void Add(double value, const base::Closure& closure) {
-    calculator_->Add(
-        value,
-        base::Bind(&MathCalculatorUI::Output, base::Unretained(this), closure));
-  }
-
-  void Multiply(double value, const base::Closure& closure) {
-    calculator_->Multiply(
-        value,
-        base::Bind(&MathCalculatorUI::Output, base::Unretained(this), closure));
-  }
-
-  double GetOutput() const { return output_; }
-
-  math::CalculatorPtr& GetInterfacePtr() { return calculator_; }
-
- private:
-  void Output(const base::Closure& closure, double output) {
-    output_ = output;
-    if (!closure.is_null())
-      closure.Run();
-  }
-
-  math::CalculatorPtr calculator_;
-  double output_;
-  base::Closure closure_;
-};
-
-class SelfDestructingMathCalculatorUI {
- public:
-  explicit SelfDestructingMathCalculatorUI(math::CalculatorPtr calculator)
-      : calculator_(std::move(calculator)), nesting_level_(0) {
-    ++num_instances_;
-  }
-
-  void BeginTest(bool nested, const base::Closure& closure) {
-    nesting_level_ = nested ? 2 : 1;
-    calculator_->Add(
-        1.0,
-        base::Bind(&SelfDestructingMathCalculatorUI::Output,
-                   base::Unretained(this), closure));
-  }
-
-  static int num_instances() { return num_instances_; }
-
-  void Output(const base::Closure& closure, double value) {
-    if (--nesting_level_ > 0) {
-      // Add some more and wait for re-entrant call to Output!
-      calculator_->Add(
-          1.0,
-          base::Bind(&SelfDestructingMathCalculatorUI::Output,
-                     base::Unretained(this), closure));
-    } else {
-      closure.Run();
-      delete this;
-    }
-  }
-
- private:
-  ~SelfDestructingMathCalculatorUI() { --num_instances_; }
-
-  math::CalculatorPtr calculator_;
-  int nesting_level_;
-  static int num_instances_;
-};
-
-// static
-int SelfDestructingMathCalculatorUI::num_instances_ = 0;
-
-class ReentrantServiceImpl : public sample::Service {
- public:
-  ~ReentrantServiceImpl() override {}
-
-  explicit ReentrantServiceImpl(InterfaceRequest<sample::Service> request)
-      : call_depth_(0),
-        max_call_depth_(0),
-        binding_(this, std::move(request)) {}
-
-  int max_call_depth() { return max_call_depth_; }
-
-  void Frobinate(sample::FooPtr foo,
-                 sample::Service::BazOptions baz,
-                 sample::PortPtr port,
-                 const sample::Service::FrobinateCallback& callback) override {
-    max_call_depth_ = std::max(++call_depth_, max_call_depth_);
-    if (call_depth_ == 1) {
-      EXPECT_TRUE(binding_.WaitForIncomingMethodCall());
-    }
-    call_depth_--;
-    callback.Run(5);
-  }
-
-  void GetPort(mojo::InterfaceRequest<sample::Port> port) override {}
-
- private:
-  int call_depth_;
-  int max_call_depth_;
-  Binding<sample::Service> binding_;
-};
-
-class IntegerAccessorImpl : public sample::IntegerAccessor {
- public:
-  IntegerAccessorImpl() : integer_(0) {}
-  ~IntegerAccessorImpl() override {}
-
-  int64_t integer() const { return integer_; }
-
-  void set_closure(const base::Closure& closure) { closure_ = closure; }
-
- private:
-  // sample::IntegerAccessor implementation.
-  void GetInteger(const GetIntegerCallback& callback) override {
-    callback.Run(integer_, sample::Enum::VALUE);
-  }
-  void SetInteger(int64_t data, sample::Enum type) override {
-    integer_ = data;
-    if (!closure_.is_null()) {
-      closure_.Run();
-      closure_.Reset();
-    }
-  }
-
-  int64_t integer_;
-  base::Closure closure_;
-};
-
-class InterfacePtrTest : public testing::Test {
- public:
-  InterfacePtrTest() {}
-  ~InterfacePtrTest() override { base::RunLoop().RunUntilIdle(); }
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
- private:
-  base::MessageLoop loop_;
-};
-
-void SetFlagAndRunClosure(bool* flag, const base::Closure& closure) {
-  *flag = true;
-  closure.Run();
-}
-
-void IgnoreValueAndRunClosure(const base::Closure& closure, int32_t value) {
-  closure.Run();
-}
-
-void ExpectValueAndRunClosure(uint32_t expected_value,
-                              const base::Closure& closure,
-                              uint32_t value) {
-  EXPECT_EQ(expected_value, value);
-  closure.Run();
-}
-
-TEST_F(InterfacePtrTest, IsBound) {
-  math::CalculatorPtr calc;
-  EXPECT_FALSE(calc.is_bound());
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-  EXPECT_TRUE(calc.is_bound());
-}
-
-TEST_F(InterfacePtrTest, EndToEnd) {
-  math::CalculatorPtr calc;
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-
-  // Suppose this is instantiated in a process that has pipe1_.
-  MathCalculatorUI calculator_ui(std::move(calc));
-
-  base::RunLoop run_loop, run_loop2;
-  calculator_ui.Add(2.0, run_loop.QuitClosure());
-  calculator_ui.Multiply(5.0, run_loop2.QuitClosure());
-  run_loop.Run();
-  run_loop2.Run();
-
-  EXPECT_EQ(10.0, calculator_ui.GetOutput());
-}
-
-TEST_F(InterfacePtrTest, EndToEnd_Synchronous) {
-  math::CalculatorPtr calc;
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-
-  // Suppose this is instantiated in a process that has pipe1_.
-  MathCalculatorUI calculator_ui(std::move(calc));
-
-  EXPECT_EQ(0.0, calculator_ui.GetOutput());
-
-  base::RunLoop run_loop;
-  calculator_ui.Add(2.0, run_loop.QuitClosure());
-  EXPECT_EQ(0.0, calculator_ui.GetOutput());
-  calc_impl.binding()->WaitForIncomingMethodCall();
-  run_loop.Run();
-  EXPECT_EQ(2.0, calculator_ui.GetOutput());
-
-  base::RunLoop run_loop2;
-  calculator_ui.Multiply(5.0, run_loop2.QuitClosure());
-  EXPECT_EQ(2.0, calculator_ui.GetOutput());
-  calc_impl.binding()->WaitForIncomingMethodCall();
-  run_loop2.Run();
-  EXPECT_EQ(10.0, calculator_ui.GetOutput());
-}
-
-TEST_F(InterfacePtrTest, Movable) {
-  math::CalculatorPtr a;
-  math::CalculatorPtr b;
-  MathCalculatorImpl calc_impl(MakeRequest(&b));
-
-  EXPECT_TRUE(!a);
-  EXPECT_FALSE(!b);
-
-  a = std::move(b);
-
-  EXPECT_FALSE(!a);
-  EXPECT_TRUE(!b);
-}
-
-TEST_F(InterfacePtrTest, Resettable) {
-  math::CalculatorPtr a;
-
-  EXPECT_TRUE(!a);
-
-  MessagePipe pipe;
-
-  // Save this so we can test it later.
-  Handle handle = pipe.handle0.get();
-
-  a = MakeProxy(
-      InterfacePtrInfo<math::Calculator>(std::move(pipe.handle0), 0u));
-
-  EXPECT_FALSE(!a);
-
-  a.reset();
-
-  EXPECT_TRUE(!a);
-  EXPECT_FALSE(a.internal_state()->is_bound());
-
-  // Test that handle was closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, CloseRaw(handle));
-}
-
-TEST_F(InterfacePtrTest, BindInvalidHandle) {
-  math::CalculatorPtr ptr;
-  EXPECT_FALSE(ptr.get());
-  EXPECT_FALSE(ptr);
-
-  ptr.Bind(InterfacePtrInfo<math::Calculator>());
-  EXPECT_FALSE(ptr.get());
-  EXPECT_FALSE(ptr);
-}
-
-TEST_F(InterfacePtrTest, EncounteredError) {
-  math::CalculatorPtr proxy;
-  MathCalculatorImpl calc_impl(MakeRequest(&proxy));
-
-  MathCalculatorUI calculator_ui(std::move(proxy));
-
-  base::RunLoop run_loop;
-  calculator_ui.Add(2.0, run_loop.QuitClosure());
-  run_loop.Run();
-  EXPECT_EQ(2.0, calculator_ui.GetOutput());
-  EXPECT_FALSE(calculator_ui.encountered_error());
-
-  calculator_ui.Multiply(5.0, base::Closure());
-  EXPECT_FALSE(calculator_ui.encountered_error());
-
-  // Close the server.
-  calc_impl.binding()->Close();
-
-  // The state change isn't picked up locally yet.
-  base::RunLoop run_loop2;
-  calculator_ui.set_connection_error_handler(run_loop2.QuitClosure());
-  EXPECT_FALSE(calculator_ui.encountered_error());
-
-  run_loop2.Run();
-
-  // OK, now we see the error.
-  EXPECT_TRUE(calculator_ui.encountered_error());
-}
-
-TEST_F(InterfacePtrTest, EncounteredErrorCallback) {
-  math::CalculatorPtr proxy;
-  MathCalculatorImpl calc_impl(MakeRequest(&proxy));
-
-  bool encountered_error = false;
-  base::RunLoop run_loop;
-  proxy.set_connection_error_handler(
-      base::Bind(&SetFlagAndRunClosure, &encountered_error,
-                 run_loop.QuitClosure()));
-
-  MathCalculatorUI calculator_ui(std::move(proxy));
-
-  base::RunLoop run_loop2;
-  calculator_ui.Add(2.0, run_loop2.QuitClosure());
-  run_loop2.Run();
-  EXPECT_EQ(2.0, calculator_ui.GetOutput());
-  EXPECT_FALSE(calculator_ui.encountered_error());
-
-  calculator_ui.Multiply(5.0, base::Closure());
-  EXPECT_FALSE(calculator_ui.encountered_error());
-
-  // Close the server.
-  calc_impl.binding()->Close();
-
-  // The state change isn't picked up locally yet.
-  EXPECT_FALSE(calculator_ui.encountered_error());
-
-  run_loop.Run();
-
-  // OK, now we see the error.
-  EXPECT_TRUE(calculator_ui.encountered_error());
-
-  // We should have also been able to observe the error through the error
-  // handler.
-  EXPECT_TRUE(encountered_error);
-}
-
-TEST_F(InterfacePtrTest, DestroyInterfacePtrOnMethodResponse) {
-  math::CalculatorPtr proxy;
-  MathCalculatorImpl calc_impl(MakeRequest(&proxy));
-
-  EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
-
-  SelfDestructingMathCalculatorUI* impl =
-      new SelfDestructingMathCalculatorUI(std::move(proxy));
-  base::RunLoop run_loop;
-  impl->BeginTest(false, run_loop.QuitClosure());
-  run_loop.Run();
-
-  EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
-}
-
-TEST_F(InterfacePtrTest, NestedDestroyInterfacePtrOnMethodResponse) {
-  math::CalculatorPtr proxy;
-  MathCalculatorImpl calc_impl(MakeRequest(&proxy));
-
-  EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
-
-  SelfDestructingMathCalculatorUI* impl =
-      new SelfDestructingMathCalculatorUI(std::move(proxy));
-  base::RunLoop run_loop;
-  impl->BeginTest(true, run_loop.QuitClosure());
-  run_loop.Run();
-
-  EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
-}
-
-TEST_F(InterfacePtrTest, ReentrantWaitForIncomingMethodCall) {
-  sample::ServicePtr proxy;
-  ReentrantServiceImpl impl(MakeRequest(&proxy));
-
-  base::RunLoop run_loop, run_loop2;
-  proxy->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                   base::Bind(&IgnoreValueAndRunClosure,
-                              run_loop.QuitClosure()));
-  proxy->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                   base::Bind(&IgnoreValueAndRunClosure,
-                              run_loop2.QuitClosure()));
-
-  run_loop.Run();
-  run_loop2.Run();
-
-  EXPECT_EQ(2, impl.max_call_depth());
-}
-
-TEST_F(InterfacePtrTest, QueryVersion) {
-  IntegerAccessorImpl impl;
-  sample::IntegerAccessorPtr ptr;
-  Binding<sample::IntegerAccessor> binding(&impl, MakeRequest(&ptr));
-
-  EXPECT_EQ(0u, ptr.version());
-
-  base::RunLoop run_loop;
-  ptr.QueryVersion(base::Bind(&ExpectValueAndRunClosure, 3u,
-                              run_loop.QuitClosure()));
-  run_loop.Run();
-
-  EXPECT_EQ(3u, ptr.version());
-}
-
-TEST_F(InterfacePtrTest, RequireVersion) {
-  IntegerAccessorImpl impl;
-  sample::IntegerAccessorPtr ptr;
-  Binding<sample::IntegerAccessor> binding(&impl, MakeRequest(&ptr));
-
-  EXPECT_EQ(0u, ptr.version());
-
-  ptr.RequireVersion(1u);
-  EXPECT_EQ(1u, ptr.version());
-  base::RunLoop run_loop;
-  impl.set_closure(run_loop.QuitClosure());
-  ptr->SetInteger(123, sample::Enum::VALUE);
-  run_loop.Run();
-  EXPECT_FALSE(ptr.encountered_error());
-  EXPECT_EQ(123, impl.integer());
-
-  ptr.RequireVersion(3u);
-  EXPECT_EQ(3u, ptr.version());
-  base::RunLoop run_loop2;
-  impl.set_closure(run_loop2.QuitClosure());
-  ptr->SetInteger(456, sample::Enum::VALUE);
-  run_loop2.Run();
-  EXPECT_FALSE(ptr.encountered_error());
-  EXPECT_EQ(456, impl.integer());
-
-  // Require a version that is not supported by the impl side.
-  ptr.RequireVersion(4u);
-  // This value is set to the input of RequireVersion() synchronously.
-  EXPECT_EQ(4u, ptr.version());
-  base::RunLoop run_loop3;
-  ptr.set_connection_error_handler(run_loop3.QuitClosure());
-  ptr->SetInteger(789, sample::Enum::VALUE);
-  run_loop3.Run();
-  EXPECT_TRUE(ptr.encountered_error());
-  // The call to SetInteger() after RequireVersion(4u) is ignored.
-  EXPECT_EQ(456, impl.integer());
-}
-
-class StrongMathCalculatorImpl : public math::Calculator {
- public:
-  StrongMathCalculatorImpl(bool* destroyed) : destroyed_(destroyed) {}
-  ~StrongMathCalculatorImpl() override { *destroyed_ = true; }
-
-  // math::Calculator implementation.
-  void Clear(const CalcCallback& callback) override { callback.Run(total_); }
-
-  void Add(double value, const CalcCallback& callback) override {
-    total_ += value;
-    callback.Run(total_);
-  }
-
-  void Multiply(double value, const CalcCallback& callback) override {
-    total_ *= value;
-    callback.Run(total_);
-  }
-
- private:
-  double total_ = 0.0;
-  bool* destroyed_;
-};
-
-TEST(StrongConnectorTest, Math) {
-  base::MessageLoop loop;
-
-  bool error_received = false;
-  bool destroyed = false;
-  math::CalculatorPtr calc;
-  base::RunLoop run_loop;
-
-  auto binding =
-      MakeStrongBinding(base::MakeUnique<StrongMathCalculatorImpl>(&destroyed),
-                        MakeRequest(&calc));
-  binding->set_connection_error_handler(base::Bind(
-      &SetFlagAndRunClosure, &error_received, run_loop.QuitClosure()));
-
-  {
-    // Suppose this is instantiated in a process that has the other end of the
-    // message pipe.
-    MathCalculatorUI calculator_ui(std::move(calc));
-
-    base::RunLoop run_loop, run_loop2;
-    calculator_ui.Add(2.0, run_loop.QuitClosure());
-    calculator_ui.Multiply(5.0, run_loop2.QuitClosure());
-    run_loop.Run();
-    run_loop2.Run();
-
-    EXPECT_EQ(10.0, calculator_ui.GetOutput());
-    EXPECT_FALSE(error_received);
-    EXPECT_FALSE(destroyed);
-  }
-  // Destroying calculator_ui should close the pipe and generate an error on the
-  // other
-  // end which will destroy the instance since it is strongly bound.
-
-  run_loop.Run();
-  EXPECT_TRUE(error_received);
-  EXPECT_TRUE(destroyed);
-}
-
-class WeakMathCalculatorImpl : public math::Calculator {
- public:
-  WeakMathCalculatorImpl(ScopedMessagePipeHandle handle,
-                         bool* error_received,
-                         bool* destroyed,
-                         const base::Closure& closure)
-      : error_received_(error_received),
-        destroyed_(destroyed),
-        closure_(closure),
-        binding_(this, std::move(handle)) {
-    binding_.set_connection_error_handler(
-        base::Bind(&SetFlagAndRunClosure, error_received_, closure_));
-  }
-  ~WeakMathCalculatorImpl() override { *destroyed_ = true; }
-
-  void Clear(const CalcCallback& callback) override { callback.Run(total_); }
-
-  void Add(double value, const CalcCallback& callback) override {
-    total_ += value;
-    callback.Run(total_);
-  }
-
-  void Multiply(double value, const CalcCallback& callback) override {
-    total_ *= value;
-    callback.Run(total_);
-  }
-
- private:
-  double total_ = 0.0;
-  bool* error_received_;
-  bool* destroyed_;
-  base::Closure closure_;
-
-  Binding<math::Calculator> binding_;
-};
-
-TEST(WeakConnectorTest, Math) {
-  base::MessageLoop loop;
-
-  bool error_received = false;
-  bool destroyed = false;
-  MessagePipe pipe;
-  base::RunLoop run_loop;
-  WeakMathCalculatorImpl impl(std::move(pipe.handle0), &error_received,
-                              &destroyed, run_loop.QuitClosure());
-
-  math::CalculatorPtr calc;
-  calc.Bind(InterfacePtrInfo<math::Calculator>(std::move(pipe.handle1), 0u));
-
-  {
-    // Suppose this is instantiated in a process that has the other end of the
-    // message pipe.
-    MathCalculatorUI calculator_ui(std::move(calc));
-
-    base::RunLoop run_loop, run_loop2;
-    calculator_ui.Add(2.0, run_loop.QuitClosure());
-    calculator_ui.Multiply(5.0, run_loop2.QuitClosure());
-    run_loop.Run();
-    run_loop2.Run();
-
-    EXPECT_EQ(10.0, calculator_ui.GetOutput());
-    EXPECT_FALSE(error_received);
-    EXPECT_FALSE(destroyed);
-    // Destroying calculator_ui should close the pipe and generate an error on
-    // the other
-    // end which will destroy the instance since it is strongly bound.
-  }
-
-  run_loop.Run();
-  EXPECT_TRUE(error_received);
-  EXPECT_FALSE(destroyed);
-}
-
-class CImpl : public C {
- public:
-  CImpl(bool* d_called, const base::Closure& closure)
-      : d_called_(d_called), closure_(closure) {}
-  ~CImpl() override {}
-
- private:
-  void D() override {
-    *d_called_ = true;
-    closure_.Run();
-  }
-
-  bool* d_called_;
-  base::Closure closure_;
-};
-
-class BImpl : public B {
- public:
-  BImpl(bool* d_called, const base::Closure& closure)
-      : d_called_(d_called), closure_(closure) {}
-  ~BImpl() override {}
-
- private:
-  void GetC(InterfaceRequest<C> c) override {
-    MakeStrongBinding(base::MakeUnique<CImpl>(d_called_, closure_),
-                      std::move(c));
-  }
-
-  bool* d_called_;
-  base::Closure closure_;
-};
-
-class AImpl : public A {
- public:
-  AImpl(InterfaceRequest<A> request, const base::Closure& closure)
-      : d_called_(false), binding_(this, std::move(request)),
-        closure_(closure) {}
-  ~AImpl() override {}
-
-  bool d_called() const { return d_called_; }
-
- private:
-  void GetB(InterfaceRequest<B> b) override {
-    MakeStrongBinding(base::MakeUnique<BImpl>(&d_called_, closure_),
-                      std::move(b));
-  }
-
-  bool d_called_;
-  Binding<A> binding_;
-  base::Closure closure_;
-};
-
-TEST_F(InterfacePtrTest, Scoping) {
-  APtr a;
-  base::RunLoop run_loop;
-  AImpl a_impl(MakeRequest(&a), run_loop.QuitClosure());
-
-  EXPECT_FALSE(a_impl.d_called());
-
-  {
-    BPtr b;
-    a->GetB(MakeRequest(&b));
-    CPtr c;
-    b->GetC(MakeRequest(&c));
-    c->D();
-  }
-
-  // While B & C have fallen out of scope, the pipes will remain until they are
-  // flushed.
-  EXPECT_FALSE(a_impl.d_called());
-  run_loop.Run();
-  EXPECT_TRUE(a_impl.d_called());
-}
-
-class PingTestImpl : public sample::PingTest {
- public:
-  explicit PingTestImpl(InterfaceRequest<sample::PingTest> request)
-      : binding_(this, std::move(request)) {}
-  ~PingTestImpl() override {}
-
- private:
-  // sample::PingTest:
-  void Ping(const PingCallback& callback) override { callback.Run(); }
-
-  Binding<sample::PingTest> binding_;
-};
-
-// Tests that FuseProxy does what it's supposed to do.
-TEST_F(InterfacePtrTest, Fusion) {
-  sample::PingTestPtr proxy;
-  PingTestImpl impl(MakeRequest(&proxy));
-
-  // Create another PingTest pipe.
-  sample::PingTestPtr ptr;
-  sample::PingTestRequest request(&ptr);
-
-  // Fuse the new pipe to the one hanging off |impl|.
-  EXPECT_TRUE(FuseInterface(std::move(request), proxy.PassInterface()));
-
-  // Ping!
-  bool called = false;
-  base::RunLoop loop;
-  ptr->Ping(base::Bind(&SetFlagAndRunClosure, &called, loop.QuitClosure()));
-  loop.Run();
-  EXPECT_TRUE(called);
-}
-
-void Fail() {
-  FAIL() << "Unexpected connection error";
-}
-
-TEST_F(InterfacePtrTest, FlushForTesting) {
-  math::CalculatorPtr calc;
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-  calc.set_connection_error_handler(base::Bind(&Fail));
-
-  MathCalculatorUI calculator_ui(std::move(calc));
-
-  calculator_ui.Add(2.0, base::Bind(&base::DoNothing));
-  calculator_ui.GetInterfacePtr().FlushForTesting();
-  EXPECT_EQ(2.0, calculator_ui.GetOutput());
-
-  calculator_ui.Multiply(5.0, base::Bind(&base::DoNothing));
-  calculator_ui.GetInterfacePtr().FlushForTesting();
-
-  EXPECT_EQ(10.0, calculator_ui.GetOutput());
-}
-
-void SetBool(bool* value) {
-  *value = true;
-}
-
-TEST_F(InterfacePtrTest, FlushForTestingWithClosedPeer) {
-  math::CalculatorPtr calc;
-  MakeRequest(&calc);
-  bool called = false;
-  calc.set_connection_error_handler(base::Bind(&SetBool, &called));
-  calc.FlushForTesting();
-  EXPECT_TRUE(called);
-  calc.FlushForTesting();
-}
-
-TEST_F(InterfacePtrTest, ConnectionErrorWithReason) {
-  math::CalculatorPtr calc;
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-
-  base::RunLoop run_loop;
-  calc.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(42u, custom_reason);
-        EXPECT_EQ("hey", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  calc_impl.binding()->CloseWithReason(42u, "hey");
-
-  run_loop.Run();
-}
-
-TEST_F(InterfacePtrTest, InterfaceRequestResetWithReason) {
-  math::CalculatorPtr calc;
-  auto request = MakeRequest(&calc);
-
-  base::RunLoop run_loop;
-  calc.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(88u, custom_reason);
-        EXPECT_EQ("greetings", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  request.ResetWithReason(88u, "greetings");
-
-  run_loop.Run();
-}
-
-TEST_F(InterfacePtrTest, CallbackIsPassedInterfacePtr) {
-  sample::PingTestPtr ptr;
-  sample::PingTestRequest request(&ptr);
-
-  base::RunLoop run_loop;
-
-  // Make a call with the proxy's lifetime bound to the response callback.
-  sample::PingTest* raw_proxy = ptr.get();
-  ptr.set_connection_error_handler(run_loop.QuitClosure());
-  raw_proxy->Ping(
-      base::Bind([](sample::PingTestPtr ptr) {}, base::Passed(&ptr)));
-
-  // Trigger an error on |ptr|. This will ultimately lead to the proxy's
-  // response callbacks being destroyed, which will in turn lead to the proxy
-  // being destroyed. This should not crash.
-  request.PassMessagePipe();
-  run_loop.Run();
-}
-
-TEST_F(InterfacePtrTest, ConnectionErrorHandlerOwnsInterfacePtr) {
-  sample::PingTestPtr* ptr = new sample::PingTestPtr;
-  sample::PingTestRequest request(ptr);
-
-  base::RunLoop run_loop;
-
-  // Make a call with |ptr|'s lifetime bound to the connection error handler
-  // callback.
-  ptr->set_connection_error_handler(base::Bind(
-      [](const base::Closure& quit, sample::PingTestPtr* ptr) {
-        ptr->reset();
-        quit.Run();
-      },
-      run_loop.QuitClosure(), base::Owned(ptr)));
-
-  // Trigger an error on |ptr|. In the error handler |ptr| is reset. This
-  // shouldn't immediately destroy the callback (and |ptr| that it owns), before
-  // the callback is completed.
-  request.PassMessagePipe();
-  run_loop.Run();
-}
-
-TEST_F(InterfacePtrTest, ThreadSafeInterfacePointer) {
-  math::CalculatorPtr ptr;
-  MathCalculatorImpl calc_impl(MakeRequest(&ptr));
-  scoped_refptr<math::ThreadSafeCalculatorPtr> thread_safe_ptr =
-      math::ThreadSafeCalculatorPtr::Create(std::move(ptr));
-
-  base::RunLoop run_loop;
-
-  // Create and start the thread from where we'll call the interface pointer.
-  base::Thread other_thread("service test thread");
-  other_thread.Start();
-
-  auto run_method = base::Bind(
-      [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-         const base::Closure& quit_closure,
-         const scoped_refptr<math::ThreadSafeCalculatorPtr>& thread_safe_ptr) {
-        auto calc_callback = base::Bind(
-            [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-               const base::Closure& quit_closure,
-               base::PlatformThreadId thread_id,
-               double result) {
-              EXPECT_EQ(123, result);
-              // Validate the callback is invoked on the calling thread.
-              EXPECT_EQ(thread_id, base::PlatformThread::CurrentId());
-              // Notify the run_loop to quit.
-              main_task_runner->PostTask(FROM_HERE, quit_closure);
-            });
-        (*thread_safe_ptr)->Add(
-            123, base::Bind(calc_callback, main_task_runner, quit_closure,
-                            base::PlatformThread::CurrentId()));
-      },
-      base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(),
-      thread_safe_ptr);
-  other_thread.message_loop()->task_runner()->PostTask(FROM_HERE, run_method);
-
-  // Block until the method callback is called on the background thread.
-  run_loop.Run();
-}
-
-TEST_F(InterfacePtrTest, ThreadSafeInterfacePointerWithTaskRunner) {
-  // Create and start the thread from where we'll bind the interface pointer.
-  base::Thread other_thread("service test thread");
-  other_thread.Start();
-  const scoped_refptr<base::SingleThreadTaskRunner>& other_thread_task_runner =
-      other_thread.message_loop()->task_runner();
-
-  math::CalculatorPtr ptr;
-  math::CalculatorRequest request(&ptr);
-
-  // Create a ThreadSafeInterfacePtr that we'll bind from a different thread.
-  scoped_refptr<math::ThreadSafeCalculatorPtr> thread_safe_ptr =
-      math::ThreadSafeCalculatorPtr::Create(ptr.PassInterface(),
-                                            other_thread_task_runner);
-  ASSERT_TRUE(thread_safe_ptr);
-
-  MathCalculatorImpl* math_calc_impl = nullptr;
-  {
-    base::RunLoop run_loop;
-    auto run_method = base::Bind(
-        [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-           const base::Closure& quit_closure,
-           const scoped_refptr<math::ThreadSafeCalculatorPtr>& thread_safe_ptr,
-           math::CalculatorRequest request,
-           MathCalculatorImpl** math_calc_impl) {
-          math::CalculatorPtr ptr;
-          // In real life, the implementation would have a legitimate owner.
-          *math_calc_impl = new MathCalculatorImpl(std::move(request));
-          main_task_runner->PostTask(FROM_HERE, quit_closure);
-        },
-        base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(),
-        thread_safe_ptr, base::Passed(&request), &math_calc_impl);
-    other_thread.message_loop()->task_runner()->PostTask(FROM_HERE, run_method);
-    run_loop.Run();
-  }
-
-  {
-    // The interface ptr is bound, we can call methods on it.
-    auto calc_callback =
-        base::Bind([](const base::Closure& quit_closure, double result) {
-          EXPECT_EQ(123, result);
-          quit_closure.Run();
-        });
-    base::RunLoop run_loop;
-    (*thread_safe_ptr)
-        ->Add(123, base::Bind(calc_callback, run_loop.QuitClosure()));
-    // Block until the method callback is called.
-    run_loop.Run();
-  }
-
-  other_thread_task_runner->DeleteSoon(FROM_HERE, math_calc_impl);
-
-  // Reset the pointer now so the InterfacePtr associated resources can be
-  // deleted before the background thread's message loop is invalidated.
-  thread_safe_ptr = nullptr;
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/map_unittest.cc b/mojo/public/cpp/bindings/tests/map_unittest.cc
deleted file mode 100644
index 8d630a5..0000000
--- a/mojo/public/cpp/bindings/tests/map_unittest.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-#include <unordered_map>
-#include <utility>
-
-#include "mojo/public/cpp/bindings/tests/rect_chromium.h"
-#include "mojo/public/interfaces/bindings/tests/rect.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-TEST(MapTest, StructKey) {
-  std::unordered_map<RectPtr, int32_t> map;
-  map.insert(std::make_pair(Rect::New(1, 2, 3, 4), 123));
-
-  RectPtr key = Rect::New(1, 2, 3, 4);
-  ASSERT_NE(map.end(), map.find(key));
-  ASSERT_EQ(123, map.find(key)->second);
-
-  map.erase(key);
-  ASSERT_EQ(0u, map.size());
-}
-
-TEST(MapTest, TypemappedStructKey) {
-  std::unordered_map<ContainsHashablePtr, int32_t> map;
-  map.insert(
-      std::make_pair(ContainsHashable::New(RectChromium(1, 2, 3, 4)), 123));
-
-  ContainsHashablePtr key = ContainsHashable::New(RectChromium(1, 2, 3, 4));
-  ASSERT_NE(map.end(), map.find(key));
-  ASSERT_EQ(123, map.find(key)->second);
-
-  map.erase(key);
-  ASSERT_EQ(0u, map.size());
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/message_queue.cc b/mojo/public/cpp/bindings/tests/message_queue.cc
deleted file mode 100644
index 32ed763..0000000
--- a/mojo/public/cpp/bindings/tests/message_queue.cc
+++ /dev/null
@@ -1,39 +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.
-
-#include "mojo/public/cpp/bindings/tests/message_queue.h"
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-namespace test {
-
-MessageQueue::MessageQueue() {
-}
-
-MessageQueue::~MessageQueue() {
-}
-
-bool MessageQueue::IsEmpty() const {
-  return queue_.empty();
-}
-
-void MessageQueue::Push(Message* message) {
-  queue_.emplace(std::move(*message));
-}
-
-void MessageQueue::Pop(Message* message) {
-  DCHECK(!queue_.empty());
-  *message = std::move(queue_.front());
-  Pop();
-}
-
-void MessageQueue::Pop() {
-  DCHECK(!queue_.empty());
-  queue_.pop();
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/message_queue.h b/mojo/public/cpp/bindings/tests/message_queue.h
deleted file mode 100644
index 8f13f7a..0000000
--- a/mojo/public/cpp/bindings/tests/message_queue.h
+++ /dev/null
@@ -1,44 +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.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_MESSAGE_QUEUE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_MESSAGE_QUEUE_H_
-
-#include <queue>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-namespace test {
-
-// A queue for Message objects.
-class MessageQueue {
- public:
-  MessageQueue();
-  ~MessageQueue();
-
-  bool IsEmpty() const;
-
-  // This method copies the message data and steals ownership of its handles.
-  void Push(Message* message);
-
-  // Removes the next message from the queue, copying its data and transferring
-  // ownership of its handles to the given |message|.
-  void Pop(Message* message);
-
-  size_t size() const { return queue_.size(); }
-
- private:
-  void Pop();
-
-  std::queue<Message> queue_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageQueue);
-};
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_MESSAGE_QUEUE_H_
diff --git a/mojo/public/cpp/bindings/tests/mojo_test_blink_export.h b/mojo/public/cpp/bindings/tests/mojo_test_blink_export.h
deleted file mode 100644
index b3bbe27..0000000
--- a/mojo/public/cpp/bindings/tests/mojo_test_blink_export.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_MOJO_TEST_BLINK_EXPORT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_MOJO_TEST_BLINK_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(MOJO_TEST_BLINK_IMPLEMENTATION)
-#define MOJO_TEST_BLINK_EXPORT __declspec(dllexport)
-#else
-#define MOJO_TEST_BLINK_EXPORT __declspec(dllimport)
-#endif  // defined(MOJO_TEST_BLINK_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-#if defined(MOJO_TEST_BLINK_IMPLEMENTATION)
-#define MOJO_TEST_BLINK_EXPORT __attribute__((visibility("default")))
-#else
-#define MOJO_TEST_BLINK_EXPORT
-#endif
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define MOJO_TEST_BLINK_EXPORT
-#endif
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_MOJO_TEST_BLINK_EXPORT_H_
diff --git a/mojo/public/cpp/bindings/tests/mojo_test_export.h b/mojo/public/cpp/bindings/tests/mojo_test_export.h
deleted file mode 100644
index a48a1ba..0000000
--- a/mojo/public/cpp/bindings/tests/mojo_test_export.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_MOJO_TEST_EXPORT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_MOJO_TEST_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(MOJO_TEST_IMPLEMENTATION)
-#define MOJO_TEST_EXPORT __declspec(dllexport)
-#else
-#define MOJO_TEST_EXPORT __declspec(dllimport)
-#endif  // defined(MOJO_TEST_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-#if defined(MOJO_TEST_IMPLEMENTATION)
-#define MOJO_TEST_EXPORT __attribute__((visibility("default")))
-#else
-#define MOJO_TEST_EXPORT
-#endif
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define MOJO_TEST_EXPORT
-#endif
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_MOJO_TEST_EXPORT_H_
diff --git a/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc b/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc
deleted file mode 100644
index 8950928..0000000
--- a/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/lib/multiplex_router.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-#include "mojo/public/cpp/bindings/tests/message_queue.h"
-#include "mojo/public/cpp/bindings/tests/router_test_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-using mojo::internal::MultiplexRouter;
-
-class MultiplexRouterTest : public testing::Test {
- public:
-  MultiplexRouterTest() {}
-
-  void SetUp() override {
-    MessagePipe pipe;
-    router0_ = new MultiplexRouter(std::move(pipe.handle0),
-                                   MultiplexRouter::MULTI_INTERFACE, false,
-                                   base::ThreadTaskRunnerHandle::Get());
-    router1_ = new MultiplexRouter(std::move(pipe.handle1),
-                                   MultiplexRouter::MULTI_INTERFACE, true,
-                                   base::ThreadTaskRunnerHandle::Get());
-    ScopedInterfaceEndpointHandle::CreatePairPendingAssociation(&endpoint0_,
-                                                                &endpoint1_);
-    auto id = router0_->AssociateInterface(std::move(endpoint1_));
-    endpoint1_ = router1_->CreateLocalEndpointHandle(id);
-  }
-
-  void TearDown() override {}
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
- protected:
-  scoped_refptr<MultiplexRouter> router0_;
-  scoped_refptr<MultiplexRouter> router1_;
-  ScopedInterfaceEndpointHandle endpoint0_;
-  ScopedInterfaceEndpointHandle endpoint1_;
-
- private:
-  base::MessageLoop loop_;
-};
-
-TEST_F(MultiplexRouterTest, BasicRequestResponse) {
-  InterfaceEndpointClient client0(std::move(endpoint0_), nullptr,
-                                  base::MakeUnique<PassThroughFilter>(), false,
-                                  base::ThreadTaskRunnerHandle::Get(), 0u);
-  ResponseGenerator generator;
-  InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
-                                  base::MakeUnique<PassThroughFilter>(), false,
-                                  base::ThreadTaskRunnerHandle::Get(), 0u);
-
-  Message request;
-  AllocRequestMessage(1, "hello", &request);
-
-  MessageQueue message_queue;
-  base::RunLoop run_loop;
-  client0.AcceptWithResponder(
-      &request, base::MakeUnique<MessageAccumulator>(&message_queue,
-                                                     run_loop.QuitClosure()));
-
-  run_loop.Run();
-
-  EXPECT_FALSE(message_queue.IsEmpty());
-
-  Message response;
-  message_queue.Pop(&response);
-
-  EXPECT_EQ(std::string("hello world!"),
-            std::string(reinterpret_cast<const char*>(response.payload())));
-
-  // Send a second message on the pipe.
-  Message request2;
-  AllocRequestMessage(1, "hello again", &request2);
-
-  base::RunLoop run_loop2;
-  client0.AcceptWithResponder(
-      &request2, base::MakeUnique<MessageAccumulator>(&message_queue,
-                                                      run_loop2.QuitClosure()));
-
-  run_loop2.Run();
-
-  EXPECT_FALSE(message_queue.IsEmpty());
-
-  message_queue.Pop(&response);
-
-  EXPECT_EQ(std::string("hello again world!"),
-            std::string(reinterpret_cast<const char*>(response.payload())));
-}
-
-TEST_F(MultiplexRouterTest, BasicRequestResponse_Synchronous) {
-  InterfaceEndpointClient client0(std::move(endpoint0_), nullptr,
-                                  base::MakeUnique<PassThroughFilter>(), false,
-                                  base::ThreadTaskRunnerHandle::Get(), 0u);
-  ResponseGenerator generator;
-  InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
-                                  base::MakeUnique<PassThroughFilter>(), false,
-                                  base::ThreadTaskRunnerHandle::Get(), 0u);
-
-  Message request;
-  AllocRequestMessage(1, "hello", &request);
-
-  MessageQueue message_queue;
-  client0.AcceptWithResponder(
-      &request, base::MakeUnique<MessageAccumulator>(&message_queue));
-
-  router1_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-  router0_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-
-  EXPECT_FALSE(message_queue.IsEmpty());
-
-  Message response;
-  message_queue.Pop(&response);
-
-  EXPECT_EQ(std::string("hello world!"),
-            std::string(reinterpret_cast<const char*>(response.payload())));
-
-  // Send a second message on the pipe.
-  Message request2;
-  AllocRequestMessage(1, "hello again", &request2);
-
-  client0.AcceptWithResponder(
-      &request2, base::MakeUnique<MessageAccumulator>(&message_queue));
-
-  router1_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-  router0_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-
-  EXPECT_FALSE(message_queue.IsEmpty());
-
-  message_queue.Pop(&response);
-
-  EXPECT_EQ(std::string("hello again world!"),
-            std::string(reinterpret_cast<const char*>(response.payload())));
-}
-
-// Tests MultiplexRouter using the LazyResponseGenerator. The responses will not
-// be sent until after the requests have been accepted.
-TEST_F(MultiplexRouterTest, LazyResponses) {
-  InterfaceEndpointClient client0(
-      std::move(endpoint0_), nullptr, base::WrapUnique(new PassThroughFilter()),
-      false, base::ThreadTaskRunnerHandle::Get(), 0u);
-  base::RunLoop run_loop;
-  LazyResponseGenerator generator(run_loop.QuitClosure());
-  InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
-                                  base::WrapUnique(new PassThroughFilter()),
-                                  false, base::ThreadTaskRunnerHandle::Get(),
-                                  0u);
-
-  Message request;
-  AllocRequestMessage(1, "hello", &request);
-
-  MessageQueue message_queue;
-  base::RunLoop run_loop2;
-  client0.AcceptWithResponder(
-      &request, base::MakeUnique<MessageAccumulator>(&message_queue,
-                                                     run_loop2.QuitClosure()));
-  run_loop.Run();
-
-  // The request has been received but the response has not been sent yet.
-  EXPECT_TRUE(message_queue.IsEmpty());
-
-  // Send the response.
-  EXPECT_TRUE(generator.responder_is_valid());
-  generator.CompleteWithResponse();
-  run_loop2.Run();
-
-  // Check the response.
-  EXPECT_FALSE(message_queue.IsEmpty());
-  Message response;
-  message_queue.Pop(&response);
-  EXPECT_EQ(std::string("hello world!"),
-            std::string(reinterpret_cast<const char*>(response.payload())));
-
-  // Send a second message on the pipe.
-  base::RunLoop run_loop3;
-  generator.set_closure(run_loop3.QuitClosure());
-  Message request2;
-  AllocRequestMessage(1, "hello again", &request2);
-
-  base::RunLoop run_loop4;
-  client0.AcceptWithResponder(
-      &request2, base::MakeUnique<MessageAccumulator>(&message_queue,
-                                                      run_loop4.QuitClosure()));
-  run_loop3.Run();
-
-  // The request has been received but the response has not been sent yet.
-  EXPECT_TRUE(message_queue.IsEmpty());
-
-  // Send the second response.
-  EXPECT_TRUE(generator.responder_is_valid());
-  generator.CompleteWithResponse();
-  run_loop4.Run();
-
-  // Check the second response.
-  EXPECT_FALSE(message_queue.IsEmpty());
-  message_queue.Pop(&response);
-  EXPECT_EQ(std::string("hello again world!"),
-            std::string(reinterpret_cast<const char*>(response.payload())));
-}
-
-void ForwardErrorHandler(bool* called, const base::Closure& callback) {
-  *called = true;
-  callback.Run();
-}
-
-// Tests that if the receiving application destroys the responder_ without
-// sending a response, then we trigger connection error at both sides. Moreover,
-// both sides still appear to have a valid message pipe handle bound.
-TEST_F(MultiplexRouterTest, MissingResponses) {
-  base::RunLoop run_loop0, run_loop1;
-  InterfaceEndpointClient client0(
-      std::move(endpoint0_), nullptr, base::WrapUnique(new PassThroughFilter()),
-      false, base::ThreadTaskRunnerHandle::Get(), 0u);
-  bool error_handler_called0 = false;
-  client0.set_connection_error_handler(
-      base::Bind(&ForwardErrorHandler, &error_handler_called0,
-                 run_loop0.QuitClosure()));
-
-  base::RunLoop run_loop3;
-  LazyResponseGenerator generator(run_loop3.QuitClosure());
-  InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
-                                  base::WrapUnique(new PassThroughFilter()),
-                                  false, base::ThreadTaskRunnerHandle::Get(),
-                                  0u);
-  bool error_handler_called1 = false;
-  client1.set_connection_error_handler(
-      base::Bind(&ForwardErrorHandler, &error_handler_called1,
-                 run_loop1.QuitClosure()));
-
-  Message request;
-  AllocRequestMessage(1, "hello", &request);
-
-  MessageQueue message_queue;
-  client0.AcceptWithResponder(
-      &request, base::MakeUnique<MessageAccumulator>(&message_queue));
-  run_loop3.Run();
-
-  // The request has been received but no response has been sent.
-  EXPECT_TRUE(message_queue.IsEmpty());
-
-  // Destroy the responder MessagerReceiver but don't send any response.
-  generator.CompleteWithoutResponse();
-  run_loop0.Run();
-  run_loop1.Run();
-
-  // Check that no response was received.
-  EXPECT_TRUE(message_queue.IsEmpty());
-
-  // Connection error handler is called at both sides.
-  EXPECT_TRUE(error_handler_called0);
-  EXPECT_TRUE(error_handler_called1);
-
-  // The error flag is set at both sides.
-  EXPECT_TRUE(client0.encountered_error());
-  EXPECT_TRUE(client1.encountered_error());
-
-  // The message pipe handle is valid at both sides.
-  EXPECT_TRUE(router0_->is_valid());
-  EXPECT_TRUE(router1_->is_valid());
-}
-
-TEST_F(MultiplexRouterTest, LateResponse) {
-  // Test that things won't blow up if we try to send a message to a
-  // MessageReceiver, which was given to us via AcceptWithResponder,
-  // after the router has gone away.
-
-  base::RunLoop run_loop;
-  LazyResponseGenerator generator(run_loop.QuitClosure());
-  {
-    InterfaceEndpointClient client0(
-        std::move(endpoint0_), nullptr, base::MakeUnique<PassThroughFilter>(),
-        false, base::ThreadTaskRunnerHandle::Get(), 0u);
-    InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
-                                    base::MakeUnique<PassThroughFilter>(),
-                                    false, base::ThreadTaskRunnerHandle::Get(),
-                                    0u);
-
-    Message request;
-    AllocRequestMessage(1, "hello", &request);
-
-    MessageQueue message_queue;
-    client0.AcceptWithResponder(
-        &request, base::MakeUnique<MessageAccumulator>(&message_queue));
-
-    run_loop.Run();
-
-    EXPECT_TRUE(generator.has_responder());
-  }
-
-  EXPECT_FALSE(generator.responder_is_valid());
-  generator.CompleteWithResponse();  // This should end up doing nothing.
-}
-
-// TODO(yzshen): add more tests.
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/pickle_unittest.cc b/mojo/public/cpp/bindings/tests/pickle_unittest.cc
deleted file mode 100644
index a5947ce..0000000
--- a/mojo/public/cpp/bindings/tests/pickle_unittest.cc
+++ /dev/null
@@ -1,403 +0,0 @@
-// Copyright 2015 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 <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/tests/pickled_types_blink.h"
-#include "mojo/public/cpp/bindings/tests/pickled_types_chromium.h"
-#include "mojo/public/cpp/bindings/tests/variant_test_util.h"
-#include "mojo/public/interfaces/bindings/tests/test_native_types.mojom-blink.h"
-#include "mojo/public/interfaces/bindings/tests/test_native_types.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-template <typename T>
-void DoExpectResult(int foo, int bar, const base::Closure& callback, T actual) {
-  EXPECT_EQ(foo, actual.foo());
-  EXPECT_EQ(bar, actual.bar());
-  callback.Run();
-}
-
-template <typename T>
-base::Callback<void(T)> ExpectResult(const T& t,
-                                     const base::Closure& callback) {
-  return base::Bind(&DoExpectResult<T>, t.foo(), t.bar(), callback);
-}
-
-template <typename T>
-void DoFail(const std::string& reason, T) {
-  EXPECT_TRUE(false) << reason;
-}
-
-template <typename T>
-base::Callback<void(T)> Fail(const std::string& reason) {
-  return base::Bind(&DoFail<T>, reason);
-}
-
-template <typename T>
-void DoExpectEnumResult(T expected, const base::Closure& callback, T actual) {
-  EXPECT_EQ(expected, actual);
-  callback.Run();
-}
-
-template <typename T>
-base::Callback<void(T)> ExpectEnumResult(T t, const base::Closure& callback) {
-  return base::Bind(&DoExpectEnumResult<T>, t, callback);
-}
-
-template <typename T>
-void DoEnumFail(const std::string& reason, T) {
-  EXPECT_TRUE(false) << reason;
-}
-
-template <typename T>
-base::Callback<void(T)> EnumFail(const std::string& reason) {
-  return base::Bind(&DoEnumFail<T>, reason);
-}
-
-template <typename T>
-void ExpectError(InterfacePtr<T>* proxy, const base::Closure& callback) {
-  proxy->set_connection_error_handler(callback);
-}
-
-template <typename Func, typename Arg>
-void RunSimpleLambda(Func func, Arg arg) { func(std::move(arg)); }
-
-template <typename Arg, typename Func>
-base::Callback<void(Arg)> BindSimpleLambda(Func func) {
-  return base::Bind(&RunSimpleLambda<Func, Arg>, func);
-}
-
-// This implements the generated Chromium variant of PicklePasser.
-class ChromiumPicklePasserImpl : public PicklePasser {
- public:
-  ChromiumPicklePasserImpl() {}
-
-  // mojo::test::PicklePasser:
-  void PassPickledStruct(PickledStructChromium pickle,
-                         const PassPickledStructCallback& callback) override {
-    callback.Run(std::move(pickle));
-  }
-
-  void PassPickledEnum(PickledEnumChromium pickle,
-                       const PassPickledEnumCallback& callback) override {
-    callback.Run(pickle);
-  }
-
-  void PassPickleContainer(
-      PickleContainerPtr container,
-      const PassPickleContainerCallback& callback) override {
-    callback.Run(std::move(container));
-  }
-
-  void PassPickles(std::vector<PickledStructChromium> pickles,
-                   const PassPicklesCallback& callback) override {
-    callback.Run(std::move(pickles));
-  }
-
-  void PassPickleArrays(
-      std::vector<std::vector<PickledStructChromium>> pickle_arrays,
-      const PassPickleArraysCallback& callback) override {
-    callback.Run(std::move(pickle_arrays));
-  }
-};
-
-// This implements the generated Blink variant of PicklePasser.
-class BlinkPicklePasserImpl : public blink::PicklePasser {
- public:
-  BlinkPicklePasserImpl() {}
-
-  // mojo::test::blink::PicklePasser:
-  void PassPickledStruct(PickledStructBlink pickle,
-                         const PassPickledStructCallback& callback) override {
-    callback.Run(std::move(pickle));
-  }
-
-  void PassPickledEnum(PickledEnumBlink pickle,
-                       const PassPickledEnumCallback& callback) override {
-    callback.Run(pickle);
-  }
-
-  void PassPickleContainer(
-      blink::PickleContainerPtr container,
-      const PassPickleContainerCallback& callback) override {
-    callback.Run(std::move(container));
-  }
-
-  void PassPickles(WTF::Vector<PickledStructBlink> pickles,
-                   const PassPicklesCallback& callback) override {
-    callback.Run(std::move(pickles));
-  }
-
-  void PassPickleArrays(
-      WTF::Vector<WTF::Vector<PickledStructBlink>> pickle_arrays,
-      const PassPickleArraysCallback& callback) override {
-    callback.Run(std::move(pickle_arrays));
-  }
-};
-
-// A test which runs both Chromium and Blink implementations of the
-// PicklePasser service.
-class PickleTest : public testing::Test {
- public:
-  PickleTest() {}
-
-  template <typename ProxyType = PicklePasser>
-  InterfacePtr<ProxyType> ConnectToChromiumService() {
-    InterfacePtr<ProxyType> proxy;
-    InterfaceRequest<ProxyType> request(&proxy);
-    chromium_bindings_.AddBinding(
-        &chromium_service_,
-        ConvertInterfaceRequest<PicklePasser>(std::move(request)));
-    return proxy;
-  }
-
-  template <typename ProxyType = blink::PicklePasser>
-  InterfacePtr<ProxyType> ConnectToBlinkService() {
-    InterfacePtr<ProxyType> proxy;
-    InterfaceRequest<ProxyType> request(&proxy);
-    blink_bindings_.AddBinding(
-        &blink_service_,
-        ConvertInterfaceRequest<blink::PicklePasser>(std::move(request)));
-    return proxy;
-  }
-
- private:
-  base::MessageLoop loop_;
-  ChromiumPicklePasserImpl chromium_service_;
-  BindingSet<PicklePasser> chromium_bindings_;
-  BlinkPicklePasserImpl blink_service_;
-  BindingSet<blink::PicklePasser> blink_bindings_;
-};
-
-}  // namespace
-
-TEST_F(PickleTest, ChromiumProxyToChromiumService) {
-  auto chromium_proxy = ConnectToChromiumService();
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledStruct(
-        PickledStructChromium(1, 2),
-        ExpectResult(PickledStructChromium(1, 2), loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledStruct(
-        PickledStructChromium(4, 5),
-        ExpectResult(PickledStructChromium(4, 5), loop.QuitClosure()));
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledEnum(
-        PickledEnumChromium::VALUE_1,
-        ExpectEnumResult(PickledEnumChromium::VALUE_1, loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(PickleTest, ChromiumProxyToBlinkService) {
-  auto chromium_proxy = ConnectToBlinkService<PicklePasser>();
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledStruct(
-        PickledStructChromium(1, 2),
-        ExpectResult(PickledStructChromium(1, 2), loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledStruct(
-        PickledStructChromium(4, 5),
-        ExpectResult(PickledStructChromium(4, 5), loop.QuitClosure()));
-    loop.Run();
-  }
-  // The Blink service should drop our connection because the
-  // PickledStructBlink ParamTraits deserializer rejects negative values.
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledStruct(
-        PickledStructChromium(-1, -1),
-        Fail<PickledStructChromium>("Blink service should reject this."));
-    ExpectError(&chromium_proxy, loop.QuitClosure());
-    loop.Run();
-  }
-
-  chromium_proxy = ConnectToBlinkService<PicklePasser>();
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledEnum(
-        PickledEnumChromium::VALUE_0,
-        ExpectEnumResult(PickledEnumChromium::VALUE_0, loop.QuitClosure()));
-    loop.Run();
-  }
-
-  // The Blink service should drop our connection because the
-  // PickledEnumBlink ParamTraits deserializer rejects this value.
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledEnum(
-        PickledEnumChromium::VALUE_2,
-        EnumFail<PickledEnumChromium>("Blink service should reject this."));
-    ExpectError(&chromium_proxy, loop.QuitClosure());
-    loop.Run();
-  }
-}
-
-TEST_F(PickleTest, BlinkProxyToBlinkService) {
-  auto blink_proxy = ConnectToBlinkService();
-  {
-    base::RunLoop loop;
-    blink_proxy->PassPickledStruct(
-        PickledStructBlink(1, 1),
-        ExpectResult(PickledStructBlink(1, 1), loop.QuitClosure()));
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    blink_proxy->PassPickledEnum(
-        PickledEnumBlink::VALUE_0,
-        ExpectEnumResult(PickledEnumBlink::VALUE_0, loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(PickleTest, BlinkProxyToChromiumService) {
-  auto blink_proxy = ConnectToChromiumService<blink::PicklePasser>();
-  {
-    base::RunLoop loop;
-    blink_proxy->PassPickledStruct(
-        PickledStructBlink(1, 1),
-        ExpectResult(PickledStructBlink(1, 1), loop.QuitClosure()));
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    blink_proxy->PassPickledEnum(
-        PickledEnumBlink::VALUE_1,
-        ExpectEnumResult(PickledEnumBlink::VALUE_1, loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(PickleTest, PickleArray) {
-  auto proxy = ConnectToChromiumService();
-  auto pickles = std::vector<PickledStructChromium>(2);
-  pickles[0].set_foo(1);
-  pickles[0].set_bar(2);
-  pickles[0].set_baz(100);
-  pickles[1].set_foo(3);
-  pickles[1].set_bar(4);
-  pickles[1].set_baz(100);
-  {
-    base::RunLoop run_loop;
-    // Verify that the array of pickled structs can be serialized and
-    // deserialized intact. This ensures that the ParamTraits are actually used
-    // rather than doing a byte-for-byte copy of the element data, beacuse the
-    // |baz| field should never be serialized.
-    proxy->PassPickles(std::move(pickles),
-                       BindSimpleLambda<std::vector<PickledStructChromium>>(
-                           [&](std::vector<PickledStructChromium> passed) {
-                             ASSERT_EQ(2u, passed.size());
-                             EXPECT_EQ(1, passed[0].foo());
-                             EXPECT_EQ(2, passed[0].bar());
-                             EXPECT_EQ(0, passed[0].baz());
-                             EXPECT_EQ(3, passed[1].foo());
-                             EXPECT_EQ(4, passed[1].bar());
-                             EXPECT_EQ(0, passed[1].baz());
-                             run_loop.Quit();
-                           }));
-    run_loop.Run();
-  }
-}
-
-TEST_F(PickleTest, PickleArrayArray) {
-  auto proxy = ConnectToChromiumService();
-  auto pickle_arrays = std::vector<std::vector<PickledStructChromium>>(2);
-  for (size_t i = 0; i < 2; ++i)
-    pickle_arrays[i] = std::vector<PickledStructChromium>(2);
-
-  pickle_arrays[0][0].set_foo(1);
-  pickle_arrays[0][0].set_bar(2);
-  pickle_arrays[0][0].set_baz(100);
-  pickle_arrays[0][1].set_foo(3);
-  pickle_arrays[0][1].set_bar(4);
-  pickle_arrays[0][1].set_baz(100);
-  pickle_arrays[1][0].set_foo(5);
-  pickle_arrays[1][0].set_bar(6);
-  pickle_arrays[1][0].set_baz(100);
-  pickle_arrays[1][1].set_foo(7);
-  pickle_arrays[1][1].set_bar(8);
-  pickle_arrays[1][1].set_baz(100);
-  {
-    base::RunLoop run_loop;
-    // Verify that the array-of-arrays serializes and deserializes properly.
-    proxy->PassPickleArrays(
-        std::move(pickle_arrays),
-        BindSimpleLambda<std::vector<std::vector<PickledStructChromium>>>(
-            [&](std::vector<std::vector<PickledStructChromium>> passed) {
-              ASSERT_EQ(2u, passed.size());
-              ASSERT_EQ(2u, passed[0].size());
-              ASSERT_EQ(2u, passed[1].size());
-              EXPECT_EQ(1, passed[0][0].foo());
-              EXPECT_EQ(2, passed[0][0].bar());
-              EXPECT_EQ(0, passed[0][0].baz());
-              EXPECT_EQ(3, passed[0][1].foo());
-              EXPECT_EQ(4, passed[0][1].bar());
-              EXPECT_EQ(0, passed[0][1].baz());
-              EXPECT_EQ(5, passed[1][0].foo());
-              EXPECT_EQ(6, passed[1][0].bar());
-              EXPECT_EQ(0, passed[1][0].baz());
-              EXPECT_EQ(7, passed[1][1].foo());
-              EXPECT_EQ(8, passed[1][1].bar());
-              EXPECT_EQ(0, passed[1][1].baz());
-              run_loop.Quit();
-            }));
-    run_loop.Run();
-  }
-}
-
-TEST_F(PickleTest, PickleContainer) {
-  auto proxy = ConnectToChromiumService();
-  PickleContainerPtr pickle_container = PickleContainer::New();
-  pickle_container->f_struct.set_foo(42);
-  pickle_container->f_struct.set_bar(43);
-  pickle_container->f_struct.set_baz(44);
-  pickle_container->f_enum = PickledEnumChromium::VALUE_1;
-  EXPECT_TRUE(pickle_container.Equals(pickle_container));
-  EXPECT_FALSE(pickle_container.Equals(PickleContainer::New()));
-  {
-    base::RunLoop run_loop;
-    proxy->PassPickleContainer(std::move(pickle_container),
-                               BindSimpleLambda<PickleContainerPtr>(
-                                   [&](PickleContainerPtr passed) {
-                                     ASSERT_FALSE(passed.is_null());
-                                     EXPECT_EQ(42, passed->f_struct.foo());
-                                     EXPECT_EQ(43, passed->f_struct.bar());
-                                     EXPECT_EQ(0, passed->f_struct.baz());
-                                     EXPECT_EQ(PickledEnumChromium::VALUE_1,
-                                               passed->f_enum);
-                                     run_loop.Quit();
-                                   }));
-    run_loop.Run();
-  }
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/pickled_types_blink.cc b/mojo/public/cpp/bindings/tests/pickled_types_blink.cc
deleted file mode 100644
index 7e55650..0000000
--- a/mojo/public/cpp/bindings/tests/pickled_types_blink.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/tests/pickled_types_blink.h"
-
-#include "base/logging.h"
-#include "base/pickle.h"
-
-namespace mojo {
-namespace test {
-
-PickledStructBlink::PickledStructBlink() {}
-
-PickledStructBlink::PickledStructBlink(int foo, int bar)
-    : foo_(foo), bar_(bar) {
-  DCHECK_GE(foo_, 0);
-  DCHECK_GE(bar_, 0);
-}
-
-PickledStructBlink::~PickledStructBlink() {}
-
-}  // namespace test
-}  // namespace mojo
-
-namespace IPC {
-
-void ParamTraits<mojo::test::PickledStructBlink>::GetSize(
-    base::PickleSizer* sizer,
-    const param_type& p) {
-  sizer->AddInt();
-  sizer->AddInt();
-}
-
-void ParamTraits<mojo::test::PickledStructBlink>::Write(base::Pickle* m,
-                                                        const param_type& p) {
-  m->WriteInt(p.foo());
-  m->WriteInt(p.bar());
-}
-
-bool ParamTraits<mojo::test::PickledStructBlink>::Read(
-    const base::Pickle* m,
-    base::PickleIterator* iter,
-    param_type* p) {
-  int foo, bar;
-  if (!iter->ReadInt(&foo) || !iter->ReadInt(&bar) || foo < 0 || bar < 0)
-    return false;
-
-  p->set_foo(foo);
-  p->set_bar(bar);
-  return true;
-}
-
-#include "ipc/param_traits_size_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumBlink,
-                          mojo::test::PickledEnumBlink::VALUE_1)
-#include "ipc/param_traits_write_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumBlink,
-                          mojo::test::PickledEnumBlink::VALUE_1)
-#include "ipc/param_traits_read_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumBlink,
-                          mojo::test::PickledEnumBlink::VALUE_1)
-#include "ipc/param_traits_log_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumBlink,
-                          mojo::test::PickledEnumBlink::VALUE_1)
-
-}  // namespace IPC
diff --git a/mojo/public/cpp/bindings/tests/pickled_types_blink.h b/mojo/public/cpp/bindings/tests/pickled_types_blink.h
deleted file mode 100644
index 37e9e70..0000000
--- a/mojo/public/cpp/bindings/tests/pickled_types_blink.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_PICKLED_TYPES_BLINK_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_PICKLED_TYPES_BLINK_H_
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "ipc/ipc_message_macros.h"
-#include "ipc/ipc_param_traits.h"
-
-namespace base {
-class Pickle;
-class PickleIterator;
-class PickleSizer;
-}
-
-namespace mojo {
-namespace test {
-
-// Implementation of types with IPC::ParamTraits for consumers in Blink.
-
-enum class PickledEnumBlink { VALUE_0, VALUE_1 };
-
-// To make things slightly more interesting, this variation of the type doesn't
-// support negative values. It'll DCHECK if you try to construct it with any,
-// and it will fail deserialization if negative values are decoded.
-class PickledStructBlink {
- public:
-  PickledStructBlink();
-  PickledStructBlink(int foo, int bar);
-  PickledStructBlink(PickledStructBlink&& other) = default;
-  ~PickledStructBlink();
-
-  PickledStructBlink& operator=(PickledStructBlink&& other) = default;
-
-  int foo() const { return foo_; }
-  void set_foo(int foo) {
-    DCHECK_GE(foo, 0);
-    foo_ = foo;
-  }
-
-  int bar() const { return bar_; }
-  void set_bar(int bar) {
-    DCHECK_GE(bar, 0);
-    bar_ = bar;
-  }
-
-  // The |baz| field should never be serialized.
-  int baz() const { return baz_; }
-  void set_baz(int baz) { baz_ = baz; }
-
- private:
-  int foo_ = 0;
-  int bar_ = 0;
-  int baz_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(PickledStructBlink);
-};
-
-}  // namespace test
-}  // namespace mojo
-
-namespace IPC {
-
-template <>
-struct ParamTraits<mojo::test::PickledStructBlink> {
-  using param_type = mojo::test::PickledStructBlink;
-
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l) {}
-};
-
-}  // namespace IPC
-
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumBlink,
-                          mojo::test::PickledEnumBlink::VALUE_1)
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_PICKLED_TYPES_BLINK_H_
diff --git a/mojo/public/cpp/bindings/tests/pickled_types_chromium.cc b/mojo/public/cpp/bindings/tests/pickled_types_chromium.cc
deleted file mode 100644
index 9957c9a..0000000
--- a/mojo/public/cpp/bindings/tests/pickled_types_chromium.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/tests/pickled_types_chromium.h"
-
-#include "base/pickle.h"
-
-namespace mojo {
-namespace test {
-
-PickledStructChromium::PickledStructChromium() {}
-
-PickledStructChromium::PickledStructChromium(int foo, int bar)
-    : foo_(foo), bar_(bar) {}
-
-PickledStructChromium::~PickledStructChromium() {}
-
-bool operator==(const PickledStructChromium& a,
-                const PickledStructChromium& b) {
-  return a.foo() == b.foo() && a.bar() == b.bar() && a.baz() == b.baz();
-}
-
-}  // namespace test
-}  // namespace mojo
-
-namespace IPC {
-
-void ParamTraits<mojo::test::PickledStructChromium>::GetSize(
-    base::PickleSizer* sizer,
-    const param_type& p) {
-  sizer->AddInt();
-  sizer->AddInt();
-}
-
-void ParamTraits<mojo::test::PickledStructChromium>::Write(
-    base::Pickle* m,
-    const param_type& p) {
-  m->WriteInt(p.foo());
-  m->WriteInt(p.bar());
-}
-
-bool ParamTraits<mojo::test::PickledStructChromium>::Read(
-    const base::Pickle* m,
-    base::PickleIterator* iter,
-    param_type* p) {
-  int foo, bar;
-  if (!iter->ReadInt(&foo) || !iter->ReadInt(&bar))
-    return false;
-
-  p->set_foo(foo);
-  p->set_bar(bar);
-  return true;
-}
-
-#include "ipc/param_traits_size_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumChromium,
-                          mojo::test::PickledEnumChromium::VALUE_2)
-#include "ipc/param_traits_write_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumChromium,
-                          mojo::test::PickledEnumChromium::VALUE_2)
-#include "ipc/param_traits_read_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumChromium,
-                          mojo::test::PickledEnumChromium::VALUE_2)
-#include "ipc/param_traits_log_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumChromium,
-                          mojo::test::PickledEnumChromium::VALUE_2)
-
-}  // namespace IPC
diff --git a/mojo/public/cpp/bindings/tests/pickled_types_chromium.h b/mojo/public/cpp/bindings/tests/pickled_types_chromium.h
deleted file mode 100644
index d9287b6..0000000
--- a/mojo/public/cpp/bindings/tests/pickled_types_chromium.h
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_PICKLED_TYPES_CHROMIUM_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_PICKLED_TYPES_CHROMIUM_H_
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/macros.h"
-#include "ipc/ipc_message_macros.h"
-#include "ipc/ipc_param_traits.h"
-
-namespace base {
-class Pickle;
-class PickleIterator;
-class PickleSizer;
-}
-
-namespace mojo {
-namespace test {
-
-// Implementation of types with IPC::ParamTraits for consumers in the greater
-// Chromium tree.
-
-enum class PickledEnumChromium { VALUE_0, VALUE_1, VALUE_2 };
-
-class PickledStructChromium {
- public:
-  PickledStructChromium();
-  PickledStructChromium(int foo, int bar);
-  PickledStructChromium(PickledStructChromium&& other) = default;
-  ~PickledStructChromium();
-
-  PickledStructChromium& operator=(PickledStructChromium&& other) = default;
-
-  int foo() const { return foo_; }
-  void set_foo(int foo) { foo_ = foo; }
-
-  int bar() const { return bar_; }
-  void set_bar(int bar) { bar_ = bar; }
-
-  // The |baz| field should never be serialized.
-  int baz() const { return baz_; }
-  void set_baz(int baz) { baz_ = baz; }
-
- private:
-  int foo_ = 0;
-  int bar_ = 0;
-  int baz_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(PickledStructChromium);
-};
-
-bool operator==(const PickledStructChromium& a, const PickledStructChromium& b);
-
-}  // namespace test
-}  // namespace mojo
-
-namespace IPC {
-
-template <>
-struct ParamTraits<mojo::test::PickledStructChromium> {
-  using param_type = mojo::test::PickledStructChromium;
-
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l) {}
-};
-
-}  // namespace IPC
-
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumChromium,
-                          mojo::test::PickledEnumChromium::VALUE_2)
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_PICKLED_TYPES_CHROMIUM_H_
diff --git a/mojo/public/cpp/bindings/tests/rect_blink.h b/mojo/public/cpp/bindings/tests/rect_blink.h
deleted file mode 100644
index 7335989..0000000
--- a/mojo/public/cpp/bindings/tests/rect_blink.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_H_
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace test {
-
-// An implementation of a hypothetical Rect type specifically for consumers in
-// in Blink. Unlike the Chromium variant (see rect_chromium.h) this does not
-// support negative origin coordinates and is not copyable.
-class RectBlink {
- public:
-  RectBlink() {}
-  RectBlink(int x, int y, int width, int height) :
-      x_(x), y_(y), width_(width), height_(height) {
-    DCHECK_GE(x_, 0);
-    DCHECK_GE(y_, 0);
-    DCHECK_GE(width_, 0);
-    DCHECK_GE(height_, 0);
-  }
-  ~RectBlink() {}
-
-  int x() const { return x_; }
-  void setX(int x) {
-    DCHECK_GE(x, 0);
-    x_ = x;
-  }
-
-  int y() const { return y_; }
-  void setY(int y) {
-    DCHECK_GE(y, 0);
-    y_ = y;
-  }
-
-  int width() const { return width_; }
-  void setWidth(int width) {
-    DCHECK_GE(width, 0);
-    width_ = width;
-  }
-
-  int height() const { return height_; }
-  void setHeight(int height) {
-    DCHECK_GE(height, 0);
-    height_ = height;
-  }
-
-  int computeArea() const { return width_ * height_; }
-
-  bool operator==(const RectBlink& other) const {
-    return (x() == other.x() && y() == other.y() && width() == other.width() &&
-            height() == other.height());
-  }
-  bool operator!=(const RectBlink& other) const { return !(*this == other); }
-
- private:
-  int x_ = 0;
-  int y_ = 0;
-  int width_ = 0;
-  int height_ = 0;
-};
-
-}  // namespace test
-}  // namespace mojo
-
-namespace std {
-
-template <>
-struct hash<mojo::test::RectBlink> {
-  size_t operator()(const mojo::test::RectBlink& value) {
-    // Terrible hash function:
-    return (std::hash<int>()(value.x()) ^ std::hash<int>()(value.y()) ^
-            std::hash<int>()(value.width()) ^ std::hash<int>()(value.height()));
-  }
-};
-
-}  // namespace std
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_H_
diff --git a/mojo/public/cpp/bindings/tests/rect_blink.typemap b/mojo/public/cpp/bindings/tests/rect_blink.typemap
deleted file mode 100644
index 657ea1a..0000000
--- a/mojo/public/cpp/bindings/tests/rect_blink.typemap
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/public/interfaces/bindings/tests/rect.mojom"
-public_headers = [
-  "//mojo/public/cpp/bindings/tests/rect_blink.h",
-  "//mojo/public/cpp/bindings/tests/shared_rect.h",
-]
-traits_headers = [
-  "//mojo/public/cpp/bindings/tests/rect_blink_traits.h",
-  "//mojo/public/cpp/bindings/tests/shared_rect_traits.h",
-]
-
-type_mappings = [
-  "mojo.test.TypemappedRect=mojo::test::RectBlink[hashable]",
-  "mojo.test.SharedTypemappedRect=mojo::test::SharedRect",
-]
diff --git a/mojo/public/cpp/bindings/tests/rect_blink_traits.h b/mojo/public/cpp/bindings/tests/rect_blink_traits.h
deleted file mode 100644
index 7258739..0000000
--- a/mojo/public/cpp/bindings/tests/rect_blink_traits.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_TRAITS_H_
-
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/tests/rect_blink.h"
-#include "mojo/public/interfaces/bindings/tests/rect.mojom-blink.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<test::TypemappedRectDataView, test::RectBlink> {
-  static int x(const test::RectBlink& r) { return r.x(); }
-  static int y(const test::RectBlink& r) { return r.y(); }
-  static int width(const test::RectBlink& r) { return r.width(); }
-  static int height(const test::RectBlink& r) { return r.height(); }
-
-  static bool Read(test::TypemappedRectDataView r, test::RectBlink* out) {
-    if (r.x() < 0 || r.y() < 0 || r.width() < 0 || r.height() < 0) {
-      return false;
-    }
-    out->setX(r.x());
-    out->setY(r.y());
-    out->setWidth(r.width());
-    out->setHeight(r.height());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/tests/rect_chromium.h b/mojo/public/cpp/bindings/tests/rect_chromium.h
deleted file mode 100644
index d2e0a3e..0000000
--- a/mojo/public/cpp/bindings/tests/rect_chromium.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_H_
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace test {
-
-// An implementation of a hypothetical Rect type specifically for consumers in
-// in Chromium.
-class RectChromium {
- public:
-  RectChromium() {}
-  RectChromium(const RectChromium& other)
-      : x_(other.x_),
-        y_(other.y_),
-        width_(other.width_),
-        height_(other.height_) {}
-  RectChromium(int x, int y, int width, int height) :
-      x_(x), y_(y), width_(width), height_(height) {
-    DCHECK_GE(width_, 0);
-    DCHECK_GE(height_, 0);
-  }
-  ~RectChromium() {}
-
-  RectChromium& operator=(const RectChromium& other) {
-    x_ = other.x_;
-    y_ = other.y_;
-    width_ = other.width_;
-    height_ = other.height_;
-    return *this;
-  }
-
-  int x() const { return x_; }
-  void set_x(int x) { x_ = x; }
-
-  int y() const { return y_; }
-  void set_y(int y) { y_ = y; }
-
-  int width() const { return width_; }
-  void set_width(int width) {
-    DCHECK_GE(width, 0);
-    width_ = width;
-  }
-
-  int height() const { return height_; }
-  void set_height(int height) {
-    DCHECK_GE(height, 0);
-    height_ = height;
-  }
-
-  int GetArea() const { return width_ * height_; }
-
-  bool operator==(const RectChromium& other) const {
-    return (x() == other.x() && y() == other.y() && width() == other.width() &&
-            height() == other.height());
-  }
-  bool operator!=(const RectChromium& other) const { return !(*this == other); }
-
- private:
-  int x_ = 0;
-  int y_ = 0;
-  int width_ = 0;
-  int height_ = 0;
-};
-
-}  // namespace test
-}  // namespace mojo
-
-namespace std {
-
-template <>
-struct hash<mojo::test::RectChromium> {
-  size_t operator()(const mojo::test::RectChromium& value) {
-    // Terrible hash function:
-    return (std::hash<int>()(value.x()) ^ std::hash<int>()(value.y()) ^
-            std::hash<int>()(value.width()) ^ std::hash<int>()(value.height()));
-  }
-};
-
-}  // namespace std
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_H_
diff --git a/mojo/public/cpp/bindings/tests/rect_chromium.typemap b/mojo/public/cpp/bindings/tests/rect_chromium.typemap
deleted file mode 100644
index 7e5df84..0000000
--- a/mojo/public/cpp/bindings/tests/rect_chromium.typemap
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/public/interfaces/bindings/tests/rect.mojom"
-public_headers = [
-  "//mojo/public/cpp/bindings/tests/rect_chromium.h",
-  "//mojo/public/cpp/bindings/tests/shared_rect.h",
-]
-traits_headers = [
-  "//mojo/public/cpp/bindings/tests/rect_chromium_traits.h",
-  "//mojo/public/cpp/bindings/tests/shared_rect_traits.h",
-]
-
-type_mappings = [
-  "mojo.test.TypemappedRect=mojo::test::RectChromium[hashable]",
-  "mojo.test.SharedTypemappedRect=mojo::test::SharedRect",
-]
diff --git a/mojo/public/cpp/bindings/tests/rect_chromium_traits.h b/mojo/public/cpp/bindings/tests/rect_chromium_traits.h
deleted file mode 100644
index b446d7d..0000000
--- a/mojo/public/cpp/bindings/tests/rect_chromium_traits.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_TRAITS_H_
-
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/tests/rect_chromium.h"
-#include "mojo/public/interfaces/bindings/tests/rect.mojom.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<test::TypemappedRectDataView, test::RectChromium> {
-  static int x(const test::RectChromium& r) { return r.x(); }
-  static int y(const test::RectChromium& r) { return r.y(); }
-  static int width(const test::RectChromium& r) { return r.width(); }
-  static int height(const test::RectChromium& r) { return r.height(); }
-
-  static bool Read(test::TypemappedRectDataView r, test::RectChromium* out) {
-    if (r.width() < 0 || r.height() < 0)
-      return false;
-    out->set_x(r.x());
-    out->set_y(r.y());
-    out->set_width(r.width());
-    out->set_height(r.height());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc b/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc
deleted file mode 100644
index 1bf3f7a..0000000
--- a/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/interfaces/bindings/tests/test_bad_messages.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class TestBadMessagesImpl : public TestBadMessages {
- public:
-  TestBadMessagesImpl() : binding_(this) {}
-  ~TestBadMessagesImpl() override {}
-
-  void BindImpl(TestBadMessagesRequest request) {
-    binding_.Bind(std::move(request));
-  }
-
-  const ReportBadMessageCallback& bad_message_callback() {
-    return bad_message_callback_;
-  }
-
- private:
-  // TestBadMessages:
-  void RejectEventually(const RejectEventuallyCallback& callback) override {
-    bad_message_callback_ = GetBadMessageCallback();
-    callback.Run();
-  }
-
-  void RequestResponse(const RequestResponseCallback& callback) override {
-    callback.Run();
-  }
-
-  void RejectSync(const RejectSyncCallback& callback) override {
-    callback.Run();
-    ReportBadMessage("go away");
-  }
-
-  void RequestResponseSync(
-      const RequestResponseSyncCallback& callback) override {
-    callback.Run();
-  }
-
-  ReportBadMessageCallback bad_message_callback_;
-  mojo::Binding<TestBadMessages> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestBadMessagesImpl);
-};
-
-class ReportBadMessageTest : public testing::Test {
- public:
-  ReportBadMessageTest() {}
-
-  void SetUp() override {
-    mojo::edk::SetDefaultProcessErrorCallback(
-        base::Bind(&ReportBadMessageTest::OnProcessError,
-                   base::Unretained(this)));
-
-    impl_.BindImpl(MakeRequest(&proxy_));
-  }
-
-  void TearDown() override {
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
-  }
-
-  TestBadMessages* proxy() { return proxy_.get(); }
-
-  TestBadMessagesImpl* impl() { return &impl_; }
-
-  void SetErrorHandler(const base::Closure& handler) {
-    error_handler_ = handler;
-  }
-
- private:
-  void OnProcessError(const std::string& error) {
-    if (!error_handler_.is_null())
-      error_handler_.Run();
-  }
-
-  TestBadMessagesPtr proxy_;
-  TestBadMessagesImpl impl_;
-  base::Closure error_handler_;
-  base::MessageLoop message_loop;
-};
-
-TEST_F(ReportBadMessageTest, Request) {
-  // Verify that basic immediate error reporting works.
-  bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-  EXPECT_TRUE(proxy()->RejectSync());
-  EXPECT_TRUE(error);
-}
-
-TEST_F(ReportBadMessageTest, RequestAsync) {
-  bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-
-  // This should capture a bad message reporting callback in the impl.
-  base::RunLoop loop;
-  proxy()->RejectEventually(loop.QuitClosure());
-  loop.Run();
-
-  EXPECT_FALSE(error);
-
-  // Now we can run the callback and it should trigger a bad message report.
-  DCHECK(!impl()->bad_message_callback().is_null());
-  impl()->bad_message_callback().Run("bad!");
-  EXPECT_TRUE(error);
-}
-
-TEST_F(ReportBadMessageTest, Response) {
-  bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-
-  base::RunLoop loop;
-  proxy()->RequestResponse(
-      base::Bind([] (const base::Closure& quit) {
-        // Report a bad message inside the response callback. This should
-        // trigger the error handler.
-        ReportBadMessage("no way!");
-        quit.Run();
-      },
-      loop.QuitClosure()));
-  loop.Run();
-
-  EXPECT_TRUE(error);
-}
-
-TEST_F(ReportBadMessageTest, ResponseAsync) {
-  bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-
-  ReportBadMessageCallback bad_message_callback;
-  base::RunLoop loop;
-  proxy()->RequestResponse(
-      base::Bind([] (const base::Closure& quit,
-                     ReportBadMessageCallback* callback) {
-        // Capture the bad message callback inside the response callback.
-        *callback = GetBadMessageCallback();
-        quit.Run();
-      },
-      loop.QuitClosure(), &bad_message_callback));
-  loop.Run();
-
-  EXPECT_FALSE(error);
-
-  // Invoking this callback should report a bad message and trigger the error
-  // handler immediately.
-  bad_message_callback.Run("this message is bad and should feel bad");
-  EXPECT_TRUE(error);
-}
-
-TEST_F(ReportBadMessageTest, ResponseSync) {
-  bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-
-  SyncMessageResponseContext context;
-  proxy()->RequestResponseSync();
-
-  EXPECT_FALSE(error);
-  context.ReportBadMessage("i don't like this response");
-  EXPECT_TRUE(error);
-}
-
-TEST_F(ReportBadMessageTest, ResponseSyncDeferred) {
-  bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-
-  ReportBadMessageCallback bad_message_callback;
-  {
-    SyncMessageResponseContext context;
-    proxy()->RequestResponseSync();
-    bad_message_callback = context.GetBadMessageCallback();
-  }
-
-  EXPECT_FALSE(error);
-  bad_message_callback.Run("nope nope nope");
-  EXPECT_TRUE(error);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/request_response_unittest.cc b/mojo/public/cpp/bindings/tests/request_response_unittest.cc
deleted file mode 100644
index 43b8f0d..0000000
--- a/mojo/public/cpp/bindings/tests/request_response_unittest.cc
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/test_support/test_utils.h"
-#include "mojo/public/interfaces/bindings/tests/sample_import.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class ProviderImpl : public sample::Provider {
- public:
-  explicit ProviderImpl(InterfaceRequest<sample::Provider> request)
-      : binding_(this, std::move(request)) {}
-
-  void EchoString(const std::string& a,
-                  const EchoStringCallback& callback) override {
-    EchoStringCallback callback_copy;
-    // Make sure operator= is used.
-    callback_copy = callback;
-    callback_copy.Run(a);
-  }
-
-  void EchoStrings(const std::string& a,
-                   const std::string& b,
-                   const EchoStringsCallback& callback) override {
-    callback.Run(a, b);
-  }
-
-  void EchoMessagePipeHandle(
-      ScopedMessagePipeHandle a,
-      const EchoMessagePipeHandleCallback& callback) override {
-    callback.Run(std::move(a));
-  }
-
-  void EchoEnum(sample::Enum a, const EchoEnumCallback& callback) override {
-    callback.Run(a);
-  }
-
-  void EchoInt(int32_t a, const EchoIntCallback& callback) override {
-    callback.Run(a);
-  }
-
-  Binding<sample::Provider> binding_;
-};
-
-void RecordString(std::string* storage,
-                  const base::Closure& closure,
-                  const std::string& str) {
-  *storage = str;
-  closure.Run();
-}
-
-void RecordStrings(std::string* storage,
-                   const base::Closure& closure,
-                   const std::string& a,
-                   const std::string& b) {
-  *storage = a + b;
-  closure.Run();
-}
-
-void WriteToMessagePipe(const char* text,
-                        const base::Closure& closure,
-                        ScopedMessagePipeHandle handle) {
-  WriteTextMessage(handle.get(), text);
-  closure.Run();
-}
-
-void RecordEnum(sample::Enum* storage,
-                const base::Closure& closure,
-                sample::Enum value) {
-  *storage = value;
-  closure.Run();
-}
-
-class RequestResponseTest : public testing::Test {
- public:
-  RequestResponseTest() {}
-  ~RequestResponseTest() override { base::RunLoop().RunUntilIdle(); }
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
- private:
-  base::MessageLoop loop_;
-};
-
-TEST_F(RequestResponseTest, EchoString) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(MakeRequest(&provider));
-
-  std::string buf;
-  base::RunLoop run_loop;
-  provider->EchoString("hello",
-                       base::Bind(&RecordString, &buf, run_loop.QuitClosure()));
-
-  run_loop.Run();
-
-  EXPECT_EQ(std::string("hello"), buf);
-}
-
-TEST_F(RequestResponseTest, EchoStrings) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(MakeRequest(&provider));
-
-  std::string buf;
-  base::RunLoop run_loop;
-  provider->EchoStrings("hello", " world", base::Bind(&RecordStrings, &buf,
-                                                      run_loop.QuitClosure()));
-
-  run_loop.Run();
-
-  EXPECT_EQ(std::string("hello world"), buf);
-}
-
-TEST_F(RequestResponseTest, EchoMessagePipeHandle) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(MakeRequest(&provider));
-
-  MessagePipe pipe2;
-  base::RunLoop run_loop;
-  provider->EchoMessagePipeHandle(
-      std::move(pipe2.handle1),
-      base::Bind(&WriteToMessagePipe, "hello", run_loop.QuitClosure()));
-
-  run_loop.Run();
-
-  std::string value;
-  ReadTextMessage(pipe2.handle0.get(), &value);
-
-  EXPECT_EQ(std::string("hello"), value);
-}
-
-TEST_F(RequestResponseTest, EchoEnum) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(MakeRequest(&provider));
-
-  sample::Enum value;
-  base::RunLoop run_loop;
-  provider->EchoEnum(sample::Enum::VALUE,
-                     base::Bind(&RecordEnum, &value, run_loop.QuitClosure()));
-  run_loop.Run();
-
-  EXPECT_EQ(sample::Enum::VALUE, value);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/router_test_util.cc b/mojo/public/cpp/bindings/tests/router_test_util.cc
deleted file mode 100644
index 9bab1cb..0000000
--- a/mojo/public/cpp/bindings/tests/router_test_util.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2015 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 "mojo/public/cpp/bindings/tests/router_test_util.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/tests/message_queue.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-
-void AllocRequestMessage(uint32_t name, const char* text, Message* message) {
-  size_t payload_size = strlen(text) + 1;  // Plus null terminator.
-  internal::MessageBuilder builder(name, Message::kFlagExpectsResponse,
-                                   payload_size, 0);
-  memcpy(builder.buffer()->Allocate(payload_size), text, payload_size);
-  *message = std::move(*builder.message());
-}
-
-void AllocResponseMessage(uint32_t name,
-                          const char* text,
-                          uint64_t request_id,
-                          Message* message) {
-  size_t payload_size = strlen(text) + 1;  // Plus null terminator.
-  internal::MessageBuilder builder(name, Message::kFlagIsResponse, payload_size,
-                                   0);
-  builder.message()->set_request_id(request_id);
-  memcpy(builder.buffer()->Allocate(payload_size), text, payload_size);
-  *message = std::move(*builder.message());
-}
-
-MessageAccumulator::MessageAccumulator(MessageQueue* queue,
-                                       const base::Closure& closure)
-    : queue_(queue), closure_(closure) {}
-
-MessageAccumulator::~MessageAccumulator() {}
-
-bool MessageAccumulator::Accept(Message* message) {
-  queue_->Push(message);
-  if (!closure_.is_null()) {
-    closure_.Run();
-    closure_.Reset();
-  }
-  return true;
-}
-
-ResponseGenerator::ResponseGenerator() {}
-
-bool ResponseGenerator::Accept(Message* message) {
-  return false;
-}
-
-bool ResponseGenerator::AcceptWithResponder(
-    Message* message,
-    std::unique_ptr<MessageReceiverWithStatus> responder) {
-  EXPECT_TRUE(message->has_flag(Message::kFlagExpectsResponse));
-
-  bool result = SendResponse(message->name(), message->request_id(),
-                             reinterpret_cast<const char*>(message->payload()),
-                             responder.get());
-  EXPECT_TRUE(responder->IsValid());
-  return result;
-}
-
-bool ResponseGenerator::SendResponse(uint32_t name,
-                                     uint64_t request_id,
-                                     const char* request_string,
-                                     MessageReceiver* responder) {
-  Message response;
-  std::string response_string(request_string);
-  response_string += " world!";
-  AllocResponseMessage(name, response_string.c_str(), request_id, &response);
-
-  return responder->Accept(&response);
-}
-
-LazyResponseGenerator::LazyResponseGenerator(const base::Closure& closure)
-    : responder_(nullptr), name_(0), request_id_(0), closure_(closure) {}
-
-LazyResponseGenerator::~LazyResponseGenerator() = default;
-
-bool LazyResponseGenerator::AcceptWithResponder(
-    Message* message,
-    std::unique_ptr<MessageReceiverWithStatus> responder) {
-  name_ = message->name();
-  request_id_ = message->request_id();
-  request_string_ =
-      std::string(reinterpret_cast<const char*>(message->payload()));
-  responder_ = std::move(responder);
-  if (!closure_.is_null()) {
-    closure_.Run();
-    closure_.Reset();
-  }
-  return true;
-}
-
-void LazyResponseGenerator::Complete(bool send_response) {
-  if (send_response) {
-    SendResponse(name_, request_id_, request_string_.c_str(), responder_.get());
-  }
-  responder_ = nullptr;
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/router_test_util.h b/mojo/public/cpp/bindings/tests/router_test_util.h
deleted file mode 100644
index dd6aff6..0000000
--- a/mojo/public/cpp/bindings/tests/router_test_util.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2015 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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_ROUTER_TEST_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_ROUTER_TEST_UTIL_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "base/callback.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-namespace test {
-
-class MessageQueue;
-
-void AllocRequestMessage(uint32_t name, const char* text, Message* message);
-void AllocResponseMessage(uint32_t name,
-                          const char* text,
-                          uint64_t request_id,
-                          Message* message);
-
-class MessageAccumulator : public MessageReceiver {
- public:
-  MessageAccumulator(MessageQueue* queue,
-                     const base::Closure& closure = base::Closure());
-  ~MessageAccumulator() override;
-
-  bool Accept(Message* message) override;
-
- private:
-  MessageQueue* queue_;
-  base::Closure closure_;
-};
-
-class ResponseGenerator : public MessageReceiverWithResponderStatus {
- public:
-  ResponseGenerator();
-
-  bool Accept(Message* message) override;
-
-  bool AcceptWithResponder(
-      Message* message,
-      std::unique_ptr<MessageReceiverWithStatus> responder) override;
-  bool SendResponse(uint32_t name,
-                    uint64_t request_id,
-                    const char* request_string,
-                    MessageReceiver* responder);
-};
-
-class LazyResponseGenerator : public ResponseGenerator {
- public:
-  explicit LazyResponseGenerator(
-      const base::Closure& closure = base::Closure());
-
-  ~LazyResponseGenerator() override;
-
-  bool AcceptWithResponder(
-      Message* message,
-      std::unique_ptr<MessageReceiverWithStatus> responder) override;
-
-  bool has_responder() const { return !!responder_; }
-
-  bool responder_is_valid() const { return responder_->IsValid(); }
-
-  void set_closure(const base::Closure& closure) { closure_ = closure; }
-
-  // Sends the response and delete the responder.
-  void CompleteWithResponse() { Complete(true); }
-
-  // Deletes the responder without sending a response.
-  void CompleteWithoutResponse() { Complete(false); }
-
- private:
-  // Completes the request handling by deleting responder_. Optionally
-  // also sends a response.
-  void Complete(bool send_response);
-
-  std::unique_ptr<MessageReceiverWithStatus> responder_;
-  uint32_t name_;
-  uint64_t request_id_;
-  std::string request_string_;
-  base::Closure closure_;
-};
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_ROUTER_TEST_UTIL_H_
diff --git a/mojo/public/cpp/bindings/tests/sample_service_unittest.cc b/mojo/public/cpp/bindings/tests/sample_service_unittest.cc
deleted file mode 100644
index 1f95a27..0000000
--- a/mojo/public/cpp/bindings/tests/sample_service_unittest.cc
+++ /dev/null
@@ -1,362 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-#include <algorithm>
-#include <ostream>
-#include <string>
-#include <utility>
-
-#include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-
-template <>
-struct TypeConverter<int32_t, sample::BarPtr> {
-  static int32_t Convert(const sample::BarPtr& bar) {
-    return static_cast<int32_t>(bar->alpha) << 16 |
-           static_cast<int32_t>(bar->beta) << 8 |
-           static_cast<int32_t>(bar->gamma);
-  }
-};
-
-}  // namespace mojo
-
-namespace sample {
-namespace {
-
-// Set this variable to true to print the message in hex.
-bool g_dump_message_as_hex = false;
-
-// Set this variable to true to print the message in human readable form.
-bool g_dump_message_as_text = false;
-
-// Make a sample |Foo|.
-FooPtr MakeFoo() {
-  std::string name("foopy");
-
-  BarPtr bar(Bar::New(20, 40, 60, Bar::Type::VERTICAL));
-
-  std::vector<BarPtr> extra_bars(3);
-  for (size_t i = 0; i < extra_bars.size(); ++i) {
-    Bar::Type type = i % 2 == 0 ? Bar::Type::VERTICAL : Bar::Type::HORIZONTAL;
-    uint8_t base = static_cast<uint8_t>(i * 100);
-    extra_bars[i] = Bar::New(base, base + 20, base + 40, type);
-  }
-
-  std::vector<uint8_t> data(10);
-  for (size_t i = 0; i < data.size(); ++i)
-    data[i] = static_cast<uint8_t>(data.size() - i);
-
-  std::vector<mojo::ScopedDataPipeConsumerHandle> input_streams(2);
-  std::vector<mojo::ScopedDataPipeProducerHandle> output_streams(2);
-  for (size_t i = 0; i < input_streams.size(); ++i) {
-    MojoCreateDataPipeOptions options;
-    options.struct_size = sizeof(MojoCreateDataPipeOptions);
-    options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
-    options.element_num_bytes = 1;
-    options.capacity_num_bytes = 1024;
-    mojo::ScopedDataPipeProducerHandle producer;
-    mojo::ScopedDataPipeConsumerHandle consumer;
-    mojo::CreateDataPipe(&options, &producer, &consumer);
-    input_streams[i] = std::move(consumer);
-    output_streams[i] = std::move(producer);
-  }
-
-  std::vector<std::vector<bool>> array_of_array_of_bools(2);
-  for (size_t i = 0; i < 2; ++i) {
-    std::vector<bool> array_of_bools(2);
-    for (size_t j = 0; j < 2; ++j)
-      array_of_bools[j] = j;
-    array_of_array_of_bools[i] = std::move(array_of_bools);
-  }
-
-  mojo::MessagePipe pipe;
-  return Foo::New(name, 1, 2, false, true, false, std::move(bar),
-                  std::move(extra_bars), std::move(data),
-                  std::move(pipe.handle1), std::move(input_streams),
-                  std::move(output_streams), std::move(array_of_array_of_bools),
-                  base::nullopt, base::nullopt);
-}
-
-// Check that the given |Foo| is identical to the one made by |MakeFoo()|.
-void CheckFoo(const Foo& foo) {
-  const std::string kName("foopy");
-  EXPECT_EQ(kName.size(), foo.name.size());
-  for (size_t i = 0; i < std::min(kName.size(), foo.name.size()); i++) {
-    // Test both |operator[]| and |at|.
-    EXPECT_EQ(kName[i], foo.name.at(i)) << i;
-    EXPECT_EQ(kName[i], foo.name[i]) << i;
-  }
-  EXPECT_EQ(kName, foo.name);
-
-  EXPECT_EQ(1, foo.x);
-  EXPECT_EQ(2, foo.y);
-  EXPECT_FALSE(foo.a);
-  EXPECT_TRUE(foo.b);
-  EXPECT_FALSE(foo.c);
-
-  EXPECT_EQ(20, foo.bar->alpha);
-  EXPECT_EQ(40, foo.bar->beta);
-  EXPECT_EQ(60, foo.bar->gamma);
-  EXPECT_EQ(Bar::Type::VERTICAL, foo.bar->type);
-
-  EXPECT_EQ(3u, foo.extra_bars->size());
-  for (size_t i = 0; i < foo.extra_bars->size(); i++) {
-    uint8_t base = static_cast<uint8_t>(i * 100);
-    Bar::Type type = i % 2 == 0 ? Bar::Type::VERTICAL : Bar::Type::HORIZONTAL;
-    EXPECT_EQ(base, (*foo.extra_bars)[i]->alpha) << i;
-    EXPECT_EQ(base + 20, (*foo.extra_bars)[i]->beta) << i;
-    EXPECT_EQ(base + 40, (*foo.extra_bars)[i]->gamma) << i;
-    EXPECT_EQ(type, (*foo.extra_bars)[i]->type) << i;
-  }
-
-  EXPECT_EQ(10u, foo.data->size());
-  for (size_t i = 0; i < foo.data->size(); ++i) {
-    EXPECT_EQ(static_cast<uint8_t>(foo.data->size() - i), (*foo.data)[i]) << i;
-  }
-
-  EXPECT_TRUE(foo.input_streams);
-  EXPECT_EQ(2u, foo.input_streams->size());
-
-  EXPECT_TRUE(foo.output_streams);
-  EXPECT_EQ(2u, foo.output_streams->size());
-
-  EXPECT_EQ(2u, foo.array_of_array_of_bools->size());
-  for (size_t i = 0; i < foo.array_of_array_of_bools->size(); ++i) {
-    EXPECT_EQ(2u, (*foo.array_of_array_of_bools)[i].size());
-    for (size_t j = 0; j < (*foo.array_of_array_of_bools)[i].size(); ++j) {
-      EXPECT_EQ(bool(j), (*foo.array_of_array_of_bools)[i][j]);
-    }
-  }
-}
-
-void PrintSpacer(int depth) {
-  for (int i = 0; i < depth; ++i)
-    std::cout << "   ";
-}
-
-void Print(int depth, const char* name, bool value) {
-  PrintSpacer(depth);
-  std::cout << name << ": " << (value ? "true" : "false") << std::endl;
-}
-
-void Print(int depth, const char* name, int32_t value) {
-  PrintSpacer(depth);
-  std::cout << name << ": " << value << std::endl;
-}
-
-void Print(int depth, const char* name, uint8_t value) {
-  PrintSpacer(depth);
-  std::cout << name << ": " << uint32_t(value) << std::endl;
-}
-
-template <typename H>
-void Print(int depth,
-           const char* name,
-           const mojo::ScopedHandleBase<H>& value) {
-  PrintSpacer(depth);
-  std::cout << name << ": 0x" << std::hex << value.get().value() << std::endl;
-}
-
-void Print(int depth, const char* name, const std::string& str) {
-  PrintSpacer(depth);
-  std::cout << name << ": \"" << str << "\"" << std::endl;
-}
-
-void Print(int depth, const char* name, const BarPtr& bar) {
-  PrintSpacer(depth);
-  std::cout << name << ":" << std::endl;
-  if (!bar.is_null()) {
-    ++depth;
-    Print(depth, "alpha", bar->alpha);
-    Print(depth, "beta", bar->beta);
-    Print(depth, "gamma", bar->gamma);
-    Print(depth, "packed", bar.To<int32_t>());
-    --depth;
-  }
-}
-
-template <typename T>
-void Print(int depth, const char* name, const std::vector<T>& array) {
-  PrintSpacer(depth);
-  std::cout << name << ":" << std::endl;
-  ++depth;
-  for (size_t i = 0; i < array.size(); ++i) {
-    std::stringstream buf;
-    buf << i;
-    Print(depth, buf.str().data(), array.at(i));
-  }
-  --depth;
-}
-
-template <typename T>
-void Print(int depth,
-           const char* name,
-           const base::Optional<std::vector<T>>& array) {
-  if (array)
-    Print(depth, name, *array);
-  else
-    Print(depth, name, std::vector<T>());
-}
-
-void Print(int depth, const char* name, const FooPtr& foo) {
-  PrintSpacer(depth);
-  std::cout << name << ":" << std::endl;
-  if (!foo.is_null()) {
-    ++depth;
-    Print(depth, "name", foo->name);
-    Print(depth, "x", foo->x);
-    Print(depth, "y", foo->y);
-    Print(depth, "a", foo->a);
-    Print(depth, "b", foo->b);
-    Print(depth, "c", foo->c);
-    Print(depth, "bar", foo->bar);
-    Print(depth, "extra_bars", foo->extra_bars);
-    Print(depth, "data", foo->data);
-    Print(depth, "source", foo->source);
-    Print(depth, "input_streams", foo->input_streams);
-    Print(depth, "output_streams", foo->output_streams);
-    Print(depth, "array_of_array_of_bools", foo->array_of_array_of_bools);
-    --depth;
-  }
-}
-
-void DumpHex(const uint8_t* bytes, uint32_t num_bytes) {
-  for (uint32_t i = 0; i < num_bytes; ++i) {
-    std::cout << std::setw(2) << std::setfill('0') << std::hex
-              << uint32_t(bytes[i]);
-
-    if (i % 16 == 15) {
-      std::cout << std::endl;
-      continue;
-    }
-
-    if (i % 2 == 1)
-      std::cout << " ";
-    if (i % 8 == 7)
-      std::cout << " ";
-  }
-}
-
-class ServiceImpl : public Service {
- public:
-  void Frobinate(FooPtr foo,
-                 BazOptions baz,
-                 PortPtr port,
-                 const Service::FrobinateCallback& callback) override {
-    // Users code goes here to handle the incoming Frobinate message.
-
-    // We mainly check that we're given the expected arguments.
-    EXPECT_FALSE(foo.is_null());
-    if (!foo.is_null())
-      CheckFoo(*foo);
-    EXPECT_EQ(BazOptions::EXTRA, baz);
-
-    if (g_dump_message_as_text) {
-      // Also dump the Foo structure and all of its members.
-      std::cout << "Frobinate:" << std::endl;
-      int depth = 1;
-      Print(depth, "foo", foo);
-      Print(depth, "baz", static_cast<int32_t>(baz));
-      Print(depth, "port", port.get());
-    }
-    callback.Run(5);
-  }
-
-  void GetPort(mojo::InterfaceRequest<Port> port_request) override {}
-};
-
-class ServiceProxyImpl : public ServiceProxy {
- public:
-  explicit ServiceProxyImpl(mojo::MessageReceiverWithResponder* receiver)
-      : ServiceProxy(receiver) {}
-};
-
-class SimpleMessageReceiver : public mojo::MessageReceiverWithResponder {
- public:
-  bool Accept(mojo::Message* message) override {
-    // Imagine some IPC happened here.
-
-    if (g_dump_message_as_hex) {
-      DumpHex(reinterpret_cast<const uint8_t*>(message->data()),
-              message->data_num_bytes());
-    }
-
-    // In the receiving process, an implementation of ServiceStub is known to
-    // the system. It receives the incoming message.
-    ServiceImpl impl;
-
-    ServiceStub<> stub;
-    stub.set_sink(&impl);
-    return stub.Accept(message);
-  }
-
-  bool AcceptWithResponder(
-      mojo::Message* message,
-      std::unique_ptr<mojo::MessageReceiver> responder) override {
-    return false;
-  }
-};
-
-using BindingsSampleTest = testing::Test;
-
-TEST_F(BindingsSampleTest, Basic) {
-  SimpleMessageReceiver receiver;
-
-  // User has a proxy to a Service somehow.
-  Service* service = new ServiceProxyImpl(&receiver);
-
-  // User constructs a message to send.
-
-  // Notice that it doesn't matter in what order the structs / arrays are
-  // allocated. Here, the various members of Foo are allocated before Foo is
-  // allocated.
-
-  FooPtr foo = MakeFoo();
-  CheckFoo(*foo);
-
-  PortPtr port;
-  service->Frobinate(std::move(foo), Service::BazOptions::EXTRA,
-                     std::move(port), Service::FrobinateCallback());
-
-  delete service;
-}
-
-TEST_F(BindingsSampleTest, DefaultValues) {
-  DefaultsTestPtr defaults(DefaultsTest::New());
-  EXPECT_EQ(-12, defaults->a0);
-  EXPECT_EQ(kTwelve, defaults->a1);
-  EXPECT_EQ(1234, defaults->a2);
-  EXPECT_EQ(34567U, defaults->a3);
-  EXPECT_EQ(123456, defaults->a4);
-  EXPECT_EQ(3456789012U, defaults->a5);
-  EXPECT_EQ(-111111111111LL, defaults->a6);
-  EXPECT_EQ(9999999999999999999ULL, defaults->a7);
-  EXPECT_EQ(0x12345, defaults->a8);
-  EXPECT_EQ(-0x12345, defaults->a9);
-  EXPECT_EQ(1234, defaults->a10);
-  EXPECT_TRUE(defaults->a11);
-  EXPECT_FALSE(defaults->a12);
-  EXPECT_FLOAT_EQ(123.25f, defaults->a13);
-  EXPECT_DOUBLE_EQ(1234567890.123, defaults->a14);
-  EXPECT_DOUBLE_EQ(1E10, defaults->a15);
-  EXPECT_DOUBLE_EQ(-1.2E+20, defaults->a16);
-  EXPECT_DOUBLE_EQ(1.23E-20, defaults->a17);
-  EXPECT_TRUE(defaults->a18.empty());
-  EXPECT_TRUE(defaults->a19.empty());
-  EXPECT_EQ(Bar::Type::BOTH, defaults->a20);
-  EXPECT_TRUE(defaults->a21.is_null());
-  ASSERT_FALSE(defaults->a22.is_null());
-  EXPECT_EQ(imported::Shape::RECTANGLE, defaults->a22->shape);
-  EXPECT_EQ(imported::Color::BLACK, defaults->a22->color);
-  EXPECT_EQ(0xFFFFFFFFFFFFFFFFULL, defaults->a23);
-  EXPECT_EQ(0x123456789, defaults->a24);
-  EXPECT_EQ(-0x123456789, defaults->a25);
-}
-
-}  // namespace
-}  // namespace sample
diff --git a/mojo/public/cpp/bindings/tests/serialization_warning_unittest.cc b/mojo/public/cpp/bindings/tests/serialization_warning_unittest.cc
deleted file mode 100644
index 275f10f..0000000
--- a/mojo/public/cpp/bindings/tests/serialization_warning_unittest.cc
+++ /dev/null
@@ -1,251 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Serialization warnings are only recorded when DLOG is enabled.
-#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
-
-#include <stddef.h>
-#include <utility>
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "mojo/public/interfaces/bindings/tests/serialization_test_structs.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_unions.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-using mojo::internal::ContainerValidateParams;
-
-// Creates an array of arrays of handles (2 X 3) for testing.
-std::vector<base::Optional<std::vector<ScopedHandle>>>
-CreateTestNestedHandleArray() {
-  std::vector<base::Optional<std::vector<ScopedHandle>>> array(2);
-  for (size_t i = 0; i < array.size(); ++i) {
-    std::vector<ScopedHandle> nested_array(3);
-    for (size_t j = 0; j < nested_array.size(); ++j) {
-      MessagePipe pipe;
-      nested_array[j] = ScopedHandle::From(std::move(pipe.handle1));
-    }
-    array[i].emplace(std::move(nested_array));
-  }
-
-  return array;
-}
-
-class SerializationWarningTest : public testing::Test {
- public:
-  ~SerializationWarningTest() override {}
-
- protected:
-  template <typename T>
-  void TestWarning(T obj, mojo::internal::ValidationError expected_warning) {
-    using MojomType = typename T::Struct::DataView;
-
-    warning_observer_.set_last_warning(mojo::internal::VALIDATION_ERROR_NONE);
-
-    mojo::internal::SerializationContext context;
-    mojo::internal::FixedBufferForTesting buf(
-        mojo::internal::PrepareToSerialize<MojomType>(obj, &context));
-    typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-    mojo::internal::Serialize<MojomType>(obj, &buf, &data, &context);
-
-    EXPECT_EQ(expected_warning, warning_observer_.last_warning());
-  }
-
-  template <typename MojomType, typename T>
-  void TestArrayWarning(T obj,
-                        mojo::internal::ValidationError expected_warning,
-                        const ContainerValidateParams* validate_params) {
-    warning_observer_.set_last_warning(mojo::internal::VALIDATION_ERROR_NONE);
-
-    mojo::internal::SerializationContext context;
-    mojo::internal::FixedBufferForTesting buf(
-        mojo::internal::PrepareToSerialize<MojomType>(obj, &context));
-    typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-    mojo::internal::Serialize<MojomType>(obj, &buf, &data, validate_params,
-                                         &context);
-
-    EXPECT_EQ(expected_warning, warning_observer_.last_warning());
-  }
-
-  template <typename T>
-  void TestUnionWarning(T obj,
-                        mojo::internal::ValidationError expected_warning) {
-    using MojomType = typename T::Struct::DataView;
-
-    warning_observer_.set_last_warning(mojo::internal::VALIDATION_ERROR_NONE);
-
-    mojo::internal::SerializationContext context;
-    mojo::internal::FixedBufferForTesting buf(
-        mojo::internal::PrepareToSerialize<MojomType>(obj, false, &context));
-    typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-    mojo::internal::Serialize<MojomType>(obj, &buf, &data, false, &context);
-
-    EXPECT_EQ(expected_warning, warning_observer_.last_warning());
-  }
-
-  mojo::internal::SerializationWarningObserverForTesting warning_observer_;
-};
-
-TEST_F(SerializationWarningTest, HandleInStruct) {
-  Struct2Ptr test_struct(Struct2::New());
-  EXPECT_FALSE(test_struct->hdl.is_valid());
-
-  TestWarning(std::move(test_struct),
-              mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE);
-
-  test_struct = Struct2::New();
-  MessagePipe pipe;
-  test_struct->hdl = ScopedHandle::From(std::move(pipe.handle1));
-
-  TestWarning(std::move(test_struct), mojo::internal::VALIDATION_ERROR_NONE);
-}
-
-TEST_F(SerializationWarningTest, StructInStruct) {
-  Struct3Ptr test_struct(Struct3::New());
-  EXPECT_TRUE(!test_struct->struct_1);
-
-  TestWarning(std::move(test_struct),
-              mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER);
-
-  test_struct = Struct3::New();
-  test_struct->struct_1 = Struct1::New();
-
-  TestWarning(std::move(test_struct), mojo::internal::VALIDATION_ERROR_NONE);
-}
-
-TEST_F(SerializationWarningTest, ArrayOfStructsInStruct) {
-  Struct4Ptr test_struct(Struct4::New());
-  test_struct->data.resize(1);
-
-  TestWarning(std::move(test_struct),
-              mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER);
-
-  test_struct = Struct4::New();
-  test_struct->data.resize(0);
-
-  TestWarning(std::move(test_struct), mojo::internal::VALIDATION_ERROR_NONE);
-
-  test_struct = Struct4::New();
-  test_struct->data.resize(1);
-  test_struct->data[0] = Struct1::New();
-
-  TestWarning(std::move(test_struct), mojo::internal::VALIDATION_ERROR_NONE);
-}
-
-TEST_F(SerializationWarningTest, FixedArrayOfStructsInStruct) {
-  Struct5Ptr test_struct(Struct5::New());
-  test_struct->pair.resize(1);
-  test_struct->pair[0] = Struct1::New();
-
-  TestWarning(std::move(test_struct),
-              mojo::internal::VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER);
-
-  test_struct = Struct5::New();
-  test_struct->pair.resize(2);
-  test_struct->pair[0] = Struct1::New();
-  test_struct->pair[1] = Struct1::New();
-
-  TestWarning(std::move(test_struct), mojo::internal::VALIDATION_ERROR_NONE);
-}
-
-TEST_F(SerializationWarningTest, ArrayOfArraysOfHandles) {
-  using MojomType = ArrayDataView<ArrayDataView<ScopedHandle>>;
-  auto test_array = CreateTestNestedHandleArray();
-  test_array[0] = base::nullopt;
-  (*test_array[1])[0] = ScopedHandle();
-
-  ContainerValidateParams validate_params_0(
-      0, true, new ContainerValidateParams(0, true, nullptr));
-  TestArrayWarning<MojomType>(std::move(test_array),
-                              mojo::internal::VALIDATION_ERROR_NONE,
-                              &validate_params_0);
-
-  test_array = CreateTestNestedHandleArray();
-  test_array[0] = base::nullopt;
-  ContainerValidateParams validate_params_1(
-      0, false, new ContainerValidateParams(0, true, nullptr));
-  TestArrayWarning<MojomType>(
-      std::move(test_array),
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-      &validate_params_1);
-
-  test_array = CreateTestNestedHandleArray();
-  (*test_array[1])[0] = ScopedHandle();
-  ContainerValidateParams validate_params_2(
-      0, true, new ContainerValidateParams(0, false, nullptr));
-  TestArrayWarning<MojomType>(
-      std::move(test_array),
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-      &validate_params_2);
-}
-
-TEST_F(SerializationWarningTest, ArrayOfStrings) {
-  using MojomType = ArrayDataView<StringDataView>;
-
-  std::vector<std::string> test_array(3);
-  for (size_t i = 0; i < test_array.size(); ++i)
-    test_array[i] = "hello";
-
-  ContainerValidateParams validate_params_0(
-      0, true, new ContainerValidateParams(0, false, nullptr));
-  TestArrayWarning<MojomType>(std::move(test_array),
-                              mojo::internal::VALIDATION_ERROR_NONE,
-                              &validate_params_0);
-
-  std::vector<base::Optional<std::string>> optional_test_array(3);
-  ContainerValidateParams validate_params_1(
-      0, false, new ContainerValidateParams(0, false, nullptr));
-  TestArrayWarning<MojomType>(
-      std::move(optional_test_array),
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-      &validate_params_1);
-
-  test_array = std::vector<std::string>(2);
-  ContainerValidateParams validate_params_2(
-      3, true, new ContainerValidateParams(0, false, nullptr));
-  TestArrayWarning<MojomType>(
-      std::move(test_array),
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER,
-      &validate_params_2);
-}
-
-TEST_F(SerializationWarningTest, StructInUnion) {
-  DummyStructPtr dummy(nullptr);
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_dummy(std::move(dummy));
-
-  TestUnionWarning(std::move(obj),
-                   mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER);
-}
-
-TEST_F(SerializationWarningTest, UnionInUnion) {
-  PodUnionPtr pod(nullptr);
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_pod_union(std::move(pod));
-
-  TestUnionWarning(std::move(obj),
-                   mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER);
-}
-
-TEST_F(SerializationWarningTest, HandleInUnion) {
-  ScopedMessagePipeHandle pipe;
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_message_pipe(std::move(pipe));
-
-  TestUnionWarning(std::move(handle),
-                   mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
-
-#endif
diff --git a/mojo/public/cpp/bindings/tests/shared_rect.h b/mojo/public/cpp/bindings/tests/shared_rect.h
deleted file mode 100644
index c0a4771..0000000
--- a/mojo/public/cpp/bindings/tests/shared_rect.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_SHARED_RECT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_SHARED_RECT_H_
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace test {
-
-// An implementation of a hypothetical Rect type specifically for consumers in
-// both Chromium and Blink.
-class SharedRect {
- public:
-  SharedRect() {}
-  SharedRect(int x, int y, int width, int height)
-      : x_(x), y_(y), width_(width), height_(height) {}
-
-  int x() const { return x_; }
-  void set_x(int x) { x_ = x; }
-
-  int y() const { return y_; }
-  void set_y(int y) { y_ = y; }
-
-  int width() const { return width_; }
-  void set_width(int width) { width_ = width; }
-
-  int height() const { return height_; }
-  void set_height(int height) { height_ = height; }
-
- private:
-  int x_ = 0;
-  int y_ = 0;
-  int width_ = 0;
-  int height_ = 0;
-};
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_SHARED_RECT_H_
diff --git a/mojo/public/cpp/bindings/tests/shared_rect_traits.h b/mojo/public/cpp/bindings/tests/shared_rect_traits.h
deleted file mode 100644
index bbf04d5..0000000
--- a/mojo/public/cpp/bindings/tests/shared_rect_traits.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_SHARED_RECT_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_SHARED_RECT_TRAITS_H_
-
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/tests/shared_rect.h"
-#include "mojo/public/interfaces/bindings/tests/rect.mojom-shared.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<test::SharedTypemappedRectDataView, test::SharedRect> {
-  static int x(const test::SharedRect& r) { return r.x(); }
-  static int y(const test::SharedRect& r) { return r.y(); }
-  static int width(const test::SharedRect& r) { return r.width(); }
-  static int height(const test::SharedRect& r) { return r.height(); }
-
-  static bool Read(test::SharedTypemappedRectDataView r,
-                   test::SharedRect* out) {
-    out->set_x(r.x());
-    out->set_y(r.y());
-    out->set_width(r.width());
-    out->set_height(r.height());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_SHARED_RECT_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc b/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc
deleted file mode 100644
index 77b448a..0000000
--- a/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc
+++ /dev/null
@@ -1,553 +0,0 @@
-// Copyright 2015 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/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/tests/rect_blink.h"
-#include "mojo/public/cpp/bindings/tests/rect_chromium.h"
-#include "mojo/public/cpp/bindings/tests/struct_with_traits_impl.h"
-#include "mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.h"
-#include "mojo/public/cpp/bindings/tests/variant_test_util.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_native_types.mojom-blink.h"
-#include "mojo/public/interfaces/bindings/tests/test_native_types.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-template <typename T>
-void DoExpectResult(const T& expected,
-                    const base::Closure& callback,
-                    const T& actual) {
-  EXPECT_EQ(expected.x(), actual.x());
-  EXPECT_EQ(expected.y(), actual.y());
-  EXPECT_EQ(expected.width(), actual.width());
-  EXPECT_EQ(expected.height(), actual.height());
-  callback.Run();
-}
-
-template <typename T>
-base::Callback<void(const T&)> ExpectResult(const T& r,
-                                            const base::Closure& callback) {
-  return base::Bind(&DoExpectResult<T>, r, callback);
-}
-
-template <typename T>
-void DoFail(const std::string& reason, const T&) {
-  EXPECT_TRUE(false) << reason;
-}
-
-template <typename T>
-base::Callback<void(const T&)> Fail(const std::string& reason) {
-  return base::Bind(&DoFail<T>, reason);
-}
-
-template <typename T>
-void ExpectError(InterfacePtr<T> *proxy, const base::Closure& callback) {
-  proxy->set_connection_error_handler(callback);
-}
-
-// This implements the generated Chromium variant of RectService.
-class ChromiumRectServiceImpl : public RectService {
- public:
-  ChromiumRectServiceImpl() {}
-
-  // mojo::test::RectService:
-  void AddRect(const RectChromium& r) override {
-    if (r.GetArea() > largest_rect_.GetArea())
-      largest_rect_ = r;
-  }
-
-  void GetLargestRect(const GetLargestRectCallback& callback) override {
-    callback.Run(largest_rect_);
-  }
-
-  void PassSharedRect(const SharedRect& r,
-                      const PassSharedRectCallback& callback) override {
-    callback.Run(r);
-  }
-
- private:
-  RectChromium largest_rect_;
-};
-
-// This implements the generated Blink variant of RectService.
-class BlinkRectServiceImpl : public blink::RectService {
- public:
-  BlinkRectServiceImpl() {}
-
-  // mojo::test::blink::RectService:
-  void AddRect(const RectBlink& r) override {
-    if (r.computeArea() > largest_rect_.computeArea()) {
-      largest_rect_.setX(r.x());
-      largest_rect_.setY(r.y());
-      largest_rect_.setWidth(r.width());
-      largest_rect_.setHeight(r.height());
-    }
-  }
-
-  void GetLargestRect(const GetLargestRectCallback& callback) override {
-    callback.Run(largest_rect_);
-  }
-
-  void PassSharedRect(const SharedRect& r,
-                      const PassSharedRectCallback& callback) override {
-    callback.Run(r);
-  }
-
- private:
-  RectBlink largest_rect_;
-};
-
-// A test which runs both Chromium and Blink implementations of a RectService.
-class StructTraitsTest : public testing::Test,
-                         public TraitsTestService {
- public:
-  StructTraitsTest() {}
-
- protected:
-  void BindToChromiumService(RectServiceRequest request) {
-    chromium_bindings_.AddBinding(&chromium_service_, std::move(request));
-  }
-  void BindToChromiumService(blink::RectServiceRequest request) {
-    chromium_bindings_.AddBinding(
-        &chromium_service_,
-        ConvertInterfaceRequest<RectService>(std::move(request)));
-  }
-
-  void BindToBlinkService(blink::RectServiceRequest request) {
-    blink_bindings_.AddBinding(&blink_service_, std::move(request));
-  }
-  void BindToBlinkService(RectServiceRequest request) {
-    blink_bindings_.AddBinding(
-        &blink_service_,
-        ConvertInterfaceRequest<blink::RectService>(std::move(request)));
-  }
-
-  TraitsTestServicePtr GetTraitsTestProxy() {
-    return traits_test_bindings_.CreateInterfacePtrAndBind(this);
-  }
-
- private:
-  // TraitsTestService:
-  void EchoStructWithTraits(
-      const StructWithTraitsImpl& s,
-      const EchoStructWithTraitsCallback& callback) override {
-    callback.Run(s);
-  }
-
-  void EchoTrivialStructWithTraits(
-      TrivialStructWithTraitsImpl s,
-      const EchoTrivialStructWithTraitsCallback& callback) override {
-    callback.Run(s);
-  }
-
-  void EchoMoveOnlyStructWithTraits(
-      MoveOnlyStructWithTraitsImpl s,
-      const EchoMoveOnlyStructWithTraitsCallback& callback) override {
-    callback.Run(std::move(s));
-  }
-
-  void EchoNullableMoveOnlyStructWithTraits(
-      base::Optional<MoveOnlyStructWithTraitsImpl> s,
-      const EchoNullableMoveOnlyStructWithTraitsCallback& callback) override {
-    callback.Run(std::move(s));
-  }
-
-  void EchoEnumWithTraits(EnumWithTraitsImpl e,
-                          const EchoEnumWithTraitsCallback& callback) override {
-    callback.Run(e);
-  }
-
-  void EchoStructWithTraitsForUniquePtr(
-      std::unique_ptr<int> e,
-      const EchoStructWithTraitsForUniquePtrCallback& callback) override {
-    callback.Run(std::move(e));
-  }
-
-  void EchoNullableStructWithTraitsForUniquePtr(
-      std::unique_ptr<int> e,
-      const EchoNullableStructWithTraitsForUniquePtrCallback& callback)
-      override {
-    callback.Run(std::move(e));
-  }
-
-  void EchoUnionWithTraits(
-      std::unique_ptr<test::UnionWithTraitsBase> u,
-      const EchoUnionWithTraitsCallback& callback) override {
-    callback.Run(std::move(u));
-  }
-
-  base::MessageLoop loop_;
-
-  ChromiumRectServiceImpl chromium_service_;
-  BindingSet<RectService> chromium_bindings_;
-
-  BlinkRectServiceImpl blink_service_;
-  BindingSet<blink::RectService> blink_bindings_;
-
-  BindingSet<TraitsTestService> traits_test_bindings_;
-};
-
-}  // namespace
-
-TEST_F(StructTraitsTest, ChromiumProxyToChromiumService) {
-  RectServicePtr chromium_proxy;
-  BindToChromiumService(MakeRequest(&chromium_proxy));
-  {
-    base::RunLoop loop;
-    chromium_proxy->AddRect(RectChromium(1, 1, 4, 5));
-    chromium_proxy->AddRect(RectChromium(-1, -1, 2, 2));
-    chromium_proxy->GetLargestRect(
-        ExpectResult(RectChromium(1, 1, 4, 5), loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassSharedRect(
-        {1, 2, 3, 4},
-        ExpectResult(SharedRect({1, 2, 3, 4}), loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(StructTraitsTest, ChromiumToBlinkService) {
-  RectServicePtr chromium_proxy;
-  BindToBlinkService(MakeRequest(&chromium_proxy));
-  {
-    base::RunLoop loop;
-    chromium_proxy->AddRect(RectChromium(1, 1, 4, 5));
-    chromium_proxy->AddRect(RectChromium(2, 2, 5, 5));
-    chromium_proxy->GetLargestRect(
-        ExpectResult(RectChromium(2, 2, 5, 5), loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassSharedRect(
-        {1, 2, 3, 4},
-        ExpectResult(SharedRect({1, 2, 3, 4}), loop.QuitClosure()));
-    loop.Run();
-  }
-  // The Blink service should drop our connection because RectBlink's
-  // deserializer rejects negative origins.
-  {
-    base::RunLoop loop;
-    ExpectError(&chromium_proxy, loop.QuitClosure());
-    chromium_proxy->AddRect(RectChromium(-1, -1, 2, 2));
-    chromium_proxy->GetLargestRect(
-        Fail<RectChromium>("The pipe should have been closed."));
-    loop.Run();
-  }
-}
-
-TEST_F(StructTraitsTest, BlinkProxyToBlinkService) {
-  blink::RectServicePtr blink_proxy;
-  BindToBlinkService(MakeRequest(&blink_proxy));
-  {
-    base::RunLoop loop;
-    blink_proxy->AddRect(RectBlink(1, 1, 4, 5));
-    blink_proxy->AddRect(RectBlink(10, 10, 20, 20));
-    blink_proxy->GetLargestRect(
-        ExpectResult(RectBlink(10, 10, 20, 20), loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    blink_proxy->PassSharedRect(
-        {4, 3, 2, 1},
-        ExpectResult(SharedRect({4, 3, 2, 1}), loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(StructTraitsTest, BlinkProxyToChromiumService) {
-  blink::RectServicePtr blink_proxy;
-  BindToChromiumService(MakeRequest(&blink_proxy));
-  {
-    base::RunLoop loop;
-    blink_proxy->AddRect(RectBlink(1, 1, 4, 5));
-    blink_proxy->AddRect(RectBlink(10, 10, 2, 2));
-    blink_proxy->GetLargestRect(
-        ExpectResult(RectBlink(1, 1, 4, 5), loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    blink_proxy->PassSharedRect(
-        {4, 3, 2, 1},
-        ExpectResult(SharedRect({4, 3, 2, 1}), loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-void ExpectStructWithTraits(const StructWithTraitsImpl& expected,
-                            const base::Closure& closure,
-                            const StructWithTraitsImpl& passed) {
-  EXPECT_EQ(expected.get_enum(), passed.get_enum());
-  EXPECT_EQ(expected.get_bool(), passed.get_bool());
-  EXPECT_EQ(expected.get_uint32(), passed.get_uint32());
-  EXPECT_EQ(expected.get_uint64(), passed.get_uint64());
-  EXPECT_EQ(expected.get_string(), passed.get_string());
-  EXPECT_EQ(expected.get_string_array(), passed.get_string_array());
-  EXPECT_EQ(expected.get_struct(), passed.get_struct());
-  EXPECT_EQ(expected.get_struct_array(), passed.get_struct_array());
-  EXPECT_EQ(expected.get_struct_map(), passed.get_struct_map());
-  closure.Run();
-}
-
-TEST_F(StructTraitsTest, EchoStructWithTraits) {
-  StructWithTraitsImpl input;
-  input.set_enum(EnumWithTraitsImpl::CUSTOM_VALUE_1);
-  input.set_bool(true);
-  input.set_uint32(7);
-  input.set_uint64(42);
-  input.set_string("hello world!");
-  input.get_mutable_string_array().assign({"hello", "world!"});
-  input.get_mutable_string_set().insert("hello");
-  input.get_mutable_string_set().insert("world!");
-  input.get_mutable_struct().value = 42;
-  input.get_mutable_struct_array().resize(2);
-  input.get_mutable_struct_array()[0].value = 1;
-  input.get_mutable_struct_array()[1].value = 2;
-  input.get_mutable_struct_map()["hello"] = NestedStructWithTraitsImpl(1024);
-  input.get_mutable_struct_map()["world"] = NestedStructWithTraitsImpl(2048);
-
-  base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  proxy->EchoStructWithTraits(
-      input,
-      base::Bind(&ExpectStructWithTraits, input, loop.QuitClosure()));
-  loop.Run();
-}
-
-TEST_F(StructTraitsTest, CloneStructWithTraitsContainer) {
-  StructWithTraitsContainerPtr container = StructWithTraitsContainer::New();
-  container->f_struct.set_uint32(7);
-  container->f_struct.set_uint64(42);
-  StructWithTraitsContainerPtr cloned_container = container.Clone();
-  EXPECT_EQ(7u, cloned_container->f_struct.get_uint32());
-  EXPECT_EQ(42u, cloned_container->f_struct.get_uint64());
-}
-
-void ExpectTrivialStructWithTraits(TrivialStructWithTraitsImpl expected,
-                                   const base::Closure& closure,
-                                   TrivialStructWithTraitsImpl passed) {
-  EXPECT_EQ(expected.value, passed.value);
-  closure.Run();
-}
-
-TEST_F(StructTraitsTest, EchoTrivialStructWithTraits) {
-  TrivialStructWithTraitsImpl input;
-  input.value = 42;
-
-  base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  proxy->EchoTrivialStructWithTraits(
-      input,
-      base::Bind(&ExpectTrivialStructWithTraits, input, loop.QuitClosure()));
-  loop.Run();
-}
-
-void CaptureMessagePipe(ScopedMessagePipeHandle* storage,
-                        const base::Closure& closure,
-                        MoveOnlyStructWithTraitsImpl passed) {
-  storage->reset(MessagePipeHandle(
-      passed.get_mutable_handle().release().value()));
-  closure.Run();
-}
-
-TEST_F(StructTraitsTest, EchoMoveOnlyStructWithTraits) {
-  MessagePipe mp;
-  MoveOnlyStructWithTraitsImpl input;
-  input.get_mutable_handle().reset(mp.handle0.release());
-
-  base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  ScopedMessagePipeHandle received;
-  proxy->EchoMoveOnlyStructWithTraits(
-      std::move(input),
-      base::Bind(&CaptureMessagePipe, &received, loop.QuitClosure()));
-  loop.Run();
-
-  ASSERT_TRUE(received.is_valid());
-
-  // Verify that the message pipe handle is correctly passed.
-  const char kHello[] = "hello";
-  const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WriteMessageRaw(mp.handle1.get(), kHello, kHelloSize, nullptr, 0,
-                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  EXPECT_EQ(MOJO_RESULT_OK, Wait(received.get(), MOJO_HANDLE_SIGNAL_READABLE));
-
-  char buffer[10] = {0};
-  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            ReadMessageRaw(received.get(), buffer, &buffer_size, nullptr,
-                           nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
-  EXPECT_EQ(kHelloSize, buffer_size);
-  EXPECT_STREQ(kHello, buffer);
-}
-
-void CaptureNullableMoveOnlyStructWithTraitsImpl(
-    base::Optional<MoveOnlyStructWithTraitsImpl>* storage,
-    const base::Closure& closure,
-    base::Optional<MoveOnlyStructWithTraitsImpl> passed) {
-  *storage = std::move(passed);
-  closure.Run();
-}
-
-TEST_F(StructTraitsTest, EchoNullableMoveOnlyStructWithTraits) {
-  base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  base::Optional<MoveOnlyStructWithTraitsImpl> received;
-  proxy->EchoNullableMoveOnlyStructWithTraits(
-      base::nullopt, base::Bind(&CaptureNullableMoveOnlyStructWithTraitsImpl,
-                                &received, loop.QuitClosure()));
-  loop.Run();
-
-  EXPECT_FALSE(received);
-}
-
-void ExpectEnumWithTraits(EnumWithTraitsImpl expected_value,
-                          const base::Closure& closure,
-                          EnumWithTraitsImpl value) {
-  EXPECT_EQ(expected_value, value);
-  closure.Run();
-}
-
-TEST_F(StructTraitsTest, EchoEnumWithTraits) {
-  base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  proxy->EchoEnumWithTraits(
-      EnumWithTraitsImpl::CUSTOM_VALUE_1,
-      base::Bind(&ExpectEnumWithTraits, EnumWithTraitsImpl::CUSTOM_VALUE_1,
-                 loop.QuitClosure()));
-  loop.Run();
-}
-
-TEST_F(StructTraitsTest, SerializeStructWithTraits) {
-  StructWithTraitsImpl input;
-  input.set_enum(EnumWithTraitsImpl::CUSTOM_VALUE_1);
-  input.set_bool(true);
-  input.set_uint32(7);
-  input.set_uint64(42);
-  input.set_string("hello world!");
-  input.get_mutable_string_array().assign({ "hello", "world!" });
-  input.get_mutable_string_set().insert("hello");
-  input.get_mutable_string_set().insert("world!");
-  input.get_mutable_struct().value = 42;
-  input.get_mutable_struct_array().resize(2);
-  input.get_mutable_struct_array()[0].value = 1;
-  input.get_mutable_struct_array()[1].value = 2;
-  input.get_mutable_struct_map()["hello"] = NestedStructWithTraitsImpl(1024);
-  input.get_mutable_struct_map()["world"] = NestedStructWithTraitsImpl(2048);
-
-  auto data = StructWithTraits::Serialize(&input);
-  StructWithTraitsImpl output;
-  ASSERT_TRUE(StructWithTraits::Deserialize(std::move(data), &output));
-
-  EXPECT_EQ(input.get_enum(), output.get_enum());
-  EXPECT_EQ(input.get_bool(), output.get_bool());
-  EXPECT_EQ(input.get_uint32(), output.get_uint32());
-  EXPECT_EQ(input.get_uint64(), output.get_uint64());
-  EXPECT_EQ(input.get_string(), output.get_string());
-  EXPECT_EQ(input.get_string_array(), output.get_string_array());
-  EXPECT_EQ(input.get_string_set(), output.get_string_set());
-  EXPECT_EQ(input.get_struct(), output.get_struct());
-  EXPECT_EQ(input.get_struct_array(), output.get_struct_array());
-  EXPECT_EQ(input.get_struct_map(), output.get_struct_map());
-}
-
-void ExpectUniquePtr(std::unique_ptr<int> expected,
-                     const base::Closure& closure,
-                     std::unique_ptr<int> value) {
-  ASSERT_EQ(!expected, !value);
-  if (expected)
-    EXPECT_EQ(*expected, *value);
-  closure.Run();
-}
-
-TEST_F(StructTraitsTest, TypemapUniquePtr) {
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  {
-    base::RunLoop loop;
-    proxy->EchoStructWithTraitsForUniquePtr(
-        base::MakeUnique<int>(12345),
-        base::Bind(&ExpectUniquePtr, base::Passed(base::MakeUnique<int>(12345)),
-                   loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    proxy->EchoNullableStructWithTraitsForUniquePtr(
-        nullptr, base::Bind(&ExpectUniquePtr, nullptr, loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(StructTraitsTest, EchoUnionWithTraits) {
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  {
-    std::unique_ptr<test::UnionWithTraitsBase> input(
-        new test::UnionWithTraitsInt32(1234));
-    base::RunLoop loop;
-    proxy->EchoUnionWithTraits(
-        std::move(input),
-        base::Bind(
-            [](const base::Closure& quit_closure,
-               std::unique_ptr<test::UnionWithTraitsBase> passed) {
-              ASSERT_EQ(test::UnionWithTraitsBase::Type::INT32, passed->type());
-              EXPECT_EQ(1234,
-                        static_cast<test::UnionWithTraitsInt32*>(passed.get())
-                            ->value());
-              quit_closure.Run();
-
-            },
-            loop.QuitClosure()));
-    loop.Run();
-  }
-
-  {
-    std::unique_ptr<test::UnionWithTraitsBase> input(
-        new test::UnionWithTraitsStruct(4321));
-    base::RunLoop loop;
-    proxy->EchoUnionWithTraits(
-        std::move(input),
-        base::Bind(
-            [](const base::Closure& quit_closure,
-               std::unique_ptr<test::UnionWithTraitsBase> passed) {
-              ASSERT_EQ(test::UnionWithTraitsBase::Type::STRUCT,
-                        passed->type());
-              EXPECT_EQ(4321,
-                        static_cast<test::UnionWithTraitsStruct*>(passed.get())
-                            ->get_struct()
-                            .value);
-              quit_closure.Run();
-
-            },
-            loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/struct_unittest.cc b/mojo/public/cpp/bindings/tests/struct_unittest.cc
deleted file mode 100644
index a687052..0000000
--- a/mojo/public/cpp/bindings/tests/struct_unittest.cc
+++ /dev/null
@@ -1,526 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-#include <utility>
-
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "mojo/public/interfaces/bindings/tests/test_export2.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-RectPtr MakeRect(int32_t factor = 1) {
-  return Rect::New(1 * factor, 2 * factor, 10 * factor, 20 * factor);
-}
-
-void CheckRect(const Rect& rect, int32_t factor = 1) {
-  EXPECT_EQ(1 * factor, rect.x);
-  EXPECT_EQ(2 * factor, rect.y);
-  EXPECT_EQ(10 * factor, rect.width);
-  EXPECT_EQ(20 * factor, rect.height);
-}
-
-MultiVersionStructPtr MakeMultiVersionStruct() {
-  MessagePipe pipe;
-  return MultiVersionStruct::New(123, MakeRect(5), std::string("hello"),
-                                 std::vector<int8_t>{10, 9, 8},
-                                 std::move(pipe.handle0), false, 42);
-}
-
-template <typename U, typename T>
-U SerializeAndDeserialize(T input) {
-  using InputMojomType = typename T::Struct::DataView;
-  using OutputMojomType = typename U::Struct::DataView;
-
-  using InputDataType =
-      typename mojo::internal::MojomTypeTraits<InputMojomType>::Data*;
-  using OutputDataType =
-      typename mojo::internal::MojomTypeTraits<OutputMojomType>::Data*;
-
-  mojo::internal::SerializationContext context;
-  size_t size =
-      mojo::internal::PrepareToSerialize<InputMojomType>(input, &context);
-  mojo::internal::FixedBufferForTesting buf(size + 32);
-  InputDataType data;
-  mojo::internal::Serialize<InputMojomType>(input, &buf, &data, &context);
-
-  // Set the subsequent area to a special value, so that we can find out if we
-  // mistakenly access the area.
-  void* subsequent_area = buf.Allocate(32);
-  memset(subsequent_area, 0xAA, 32);
-
-  OutputDataType output_data = reinterpret_cast<OutputDataType>(data);
-
-  U output;
-  mojo::internal::Deserialize<OutputMojomType>(output_data, &output, &context);
-  return std::move(output);
-}
-
-using StructTest = testing::Test;
-
-}  // namespace
-
-TEST_F(StructTest, Rect) {
-  RectPtr rect;
-  EXPECT_TRUE(rect.is_null());
-  EXPECT_TRUE(!rect);
-  EXPECT_FALSE(rect);
-
-  rect = nullptr;
-  EXPECT_TRUE(rect.is_null());
-  EXPECT_TRUE(!rect);
-  EXPECT_FALSE(rect);
-
-  rect = MakeRect();
-  EXPECT_FALSE(rect.is_null());
-  EXPECT_FALSE(!rect);
-  EXPECT_TRUE(rect);
-
-  RectPtr null_rect = nullptr;
-  EXPECT_TRUE(null_rect.is_null());
-  EXPECT_TRUE(!null_rect);
-  EXPECT_FALSE(null_rect);
-
-  CheckRect(*rect);
-}
-
-TEST_F(StructTest, Clone) {
-  NamedRegionPtr region;
-
-  NamedRegionPtr clone_region = region.Clone();
-  EXPECT_TRUE(clone_region.is_null());
-
-  region = NamedRegion::New();
-  clone_region = region.Clone();
-  EXPECT_FALSE(clone_region->name);
-  EXPECT_FALSE(clone_region->rects);
-
-  region->name.emplace("hello world");
-  clone_region = region.Clone();
-  EXPECT_EQ(region->name, clone_region->name);
-
-  region->rects.emplace(2);
-  (*region->rects)[1] = MakeRect();
-  clone_region = region.Clone();
-  EXPECT_EQ(2u, clone_region->rects->size());
-  EXPECT_TRUE((*clone_region->rects)[0].is_null());
-  CheckRect(*(*clone_region->rects)[1]);
-
-  // NoDefaultFieldValues contains handles, so Clone() is not available, but
-  // NoDefaultFieldValuesPtr should still compile.
-  NoDefaultFieldValuesPtr no_default_field_values(NoDefaultFieldValues::New());
-  EXPECT_FALSE(no_default_field_values->f13.is_valid());
-}
-
-// Serialization test of a struct with no pointer or handle members.
-TEST_F(StructTest, Serialization_Basic) {
-  RectPtr rect(MakeRect());
-
-  size_t size = mojo::internal::PrepareToSerialize<RectDataView>(rect, nullptr);
-  EXPECT_EQ(8U + 16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::Rect_Data* data;
-  mojo::internal::Serialize<RectDataView>(rect, &buf, &data, nullptr);
-
-  RectPtr rect2;
-  mojo::internal::Deserialize<RectDataView>(data, &rect2, nullptr);
-
-  CheckRect(*rect2);
-}
-
-// Construction of a struct with struct pointers from null.
-TEST_F(StructTest, Construction_StructPointers) {
-  RectPairPtr pair;
-  EXPECT_TRUE(pair.is_null());
-
-  pair = RectPair::New();
-  EXPECT_FALSE(pair.is_null());
-  EXPECT_TRUE(pair->first.is_null());
-  EXPECT_TRUE(pair->first.is_null());
-
-  pair = nullptr;
-  EXPECT_TRUE(pair.is_null());
-}
-
-// Serialization test of a struct with struct pointers.
-TEST_F(StructTest, Serialization_StructPointers) {
-  RectPairPtr pair(RectPair::New(MakeRect(), MakeRect()));
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<RectPairDataView>(pair, nullptr);
-  EXPECT_EQ(8U + 16U + 2 * (8U + 16U), size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::RectPair_Data* data;
-  mojo::internal::Serialize<RectPairDataView>(pair, &buf, &data, nullptr);
-
-  RectPairPtr pair2;
-  mojo::internal::Deserialize<RectPairDataView>(data, &pair2, nullptr);
-
-  CheckRect(*pair2->first);
-  CheckRect(*pair2->second);
-}
-
-// Serialization test of a struct with an array member.
-TEST_F(StructTest, Serialization_ArrayPointers) {
-  std::vector<RectPtr> rects;
-  for (size_t i = 0; i < 4; ++i)
-    rects.push_back(MakeRect(static_cast<int32_t>(i) + 1));
-
-  NamedRegionPtr region(
-      NamedRegion::New(std::string("region"), std::move(rects)));
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<NamedRegionDataView>(region, nullptr);
-  EXPECT_EQ(8U +            // header
-                8U +        // name pointer
-                8U +        // rects pointer
-                8U +        // name header
-                8U +        // name payload (rounded up)
-                8U +        // rects header
-                4 * 8U +    // rects payload (four pointers)
-                4 * (8U +   // rect header
-                     16U),  // rect payload (four ints)
-            size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::NamedRegion_Data* data;
-  mojo::internal::Serialize<NamedRegionDataView>(region, &buf, &data, nullptr);
-
-  NamedRegionPtr region2;
-  mojo::internal::Deserialize<NamedRegionDataView>(data, &region2, nullptr);
-
-  EXPECT_EQ("region", *region2->name);
-
-  EXPECT_EQ(4U, region2->rects->size());
-  for (size_t i = 0; i < region2->rects->size(); ++i)
-    CheckRect(*(*region2->rects)[i], static_cast<int32_t>(i) + 1);
-}
-
-// Serialization test of a struct with null array pointers.
-TEST_F(StructTest, Serialization_NullArrayPointers) {
-  NamedRegionPtr region(NamedRegion::New());
-  EXPECT_FALSE(region->name);
-  EXPECT_FALSE(region->rects);
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<NamedRegionDataView>(region, nullptr);
-  EXPECT_EQ(8U +      // header
-                8U +  // name pointer
-                8U,   // rects pointer
-            size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::NamedRegion_Data* data;
-  mojo::internal::Serialize<NamedRegionDataView>(region, &buf, &data, nullptr);
-
-  NamedRegionPtr region2;
-  mojo::internal::Deserialize<NamedRegionDataView>(data, &region2, nullptr);
-
-  EXPECT_FALSE(region2->name);
-  EXPECT_FALSE(region2->rects);
-}
-
-// Tests deserializing structs as a newer version.
-TEST_F(StructTest, Versioning_OldToNew) {
-  {
-    MultiVersionStructV0Ptr input(MultiVersionStructV0::New(123));
-    MultiVersionStructPtr expected_output(MultiVersionStruct::New(123));
-
-    MultiVersionStructPtr output =
-        SerializeAndDeserialize<MultiVersionStructPtr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructV1Ptr input(MultiVersionStructV1::New(123, MakeRect(5)));
-    MultiVersionStructPtr expected_output(
-        MultiVersionStruct::New(123, MakeRect(5)));
-
-    MultiVersionStructPtr output =
-        SerializeAndDeserialize<MultiVersionStructPtr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructV3Ptr input(
-        MultiVersionStructV3::New(123, MakeRect(5), std::string("hello")));
-    MultiVersionStructPtr expected_output(
-        MultiVersionStruct::New(123, MakeRect(5), std::string("hello")));
-
-    MultiVersionStructPtr output =
-        SerializeAndDeserialize<MultiVersionStructPtr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructV5Ptr input(MultiVersionStructV5::New(
-        123, MakeRect(5), std::string("hello"), std::vector<int8_t>{10, 9, 8}));
-    MultiVersionStructPtr expected_output(MultiVersionStruct::New(
-        123, MakeRect(5), std::string("hello"), std::vector<int8_t>{10, 9, 8}));
-
-    MultiVersionStructPtr output =
-        SerializeAndDeserialize<MultiVersionStructPtr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MessagePipe pipe;
-    MultiVersionStructV7Ptr input(MultiVersionStructV7::New(
-        123, MakeRect(5), std::string("hello"), std::vector<int8_t>{10, 9, 8},
-        std::move(pipe.handle0), false));
-
-    MultiVersionStructPtr expected_output(MultiVersionStruct::New(
-        123, MakeRect(5), std::string("hello"), std::vector<int8_t>{10, 9, 8}));
-    // Save the raw handle value separately so that we can compare later.
-    MojoHandle expected_handle = input->f_message_pipe.get().value();
-
-    MultiVersionStructPtr output =
-        SerializeAndDeserialize<MultiVersionStructPtr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_EQ(expected_handle, output->f_message_pipe.get().value());
-    output->f_message_pipe.reset();
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-}
-
-// Tests deserializing structs as an older version.
-TEST_F(StructTest, Versioning_NewToOld) {
-  {
-    MultiVersionStructPtr input = MakeMultiVersionStruct();
-    MultiVersionStructV7Ptr expected_output(MultiVersionStructV7::New(
-        123, MakeRect(5), std::string("hello"), std::vector<int8_t>{10, 9, 8}));
-    // Save the raw handle value separately so that we can compare later.
-    MojoHandle expected_handle = input->f_message_pipe.get().value();
-
-    MultiVersionStructV7Ptr output =
-        SerializeAndDeserialize<MultiVersionStructV7Ptr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_EQ(expected_handle, output->f_message_pipe.get().value());
-    output->f_message_pipe.reset();
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructPtr input = MakeMultiVersionStruct();
-    MultiVersionStructV5Ptr expected_output(MultiVersionStructV5::New(
-        123, MakeRect(5), std::string("hello"), std::vector<int8_t>{10, 9, 8}));
-
-    MultiVersionStructV5Ptr output =
-        SerializeAndDeserialize<MultiVersionStructV5Ptr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructPtr input = MakeMultiVersionStruct();
-    MultiVersionStructV3Ptr expected_output(
-        MultiVersionStructV3::New(123, MakeRect(5), std::string("hello")));
-
-    MultiVersionStructV3Ptr output =
-        SerializeAndDeserialize<MultiVersionStructV3Ptr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructPtr input = MakeMultiVersionStruct();
-    MultiVersionStructV1Ptr expected_output(
-        MultiVersionStructV1::New(123, MakeRect(5)));
-
-    MultiVersionStructV1Ptr output =
-        SerializeAndDeserialize<MultiVersionStructV1Ptr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructPtr input = MakeMultiVersionStruct();
-    MultiVersionStructV0Ptr expected_output(MultiVersionStructV0::New(123));
-
-    MultiVersionStructV0Ptr output =
-        SerializeAndDeserialize<MultiVersionStructV0Ptr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-}
-
-// Serialization test for native struct.
-TEST_F(StructTest, Serialization_NativeStruct) {
-  using Data = mojo::internal::NativeStruct_Data;
-  {
-    // Serialization of a null native struct.
-    NativeStructPtr native;
-    size_t size = mojo::internal::PrepareToSerialize<NativeStructDataView>(
-        native, nullptr);
-    EXPECT_EQ(0u, size);
-    mojo::internal::FixedBufferForTesting buf(size);
-
-    Data* data = nullptr;
-    mojo::internal::Serialize<NativeStructDataView>(std::move(native), &buf,
-                                                    &data, nullptr);
-
-    EXPECT_EQ(nullptr, data);
-
-    NativeStructPtr output_native;
-    mojo::internal::Deserialize<NativeStructDataView>(data, &output_native,
-                                                      nullptr);
-    EXPECT_TRUE(output_native.is_null());
-  }
-
-  {
-    // Serialization of a native struct with null data.
-    NativeStructPtr native(NativeStruct::New());
-    size_t size = mojo::internal::PrepareToSerialize<NativeStructDataView>(
-        native, nullptr);
-    EXPECT_EQ(0u, size);
-    mojo::internal::FixedBufferForTesting buf(size);
-
-    Data* data = nullptr;
-    mojo::internal::Serialize<NativeStructDataView>(std::move(native), &buf,
-                                                    &data, nullptr);
-
-    EXPECT_EQ(nullptr, data);
-
-    NativeStructPtr output_native;
-    mojo::internal::Deserialize<NativeStructDataView>(data, &output_native,
-                                                      nullptr);
-    EXPECT_TRUE(output_native.is_null());
-  }
-
-  {
-    NativeStructPtr native(NativeStruct::New());
-    native->data = std::vector<uint8_t>{'X', 'Y'};
-
-    size_t size = mojo::internal::PrepareToSerialize<NativeStructDataView>(
-        native, nullptr);
-    EXPECT_EQ(16u, size);
-    mojo::internal::FixedBufferForTesting buf(size);
-
-    Data* data = nullptr;
-    mojo::internal::Serialize<NativeStructDataView>(std::move(native), &buf,
-                                                    &data, nullptr);
-
-    EXPECT_NE(nullptr, data);
-
-    NativeStructPtr output_native;
-    mojo::internal::Deserialize<NativeStructDataView>(data, &output_native,
-                                                      nullptr);
-    ASSERT_TRUE(output_native);
-    ASSERT_FALSE(output_native->data->empty());
-    EXPECT_EQ(2u, output_native->data->size());
-    EXPECT_EQ('X', (*output_native->data)[0]);
-    EXPECT_EQ('Y', (*output_native->data)[1]);
-  }
-}
-
-TEST_F(StructTest, Serialization_PublicAPI) {
-  {
-    // A null struct pointer.
-    RectPtr null_struct;
-    auto data = Rect::Serialize(&null_struct);
-    EXPECT_TRUE(data.empty());
-
-    // Initialize it to non-null.
-    RectPtr output(Rect::New());
-    ASSERT_TRUE(Rect::Deserialize(data, &output));
-    EXPECT_TRUE(output.is_null());
-  }
-
-  {
-    // A struct with no fields.
-    EmptyStructPtr empty_struct(EmptyStruct::New());
-    auto data = EmptyStruct::Serialize(&empty_struct);
-    EXPECT_FALSE(data.empty());
-
-    EmptyStructPtr output;
-    ASSERT_TRUE(EmptyStruct::Deserialize(data, &output));
-    EXPECT_FALSE(output.is_null());
-  }
-
-  {
-    // A simple struct.
-    RectPtr rect = MakeRect();
-    RectPtr cloned_rect = rect.Clone();
-    auto data = Rect::Serialize(&rect);
-
-    RectPtr output;
-    ASSERT_TRUE(Rect::Deserialize(data, &output));
-    EXPECT_TRUE(output.Equals(cloned_rect));
-  }
-
-  {
-    // A struct containing other objects.
-    std::vector<RectPtr> rects;
-    for (size_t i = 0; i < 3; ++i)
-      rects.push_back(MakeRect(static_cast<int32_t>(i) + 1));
-    NamedRegionPtr region(
-        NamedRegion::New(std::string("region"), std::move(rects)));
-
-    NamedRegionPtr cloned_region = region.Clone();
-    auto data = NamedRegion::Serialize(&region);
-
-    // Make sure that the serialized result gets pointers encoded properly.
-    auto cloned_data = data;
-    NamedRegionPtr output;
-    ASSERT_TRUE(NamedRegion::Deserialize(cloned_data, &output));
-    EXPECT_TRUE(output.Equals(cloned_region));
-  }
-
-  {
-    // Deserialization failure.
-    RectPtr rect = MakeRect();
-    auto data = Rect::Serialize(&rect);
-
-    NamedRegionPtr output;
-    EXPECT_FALSE(NamedRegion::Deserialize(data, &output));
-  }
-
-  {
-    // A struct from another component.
-    auto pair = test_export2::StringPair::New("hello", "world");
-    auto data = test_export2::StringPair::Serialize(&pair);
-
-    test_export2::StringPairPtr output;
-    ASSERT_TRUE(test_export2::StringPair::Deserialize(data, &output));
-    EXPECT_TRUE(output.Equals(pair));
-  }
-}
-
-TEST_F(StructTest, VersionedStructConstructor) {
-  auto reordered = ReorderedStruct::New(123, 456, 789);
-  EXPECT_EQ(123, reordered->a);
-  EXPECT_EQ(456, reordered->b);
-  EXPECT_EQ(789, reordered->c);
-
-  reordered = ReorderedStruct::New(123, 456);
-  EXPECT_EQ(123, reordered->a);
-  EXPECT_EQ(6, reordered->b);
-  EXPECT_EQ(456, reordered->c);
-
-  reordered = ReorderedStruct::New(123);
-  EXPECT_EQ(3, reordered->a);
-  EXPECT_EQ(6, reordered->b);
-  EXPECT_EQ(123, reordered->c);
-
-  reordered = ReorderedStruct::New();
-  EXPECT_EQ(3, reordered->a);
-  EXPECT_EQ(6, reordered->b);
-  EXPECT_EQ(1, reordered->c);
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/struct_with_traits.typemap b/mojo/public/cpp/bindings/tests/struct_with_traits.typemap
deleted file mode 100644
index 752ce44..0000000
--- a/mojo/public/cpp/bindings/tests/struct_with_traits.typemap
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/public/interfaces/bindings/tests/struct_with_traits.mojom"
-public_headers =
-    [ "//mojo/public/cpp/bindings/tests/struct_with_traits_impl.h" ]
-traits_headers =
-    [ "//mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.h" ]
-sources = [
-  "//mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.cc",
-]
-deps = [
-  "//mojo/public/cpp/bindings/tests:struct_with_traits_impl",
-  "//mojo/public/cpp/system:system",
-]
-
-type_mappings = [
-  "mojo.test.EnumWithTraits=mojo::test::EnumWithTraitsImpl",
-  "mojo.test.StructWithTraits=mojo::test::StructWithTraitsImpl",
-  "mojo.test.NestedStructWithTraits=mojo::test::NestedStructWithTraitsImpl",
-  "mojo.test.TrivialStructWithTraits=mojo::test::TrivialStructWithTraitsImpl[copyable_pass_by_value]",
-  "mojo.test.MoveOnlyStructWithTraits=mojo::test::MoveOnlyStructWithTraitsImpl[move_only]",
-  "mojo.test.StructWithTraitsForUniquePtr=std::unique_ptr<int>[move_only,nullable_is_same_type]",
-  "mojo.test.UnionWithTraits=std::unique_ptr<mojo::test::UnionWithTraitsBase>[move_only,nullable_is_same_type]",
-]
diff --git a/mojo/public/cpp/bindings/tests/struct_with_traits_impl.cc b/mojo/public/cpp/bindings/tests/struct_with_traits_impl.cc
deleted file mode 100644
index cbdd4bf..0000000
--- a/mojo/public/cpp/bindings/tests/struct_with_traits_impl.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/tests/struct_with_traits_impl.h"
-
-namespace mojo {
-namespace test {
-
-NestedStructWithTraitsImpl::NestedStructWithTraitsImpl() {}
-NestedStructWithTraitsImpl::NestedStructWithTraitsImpl(int32_t in_value)
-    : value(in_value) {}
-
-StructWithTraitsImpl::StructWithTraitsImpl() {}
-
-StructWithTraitsImpl::~StructWithTraitsImpl() {}
-
-StructWithTraitsImpl::StructWithTraitsImpl(const StructWithTraitsImpl& other) =
-    default;
-
-MoveOnlyStructWithTraitsImpl::MoveOnlyStructWithTraitsImpl() {}
-
-MoveOnlyStructWithTraitsImpl::MoveOnlyStructWithTraitsImpl(
-    MoveOnlyStructWithTraitsImpl&& other) = default;
-
-MoveOnlyStructWithTraitsImpl::~MoveOnlyStructWithTraitsImpl() {}
-
-MoveOnlyStructWithTraitsImpl& MoveOnlyStructWithTraitsImpl::operator=(
-    MoveOnlyStructWithTraitsImpl&& other) = default;
-
-UnionWithTraitsInt32::~UnionWithTraitsInt32() {}
-
-UnionWithTraitsStruct::~UnionWithTraitsStruct() {}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/struct_with_traits_impl.h b/mojo/public/cpp/bindings/tests/struct_with_traits_impl.h
deleted file mode 100644
index 7b007cc..0000000
--- a/mojo/public/cpp/bindings/tests/struct_with_traits_impl.h
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_H_
-
-#include <stdint.h>
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "base/strings/string_piece.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace mojo {
-namespace test {
-
-struct NestedStructWithTraitsImpl {
- public:
-  NestedStructWithTraitsImpl();
-  explicit NestedStructWithTraitsImpl(int32_t in_value);
-
-  bool operator==(const NestedStructWithTraitsImpl& other) const {
-    return value == other.value;
-  }
-
-  int32_t value = 0;
-};
-
-enum class EnumWithTraitsImpl { CUSTOM_VALUE_0 = 10, CUSTOM_VALUE_1 = 11 };
-
-// A type which knows how to look like a mojo::test::StructWithTraits mojom type
-// by way of mojo::StructTraits.
-class StructWithTraitsImpl {
- public:
-  StructWithTraitsImpl();
-  ~StructWithTraitsImpl();
-
-  StructWithTraitsImpl(const StructWithTraitsImpl& other);
-
-  void set_enum(EnumWithTraitsImpl value) { enum_ = value; }
-  EnumWithTraitsImpl get_enum() const { return enum_; }
-
-  void set_bool(bool value) { bool_ = value; }
-  bool get_bool() const { return bool_; }
-
-  void set_uint32(uint32_t value) { uint32_ = value; }
-  uint32_t get_uint32() const { return uint32_; }
-
-  void set_uint64(uint64_t value) { uint64_ = value; }
-  uint64_t get_uint64() const { return uint64_; }
-
-  void set_string(std::string value) { string_ = value; }
-  base::StringPiece get_string_as_string_piece() const { return string_; }
-  const std::string& get_string() const { return string_; }
-
-  const std::vector<std::string>& get_string_array() const {
-    return string_array_;
-  }
-  std::vector<std::string>& get_mutable_string_array() { return string_array_; }
-
-  const std::set<std::string>& get_string_set() const {
-    return string_set_;
-  }
-  std::set<std::string>& get_mutable_string_set() { return string_set_; }
-
-  const NestedStructWithTraitsImpl& get_struct() const { return struct_; }
-  NestedStructWithTraitsImpl& get_mutable_struct() { return struct_; }
-
-  const std::vector<NestedStructWithTraitsImpl>& get_struct_array() const {
-    return struct_array_;
-  }
-  std::vector<NestedStructWithTraitsImpl>& get_mutable_struct_array() {
-    return struct_array_;
-  }
-
-  const std::map<std::string, NestedStructWithTraitsImpl>& get_struct_map()
-      const {
-    return struct_map_;
-  }
-  std::map<std::string, NestedStructWithTraitsImpl>& get_mutable_struct_map() {
-    return struct_map_;
-  }
-
- private:
-  EnumWithTraitsImpl enum_ = EnumWithTraitsImpl::CUSTOM_VALUE_0;
-  bool bool_ = false;
-  uint32_t uint32_ = 0;
-  uint64_t uint64_ = 0;
-  std::string string_;
-  std::vector<std::string> string_array_;
-  std::set<std::string> string_set_;
-  NestedStructWithTraitsImpl struct_;
-  std::vector<NestedStructWithTraitsImpl> struct_array_;
-  std::map<std::string, NestedStructWithTraitsImpl> struct_map_;
-};
-
-// A type which knows how to look like a mojo::test::TrivialStructWithTraits
-// mojom type by way of mojo::StructTraits.
-struct TrivialStructWithTraitsImpl {
-  int32_t value;
-};
-
-// A type which knows how to look like a mojo::test::MoveOnlyStructWithTraits
-// mojom type by way of mojo::StructTraits.
-class MoveOnlyStructWithTraitsImpl {
- public:
-  MoveOnlyStructWithTraitsImpl();
-  MoveOnlyStructWithTraitsImpl(MoveOnlyStructWithTraitsImpl&& other);
-  ~MoveOnlyStructWithTraitsImpl();
-
-  ScopedHandle& get_mutable_handle() { return handle_; }
-
-  MoveOnlyStructWithTraitsImpl& operator=(MoveOnlyStructWithTraitsImpl&& other);
-
- private:
-  ScopedHandle handle_;
-  DISALLOW_COPY_AND_ASSIGN(MoveOnlyStructWithTraitsImpl);
-};
-
-class UnionWithTraitsBase {
- public:
-  enum class Type { INT32, STRUCT };
-
-  virtual ~UnionWithTraitsBase() {}
-
-  Type type() const { return type_; }
-
- protected:
-  Type type_ = Type::INT32;
-};
-
-class UnionWithTraitsInt32 : public UnionWithTraitsBase {
- public:
-  UnionWithTraitsInt32() {}
-  explicit UnionWithTraitsInt32(int32_t value) : value_(value) {}
-
-  ~UnionWithTraitsInt32() override;
-
-  int32_t value() const { return value_; }
-  void set_value(int32_t value) { value_ = value; }
-
- private:
-  int32_t value_ = 0;
-};
-
-class UnionWithTraitsStruct : public UnionWithTraitsBase {
- public:
-  UnionWithTraitsStruct() { type_ = Type::STRUCT; }
-  explicit UnionWithTraitsStruct(int32_t value) : struct_(value) {
-    type_ = Type::STRUCT;
-  }
-  ~UnionWithTraitsStruct() override;
-
-  NestedStructWithTraitsImpl& get_mutable_struct() { return struct_; }
-  const NestedStructWithTraitsImpl& get_struct() const { return struct_; }
-
- private:
-  NestedStructWithTraitsImpl struct_;
-};
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_H_
diff --git a/mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.cc b/mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.cc
deleted file mode 100644
index 6b770b1..0000000
--- a/mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.h"
-
-namespace mojo {
-namespace {
-
-struct Context {
-  int32_t value;
-};
-
-}  // namespace
-
-// static
-void* StructTraits<test::NestedStructWithTraitsDataView,
-                   test::NestedStructWithTraitsImpl>::
-    SetUpContext(const test::NestedStructWithTraitsImpl& input) {
-  Context* context = new Context;
-  context->value = input.value;
-  return context;
-}
-
-// static
-void StructTraits<test::NestedStructWithTraitsDataView,
-                  test::NestedStructWithTraitsImpl>::
-    TearDownContext(const test::NestedStructWithTraitsImpl& input,
-                    void* context) {
-  Context* context_obj = static_cast<Context*>(context);
-  CHECK_EQ(context_obj->value, input.value);
-  delete context_obj;
-}
-
-// static
-int32_t StructTraits<test::NestedStructWithTraitsDataView,
-                     test::NestedStructWithTraitsImpl>::
-    value(const test::NestedStructWithTraitsImpl& input, void* context) {
-  Context* context_obj = static_cast<Context*>(context);
-  CHECK_EQ(context_obj->value, input.value);
-  return input.value;
-}
-
-// static
-bool StructTraits<test::NestedStructWithTraitsDataView,
-                  test::NestedStructWithTraitsImpl>::
-    Read(test::NestedStructWithTraits::DataView data,
-         test::NestedStructWithTraitsImpl* output) {
-  output->value = data.value();
-  return true;
-}
-
-test::EnumWithTraits
-EnumTraits<test::EnumWithTraits, test::EnumWithTraitsImpl>::ToMojom(
-    test::EnumWithTraitsImpl input) {
-  switch (input) {
-    case test::EnumWithTraitsImpl::CUSTOM_VALUE_0:
-      return test::EnumWithTraits::VALUE_0;
-    case test::EnumWithTraitsImpl::CUSTOM_VALUE_1:
-      return test::EnumWithTraits::VALUE_1;
-  };
-
-  NOTREACHED();
-  return test::EnumWithTraits::VALUE_0;
-}
-
-bool EnumTraits<test::EnumWithTraits, test::EnumWithTraitsImpl>::FromMojom(
-    test::EnumWithTraits input,
-    test::EnumWithTraitsImpl* output) {
-  switch (input) {
-    case test::EnumWithTraits::VALUE_0:
-      *output = test::EnumWithTraitsImpl::CUSTOM_VALUE_0;
-      return true;
-    case test::EnumWithTraits::VALUE_1:
-      *output = test::EnumWithTraitsImpl::CUSTOM_VALUE_1;
-      return true;
-  };
-
-  return false;
-}
-
-// static
-bool StructTraits<test::StructWithTraitsDataView, test::StructWithTraitsImpl>::
-    Read(test::StructWithTraits::DataView data,
-         test::StructWithTraitsImpl* out) {
-  test::EnumWithTraitsImpl f_enum;
-  if (!data.ReadFEnum(&f_enum))
-    return false;
-  out->set_enum(f_enum);
-
-  out->set_bool(data.f_bool());
-  out->set_uint32(data.f_uint32());
-  out->set_uint64(data.f_uint64());
-
-  base::StringPiece f_string;
-  std::string f_string2;
-  if (!data.ReadFString(&f_string) || !data.ReadFString2(&f_string2) ||
-      f_string != f_string2) {
-    return false;
-  }
-  out->set_string(f_string2);
-
-  if (!data.ReadFStringArray(&out->get_mutable_string_array()))
-    return false;
-
-  // We can't deserialize as a std::set, so we have to manually copy from the
-  // data view.
-  ArrayDataView<StringDataView> string_set_data_view;
-  data.GetFStringSetDataView(&string_set_data_view);
-  for (size_t i = 0; i < string_set_data_view.size(); ++i) {
-    std::string value;
-    string_set_data_view.Read(i, &value);
-    out->get_mutable_string_set().insert(value);
-  }
-
-  if (!data.ReadFStruct(&out->get_mutable_struct()))
-    return false;
-
-  if (!data.ReadFStructArray(&out->get_mutable_struct_array()))
-    return false;
-
-  if (!data.ReadFStructMap(&out->get_mutable_struct_map()))
-    return false;
-
-  return true;
-}
-
-// static
-bool StructTraits<test::MoveOnlyStructWithTraitsDataView,
-                  test::MoveOnlyStructWithTraitsImpl>::
-    Read(test::MoveOnlyStructWithTraits::DataView data,
-         test::MoveOnlyStructWithTraitsImpl* out) {
-  out->get_mutable_handle() = data.TakeFHandle();
-  return true;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.h b/mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.h
deleted file mode 100644
index adcad8a..0000000
--- a/mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.h
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_TRAITS_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-#include "base/strings/string_piece.h"
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/tests/struct_with_traits_impl.h"
-#include "mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<test::NestedStructWithTraitsDataView,
-                    test::NestedStructWithTraitsImpl> {
-  static void* SetUpContext(const test::NestedStructWithTraitsImpl& input);
-  static void TearDownContext(const test::NestedStructWithTraitsImpl& input,
-                              void* context);
-
-  static int32_t value(const test::NestedStructWithTraitsImpl& input,
-                       void* context);
-
-  static bool Read(test::NestedStructWithTraitsDataView data,
-                   test::NestedStructWithTraitsImpl* output);
-};
-
-template <>
-struct EnumTraits<test::EnumWithTraits, test::EnumWithTraitsImpl> {
-  static test::EnumWithTraits ToMojom(test::EnumWithTraitsImpl input);
-  static bool FromMojom(test::EnumWithTraits input,
-                        test::EnumWithTraitsImpl* output);
-};
-
-template <>
-struct StructTraits<test::StructWithTraitsDataView,
-                    test::StructWithTraitsImpl> {
-  // Deserialization to test::StructTraitsImpl.
-  static bool Read(test::StructWithTraitsDataView data,
-                   test::StructWithTraitsImpl* out);
-
-  // Fields in test::StructWithTraits.
-  // See src/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.
-  static test::EnumWithTraitsImpl f_enum(
-      const test::StructWithTraitsImpl& value) {
-    return value.get_enum();
-  }
-
-  static bool f_bool(const test::StructWithTraitsImpl& value) {
-    return value.get_bool();
-  }
-
-  static uint32_t f_uint32(const test::StructWithTraitsImpl& value) {
-    return value.get_uint32();
-  }
-
-  static uint64_t f_uint64(const test::StructWithTraitsImpl& value) {
-    return value.get_uint64();
-  }
-
-  static base::StringPiece f_string(const test::StructWithTraitsImpl& value) {
-    return value.get_string_as_string_piece();
-  }
-
-  static const std::string& f_string2(const test::StructWithTraitsImpl& value) {
-    return value.get_string();
-  }
-
-  static const std::vector<std::string>& f_string_array(
-      const test::StructWithTraitsImpl& value) {
-    return value.get_string_array();
-  }
-
-  static const std::set<std::string>& f_string_set(
-      const test::StructWithTraitsImpl& value) {
-    return value.get_string_set();
-  }
-
-  static const test::NestedStructWithTraitsImpl& f_struct(
-      const test::StructWithTraitsImpl& value) {
-    return value.get_struct();
-  }
-
-  static const std::vector<test::NestedStructWithTraitsImpl>& f_struct_array(
-      const test::StructWithTraitsImpl& value) {
-    return value.get_struct_array();
-  }
-
-  static const std::map<std::string, test::NestedStructWithTraitsImpl>&
-  f_struct_map(const test::StructWithTraitsImpl& value) {
-    return value.get_struct_map();
-  }
-};
-
-template <>
-struct StructTraits<test::TrivialStructWithTraitsDataView,
-                    test::TrivialStructWithTraitsImpl> {
-  // Deserialization to test::TrivialStructTraitsImpl.
-  static bool Read(test::TrivialStructWithTraitsDataView data,
-                   test::TrivialStructWithTraitsImpl* out) {
-    out->value = data.value();
-    return true;
-  }
-
-  // Fields in test::TrivialStructWithTraits.
-  // See src/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.
-  static int32_t value(test::TrivialStructWithTraitsImpl& input) {
-    return input.value;
-  }
-};
-
-template <>
-struct StructTraits<test::MoveOnlyStructWithTraitsDataView,
-                    test::MoveOnlyStructWithTraitsImpl> {
-  // Deserialization to test::MoveOnlyStructTraitsImpl.
-  static bool Read(test::MoveOnlyStructWithTraitsDataView data,
-                   test::MoveOnlyStructWithTraitsImpl* out);
-
-  // Fields in test::MoveOnlyStructWithTraits.
-  // See src/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.
-  static ScopedHandle f_handle(test::MoveOnlyStructWithTraitsImpl& value) {
-    return std::move(value.get_mutable_handle());
-  }
-};
-
-template <>
-struct StructTraits<test::StructWithTraitsForUniquePtrDataView,
-                    std::unique_ptr<int>> {
-  static bool IsNull(const std::unique_ptr<int>& data) { return !data; }
-  static void SetToNull(std::unique_ptr<int>* data) { data->reset(); }
-
-  static int f_int32(const std::unique_ptr<int>& data) { return *data; }
-
-  static bool Read(test::StructWithTraitsForUniquePtrDataView data,
-                   std::unique_ptr<int>* out) {
-    out->reset(new int(data.f_int32()));
-    return true;
-  }
-};
-
-template <>
-struct UnionTraits<test::UnionWithTraitsDataView,
-                   std::unique_ptr<test::UnionWithTraitsBase>> {
-  static bool IsNull(const std::unique_ptr<test::UnionWithTraitsBase>& data) {
-    return !data;
-  }
-  static void SetToNull(std::unique_ptr<test::UnionWithTraitsBase>* data) {
-    data->reset();
-  }
-
-  static test::UnionWithTraitsDataView::Tag GetTag(
-      const std::unique_ptr<test::UnionWithTraitsBase>& data) {
-    if (data->type() == test::UnionWithTraitsBase::Type::INT32)
-      return test::UnionWithTraitsDataView::Tag::F_INT32;
-
-    return test::UnionWithTraitsDataView::Tag::F_STRUCT;
-  }
-
-  static int32_t f_int32(
-      const std::unique_ptr<test::UnionWithTraitsBase>& data) {
-    return static_cast<test::UnionWithTraitsInt32*>(data.get())->value();
-  }
-
-  static const test::NestedStructWithTraitsImpl& f_struct(
-      const std::unique_ptr<test::UnionWithTraitsBase>& data) {
-    return static_cast<test::UnionWithTraitsStruct*>(data.get())->get_struct();
-  }
-
-  static bool Read(test::UnionWithTraitsDataView data,
-                   std::unique_ptr<test::UnionWithTraitsBase>* out) {
-    switch (data.tag()) {
-      case test::UnionWithTraitsDataView::Tag::F_INT32: {
-        out->reset(new test::UnionWithTraitsInt32(data.f_int32()));
-        return true;
-      }
-      case test::UnionWithTraitsDataView::Tag::F_STRUCT: {
-        auto* struct_object = new test::UnionWithTraitsStruct();
-        out->reset(struct_object);
-        return data.ReadFStruct(&struct_object->get_mutable_struct());
-      }
-    }
-
-    NOTREACHED();
-    return false;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/tests/sync_method_unittest.cc b/mojo/public/cpp/bindings/tests/sync_method_unittest.cc
deleted file mode 100644
index 084e080..0000000
--- a/mojo/public/cpp/bindings/tests/sync_method_unittest.cc
+++ /dev/null
@@ -1,831 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/interfaces/bindings/tests/test_sync_methods.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-template <typename... Args>
-struct LambdaBinder {
-  using CallbackType = base::Callback<void(Args...)>;
-
-  template <typename Func>
-  static void RunLambda(Func func, Args... args) {
-    func(std::move(args)...);
-  }
-
-  template <typename Func>
-  static CallbackType BindLambda(Func func) {
-    return base::Bind(&LambdaBinder::RunLambda<Func>, func);
-  }
-};
-
-class TestSyncCommonImpl {
- public:
-  TestSyncCommonImpl() {}
-
-  using PingHandler = base::Callback<void(const base::Callback<void()>&)>;
-  using PingBinder = LambdaBinder<const base::Callback<void()>&>;
-  template <typename Func>
-  void set_ping_handler(Func handler) {
-    ping_handler_ = PingBinder::BindLambda(handler);
-  }
-
-  using EchoHandler =
-      base::Callback<void(int32_t, const base::Callback<void(int32_t)>&)>;
-  using EchoBinder =
-      LambdaBinder<int32_t, const base::Callback<void(int32_t)>&>;
-  template <typename Func>
-  void set_echo_handler(Func handler) {
-    echo_handler_ = EchoBinder::BindLambda(handler);
-  }
-
-  using AsyncEchoHandler =
-      base::Callback<void(int32_t, const base::Callback<void(int32_t)>&)>;
-  using AsyncEchoBinder =
-      LambdaBinder<int32_t, const base::Callback<void(int32_t)>&>;
-  template <typename Func>
-  void set_async_echo_handler(Func handler) {
-    async_echo_handler_ = AsyncEchoBinder::BindLambda(handler);
-  }
-
-  using SendInterfaceHandler = base::Callback<void(TestSyncAssociatedPtrInfo)>;
-  using SendInterfaceBinder = LambdaBinder<TestSyncAssociatedPtrInfo>;
-  template <typename Func>
-  void set_send_interface_handler(Func handler) {
-    send_interface_handler_ = SendInterfaceBinder::BindLambda(handler);
-  }
-
-  using SendRequestHandler = base::Callback<void(TestSyncAssociatedRequest)>;
-  using SendRequestBinder = LambdaBinder<TestSyncAssociatedRequest>;
-  template <typename Func>
-  void set_send_request_handler(Func handler) {
-    send_request_handler_ = SendRequestBinder::BindLambda(handler);
-  }
-
-  void PingImpl(const base::Callback<void()>& callback) {
-    if (ping_handler_.is_null()) {
-      callback.Run();
-      return;
-    }
-    ping_handler_.Run(callback);
-  }
-  void EchoImpl(int32_t value, const base::Callback<void(int32_t)>& callback) {
-    if (echo_handler_.is_null()) {
-      callback.Run(value);
-      return;
-    }
-    echo_handler_.Run(value, callback);
-  }
-  void AsyncEchoImpl(int32_t value,
-                     const base::Callback<void(int32_t)>& callback) {
-    if (async_echo_handler_.is_null()) {
-      callback.Run(value);
-      return;
-    }
-    async_echo_handler_.Run(value, callback);
-  }
-  void SendInterfaceImpl(TestSyncAssociatedPtrInfo ptr) {
-    send_interface_handler_.Run(std::move(ptr));
-  }
-  void SendRequestImpl(TestSyncAssociatedRequest request) {
-    send_request_handler_.Run(std::move(request));
-  }
-
- private:
-  PingHandler ping_handler_;
-  EchoHandler echo_handler_;
-  AsyncEchoHandler async_echo_handler_;
-  SendInterfaceHandler send_interface_handler_;
-  SendRequestHandler send_request_handler_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSyncCommonImpl);
-};
-
-class TestSyncImpl : public TestSync, public TestSyncCommonImpl {
- public:
-  explicit TestSyncImpl(TestSyncRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestSync implementation:
-  void Ping(const PingCallback& callback) override { PingImpl(callback); }
-  void Echo(int32_t value, const EchoCallback& callback) override {
-    EchoImpl(value, callback);
-  }
-  void AsyncEcho(int32_t value, const AsyncEchoCallback& callback) override {
-    AsyncEchoImpl(value, callback);
-  }
-
-  Binding<TestSync>* binding() { return &binding_; }
-
- private:
-  Binding<TestSync> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSyncImpl);
-};
-
-class TestSyncMasterImpl : public TestSyncMaster, public TestSyncCommonImpl {
- public:
-  explicit TestSyncMasterImpl(TestSyncMasterRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestSyncMaster implementation:
-  void Ping(const PingCallback& callback) override { PingImpl(callback); }
-  void Echo(int32_t value, const EchoCallback& callback) override {
-    EchoImpl(value, callback);
-  }
-  void AsyncEcho(int32_t value, const AsyncEchoCallback& callback) override {
-    AsyncEchoImpl(value, callback);
-  }
-  void SendInterface(TestSyncAssociatedPtrInfo ptr) override {
-    SendInterfaceImpl(std::move(ptr));
-  }
-  void SendRequest(TestSyncAssociatedRequest request) override {
-    SendRequestImpl(std::move(request));
-  }
-
-  Binding<TestSyncMaster>* binding() { return &binding_; }
-
- private:
-  Binding<TestSyncMaster> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSyncMasterImpl);
-};
-
-class TestSyncAssociatedImpl : public TestSync, public TestSyncCommonImpl {
- public:
-  explicit TestSyncAssociatedImpl(TestSyncAssociatedRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestSync implementation:
-  void Ping(const PingCallback& callback) override { PingImpl(callback); }
-  void Echo(int32_t value, const EchoCallback& callback) override {
-    EchoImpl(value, callback);
-  }
-  void AsyncEcho(int32_t value, const AsyncEchoCallback& callback) override {
-    AsyncEchoImpl(value, callback);
-  }
-
-  AssociatedBinding<TestSync>* binding() { return &binding_; }
-
- private:
-  AssociatedBinding<TestSync> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSyncAssociatedImpl);
-};
-
-template <typename Interface>
-struct ImplTraits;
-
-template <>
-struct ImplTraits<TestSync> {
-  using Type = TestSyncImpl;
-};
-
-template <>
-struct ImplTraits<TestSyncMaster> {
-  using Type = TestSyncMasterImpl;
-};
-
-template <typename Interface>
-using ImplTypeFor = typename ImplTraits<Interface>::Type;
-
-// A wrapper for either an InterfacePtr or scoped_refptr<ThreadSafeInterfacePtr>
-// that exposes the InterfacePtr interface.
-template <typename Interface>
-class PtrWrapper {
- public:
-  explicit PtrWrapper(InterfacePtr<Interface> ptr) : ptr_(std::move(ptr)) {}
-
-  explicit PtrWrapper(
-      scoped_refptr<ThreadSafeInterfacePtr<Interface>> thread_safe_ptr)
-      : thread_safe_ptr_(thread_safe_ptr) {}
-
-  PtrWrapper(PtrWrapper&& other) = default;
-
-  Interface* operator->() {
-    return thread_safe_ptr_ ? thread_safe_ptr_->get() : ptr_.get();
-  }
-
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(!thread_safe_ptr_);
-    ptr_.set_connection_error_handler(error_handler);
-  }
-
-  void reset() {
-    ptr_ = nullptr;
-    thread_safe_ptr_ = nullptr;
-  }
-
- private:
-  InterfacePtr<Interface> ptr_;
-  scoped_refptr<ThreadSafeInterfacePtr<Interface>> thread_safe_ptr_;
-
-  DISALLOW_COPY_AND_ASSIGN(PtrWrapper);
-};
-
-// The type parameter for SyncMethodCommonTests for varying the Interface and
-// whether to use InterfacePtr or ThreadSafeInterfacePtr.
-template <typename InterfaceT, bool use_thread_safe_ptr>
-struct TestParams {
-  using Interface = InterfaceT;
-  static const bool kIsThreadSafeInterfacePtrTest = use_thread_safe_ptr;
-
-  static PtrWrapper<InterfaceT> Wrap(InterfacePtr<Interface> ptr) {
-    if (kIsThreadSafeInterfacePtrTest) {
-      return PtrWrapper<Interface>(
-          ThreadSafeInterfacePtr<Interface>::Create(std::move(ptr)));
-    } else {
-      return PtrWrapper<Interface>(std::move(ptr));
-    }
-  }
-};
-
-template <typename Interface>
-class TestSyncServiceThread {
- public:
-  TestSyncServiceThread()
-      : thread_("TestSyncServiceThread"), ping_called_(false) {
-    thread_.Start();
-  }
-
-  void SetUp(InterfaceRequest<Interface> request) {
-    CHECK(thread_.task_runner()->BelongsToCurrentThread());
-    impl_.reset(new ImplTypeFor<Interface>(std::move(request)));
-    impl_->set_ping_handler(
-        [this](const typename Interface::PingCallback& callback) {
-          {
-            base::AutoLock locker(lock_);
-            ping_called_ = true;
-          }
-          callback.Run();
-        });
-  }
-
-  void TearDown() {
-    CHECK(thread_.task_runner()->BelongsToCurrentThread());
-    impl_.reset();
-  }
-
-  base::Thread* thread() { return &thread_; }
-  bool ping_called() const {
-    base::AutoLock locker(lock_);
-    return ping_called_;
-  }
-
- private:
-  base::Thread thread_;
-
-  std::unique_ptr<ImplTypeFor<Interface>> impl_;
-
-  mutable base::Lock lock_;
-  bool ping_called_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSyncServiceThread);
-};
-
-class SyncMethodTest : public testing::Test {
- public:
-  SyncMethodTest() {}
-  ~SyncMethodTest() override { base::RunLoop().RunUntilIdle(); }
-
- protected:
-  base::MessageLoop loop_;
-};
-
-template <typename T>
-class SyncMethodCommonTest : public SyncMethodTest {
- public:
-  SyncMethodCommonTest() {}
-  ~SyncMethodCommonTest() override {}
-};
-
-class SyncMethodAssociatedTest : public SyncMethodTest {
- public:
-  SyncMethodAssociatedTest() {}
-  ~SyncMethodAssociatedTest() override {}
-
- protected:
-  void SetUp() override {
-    master_impl_.reset(new TestSyncMasterImpl(MakeRequest(&master_ptr_)));
-
-    asso_request_ = MakeRequest(&asso_ptr_info_);
-    opposite_asso_request_ = MakeRequest(&opposite_asso_ptr_info_);
-
-    master_impl_->set_send_interface_handler(
-        [this](TestSyncAssociatedPtrInfo ptr) {
-          opposite_asso_ptr_info_ = std::move(ptr);
-        });
-    base::RunLoop run_loop;
-    master_impl_->set_send_request_handler(
-        [this, &run_loop](TestSyncAssociatedRequest request) {
-          asso_request_ = std::move(request);
-          run_loop.Quit();
-        });
-
-    master_ptr_->SendInterface(std::move(opposite_asso_ptr_info_));
-    master_ptr_->SendRequest(std::move(asso_request_));
-    run_loop.Run();
-  }
-
-  void TearDown() override {
-    asso_ptr_info_ = TestSyncAssociatedPtrInfo();
-    asso_request_ = TestSyncAssociatedRequest();
-    opposite_asso_ptr_info_ = TestSyncAssociatedPtrInfo();
-    opposite_asso_request_ = TestSyncAssociatedRequest();
-
-    master_ptr_ = nullptr;
-    master_impl_.reset();
-  }
-
-  InterfacePtr<TestSyncMaster> master_ptr_;
-  std::unique_ptr<TestSyncMasterImpl> master_impl_;
-
-  // An associated interface whose binding lives at the |master_impl_| side.
-  TestSyncAssociatedPtrInfo asso_ptr_info_;
-  TestSyncAssociatedRequest asso_request_;
-
-  // An associated interface whose binding lives at the |master_ptr_| side.
-  TestSyncAssociatedPtrInfo opposite_asso_ptr_info_;
-  TestSyncAssociatedRequest opposite_asso_request_;
-};
-
-void SetFlagAndRunClosure(bool* flag, const base::Closure& closure) {
-  *flag = true;
-  closure.Run();
-}
-
-void ExpectValueAndRunClosure(int32_t expected_value,
-                              const base::Closure& closure,
-                              int32_t value) {
-  EXPECT_EQ(expected_value, value);
-  closure.Run();
-}
-
-template <typename Func>
-void CallAsyncEchoCallback(Func func, int32_t value) {
-  func(value);
-}
-
-template <typename Func>
-TestSync::AsyncEchoCallback BindAsyncEchoCallback(Func func) {
-  return base::Bind(&CallAsyncEchoCallback<Func>, func);
-}
-
-// TestSync (without associated interfaces) and TestSyncMaster (with associated
-// interfaces) exercise MultiplexRouter with different configurations.
-// Each test is run once with an InterfacePtr and once with a
-// ThreadSafeInterfacePtr to ensure that they behave the same with respect to
-// sync calls.
-using InterfaceTypes = testing::Types<TestParams<TestSync, true>,
-                                      TestParams<TestSync, false>,
-                                      TestParams<TestSyncMaster, true>,
-                                      TestParams<TestSyncMaster, false>>;
-TYPED_TEST_CASE(SyncMethodCommonTest, InterfaceTypes);
-
-TYPED_TEST(SyncMethodCommonTest, CallSyncMethodAsynchronously) {
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  base::RunLoop run_loop;
-  ptr->Echo(123, base::Bind(&ExpectValueAndRunClosure, 123,
-                            run_loop.QuitClosure()));
-  run_loop.Run();
-}
-
-TYPED_TEST(SyncMethodCommonTest, BasicSyncCalls) {
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  InterfaceRequest<Interface> request = MakeRequest(&interface_ptr);
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  TestSyncServiceThread<Interface> service_thread;
-  service_thread.thread()->task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&TestSyncServiceThread<Interface>::SetUp,
-                 base::Unretained(&service_thread), base::Passed(&request)));
-  ASSERT_TRUE(ptr->Ping());
-  ASSERT_TRUE(service_thread.ping_called());
-
-  int32_t output_value = -1;
-  ASSERT_TRUE(ptr->Echo(42, &output_value));
-  ASSERT_EQ(42, output_value);
-
-  base::RunLoop run_loop;
-  service_thread.thread()->task_runner()->PostTaskAndReply(
-      FROM_HERE,
-      base::Bind(&TestSyncServiceThread<Interface>::TearDown,
-                 base::Unretained(&service_thread)),
-      run_loop.QuitClosure());
-  run_loop.Run();
-}
-
-TYPED_TEST(SyncMethodCommonTest, ReenteredBySyncMethodBinding) {
-  // Test that an interface pointer waiting for a sync call response can be
-  // reentered by a binding serving sync methods on the same thread.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  // The binding lives on the same thread as the interface pointer.
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-  int32_t output_value = -1;
-  ASSERT_TRUE(ptr->Echo(42, &output_value));
-  EXPECT_EQ(42, output_value);
-}
-
-TYPED_TEST(SyncMethodCommonTest, InterfacePtrDestroyedDuringSyncCall) {
-  // Test that it won't result in crash or hang if an interface pointer is
-  // destroyed while it is waiting for a sync call response.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-  impl.set_ping_handler([&ptr](const TestSync::PingCallback& callback) {
-    ptr.reset();
-    callback.Run();
-  });
-  ASSERT_FALSE(ptr->Ping());
-}
-
-TYPED_TEST(SyncMethodCommonTest, BindingDestroyedDuringSyncCall) {
-  // Test that it won't result in crash or hang if a binding is
-  // closed (and therefore the message pipe handle is closed) while the
-  // corresponding interface pointer is waiting for a sync call response.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-  impl.set_ping_handler([&impl](const TestSync::PingCallback& callback) {
-    impl.binding()->Close();
-    callback.Run();
-  });
-  ASSERT_FALSE(ptr->Ping());
-}
-
-TYPED_TEST(SyncMethodCommonTest, NestedSyncCallsWithInOrderResponses) {
-  // Test that we can call a sync method on an interface ptr, while there is
-  // already a sync call ongoing. The responses arrive in order.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  // The same variable is used to store the output of the two sync calls, in
-  // order to test that responses are handled in the correct order.
-  int32_t result_value = -1;
-
-  bool first_call = true;
-  impl.set_echo_handler([&first_call, &ptr, &result_value](
-      int32_t value, const TestSync::EchoCallback& callback) {
-    if (first_call) {
-      first_call = false;
-      ASSERT_TRUE(ptr->Echo(456, &result_value));
-      EXPECT_EQ(456, result_value);
-    }
-    callback.Run(value);
-  });
-
-  ASSERT_TRUE(ptr->Echo(123, &result_value));
-  EXPECT_EQ(123, result_value);
-}
-
-TYPED_TEST(SyncMethodCommonTest, NestedSyncCallsWithOutOfOrderResponses) {
-  // Test that we can call a sync method on an interface ptr, while there is
-  // already a sync call ongoing. The responses arrive out of order.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  // The same variable is used to store the output of the two sync calls, in
-  // order to test that responses are handled in the correct order.
-  int32_t result_value = -1;
-
-  bool first_call = true;
-  impl.set_echo_handler([&first_call, &ptr, &result_value](
-      int32_t value, const TestSync::EchoCallback& callback) {
-    callback.Run(value);
-    if (first_call) {
-      first_call = false;
-      ASSERT_TRUE(ptr->Echo(456, &result_value));
-      EXPECT_EQ(456, result_value);
-    }
-  });
-
-  ASSERT_TRUE(ptr->Echo(123, &result_value));
-  EXPECT_EQ(123, result_value);
-}
-
-TYPED_TEST(SyncMethodCommonTest, AsyncResponseQueuedDuringSyncCall) {
-  // Test that while an interface pointer is waiting for the response to a sync
-  // call, async responses are queued until the sync call completes.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  int32_t async_echo_request_value = -1;
-  TestSync::AsyncEchoCallback async_echo_request_callback;
-  base::RunLoop run_loop1;
-  impl.set_async_echo_handler(
-      [&async_echo_request_value, &async_echo_request_callback, &run_loop1](
-          int32_t value, const TestSync::AsyncEchoCallback& callback) {
-        async_echo_request_value = value;
-        async_echo_request_callback = callback;
-        run_loop1.Quit();
-      });
-
-  bool async_echo_response_dispatched = false;
-  base::RunLoop run_loop2;
-  ptr->AsyncEcho(
-      123,
-      BindAsyncEchoCallback(
-         [&async_echo_response_dispatched, &run_loop2](int32_t result) {
-           async_echo_response_dispatched = true;
-           EXPECT_EQ(123, result);
-           run_loop2.Quit();
-         }));
-  // Run until the AsyncEcho request reaches the service side.
-  run_loop1.Run();
-
-  impl.set_echo_handler(
-      [&async_echo_request_value, &async_echo_request_callback](
-          int32_t value, const TestSync::EchoCallback& callback) {
-        // Send back the async response first.
-        EXPECT_FALSE(async_echo_request_callback.is_null());
-        async_echo_request_callback.Run(async_echo_request_value);
-
-        callback.Run(value);
-      });
-
-  int32_t result_value = -1;
-  ASSERT_TRUE(ptr->Echo(456, &result_value));
-  EXPECT_EQ(456, result_value);
-
-  // Although the AsyncEcho response arrives before the Echo response, it should
-  // be queued and not yet dispatched.
-  EXPECT_FALSE(async_echo_response_dispatched);
-
-  // Run until the AsyncEcho response is dispatched.
-  run_loop2.Run();
-
-  EXPECT_TRUE(async_echo_response_dispatched);
-}
-
-TYPED_TEST(SyncMethodCommonTest, AsyncRequestQueuedDuringSyncCall) {
-  // Test that while an interface pointer is waiting for the response to a sync
-  // call, async requests for a binding running on the same thread are queued
-  // until the sync call completes.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  bool async_echo_request_dispatched = false;
-  impl.set_async_echo_handler([&async_echo_request_dispatched](
-      int32_t value, const TestSync::AsyncEchoCallback& callback) {
-    async_echo_request_dispatched = true;
-    callback.Run(value);
-  });
-
-  bool async_echo_response_dispatched = false;
-  base::RunLoop run_loop;
-  ptr->AsyncEcho(
-      123,
-      BindAsyncEchoCallback(
-         [&async_echo_response_dispatched, &run_loop](int32_t result) {
-           async_echo_response_dispatched = true;
-           EXPECT_EQ(123, result);
-           run_loop.Quit();
-         }));
-
-  impl.set_echo_handler([&async_echo_request_dispatched](
-      int32_t value, const TestSync::EchoCallback& callback) {
-    // Although the AsyncEcho request is sent before the Echo request, it
-    // shouldn't be dispatched yet at this point, because there is an ongoing
-    // sync call on the same thread.
-    EXPECT_FALSE(async_echo_request_dispatched);
-    callback.Run(value);
-  });
-
-  int32_t result_value = -1;
-  ASSERT_TRUE(ptr->Echo(456, &result_value));
-  EXPECT_EQ(456, result_value);
-
-  // Although the AsyncEcho request is sent before the Echo request, it
-  // shouldn't be dispatched yet.
-  EXPECT_FALSE(async_echo_request_dispatched);
-
-  // Run until the AsyncEcho response is dispatched.
-  run_loop.Run();
-
-  EXPECT_TRUE(async_echo_response_dispatched);
-}
-
-TYPED_TEST(SyncMethodCommonTest,
-           QueuedMessagesProcessedBeforeErrorNotification) {
-  // Test that while an interface pointer is waiting for the response to a sync
-  // call, async responses are queued. If the message pipe is disconnected
-  // before the queued messages are processed, the connection error
-  // notification is delayed until all the queued messages are processed.
-
-  // ThreadSafeInterfacePtr doesn't guarantee that messages are delivered before
-  // error notifications, so skip it for this test.
-  if (TypeParam::kIsThreadSafeInterfacePtrTest)
-    return;
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&ptr));
-
-  int32_t async_echo_request_value = -1;
-  TestSync::AsyncEchoCallback async_echo_request_callback;
-  base::RunLoop run_loop1;
-  impl.set_async_echo_handler(
-      [&async_echo_request_value, &async_echo_request_callback, &run_loop1](
-          int32_t value, const TestSync::AsyncEchoCallback& callback) {
-        async_echo_request_value = value;
-        async_echo_request_callback = callback;
-        run_loop1.Quit();
-      });
-
-  bool async_echo_response_dispatched = false;
-  bool connection_error_dispatched = false;
-  base::RunLoop run_loop2;
-  ptr->AsyncEcho(
-      123,
-      BindAsyncEchoCallback(
-          [&async_echo_response_dispatched, &connection_error_dispatched, &ptr,
-              &run_loop2](int32_t result) {
-            async_echo_response_dispatched = true;
-            // At this point, error notification should not be dispatched
-            // yet.
-            EXPECT_FALSE(connection_error_dispatched);
-            EXPECT_FALSE(ptr.encountered_error());
-            EXPECT_EQ(123, result);
-            run_loop2.Quit();
-          }));
-  // Run until the AsyncEcho request reaches the service side.
-  run_loop1.Run();
-
-  impl.set_echo_handler(
-      [&impl, &async_echo_request_value, &async_echo_request_callback](
-          int32_t value, const TestSync::EchoCallback& callback) {
-        // Send back the async response first.
-        EXPECT_FALSE(async_echo_request_callback.is_null());
-        async_echo_request_callback.Run(async_echo_request_value);
-
-        impl.binding()->Close();
-      });
-
-  base::RunLoop run_loop3;
-  ptr.set_connection_error_handler(
-      base::Bind(&SetFlagAndRunClosure, &connection_error_dispatched,
-                 run_loop3.QuitClosure()));
-
-  int32_t result_value = -1;
-  ASSERT_FALSE(ptr->Echo(456, &result_value));
-  EXPECT_EQ(-1, result_value);
-  ASSERT_FALSE(connection_error_dispatched);
-  EXPECT_FALSE(ptr.encountered_error());
-
-  // Although the AsyncEcho response arrives before the Echo response, it should
-  // be queued and not yet dispatched.
-  EXPECT_FALSE(async_echo_response_dispatched);
-
-  // Run until the AsyncEcho response is dispatched.
-  run_loop2.Run();
-
-  EXPECT_TRUE(async_echo_response_dispatched);
-
-  // Run until the error notification is dispatched.
-  run_loop3.Run();
-
-  ASSERT_TRUE(connection_error_dispatched);
-  EXPECT_TRUE(ptr.encountered_error());
-}
-
-TYPED_TEST(SyncMethodCommonTest, InvalidMessageDuringSyncCall) {
-  // Test that while an interface pointer is waiting for the response to a sync
-  // call, an invalid incoming message will disconnect the message pipe, cause
-  // the sync call to return false, and run the connection error handler
-  // asynchronously.
-
-  using Interface = typename TypeParam::Interface;
-  MessagePipe pipe;
-
-  InterfacePtr<Interface> interface_ptr;
-  interface_ptr.Bind(InterfacePtrInfo<Interface>(std::move(pipe.handle0), 0u));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  MessagePipeHandle raw_binding_handle = pipe.handle1.get();
-  ImplTypeFor<Interface> impl(MakeRequest<Interface>(std::move(pipe.handle1)));
-
-  impl.set_echo_handler([&raw_binding_handle](
-      int32_t value, const TestSync::EchoCallback& callback) {
-    // Write a 1-byte message, which is considered invalid.
-    char invalid_message = 0;
-    MojoResult result =
-        WriteMessageRaw(raw_binding_handle, &invalid_message, 1u, nullptr, 0u,
-                        MOJO_WRITE_MESSAGE_FLAG_NONE);
-    ASSERT_EQ(MOJO_RESULT_OK, result);
-    callback.Run(value);
-  });
-
-  bool connection_error_dispatched = false;
-  base::RunLoop run_loop;
-  // ThreadSafeInterfacePtr doesn't support setting connection error handlers.
-  if (!TypeParam::kIsThreadSafeInterfacePtrTest) {
-    ptr.set_connection_error_handler(base::Bind(&SetFlagAndRunClosure,
-                                                &connection_error_dispatched,
-                                                run_loop.QuitClosure()));
-  }
-
-  int32_t result_value = -1;
-  ASSERT_FALSE(ptr->Echo(456, &result_value));
-  EXPECT_EQ(-1, result_value);
-  ASSERT_FALSE(connection_error_dispatched);
-
-  if (!TypeParam::kIsThreadSafeInterfacePtrTest) {
-    run_loop.Run();
-    ASSERT_TRUE(connection_error_dispatched);
-  }
-}
-
-TEST_F(SyncMethodAssociatedTest, ReenteredBySyncMethodAssoBindingOfSameRouter) {
-  // Test that an interface pointer waiting for a sync call response can be
-  // reentered by an associated binding serving sync methods on the same thread.
-  // The associated binding belongs to the same MultiplexRouter as the waiting
-  // interface pointer.
-
-  TestSyncAssociatedImpl opposite_asso_impl(std::move(opposite_asso_request_));
-  TestSyncAssociatedPtr opposite_asso_ptr;
-  opposite_asso_ptr.Bind(std::move(opposite_asso_ptr_info_));
-
-  master_impl_->set_echo_handler([&opposite_asso_ptr](
-      int32_t value, const TestSyncMaster::EchoCallback& callback) {
-    int32_t result_value = -1;
-
-    ASSERT_TRUE(opposite_asso_ptr->Echo(123, &result_value));
-    EXPECT_EQ(123, result_value);
-    callback.Run(value);
-  });
-
-  int32_t result_value = -1;
-  ASSERT_TRUE(master_ptr_->Echo(456, &result_value));
-  EXPECT_EQ(456, result_value);
-}
-
-TEST_F(SyncMethodAssociatedTest,
-       ReenteredBySyncMethodAssoBindingOfDifferentRouter) {
-  // Test that an interface pointer waiting for a sync call response can be
-  // reentered by an associated binding serving sync methods on the same thread.
-  // The associated binding belongs to a different MultiplexRouter as the
-  // waiting interface pointer.
-
-  TestSyncAssociatedImpl asso_impl(std::move(asso_request_));
-  TestSyncAssociatedPtr asso_ptr;
-  asso_ptr.Bind(std::move(asso_ptr_info_));
-
-  master_impl_->set_echo_handler(
-      [&asso_ptr](int32_t value, const TestSyncMaster::EchoCallback& callback) {
-        int32_t result_value = -1;
-
-        ASSERT_TRUE(asso_ptr->Echo(123, &result_value));
-        EXPECT_EQ(123, result_value);
-        callback.Run(value);
-      });
-
-  int32_t result_value = -1;
-  ASSERT_TRUE(master_ptr_->Echo(456, &result_value));
-  EXPECT_EQ(456, result_value);
-}
-
-// TODO(yzshen): Add more tests related to associated interfaces.
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/test_native_types_blink.typemap b/mojo/public/cpp/bindings/tests/test_native_types_blink.typemap
deleted file mode 100644
index 1bdfbbc..0000000
--- a/mojo/public/cpp/bindings/tests/test_native_types_blink.typemap
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/public/interfaces/bindings/tests/test_native_types.mojom"
-public_headers = [ "//mojo/public/cpp/bindings/tests/pickled_types_blink.h" ]
-sources = [
-  "//mojo/public/cpp/bindings/tests/pickled_types_blink.cc",
-]
-deps = [
-  "//ipc",
-]
-
-type_mappings = [
-  "mojo.test.PickledEnum=mojo::test::PickledEnumBlink",
-  "mojo.test.PickledStruct=mojo::test::PickledStructBlink[move_only]",
-]
diff --git a/mojo/public/cpp/bindings/tests/test_native_types_chromium.typemap b/mojo/public/cpp/bindings/tests/test_native_types_chromium.typemap
deleted file mode 100644
index 50e8076..0000000
--- a/mojo/public/cpp/bindings/tests/test_native_types_chromium.typemap
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/public/interfaces/bindings/tests/test_native_types.mojom"
-public_headers = [ "//mojo/public/cpp/bindings/tests/pickled_types_chromium.h" ]
-sources = [
-  "//mojo/public/cpp/bindings/tests/pickled_types_chromium.cc",
-]
-deps = [
-  "//ipc",
-]
-
-type_mappings = [
-  "mojo.test.PickledEnum=mojo::test::PickledEnumChromium",
-  "mojo.test.PickledStruct=mojo::test::PickledStructChromium[move_only]",
-]
diff --git a/mojo/public/cpp/bindings/tests/type_conversion_unittest.cc b/mojo/public/cpp/bindings/tests/type_conversion_unittest.cc
deleted file mode 100644
index b0124aa..0000000
--- a/mojo/public/cpp/bindings/tests/type_conversion_unittest.cc
+++ /dev/null
@@ -1,161 +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.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-struct RedmondRect {
-  int32_t left;
-  int32_t top;
-  int32_t right;
-  int32_t bottom;
-};
-
-struct RedmondNamedRegion {
-  std::string name;
-  std::vector<RedmondRect> rects;
-};
-
-bool AreEqualRectArrays(const std::vector<test::RectPtr>& rects1,
-                        const std::vector<test::RectPtr>& rects2) {
-  if (rects1.size() != rects2.size())
-    return false;
-
-  for (size_t i = 0; i < rects1.size(); ++i) {
-    if (rects1[i]->x != rects2[i]->x || rects1[i]->y != rects2[i]->y ||
-        rects1[i]->width != rects2[i]->width ||
-        rects1[i]->height != rects2[i]->height) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-}  // namespace
-
-template <>
-struct TypeConverter<test::RectPtr, RedmondRect> {
-  static test::RectPtr Convert(const RedmondRect& input) {
-    return test::Rect::New(input.left, input.top, input.right - input.left,
-                           input.bottom - input.top);
-  }
-};
-
-template <>
-struct TypeConverter<RedmondRect, test::RectPtr> {
-  static RedmondRect Convert(const test::RectPtr& input) {
-    RedmondRect rect;
-    rect.left = input->x;
-    rect.top = input->y;
-    rect.right = input->x + input->width;
-    rect.bottom = input->y + input->height;
-    return rect;
-  }
-};
-
-template <>
-struct TypeConverter<test::NamedRegionPtr, RedmondNamedRegion> {
-  static test::NamedRegionPtr Convert(const RedmondNamedRegion& input) {
-    return test::NamedRegion::New(
-        input.name, ConvertTo<std::vector<test::RectPtr>>(input.rects));
-  }
-};
-
-template <>
-struct TypeConverter<RedmondNamedRegion, test::NamedRegionPtr> {
-  static RedmondNamedRegion Convert(const test::NamedRegionPtr& input) {
-    RedmondNamedRegion region;
-    if (input->name)
-      region.name = input->name.value();
-    if (input->rects) {
-      region.rects.reserve(input->rects->size());
-      for (const auto& element : *input->rects)
-        region.rects.push_back(element.To<RedmondRect>());
-    }
-    return region;
-  }
-};
-
-namespace test {
-namespace {
-
-TEST(TypeConversionTest, CustomTypeConverter) {
-  RectPtr rect(Rect::New(10, 20, 50, 45));
-
-  RedmondRect rr = rect.To<RedmondRect>();
-  EXPECT_EQ(10, rr.left);
-  EXPECT_EQ(20, rr.top);
-  EXPECT_EQ(60, rr.right);
-  EXPECT_EQ(65, rr.bottom);
-
-  RectPtr rect2(Rect::From(rr));
-  EXPECT_EQ(rect->x, rect2->x);
-  EXPECT_EQ(rect->y, rect2->y);
-  EXPECT_EQ(rect->width, rect2->width);
-  EXPECT_EQ(rect->height, rect2->height);
-}
-
-TEST(TypeConversionTest, CustomTypeConverter_Array_Null) {
-  std::vector<RectPtr> rects;
-
-  auto redmond_rects = ConvertTo<std::vector<RedmondRect>>(rects);
-
-  EXPECT_TRUE(redmond_rects.empty());
-}
-
-TEST(TypeConversionTest, CustomTypeConverter_Array) {
-  const RedmondRect kBase = {10, 20, 30, 40};
-
-  std::vector<RectPtr> rects(10);
-  for (size_t i = 0; i < rects.size(); ++i) {
-    RedmondRect rr = kBase;
-    rr.left += static_cast<int32_t>(i);
-    rr.top += static_cast<int32_t>(i);
-    rects[i] = Rect::From(rr);
-  }
-
-  auto redmond_rects = ConvertTo<std::vector<RedmondRect>>(rects);
-
-  auto rects2 = ConvertTo<std::vector<RectPtr>>(redmond_rects);
-  EXPECT_TRUE(AreEqualRectArrays(rects, rects2));
-}
-
-TEST(TypeConversionTest, CustomTypeConverter_Nested) {
-  RedmondNamedRegion redmond_region;
-  redmond_region.name = "foopy";
-
-  const RedmondRect kBase = {10, 20, 30, 40};
-
-  for (size_t i = 0; i < 10; ++i) {
-    RedmondRect rect = kBase;
-    rect.left += static_cast<int32_t>(i);
-    rect.top += static_cast<int32_t>(i);
-    redmond_region.rects.push_back(rect);
-  }
-
-  // Round-trip through generated struct and TypeConverter.
-
-  NamedRegionPtr copy = NamedRegion::From(redmond_region);
-  RedmondNamedRegion redmond_region2 = copy.To<RedmondNamedRegion>();
-
-  EXPECT_EQ(redmond_region.name, redmond_region2.name);
-  EXPECT_EQ(redmond_region.rects.size(), redmond_region2.rects.size());
-  for (size_t i = 0; i < redmond_region.rects.size(); ++i) {
-    EXPECT_EQ(redmond_region.rects[i].left, redmond_region2.rects[i].left);
-    EXPECT_EQ(redmond_region.rects[i].top, redmond_region2.rects[i].top);
-    EXPECT_EQ(redmond_region.rects[i].right, redmond_region2.rects[i].right);
-    EXPECT_EQ(redmond_region.rects[i].bottom, redmond_region2.rects[i].bottom);
-  }
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/union_unittest.cc b/mojo/public/cpp/bindings/tests/union_unittest.cc
deleted file mode 100644
index bdf27df..0000000
--- a/mojo/public/cpp/bindings/tests/union_unittest.cc
+++ /dev/null
@@ -1,1246 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-#include <utility>
-#include <vector>
-
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/test_support/test_utils.h"
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_unions.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-
-TEST(UnionTest, PlainOldDataGetterSetter) {
-  PodUnionPtr pod(PodUnion::New());
-
-  pod->set_f_int8(10);
-  EXPECT_EQ(10, pod->get_f_int8());
-  EXPECT_TRUE(pod->is_f_int8());
-  EXPECT_FALSE(pod->is_f_int8_other());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_INT8);
-
-  pod->set_f_uint8(11);
-  EXPECT_EQ(11, pod->get_f_uint8());
-  EXPECT_TRUE(pod->is_f_uint8());
-  EXPECT_FALSE(pod->is_f_int8());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_UINT8);
-
-  pod->set_f_int16(12);
-  EXPECT_EQ(12, pod->get_f_int16());
-  EXPECT_TRUE(pod->is_f_int16());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_INT16);
-
-  pod->set_f_uint16(13);
-  EXPECT_EQ(13, pod->get_f_uint16());
-  EXPECT_TRUE(pod->is_f_uint16());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_UINT16);
-
-  pod->set_f_int32(14);
-  EXPECT_EQ(14, pod->get_f_int32());
-  EXPECT_TRUE(pod->is_f_int32());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_INT32);
-
-  pod->set_f_uint32(static_cast<uint32_t>(15));
-  EXPECT_EQ(static_cast<uint32_t>(15), pod->get_f_uint32());
-  EXPECT_TRUE(pod->is_f_uint32());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_UINT32);
-
-  pod->set_f_int64(16);
-  EXPECT_EQ(16, pod->get_f_int64());
-  EXPECT_TRUE(pod->is_f_int64());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_INT64);
-
-  pod->set_f_uint64(static_cast<uint64_t>(17));
-  EXPECT_EQ(static_cast<uint64_t>(17), pod->get_f_uint64());
-  EXPECT_TRUE(pod->is_f_uint64());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_UINT64);
-
-  pod->set_f_float(1.5);
-  EXPECT_EQ(1.5, pod->get_f_float());
-  EXPECT_TRUE(pod->is_f_float());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_FLOAT);
-
-  pod->set_f_double(1.9);
-  EXPECT_EQ(1.9, pod->get_f_double());
-  EXPECT_TRUE(pod->is_f_double());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_DOUBLE);
-
-  pod->set_f_bool(true);
-  EXPECT_TRUE(pod->get_f_bool());
-  pod->set_f_bool(false);
-  EXPECT_FALSE(pod->get_f_bool());
-  EXPECT_TRUE(pod->is_f_bool());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_BOOL);
-
-  pod->set_f_enum(AnEnum::SECOND);
-  EXPECT_EQ(AnEnum::SECOND, pod->get_f_enum());
-  EXPECT_TRUE(pod->is_f_enum());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_ENUM);
-}
-
-TEST(UnionTest, PodEquals) {
-  PodUnionPtr pod1(PodUnion::New());
-  PodUnionPtr pod2(PodUnion::New());
-
-  pod1->set_f_int8(10);
-  pod2->set_f_int8(10);
-  EXPECT_TRUE(pod1.Equals(pod2));
-
-  pod2->set_f_int8(11);
-  EXPECT_FALSE(pod1.Equals(pod2));
-
-  pod2->set_f_int8_other(10);
-  EXPECT_FALSE(pod1.Equals(pod2));
-}
-
-TEST(UnionTest, PodClone) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int8(10);
-
-  PodUnionPtr pod_clone = pod.Clone();
-  EXPECT_EQ(10, pod_clone->get_f_int8());
-  EXPECT_TRUE(pod_clone->is_f_int8());
-  EXPECT_EQ(pod_clone->which(), PodUnion::Tag::F_INT8);
-}
-
-TEST(UnionTest, PodSerialization) {
-  PodUnionPtr pod1(PodUnion::New());
-  pod1->set_f_int8(10);
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<PodUnionDataView>(
-      pod1, false, &context);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod1, &buf, &data, false,
-                                              &context);
-
-  PodUnionPtr pod2;
-  mojo::internal::Deserialize<PodUnionDataView>(data, &pod2, &context);
-
-  EXPECT_EQ(10, pod2->get_f_int8());
-  EXPECT_TRUE(pod2->is_f_int8());
-  EXPECT_EQ(pod2->which(), PodUnion::Tag::F_INT8);
-}
-
-TEST(UnionTest, EnumSerialization) {
-  PodUnionPtr pod1(PodUnion::New());
-  pod1->set_f_enum(AnEnum::SECOND);
-
-  size_t size = mojo::internal::PrepareToSerialize<PodUnionDataView>(
-      pod1, false, nullptr);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod1, &buf, &data, false,
-                                              nullptr);
-
-  PodUnionPtr pod2;
-  mojo::internal::Deserialize<PodUnionDataView>(data, &pod2, nullptr);
-
-  EXPECT_EQ(AnEnum::SECOND, pod2->get_f_enum());
-  EXPECT_TRUE(pod2->is_f_enum());
-  EXPECT_EQ(pod2->which(), PodUnion::Tag::F_ENUM);
-}
-
-TEST(UnionTest, PodValidation) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int8(10);
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<PodUnionDataView>(pod, false, nullptr);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod, &buf, &data, false, nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(
-      internal::PodUnion_Data::Validate(raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, SerializeNotNull) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int8(0);
-  size_t size =
-      mojo::internal::PrepareToSerialize<PodUnionDataView>(pod, false, nullptr);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod, &buf, &data, false, nullptr);
-  EXPECT_FALSE(data->is_null());
-}
-
-TEST(UnionTest, SerializeIsNullInlined) {
-  PodUnionPtr pod;
-  size_t size =
-      mojo::internal::PrepareToSerialize<PodUnionDataView>(pod, false, nullptr);
-  EXPECT_EQ(16U, size);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = internal::PodUnion_Data::New(&buf);
-
-  // Check that dirty output buffers are handled correctly by serialization.
-  data->size = 16U;
-  data->tag = PodUnion::Tag::F_UINT16;
-  data->data.f_f_int16 = 20;
-
-  mojo::internal::Serialize<PodUnionDataView>(pod, &buf, &data, true, nullptr);
-  EXPECT_TRUE(data->is_null());
-
-  PodUnionPtr pod2;
-  mojo::internal::Deserialize<PodUnionDataView>(data, &pod2, nullptr);
-  EXPECT_TRUE(pod2.is_null());
-}
-
-TEST(UnionTest, SerializeIsNullNotInlined) {
-  PodUnionPtr pod;
-  size_t size =
-      mojo::internal::PrepareToSerialize<PodUnionDataView>(pod, false, nullptr);
-  EXPECT_EQ(16U, size);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod, &buf, &data, false, nullptr);
-  EXPECT_EQ(nullptr, data);
-}
-
-TEST(UnionTest, NullValidation) {
-  void* buf = nullptr;
-  mojo::internal::ValidationContext validation_context(buf, 0, 0, 0);
-  EXPECT_TRUE(internal::PodUnion_Data::Validate(
-      buf, &validation_context, false));
-}
-
-TEST(UnionTest, OutOfAlignmentValidation) {
-  size_t size = sizeof(internal::PodUnion_Data);
-  // Get an aligned object and shift the alignment.
-  mojo::internal::FixedBufferForTesting aligned_buf(size + 1);
-  void* raw_buf = aligned_buf.Leak();
-  char* buf = reinterpret_cast<char*>(raw_buf) + 1;
-
-  internal::PodUnion_Data* data =
-      reinterpret_cast<internal::PodUnion_Data*>(buf);
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_FALSE(internal::PodUnion_Data::Validate(
-      buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, OOBValidation) {
-  size_t size = sizeof(internal::PodUnion_Data) - 1;
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = internal::PodUnion_Data::New(&buf);
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  void* raw_buf = buf.Leak();
-  EXPECT_FALSE(
-      internal::PodUnion_Data::Validate(raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, UnknownTagValidation) {
-  size_t size = sizeof(internal::PodUnion_Data);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = internal::PodUnion_Data::New(&buf);
-  data->tag = static_cast<internal::PodUnion_Data::PodUnion_Tag>(0xFFFFFF);
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  void* raw_buf = buf.Leak();
-  EXPECT_FALSE(
-      internal::PodUnion_Data::Validate(raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, UnknownEnumValueValidation) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_enum(static_cast<AnEnum>(0xFFFF));
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<PodUnionDataView>(pod, false, nullptr);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod, &buf, &data, false, nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_FALSE(
-      internal::PodUnion_Data::Validate(raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, UnknownExtensibleEnumValueValidation) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_extensible_enum(static_cast<AnExtensibleEnum>(0xFFFF));
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<PodUnionDataView>(pod, false, nullptr);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod, &buf, &data, false, nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(
-      internal::PodUnion_Data::Validate(raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, StringGetterSetter) {
-  ObjectUnionPtr pod(ObjectUnion::New());
-
-  std::string hello("hello world");
-  pod->set_f_string(hello);
-  EXPECT_EQ(hello, pod->get_f_string());
-  EXPECT_TRUE(pod->is_f_string());
-  EXPECT_EQ(pod->which(), ObjectUnion::Tag::F_STRING);
-}
-
-TEST(UnionTest, StringEquals) {
-  ObjectUnionPtr pod1(ObjectUnion::New());
-  ObjectUnionPtr pod2(ObjectUnion::New());
-
-  pod1->set_f_string("hello world");
-  pod2->set_f_string("hello world");
-  EXPECT_TRUE(pod1.Equals(pod2));
-
-  pod2->set_f_string("hello universe");
-  EXPECT_FALSE(pod1.Equals(pod2));
-}
-
-TEST(UnionTest, StringClone) {
-  ObjectUnionPtr pod(ObjectUnion::New());
-
-  std::string hello("hello world");
-  pod->set_f_string(hello);
-  ObjectUnionPtr pod_clone = pod.Clone();
-  EXPECT_EQ(hello, pod_clone->get_f_string());
-  EXPECT_TRUE(pod_clone->is_f_string());
-  EXPECT_EQ(pod_clone->which(), ObjectUnion::Tag::F_STRING);
-}
-
-TEST(UnionTest, StringSerialization) {
-  ObjectUnionPtr pod1(ObjectUnion::New());
-
-  std::string hello("hello world");
-  pod1->set_f_string(hello);
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      pod1, false, nullptr);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(pod1, &buf, &data, false,
-                                                 nullptr);
-
-  ObjectUnionPtr pod2;
-  mojo::internal::Deserialize<ObjectUnionDataView>(data, &pod2, nullptr);
-  EXPECT_EQ(hello, pod2->get_f_string());
-  EXPECT_TRUE(pod2->is_f_string());
-  EXPECT_EQ(pod2->which(), ObjectUnion::Tag::F_STRING);
-}
-
-TEST(UnionTest, NullStringValidation) {
-  size_t size = sizeof(internal::ObjectUnion_Data);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf);
-  data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING;
-  data->data.unknown = 0x0;
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  void* raw_buf = buf.Leak();
-  EXPECT_FALSE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, StringPointerOverflowValidation) {
-  size_t size = sizeof(internal::ObjectUnion_Data);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf);
-  data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING;
-  data->data.unknown = 0xFFFFFFFFFFFFFFFF;
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  void* raw_buf = buf.Leak();
-  EXPECT_FALSE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, StringValidateOOB) {
-  size_t size = 32;
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf);
-  data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING;
-
-  data->data.f_f_string.offset = 8;
-  char* ptr = reinterpret_cast<char*>(&data->data.f_f_string);
-  mojo::internal::ArrayHeader* array_header =
-      reinterpret_cast<mojo::internal::ArrayHeader*>(ptr + *ptr);
-  array_header->num_bytes = 20;  // This should go out of bounds.
-  array_header->num_elements = 20;
-  mojo::internal::ValidationContext validation_context(data, 32, 0, 0);
-  void* raw_buf = buf.Leak();
-  EXPECT_FALSE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-// TODO(azani): Move back in array_unittest.cc when possible.
-// Array tests
-TEST(UnionTest, PodUnionInArray) {
-  SmallStructPtr small_struct(SmallStruct::New());
-  small_struct->pod_union_array.emplace(2);
-  small_struct->pod_union_array.value()[0] = PodUnion::New();
-  small_struct->pod_union_array.value()[1] = PodUnion::New();
-
-  small_struct->pod_union_array.value()[0]->set_f_int8(10);
-  small_struct->pod_union_array.value()[1]->set_f_int16(12);
-
-  EXPECT_EQ(10, small_struct->pod_union_array.value()[0]->get_f_int8());
-  EXPECT_EQ(12, small_struct->pod_union_array.value()[1]->get_f_int16());
-}
-
-TEST(UnionTest, PodUnionInArraySerialization) {
-  std::vector<PodUnionPtr> array(2);
-  array[0] = PodUnion::New();
-  array[1] = PodUnion::New();
-
-  array[0]->set_f_int8(10);
-  array[1]->set_f_int16(12);
-  EXPECT_EQ(2U, array.size());
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<ArrayDataView<PodUnionDataView>>(
-          array, nullptr);
-  EXPECT_EQ(40U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  mojo::internal::Array_Data<internal::PodUnion_Data>* data;
-  mojo::internal::ContainerValidateParams validate_params(0, false, nullptr);
-  mojo::internal::Serialize<ArrayDataView<PodUnionDataView>>(
-      array, &buf, &data, &validate_params, nullptr);
-
-  std::vector<PodUnionPtr> array2;
-  mojo::internal::Deserialize<ArrayDataView<PodUnionDataView>>(data, &array2,
-                                                               nullptr);
-
-  EXPECT_EQ(2U, array2.size());
-
-  EXPECT_EQ(10, array2[0]->get_f_int8());
-  EXPECT_EQ(12, array2[1]->get_f_int16());
-}
-
-TEST(UnionTest, PodUnionInArraySerializationWithNull) {
-  std::vector<PodUnionPtr> array(2);
-  array[0] = PodUnion::New();
-
-  array[0]->set_f_int8(10);
-  EXPECT_EQ(2U, array.size());
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<ArrayDataView<PodUnionDataView>>(
-          array, nullptr);
-  EXPECT_EQ(40U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  mojo::internal::Array_Data<internal::PodUnion_Data>* data;
-  mojo::internal::ContainerValidateParams validate_params(0, true, nullptr);
-  mojo::internal::Serialize<ArrayDataView<PodUnionDataView>>(
-      array, &buf, &data, &validate_params, nullptr);
-
-  std::vector<PodUnionPtr> array2;
-  mojo::internal::Deserialize<ArrayDataView<PodUnionDataView>>(data, &array2,
-                                                               nullptr);
-
-  EXPECT_EQ(2U, array2.size());
-
-  EXPECT_EQ(10, array2[0]->get_f_int8());
-  EXPECT_TRUE(array2[1].is_null());
-}
-
-TEST(UnionTest, ObjectUnionInArraySerialization) {
-  std::vector<ObjectUnionPtr> array(2);
-  array[0] = ObjectUnion::New();
-  array[1] = ObjectUnion::New();
-
-  array[0]->set_f_string("hello");
-  array[1]->set_f_string("world");
-  EXPECT_EQ(2U, array.size());
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<ArrayDataView<ObjectUnionDataView>>(
-          array, nullptr);
-  EXPECT_EQ(72U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-
-  mojo::internal::Array_Data<internal::ObjectUnion_Data>* data;
-  mojo::internal::ContainerValidateParams validate_params(0, false, nullptr);
-  mojo::internal::Serialize<ArrayDataView<ObjectUnionDataView>>(
-      array, &buf, &data, &validate_params, nullptr);
-
-  std::vector<char> new_buf;
-  new_buf.resize(size);
-
-  void* raw_buf = buf.Leak();
-  memcpy(new_buf.data(), raw_buf, size);
-  free(raw_buf);
-
-  data =
-      reinterpret_cast<mojo::internal::Array_Data<internal::ObjectUnion_Data>*>(
-          new_buf.data());
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  ASSERT_TRUE(mojo::internal::Array_Data<internal::ObjectUnion_Data>::Validate(
-      data, &validation_context, &validate_params));
-
-  std::vector<ObjectUnionPtr> array2;
-  mojo::internal::Deserialize<ArrayDataView<ObjectUnionDataView>>(data, &array2,
-                                                                  nullptr);
-
-  EXPECT_EQ(2U, array2.size());
-
-  EXPECT_EQ("hello", array2[0]->get_f_string());
-  EXPECT_EQ("world", array2[1]->get_f_string());
-}
-
-// TODO(azani): Move back in struct_unittest.cc when possible.
-// Struct tests
-TEST(UnionTest, Clone_Union) {
-  SmallStructPtr small_struct(SmallStruct::New());
-  small_struct->pod_union = PodUnion::New();
-  small_struct->pod_union->set_f_int8(10);
-
-  SmallStructPtr clone = small_struct.Clone();
-  EXPECT_EQ(10, clone->pod_union->get_f_int8());
-}
-
-// Serialization test of a struct with a union of plain old data.
-TEST(UnionTest, Serialization_UnionOfPods) {
-  SmallStructPtr small_struct(SmallStruct::New());
-  small_struct->pod_union = PodUnion::New();
-  small_struct->pod_union->set_f_int32(10);
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<SmallStructDataView>(
-      small_struct, &context);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::SmallStruct_Data* data = nullptr;
-  mojo::internal::Serialize<SmallStructDataView>(small_struct, &buf, &data,
-                                                 &context);
-
-  SmallStructPtr deserialized;
-  mojo::internal::Deserialize<SmallStructDataView>(data, &deserialized,
-                                                   &context);
-
-  EXPECT_EQ(10, deserialized->pod_union->get_f_int32());
-}
-
-// Serialization test of a struct with a union of structs.
-TEST(UnionTest, Serialization_UnionOfObjects) {
-  SmallObjStructPtr obj_struct(SmallObjStruct::New());
-  obj_struct->obj_union = ObjectUnion::New();
-  std::string hello("hello world");
-  obj_struct->obj_union->set_f_string(hello);
-
-  size_t size = mojo::internal::PrepareToSerialize<SmallObjStructDataView>(
-      obj_struct, nullptr);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::SmallObjStruct_Data* data = nullptr;
-  mojo::internal::Serialize<SmallObjStructDataView>(obj_struct, &buf, &data,
-                                                    nullptr);
-
-  SmallObjStructPtr deserialized;
-  mojo::internal::Deserialize<SmallObjStructDataView>(data, &deserialized,
-                                                      nullptr);
-
-  EXPECT_EQ(hello, deserialized->obj_union->get_f_string());
-}
-
-// Validation test of a struct with a union.
-TEST(UnionTest, Validation_UnionsInStruct) {
-  SmallStructPtr small_struct(SmallStruct::New());
-  small_struct->pod_union = PodUnion::New();
-  small_struct->pod_union->set_f_int32(10);
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<SmallStructDataView>(
-      small_struct, &context);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::SmallStruct_Data* data = nullptr;
-  mojo::internal::Serialize<SmallStructDataView>(small_struct, &buf, &data,
-                                                 &context);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(internal::SmallStruct_Data::Validate(
-      raw_buf, &validation_context));
-  free(raw_buf);
-}
-
-// Validation test of a struct union fails due to unknown union tag.
-TEST(UnionTest, Validation_PodUnionInStruct_Failure) {
-  SmallStructPtr small_struct(SmallStruct::New());
-  small_struct->pod_union = PodUnion::New();
-  small_struct->pod_union->set_f_int32(10);
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<SmallStructDataView>(
-      small_struct, &context);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::SmallStruct_Data* data = nullptr;
-  mojo::internal::Serialize<SmallStructDataView>(small_struct, &buf, &data,
-                                                 &context);
-  data->pod_union.tag = static_cast<internal::PodUnion_Data::PodUnion_Tag>(100);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_FALSE(internal::SmallStruct_Data::Validate(
-      raw_buf, &validation_context));
-  free(raw_buf);
-}
-
-// Validation fails due to non-nullable null union in struct.
-TEST(UnionTest, Validation_NullUnion_Failure) {
-  SmallStructNonNullableUnionPtr small_struct(
-      SmallStructNonNullableUnion::New());
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<SmallStructNonNullableUnionDataView>(
-          small_struct, nullptr);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::SmallStructNonNullableUnion_Data* data =
-      internal::SmallStructNonNullableUnion_Data::New(&buf);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_FALSE(internal::SmallStructNonNullableUnion_Data::Validate(
-      raw_buf, &validation_context));
-  free(raw_buf);
-}
-
-// Validation passes with nullable null union.
-TEST(UnionTest, Validation_NullableUnion) {
-  SmallStructPtr small_struct(SmallStruct::New());
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<SmallStructDataView>(
-      small_struct, &context);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::SmallStruct_Data* data = nullptr;
-  mojo::internal::Serialize<SmallStructDataView>(small_struct, &buf, &data,
-                                                 &context);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(internal::SmallStruct_Data::Validate(
-      raw_buf, &validation_context));
-  free(raw_buf);
-}
-
-// TODO(azani): Move back in map_unittest.cc when possible.
-// Map Tests
-TEST(UnionTest, PodUnionInMap) {
-  SmallStructPtr small_struct(SmallStruct::New());
-  small_struct->pod_union_map.emplace();
-  small_struct->pod_union_map.value()["one"] = PodUnion::New();
-  small_struct->pod_union_map.value()["two"] = PodUnion::New();
-
-  small_struct->pod_union_map.value()["one"]->set_f_int8(8);
-  small_struct->pod_union_map.value()["two"]->set_f_int16(16);
-
-  EXPECT_EQ(8, small_struct->pod_union_map.value()["one"]->get_f_int8());
-  EXPECT_EQ(16, small_struct->pod_union_map.value()["two"]->get_f_int16());
-}
-
-TEST(UnionTest, PodUnionInMapSerialization) {
-  using MojomType = MapDataView<StringDataView, PodUnionDataView>;
-
-  std::unordered_map<std::string, PodUnionPtr> map;
-  map.insert(std::make_pair("one", PodUnion::New()));
-  map.insert(std::make_pair("two", PodUnion::New()));
-
-  map["one"]->set_f_int8(8);
-  map["two"]->set_f_int16(16);
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<MojomType>(map, &context);
-  EXPECT_EQ(120U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-
-  typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-  mojo::internal::ContainerValidateParams validate_params(
-      new mojo::internal::ContainerValidateParams(0, false, nullptr),
-      new mojo::internal::ContainerValidateParams(0, false, nullptr));
-  mojo::internal::Serialize<MojomType>(map, &buf, &data, &validate_params,
-                                       &context);
-
-  std::unordered_map<std::string, PodUnionPtr> map2;
-  mojo::internal::Deserialize<MojomType>(data, &map2, &context);
-
-  EXPECT_EQ(8, map2["one"]->get_f_int8());
-  EXPECT_EQ(16, map2["two"]->get_f_int16());
-}
-
-TEST(UnionTest, PodUnionInMapSerializationWithNull) {
-  using MojomType = MapDataView<StringDataView, PodUnionDataView>;
-
-  std::unordered_map<std::string, PodUnionPtr> map;
-  map.insert(std::make_pair("one", PodUnion::New()));
-  map.insert(std::make_pair("two", nullptr));
-
-  map["one"]->set_f_int8(8);
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<MojomType>(map, &context);
-  EXPECT_EQ(120U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-  mojo::internal::ContainerValidateParams validate_params(
-      new mojo::internal::ContainerValidateParams(0, false, nullptr),
-      new mojo::internal::ContainerValidateParams(0, true, nullptr));
-  mojo::internal::Serialize<MojomType>(map, &buf, &data, &validate_params,
-                                       &context);
-
-  std::unordered_map<std::string, PodUnionPtr> map2;
-  mojo::internal::Deserialize<MojomType>(data, &map2, &context);
-
-  EXPECT_EQ(8, map2["one"]->get_f_int8());
-  EXPECT_TRUE(map2["two"].is_null());
-}
-
-TEST(UnionTest, StructInUnionGetterSetterPasser) {
-  DummyStructPtr dummy(DummyStruct::New());
-  dummy->f_int8 = 8;
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_dummy(std::move(dummy));
-
-  EXPECT_EQ(8, obj->get_f_dummy()->f_int8);
-}
-
-TEST(UnionTest, StructInUnionSerialization) {
-  DummyStructPtr dummy(DummyStruct::New());
-  dummy->f_int8 = 8;
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_dummy(std::move(dummy));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-  EXPECT_EQ(32U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  ObjectUnionPtr obj2;
-  mojo::internal::Deserialize<ObjectUnionDataView>(data, &obj2, nullptr);
-  EXPECT_EQ(8, obj2->get_f_dummy()->f_int8);
-}
-
-TEST(UnionTest, StructInUnionValidation) {
-  DummyStructPtr dummy(DummyStruct::New());
-  dummy->f_int8 = 8;
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_dummy(std::move(dummy));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, StructInUnionValidationNonNullable) {
-  mojo::internal::SerializationWarningObserverForTesting suppress_warning;
-
-  DummyStructPtr dummy(nullptr);
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_dummy(std::move(dummy));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_FALSE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, StructInUnionValidationNullable) {
-  DummyStructPtr dummy(nullptr);
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_nullable(std::move(dummy));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, ArrayInUnionGetterSetter) {
-  std::vector<int8_t> array(2);
-  array[0] = 8;
-  array[1] = 9;
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_array_int8(std::move(array));
-
-  EXPECT_EQ(8, obj->get_f_array_int8()[0]);
-  EXPECT_EQ(9, obj->get_f_array_int8()[1]);
-}
-
-TEST(UnionTest, ArrayInUnionSerialization) {
-  std::vector<int8_t> array(2);
-  array[0] = 8;
-  array[1] = 9;
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_array_int8(std::move(array));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-  EXPECT_EQ(32U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  ObjectUnionPtr obj2;
-  mojo::internal::Deserialize<ObjectUnionDataView>(data, &obj2, nullptr);
-
-  EXPECT_EQ(8, obj2->get_f_array_int8()[0]);
-  EXPECT_EQ(9, obj2->get_f_array_int8()[1]);
-}
-
-TEST(UnionTest, ArrayInUnionValidation) {
-  std::vector<int8_t> array(2);
-  array[0] = 8;
-  array[1] = 9;
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_array_int8(std::move(array));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-
-  EXPECT_TRUE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, MapInUnionGetterSetter) {
-  std::unordered_map<std::string, int8_t> map;
-  map.insert({"one", 1});
-  map.insert({"two", 2});
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_map_int8(std::move(map));
-
-  EXPECT_EQ(1, obj->get_f_map_int8()["one"]);
-  EXPECT_EQ(2, obj->get_f_map_int8()["two"]);
-}
-
-TEST(UnionTest, MapInUnionSerialization) {
-  std::unordered_map<std::string, int8_t> map;
-  map.insert({"one", 1});
-  map.insert({"two", 2});
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_map_int8(std::move(map));
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, &context);
-  EXPECT_EQ(112U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 &context);
-
-  ObjectUnionPtr obj2;
-  mojo::internal::Deserialize<ObjectUnionDataView>(data, &obj2, &context);
-
-  EXPECT_EQ(1, obj2->get_f_map_int8()["one"]);
-  EXPECT_EQ(2, obj2->get_f_map_int8()["two"]);
-}
-
-TEST(UnionTest, MapInUnionValidation) {
-  std::unordered_map<std::string, int8_t> map;
-  map.insert({"one", 1});
-  map.insert({"two", 2});
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_map_int8(std::move(map));
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, &context);
-  EXPECT_EQ(112U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 &context);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-
-  EXPECT_TRUE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, UnionInUnionGetterSetter) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int8(10);
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_pod_union(std::move(pod));
-
-  EXPECT_EQ(10, obj->get_f_pod_union()->get_f_int8());
-}
-
-TEST(UnionTest, UnionInUnionSerialization) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int8(10);
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_pod_union(std::move(pod));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-  EXPECT_EQ(32U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  ObjectUnionPtr obj2;
-  mojo::internal::Deserialize<ObjectUnionDataView>(data, &obj2, nullptr);
-  EXPECT_EQ(10, obj2->get_f_pod_union()->get_f_int8());
-}
-
-TEST(UnionTest, UnionInUnionValidation) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int8(10);
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_pod_union(std::move(pod));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-  EXPECT_EQ(32U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, UnionInUnionValidationNonNullable) {
-  mojo::internal::SerializationWarningObserverForTesting suppress_warning;
-
-  PodUnionPtr pod(nullptr);
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_pod_union(std::move(pod));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_FALSE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, HandleInUnionGetterSetter) {
-  ScopedMessagePipeHandle pipe0;
-  ScopedMessagePipeHandle pipe1;
-
-  CreateMessagePipe(nullptr, &pipe0, &pipe1);
-
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_message_pipe(std::move(pipe1));
-
-  std::string golden("hello world");
-  WriteTextMessage(pipe0.get(), golden);
-
-  std::string actual;
-  ReadTextMessage(handle->get_f_message_pipe().get(), &actual);
-
-  EXPECT_EQ(golden, actual);
-}
-
-TEST(UnionTest, HandleInUnionSerialization) {
-  ScopedMessagePipeHandle pipe0;
-  ScopedMessagePipeHandle pipe1;
-
-  CreateMessagePipe(nullptr, &pipe0, &pipe1);
-
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_message_pipe(std::move(pipe1));
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<HandleUnionDataView>(
-      handle, false, &context);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::HandleUnion_Data* data = nullptr;
-  mojo::internal::Serialize<HandleUnionDataView>(handle, &buf, &data, false,
-                                                 &context);
-  EXPECT_EQ(1U, context.handles.size());
-
-  HandleUnionPtr handle2(HandleUnion::New());
-  mojo::internal::Deserialize<HandleUnionDataView>(data, &handle2, &context);
-
-  std::string golden("hello world");
-  WriteTextMessage(pipe0.get(), golden);
-
-  std::string actual;
-  ReadTextMessage(handle2->get_f_message_pipe().get(), &actual);
-
-  EXPECT_EQ(golden, actual);
-}
-
-TEST(UnionTest, HandleInUnionValidation) {
-  ScopedMessagePipeHandle pipe0;
-  ScopedMessagePipeHandle pipe1;
-
-  CreateMessagePipe(nullptr, &pipe0, &pipe1);
-
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_message_pipe(std::move(pipe1));
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<HandleUnionDataView>(
-      handle, false, &context);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::HandleUnion_Data* data = nullptr;
-  mojo::internal::Serialize<HandleUnionDataView>(handle, &buf, &data, false,
-                                                 &context);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 1, 0);
-  EXPECT_TRUE(internal::HandleUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, HandleInUnionValidationNull) {
-  mojo::internal::SerializationWarningObserverForTesting suppress_warning;
-
-  ScopedMessagePipeHandle pipe;
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_message_pipe(std::move(pipe));
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<HandleUnionDataView>(
-      handle, false, &context);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::HandleUnion_Data* data = nullptr;
-  mojo::internal::Serialize<HandleUnionDataView>(handle, &buf, &data, false,
-                                                 &context);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 1, 0);
-  EXPECT_FALSE(internal::HandleUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-class SmallCacheImpl : public SmallCache {
- public:
-  explicit SmallCacheImpl(const base::Closure& closure)
-      : int_value_(0), closure_(closure) {}
-  ~SmallCacheImpl() override {}
-  int64_t int_value() const { return int_value_; }
-
- private:
-  void SetIntValue(int64_t int_value) override {
-    int_value_ = int_value;
-    closure_.Run();
-  }
-  void GetIntValue(const GetIntValueCallback& callback) override {
-    callback.Run(int_value_);
-  }
-
-  int64_t int_value_;
-  base::Closure closure_;
-};
-
-TEST(UnionTest, InterfaceInUnion) {
-  base::MessageLoop message_loop;
-  base::RunLoop run_loop;
-  SmallCacheImpl impl(run_loop.QuitClosure());
-  SmallCachePtr ptr;
-  Binding<SmallCache> bindings(&impl, MakeRequest(&ptr));
-
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_small_cache(std::move(ptr));
-
-  handle->get_f_small_cache()->SetIntValue(10);
-  run_loop.Run();
-  EXPECT_EQ(10, impl.int_value());
-}
-
-TEST(UnionTest, InterfaceInUnionSerialization) {
-  base::MessageLoop message_loop;
-  base::RunLoop run_loop;
-  SmallCacheImpl impl(run_loop.QuitClosure());
-  SmallCachePtr ptr;
-  Binding<SmallCache> bindings(&impl, MakeRequest(&ptr));
-
-  mojo::internal::SerializationContext context;
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_small_cache(std::move(ptr));
-  size_t size = mojo::internal::PrepareToSerialize<HandleUnionDataView>(
-      handle, false, &context);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::HandleUnion_Data* data = nullptr;
-  mojo::internal::Serialize<HandleUnionDataView>(handle, &buf, &data, false,
-                                                 &context);
-  EXPECT_EQ(1U, context.handles.size());
-
-  HandleUnionPtr handle2(HandleUnion::New());
-  mojo::internal::Deserialize<HandleUnionDataView>(data, &handle2, &context);
-
-  handle2->get_f_small_cache()->SetIntValue(10);
-  run_loop.Run();
-  EXPECT_EQ(10, impl.int_value());
-}
-
-class UnionInterfaceImpl : public UnionInterface {
- public:
-  UnionInterfaceImpl() {}
-  ~UnionInterfaceImpl() override {}
-
- private:
-  void Echo(PodUnionPtr in, const EchoCallback& callback) override {
-    callback.Run(std::move(in));
-  }
-};
-
-void ExpectInt16(int16_t value, PodUnionPtr out) {
-  EXPECT_EQ(value, out->get_f_int16());
-}
-
-TEST(UnionTest, UnionInInterface) {
-  base::MessageLoop message_loop;
-  UnionInterfaceImpl impl;
-  UnionInterfacePtr ptr;
-  Binding<UnionInterface> bindings(&impl, MakeRequest(&ptr));
-
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int16(16);
-
-  ptr->Echo(std::move(pod), base::Bind(&ExpectInt16, 16));
-  base::RunLoop().RunUntilIdle();
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/validation_context_unittest.cc b/mojo/public/cpp/bindings/tests/validation_context_unittest.cc
deleted file mode 100644
index 9ce9d60..0000000
--- a/mojo/public/cpp/bindings/tests/validation_context_unittest.cc
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/system/core.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-using Handle_Data = mojo::internal::Handle_Data;
-using AssociatedEndpointHandle_Data =
-    mojo::internal::AssociatedEndpointHandle_Data;
-
-const void* ToPtr(uintptr_t ptr) {
-  return reinterpret_cast<const void*>(ptr);
-}
-
-#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
-TEST(ValidationContextTest, ConstructorRangeOverflow) {
-  {
-    // Test memory range overflow.
-    internal::ValidationContext context(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 3000), 5000, 0, 0);
-
-    EXPECT_FALSE(context.IsValidRange(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 3000), 1));
-    EXPECT_FALSE(context.ClaimMemory(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 3000), 1));
-  }
-
-  if (sizeof(size_t) <= sizeof(uint32_t))
-    return;
-
-  {
-    // Test handle index range overflow.
-    size_t num_handles =
-        static_cast<size_t>(std::numeric_limits<uint32_t>::max()) + 5;
-    internal::ValidationContext context(ToPtr(0), 0, num_handles, 0);
-
-    EXPECT_FALSE(context.ClaimHandle(Handle_Data(0)));
-    EXPECT_FALSE(context.ClaimHandle(
-        Handle_Data(std::numeric_limits<uint32_t>::max() - 1)));
-
-    EXPECT_TRUE(context.ClaimHandle(
-        Handle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-
-  {
-    size_t num_associated_endpoint_handles =
-        static_cast<size_t>(std::numeric_limits<uint32_t>::max()) + 5;
-    internal::ValidationContext context(ToPtr(0), 0, 0,
-                                        num_associated_endpoint_handles);
-
-    EXPECT_FALSE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(0)));
-    EXPECT_FALSE(
-        context.ClaimAssociatedEndpointHandle(AssociatedEndpointHandle_Data(
-            std::numeric_limits<uint32_t>::max() - 1)));
-
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-}
-#endif
-
-TEST(ValidationContextTest, IsValidRange) {
-  {
-    internal::ValidationContext context(ToPtr(1234), 100, 0, 0);
-
-    // Basics.
-    EXPECT_FALSE(context.IsValidRange(ToPtr(100), 5));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1230), 50));
-    EXPECT_TRUE(context.IsValidRange(ToPtr(1234), 5));
-    EXPECT_TRUE(context.IsValidRange(ToPtr(1240), 50));
-    EXPECT_TRUE(context.IsValidRange(ToPtr(1234), 100));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1234), 101));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1240), 100));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1333), 5));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(2234), 5));
-
-    // ClaimMemory() updates the valid range.
-    EXPECT_TRUE(context.ClaimMemory(ToPtr(1254), 10));
-
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1234), 1));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1254), 10));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1263), 1));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1263), 10));
-    EXPECT_TRUE(context.IsValidRange(ToPtr(1264), 10));
-    EXPECT_TRUE(context.IsValidRange(ToPtr(1264), 70));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1264), 71));
-  }
-
-  {
-    internal::ValidationContext context(ToPtr(1234), 100, 0, 0);
-    // Should return false for empty ranges.
-    EXPECT_FALSE(context.IsValidRange(ToPtr(0), 0));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1200), 0));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1234), 0));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1240), 0));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(2234), 0));
-  }
-
-  {
-    // The valid memory range is empty.
-    internal::ValidationContext context(ToPtr(1234), 0, 0, 0);
-
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1234), 1));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1234), 0));
-  }
-
-  {
-    internal::ValidationContext context(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 2000), 1000, 0, 0);
-
-    // Test overflow.
-    EXPECT_FALSE(context.IsValidRange(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 1500), 4000));
-    EXPECT_FALSE(context.IsValidRange(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 1500),
-        std::numeric_limits<uint32_t>::max()));
-
-    // This should be fine.
-    EXPECT_TRUE(context.IsValidRange(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 1500), 200));
-  }
-}
-
-TEST(ValidationContextTest, ClaimHandle) {
-  {
-    internal::ValidationContext context(ToPtr(0), 0, 10, 0);
-
-    // Basics.
-    EXPECT_TRUE(context.ClaimHandle(Handle_Data(0)));
-    EXPECT_FALSE(context.ClaimHandle(Handle_Data(0)));
-
-    EXPECT_TRUE(context.ClaimHandle(Handle_Data(9)));
-    EXPECT_FALSE(context.ClaimHandle(Handle_Data(10)));
-
-    // Should fail because it is smaller than the max index that has been
-    // claimed.
-    EXPECT_FALSE(context.ClaimHandle(Handle_Data(8)));
-
-    // Should return true for invalid handle.
-    EXPECT_TRUE(context.ClaimHandle(
-        Handle_Data(internal::kEncodedInvalidHandleValue)));
-    EXPECT_TRUE(context.ClaimHandle(
-        Handle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-
-  {
-    // No handle to claim.
-    internal::ValidationContext context(ToPtr(0), 0, 0, 0);
-
-    EXPECT_FALSE(context.ClaimHandle(Handle_Data(0)));
-
-    // Should still return true for invalid handle.
-    EXPECT_TRUE(context.ClaimHandle(
-        Handle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-
-  {
-    // Test the case that |num_handles| is the same value as
-    // |internal::kEncodedInvalidHandleValue|.
-    EXPECT_EQ(internal::kEncodedInvalidHandleValue,
-              std::numeric_limits<uint32_t>::max());
-    internal::ValidationContext context(
-        ToPtr(0), 0, std::numeric_limits<uint32_t>::max(), 0);
-
-    EXPECT_TRUE(context.ClaimHandle(
-        Handle_Data(std::numeric_limits<uint32_t>::max() - 1)));
-    EXPECT_FALSE(context.ClaimHandle(
-        Handle_Data(std::numeric_limits<uint32_t>::max() - 1)));
-    EXPECT_FALSE(context.ClaimHandle(Handle_Data(0)));
-
-    // Should still return true for invalid handle.
-    EXPECT_TRUE(context.ClaimHandle(
-        Handle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-}
-
-TEST(ValidationContextTest, ClaimAssociatedEndpointHandle) {
-  {
-    internal::ValidationContext context(ToPtr(0), 0, 0, 10);
-
-    // Basics.
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(0)));
-    EXPECT_FALSE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(0)));
-
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(9)));
-    EXPECT_FALSE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(10)));
-
-    // Should fail because it is smaller than the max index that has been
-    // claimed.
-    EXPECT_FALSE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(8)));
-
-    // Should return true for invalid handle.
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(internal::kEncodedInvalidHandleValue)));
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-
-  {
-    // No handle to claim.
-    internal::ValidationContext context(ToPtr(0), 0, 0, 0);
-
-    EXPECT_FALSE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(0)));
-
-    // Should still return true for invalid handle.
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-
-  {
-    // Test the case that |num_associated_endpoint_handles| is the same value as
-    // |internal::kEncodedInvalidHandleValue|.
-    EXPECT_EQ(internal::kEncodedInvalidHandleValue,
-              std::numeric_limits<uint32_t>::max());
-    internal::ValidationContext context(ToPtr(0), 0, 0,
-                                        std::numeric_limits<uint32_t>::max());
-
-    EXPECT_TRUE(
-        context.ClaimAssociatedEndpointHandle(AssociatedEndpointHandle_Data(
-            std::numeric_limits<uint32_t>::max() - 1)));
-    EXPECT_FALSE(
-        context.ClaimAssociatedEndpointHandle(AssociatedEndpointHandle_Data(
-            std::numeric_limits<uint32_t>::max() - 1)));
-    EXPECT_FALSE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(0)));
-
-    // Should still return true for invalid handle.
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-}
-
-TEST(ValidationContextTest, ClaimMemory) {
-  {
-    internal::ValidationContext context(ToPtr(1000), 2000, 0, 0);
-
-    // Basics.
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(500), 100));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(800), 300));
-    EXPECT_TRUE(context.ClaimMemory(ToPtr(1000), 100));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(1099), 100));
-    EXPECT_TRUE(context.ClaimMemory(ToPtr(1100), 200));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(2000), 1001));
-    EXPECT_TRUE(context.ClaimMemory(ToPtr(2000), 500));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(2000), 500));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(1400), 100));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(3000), 1));
-    EXPECT_TRUE(context.ClaimMemory(ToPtr(2500), 500));
-  }
-
-  {
-    // No memory to claim.
-    internal::ValidationContext context(ToPtr(10000), 0, 0, 0);
-
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(10000), 1));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(10000), 0));
-  }
-
-  {
-    internal::ValidationContext context(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 1000), 500, 0, 0);
-
-    // Test overflow.
-    EXPECT_FALSE(context.ClaimMemory(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 750), 4000));
-    EXPECT_FALSE(
-        context.ClaimMemory(ToPtr(std::numeric_limits<uintptr_t>::max() - 750),
-                            std::numeric_limits<uint32_t>::max()));
-
-    // This should be fine.
-    EXPECT_TRUE(context.ClaimMemory(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 750), 200));
-  }
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc b/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc
deleted file mode 100644
index f309737..0000000
--- a/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc
+++ /dev/null
@@ -1,412 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/tests/validation_test_input_parser.h"
-
-#include <assert.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <limits>
-#include <map>
-#include <set>
-#include <utility>
-
-#include "mojo/public/c/system/macros.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class ValidationTestInputParser {
- public:
-  ValidationTestInputParser(const std::string& input,
-                            std::vector<uint8_t>* data,
-                            size_t* num_handles,
-                            std::string* error_message);
-  ~ValidationTestInputParser();
-
-  bool Run();
-
- private:
-  struct DataType;
-
-  typedef std::pair<const char*, const char*> Range;
-
-  typedef bool (ValidationTestInputParser::*ParseDataFunc)(
-      const DataType& type,
-      const std::string& value_string);
-
-  struct DataType {
-    const char* name;
-    size_t name_size;
-    size_t data_size;
-    ParseDataFunc parse_data_func;
-  };
-
-  // A dist4/8 item that hasn't been matched with an anchr item.
-  struct PendingDistanceItem {
-    // Where this data item is located in |data_|.
-    size_t pos;
-    // Either 4 or 8 (bytes).
-    size_t data_size;
-  };
-
-  bool GetNextItem(Range* range);
-
-  bool ParseItem(const Range& range);
-
-  bool ParseUnsignedInteger(const DataType& type,
-                            const std::string& value_string);
-  bool ParseSignedInteger(const DataType& type,
-                          const std::string& value_string);
-  bool ParseFloat(const DataType& type, const std::string& value_string);
-  bool ParseDouble(const DataType& type, const std::string& value_string);
-  bool ParseBinarySequence(const DataType& type,
-                           const std::string& value_string);
-  bool ParseDistance(const DataType& type, const std::string& value_string);
-  bool ParseAnchor(const DataType& type, const std::string& value_string);
-  bool ParseHandles(const DataType& type, const std::string& value_string);
-
-  bool StartsWith(const Range& range, const char* prefix, size_t prefix_length);
-
-  bool ConvertToUnsignedInteger(const std::string& value_string,
-                                unsigned long long int* value);
-
-  template <typename T>
-  void AppendData(T data) {
-    size_t pos = data_->size();
-    data_->resize(pos + sizeof(T));
-    memcpy(&(*data_)[pos], &data, sizeof(T));
-  }
-
-  template <typename TargetType, typename InputType>
-  bool ConvertAndAppendData(InputType value) {
-    if (value > std::numeric_limits<TargetType>::max() ||
-        value < std::numeric_limits<TargetType>::min()) {
-      return false;
-    }
-    AppendData(static_cast<TargetType>(value));
-    return true;
-  }
-
-  template <typename TargetType, typename InputType>
-  bool ConvertAndFillData(size_t pos, InputType value) {
-    if (value > std::numeric_limits<TargetType>::max() ||
-        value < std::numeric_limits<TargetType>::min()) {
-      return false;
-    }
-    TargetType target_value = static_cast<TargetType>(value);
-    assert(pos + sizeof(TargetType) <= data_->size());
-    memcpy(&(*data_)[pos], &target_value, sizeof(TargetType));
-    return true;
-  }
-
-  static const DataType kDataTypes[];
-  static const size_t kDataTypeCount;
-
-  const std::string& input_;
-  size_t input_cursor_;
-
-  std::vector<uint8_t>* data_;
-  size_t* num_handles_;
-  std::string* error_message_;
-
-  std::map<std::string, PendingDistanceItem> pending_distance_items_;
-  std::set<std::string> anchors_;
-};
-
-#define DATA_TYPE(name, data_size, parse_data_func) \
-  { name, sizeof(name) - 1, data_size, parse_data_func }
-
-const ValidationTestInputParser::DataType
-    ValidationTestInputParser::kDataTypes[] = {
-        DATA_TYPE("[u1]", 1, &ValidationTestInputParser::ParseUnsignedInteger),
-        DATA_TYPE("[u2]", 2, &ValidationTestInputParser::ParseUnsignedInteger),
-        DATA_TYPE("[u4]", 4, &ValidationTestInputParser::ParseUnsignedInteger),
-        DATA_TYPE("[u8]", 8, &ValidationTestInputParser::ParseUnsignedInteger),
-        DATA_TYPE("[s1]", 1, &ValidationTestInputParser::ParseSignedInteger),
-        DATA_TYPE("[s2]", 2, &ValidationTestInputParser::ParseSignedInteger),
-        DATA_TYPE("[s4]", 4, &ValidationTestInputParser::ParseSignedInteger),
-        DATA_TYPE("[s8]", 8, &ValidationTestInputParser::ParseSignedInteger),
-        DATA_TYPE("[b]", 1, &ValidationTestInputParser::ParseBinarySequence),
-        DATA_TYPE("[f]", 4, &ValidationTestInputParser::ParseFloat),
-        DATA_TYPE("[d]", 8, &ValidationTestInputParser::ParseDouble),
-        DATA_TYPE("[dist4]", 4, &ValidationTestInputParser::ParseDistance),
-        DATA_TYPE("[dist8]", 8, &ValidationTestInputParser::ParseDistance),
-        DATA_TYPE("[anchr]", 0, &ValidationTestInputParser::ParseAnchor),
-        DATA_TYPE("[handles]", 0, &ValidationTestInputParser::ParseHandles)};
-
-const size_t ValidationTestInputParser::kDataTypeCount =
-    sizeof(ValidationTestInputParser::kDataTypes) /
-    sizeof(ValidationTestInputParser::kDataTypes[0]);
-
-ValidationTestInputParser::ValidationTestInputParser(const std::string& input,
-                                                     std::vector<uint8_t>* data,
-                                                     size_t* num_handles,
-                                                     std::string* error_message)
-    : input_(input),
-      input_cursor_(0),
-      data_(data),
-      num_handles_(num_handles),
-      error_message_(error_message) {
-  assert(data_);
-  assert(num_handles_);
-  assert(error_message_);
-  data_->clear();
-  *num_handles_ = 0;
-  error_message_->clear();
-}
-
-ValidationTestInputParser::~ValidationTestInputParser() {
-}
-
-bool ValidationTestInputParser::Run() {
-  Range range;
-  bool result = true;
-  while (result && GetNextItem(&range))
-    result = ParseItem(range);
-
-  if (!result) {
-    *error_message_ =
-        "Error occurred when parsing " + std::string(range.first, range.second);
-  } else if (!pending_distance_items_.empty()) {
-    // We have parsed all the contents in |input_| successfully, but there are
-    // unmatched dist4/8 items.
-    *error_message_ = "Error occurred when matching [dist4/8] and [anchr].";
-    result = false;
-  }
-  if (!result) {
-    data_->clear();
-    *num_handles_ = 0;
-  } else {
-    assert(error_message_->empty());
-  }
-
-  return result;
-}
-
-bool ValidationTestInputParser::GetNextItem(Range* range) {
-  const char kWhitespaceChars[] = " \t\n\r";
-  const char kItemDelimiters[] = " \t\n\r/";
-  const char kEndOfLineChars[] = "\n\r";
-  while (true) {
-    // Skip leading whitespaces.
-    // If there are no non-whitespace characters left, |input_cursor_| will be
-    // set to std::npos.
-    input_cursor_ = input_.find_first_not_of(kWhitespaceChars, input_cursor_);
-
-    if (input_cursor_ >= input_.size())
-      return false;
-
-    if (StartsWith(
-            Range(&input_[0] + input_cursor_, &input_[0] + input_.size()),
-            "//",
-            2)) {
-      // Skip contents until the end of the line.
-      input_cursor_ = input_.find_first_of(kEndOfLineChars, input_cursor_);
-    } else {
-      range->first = &input_[0] + input_cursor_;
-      input_cursor_ = input_.find_first_of(kItemDelimiters, input_cursor_);
-      range->second = input_cursor_ >= input_.size()
-                          ? &input_[0] + input_.size()
-                          : &input_[0] + input_cursor_;
-      return true;
-    }
-  }
-  return false;
-}
-
-bool ValidationTestInputParser::ParseItem(const Range& range) {
-  for (size_t i = 0; i < kDataTypeCount; ++i) {
-    if (StartsWith(range, kDataTypes[i].name, kDataTypes[i].name_size)) {
-      return (this->*kDataTypes[i].parse_data_func)(
-          kDataTypes[i],
-          std::string(range.first + kDataTypes[i].name_size, range.second));
-    }
-  }
-
-  // "[u1]" is optional.
-  return ParseUnsignedInteger(kDataTypes[0],
-                              std::string(range.first, range.second));
-}
-
-bool ValidationTestInputParser::ParseUnsignedInteger(
-    const DataType& type,
-    const std::string& value_string) {
-  unsigned long long int value;
-  if (!ConvertToUnsignedInteger(value_string, &value))
-    return false;
-
-  switch (type.data_size) {
-    case 1:
-      return ConvertAndAppendData<uint8_t>(value);
-    case 2:
-      return ConvertAndAppendData<uint16_t>(value);
-    case 4:
-      return ConvertAndAppendData<uint32_t>(value);
-    case 8:
-      return ConvertAndAppendData<uint64_t>(value);
-    default:
-      assert(false);
-      return false;
-  }
-}
-
-bool ValidationTestInputParser::ParseSignedInteger(
-    const DataType& type,
-    const std::string& value_string) {
-  long long int value;
-  if (sscanf(value_string.c_str(), "%lli", &value) != 1)
-    return false;
-
-  switch (type.data_size) {
-    case 1:
-      return ConvertAndAppendData<int8_t>(value);
-    case 2:
-      return ConvertAndAppendData<int16_t>(value);
-    case 4:
-      return ConvertAndAppendData<int32_t>(value);
-    case 8:
-      return ConvertAndAppendData<int64_t>(value);
-    default:
-      assert(false);
-      return false;
-  }
-}
-
-bool ValidationTestInputParser::ParseFloat(const DataType& type,
-                                           const std::string& value_string) {
-  static_assert(sizeof(float) == 4, "sizeof(float) is not 4");
-
-  float value;
-  if (sscanf(value_string.c_str(), "%f", &value) != 1)
-    return false;
-
-  AppendData(value);
-  return true;
-}
-
-bool ValidationTestInputParser::ParseDouble(const DataType& type,
-                                            const std::string& value_string) {
-  static_assert(sizeof(double) == 8, "sizeof(double) is not 8");
-
-  double value;
-  if (sscanf(value_string.c_str(), "%lf", &value) != 1)
-    return false;
-
-  AppendData(value);
-  return true;
-}
-
-bool ValidationTestInputParser::ParseBinarySequence(
-    const DataType& type,
-    const std::string& value_string) {
-  if (value_string.size() != 8)
-    return false;
-
-  uint8_t value = 0;
-  for (std::string::const_iterator iter = value_string.begin();
-       iter != value_string.end();
-       ++iter) {
-    value <<= 1;
-    if (*iter == '1')
-      value++;
-    else if (*iter != '0')
-      return false;
-  }
-  AppendData(value);
-  return true;
-}
-
-bool ValidationTestInputParser::ParseDistance(const DataType& type,
-                                              const std::string& value_string) {
-  if (pending_distance_items_.find(value_string) !=
-      pending_distance_items_.end())
-    return false;
-
-  PendingDistanceItem item = {data_->size(), type.data_size};
-  data_->resize(data_->size() + type.data_size);
-  pending_distance_items_[value_string] = item;
-
-  return true;
-}
-
-bool ValidationTestInputParser::ParseAnchor(const DataType& type,
-                                            const std::string& value_string) {
-  if (anchors_.find(value_string) != anchors_.end())
-    return false;
-  anchors_.insert(value_string);
-
-  std::map<std::string, PendingDistanceItem>::iterator iter =
-      pending_distance_items_.find(value_string);
-  if (iter == pending_distance_items_.end())
-    return false;
-
-  PendingDistanceItem dist_item = iter->second;
-  pending_distance_items_.erase(iter);
-
-  size_t distance = data_->size() - dist_item.pos;
-  switch (dist_item.data_size) {
-    case 4:
-      return ConvertAndFillData<uint32_t>(dist_item.pos, distance);
-    case 8:
-      return ConvertAndFillData<uint64_t>(dist_item.pos, distance);
-    default:
-      assert(false);
-      return false;
-  }
-}
-
-bool ValidationTestInputParser::ParseHandles(const DataType& type,
-                                             const std::string& value_string) {
-  // It should be the first item.
-  if (!data_->empty())
-    return false;
-
-  unsigned long long int value;
-  if (!ConvertToUnsignedInteger(value_string, &value))
-    return false;
-
-  if (value > std::numeric_limits<size_t>::max())
-    return false;
-
-  *num_handles_ = static_cast<size_t>(value);
-  return true;
-}
-
-bool ValidationTestInputParser::StartsWith(const Range& range,
-                                           const char* prefix,
-                                           size_t prefix_length) {
-  if (static_cast<size_t>(range.second - range.first) < prefix_length)
-    return false;
-
-  return memcmp(range.first, prefix, prefix_length) == 0;
-}
-
-bool ValidationTestInputParser::ConvertToUnsignedInteger(
-    const std::string& value_string,
-    unsigned long long int* value) {
-  const char* format = nullptr;
-  if (value_string.find_first_of("xX") != std::string::npos)
-    format = "%llx";
-  else
-    format = "%llu";
-  return sscanf(value_string.c_str(), format, value) == 1;
-}
-
-}  // namespace
-
-bool ParseValidationTestInput(const std::string& input,
-                              std::vector<uint8_t>* data,
-                              size_t* num_handles,
-                              std::string* error_message) {
-  ValidationTestInputParser parser(input, data, num_handles, error_message);
-  return parser.Run();
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/validation_test_input_parser.h b/mojo/public/cpp/bindings/tests/validation_test_input_parser.h
deleted file mode 100644
index d08f359..0000000
--- a/mojo/public/cpp/bindings/tests/validation_test_input_parser.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_VALIDATION_TEST_INPUT_PARSER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_VALIDATION_TEST_INPUT_PARSER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-namespace mojo {
-namespace test {
-
-// Input Format of Mojo Message Validation Tests.
-//
-// Data items are separated by whitespaces:
-//   - ' ' (0x20) space;
-//   - '\t' (0x09) horizontal tab;
-//   - '\n' (0x0a) newline;
-//   - '\r' (0x0d) carriage return.
-// A comment starts with //, extending to the end of the line.
-// Each data item is of the format [<type>]<value>. The types defined and the
-// corresponding value formats are described below.
-//
-// Type: u1 / u2 / u4 / u8
-// Description: Little-endian 1/2/4/8-byte unsigned integer.
-// Value Format:
-//   - Decimal integer: 0|[1-9][0-9]*
-//   - Hexadecimal integer: 0[xX][0-9a-fA-F]+
-//   - The type prefix (including the square brackets) of 1-byte unsigned
-//   integer is optional.
-//
-// Type: s1 / s2 / s4 / s8
-// Description: Little-endian 1/2/4/8-byte signed integer.
-// Value Format:
-//   - Decimal integer: [-+]?(0|[1-9][0-9]*)
-//   - Hexadecimal integer: [-+]?0[xX][0-9a-fA-F]+
-//
-// Type: b
-// Description: Binary sequence of 1 byte.
-// Value Format: [01]{8}
-//
-// Type: f / d
-// Description: Little-endian IEEE-754 format of float (4 bytes) and double (8
-// bytes).
-// Value Format: [-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
-//
-// Type: dist4 / dist8
-// Description: Little-endian 4/8-byte unsigned integer. The actual value is set
-// to the byte distance from the location of this integer to the location of the
-// anchr item with the same ID. A dist8 and anchr pair can be used to easily
-// represent an encoded pointer. A dist4 and anchr pair can be used to easily
-// calculate struct/array size.
-// Value Format: The value is an ID: [0-9a-zA-Z_]+
-//
-// Type: anchr
-// Description: Mark an anchor location. It doesn’t translate into any actual
-// data.
-// Value Format: The value is an ID of the same format as that of dist4/8.
-//
-// Type: handles
-// Description: The number of handles that are associated with the message. This
-// special item is not part of the message data. If specified, it should be the
-// first item.
-// Value Format: The same format as u1/2/4/8.
-//
-// EXAMPLE:
-//
-// Suppose you have the following Mojo types defined:
-//   struct Bar {
-//     int32_t a;
-//     bool b;
-//     bool c;
-//   };
-//   struct Foo {
-//     Bar x;
-//     uint32_t y;
-//   };
-//
-// The following describes a valid message whose payload is a Foo struct:
-//   // message header
-//   [dist4]message_header   // num_bytes
-//   [u4]3                   // version
-//   [u4]0                   // type
-//   [u4]1                   // flags
-//   [u8]1234                // request_id
-//   [anchr]message_header
-//
-//   // payload
-//   [dist4]foo      // num_bytes
-//   [u4]2           // version
-//   [dist8]bar_ptr  // x
-//   [u4]0xABCD      // y
-//   [u4]0           // padding
-//   [anchr]foo
-//
-//   [anchr]bar_ptr
-//   [dist4]bar   // num_bytes
-//   [u4]3        // version
-//   [s4]-1       // a
-//   [b]00000010  // b and c
-//   0 0 0        // padding
-//   [anchr]bar
-
-// Parses validation test input.
-// On success, |data| and |num_handles| store the parsing result,
-// |error_message| is cleared; on failure, |error_message| is set to a message
-// describing the error, |data| is cleared and |num_handles| set to 0.
-// Note: For now, this method only works on little-endian platforms.
-bool ParseValidationTestInput(const std::string& input,
-                              std::vector<uint8_t>* data,
-                              size_t* num_handles,
-                              std::string* error_message);
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_VALIDATION_TEST_INPUT_PARSER_H_
diff --git a/mojo/public/cpp/bindings/tests/validation_unittest.cc b/mojo/public/cpp/bindings/tests/validation_unittest.cc
deleted file mode 100644
index 7af7396..0000000
--- a/mojo/public/cpp/bindings/tests/validation_unittest.cc
+++ /dev/null
@@ -1,498 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <algorithm>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/c/system/macros.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/connector.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/cpp/bindings/message_header_validator.h"
-#include "mojo/public/cpp/bindings/tests/validation_test_input_parser.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/test_support/test_support.h"
-#include "mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-template <typename T>
-void Append(std::vector<uint8_t>* data_vector, T data) {
-  size_t pos = data_vector->size();
-  data_vector->resize(pos + sizeof(T));
-  memcpy(&(*data_vector)[pos], &data, sizeof(T));
-}
-
-bool TestInputParser(const std::string& input,
-                     bool expected_result,
-                     const std::vector<uint8_t>& expected_data,
-                     size_t expected_num_handles) {
-  std::vector<uint8_t> data;
-  size_t num_handles;
-  std::string error_message;
-
-  bool result =
-      ParseValidationTestInput(input, &data, &num_handles, &error_message);
-  if (expected_result) {
-    if (result && error_message.empty() && expected_data == data &&
-        expected_num_handles == num_handles) {
-      return true;
-    }
-
-    // Compare with an empty string instead of checking |error_message.empty()|,
-    // so that the message will be printed out if the two are not equal.
-    EXPECT_EQ(std::string(), error_message);
-    EXPECT_EQ(expected_data, data);
-    EXPECT_EQ(expected_num_handles, num_handles);
-    return false;
-  }
-
-  EXPECT_FALSE(error_message.empty());
-  return !result && !error_message.empty();
-}
-
-std::vector<std::string> GetMatchingTests(const std::vector<std::string>& names,
-                                          const std::string& prefix) {
-  const std::string suffix = ".data";
-  std::vector<std::string> tests;
-  for (size_t i = 0; i < names.size(); ++i) {
-    if (names[i].size() >= suffix.size() &&
-        names[i].substr(0, prefix.size()) == prefix &&
-        names[i].substr(names[i].size() - suffix.size()) == suffix)
-      tests.push_back(names[i].substr(0, names[i].size() - suffix.size()));
-  }
-  return tests;
-}
-
-bool ReadFile(const std::string& path, std::string* result) {
-  FILE* fp = OpenSourceRootRelativeFile(path.c_str());
-  if (!fp) {
-    ADD_FAILURE() << "File not found: " << path;
-    return false;
-  }
-  fseek(fp, 0, SEEK_END);
-  size_t size = static_cast<size_t>(ftell(fp));
-  if (size == 0) {
-    result->clear();
-    fclose(fp);
-    return true;
-  }
-  fseek(fp, 0, SEEK_SET);
-  result->resize(size);
-  size_t size_read = fread(&result->at(0), 1, size, fp);
-  fclose(fp);
-  return size == size_read;
-}
-
-bool ReadAndParseDataFile(const std::string& path,
-                          std::vector<uint8_t>* data,
-                          size_t* num_handles) {
-  std::string input;
-  if (!ReadFile(path, &input))
-    return false;
-
-  std::string error_message;
-  if (!ParseValidationTestInput(input, data, num_handles, &error_message)) {
-    ADD_FAILURE() << error_message;
-    return false;
-  }
-
-  return true;
-}
-
-bool ReadResultFile(const std::string& path, std::string* result) {
-  if (!ReadFile(path, result))
-    return false;
-
-  // Result files are new-line delimited text files. Remove any CRs.
-  result->erase(std::remove(result->begin(), result->end(), '\r'),
-                result->end());
-
-  // Remove trailing LFs.
-  size_t pos = result->find_last_not_of('\n');
-  if (pos == std::string::npos)
-    result->clear();
-  else
-    result->resize(pos + 1);
-
-  return true;
-}
-
-std::string GetPath(const std::string& root, const std::string& suffix) {
-  return "mojo/public/interfaces/bindings/tests/data/validation/" + root +
-         suffix;
-}
-
-// |message| should be a newly created object.
-bool ReadTestCase(const std::string& test,
-                  Message* message,
-                  std::string* expected) {
-  std::vector<uint8_t> data;
-  size_t num_handles;
-  if (!ReadAndParseDataFile(GetPath(test, ".data"), &data, &num_handles) ||
-      !ReadResultFile(GetPath(test, ".expected"), expected)) {
-    return false;
-  }
-
-  message->Initialize(static_cast<uint32_t>(data.size()),
-                      false /* zero_initialized */);
-  if (!data.empty())
-    memcpy(message->mutable_data(), &data[0], data.size());
-  message->mutable_handles()->resize(num_handles);
-
-  return true;
-}
-
-void RunValidationTests(const std::string& prefix,
-                        MessageReceiver* test_message_receiver) {
-  std::vector<std::string> names =
-      EnumerateSourceRootRelativeDirectory(GetPath("", ""));
-  std::vector<std::string> tests = GetMatchingTests(names, prefix);
-  ASSERT_FALSE(tests.empty());
-
-  for (size_t i = 0; i < tests.size(); ++i) {
-    Message message;
-    std::string expected;
-    ASSERT_TRUE(ReadTestCase(tests[i], &message, &expected));
-
-    std::string result;
-    base::RunLoop run_loop;
-    mojo::internal::ValidationErrorObserverForTesting observer(
-        run_loop.QuitClosure());
-    ignore_result(test_message_receiver->Accept(&message));
-    if (expected != "PASS")  // Observer only gets called on errors.
-      run_loop.Run();
-    if (observer.last_error() == mojo::internal::VALIDATION_ERROR_NONE)
-      result = "PASS";
-    else
-      result = mojo::internal::ValidationErrorToString(observer.last_error());
-
-    EXPECT_EQ(expected, result) << "failed test: " << tests[i];
-  }
-}
-
-class DummyMessageReceiver : public MessageReceiver {
- public:
-  bool Accept(Message* message) override {
-    return true;  // Any message is OK.
-  }
-};
-
-class ValidationTest : public testing::Test {
- public:
-  ValidationTest() {}
-
- protected:
-  base::MessageLoop loop_;
-};
-
-class ValidationIntegrationTest : public ValidationTest {
- public:
-  ValidationIntegrationTest() : test_message_receiver_(nullptr) {}
-
-  ~ValidationIntegrationTest() override {}
-
-  void SetUp() override {
-    ScopedMessagePipeHandle tester_endpoint;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              CreateMessagePipe(nullptr, &tester_endpoint, &testee_endpoint_));
-    test_message_receiver_ =
-        new TestMessageReceiver(this, std::move(tester_endpoint));
-  }
-
-  void TearDown() override {
-    delete test_message_receiver_;
-    test_message_receiver_ = nullptr;
-
-    // Make sure that the other end receives the OnConnectionError()
-    // notification.
-    PumpMessages();
-  }
-
-  MessageReceiver* test_message_receiver() { return test_message_receiver_; }
-
-  ScopedMessagePipeHandle testee_endpoint() {
-    return std::move(testee_endpoint_);
-  }
-
- private:
-  class TestMessageReceiver : public MessageReceiver {
-   public:
-    TestMessageReceiver(ValidationIntegrationTest* owner,
-                        ScopedMessagePipeHandle handle)
-        : owner_(owner),
-          connector_(std::move(handle),
-                     mojo::Connector::SINGLE_THREADED_SEND,
-                     base::ThreadTaskRunnerHandle::Get()) {
-      connector_.set_enforce_errors_from_incoming_receiver(false);
-    }
-    ~TestMessageReceiver() override {}
-
-    bool Accept(Message* message) override {
-      return connector_.Accept(message);
-    }
-
-   public:
-    ValidationIntegrationTest* owner_;
-    mojo::Connector connector_;
-  };
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
-  TestMessageReceiver* test_message_receiver_;
-  ScopedMessagePipeHandle testee_endpoint_;
-};
-
-class IntegrationTestInterfaceImpl : public IntegrationTestInterface {
- public:
-  ~IntegrationTestInterfaceImpl() override {}
-
-  void Method0(BasicStructPtr param0,
-               const Method0Callback& callback) override {
-    callback.Run(std::vector<uint8_t>());
-  }
-};
-
-TEST_F(ValidationTest, InputParser) {
-  {
-    // The parser, as well as Append() defined above, assumes that this code is
-    // running on a little-endian platform. Test whether that is true.
-    uint16_t x = 1;
-    ASSERT_EQ(1, *(reinterpret_cast<char*>(&x)));
-  }
-  {
-    // Test empty input.
-    std::string input;
-    std::vector<uint8_t> expected;
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    // Test input that only consists of comments and whitespaces.
-    std::string input = "    \t  // hello world \n\r \t// the answer is 42   ";
-    std::vector<uint8_t> expected;
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    std::string input =
-        "[u1]0x10// hello world !! \n\r  \t [u2]65535 \n"
-        "[u4]65536 [u8]0xFFFFFFFFFFFFFFFF 0 0Xff";
-    std::vector<uint8_t> expected;
-    Append(&expected, static_cast<uint8_t>(0x10));
-    Append(&expected, static_cast<uint16_t>(65535));
-    Append(&expected, static_cast<uint32_t>(65536));
-    Append(&expected, static_cast<uint64_t>(0xffffffffffffffff));
-    Append(&expected, static_cast<uint8_t>(0));
-    Append(&expected, static_cast<uint8_t>(0xff));
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    std::string input = "[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40";
-    std::vector<uint8_t> expected;
-    Append(&expected, -static_cast<int64_t>(0x800));
-    Append(&expected, static_cast<int8_t>(-128));
-    Append(&expected, static_cast<int16_t>(0));
-    Append(&expected, static_cast<int32_t>(-40));
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    std::string input = "[b]00001011 [b]10000000  // hello world\r [b]00000000";
-    std::vector<uint8_t> expected;
-    Append(&expected, static_cast<uint8_t>(11));
-    Append(&expected, static_cast<uint8_t>(128));
-    Append(&expected, static_cast<uint8_t>(0));
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    std::string input = "[f]+.3e9 [d]-10.03";
-    std::vector<uint8_t> expected;
-    Append(&expected, +.3e9f);
-    Append(&expected, -10.03);
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    std::string input = "[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar";
-    std::vector<uint8_t> expected;
-    Append(&expected, static_cast<uint32_t>(14));
-    Append(&expected, static_cast<uint8_t>(0));
-    Append(&expected, static_cast<uint64_t>(9));
-    Append(&expected, static_cast<uint8_t>(0));
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    std::string input = "// This message has handles! \n[handles]50 [u8]2";
-    std::vector<uint8_t> expected;
-    Append(&expected, static_cast<uint64_t>(2));
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 50));
-  }
-
-  // Test some failure cases.
-  {
-    const char* error_inputs[] = {"/ hello world",
-                                  "[u1]x",
-                                  "[u2]-1000",
-                                  "[u1]0x100",
-                                  "[s2]-0x8001",
-                                  "[b]1",
-                                  "[b]1111111k",
-                                  "[dist4]unmatched",
-                                  "[anchr]hello [dist8]hello",
-                                  "[dist4]a [dist4]a [anchr]a",
-                                  "[dist4]a [anchr]a [dist4]a [anchr]a",
-                                  "0 [handles]50",
-                                  nullptr};
-
-    for (size_t i = 0; error_inputs[i]; ++i) {
-      std::vector<uint8_t> expected;
-      if (!TestInputParser(error_inputs[i], false, expected, 0))
-        ADD_FAILURE() << "Unexpected test result for: " << error_inputs[i];
-    }
-  }
-}
-
-TEST_F(ValidationTest, Conformance) {
-  DummyMessageReceiver dummy_receiver;
-  mojo::FilterChain validators(&dummy_receiver);
-  validators.Append<mojo::MessageHeaderValidator>();
-  validators.Append<ConformanceTestInterface::RequestValidator_>();
-
-  RunValidationTests("conformance_", &validators);
-}
-
-TEST_F(ValidationTest, AssociatedConformace) {
-  DummyMessageReceiver dummy_receiver;
-  mojo::FilterChain validators(&dummy_receiver);
-  validators.Append<mojo::MessageHeaderValidator>();
-  validators.Append<AssociatedConformanceTestInterface::RequestValidator_>();
-
-  RunValidationTests("associated_conformance_", &validators);
-}
-
-// This test is similar to Conformance test but its goal is specifically
-// do bounds-check testing of message validation. For example we test the
-// detection of off-by-one errors in method ordinals.
-TEST_F(ValidationTest, BoundsCheck) {
-  DummyMessageReceiver dummy_receiver;
-  mojo::FilterChain validators(&dummy_receiver);
-  validators.Append<mojo::MessageHeaderValidator>();
-  validators.Append<BoundsCheckTestInterface::RequestValidator_>();
-
-  RunValidationTests("boundscheck_", &validators);
-}
-
-// This test is similar to the Conformance test but for responses.
-TEST_F(ValidationTest, ResponseConformance) {
-  DummyMessageReceiver dummy_receiver;
-  mojo::FilterChain validators(&dummy_receiver);
-  validators.Append<mojo::MessageHeaderValidator>();
-  validators.Append<ConformanceTestInterface::ResponseValidator_>();
-
-  RunValidationTests("resp_conformance_", &validators);
-}
-
-// This test is similar to the BoundsCheck test but for responses.
-TEST_F(ValidationTest, ResponseBoundsCheck) {
-  DummyMessageReceiver dummy_receiver;
-  mojo::FilterChain validators(&dummy_receiver);
-  validators.Append<mojo::MessageHeaderValidator>();
-  validators.Append<BoundsCheckTestInterface::ResponseValidator_>();
-
-  RunValidationTests("resp_boundscheck_", &validators);
-}
-
-// Test that InterfacePtr<X> applies the correct validators and they don't
-// conflict with each other:
-//   - MessageHeaderValidator
-//   - X::ResponseValidator_
-TEST_F(ValidationIntegrationTest, InterfacePtr) {
-  IntegrationTestInterfacePtr interface_ptr = MakeProxy(
-      InterfacePtrInfo<IntegrationTestInterface>(testee_endpoint(), 0u));
-  interface_ptr.internal_state()->EnableTestingMode();
-
-  RunValidationTests("integration_intf_resp", test_message_receiver());
-  RunValidationTests("integration_msghdr", test_message_receiver());
-}
-
-// Test that Binding<X> applies the correct validators and they don't
-// conflict with each other:
-//   - MessageHeaderValidator
-//   - X::RequestValidator_
-TEST_F(ValidationIntegrationTest, Binding) {
-  IntegrationTestInterfaceImpl interface_impl;
-  Binding<IntegrationTestInterface> binding(
-      &interface_impl,
-      MakeRequest<IntegrationTestInterface>(testee_endpoint()));
-  binding.EnableTestingMode();
-
-  RunValidationTests("integration_intf_rqst", test_message_receiver());
-  RunValidationTests("integration_msghdr", test_message_receiver());
-}
-
-// Test pointer validation (specifically, that the encoded offset is 32-bit)
-TEST_F(ValidationTest, ValidateEncodedPointer) {
-  uint64_t offset;
-
-  offset = 0ULL;
-  EXPECT_TRUE(mojo::internal::ValidateEncodedPointer(&offset));
-
-  offset = 1ULL;
-  EXPECT_TRUE(mojo::internal::ValidateEncodedPointer(&offset));
-
-  // offset must be <= 32-bit.
-  offset = std::numeric_limits<uint32_t>::max() + 1ULL;
-  EXPECT_FALSE(mojo::internal::ValidateEncodedPointer(&offset));
-}
-
-// Tests the IsKnownEnumValue() function generated for BasicEnum.
-TEST(EnumValueValidationTest, BasicEnum) {
-  // BasicEnum can have -3,0,1,10 as possible integral values.
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(-4)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<BasicEnum>(-3)));
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(-2)));
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(-1)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<BasicEnum>(0)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<BasicEnum>(1)));
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(2)));
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(9)));
-  // In the mojom, we represent this value as hex (0xa).
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<BasicEnum>(10)));
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(11)));
-}
-
-// Tests the IsKnownEnumValue() method generated for StructWithEnum.
-TEST(EnumValueValidationTest, EnumWithin) {
-  // StructWithEnum::EnumWithin can have [0,4] as possible integral values.
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(-1)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(0)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(1)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(2)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(3)));
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(4)));
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/variant_test_util.h b/mojo/public/cpp/bindings/tests/variant_test_util.h
deleted file mode 100644
index 3f6b1f1..0000000
--- a/mojo/public/cpp/bindings/tests/variant_test_util.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_VARIANT_TEST_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_VARIANT_TEST_UTIL_H_
-
-#include <string.h>
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-
-namespace mojo {
-namespace test {
-
-// Converts a request of Interface1 to a request of Interface0. Interface0 and
-// Interface1 are expected to be two variants of the same mojom interface.
-// In real-world use cases, users shouldn't need to worry about this. Because it
-// is rare to deal with two variants of the same interface in the same app.
-template <typename Interface0, typename Interface1>
-InterfaceRequest<Interface0> ConvertInterfaceRequest(
-    InterfaceRequest<Interface1> request) {
-  DCHECK_EQ(0, strcmp(Interface0::Name_, Interface1::Name_));
-  InterfaceRequest<Interface0> result;
-  result.Bind(request.PassMessagePipe());
-  return result;
-}
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_VARIANT_TEST_UTIL_H_
diff --git a/mojo/public/cpp/bindings/tests/versioning_apptest.cc b/mojo/public/cpp/bindings/tests/versioning_apptest.cc
deleted file mode 100644
index 95a89c0..0000000
--- a/mojo/public/cpp/bindings/tests/versioning_apptest.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2015 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 <stddef.h>
-#include <stdint.h>
-
-#include "base/macros.h"
-#include "mojo/public/interfaces/bindings/tests/versioning_test_client.mojom.h"
-#include "services/service_manager/public/cpp/application_test_base.h"
-#include "services/service_manager/public/cpp/connector.h"
-
-namespace mojo {
-namespace test {
-namespace versioning {
-
-class VersioningApplicationTest : public ApplicationTestBase {
- public:
-  VersioningApplicationTest() : ApplicationTestBase() {}
-  ~VersioningApplicationTest() override {}
-
- protected:
-  // ApplicationTestBase overrides.
-  void SetUp() override {
-    ApplicationTestBase::SetUp();
-
-    connector()->BindInterface("versioning_test_service", &database_);
-  }
-
-  HumanResourceDatabasePtr database_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(VersioningApplicationTest);
-};
-
-TEST_F(VersioningApplicationTest, Struct) {
-  // The service side uses a newer version of Employee defintion.
-  // The returned struct should be truncated.
-  EmployeePtr employee(Employee::New());
-  employee->employee_id = 1;
-  employee->name = "Homer Simpson";
-  employee->department = DEPARTMENT_DEV;
-
-  database_->QueryEmployee(1, true,
-                           [&employee](EmployeePtr returned_employee,
-                                       Array<uint8_t> returned_finger_print) {
-                             EXPECT_TRUE(employee->Equals(*returned_employee));
-                             EXPECT_FALSE(returned_finger_print.is_null());
-                           });
-  database_.WaitForIncomingResponse();
-
-  // Passing a struct of older version to the service side works.
-  EmployeePtr new_employee(Employee::New());
-  new_employee->employee_id = 2;
-  new_employee->name = "Marge Simpson";
-  new_employee->department = DEPARTMENT_SALES;
-
-  database_->AddEmployee(new_employee.Clone(),
-                         [](bool success) { EXPECT_TRUE(success); });
-  database_.WaitForIncomingResponse();
-
-  database_->QueryEmployee(
-      2, false, [&new_employee](EmployeePtr returned_employee,
-                                Array<uint8_t> returned_finger_print) {
-        EXPECT_TRUE(new_employee->Equals(*returned_employee));
-        EXPECT_TRUE(returned_finger_print.is_null());
-      });
-  database_.WaitForIncomingResponse();
-}
-
-TEST_F(VersioningApplicationTest, QueryVersion) {
-  EXPECT_EQ(0u, database_.version());
-  database_.QueryVersion([](uint32_t version) { EXPECT_EQ(1u, version); });
-  database_.WaitForIncomingResponse();
-  EXPECT_EQ(1u, database_.version());
-}
-
-TEST_F(VersioningApplicationTest, RequireVersion) {
-  EXPECT_EQ(0u, database_.version());
-
-  database_.RequireVersion(1);
-  EXPECT_EQ(1u, database_.version());
-  database_->QueryEmployee(3, false,
-                           [](EmployeePtr returned_employee,
-                              Array<uint8_t> returned_finger_print) {});
-  database_.WaitForIncomingResponse();
-  EXPECT_FALSE(database_.encountered_error());
-
-  // Requiring a version higher than what the service side implements will close
-  // the pipe.
-  database_.RequireVersion(3);
-  EXPECT_EQ(3u, database_.version());
-  database_->QueryEmployee(1, false,
-                           [](EmployeePtr returned_employee,
-                              Array<uint8_t> returned_finger_print) {});
-  database_.WaitForIncomingResponse();
-  EXPECT_TRUE(database_.encountered_error());
-}
-
-TEST_F(VersioningApplicationTest, CallNonexistentMethod) {
-  EXPECT_EQ(0u, database_.version());
-
-  Array<uint8_t> new_finger_print(128);
-  for (size_t i = 0; i < 128; ++i)
-    new_finger_print[i] = i + 13;
-
-  // Although the client side doesn't know whether the service side supports
-  // version 1, calling a version 1 method succeeds as long as the service side
-  // supports version 1.
-  database_->AttachFingerPrint(1, new_finger_print.Clone(),
-                               [](bool success) { EXPECT_TRUE(success); });
-  database_.WaitForIncomingResponse();
-
-  // Calling a version 2 method (which the service side doesn't support) closes
-  // the pipe.
-  database_->ListEmployeeIds([](Array<uint64_t> ids) { EXPECT_TRUE(false); });
-  database_.WaitForIncomingResponse();
-  EXPECT_TRUE(database_.encountered_error());
-}
-
-}  // namespace versioning
-}  // namespace examples
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/versioning_test_service.cc b/mojo/public/cpp/bindings/tests/versioning_test_service.cc
deleted file mode 100644
index 313a624..0000000
--- a/mojo/public/cpp/bindings/tests/versioning_test_service.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2015 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 <stdint.h>
-
-#include <map>
-#include <utility>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/interfaces/bindings/tests/versioning_test_service.mojom.h"
-#include "services/service_manager/public/c/main.h"
-#include "services/service_manager/public/cpp/interface_factory.h"
-#include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_runner.h"
-
-namespace mojo {
-namespace test {
-namespace versioning {
-
-struct EmployeeInfo {
- public:
-  EmployeeInfo() {}
-
-  EmployeePtr employee;
-  Array<uint8_t> finger_print;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(EmployeeInfo);
-};
-
-class HumanResourceDatabaseImpl : public HumanResourceDatabase {
- public:
-  explicit HumanResourceDatabaseImpl(
-      InterfaceRequest<HumanResourceDatabase> request)
-      : strong_binding_(this, std::move(request)) {
-    // Pretend that there is already some data in the system.
-    EmployeeInfo* info = new EmployeeInfo();
-    employees_[1] = info;
-    info->employee = Employee::New();
-    info->employee->employee_id = 1;
-    info->employee->name = "Homer Simpson";
-    info->employee->department = DEPARTMENT_DEV;
-    info->employee->birthday = Date::New();
-    info->employee->birthday->year = 1955;
-    info->employee->birthday->month = 5;
-    info->employee->birthday->day = 12;
-    info->finger_print.resize(1024);
-    for (uint32_t i = 0; i < 1024; ++i)
-      info->finger_print[i] = i;
-  }
-
-  ~HumanResourceDatabaseImpl() override {
-    for (auto iter = employees_.begin(); iter != employees_.end(); ++iter)
-      delete iter->second;
-  }
-
-  void AddEmployee(EmployeePtr employee,
-                   const AddEmployeeCallback& callback) override {
-    uint64_t id = employee->employee_id;
-    if (employees_.find(id) == employees_.end())
-      employees_[id] = new EmployeeInfo();
-    employees_[id]->employee = std::move(employee);
-    callback.Run(true);
-  }
-
-  void QueryEmployee(uint64_t id,
-                     bool retrieve_finger_print,
-                     const QueryEmployeeCallback& callback) override {
-    if (employees_.find(id) == employees_.end()) {
-      callback.Run(nullptr, Array<uint8_t>());
-      return;
-    }
-    callback.Run(employees_[id]->employee.Clone(),
-                 retrieve_finger_print ? employees_[id]->finger_print.Clone()
-                                       : Array<uint8_t>());
-  }
-
-  void AttachFingerPrint(uint64_t id,
-                         Array<uint8_t> finger_print,
-                         const AttachFingerPrintCallback& callback) override {
-    if (employees_.find(id) == employees_.end()) {
-      callback.Run(false);
-      return;
-    }
-    employees_[id]->finger_print = std::move(finger_print);
-    callback.Run(true);
-  }
-
- private:
-  std::map<uint64_t, EmployeeInfo*> employees_;
-
-  StrongBinding<HumanResourceDatabase> strong_binding_;
-};
-
-class HumanResourceSystemServer
-    : public service_manager::Service,
-      public InterfaceFactory<HumanResourceDatabase> {
- public:
-  HumanResourceSystemServer() {}
-
-  // service_manager::Service implementation.
-  bool OnConnect(Connection* connection) override {
-    connection->AddInterface<HumanResourceDatabase>(this);
-    return true;
-  }
-
-  // InterfaceFactory<HumanResourceDatabase> implementation.
-  void Create(Connection* connection,
-              InterfaceRequest<HumanResourceDatabase> request) override {
-    // It will be deleted automatically when the underlying pipe encounters a
-    // connection error.
-    new HumanResourceDatabaseImpl(std::move(request));
-  }
-};
-
-}  // namespace versioning
-}  // namespace test
-}  // namespace mojo
-
-MojoResult ServiceMain(MojoHandle request) {
-  mojo::ServiceRunner runner(
-      new mojo::test::versioning::HumanResourceSystemServer());
-
-  return runner.Run(request);
-}
diff --git a/mojo/public/cpp/bindings/tests/wtf_hash_unittest.cc b/mojo/public/cpp/bindings/tests/wtf_hash_unittest.cc
deleted file mode 100644
index 959d25b..0000000
--- a/mojo/public/cpp/bindings/tests/wtf_hash_unittest.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/wtf_hash_util.h"
-
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom-blink.h"
-#include "mojo/public/interfaces/bindings/tests/test_wtf_types.mojom-blink.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/Source/wtf/HashFunctions.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-using WTFHashTest = testing::Test;
-
-TEST_F(WTFHashTest, NestedStruct) {
-  // Just check that this template instantiation compiles.
-  ASSERT_EQ(::mojo::internal::Hash(
-                ::mojo::internal::kHashSeed,
-                blink::SimpleNestedStruct::New(blink::ContainsOther::New(1))),
-            ::mojo::internal::Hash(
-                ::mojo::internal::kHashSeed,
-                blink::SimpleNestedStruct::New(blink::ContainsOther::New(1))));
-}
-
-TEST_F(WTFHashTest, UnmappedNativeStruct) {
-  // Just check that this template instantiation compiles.
-  ASSERT_EQ(::mojo::internal::Hash(::mojo::internal::kHashSeed,
-                                   blink::UnmappedNativeStruct::New()),
-            ::mojo::internal::Hash(::mojo::internal::kHashSeed,
-                                   blink::UnmappedNativeStruct::New()));
-}
-
-TEST_F(WTFHashTest, Enum) {
-  // Just check that this template instantiation compiles.
-
-  // Top-level.
-  ASSERT_EQ(WTF::DefaultHash<blink::TopLevelEnum>::Hash().hash(
-                blink::TopLevelEnum::E0),
-            WTF::DefaultHash<blink::TopLevelEnum>::Hash().hash(
-                blink::TopLevelEnum::E0));
-
-  // Nested in struct.
-  ASSERT_EQ(WTF::DefaultHash<blink::TestWTFStruct::NestedEnum>::Hash().hash(
-                blink::TestWTFStruct::NestedEnum::E0),
-            WTF::DefaultHash<blink::TestWTFStruct::NestedEnum>::Hash().hash(
-                blink::TestWTFStruct::NestedEnum::E0));
-
-  // Nested in interface.
-  ASSERT_EQ(WTF::DefaultHash<blink::TestWTF::NestedEnum>::Hash().hash(
-                blink::TestWTF::NestedEnum::E0),
-            WTF::DefaultHash<blink::TestWTF::NestedEnum>::Hash().hash(
-                blink::TestWTF::NestedEnum::E0));
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/wtf_map_unittest.cc b/mojo/public/cpp/bindings/tests/wtf_map_unittest.cc
deleted file mode 100644
index dc40143..0000000
--- a/mojo/public/cpp/bindings/tests/wtf_map_unittest.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/tests/rect_blink.h"
-#include "mojo/public/interfaces/bindings/tests/rect.mojom-blink.h"
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom-blink.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-TEST(WTFMapTest, StructKey) {
-  WTF::HashMap<blink::RectPtr, int32_t> map;
-  map.insert(blink::Rect::New(1, 2, 3, 4), 123);
-
-  blink::RectPtr key = blink::Rect::New(1, 2, 3, 4);
-  ASSERT_NE(map.end(), map.find(key));
-  ASSERT_EQ(123, map.find(key)->value);
-
-  map.erase(key);
-  ASSERT_EQ(0u, map.size());
-}
-
-TEST(WTFMapTest, TypemappedStructKey) {
-  WTF::HashMap<blink::ContainsHashablePtr, int32_t> map;
-  map.insert(blink::ContainsHashable::New(RectBlink(1, 2, 3, 4)), 123);
-
-  blink::ContainsHashablePtr key =
-      blink::ContainsHashable::New(RectBlink(1, 2, 3, 4));
-  ASSERT_NE(map.end(), map.find(key));
-  ASSERT_EQ(123, map.find(key)->value);
-
-  map.erase(key);
-  ASSERT_EQ(0u, map.size());
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc b/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc
deleted file mode 100644
index 363ef7c..0000000
--- a/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/bind.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/wtf_serialization.h"
-#include "mojo/public/cpp/bindings/tests/variant_test_util.h"
-#include "mojo/public/interfaces/bindings/tests/test_wtf_types.mojom-blink.h"
-#include "mojo/public/interfaces/bindings/tests/test_wtf_types.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/Source/wtf/text/StringHash.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-const char kHelloWorld[] = "hello world";
-
-// Replace the "o"s in "hello world" with "o"s with acute.
-const char kUTF8HelloWorld[] = "hell\xC3\xB3 w\xC3\xB3rld";
-
-class TestWTFImpl : public TestWTF {
- public:
-  explicit TestWTFImpl(TestWTFRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // mojo::test::TestWTF implementation:
-  void EchoString(const base::Optional<std::string>& str,
-                  const EchoStringCallback& callback) override {
-    callback.Run(str);
-  }
-
-  void EchoStringArray(
-      const base::Optional<std::vector<base::Optional<std::string>>>& arr,
-      const EchoStringArrayCallback& callback) override {
-    callback.Run(std::move(arr));
-  }
-
-  void EchoStringMap(
-      const base::Optional<
-          std::unordered_map<std::string, base::Optional<std::string>>>&
-          str_map,
-      const EchoStringMapCallback& callback) override {
-    callback.Run(std::move(str_map));
-  }
-
- private:
-  Binding<TestWTF> binding_;
-};
-
-class WTFTypesTest : public testing::Test {
- public:
-  WTFTypesTest() {}
-
- private:
-  base::MessageLoop loop_;
-};
-
-WTF::Vector<WTF::String> ConstructStringArray() {
-  WTF::Vector<WTF::String> strs(4);
-  // strs[0] is null.
-  // strs[1] is empty.
-  strs[1] = "";
-  strs[2] = kHelloWorld;
-  strs[3] = WTF::String::fromUTF8(kUTF8HelloWorld);
-
-  return strs;
-}
-
-WTF::HashMap<WTF::String, WTF::String> ConstructStringMap() {
-  WTF::HashMap<WTF::String, WTF::String> str_map;
-  // A null string as value.
-  str_map.insert("0", WTF::String());
-  str_map.insert("1", kHelloWorld);
-  str_map.insert("2", WTF::String::fromUTF8(kUTF8HelloWorld));
-
-  return str_map;
-}
-
-void ExpectString(const WTF::String& expected_string,
-                  const base::Closure& closure,
-                  const WTF::String& string) {
-  EXPECT_EQ(expected_string, string);
-  closure.Run();
-}
-
-void ExpectStringArray(WTF::Optional<WTF::Vector<WTF::String>>* expected_arr,
-                       const base::Closure& closure,
-                       const WTF::Optional<WTF::Vector<WTF::String>>& arr) {
-  EXPECT_EQ(*expected_arr, arr);
-  closure.Run();
-}
-
-void ExpectStringMap(
-    WTF::Optional<WTF::HashMap<WTF::String, WTF::String>>* expected_map,
-    const base::Closure& closure,
-    const WTF::Optional<WTF::HashMap<WTF::String, WTF::String>>& map) {
-  EXPECT_EQ(*expected_map, map);
-  closure.Run();
-}
-
-}  // namespace
-
-TEST_F(WTFTypesTest, Serialization_WTFVectorToWTFVector) {
-  using MojomType = ArrayDataView<StringDataView>;
-
-  WTF::Vector<WTF::String> strs = ConstructStringArray();
-  auto cloned_strs = strs;
-
-  mojo::internal::SerializationContext context;
-  size_t size =
-      mojo::internal::PrepareToSerialize<MojomType>(cloned_strs, &context);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-  mojo::internal::ContainerValidateParams validate_params(
-      0, true, new mojo::internal::ContainerValidateParams(0, false, nullptr));
-  mojo::internal::Serialize<MojomType>(cloned_strs, &buf, &data,
-                                       &validate_params, &context);
-
-  WTF::Vector<WTF::String> strs2;
-  mojo::internal::Deserialize<MojomType>(data, &strs2, &context);
-
-  EXPECT_EQ(strs, strs2);
-}
-
-TEST_F(WTFTypesTest, Serialization_WTFVectorToStlVector) {
-  using MojomType = ArrayDataView<StringDataView>;
-
-  WTF::Vector<WTF::String> strs = ConstructStringArray();
-  auto cloned_strs = strs;
-
-  mojo::internal::SerializationContext context;
-  size_t size =
-      mojo::internal::PrepareToSerialize<MojomType>(cloned_strs, &context);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-  mojo::internal::ContainerValidateParams validate_params(
-      0, true, new mojo::internal::ContainerValidateParams(0, false, nullptr));
-  mojo::internal::Serialize<MojomType>(cloned_strs, &buf, &data,
-                                       &validate_params, &context);
-
-  std::vector<base::Optional<std::string>> strs2;
-  mojo::internal::Deserialize<MojomType>(data, &strs2, &context);
-
-  ASSERT_EQ(4u, strs2.size());
-  EXPECT_FALSE(strs2[0]);
-  EXPECT_EQ("", *strs2[1]);
-  EXPECT_EQ(kHelloWorld, *strs2[2]);
-  EXPECT_EQ(kUTF8HelloWorld, *strs2[3]);
-}
-
-TEST_F(WTFTypesTest, Serialization_PublicAPI) {
-  blink::TestWTFStructPtr input(blink::TestWTFStruct::New(kHelloWorld, 42));
-
-  blink::TestWTFStructPtr cloned_input = input.Clone();
-
-  auto data = blink::TestWTFStruct::Serialize(&input);
-
-  blink::TestWTFStructPtr output;
-  ASSERT_TRUE(blink::TestWTFStruct::Deserialize(std::move(data), &output));
-  EXPECT_TRUE(cloned_input.Equals(output));
-}
-
-TEST_F(WTFTypesTest, SendString) {
-  blink::TestWTFPtr ptr;
-  TestWTFImpl impl(ConvertInterfaceRequest<TestWTF>(MakeRequest(&ptr)));
-
-  WTF::Vector<WTF::String> strs = ConstructStringArray();
-
-  for (size_t i = 0; i < strs.size(); ++i) {
-    base::RunLoop loop;
-    // Test that a WTF::String is unchanged after the following conversion:
-    //   - serialized;
-    //   - deserialized as base::Optional<std::string>;
-    //   - serialized;
-    //   - deserialized as WTF::String.
-    ptr->EchoString(strs[i],
-                    base::Bind(&ExpectString, strs[i], loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(WTFTypesTest, SendStringArray) {
-  blink::TestWTFPtr ptr;
-  TestWTFImpl impl(ConvertInterfaceRequest<TestWTF>(MakeRequest(&ptr)));
-
-  WTF::Optional<WTF::Vector<WTF::String>> arrs[3];
-  // arrs[0] is empty.
-  arrs[0].emplace();
-  // arrs[1] is null.
-  arrs[2] = ConstructStringArray();
-
-  for (size_t i = 0; i < arraysize(arrs); ++i) {
-    base::RunLoop loop;
-    // Test that a WTF::Optional<WTF::Vector<WTF::String>> is unchanged after
-    // the following conversion:
-    //   - serialized;
-    //   - deserialized as
-    //     base::Optional<std::vector<base::Optional<std::string>>>;
-    //   - serialized;
-    //   - deserialized as WTF::Optional<WTF::Vector<WTF::String>>.
-    ptr->EchoStringArray(
-        arrs[i], base::Bind(&ExpectStringArray, base::Unretained(&arrs[i]),
-                            loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(WTFTypesTest, SendStringMap) {
-  blink::TestWTFPtr ptr;
-  TestWTFImpl impl(ConvertInterfaceRequest<TestWTF>(MakeRequest(&ptr)));
-
-  WTF::Optional<WTF::HashMap<WTF::String, WTF::String>> maps[3];
-  // maps[0] is empty.
-  maps[0].emplace();
-  // maps[1] is null.
-  maps[2] = ConstructStringMap();
-
-  for (size_t i = 0; i < arraysize(maps); ++i) {
-    base::RunLoop loop;
-    // Test that a WTF::Optional<WTF::HashMap<WTF::String, WTF::String>> is
-    // unchanged after the following conversion:
-    //   - serialized;
-    //   - deserialized as base::Optional<
-    //     std::unordered_map<std::string, base::Optional<std::string>>>;
-    //   - serialized;
-    //   - deserialized as WTF::Optional<WTF::HashMap<WTF::String,
-    //     WTF::String>>.
-    ptr->EchoStringMap(maps[i],
-                       base::Bind(&ExpectStringMap, base::Unretained(&maps[i]),
-                                  loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/thread_safe_interface_ptr.h b/mojo/public/cpp/bindings/thread_safe_interface_ptr.h
deleted file mode 100644
index 740687f..0000000
--- a/mojo/public/cpp/bindings/thread_safe_interface_ptr.h
+++ /dev/null
@@ -1,394 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_THREAD_SAFE_INTERFACE_PTR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_THREAD_SAFE_INTERFACE_PTR_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/stl_util.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/associated_group.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/cpp/bindings/sync_call_restrictions.h"
-#include "mojo/public/cpp/bindings/sync_event_watcher.h"
-
-// ThreadSafeInterfacePtr wraps a non-thread-safe InterfacePtr and proxies
-// messages to it. Async calls are posted to the thread that the InteracePtr is
-// bound to, and the responses are posted back. Sync calls are dispatched
-// directly if the call is made on the thread that the wrapped InterfacePtr is
-// bound to, or posted otherwise. It's important to be aware that sync calls
-// block both the calling thread and the InterfacePtr thread. That means that
-// you cannot make sync calls through a ThreadSafeInterfacePtr if the
-// underlying InterfacePtr is bound to a thread that cannot block, like the IO
-// thread.
-
-namespace mojo {
-
-// Instances of this class may be used from any thread to serialize |Interface|
-// messages and forward them elsewhere. In general you should use one of the
-// ThreadSafeInterfacePtrBase helper aliases defined below, but this type may be
-// useful if you need/want to manually manage the lifetime of the underlying
-// proxy object which will be used to ultimately send messages.
-template <typename Interface>
-class ThreadSafeForwarder : public MessageReceiverWithResponder {
- public:
-  using ProxyType = typename Interface::Proxy_;
-  using ForwardMessageCallback = base::Callback<void(Message)>;
-  using ForwardMessageWithResponderCallback =
-      base::Callback<void(Message, std::unique_ptr<MessageReceiver>)>;
-
-  // Constructs a ThreadSafeForwarder through which Messages are forwarded to
-  // |forward| or |forward_with_responder| by posting to |task_runner|.
-  //
-  // Any message sent through this forwarding interface will dispatch its reply,
-  // if any, back to the thread which called the corresponding interface method.
-  ThreadSafeForwarder(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-      const ForwardMessageCallback& forward,
-      const ForwardMessageWithResponderCallback& forward_with_responder,
-      const AssociatedGroup& associated_group)
-      : proxy_(this),
-        task_runner_(task_runner),
-        forward_(forward),
-        forward_with_responder_(forward_with_responder),
-        associated_group_(associated_group),
-        sync_calls_(new InProgressSyncCalls()) {}
-
-  ~ThreadSafeForwarder() override {
-    // If there are ongoing sync calls signal their completion now.
-    base::AutoLock l(sync_calls_->lock);
-    for (const auto& pending_response : sync_calls_->pending_responses)
-      pending_response->event.Signal();
-  }
-
-  ProxyType& proxy() { return proxy_; }
-
- private:
-  // MessageReceiverWithResponder implementation:
-  bool Accept(Message* message) override {
-    if (!message->associated_endpoint_handles()->empty()) {
-      // If this DCHECK fails, it is likely because:
-      // - This is a non-associated interface pointer setup using
-      //     PtrWrapper::BindOnTaskRunner(
-      //         InterfacePtrInfo<InterfaceType> ptr_info);
-      //   Please see the TODO in that method.
-      // - This is an associated interface which hasn't been associated with a
-      //   message pipe. In other words, the corresponding
-      //   AssociatedInterfaceRequest hasn't been sent.
-      DCHECK(associated_group_.GetController());
-      message->SerializeAssociatedEndpointHandles(
-          associated_group_.GetController());
-    }
-    task_runner_->PostTask(FROM_HERE,
-                           base::Bind(forward_, base::Passed(message)));
-    return true;
-  }
-
-  bool AcceptWithResponder(
-      Message* message,
-      std::unique_ptr<MessageReceiver> responder) override {
-    if (!message->associated_endpoint_handles()->empty()) {
-      // Please see comment for the DCHECK in the previous method.
-      DCHECK(associated_group_.GetController());
-      message->SerializeAssociatedEndpointHandles(
-          associated_group_.GetController());
-    }
-
-    // Async messages are always posted (even if |task_runner_| runs tasks on
-    // this thread) to guarantee that two async calls can't be reordered.
-    if (!message->has_flag(Message::kFlagIsSync)) {
-      auto reply_forwarder =
-          base::MakeUnique<ForwardToCallingThread>(std::move(responder));
-      task_runner_->PostTask(
-          FROM_HERE, base::Bind(forward_with_responder_, base::Passed(message),
-                                base::Passed(&reply_forwarder)));
-      return true;
-    }
-
-    SyncCallRestrictions::AssertSyncCallAllowed();
-
-    // If the InterfacePtr is bound to this thread, dispatch it directly.
-    if (task_runner_->RunsTasksOnCurrentThread()) {
-      forward_with_responder_.Run(std::move(*message), std::move(responder));
-      return true;
-    }
-
-    // If the InterfacePtr is bound on another thread, post the call.
-    // TODO(yzshen, watk): We block both this thread and the InterfacePtr
-    // thread. Ideally only this thread would block.
-    auto response = make_scoped_refptr(new SyncResponseInfo());
-    auto response_signaler = base::MakeUnique<SyncResponseSignaler>(response);
-    task_runner_->PostTask(
-        FROM_HERE, base::Bind(forward_with_responder_, base::Passed(message),
-                              base::Passed(&response_signaler)));
-
-    // Save the pending SyncResponseInfo so that if the sync call deletes
-    // |this|, we can signal the completion of the call to return from
-    // SyncWatch().
-    auto sync_calls = sync_calls_;
-    {
-      base::AutoLock l(sync_calls->lock);
-      sync_calls->pending_responses.push_back(response.get());
-    }
-
-    auto assign_true = [](bool* b) { *b = true; };
-    bool event_signaled = false;
-    SyncEventWatcher watcher(&response->event,
-                             base::Bind(assign_true, &event_signaled));
-    watcher.SyncWatch(&event_signaled);
-
-    {
-      base::AutoLock l(sync_calls->lock);
-      base::Erase(sync_calls->pending_responses, response.get());
-    }
-
-    if (response->received)
-      ignore_result(responder->Accept(&response->message));
-
-    return true;
-  }
-
-  // Data that we need to share between the threads involved in a sync call.
-  struct SyncResponseInfo
-      : public base::RefCountedThreadSafe<SyncResponseInfo> {
-    Message message;
-    bool received = false;
-    base::WaitableEvent event{base::WaitableEvent::ResetPolicy::MANUAL,
-                              base::WaitableEvent::InitialState::NOT_SIGNALED};
-
-   private:
-    friend class base::RefCountedThreadSafe<SyncResponseInfo>;
-  };
-
-  // A MessageReceiver that signals |response| when it either accepts the
-  // response message, or is destructed.
-  class SyncResponseSignaler : public MessageReceiver {
-   public:
-    explicit SyncResponseSignaler(scoped_refptr<SyncResponseInfo> response)
-        : response_(response) {}
-
-    ~SyncResponseSignaler() override {
-      // If Accept() was not called we must still notify the waiter that the
-      // sync call is finished.
-      if (response_)
-        response_->event.Signal();
-    }
-
-    bool Accept(Message* message) {
-      response_->message = std::move(*message);
-      response_->received = true;
-      response_->event.Signal();
-      response_ = nullptr;
-      return true;
-    }
-
-   private:
-    scoped_refptr<SyncResponseInfo> response_;
-  };
-
-  // A record of the pending sync responses for canceling pending sync calls
-  // when the owning ThreadSafeForwarder is destructed.
-  struct InProgressSyncCalls
-      : public base::RefCountedThreadSafe<InProgressSyncCalls> {
-    // |lock| protects access to |pending_responses|.
-    base::Lock lock;
-    std::vector<SyncResponseInfo*> pending_responses;
-  };
-
-  class ForwardToCallingThread : public MessageReceiver {
-   public:
-    explicit ForwardToCallingThread(std::unique_ptr<MessageReceiver> responder)
-        : responder_(std::move(responder)),
-          caller_task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
-
-   private:
-    bool Accept(Message* message) {
-      // The current instance will be deleted when this method returns, so we
-      // have to relinquish the responder's ownership so it does not get
-      // deleted.
-      caller_task_runner_->PostTask(
-          FROM_HERE,
-          base::Bind(&ForwardToCallingThread::CallAcceptAndDeleteResponder,
-                     base::Passed(std::move(responder_)),
-                     base::Passed(std::move(*message))));
-      return true;
-    }
-
-    static void CallAcceptAndDeleteResponder(
-        std::unique_ptr<MessageReceiver> responder,
-        Message message) {
-      ignore_result(responder->Accept(&message));
-    }
-
-    std::unique_ptr<MessageReceiver> responder_;
-    scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_;
-  };
-
-  ProxyType proxy_;
-  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  const ForwardMessageCallback forward_;
-  const ForwardMessageWithResponderCallback forward_with_responder_;
-  AssociatedGroup associated_group_;
-  scoped_refptr<InProgressSyncCalls> sync_calls_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadSafeForwarder);
-};
-
-template <typename InterfacePtrType>
-class ThreadSafeInterfacePtrBase
-    : public base::RefCountedThreadSafe<
-          ThreadSafeInterfacePtrBase<InterfacePtrType>> {
- public:
-  using InterfaceType = typename InterfacePtrType::InterfaceType;
-  using PtrInfoType = typename InterfacePtrType::PtrInfoType;
-
-  explicit ThreadSafeInterfacePtrBase(
-      std::unique_ptr<ThreadSafeForwarder<InterfaceType>> forwarder)
-      : forwarder_(std::move(forwarder)) {}
-
-  // Creates a ThreadSafeInterfacePtrBase wrapping an underlying non-thread-safe
-  // InterfacePtrType which is bound to the calling thread. All messages sent
-  // via this thread-safe proxy will internally be sent by first posting to this
-  // (the calling) thread's TaskRunner.
-  static scoped_refptr<ThreadSafeInterfacePtrBase> Create(
-      InterfacePtrType interface_ptr) {
-    scoped_refptr<PtrWrapper> wrapper =
-        new PtrWrapper(std::move(interface_ptr));
-    return new ThreadSafeInterfacePtrBase(wrapper->CreateForwarder());
-  }
-
-  // Creates a ThreadSafeInterfacePtrBase which binds the underlying
-  // non-thread-safe InterfacePtrType on the specified TaskRunner. All messages
-  // sent via this thread-safe proxy will internally be sent by first posting to
-  // that TaskRunner.
-  static scoped_refptr<ThreadSafeInterfacePtrBase> Create(
-      PtrInfoType ptr_info,
-      const scoped_refptr<base::SingleThreadTaskRunner>& bind_task_runner) {
-    scoped_refptr<PtrWrapper> wrapper = new PtrWrapper(bind_task_runner);
-    wrapper->BindOnTaskRunner(std::move(ptr_info));
-    return new ThreadSafeInterfacePtrBase(wrapper->CreateForwarder());
-  }
-
-  InterfaceType* get() { return &forwarder_->proxy(); }
-  InterfaceType* operator->() { return get(); }
-  InterfaceType& operator*() { return *get(); }
-
- private:
-  friend class base::RefCountedThreadSafe<
-      ThreadSafeInterfacePtrBase<InterfacePtrType>>;
-
-  struct PtrWrapperDeleter;
-
-  // Helper class which owns an |InterfacePtrType| instance on an appropriate
-  // thread. This is kept alive as long its bound within some
-  // ThreadSafeForwarder's callbacks.
-  class PtrWrapper
-      : public base::RefCountedThreadSafe<PtrWrapper, PtrWrapperDeleter> {
-   public:
-    explicit PtrWrapper(InterfacePtrType ptr)
-        : PtrWrapper(base::ThreadTaskRunnerHandle::Get()) {
-      ptr_ = std::move(ptr);
-      associated_group_ = *ptr_.internal_state()->associated_group();
-    }
-
-    explicit PtrWrapper(
-        const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
-        : task_runner_(task_runner) {}
-
-    void BindOnTaskRunner(AssociatedInterfacePtrInfo<InterfaceType> ptr_info) {
-      associated_group_ = AssociatedGroup(ptr_info.handle());
-      task_runner_->PostTask(FROM_HERE, base::Bind(&PtrWrapper::Bind, this,
-                                                   base::Passed(&ptr_info)));
-    }
-
-    void BindOnTaskRunner(InterfacePtrInfo<InterfaceType> ptr_info) {
-      // TODO(yzhsen): At the momment we don't have a group controller
-      // available. That means the user won't be able to pass associated
-      // endpoints on this interface (at least not immediately). In order to fix
-      // this, we need to create a MultiplexRouter immediately and bind it to
-      // the interface pointer on the |task_runner_|. Therefore, MultiplexRouter
-      // should be able to be created on a thread different than the one that it
-      // is supposed to listen on. crbug.com/682334
-      task_runner_->PostTask(FROM_HERE, base::Bind(&PtrWrapper::Bind, this,
-                                                   base::Passed(&ptr_info)));
-    }
-
-    std::unique_ptr<ThreadSafeForwarder<InterfaceType>> CreateForwarder() {
-      return base::MakeUnique<ThreadSafeForwarder<InterfaceType>>(
-          task_runner_, base::Bind(&PtrWrapper::Accept, this),
-          base::Bind(&PtrWrapper::AcceptWithResponder, this),
-          associated_group_);
-    }
-
-   private:
-    friend struct PtrWrapperDeleter;
-
-    ~PtrWrapper() {}
-
-    void Bind(PtrInfoType ptr_info) {
-      DCHECK(task_runner_->RunsTasksOnCurrentThread());
-      ptr_.Bind(std::move(ptr_info));
-    }
-
-    void Accept(Message message) {
-      ptr_.internal_state()->ForwardMessage(std::move(message));
-    }
-
-    void AcceptWithResponder(Message message,
-                             std::unique_ptr<MessageReceiver> responder) {
-      ptr_.internal_state()->ForwardMessageWithResponder(std::move(message),
-                                                         std::move(responder));
-    }
-
-    void DeleteOnCorrectThread() const {
-      if (!task_runner_->RunsTasksOnCurrentThread()) {
-        // NOTE: This is only called when there are no more references to
-        // |this|, so binding it unretained is both safe and necessary.
-        task_runner_->PostTask(FROM_HERE,
-                               base::Bind(&PtrWrapper::DeleteOnCorrectThread,
-                                          base::Unretained(this)));
-      } else {
-        delete this;
-      }
-    }
-
-    InterfacePtrType ptr_;
-    const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-    AssociatedGroup associated_group_;
-
-    DISALLOW_COPY_AND_ASSIGN(PtrWrapper);
-  };
-
-  struct PtrWrapperDeleter {
-    static void Destruct(const PtrWrapper* interface_ptr) {
-      interface_ptr->DeleteOnCorrectThread();
-    }
-  };
-
-  ~ThreadSafeInterfacePtrBase() {}
-
-  const std::unique_ptr<ThreadSafeForwarder<InterfaceType>> forwarder_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadSafeInterfacePtrBase);
-};
-
-template <typename Interface>
-using ThreadSafeAssociatedInterfacePtr =
-    ThreadSafeInterfacePtrBase<AssociatedInterfacePtr<Interface>>;
-
-template <typename Interface>
-using ThreadSafeInterfacePtr =
-    ThreadSafeInterfacePtrBase<InterfacePtr<Interface>>;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_THREAD_SAFE_INTERFACE_PTR_H_
diff --git a/mojo/public/cpp/bindings/type_converter.h b/mojo/public/cpp/bindings/type_converter.h
deleted file mode 100644
index 395eeb4..0000000
--- a/mojo/public/cpp/bindings/type_converter.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TYPE_CONVERTER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TYPE_CONVERTER_H_
-
-#include <stdint.h>
-
-#include <vector>
-
-namespace mojo {
-
-// NOTE: TypeConverter is deprecated. Please consider StructTraits /
-// UnionTraits / EnumTraits / ArrayTraits / MapTraits / StringTraits if you
-// would like to convert between custom types and the wire format of mojom
-// types.
-//
-// Specialize the following class:
-//   template <typename T, typename U> struct TypeConverter;
-// to perform type conversion for Mojom-defined structs and arrays. Here, T is
-// the target type; U is the input type.
-//
-// Specializations should implement the following interfaces:
-//   namespace mojo {
-//   template <>
-//   struct TypeConverter<X, Y> {
-//     static X Convert(const Y& input);
-//   };
-//   template <>
-//   struct TypeConverter<Y, X> {
-//     static Y Convert(const X& input);
-//   };
-//   }
-//
-// EXAMPLE:
-//
-// Suppose you have the following Mojom-defined struct:
-//
-//   module geometry {
-//   struct Point {
-//     int32_t x;
-//     int32_t y;
-//   };
-//   }
-//
-// Now, imagine you wanted to write a TypeConverter specialization for
-// gfx::Point. It might look like this:
-//
-//   namespace mojo {
-//   template <>
-//   struct TypeConverter<geometry::PointPtr, gfx::Point> {
-//     static geometry::PointPtr Convert(const gfx::Point& input) {
-//       geometry::PointPtr result;
-//       result->x = input.x();
-//       result->y = input.y();
-//       return result;
-//     }
-//   };
-//   template <>
-//   struct TypeConverter<gfx::Point, geometry::PointPtr> {
-//     static gfx::Point Convert(const geometry::PointPtr& input) {
-//       return input ? gfx::Point(input->x, input->y) : gfx::Point();
-//     }
-//   };
-//   }
-//
-// With the above TypeConverter defined, it is possible to write code like this:
-//
-//   void AcceptPoint(const geometry::PointPtr& input) {
-//     // With an explicit cast using the .To<> method.
-//     gfx::Point pt = input.To<gfx::Point>();
-//
-//     // With an explicit cast using the static From() method.
-//     geometry::PointPtr output = geometry::Point::From(pt);
-//
-//     // Inferring the input type using the ConvertTo helper function.
-//     gfx::Point pt2 = ConvertTo<gfx::Point>(input);
-//   }
-//
-template <typename T, typename U>
-struct TypeConverter;
-
-template <typename T, typename U>
-inline T ConvertTo(const U& obj);
-
-// The following specialization is useful when you are converting between
-// Array<POD> and std::vector<POD>.
-template <typename T>
-struct TypeConverter<T, T> {
-  static T Convert(const T& obj) { return obj; }
-};
-
-template <typename T, typename Container>
-struct TypeConverter<std::vector<T>, Container> {
-  static std::vector<T> Convert(const Container& container) {
-    std::vector<T> output;
-    output.reserve(container.size());
-    for (const auto& obj : container) {
-      output.push_back(ConvertTo<T>(obj));
-    }
-    return output;
-  }
-};
-
-// The following helper function is useful for shorthand. The compiler can infer
-// the input type, so you can write:
-//   OutputType out = ConvertTo<OutputType>(input);
-template <typename T, typename U>
-inline T ConvertTo(const U& obj) {
-  return TypeConverter<T, U>::Convert(obj);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TYPE_CONVERTER_H_
diff --git a/mojo/public/cpp/bindings/union_traits.h b/mojo/public/cpp/bindings/union_traits.h
deleted file mode 100644
index 292ee58..0000000
--- a/mojo/public/cpp/bindings/union_traits.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_UNION_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_UNION_TRAITS_H_
-
-namespace mojo {
-
-// This must be specialized for any type |T| to be serialized/deserialized as
-// a mojom union. |DataViewType| is the corresponding data view type of the
-// mojom union. For example, if the mojom union is example.Foo, |DataViewType|
-// will be example::FooDataView, which can also be referred to by
-// example::Foo::DataView (in chromium) and example::blink::Foo::DataView (in
-// blink).
-//
-// Similar to StructTraits, each specialization of UnionTraits implements the
-// following methods:
-//   1. Getters for each field in the Mojom type.
-//   2. Read() method.
-//   3. [Optional] IsNull() and SetToNull().
-//   4. [Optional] SetUpContext() and TearDownContext().
-// Please see the documentation of StructTraits for details of these methods.
-//
-// Unlike StructTraits, there is one more method to implement:
-//   5. A static GetTag() method indicating which field is the current active
-//      field for serialization:
-//
-//        static DataViewType::Tag GetTag(const T& input);
-//
-//      During serialization, only the field getter corresponding to this tag
-//      will be called.
-//
-template <typename DataViewType, typename T>
-struct UnionTraits;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_UNION_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/unique_ptr_impl_ref_traits.h b/mojo/public/cpp/bindings/unique_ptr_impl_ref_traits.h
deleted file mode 100644
index f1ac097..0000000
--- a/mojo/public/cpp/bindings/unique_ptr_impl_ref_traits.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_UNIQUE_PTR_IMPL_REF_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_UNIQUE_PTR_IMPL_REF_TRAITS_H_
-
-namespace mojo {
-
-// Traits for a binding's implementation reference type.
-// This corresponds to a unique_ptr reference type.
-template <typename Interface>
-struct UniquePtrImplRefTraits {
-  using PointerType = std::unique_ptr<Interface>;
-
-  static bool IsNull(const PointerType& ptr) { return !ptr; }
-  static Interface* GetRawPointer(PointerType* ptr) { return ptr->get(); }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_UNIQUE_PTR_IMPL_REF_TRAITS_H_
diff --git a/mojo/public/cpp/system/BUILD.gn b/mojo/public/cpp/system/BUILD.gn
deleted file mode 100644
index 35087ef..0000000
--- a/mojo/public/cpp/system/BUILD.gn
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Deletes libsystem.dylib from the build dir, since it shadows
-# /usr/lib/libSystem.dylib on macOS.
-# TODO(thakis): Remove this after a while.
-action("clean_up_old_dylib") {
-  script = "//build/rm.py"
-  stamp = "$target_gen_dir/clean_up_stamp"
-  outputs = [
-    stamp,
-  ]
-  args = [
-    "--stamp",
-    rebase_path(stamp, root_build_dir),
-    "-f",
-    "libsystem.dylib",
-  ]
-}
-
-component("system") {
-  output_name = "mojo_public_system_cpp"
-
-  sources = [
-    "buffer.cc",
-    "buffer.h",
-    "core.h",
-    "data_pipe.h",
-    "functions.h",
-    "handle.h",
-    "handle_signals_state.h",
-    "message.h",
-    "message_pipe.h",
-    "platform_handle.cc",
-    "platform_handle.h",
-    "simple_watcher.cc",
-    "simple_watcher.h",
-    "system_export.h",
-    "wait.cc",
-    "wait.h",
-    "wait_set.cc",
-    "wait_set.h",
-    "watcher.cc",
-    "watcher.h",
-  ]
-
-  public_deps = [
-    "//base",
-    "//mojo/public/c/system",
-  ]
-  deps = [
-    ":clean_up_old_dylib",
-  ]
-
-  defines = [ "MOJO_CPP_SYSTEM_IMPLEMENTATION" ]
-}
diff --git a/mojo/public/cpp/system/README.md b/mojo/public/cpp/system/README.md
deleted file mode 100644
index 782744f..0000000
--- a/mojo/public/cpp/system/README.md
+++ /dev/null
@@ -1,396 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo C++ System API
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-The Mojo C++ System API provides a convenient set of helper classes and
-functions for working with Mojo primitives. Unlike the low-level
-[C API](/mojo/public/c/system) (upon which this is built) this library takes
-advantage of C++ language features and common STL and `//base` types to provide
-a slightly more idiomatic interface to the Mojo system layer, making it
-generally easier to use.
-
-This document provides a brief guide to API usage with example code snippets.
-For a detailed API references please consult the headers in
-[//mojo/public/cpp/system](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/).
-
-Note that all API symbols referenced in this document are implicitly in the
-top-level `mojo` namespace.
-
-## Scoped, Typed Handles
-
-All types of Mojo handles in the C API are simply opaque, integral `MojoHandle`
-values. The C++ API has more strongly typed wrappers defined for different
-handle types: `MessagePipeHandle`, `SharedBufferHandle`,
-`DataPipeConsumerHandle`, `DataPipeProducerHandle`, and `WatcherHandle`.
-
-Each of these also has a corresponding, move-only, scoped type for safer usage:
-`ScopedMessagePipeHandle`, `ScopedSharedBufferHandle`, and so on. When a scoped
-handle type is destroyed, its handle is automatically closed via `MojoClose`.
-When working with raw handles you should **always** prefer to use one of the
-scoped types for ownership.
-
-Similar to `std::unique_ptr`, scoped handle types expose a `get()` method to get
-at the underlying unscoped handle type as well as the `->` operator to
-dereference the scoper and make calls directly on the underlying handle type.
-
-## Message Pipes
-
-There are two ways to create a new message pipe using the C++ API. You may
-construct a `MessagePipe` object:
-
-``` cpp
-mojo::MessagePipe pipe;
-
-// NOTE: Because pipes are bi-directional there is no implicit semantic
-// difference between |handle0| or |handle1| here. They're just two ends of a
-// pipe. The choice to treat one as a "client" and one as a "server" is entirely
-// a the API user's decision.
-mojo::ScopedMessagePipeHandle client = std::move(pipe.handle0);
-mojo::ScopedMessagePipeHandle server = std::move(pipe.handle1);
-```
-
-or you may call `CreateMessagePipe`:
-
-``` cpp
-mojo::ScopedMessagePipeHandle client;
-mojo::ScopedMessagePipeHandle server;
-mojo::CreateMessagePipe(nullptr, &client, &server);
-```
-
-There are also some helper functions for constructing message objects and
-reading/writing them on pipes using the library's more strongly-typed C++
-handles:
-
-``` cpp
-mojo::ScopedMessageHandle message;
-mojo::AllocMessage(6, nullptr, 0, MOJO_ALLOC_MESSAGE_FLAG_NONE, &message);
-
-void *buffer;
-mojo::GetMessageBuffer(message.get(), &buffer);
-
-const std::string kMessage = "hello";
-std::copy(kMessage.begin(), kMessage.end(), static_cast<char*>(buffer));
-
-mojo::WriteMessageNew(client.get(), std::move(message),
-                      MOJO_WRITE_MESSAGE_FLAG_NONE);
-
-// Some time later...
-
-mojo::ScopedMessageHandle received_message;
-uint32_t num_bytes;
-mojo::ReadMessageNew(server.get(), &received_message, &num_bytes, nullptr,
-                     nullptr, MOJO_READ_MESSAGE_FLAG_NONE);
-```
-
-See [message_pipe.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/message_pipe.h)
-for detailed C++ message pipe API documentation.
-
-## Data Pipes
-
-Similar to [Message Pipes](#Message-Pipes), the C++ library has some simple
-helpers for more strongly-typed data pipe usage:
-
-``` cpp
-mojo::DataPipe pipe;
-mojo::ScopedDataPipeProducerHandle producer = std::move(pipe.producer);
-mojo::ScopedDataPipeConsumerHandle consumer = std::move(pipe.consumer);
-
-// Or alternatively:
-mojo::ScopedDataPipeProducerHandle producer;
-mojo::ScopedDataPipeConsumerHandle consumer;
-mojo::CreateDataPipe(null, &producer, &consumer);
-```
-
-// Reads from a data pipe. See |MojoReadData()| for complete documentation.
-inline MojoResult ReadDataRaw(DataPipeConsumerHandle data_pipe_consumer,
-                              void* elements,
-                              uint32_t* num_bytes,
-                              MojoReadDataFlags flags) {
-  return MojoReadData(data_pipe_consumer.value(), elements, num_bytes, flags);
-}
-
-// Begins a two-phase read
-C++ helpers which correspond directly to the
-[Data Pipe C API](/mojo/public/c/system#Data-Pipes) for immediate and two-phase
-I/O are provided as well. For example:
-
-``` cpp
-uint32_t num_bytes = 7;
-mojo::WriteDataRaw(producer.get(), "hihihi",
-                   &num_bytes, MOJO_WRITE_DATA_FLAG_NONE);
-
-// Some time later...
-
-char buffer[64];
-uint32_t num_bytes = 64;
-mojo::ReadDataRaw(consumer.get(), buffer, &num_bytes, MOJO_READ_DATA_FLAG_NONE);
-```
-
-See [data_pipe.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/data_pipe.h)
-for detailed C++ data pipe API documentation.
-
-## Shared Buffers
-
-A new shared buffers can be allocated like so:
-
-``` cpp
-mojo::ScopedSharedBufferHandle buffer =
-    mojo::ScopedSharedBufferHandle::Create(4096);
-```
-
-This new handle can be cloned arbitrarily many times by using the underlying
-handle's `Clone` method:
-
-``` cpp
-mojo::ScopedSharedBufferHandle another_handle = buffer->Clone();
-mojo::ScopedSharedBufferHandle read_only_handle =
-    buffer->Clone(mojo::SharedBufferHandle::AccessMode::READ_ONLY);
-```
-
-And finally the library also provides a scoper for mapping the shared buffer's
-memory:
-
-``` cpp
-mojo::ScopedSharedBufferMapping mapping = buffer->Map(64);
-static_cast<int*>(mapping.get()) = 42;
-
-mojo::ScopedSharedBufferMapping another_mapping = buffer->MapAtOffset(64, 4);
-static_cast<int*>(mapping.get()) = 43;
-```
-
-When `mapping` and `another_mapping` are destroyed, they automatically unmap
-their respective memory regions.
-
-See [buffer.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/buffer.h)
-for detailed C++ shared buffer API documentation.
-
-## Native Platform Handles (File Descriptors, Windows Handles, *etc.*)
-
-The C++ library provides several helpers for wrapping system handle types.
-These are specifically useful when working with a few `//base` types, namely
-`base::PlatformFile` and `base::SharedMemoryHandle`. See
-[platform_handle.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/platform_handle.h)
-for detailed C++ platform handle API documentation.
-
-## Signals & Watchers
-
-For an introduction to the concepts of handle signals and watchers, check out
-the C API's documentation on [Signals & Watchers](/mojo/public/c/system#Signals-Watchers).
-
-### Querying Signals
-
-Any C++ handle type's last known signaling state can be queried by calling the
-`QuerySignalsState` method on the handle:
-
-``` cpp
-mojo::MessagePipe message_pipe;
-mojo::DataPipe data_pipe;
-mojo::HandleSignalsState a = message_pipe.handle0->QuerySignalsState();
-mojo::HandleSignalsState b = data_pipe.consumer->QuerySignalsState();
-```
-
-The `HandleSignalsState` is a thin wrapper interface around the C API's
-`MojoHandleSignalsState` structure with convenient accessors for testing
-the signal bitmasks. Whereas when using the C API you might write:
-
-``` c
-struct MojoHandleSignalsState state;
-MojoQueryHandleSignalsState(handle0, &state);
-if (state.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE) {
-  // ...
-}
-```
-
-the C++ API equivalent would be:
-
-``` cpp
-if (message_pipe.handle0->QuerySignalsState().readable()) {
-  // ...
-}
-```
-
-### Watching Handles
-
-The [`mojo::SimpleWatcher`](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/simple_watcher.h)
-class serves as a convenient helper for using the [low-level watcher API](/mojo/public/c/system#Signals-Watchers)
-to watch a handle for signaling state changes. A `SimpleWatcher` is bound to a
-single thread and always dispatches its notifications on a
-`base::SingleThreadTaskRunner`.
-
-`SimpleWatcher` has two possible modes of operation, selected at construction
-time by the `mojo::SimpleWatcher::ArmingPolicy` enum:
-
-* `MANUAL` mode requires the user to manually call `Arm` and/or `ArmOrNotify`
-  before any notifications will fire regarding the state of the watched handle.
-  Every time the notification callback is run, the `SimpleWatcher` must be
-  rearmed again before the next one can fire. See 
-  [Arming a Watcher](/mojo/public/c/system#Arming-a-Watcher) and the
-  documentation in `SimpleWatcher`'s header.
-
-* `AUTOMATIC` mode ensures that the `SimpleWatcher` always either is armed or
-  has a pending notification task queued for execution.
-
-`AUTOMATIC` mode is more convenient but can result in redundant notification
-tasks, especially if the provided callback does not make a strong effort to
-return the watched handle to an uninteresting signaling state (by *e.g.*,
-reading all its available messages when notified of readability.)
-
-Example usage:
-
-``` cpp
-class PipeReader {
- public:
-  PipeReader(mojo::ScopedMessagePipeHandle pipe)
-      : pipe_(std::move(pipe)),
-        watcher_(mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC) {
-    // NOTE: base::Unretained is safe because the callback can never be run
-    // after SimpleWatcher destruction.
-    watcher_.Watch(pipe_.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                   base::Bind(&PipeReader::OnReadable, base::Unretained(this)));
-  }
-
-  ~PipeReader() {}
-
- private:
-  void OnReadable(MojoResult result) {
-    while (result == MOJO_RESULT_OK) {
-      mojo::ScopedMessageHandle message;
-      uint32_t num_bytes;
-      result = mojo::ReadMessageNew(pipe_.get(), &message, &num_bytes, nullptr,
-                                    nullptr, MOJO_READ_MESSAGE_FLAG_NONE);
-      DCHECK_EQ(result, MOJO_RESULT_OK);
-      messages_.emplace_back(std::move(message));
-    }
-  }
-
-  mojo::ScopedMessagePipeHandle pipe_;
-  mojo::SimpleWatcher watcher_;
-  std::vector<mojo::ScopedMessageHandle> messages_;
-};
-
-mojo::MessagePipe pipe;
-PipeReader reader(std::move(pipe.handle0));
-
-// Written messages will asynchronously end up in |reader.messages_|.
-WriteABunchOfStuff(pipe.handle1.get());
-```
-
-## Synchronous Waiting
-
-The C++ System API defines some utilities to block a calling thread while
-waiting for one or more handles to change signaling state in an interesting way.
-These threads combine usage of the [low-level Watcher API](/mojo/public/c/system#Signals-Watchers)
-with common synchronization primitives (namely `base::WaitableEvent`.)
-
-While these API features should be used sparingly, they are sometimes necessary.
-
-See the documentation in 
-[wait.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/wait.h)
-and [wait_set.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/wait_set.h)
-for a more detailed API reference.
-
-### Waiting On a Single Handle
-
-The `mojo::Wait` function simply blocks the calling thread until a given signal
-mask is either partially satisfied or fully unsatisfiable on a given handle.
-
-``` cpp
-mojo::MessagePipe pipe;
-mojo::WriteMessageRaw(pipe.handle0.get(), "hey", 3, nullptr, nullptr,
-                      MOJO_WRITE_MESSAGE_FLAG_NONE);
-MojoResult result = mojo::Wait(pipe.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-DCHECK_EQ(result, MOJO_RESULT_OK);
-
-// Guaranteed to succeed because we know |handle1| is readable now.
-mojo::ScopedMessageHandle message;
-uint32_t num_bytes;
-mojo::ReadMessageNew(pipe.handle1.get(), &num_bytes, nullptr, nullptr,
-                     MOJO_READ_MESSAGE_FLAG_NONE);
-```
-
-`mojo::Wait` is most typically useful in limited testing scenarios.
-
-### Waiting On Multiple Handles
-
-`mojo::WaitMany` provides a simple API to wait on multiple handles
-simultaneously, returning when any handle's given signal mask is either
-partially satisfied or fully unsatisfiable.
-
-``` cpp
-mojo::MessagePipe a, b;
-GoDoSomethingWithPipes(std:move(a.handle1), std::move(b.handle1));
-
-mojo::MessagePipeHandle handles[2] = {a.handle0.get(), b.handle0.get()};
-MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
-                                MOJO_HANDLE_SIGNAL_READABLE};
-size_t ready_index;
-MojoResult result = mojo::WaitMany(handles, signals, 2, &ready_index);
-if (ready_index == 0) {
-  // a.handle0 was ready.
-} else {
-  // b.handle0 was ready.
-}
-```
-
-Similar to `mojo::Wait`, `mojo::WaitMany` is primarily useful in testing. When
-waiting on multiple handles in production code, you should almost always instead 
-use a more efficient and more flexible `mojo::WaitSet` as described in the next
-section.
-
-### Waiting On Handles and Events Simultaneously
-
-Typically when waiting on one or more handles to signal, the set of handles and
-conditions being waited upon do not change much between consecutive blocking
-waits. It's also often useful to be able to interrupt the blocking operation
-as efficiently as possible.
-
-[`mojo::WaitSet`](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/wait_set.h)
-is designed with these conditions in mind. A `WaitSet` maintains a persistent
-set of (not-owned) Mojo handles and `base::WaitableEvent`s, which may be
-explicitly added to or removed from the set at any time.
-
-The `WaitSet` may be waited upon repeatedly, each time blocking the calling
-thread until either one of the handles attains an interesting signaling state or
-one of the events is signaled. For example let's suppose we want to wait up to 5
-seconds for either one of two handles to become readable:
-
-``` cpp
-base::WaitableEvent timeout_event(
-    base::WaitableEvent::ResetPolicy::MANUAL,
-    base::WaitableEvent::InitialState::NOT_SIGNALED);
-mojo::MessagePipe a, b;
-
-GoDoStuffWithPipes(std::move(a.handle1), std::move(b.handle1));
-
-mojo::WaitSet wait_set;
-wait_set.AddHandle(a.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-wait_set.AddHandle(b.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-wait_set.AddEvent(&timeout_event);
-
-// Ensure the Wait() lasts no more than 5 seconds.
-bg_thread->task_runner()->PostDelayedTask(
-    FROM_HERE,
-    base::Bind([](base::WaitableEvent* e) { e->Signal(); }, &timeout_event);
-    base::TimeDelta::FromSeconds(5));
-
-base::WaitableEvent* ready_event = nullptr;
-size_t num_ready_handles = 1;
-mojo::Handle ready_handle;
-MojoResult ready_result;
-wait_set.Wait(&ready_event, &num_ready_handles, &ready_handle, &ready_result);
-
-// The apex of thread-safety.
-bg_thread->Stop();
-
-if (ready_event) {
-  // The event signaled...
-}
-
-if (num_ready_handles > 0) {
-  // At least one of the handles signaled...
-  // NOTE: This and the above condition are not mutually exclusive. If handle
-  // signaling races with timeout, both things might be true.
-}
-```
diff --git a/mojo/public/cpp/system/buffer.cc b/mojo/public/cpp/system/buffer.cc
deleted file mode 100644
index 49f45d8..0000000
--- a/mojo/public/cpp/system/buffer.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/buffer.h"
-
-namespace mojo {
-
-// static
-ScopedSharedBufferHandle SharedBufferHandle::Create(uint64_t num_bytes) {
-  MojoCreateSharedBufferOptions options = {
-      sizeof(options), MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE};
-  SharedBufferHandle handle;
-  MojoCreateSharedBuffer(&options, num_bytes, handle.mutable_value());
-  return MakeScopedHandle(handle);
-}
-
-ScopedSharedBufferHandle SharedBufferHandle::Clone(
-    SharedBufferHandle::AccessMode access_mode) const {
-  ScopedSharedBufferHandle result;
-  if (!is_valid())
-    return result;
-
-  MojoDuplicateBufferHandleOptions options = {
-      sizeof(options), MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE};
-  if (access_mode == AccessMode::READ_ONLY)
-    options.flags |= MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
-  SharedBufferHandle result_handle;
-  MojoDuplicateBufferHandle(value(), &options, result_handle.mutable_value());
-  result.reset(result_handle);
-  return result;
-}
-
-ScopedSharedBufferMapping SharedBufferHandle::Map(uint64_t size) const {
-  return MapAtOffset(size, 0);
-}
-
-ScopedSharedBufferMapping SharedBufferHandle::MapAtOffset(
-    uint64_t size,
-    uint64_t offset) const {
-  void* buffer = nullptr;
-  MojoMapBuffer(value(), offset, size, &buffer, MOJO_MAP_BUFFER_FLAG_NONE);
-  return ScopedSharedBufferMapping(buffer);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/buffer.h b/mojo/public/cpp/system/buffer.h
deleted file mode 100644
index 1ae923c..0000000
--- a/mojo/public/cpp/system/buffer.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file provides a C++ wrapping around the Mojo C API for shared buffers,
-// replacing the prefix of "Mojo" with a "mojo" namespace, and using more
-// strongly-typed representations of |MojoHandle|s.
-//
-// Please see "mojo/public/c/system/buffer.h" for complete documentation of the
-// API.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_BUFFER_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_BUFFER_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/system_export.h"
-
-namespace mojo {
-namespace internal {
-
-struct Unmapper {
-  void operator()(void* buffer) {
-    MojoResult result = MojoUnmapBuffer(buffer);
-    DCHECK_EQ(MOJO_RESULT_OK, result);
-  }
-};
-
-}  // namespace internal
-
-using ScopedSharedBufferMapping = std::unique_ptr<void, internal::Unmapper>;
-
-class SharedBufferHandle;
-
-typedef ScopedHandleBase<SharedBufferHandle> ScopedSharedBufferHandle;
-
-// A strongly-typed representation of a |MojoHandle| referring to a shared
-// buffer.
-class MOJO_CPP_SYSTEM_EXPORT SharedBufferHandle
-    : NON_EXPORTED_BASE(public Handle) {
- public:
-  enum class AccessMode {
-    READ_WRITE,
-    READ_ONLY,
-  };
-
-  SharedBufferHandle() {}
-  explicit SharedBufferHandle(MojoHandle value) : Handle(value) {}
-
-  // Copying and assignment allowed.
-
-  // Creates a new SharedBufferHandle. Returns an invalid handle on failure.
-  static ScopedSharedBufferHandle Create(uint64_t num_bytes);
-
-  // Clones this shared buffer handle. If |access_mode| is READ_ONLY or this is
-  // a read-only handle, the new handle will be read-only. On failure, this will
-  // return an empty result.
-  ScopedSharedBufferHandle Clone(AccessMode = AccessMode::READ_WRITE) const;
-
-  // Maps |size| bytes of this shared buffer. On failure, this will return a
-  // null mapping.
-  ScopedSharedBufferMapping Map(uint64_t size) const;
-
-  // Maps |size| bytes of this shared buffer, starting |offset| bytes into the
-  // buffer. On failure, this will return a null mapping.
-  ScopedSharedBufferMapping MapAtOffset(uint64_t size, uint64_t offset) const;
-};
-
-static_assert(sizeof(SharedBufferHandle) == sizeof(Handle),
-              "Bad size for C++ SharedBufferHandle");
-static_assert(sizeof(ScopedSharedBufferHandle) == sizeof(SharedBufferHandle),
-              "Bad size for C++ ScopedSharedBufferHandle");
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_BUFFER_H_
diff --git a/mojo/public/cpp/system/core.h b/mojo/public/cpp/system/core.h
deleted file mode 100644
index f1d18d9..0000000
--- a/mojo/public/cpp/system/core.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_CORE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_CORE_H_
-
-#include "mojo/public/cpp/system/buffer.h"
-#include "mojo/public/cpp/system/data_pipe.h"
-#include "mojo/public/cpp/system/functions.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_CORE_H_
diff --git a/mojo/public/cpp/system/data_pipe.h b/mojo/public/cpp/system/data_pipe.h
deleted file mode 100644
index 0dbc3c7..0000000
--- a/mojo/public/cpp/system/data_pipe.h
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file provides a C++ wrapping around the Mojo C API for data pipes,
-// replacing the prefix of "Mojo" with a "mojo" namespace, and using more
-// strongly-typed representations of |MojoHandle|s.
-//
-// Please see "mojo/public/c/system/data_pipe.h" for complete documentation of
-// the API.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_DATA_PIPE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_DATA_PIPE_H_
-
-#include <stdint.h>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace mojo {
-
-// A strongly-typed representation of a |MojoHandle| to the producer end of a
-// data pipe.
-class DataPipeProducerHandle : public Handle {
- public:
-  DataPipeProducerHandle() {}
-  explicit DataPipeProducerHandle(MojoHandle value) : Handle(value) {}
-
-  // Copying and assignment allowed.
-};
-
-static_assert(sizeof(DataPipeProducerHandle) == sizeof(Handle),
-              "Bad size for C++ DataPipeProducerHandle");
-
-typedef ScopedHandleBase<DataPipeProducerHandle> ScopedDataPipeProducerHandle;
-static_assert(sizeof(ScopedDataPipeProducerHandle) ==
-                  sizeof(DataPipeProducerHandle),
-              "Bad size for C++ ScopedDataPipeProducerHandle");
-
-// A strongly-typed representation of a |MojoHandle| to the consumer end of a
-// data pipe.
-class DataPipeConsumerHandle : public Handle {
- public:
-  DataPipeConsumerHandle() {}
-  explicit DataPipeConsumerHandle(MojoHandle value) : Handle(value) {}
-
-  // Copying and assignment allowed.
-};
-
-static_assert(sizeof(DataPipeConsumerHandle) == sizeof(Handle),
-              "Bad size for C++ DataPipeConsumerHandle");
-
-typedef ScopedHandleBase<DataPipeConsumerHandle> ScopedDataPipeConsumerHandle;
-static_assert(sizeof(ScopedDataPipeConsumerHandle) ==
-                  sizeof(DataPipeConsumerHandle),
-              "Bad size for C++ ScopedDataPipeConsumerHandle");
-
-// Creates a new data pipe. See |MojoCreateDataPipe()| for complete
-// documentation.
-inline MojoResult CreateDataPipe(
-    const MojoCreateDataPipeOptions* options,
-    ScopedDataPipeProducerHandle* data_pipe_producer,
-    ScopedDataPipeConsumerHandle* data_pipe_consumer) {
-  DCHECK(data_pipe_producer);
-  DCHECK(data_pipe_consumer);
-  DataPipeProducerHandle producer_handle;
-  DataPipeConsumerHandle consumer_handle;
-  MojoResult rv = MojoCreateDataPipe(options,
-                                     producer_handle.mutable_value(),
-                                     consumer_handle.mutable_value());
-  // Reset even on failure (reduces the chances that a "stale"/incorrect handle
-  // will be used).
-  data_pipe_producer->reset(producer_handle);
-  data_pipe_consumer->reset(consumer_handle);
-  return rv;
-}
-
-// Writes to a data pipe. See |MojoWriteData| for complete documentation.
-inline MojoResult WriteDataRaw(DataPipeProducerHandle data_pipe_producer,
-                               const void* elements,
-                               uint32_t* num_bytes,
-                               MojoWriteDataFlags flags) {
-  return MojoWriteData(data_pipe_producer.value(), elements, num_bytes, flags);
-}
-
-// Begins a two-phase write to a data pipe. See |MojoBeginWriteData()| for
-// complete documentation.
-inline MojoResult BeginWriteDataRaw(DataPipeProducerHandle data_pipe_producer,
-                                    void** buffer,
-                                    uint32_t* buffer_num_bytes,
-                                    MojoWriteDataFlags flags) {
-  return MojoBeginWriteData(
-      data_pipe_producer.value(), buffer, buffer_num_bytes, flags);
-}
-
-// Completes a two-phase write to a data pipe. See |MojoEndWriteData()| for
-// complete documentation.
-inline MojoResult EndWriteDataRaw(DataPipeProducerHandle data_pipe_producer,
-                                  uint32_t num_bytes_written) {
-  return MojoEndWriteData(data_pipe_producer.value(), num_bytes_written);
-}
-
-// Reads from a data pipe. See |MojoReadData()| for complete documentation.
-inline MojoResult ReadDataRaw(DataPipeConsumerHandle data_pipe_consumer,
-                              void* elements,
-                              uint32_t* num_bytes,
-                              MojoReadDataFlags flags) {
-  return MojoReadData(data_pipe_consumer.value(), elements, num_bytes, flags);
-}
-
-// Begins a two-phase read from a data pipe. See |MojoBeginReadData()| for
-// complete documentation.
-inline MojoResult BeginReadDataRaw(DataPipeConsumerHandle data_pipe_consumer,
-                                   const void** buffer,
-                                   uint32_t* buffer_num_bytes,
-                                   MojoReadDataFlags flags) {
-  return MojoBeginReadData(
-      data_pipe_consumer.value(), buffer, buffer_num_bytes, flags);
-}
-
-// Completes a two-phase read from a data pipe. See |MojoEndReadData()| for
-// complete documentation.
-inline MojoResult EndReadDataRaw(DataPipeConsumerHandle data_pipe_consumer,
-                                 uint32_t num_bytes_read) {
-  return MojoEndReadData(data_pipe_consumer.value(), num_bytes_read);
-}
-
-// A wrapper class that automatically creates a data pipe and owns both handles.
-// TODO(vtl): Make an even more friendly version? (Maybe templatized for a
-// particular type instead of some "element"? Maybe functions that take
-// vectors?)
-class DataPipe {
- public:
-  DataPipe();
-  explicit DataPipe(const MojoCreateDataPipeOptions& options);
-  ~DataPipe();
-
-  ScopedDataPipeProducerHandle producer_handle;
-  ScopedDataPipeConsumerHandle consumer_handle;
-};
-
-inline DataPipe::DataPipe() {
-  MojoResult result =
-      CreateDataPipe(nullptr, &producer_handle, &consumer_handle);
-  ALLOW_UNUSED_LOCAL(result);
-  DCHECK_EQ(MOJO_RESULT_OK, result);
-}
-
-inline DataPipe::DataPipe(const MojoCreateDataPipeOptions& options) {
-  MojoResult result =
-      CreateDataPipe(&options, &producer_handle, &consumer_handle);
-  ALLOW_UNUSED_LOCAL(result);
-  DCHECK_EQ(MOJO_RESULT_OK, result);
-}
-
-inline DataPipe::~DataPipe() {
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_DATA_PIPE_H_
diff --git a/mojo/public/cpp/system/functions.h b/mojo/public/cpp/system/functions.h
deleted file mode 100644
index 31edf57..0000000
--- a/mojo/public/cpp/system/functions.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file provides a C++ wrapping around the standalone functions of the Mojo
-// C API, replacing the prefix of "Mojo" with a "mojo" namespace.
-//
-// Please see "mojo/public/c/system/functions.h" for complete documentation of
-// the API.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_FUNCTIONS_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_FUNCTIONS_H_
-
-#include "mojo/public/c/system/functions.h"
-
-namespace mojo {
-
-// Returns the current |MojoTimeTicks| value. See |MojoGetTimeTicksNow()| for
-// complete documentation.
-inline MojoTimeTicks GetTimeTicksNow() {
-  return MojoGetTimeTicksNow();
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_FUNCTIONS_H_
diff --git a/mojo/public/cpp/system/handle.h b/mojo/public/cpp/system/handle.h
deleted file mode 100644
index 781944e..0000000
--- a/mojo/public/cpp/system/handle.h
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_HANDLE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_HANDLE_H_
-
-#include <stdint.h>
-#include <limits>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/handle_signals_state.h"
-
-namespace mojo {
-
-// OVERVIEW
-//
-// |Handle| and |...Handle|:
-//
-// |Handle| is a simple, copyable wrapper for the C type |MojoHandle| (which is
-// just an integer). Its purpose is to increase type-safety, not provide
-// lifetime management. For the same purpose, we have trivial *subclasses* of
-// |Handle|, e.g., |MessagePipeHandle| and |DataPipeProducerHandle|. |Handle|
-// and its subclasses impose *no* extra overhead over using |MojoHandle|s
-// directly.
-//
-// Note that though we provide constructors for |Handle|/|...Handle| from a
-// |MojoHandle|, we do not provide, e.g., a constructor for |MessagePipeHandle|
-// from a |Handle|. This is for type safety: If we did, you'd then be able to
-// construct a |MessagePipeHandle| from, e.g., a |DataPipeProducerHandle| (since
-// it's a |Handle|).
-//
-// |ScopedHandleBase| and |Scoped...Handle|:
-//
-// |ScopedHandleBase<HandleType>| is a templated scoped wrapper, for the handle
-// types above (in the same sense that a C++11 |unique_ptr<T>| is a scoped
-// wrapper for a |T*|). It provides lifetime management, closing its owned
-// handle on destruction. It also provides (emulated) move semantics, again
-// along the lines of C++11's |unique_ptr| (and exactly like Chromium's
-// |scoped_ptr|).
-//
-// |ScopedHandle| is just (a typedef of) a |ScopedHandleBase<Handle>|.
-// Similarly, |ScopedMessagePipeHandle| is just a
-// |ScopedHandleBase<MessagePipeHandle>|. Etc. Note that a
-// |ScopedMessagePipeHandle| is *not* a (subclass of) |ScopedHandle|.
-//
-// Wrapper functions:
-//
-// We provide simple wrappers for the |Mojo...()| functions (in
-// mojo/public/c/system/core.h -- see that file for details on individual
-// functions).
-//
-// The general guideline is functions that imply ownership transfer of a handle
-// should take (or produce) an appropriate |Scoped...Handle|, while those that
-// don't take a |...Handle|. For example, |CreateMessagePipe()| has two
-// |ScopedMessagePipe| "out" parameters, whereas |Wait()| and |WaitMany()| take
-// |Handle| parameters. Some, have both: e.g., |DuplicatedBuffer()| takes a
-// suitable (unscoped) handle (e.g., |SharedBufferHandle|) "in" parameter and
-// produces a suitable scoped handle (e.g., |ScopedSharedBufferHandle| a.k.a.
-// |ScopedHandleBase<SharedBufferHandle>|) as an "out" parameter.
-//
-// An exception are some of the |...Raw()| functions. E.g., |CloseRaw()| takes a
-// |Handle|, leaving the user to discard the wrapper.
-//
-// ScopedHandleBase ------------------------------------------------------------
-
-// Scoper for the actual handle types defined further below. It's move-only,
-// like the C++11 |unique_ptr|.
-template <class HandleType>
-class ScopedHandleBase {
- public:
-  using RawHandleType = HandleType;
-
-  ScopedHandleBase() {}
-  explicit ScopedHandleBase(HandleType handle) : handle_(handle) {}
-  ~ScopedHandleBase() { CloseIfNecessary(); }
-
-  template <class CompatibleHandleType>
-  explicit ScopedHandleBase(ScopedHandleBase<CompatibleHandleType> other)
-      : handle_(other.release()) {}
-
-  // Move-only constructor and operator=.
-  ScopedHandleBase(ScopedHandleBase&& other) : handle_(other.release()) {}
-  ScopedHandleBase& operator=(ScopedHandleBase&& other) {
-    if (&other != this) {
-      CloseIfNecessary();
-      handle_ = other.release();
-    }
-    return *this;
-  }
-
-  const HandleType& get() const { return handle_; }
-  const HandleType* operator->() const { return &handle_; }
-
-  template <typename PassedHandleType>
-  static ScopedHandleBase<HandleType> From(
-      ScopedHandleBase<PassedHandleType> other) {
-    static_assert(
-        sizeof(static_cast<PassedHandleType*>(static_cast<HandleType*>(0))),
-        "HandleType is not a subtype of PassedHandleType");
-    return ScopedHandleBase<HandleType>(
-        static_cast<HandleType>(other.release().value()));
-  }
-
-  void swap(ScopedHandleBase& other) { handle_.swap(other.handle_); }
-
-  HandleType release() WARN_UNUSED_RESULT {
-    HandleType rv;
-    rv.swap(handle_);
-    return rv;
-  }
-
-  void reset(HandleType handle = HandleType()) {
-    CloseIfNecessary();
-    handle_ = handle;
-  }
-
-  bool is_valid() const { return handle_.is_valid(); }
-
-  bool operator==(const ScopedHandleBase& other) const {
-    return handle_.value() == other.get().value();
-  }
-
- private:
-  void CloseIfNecessary() {
-    if (handle_.is_valid())
-      handle_.Close();
-  }
-
-  HandleType handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedHandleBase);
-};
-
-template <typename HandleType>
-inline ScopedHandleBase<HandleType> MakeScopedHandle(HandleType handle) {
-  return ScopedHandleBase<HandleType>(handle);
-}
-
-// Handle ----------------------------------------------------------------------
-
-const MojoHandle kInvalidHandleValue = MOJO_HANDLE_INVALID;
-
-// Wrapper base class for |MojoHandle|.
-class Handle {
- public:
-  Handle() : value_(kInvalidHandleValue) {}
-  explicit Handle(MojoHandle value) : value_(value) {}
-  ~Handle() {}
-
-  void swap(Handle& other) {
-    MojoHandle temp = value_;
-    value_ = other.value_;
-    other.value_ = temp;
-  }
-
-  bool is_valid() const { return value_ != kInvalidHandleValue; }
-
-  const MojoHandle& value() const { return value_; }
-  MojoHandle* mutable_value() { return &value_; }
-  void set_value(MojoHandle value) { value_ = value; }
-
-  void Close() {
-    DCHECK(is_valid());
-    MojoResult result = MojoClose(value_);
-    ALLOW_UNUSED_LOCAL(result);
-    DCHECK_EQ(MOJO_RESULT_OK, result);
-  }
-
-  HandleSignalsState QuerySignalsState() const {
-    HandleSignalsState signals_state;
-    MojoResult result = MojoQueryHandleSignalsState(
-        value_, static_cast<MojoHandleSignalsState*>(&signals_state));
-    DCHECK_EQ(MOJO_RESULT_OK, result);
-    return signals_state;
-  }
-
- private:
-  MojoHandle value_;
-
-  // Copying and assignment allowed.
-};
-
-// Should have zero overhead.
-static_assert(sizeof(Handle) == sizeof(MojoHandle), "Bad size for C++ Handle");
-
-// The scoper should also impose no more overhead.
-typedef ScopedHandleBase<Handle> ScopedHandle;
-static_assert(sizeof(ScopedHandle) == sizeof(Handle),
-              "Bad size for C++ ScopedHandle");
-
-// |Close()| takes ownership of the handle, since it'll invalidate it.
-// Note: There's nothing to do, since the argument will be destroyed when it
-// goes out of scope.
-template <class HandleType>
-inline void Close(ScopedHandleBase<HandleType> /*handle*/) {
-}
-
-// Most users should typically use |Close()| (above) instead.
-inline MojoResult CloseRaw(Handle handle) {
-  return MojoClose(handle.value());
-}
-
-// Strict weak ordering, so that |Handle|s can be used as keys in |std::map|s,
-inline bool operator<(const Handle a, const Handle b) {
-  return a.value() < b.value();
-}
-
-// Comparison, so that |Handle|s can be used as keys in hash maps.
-inline bool operator==(const Handle a, const Handle b) {
-  return a.value() == b.value();
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_HANDLE_H_
diff --git a/mojo/public/cpp/system/handle_signals_state.h b/mojo/public/cpp/system/handle_signals_state.h
deleted file mode 100644
index 9e2430f..0000000
--- a/mojo/public/cpp/system/handle_signals_state.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_HANDLE_SIGNALS_STATE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_HANDLE_SIGNALS_STATE_H_
-
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/system_export.h"
-
-namespace mojo {
-
-// A convenience wrapper around the MojoHandleSignalsState struct.
-struct MOJO_CPP_SYSTEM_EXPORT HandleSignalsState final
-    : public MojoHandleSignalsState {
-  HandleSignalsState() {
-    satisfied_signals = MOJO_HANDLE_SIGNAL_NONE;
-    satisfiable_signals = MOJO_HANDLE_SIGNAL_NONE;
-  }
-
-  HandleSignalsState(MojoHandleSignals satisfied,
-                     MojoHandleSignals satisfiable) {
-    satisfied_signals = satisfied;
-    satisfiable_signals = satisfiable;
-  }
-
-  bool operator==(const HandleSignalsState& other) const {
-    return satisfied_signals == other.satisfied_signals &&
-           satisfiable_signals == other.satisfiable_signals;
-  }
-
-  // TODO(rockot): Remove this in favor of operator==.
-  bool equals(const HandleSignalsState& other) const {
-    return satisfied_signals == other.satisfied_signals &&
-           satisfiable_signals == other.satisfiable_signals;
-  }
-
-  bool satisfies(MojoHandleSignals signals) const {
-    return !!(satisfied_signals & signals);
-  }
-
-  bool can_satisfy(MojoHandleSignals signals) const {
-    return !!(satisfiable_signals & signals);
-  }
-
-  // The handle is currently readable. May apply to a message pipe handle or
-  // data pipe consumer handle.
-  bool readable() const { return satisfies(MOJO_HANDLE_SIGNAL_READABLE); }
-
-  // The handle is currently writable. May apply to a message pipe handle or
-  // data pipe producer handle.
-  bool writable() const { return satisfies(MOJO_HANDLE_SIGNAL_WRITABLE); }
-
-  // The handle's peer is closed. May apply to any message pipe or data pipe
-  // handle.
-  bool peer_closed() const { return satisfies(MOJO_HANDLE_SIGNAL_PEER_CLOSED); }
-
-  // The handle will never be |readable()| again.
-  bool never_readable() const {
-    return !can_satisfy(MOJO_HANDLE_SIGNAL_READABLE);
-  }
-
-  // The handle will never be |writable()| again.
-  bool never_writable() const {
-    return !can_satisfy(MOJO_HANDLE_SIGNAL_WRITABLE);
-  }
-
-  // The handle can never indicate |peer_closed()|. Never true for message pipe
-  // or data pipe handles (they can always signal peer closure), but always true
-  // for other types of handles (they have no peer.)
-  bool never_peer_closed() const {
-    return !can_satisfy(MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-  }
-
-  // (Copy and assignment allowed.)
-};
-
-static_assert(sizeof(HandleSignalsState) == sizeof(MojoHandleSignalsState),
-              "HandleSignalsState should add no overhead");
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_HANDLE_SIGNALS_STATE_H_
diff --git a/mojo/public/cpp/system/message.cc b/mojo/public/cpp/system/message.cc
deleted file mode 100644
index 09d8d46..0000000
--- a/mojo/public/cpp/system/message.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/message.h"
-
-namespace mojo {
-
-ScopedMessageHandle::~ScopedMessageHandle() {
-
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/message.h b/mojo/public/cpp/system/message.h
deleted file mode 100644
index d4406ee..0000000
--- a/mojo/public/cpp/system/message.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_H_
-
-#include <limits>
-
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace mojo {
-
-const MojoMessageHandle kInvalidMessageHandleValue =
-    MOJO_MESSAGE_HANDLE_INVALID;
-
-// Handle wrapper base class for a |MojoMessageHandle|.
-class MessageHandle {
- public:
-  MessageHandle() : value_(kInvalidMessageHandleValue) {}
-  explicit MessageHandle(MojoMessageHandle value) : value_(value) {}
-  ~MessageHandle() {}
-
-  void swap(MessageHandle& other) {
-    MojoMessageHandle temp = value_;
-    value_ = other.value_;
-    other.value_ = temp;
-  }
-
-  bool is_valid() const { return value_ != kInvalidMessageHandleValue; }
-
-  const MojoMessageHandle& value() const { return value_; }
-  MojoMessageHandle* mutable_value() { return &value_; }
-  void set_value(MojoMessageHandle value) { value_ = value; }
-
-  void Close() {
-    DCHECK(is_valid());
-    MojoResult result = MojoFreeMessage(value_);
-    ALLOW_UNUSED_LOCAL(result);
-    DCHECK_EQ(MOJO_RESULT_OK, result);
-  }
-
- private:
-  MojoMessageHandle value_;
-};
-
-using ScopedMessageHandle = ScopedHandleBase<MessageHandle>;
-
-inline MojoResult AllocMessage(size_t num_bytes,
-                               const MojoHandle* handles,
-                               size_t num_handles,
-                               MojoAllocMessageFlags flags,
-                               ScopedMessageHandle* handle) {
-  DCHECK_LE(num_bytes, std::numeric_limits<uint32_t>::max());
-  DCHECK_LE(num_handles, std::numeric_limits<uint32_t>::max());
-  MojoMessageHandle raw_handle;
-  MojoResult rv = MojoAllocMessage(static_cast<uint32_t>(num_bytes), handles,
-                                   static_cast<uint32_t>(num_handles), flags,
-                                   &raw_handle);
-  if (rv != MOJO_RESULT_OK)
-    return rv;
-
-  handle->reset(MessageHandle(raw_handle));
-  return MOJO_RESULT_OK;
-}
-
-inline MojoResult GetMessageBuffer(MessageHandle message, void** buffer) {
-  DCHECK(message.is_valid());
-  return MojoGetMessageBuffer(message.value(), buffer);
-}
-
-inline MojoResult NotifyBadMessage(MessageHandle message,
-                                   const base::StringPiece& error) {
-  DCHECK(message.is_valid());
-  return MojoNotifyBadMessage(message.value(), error.data(), error.size());
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_H_
diff --git a/mojo/public/cpp/system/message_pipe.h b/mojo/public/cpp/system/message_pipe.h
deleted file mode 100644
index 7fbe43f..0000000
--- a/mojo/public/cpp/system/message_pipe.h
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file provides a C++ wrapping around the Mojo C API for message pipes,
-// replacing the prefix of "Mojo" with a "mojo" namespace, and using more
-// strongly-typed representations of |MojoHandle|s.
-//
-// Please see "mojo/public/c/system/message_pipe.h" for complete documentation
-// of the API.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_PIPE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_PIPE_H_
-
-#include <stdint.h>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/message.h"
-
-namespace mojo {
-
-// A strongly-typed representation of a |MojoHandle| to one end of a message
-// pipe.
-class MessagePipeHandle : public Handle {
- public:
-  MessagePipeHandle() {}
-  explicit MessagePipeHandle(MojoHandle value) : Handle(value) {}
-
-  // Copying and assignment allowed.
-};
-
-static_assert(sizeof(MessagePipeHandle) == sizeof(Handle),
-              "Bad size for C++ MessagePipeHandle");
-
-typedef ScopedHandleBase<MessagePipeHandle> ScopedMessagePipeHandle;
-static_assert(sizeof(ScopedMessagePipeHandle) == sizeof(MessagePipeHandle),
-              "Bad size for C++ ScopedMessagePipeHandle");
-
-// Creates a message pipe. See |MojoCreateMessagePipe()| for complete
-// documentation.
-inline MojoResult CreateMessagePipe(const MojoCreateMessagePipeOptions* options,
-                                    ScopedMessagePipeHandle* message_pipe0,
-                                    ScopedMessagePipeHandle* message_pipe1) {
-  DCHECK(message_pipe0);
-  DCHECK(message_pipe1);
-  MessagePipeHandle handle0;
-  MessagePipeHandle handle1;
-  MojoResult rv = MojoCreateMessagePipe(
-      options, handle0.mutable_value(), handle1.mutable_value());
-  // Reset even on failure (reduces the chances that a "stale"/incorrect handle
-  // will be used).
-  message_pipe0->reset(handle0);
-  message_pipe1->reset(handle1);
-  return rv;
-}
-
-// The following "...Raw" versions fully expose the underlying API, and don't
-// help with ownership of handles (especially when writing messages). It is
-// expected that in most cases these methods will be called through generated
-// bindings anyway.
-// TODO(vtl): Write friendlier versions of these functions (using scoped
-// handles and/or vectors) if there is a demonstrated need for them.
-
-// Writes to a message pipe.  If handles are attached, on success the handles
-// will no longer be valid (the receiver will receive equivalent, but logically
-// different, handles). See |MojoWriteMessage()| for complete documentation.
-inline MojoResult WriteMessageRaw(MessagePipeHandle message_pipe,
-                                  const void* bytes,
-                                  uint32_t num_bytes,
-                                  const MojoHandle* handles,
-                                  uint32_t num_handles,
-                                  MojoWriteMessageFlags flags) {
-  return MojoWriteMessage(
-      message_pipe.value(), bytes, num_bytes, handles, num_handles, flags);
-}
-
-// Reads from a message pipe. See |MojoReadMessage()| for complete
-// documentation.
-inline MojoResult ReadMessageRaw(MessagePipeHandle message_pipe,
-                                 void* bytes,
-                                 uint32_t* num_bytes,
-                                 MojoHandle* handles,
-                                 uint32_t* num_handles,
-                                 MojoReadMessageFlags flags) {
-  return MojoReadMessage(
-      message_pipe.value(), bytes, num_bytes, handles, num_handles, flags);
-}
-
-// Writes to a message pipe. Takes ownership of |message| and any attached
-// handles.
-inline MojoResult WriteMessageNew(MessagePipeHandle message_pipe,
-                                  ScopedMessageHandle message,
-                                  MojoWriteMessageFlags flags) {
-  return MojoWriteMessageNew(
-      message_pipe.value(), message.release().value(), flags);
-}
-
-// Reads from a message pipe. See |MojoReadMessageNew()| for complete
-// documentation.
-inline MojoResult ReadMessageNew(MessagePipeHandle message_pipe,
-                                 ScopedMessageHandle* message,
-                                 uint32_t* num_bytes,
-                                 MojoHandle* handles,
-                                 uint32_t* num_handles,
-                                 MojoReadMessageFlags flags) {
-  MojoMessageHandle raw_message;
-  MojoResult rv = MojoReadMessageNew(message_pipe.value(), &raw_message,
-                                     num_bytes, handles, num_handles, flags);
-  if (rv != MOJO_RESULT_OK)
-    return rv;
-
-  message->reset(MessageHandle(raw_message));
-  return MOJO_RESULT_OK;
-}
-
-// Fuses two message pipes together at the given handles. See
-// |MojoFuseMessagePipes()| for complete documentation.
-inline MojoResult FuseMessagePipes(ScopedMessagePipeHandle message_pipe0,
-                                   ScopedMessagePipeHandle message_pipe1) {
-  return MojoFuseMessagePipes(message_pipe0.release().value(),
-                              message_pipe1.release().value());
-}
-
-// A wrapper class that automatically creates a message pipe and owns both
-// handles.
-class MessagePipe {
- public:
-  MessagePipe();
-  explicit MessagePipe(const MojoCreateMessagePipeOptions& options);
-  ~MessagePipe();
-
-  ScopedMessagePipeHandle handle0;
-  ScopedMessagePipeHandle handle1;
-};
-
-inline MessagePipe::MessagePipe() {
-  MojoResult result = CreateMessagePipe(nullptr, &handle0, &handle1);
-  DCHECK_EQ(MOJO_RESULT_OK, result);
-  DCHECK(handle0.is_valid());
-  DCHECK(handle1.is_valid());
-}
-
-inline MessagePipe::MessagePipe(const MojoCreateMessagePipeOptions& options) {
-  MojoResult result = CreateMessagePipe(&options, &handle0, &handle1);
-  DCHECK_EQ(MOJO_RESULT_OK, result);
-  DCHECK(handle0.is_valid());
-  DCHECK(handle1.is_valid());
-}
-
-inline MessagePipe::~MessagePipe() {
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_PIPE_H_
diff --git a/mojo/public/cpp/system/platform_handle.cc b/mojo/public/cpp/system/platform_handle.cc
deleted file mode 100644
index 42e4aba..0000000
--- a/mojo/public/cpp/system/platform_handle.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/platform_handle.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include <mach/mach.h>
-#include "base/mac/mach_logging.h"
-#endif
-
-namespace mojo {
-
-namespace {
-
-uint64_t PlatformHandleValueFromPlatformFile(base::PlatformFile file) {
-#if defined(OS_WIN)
-  return reinterpret_cast<uint64_t>(file);
-#else
-  return static_cast<uint64_t>(file);
-#endif
-}
-
-base::PlatformFile PlatformFileFromPlatformHandleValue(uint64_t value) {
-#if defined(OS_WIN)
-  return reinterpret_cast<base::PlatformFile>(value);
-#else
-  return static_cast<base::PlatformFile>(value);
-#endif
-}
-
-}  // namespace
-
-ScopedHandle WrapPlatformFile(base::PlatformFile platform_file) {
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-  platform_handle.type = kPlatformFileHandleType;
-  platform_handle.value = PlatformHandleValueFromPlatformFile(platform_file);
-
-  MojoHandle mojo_handle;
-  MojoResult result = MojoWrapPlatformHandle(&platform_handle, &mojo_handle);
-  CHECK_EQ(result, MOJO_RESULT_OK);
-
-  return ScopedHandle(Handle(mojo_handle));
-}
-
-MojoResult UnwrapPlatformFile(ScopedHandle handle, base::PlatformFile* file) {
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-  MojoResult result = MojoUnwrapPlatformHandle(handle.release().value(),
-                                               &platform_handle);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  if (platform_handle.type == MOJO_PLATFORM_HANDLE_TYPE_INVALID) {
-    *file = base::kInvalidPlatformFile;
-  } else {
-    CHECK_EQ(platform_handle.type, kPlatformFileHandleType);
-    *file = PlatformFileFromPlatformHandleValue(platform_handle.value);
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-ScopedSharedBufferHandle WrapSharedMemoryHandle(
-    const base::SharedMemoryHandle& memory_handle,
-    size_t size,
-    bool read_only) {
-#if defined(OS_POSIX) && !(defined(OS_MACOSX) && !defined(OS_IOS))
-  if (memory_handle.fd == base::kInvalidPlatformFile)
-    return ScopedSharedBufferHandle();
-#else
-  if (!memory_handle.IsValid())
-    return ScopedSharedBufferHandle();
-#endif
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-  platform_handle.type = kPlatformSharedBufferHandleType;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  platform_handle.value =
-      static_cast<uint64_t>(memory_handle.GetMemoryObject());
-#elif defined(OS_POSIX)
-  platform_handle.value = PlatformHandleValueFromPlatformFile(memory_handle.fd);
-#elif defined(OS_WIN)
-  platform_handle.value =
-      PlatformHandleValueFromPlatformFile(memory_handle.GetHandle());
-#endif
-
-  MojoPlatformSharedBufferHandleFlags flags =
-      MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE;
-  if (read_only)
-    flags |= MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY;
-
-  MojoHandle mojo_handle;
-  MojoResult result = MojoWrapPlatformSharedBufferHandle(
-      &platform_handle, size, flags, &mojo_handle);
-  CHECK_EQ(result, MOJO_RESULT_OK);
-
-  return ScopedSharedBufferHandle(SharedBufferHandle(mojo_handle));
-}
-
-MojoResult UnwrapSharedMemoryHandle(ScopedSharedBufferHandle handle,
-                                    base::SharedMemoryHandle* memory_handle,
-                                    size_t* size,
-                                    bool* read_only) {
-  if (!handle.is_valid())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-
-  MojoPlatformSharedBufferHandleFlags flags;
-  size_t num_bytes;
-  MojoResult result = MojoUnwrapPlatformSharedBufferHandle(
-      handle.release().value(), &platform_handle, &num_bytes, &flags);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  if (size)
-    *size = num_bytes;
-
-  if (read_only)
-    *read_only = flags & MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  CHECK_EQ(platform_handle.type, MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT);
-  *memory_handle = base::SharedMemoryHandle(
-      static_cast<mach_port_t>(platform_handle.value), num_bytes,
-      base::GetCurrentProcId());
-#elif defined(OS_POSIX)
-  CHECK_EQ(platform_handle.type, MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR);
-  *memory_handle = base::SharedMemoryHandle(
-      static_cast<int>(platform_handle.value), false);
-#elif defined(OS_WIN)
-  CHECK_EQ(platform_handle.type, MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE);
-  *memory_handle = base::SharedMemoryHandle(
-      reinterpret_cast<HANDLE>(platform_handle.value),
-      base::GetCurrentProcId());
-#endif
-
-  return MOJO_RESULT_OK;
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-ScopedHandle WrapMachPort(mach_port_t port) {
-  kern_return_t kr =
-      mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_SEND, 1);
-  MACH_LOG_IF(ERROR, kr != KERN_SUCCESS, kr)
-      << "MachPortAttachmentMac mach_port_mod_refs";
-  if (kr != KERN_SUCCESS)
-    return ScopedHandle();
-
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-  platform_handle.type = MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT;
-  platform_handle.value = static_cast<uint64_t>(port);
-
-  MojoHandle mojo_handle;
-  MojoResult result = MojoWrapPlatformHandle(&platform_handle, &mojo_handle);
-  CHECK_EQ(result, MOJO_RESULT_OK);
-
-  return ScopedHandle(Handle(mojo_handle));
-}
-
-MojoResult UnwrapMachPort(ScopedHandle handle, mach_port_t* port) {
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-  MojoResult result =
-      MojoUnwrapPlatformHandle(handle.release().value(), &platform_handle);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  CHECK_EQ(platform_handle.type, MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT);
-  *port = static_cast<mach_port_t>(platform_handle.value);
-  return MOJO_RESULT_OK;
-}
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/platform_handle.h b/mojo/public/cpp/system/platform_handle.h
deleted file mode 100644
index 801264e..0000000
--- a/mojo/public/cpp/system/platform_handle.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file provides a C++ wrapping around the Mojo C API for platform handles,
-// replacing the prefix of "Mojo" with a "mojo" namespace.
-//
-// Please see "mojo/public/c/system/platform_handle.h" for complete
-// documentation of the API.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_PLATFORM_HANDLE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_PLATFORM_HANDLE_H_
-
-#include <stdint.h>
-
-#include "base/compiler_specific.h"
-#include "base/files/file.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/shared_memory_handle.h"
-#include "base/process/process_handle.h"
-#include "mojo/public/c/system/platform_handle.h"
-#include "mojo/public/cpp/system/buffer.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/system_export.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-
-namespace mojo {
-
-#if defined(OS_POSIX)
-const MojoPlatformHandleType kPlatformFileHandleType =
-    MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-const MojoPlatformHandleType kPlatformSharedBufferHandleType =
-    MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT;
-#else
-const MojoPlatformHandleType kPlatformSharedBufferHandleType =
-    MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-#elif defined(OS_WIN)
-const MojoPlatformHandleType kPlatformFileHandleType =
-    MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE;
-
-const MojoPlatformHandleType kPlatformSharedBufferHandleType =
-    MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE;
-#endif  // defined(OS_POSIX)
-
-// Wraps a PlatformFile as a Mojo handle. Takes ownership of the file object.
-MOJO_CPP_SYSTEM_EXPORT
-ScopedHandle WrapPlatformFile(base::PlatformFile platform_file);
-
-// Unwraps a PlatformFile from a Mojo handle.
-MOJO_CPP_SYSTEM_EXPORT
-MojoResult UnwrapPlatformFile(ScopedHandle handle, base::PlatformFile* file);
-
-// Wraps a base::SharedMemoryHandle as a Mojo handle. Takes ownership of the
-// SharedMemoryHandle. Note that |read_only| is only an indicator of whether
-// |memory_handle| only supports read-only mapping. It does NOT have any
-// influence on the access control of the shared buffer object.
-MOJO_CPP_SYSTEM_EXPORT
-ScopedSharedBufferHandle WrapSharedMemoryHandle(
-    const base::SharedMemoryHandle& memory_handle,
-    size_t size,
-    bool read_only);
-
-// Unwraps a base::SharedMemoryHandle from a Mojo handle. The caller assumes
-// responsibility for the lifetime of the SharedMemoryHandle.
-MOJO_CPP_SYSTEM_EXPORT MojoResult
-UnwrapSharedMemoryHandle(ScopedSharedBufferHandle handle,
-                         base::SharedMemoryHandle* memory_handle,
-                         size_t* size,
-                         bool* read_only);
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-// Wraps a mach_port_t as a Mojo handle. This takes a reference to the
-// Mach port.
-MOJO_CPP_SYSTEM_EXPORT ScopedHandle WrapMachPort(mach_port_t port);
-
-// Unwraps a mach_port_t from a Mojo handle. The caller gets ownership of the
-// Mach port.
-MOJO_CPP_SYSTEM_EXPORT MojoResult UnwrapMachPort(ScopedHandle handle,
-                                                 mach_port_t* port);
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_PLATFORM_HANDLE_H_
diff --git a/mojo/public/cpp/system/simple_watcher.cc b/mojo/public/cpp/system/simple_watcher.cc
deleted file mode 100644
index ae96faa..0000000
--- a/mojo/public/cpp/system/simple_watcher.cc
+++ /dev/null
@@ -1,279 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/simple_watcher.h"
-
-#include "base/bind.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/lock.h"
-#include "base/trace_event/heap_profiler.h"
-#include "mojo/public/c/system/watcher.h"
-
-namespace mojo {
-
-// Thread-safe Context object used to dispatch watch notifications from a
-// arbitrary threads.
-class SimpleWatcher::Context : public base::RefCountedThreadSafe<Context> {
- public:
-  // Creates a |Context| instance for a new watch on |watcher|, to watch
-  // |handle| for |signals|.
-  static scoped_refptr<Context> Create(
-      base::WeakPtr<SimpleWatcher> watcher,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-      WatcherHandle watcher_handle,
-      Handle handle,
-      MojoHandleSignals signals,
-      int watch_id,
-      MojoResult* watch_result) {
-    scoped_refptr<Context> context =
-        new Context(watcher, task_runner, watch_id);
-
-    // If MojoWatch succeeds, it assumes ownership of a reference to |context|.
-    // In that case, this reference is balanced in CallNotify() when |result| is
-    // |MOJO_RESULT_CANCELLED|.
-    context->AddRef();
-
-    *watch_result = MojoWatch(watcher_handle.value(), handle.value(), signals,
-                              context->value());
-    if (*watch_result != MOJO_RESULT_OK) {
-      // Balanced by the AddRef() above since watching failed.
-      context->Release();
-      return nullptr;
-    }
-
-    return context;
-  }
-
-  static void CallNotify(uintptr_t context_value,
-                         MojoResult result,
-                         MojoHandleSignalsState signals_state,
-                         MojoWatcherNotificationFlags flags) {
-    auto* context = reinterpret_cast<Context*>(context_value);
-    context->Notify(result, signals_state, flags);
-
-    // That was the last notification for the context. We can release the ref
-    // owned by the watch, which may in turn delete the Context.
-    if (result == MOJO_RESULT_CANCELLED)
-      context->Release();
-  }
-
-  uintptr_t value() const { return reinterpret_cast<uintptr_t>(this); }
-
-  void DisableCancellationNotifications() {
-    base::AutoLock lock(lock_);
-    enable_cancellation_notifications_ = false;
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<Context>;
-
-  Context(base::WeakPtr<SimpleWatcher> weak_watcher,
-          scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-          int watch_id)
-      : weak_watcher_(weak_watcher),
-        task_runner_(task_runner),
-        watch_id_(watch_id) {}
-  ~Context() {}
-
-  void Notify(MojoResult result,
-              MojoHandleSignalsState signals_state,
-              MojoWatcherNotificationFlags flags) {
-    if (result == MOJO_RESULT_CANCELLED) {
-      // The SimpleWatcher may have explicitly cancelled this watch, so we don't
-      // bother dispatching the notification - it would be ignored anyway.
-      //
-      // TODO(rockot): This shouldn't really be necessary, but there are already
-      // instances today where bindings object may be bound and subsequently
-      // closed due to pipe error, all before the thread's TaskRunner has been
-      // properly initialized.
-      base::AutoLock lock(lock_);
-      if (!enable_cancellation_notifications_)
-        return;
-    }
-
-    if ((flags & MOJO_WATCHER_NOTIFICATION_FLAG_FROM_SYSTEM) &&
-        task_runner_->RunsTasksOnCurrentThread() && weak_watcher_ &&
-        weak_watcher_->is_default_task_runner_) {
-      // System notifications will trigger from the task runner passed to
-      // mojo::edk::InitIPCSupport(). In Chrome this happens to always be the
-      // default task runner for the IO thread.
-      weak_watcher_->OnHandleReady(watch_id_, result);
-    } else {
-      task_runner_->PostTask(
-          FROM_HERE, base::Bind(&SimpleWatcher::OnHandleReady, weak_watcher_,
-                                watch_id_, result));
-    }
-  }
-
-  const base::WeakPtr<SimpleWatcher> weak_watcher_;
-  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  const int watch_id_;
-
-  base::Lock lock_;
-  bool enable_cancellation_notifications_ = true;
-
-  DISALLOW_COPY_AND_ASSIGN(Context);
-};
-
-SimpleWatcher::SimpleWatcher(const tracked_objects::Location& from_here,
-                             ArmingPolicy arming_policy,
-                             scoped_refptr<base::SingleThreadTaskRunner> runner)
-    : arming_policy_(arming_policy),
-      task_runner_(std::move(runner)),
-      is_default_task_runner_(task_runner_ ==
-                              base::ThreadTaskRunnerHandle::Get()),
-      heap_profiler_tag_(from_here.file_name()),
-      weak_factory_(this) {
-  MojoResult rv = CreateWatcher(&Context::CallNotify, &watcher_handle_);
-  DCHECK_EQ(MOJO_RESULT_OK, rv);
-  DCHECK(task_runner_->BelongsToCurrentThread());
-}
-
-SimpleWatcher::~SimpleWatcher() {
-  if (IsWatching())
-    Cancel();
-}
-
-bool SimpleWatcher::IsWatching() const {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return context_ != nullptr;
-}
-
-MojoResult SimpleWatcher::Watch(Handle handle,
-                                MojoHandleSignals signals,
-                                const ReadyCallback& callback) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(!IsWatching());
-  DCHECK(!callback.is_null());
-
-  callback_ = callback;
-  handle_ = handle;
-  watch_id_ += 1;
-
-  MojoResult watch_result = MOJO_RESULT_UNKNOWN;
-  context_ = Context::Create(weak_factory_.GetWeakPtr(), task_runner_,
-                             watcher_handle_.get(), handle_, signals, watch_id_,
-                             &watch_result);
-  if (!context_) {
-    handle_.set_value(kInvalidHandleValue);
-    callback_.Reset();
-    DCHECK_EQ(MOJO_RESULT_INVALID_ARGUMENT, watch_result);
-    return watch_result;
-  }
-
-  if (arming_policy_ == ArmingPolicy::AUTOMATIC)
-    ArmOrNotify();
-
-  return MOJO_RESULT_OK;
-}
-
-void SimpleWatcher::Cancel() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // The watcher may have already been cancelled if the handle was closed.
-  if (!context_)
-    return;
-
-  // Prevent the cancellation notification from being dispatched to
-  // OnHandleReady() when cancellation is explicit. See the note in the
-  // implementation of DisableCancellationNotifications() above.
-  context_->DisableCancellationNotifications();
-
-  handle_.set_value(kInvalidHandleValue);
-  callback_.Reset();
-
-  // Ensure |context_| is unset by the time we call MojoCancelWatch, as may
-  // re-enter the notification callback and we want to ensure |context_| is
-  // unset by then.
-  scoped_refptr<Context> context;
-  std::swap(context, context_);
-  MojoResult rv =
-      MojoCancelWatch(watcher_handle_.get().value(), context->value());
-
-  // It's possible this cancellation could race with a handle closure
-  // notification, in which case the watch may have already been implicitly
-  // cancelled.
-  DCHECK(rv == MOJO_RESULT_OK || rv == MOJO_RESULT_NOT_FOUND);
-}
-
-MojoResult SimpleWatcher::Arm(MojoResult* ready_result) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  uint32_t num_ready_contexts = 1;
-  uintptr_t ready_context;
-  MojoResult local_ready_result;
-  MojoHandleSignalsState ready_state;
-  MojoResult rv =
-      MojoArmWatcher(watcher_handle_.get().value(), &num_ready_contexts,
-                     &ready_context, &local_ready_result, &ready_state);
-  if (rv == MOJO_RESULT_FAILED_PRECONDITION) {
-    DCHECK(context_);
-    DCHECK_EQ(1u, num_ready_contexts);
-    DCHECK_EQ(context_->value(), ready_context);
-    if (ready_result)
-      *ready_result = local_ready_result;
-  }
-
-  return rv;
-}
-
-void SimpleWatcher::ArmOrNotify() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // Already cancelled, nothing to do.
-  if (!IsWatching())
-    return;
-
-  MojoResult ready_result;
-  MojoResult rv = Arm(&ready_result);
-  if (rv == MOJO_RESULT_OK)
-    return;
-
-  DCHECK_EQ(MOJO_RESULT_FAILED_PRECONDITION, rv);
-  task_runner_->PostTask(FROM_HERE, base::Bind(&SimpleWatcher::OnHandleReady,
-                                               weak_factory_.GetWeakPtr(),
-                                               watch_id_, ready_result));
-}
-
-void SimpleWatcher::OnHandleReady(int watch_id, MojoResult result) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // This notification may be for a previously watched context, in which case
-  // we just ignore it.
-  if (watch_id != watch_id_)
-    return;
-
-  ReadyCallback callback = callback_;
-  if (result == MOJO_RESULT_CANCELLED) {
-    // Implicit cancellation due to someone closing the watched handle. We clear
-    // the SimppleWatcher's state before dispatching this.
-    context_ = nullptr;
-    handle_.set_value(kInvalidHandleValue);
-    callback_.Reset();
-  }
-
-  // NOTE: It's legal for |callback| to delete |this|.
-  if (!callback.is_null()) {
-    TRACE_HEAP_PROFILER_API_SCOPED_TASK_EXECUTION event(heap_profiler_tag_);
-
-    base::WeakPtr<SimpleWatcher> weak_self = weak_factory_.GetWeakPtr();
-    callback.Run(result);
-    if (!weak_self)
-      return;
-
-    if (unsatisfiable_)
-      return;
-
-    // Prevent |MOJO_RESULT_FAILED_PRECONDITION| task spam by only notifying
-    // at most once in AUTOMATIC arming mode.
-    if (result == MOJO_RESULT_FAILED_PRECONDITION)
-      unsatisfiable_ = true;
-
-    if (arming_policy_ == ArmingPolicy::AUTOMATIC && IsWatching())
-      ArmOrNotify();
-  }
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/simple_watcher.h b/mojo/public/cpp/system/simple_watcher.h
deleted file mode 100644
index 9001884..0000000
--- a/mojo/public/cpp/system/simple_watcher.h
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_SIMPLE_WATCHER_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_SIMPLE_WATCHER_H_
-
-#include "base/callback.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/threading/thread_checker.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/system_export.h"
-#include "mojo/public/cpp/system/watcher.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace mojo {
-
-// This provides a convenient thread-bound watcher implementation to safely
-// watch a single handle, dispatching state change notifications to an arbitrary
-// SingleThreadTaskRunner running on the same thread as the SimpleWatcher.
-//
-// SimpleWatcher exposes the concept of "arming" from the low-level Watcher API.
-// In general, a SimpleWatcher must be "armed" in order to dispatch a single
-// notification, and must then be rearmed before it will dispatch another. For
-// more details, see the documentation for ArmingPolicy and the Arm() and
-// ArmOrNotify() methods below.
-class MOJO_CPP_SYSTEM_EXPORT SimpleWatcher {
- public:
-  // A callback to be called any time a watched handle changes state in some
-  // interesting way. The |result| argument indicates one of the following
-  // conditions depending on its value:
-  //
-  //   |MOJO_RESULT_OK|: One or more of the signals being watched is satisfied.
-  //
-  //   |MOJO_RESULT_FAILED_PRECONDITION|: None of the signals being watched can
-  //       ever be satisfied again.
-  //
-  //   |MOJO_RESULT_CANCELLED|: The watched handle has been closed. No further
-  //       notifications will be fired, as this equivalent to an implicit
-  //       CancelWatch().
-  //
-  // Note that unlike the first two conditions, this callback may be invoked
-  // with |MOJO_RESULT_CANCELLED| even while the SimpleWatcher is disarmed.
-  using ReadyCallback = base::Callback<void(MojoResult result)>;
-
-  // Selects how this SimpleWatcher is to be armed.
-  enum class ArmingPolicy {
-    // The SimpleWatcher is armed automatically on Watch() and rearmed again
-    // after every invocation of the ReadyCallback. There is no need to manually
-    // call Arm() on a SimpleWatcher using this policy. This mode is equivalent
-    // to calling ArmOrNotify() once after Watch() and once again after every
-    // dispatched notification in MANUAL mode.
-    //
-    // This provides a reasonable approximation of edge-triggered behavior,
-    // mitigating (but not completely eliminating) the potential for redundant
-    // notifications.
-    //
-    // NOTE: It is important when using AUTOMATIC policy that your ReadyCallback
-    // always attempt to change the state of the handle (e.g. read available
-    // messages on a message pipe.) Otherwise this will result in a potentially
-    // large number of avoidable redundant tasks.
-    //
-    // For perfect edge-triggered behavior, use MANUAL policy and manually Arm()
-    // the SimpleWatcher as soon as it becomes possible to do so again.
-    AUTOMATIC,
-
-    // The SimpleWatcher is never armed automatically. Arm() or ArmOrNotify()
-    // must be called manually before any non-cancellation notification can be
-    // dispatched to the ReadyCallback. See the documentation for Arm() and
-    // ArmNotify() methods below for more details.
-    MANUAL,
-  };
-
-  SimpleWatcher(const tracked_objects::Location& from_here,
-                ArmingPolicy arming_policy,
-                scoped_refptr<base::SingleThreadTaskRunner> runner =
-                    base::ThreadTaskRunnerHandle::Get());
-  ~SimpleWatcher();
-
-  // Indicates if the SimpleWatcher is currently watching a handle.
-  bool IsWatching() const;
-
-  // Starts watching |handle|. A SimpleWatcher may only watch one handle at a
-  // time, but it is safe to call this more than once as long as the previous
-  // watch has been cancelled (i.e. |IsWatching()| returns |false|.)
-  //
-  // If |handle| is not a valid watchable (message or data pipe) handle or
-  // |signals| is not a valid set of signals to watch, this returns
-  // |MOJO_RESULT_INVALID_ARGUMENT|.
-  //
-  // Otherwise |MOJO_RESULT_OK| is returned and the handle will be watched until
-  // either |handle| is closed, the SimpleWatcher is destroyed, or Cancel() is
-  // explicitly called.
-  //
-  // Once the watch is started, |callback| may be called at any time on the
-  // current thread until |Cancel()| is called or the handle is closed. Note
-  // that |callback| can be called for results other than
-  // |MOJO_RESULT_CANCELLED| only if the SimpleWatcher is currently armed. Use
-  // ArmingPolicy to configure how a SimpleWatcher is armed.
-  //
-  // |MOJO_RESULT_CANCELLED| may be dispatched even while the SimpleWatcher
-  // is disarmed, and no further notifications will be dispatched after that.
-  //
-  // Destroying the SimpleWatcher implicitly calls |Cancel()|.
-  MojoResult Watch(Handle handle,
-                   MojoHandleSignals signals,
-                   const ReadyCallback& callback);
-
-  // Cancels the current watch. Once this returns, the ReadyCallback previously
-  // passed to |Watch()| will never be called again for this SimpleWatcher.
-  //
-  // Note that when cancelled with an explicit call to |Cancel()| the
-  // ReadyCallback will not be invoked with a |MOJO_RESULT_CANCELLED| result.
-  void Cancel();
-
-  // Manually arms the SimpleWatcher.
-  //
-  // Arming the SimpleWatcher allows it to fire a single notification regarding
-  // some future relevant change in the watched handle's state. It's only valid
-  // to call Arm() while a handle is being watched (see Watch() above.)
-  //
-  // SimpleWatcher is always disarmed immediately before invoking its
-  // ReadyCallback and must be rearmed again before another notification can
-  // fire.
-  //
-  // If the watched handle already meets the watched signaling conditions -
-  // i.e., if it would have notified immediately once armed - the SimpleWatcher
-  // is NOT armed, and this call fails with a return value of
-  // |MOJO_RESULT_FAILED_PRECONDITION|. In that case, what would have been the
-  // result code for that immediate notification is instead placed in
-  // |*ready_result| if |ready_result| is non-null.
-  //
-  // If the watcher is successfully armed, this returns |MOJO_RESULT_OK| and
-  // |ready_result| is ignored.
-  MojoResult Arm(MojoResult* ready_result = nullptr);
-
-  // Manually arms the SimpleWatcher OR posts a task to invoke the ReadyCallback
-  // with the ready result of the failed arming attempt.
-  //
-  // This is meant as a convenient helper for a common usage of Arm(), and it
-  // ensures that the ReadyCallback will be invoked asynchronously again as soon
-  // as the watch's conditions are satisfied, assuming the SimpleWatcher isn't
-  // cancelled first.
-  //
-  // Unlike Arm() above, this can never fail.
-  void ArmOrNotify();
-
-  Handle handle() const { return handle_; }
-  ReadyCallback ready_callback() const { return callback_; }
-
-  // Sets the tag used by the heap profiler.
-  // |tag| must be a const string literal.
-  void set_heap_profiler_tag(const char* heap_profiler_tag) {
-    heap_profiler_tag_ = heap_profiler_tag;
-  }
-
- private:
-  class Context;
-
-  void OnHandleReady(int watch_id, MojoResult result);
-
-  base::ThreadChecker thread_checker_;
-
-  // The policy used to determine how this SimpleWatcher is armed.
-  const ArmingPolicy arming_policy_;
-
-  // The TaskRunner of this SimpleWatcher's owning thread. This field is safe to
-  // access from any thread.
-  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  // Whether |task_runner_| is the same as base::ThreadTaskRunnerHandle::Get()
-  // for the thread.
-  const bool is_default_task_runner_;
-
-  ScopedWatcherHandle watcher_handle_;
-
-  // A thread-safe context object corresponding to the currently active watch,
-  // if any.
-  scoped_refptr<Context> context_;
-
-  // Fields below must only be accessed on the SimpleWatcher's owning thread.
-
-  // The handle currently under watch. Not owned.
-  Handle handle_;
-
-  // A simple counter to disambiguate notifications from multiple watch contexts
-  // in the event that this SimpleWatcher cancels and watches multiple times.
-  int watch_id_ = 0;
-
-  // The callback to call when the handle is signaled.
-  ReadyCallback callback_;
-
-  // Tracks if the SimpleWatcher has already notified of unsatisfiability. This
-  // is used to prevent redundant notifications in AUTOMATIC mode.
-  bool unsatisfiable_ = false;
-
-  // Tag used to ID memory allocations that originated from notifications in
-  // this watcher.
-  const char* heap_profiler_tag_ = nullptr;
-
-  base::WeakPtrFactory<SimpleWatcher> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(SimpleWatcher);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_SIMPLE_WATCHER_H_
diff --git a/mojo/public/cpp/system/system_export.h b/mojo/public/cpp/system/system_export.h
deleted file mode 100644
index c9bb140..0000000
--- a/mojo/public/cpp/system/system_export.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_SYSTEM_EXPORT_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_SYSTEM_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-
-#if defined(WIN32)
-
-#if defined(MOJO_CPP_SYSTEM_IMPLEMENTATION)
-#define MOJO_CPP_SYSTEM_EXPORT __declspec(dllexport)
-#else
-#define MOJO_CPP_SYSTEM_EXPORT __declspec(dllimport)
-#endif
-
-#else  // !defined(WIN32)
-
-#if defined(MOJO_CPP_SYSTEM_IMPLEMENTATION)
-#define MOJO_CPP_SYSTEM_EXPORT __attribute((visibility("default")))
-#else
-#define MOJO_CPP_SYSTEM_EXPORT
-#endif
-
-#endif  // defined(WIN32)
-
-#else  // !defined(COMPONENT_BUILD)
-
-#define MOJO_CPP_SYSTEM_EXPORT
-
-#endif  // defined(COMPONENT_BUILD)
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_SYSTEM_EXPORT_H_
diff --git a/mojo/public/cpp/system/tests/BUILD.gn b/mojo/public/cpp/system/tests/BUILD.gn
deleted file mode 100644
index 705d009..0000000
--- a/mojo/public/cpp/system/tests/BUILD.gn
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("tests") {
-  testonly = true
-
-  sources = [
-    "core_unittest.cc",
-    "handle_signals_state_unittest.cc",
-    "simple_watcher_unittest.cc",
-    "wait_set_unittest.cc",
-    "wait_unittest.cc",
-  ]
-
-  deps = [
-    "//base",
-    "//mojo/public/c/system/tests",
-    "//mojo/public/cpp/system",
-    "//mojo/public/cpp/test_support:test_utils",
-    "//testing/gtest",
-  ]
-}
diff --git a/mojo/public/cpp/system/tests/core_unittest.cc b/mojo/public/cpp/system/tests/core_unittest.cc
deleted file mode 100644
index 40a94f0..0000000
--- a/mojo/public/cpp/system/tests/core_unittest.cc
+++ /dev/null
@@ -1,510 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file tests the C++ Mojo system core wrappers.
-// TODO(vtl): Maybe rename "CoreCppTest" -> "CoreTest" if/when this gets
-// compiled into a different binary from the C API tests.
-
-#include "mojo/public/cpp/system/core.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <map>
-#include <utility>
-
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-const MojoHandleSignals kSignalReadableWritable =
-    MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE;
-
-const MojoHandleSignals kSignalAll = MOJO_HANDLE_SIGNAL_READABLE |
-                                     MOJO_HANDLE_SIGNAL_WRITABLE |
-                                     MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-
-TEST(CoreCppTest, GetTimeTicksNow) {
-  const MojoTimeTicks start = GetTimeTicksNow();
-  EXPECT_NE(static_cast<MojoTimeTicks>(0), start)
-      << "GetTimeTicksNow should return nonzero value";
-}
-
-TEST(CoreCppTest, Basic) {
-  // Basic |Handle| implementation:
-  {
-    EXPECT_EQ(MOJO_HANDLE_INVALID, kInvalidHandleValue);
-
-    Handle h0;
-    EXPECT_EQ(kInvalidHandleValue, h0.value());
-    EXPECT_EQ(kInvalidHandleValue, *h0.mutable_value());
-    EXPECT_FALSE(h0.is_valid());
-
-    Handle h1(static_cast<MojoHandle>(123));
-    EXPECT_EQ(static_cast<MojoHandle>(123), h1.value());
-    EXPECT_EQ(static_cast<MojoHandle>(123), *h1.mutable_value());
-    EXPECT_TRUE(h1.is_valid());
-    *h1.mutable_value() = static_cast<MojoHandle>(456);
-    EXPECT_EQ(static_cast<MojoHandle>(456), h1.value());
-    EXPECT_TRUE(h1.is_valid());
-
-    h1.swap(h0);
-    EXPECT_EQ(static_cast<MojoHandle>(456), h0.value());
-    EXPECT_TRUE(h0.is_valid());
-    EXPECT_FALSE(h1.is_valid());
-
-    h1.set_value(static_cast<MojoHandle>(789));
-    h0.swap(h1);
-    EXPECT_EQ(static_cast<MojoHandle>(789), h0.value());
-    EXPECT_TRUE(h0.is_valid());
-    EXPECT_EQ(static_cast<MojoHandle>(456), h1.value());
-    EXPECT_TRUE(h1.is_valid());
-
-    // Make sure copy constructor works.
-    Handle h2(h0);
-    EXPECT_EQ(static_cast<MojoHandle>(789), h2.value());
-    // And assignment.
-    h2 = h1;
-    EXPECT_EQ(static_cast<MojoHandle>(456), h2.value());
-
-    // Make sure that we can put |Handle|s into |std::map|s.
-    h0 = Handle(static_cast<MojoHandle>(987));
-    h1 = Handle(static_cast<MojoHandle>(654));
-    h2 = Handle(static_cast<MojoHandle>(321));
-    Handle h3;
-    std::map<Handle, int> handle_to_int;
-    handle_to_int[h0] = 0;
-    handle_to_int[h1] = 1;
-    handle_to_int[h2] = 2;
-    handle_to_int[h3] = 3;
-
-    EXPECT_EQ(4u, handle_to_int.size());
-    EXPECT_FALSE(handle_to_int.find(h0) == handle_to_int.end());
-    EXPECT_EQ(0, handle_to_int[h0]);
-    EXPECT_FALSE(handle_to_int.find(h1) == handle_to_int.end());
-    EXPECT_EQ(1, handle_to_int[h1]);
-    EXPECT_FALSE(handle_to_int.find(h2) == handle_to_int.end());
-    EXPECT_EQ(2, handle_to_int[h2]);
-    EXPECT_FALSE(handle_to_int.find(h3) == handle_to_int.end());
-    EXPECT_EQ(3, handle_to_int[h3]);
-    EXPECT_TRUE(handle_to_int.find(Handle(static_cast<MojoHandle>(13579))) ==
-                handle_to_int.end());
-
-    // TODO(vtl): With C++11, support |std::unordered_map|s, etc. (Or figure out
-    // how to support the variations of |hash_map|.)
-  }
-
-  // |Handle|/|ScopedHandle| functions:
-  {
-    ScopedHandle h;
-
-    EXPECT_EQ(kInvalidHandleValue, h.get().value());
-
-    // This should be a no-op.
-    Close(std::move(h));
-
-    // It should still be invalid.
-    EXPECT_EQ(kInvalidHandleValue, h.get().value());
-
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              Wait(h.get(), ~MOJO_HANDLE_SIGNAL_NONE));
-
-    std::vector<Handle> wh;
-    wh.push_back(h.get());
-    std::vector<MojoHandleSignals> sigs;
-    sigs.push_back(~MOJO_HANDLE_SIGNAL_NONE);
-    size_t result_index;
-    MojoResult rv = WaitMany(wh.data(), sigs.data(), wh.size(), &result_index);
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, rv);
-  }
-
-  // |MakeScopedHandle| (just compilation tests):
-  {
-    EXPECT_FALSE(MakeScopedHandle(Handle()).is_valid());
-    EXPECT_FALSE(MakeScopedHandle(MessagePipeHandle()).is_valid());
-    EXPECT_FALSE(MakeScopedHandle(DataPipeProducerHandle()).is_valid());
-    EXPECT_FALSE(MakeScopedHandle(DataPipeConsumerHandle()).is_valid());
-    EXPECT_FALSE(MakeScopedHandle(SharedBufferHandle()).is_valid());
-  }
-
-  // |MessagePipeHandle|/|ScopedMessagePipeHandle| functions:
-  {
-    MessagePipeHandle h_invalid;
-    EXPECT_FALSE(h_invalid.is_valid());
-    EXPECT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        WriteMessageRaw(
-            h_invalid, nullptr, 0, nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
-    char buffer[10] = {0};
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              WriteMessageRaw(h_invalid,
-                              buffer,
-                              sizeof(buffer),
-                              nullptr,
-                              0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              ReadMessageRaw(h_invalid,
-                             nullptr,
-                             nullptr,
-                             nullptr,
-                             nullptr,
-                             MOJO_READ_MESSAGE_FLAG_NONE));
-    uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              ReadMessageRaw(h_invalid,
-                             buffer,
-                             &buffer_size,
-                             nullptr,
-                             nullptr,
-                             MOJO_READ_MESSAGE_FLAG_NONE));
-
-    // Basic tests of waiting and closing.
-    MojoHandle hv0 = kInvalidHandleValue;
-    {
-      ScopedMessagePipeHandle h0;
-      ScopedMessagePipeHandle h1;
-      EXPECT_FALSE(h0.get().is_valid());
-      EXPECT_FALSE(h1.get().is_valid());
-
-      CreateMessagePipe(nullptr, &h0, &h1);
-      EXPECT_TRUE(h0.get().is_valid());
-      EXPECT_TRUE(h1.get().is_valid());
-      EXPECT_NE(h0.get().value(), h1.get().value());
-      // Save the handle values, so we can check that things got closed
-      // correctly.
-      hv0 = h0.get().value();
-      MojoHandle hv1 = h1.get().value();
-      MojoHandleSignalsState state = h0->QuerySignalsState();
-
-      EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-      EXPECT_EQ(kSignalAll, state.satisfiable_signals);
-
-      std::vector<Handle> wh;
-      wh.push_back(h0.get());
-      wh.push_back(h1.get());
-      std::vector<MojoHandleSignals> sigs;
-      sigs.push_back(MOJO_HANDLE_SIGNAL_READABLE);
-      sigs.push_back(MOJO_HANDLE_SIGNAL_WRITABLE);
-      std::vector<MojoHandleSignalsState> states(sigs.size());
-
-      size_t result_index;
-      MojoResult rv = WaitMany(wh.data(), sigs.data(), wh.size(), &result_index,
-                               states.data());
-      EXPECT_EQ(MOJO_RESULT_OK, rv);
-      EXPECT_EQ(1u, result_index);
-      EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, states[0].satisfied_signals);
-      EXPECT_EQ(kSignalAll, states[0].satisfiable_signals);
-      EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, states[1].satisfied_signals);
-      EXPECT_EQ(kSignalAll, states[1].satisfiable_signals);
-
-      // Test closing |h1| explicitly.
-      Close(std::move(h1));
-      EXPECT_FALSE(h1.get().is_valid());
-
-      // Make sure |h1| is closed.
-      EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-                Wait(Handle(hv1), ~MOJO_HANDLE_SIGNAL_NONE));
-
-      EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-                Wait(h0.get(), MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-      EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
-      EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
-    }
-    // |hv0| should have been closed when |h0| went out of scope, so this close
-    // should fail.
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv0));
-
-    // Actually test writing/reading messages.
-    {
-      ScopedMessagePipeHandle h0;
-      ScopedMessagePipeHandle h1;
-      CreateMessagePipe(nullptr, &h0, &h1);
-
-      const char kHello[] = "hello";
-      const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                WriteMessageRaw(h0.get(),
-                                kHello,
-                                kHelloSize,
-                                nullptr,
-                                0,
-                                MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-      MojoHandleSignalsState state;
-      EXPECT_EQ(MOJO_RESULT_OK,
-                Wait(h1.get(), MOJO_HANDLE_SIGNAL_READABLE, &state));
-      EXPECT_EQ(kSignalReadableWritable, state.satisfied_signals);
-      EXPECT_EQ(kSignalAll, state.satisfiable_signals);
-
-      char buffer[10] = {0};
-      uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                ReadMessageRaw(h1.get(),
-                               buffer,
-                               &buffer_size,
-                               nullptr,
-                               nullptr,
-                               MOJO_READ_MESSAGE_FLAG_NONE));
-      EXPECT_EQ(kHelloSize, buffer_size);
-      EXPECT_STREQ(kHello, buffer);
-
-      // Send a handle over the previously-establish message pipe. Use the
-      // |MessagePipe| wrapper (to test it), which automatically creates a
-      // message pipe.
-      MessagePipe mp;
-
-      // Write a message to |mp.handle0|, before we send |mp.handle1|.
-      const char kWorld[] = "world!";
-      const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                WriteMessageRaw(mp.handle0.get(),
-                                kWorld,
-                                kWorldSize,
-                                nullptr,
-                                0,
-                                MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-      // Send |mp.handle1| over |h1| to |h0|.
-      MojoHandle handles[5];
-      handles[0] = mp.handle1.release().value();
-      EXPECT_NE(kInvalidHandleValue, handles[0]);
-      EXPECT_FALSE(mp.handle1.get().is_valid());
-      uint32_t handles_count = 1;
-      EXPECT_EQ(MOJO_RESULT_OK,
-                WriteMessageRaw(h1.get(),
-                                kHello,
-                                kHelloSize,
-                                handles,
-                                handles_count,
-                                MOJO_WRITE_MESSAGE_FLAG_NONE));
-      // |handles[0]| should actually be invalid now.
-      EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handles[0]));
-
-      // Read "hello" and the sent handle.
-      EXPECT_EQ(MOJO_RESULT_OK,
-                Wait(h0.get(), MOJO_HANDLE_SIGNAL_READABLE, &state));
-      EXPECT_EQ(kSignalReadableWritable, state.satisfied_signals);
-      EXPECT_EQ(kSignalAll, state.satisfiable_signals);
-
-      memset(buffer, 0, sizeof(buffer));
-      buffer_size = static_cast<uint32_t>(sizeof(buffer));
-      for (size_t i = 0; i < arraysize(handles); i++)
-        handles[i] = kInvalidHandleValue;
-      handles_count = static_cast<uint32_t>(arraysize(handles));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                ReadMessageRaw(h0.get(),
-                               buffer,
-                               &buffer_size,
-                               handles,
-                               &handles_count,
-                               MOJO_READ_MESSAGE_FLAG_NONE));
-      EXPECT_EQ(kHelloSize, buffer_size);
-      EXPECT_STREQ(kHello, buffer);
-      EXPECT_EQ(1u, handles_count);
-      EXPECT_NE(kInvalidHandleValue, handles[0]);
-
-      // Read from the sent/received handle.
-      mp.handle1.reset(MessagePipeHandle(handles[0]));
-      // Save |handles[0]| to check that it gets properly closed.
-      hv0 = handles[0];
-
-      EXPECT_EQ(MOJO_RESULT_OK,
-                Wait(mp.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, &state));
-      EXPECT_EQ(kSignalReadableWritable, state.satisfied_signals);
-      EXPECT_EQ(kSignalAll, state.satisfiable_signals);
-
-      memset(buffer, 0, sizeof(buffer));
-      buffer_size = static_cast<uint32_t>(sizeof(buffer));
-      for (size_t i = 0; i < arraysize(handles); i++)
-        handles[i] = kInvalidHandleValue;
-      handles_count = static_cast<uint32_t>(arraysize(handles));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                ReadMessageRaw(mp.handle1.get(),
-                               buffer,
-                               &buffer_size,
-                               handles,
-                               &handles_count,
-                               MOJO_READ_MESSAGE_FLAG_NONE));
-      EXPECT_EQ(kWorldSize, buffer_size);
-      EXPECT_STREQ(kWorld, buffer);
-      EXPECT_EQ(0u, handles_count);
-    }
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv0));
-  }
-
-  // TODO(vtl): Test |CloseRaw()|.
-  // TODO(vtl): Test |reset()| more thoroughly?
-}
-
-TEST(CoreCppTest, TearDownWithMessagesEnqueued) {
-  // Tear down a message pipe which still has a message enqueued, with the
-  // message also having a valid message pipe handle.
-  {
-    ScopedMessagePipeHandle h0;
-    ScopedMessagePipeHandle h1;
-    CreateMessagePipe(nullptr, &h0, &h1);
-
-    // Send a handle over the previously-establish message pipe.
-    ScopedMessagePipeHandle h2;
-    ScopedMessagePipeHandle h3;
-    if (CreateMessagePipe(nullptr, &h2, &h3) != MOJO_RESULT_OK)
-      CreateMessagePipe(nullptr, &h2, &h3);  // Must be old EDK.
-
-    // Write a message to |h2|, before we send |h3|.
-    const char kWorld[] = "world!";
-    const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WriteMessageRaw(h2.get(),
-                              kWorld,
-                              kWorldSize,
-                              nullptr,
-                              0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-    // And also a message to |h3|.
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WriteMessageRaw(h3.get(),
-                              kWorld,
-                              kWorldSize,
-                              nullptr,
-                              0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Send |h3| over |h1| to |h0|.
-    const char kHello[] = "hello";
-    const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
-    MojoHandle h3_value;
-    h3_value = h3.release().value();
-    EXPECT_NE(kInvalidHandleValue, h3_value);
-    EXPECT_FALSE(h3.get().is_valid());
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WriteMessageRaw(h1.get(),
-                              kHello,
-                              kHelloSize,
-                              &h3_value,
-                              1,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-    // |h3_value| should actually be invalid now.
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(h3_value));
-
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0.release().value()));
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1.release().value()));
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h2.release().value()));
-  }
-
-  // Do this in a different order: make the enqueued message pipe handle only
-  // half-alive.
-  {
-    ScopedMessagePipeHandle h0;
-    ScopedMessagePipeHandle h1;
-    CreateMessagePipe(nullptr, &h0, &h1);
-
-    // Send a handle over the previously-establish message pipe.
-    ScopedMessagePipeHandle h2;
-    ScopedMessagePipeHandle h3;
-    if (CreateMessagePipe(nullptr, &h2, &h3) != MOJO_RESULT_OK)
-      CreateMessagePipe(nullptr, &h2, &h3);  // Must be old EDK.
-
-    // Write a message to |h2|, before we send |h3|.
-    const char kWorld[] = "world!";
-    const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WriteMessageRaw(h2.get(),
-                              kWorld,
-                              kWorldSize,
-                              nullptr,
-                              0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-    // And also a message to |h3|.
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WriteMessageRaw(h3.get(),
-                              kWorld,
-                              kWorldSize,
-                              nullptr,
-                              0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Send |h3| over |h1| to |h0|.
-    const char kHello[] = "hello";
-    const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
-    MojoHandle h3_value;
-    h3_value = h3.release().value();
-    EXPECT_NE(kInvalidHandleValue, h3_value);
-    EXPECT_FALSE(h3.get().is_valid());
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WriteMessageRaw(h1.get(),
-                              kHello,
-                              kHelloSize,
-                              &h3_value,
-                              1,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-    // |h3_value| should actually be invalid now.
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(h3_value));
-
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h2.release().value()));
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0.release().value()));
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1.release().value()));
-  }
-}
-
-TEST(CoreCppTest, ScopedHandleMoveCtor) {
-  ScopedSharedBufferHandle buffer1 = SharedBufferHandle::Create(1024);
-  EXPECT_TRUE(buffer1.is_valid());
-
-  ScopedSharedBufferHandle buffer2 = SharedBufferHandle::Create(1024);
-  EXPECT_TRUE(buffer2.is_valid());
-
-  // If this fails to close buffer1, ScopedHandleBase::CloseIfNecessary() will
-  // assert.
-  buffer1 = std::move(buffer2);
-
-  EXPECT_TRUE(buffer1.is_valid());
-  EXPECT_FALSE(buffer2.is_valid());
-}
-
-TEST(CoreCppTest, BasicSharedBuffer) {
-  ScopedSharedBufferHandle h0 = SharedBufferHandle::Create(100);
-  ASSERT_TRUE(h0.is_valid());
-
-  // Map everything.
-  ScopedSharedBufferMapping mapping = h0->Map(100);
-  ASSERT_TRUE(mapping);
-  static_cast<char*>(mapping.get())[50] = 'x';
-
-  // Duplicate |h0| to |h1|.
-  ScopedSharedBufferHandle h1 =
-      h0->Clone(SharedBufferHandle::AccessMode::READ_ONLY);
-  ASSERT_TRUE(h1.is_valid());
-
-  // Close |h0|.
-  h0.reset();
-
-  // The mapping should still be good.
-  static_cast<char*>(mapping.get())[51] = 'y';
-
-  // Unmap it.
-  mapping.reset();
-
-  // Map half of |h1|.
-  mapping = h1->MapAtOffset(50, 50);
-  ASSERT_TRUE(mapping);
-
-  // It should have what we wrote.
-  EXPECT_EQ('x', static_cast<char*>(mapping.get())[0]);
-  EXPECT_EQ('y', static_cast<char*>(mapping.get())[1]);
-
-  // Unmap it.
-  mapping.reset();
-  h1.reset();
-
-  // Creating a 1 EB shared buffer should fail without crashing.
-  EXPECT_FALSE(SharedBufferHandle::Create(1ULL << 60).is_valid());
-}
-
-// TODO(vtl): Write data pipe tests.
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/tests/handle_signals_state_unittest.cc b/mojo/public/cpp/system/tests/handle_signals_state_unittest.cc
deleted file mode 100644
index 82f538e..0000000
--- a/mojo/public/cpp/system/tests/handle_signals_state_unittest.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/handle_signals_state.h"
-
-#include "mojo/public/c/system/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-using HandleSignalsStateTest = testing::Test;
-
-TEST_F(HandleSignalsStateTest, SanityCheck) {
-  // There's not much to test here. Just a quick sanity check to make sure the
-  // code compiles and the helper methods do what they're supposed to do.
-
-  HandleSignalsState empty_signals(MOJO_HANDLE_SIGNAL_NONE,
-                                   MOJO_HANDLE_SIGNAL_NONE);
-  EXPECT_FALSE(empty_signals.readable());
-  EXPECT_FALSE(empty_signals.writable());
-  EXPECT_FALSE(empty_signals.peer_closed());
-  EXPECT_TRUE(empty_signals.never_readable());
-  EXPECT_TRUE(empty_signals.never_writable());
-  EXPECT_TRUE(empty_signals.never_peer_closed());
-
-  HandleSignalsState all_signals(
-      MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-          MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-      MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-          MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-  EXPECT_TRUE(all_signals.readable());
-  EXPECT_TRUE(all_signals.writable());
-  EXPECT_TRUE(all_signals.peer_closed());
-  EXPECT_FALSE(all_signals.never_readable());
-  EXPECT_FALSE(all_signals.never_writable());
-  EXPECT_FALSE(all_signals.never_peer_closed());
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/tests/simple_watcher_unittest.cc b/mojo/public/cpp/system/tests/simple_watcher_unittest.cc
deleted file mode 100644
index 795f262..0000000
--- a/mojo/public/cpp/system/tests/simple_watcher_unittest.cc
+++ /dev/null
@@ -1,277 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/simple_watcher.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-template <typename Handler>
-void RunResultHandler(Handler f, MojoResult result) {
-  f(result);
-}
-
-template <typename Handler>
-SimpleWatcher::ReadyCallback OnReady(Handler f) {
-  return base::Bind(&RunResultHandler<Handler>, f);
-}
-
-SimpleWatcher::ReadyCallback NotReached() {
-  return OnReady([](MojoResult) { NOTREACHED(); });
-}
-
-class SimpleWatcherTest : public testing::Test {
- public:
-  SimpleWatcherTest() {}
-  ~SimpleWatcherTest() override {}
-
- private:
-  base::MessageLoop message_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(SimpleWatcherTest);
-};
-
-TEST_F(SimpleWatcherTest, WatchBasic) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  bool notified = false;
-  base::RunLoop run_loop;
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                            OnReady([&](MojoResult result) {
-                              EXPECT_EQ(MOJO_RESULT_OK, result);
-                              notified = true;
-                              run_loop.Quit();
-                            })));
-  EXPECT_TRUE(b_watcher.IsWatching());
-
-  EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0,
-                                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-  run_loop.Run();
-  EXPECT_TRUE(notified);
-
-  b_watcher.Cancel();
-}
-
-TEST_F(SimpleWatcherTest, WatchUnsatisfiable) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-  a.reset();
-
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL);
-  EXPECT_EQ(
-      MOJO_RESULT_OK,
-      b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE, NotReached()));
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, b_watcher.Arm());
-}
-
-TEST_F(SimpleWatcherTest, WatchInvalidHandle) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-  a.reset();
-  b.reset();
-
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-  EXPECT_EQ(
-      MOJO_RESULT_INVALID_ARGUMENT,
-      b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE, NotReached()));
-  EXPECT_FALSE(b_watcher.IsWatching());
-}
-
-TEST_F(SimpleWatcherTest, Cancel) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  base::RunLoop run_loop;
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-  EXPECT_EQ(
-      MOJO_RESULT_OK,
-      b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE, NotReached()));
-  EXPECT_TRUE(b_watcher.IsWatching());
-  b_watcher.Cancel();
-  EXPECT_FALSE(b_watcher.IsWatching());
-
-  // This should never trigger the watcher.
-  EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0,
-                                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                run_loop.QuitClosure());
-  run_loop.Run();
-}
-
-TEST_F(SimpleWatcherTest, CancelOnClose) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  base::RunLoop run_loop;
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                            OnReady([&](MojoResult result) {
-                              EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
-                              run_loop.Quit();
-                            })));
-  EXPECT_TRUE(b_watcher.IsWatching());
-
-  // This should trigger the watcher above.
-  b.reset();
-
-  run_loop.Run();
-
-  EXPECT_FALSE(b_watcher.IsWatching());
-}
-
-TEST_F(SimpleWatcherTest, CancelOnDestruction) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-  base::RunLoop run_loop;
-  {
-    SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-    EXPECT_EQ(
-        MOJO_RESULT_OK,
-        b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE, NotReached()));
-    EXPECT_TRUE(b_watcher.IsWatching());
-
-    // |b_watcher| should be cancelled when it goes out of scope.
-  }
-
-  // This should never trigger the watcher above.
-  EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0,
-                                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-  base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                run_loop.QuitClosure());
-  run_loop.Run();
-}
-
-TEST_F(SimpleWatcherTest, CloseAndCancel) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                            OnReady([](MojoResult result) { FAIL(); })));
-  EXPECT_TRUE(b_watcher.IsWatching());
-
-  // This should trigger the watcher above...
-  b.reset();
-  // ...but the watcher is cancelled first.
-  b_watcher.Cancel();
-
-  EXPECT_FALSE(b_watcher.IsWatching());
-
-  base::RunLoop().RunUntilIdle();
-}
-
-TEST_F(SimpleWatcherTest, UnarmedCancel) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL);
-  base::RunLoop loop;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                            base::Bind(
-                                [](base::RunLoop* loop, MojoResult result) {
-                                  EXPECT_EQ(result, MOJO_RESULT_CANCELLED);
-                                  loop->Quit();
-                                },
-                                &loop)));
-
-  // This message write will not wake up the watcher since the watcher isn't
-  // armed. Instead, the cancellation will dispatch due to the reset below.
-  EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0,
-                                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-  b.reset();
-  loop.Run();
-}
-
-TEST_F(SimpleWatcherTest, ManualArming) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL);
-  base::RunLoop loop;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                            base::Bind(
-                                [](base::RunLoop* loop, MojoResult result) {
-                                  EXPECT_EQ(result, MOJO_RESULT_OK);
-                                  loop->Quit();
-                                },
-                                &loop)));
-  EXPECT_EQ(MOJO_RESULT_OK, b_watcher.Arm());
-
-  EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0,
-                                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-  loop.Run();
-}
-
-TEST_F(SimpleWatcherTest, ManualArmOrNotifyWhileSignaled) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  base::RunLoop loop1;
-  SimpleWatcher b_watcher1(FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL);
-  bool notified1 = false;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher1.Watch(
-                b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                base::Bind(
-                    [](base::RunLoop* loop, bool* notified, MojoResult result) {
-                      EXPECT_EQ(result, MOJO_RESULT_OK);
-                      *notified = true;
-                      loop->Quit();
-                    },
-                    &loop1, &notified1)));
-
-  base::RunLoop loop2;
-  SimpleWatcher b_watcher2(FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL);
-  bool notified2 = false;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher2.Watch(
-                b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                base::Bind(
-                    [](base::RunLoop* loop, bool* notified, MojoResult result) {
-                      EXPECT_EQ(result, MOJO_RESULT_OK);
-                      *notified = true;
-                      loop->Quit();
-                    },
-                    &loop2, &notified2)));
-
-  // First ensure that |b| is readable.
-  EXPECT_EQ(MOJO_RESULT_OK, b_watcher1.Arm());
-  EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0,
-                                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-  loop1.Run();
-
-  EXPECT_TRUE(notified1);
-  EXPECT_FALSE(notified2);
-  notified1 = false;
-
-  // Now verify that ArmOrNotify results in a notification.
-  b_watcher2.ArmOrNotify();
-  loop2.Run();
-
-  EXPECT_FALSE(notified1);
-  EXPECT_TRUE(notified2);
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/tests/wait_set_unittest.cc b/mojo/public/cpp/system/tests/wait_set_unittest.cc
deleted file mode 100644
index d60cb45..0000000
--- a/mojo/public/cpp/system/tests/wait_set_unittest.cc
+++ /dev/null
@@ -1,376 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/wait_set.h"
-
-#include <set>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/memory/ptr_util.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-using WaitSetTest = testing::Test;
-
-void WriteMessage(const ScopedMessagePipeHandle& handle,
-                  const base::StringPiece& message) {
-  MojoResult rv = WriteMessageRaw(handle.get(), message.data(),
-                                  static_cast<uint32_t>(message.size()),
-                                  nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE);
-  CHECK_EQ(MOJO_RESULT_OK, rv);
-}
-
-std::string ReadMessage(const ScopedMessagePipeHandle& handle) {
-  uint32_t num_bytes = 0;
-  uint32_t num_handles = 0;
-  MojoResult rv = ReadMessageRaw(handle.get(), nullptr, &num_bytes, nullptr,
-                                 &num_handles, MOJO_READ_MESSAGE_FLAG_NONE);
-  CHECK_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, rv);
-  CHECK_EQ(0u, num_handles);
-
-  std::vector<char> buffer(num_bytes);
-  rv = ReadMessageRaw(handle.get(), buffer.data(), &num_bytes, nullptr,
-                      &num_handles, MOJO_READ_MESSAGE_FLAG_NONE);
-  CHECK_EQ(MOJO_RESULT_OK, rv);
-  return std::string(buffer.data(), buffer.size());
-}
-
-class ThreadedRunner : public base::SimpleThread {
- public:
-  explicit ThreadedRunner(const base::Closure& callback)
-      : SimpleThread("ThreadedRunner"), callback_(callback) {}
-  ~ThreadedRunner() override { Join(); }
-
-  void Run() override { callback_.Run(); }
-
- private:
-  const base::Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadedRunner);
-};
-
-TEST_F(WaitSetTest, Satisfied) {
-  WaitSet wait_set;
-  MessagePipe p;
-
-  const char kTestMessage1[] = "hello wake up";
-
-  // Watch only one handle and write to the other.
-
-  wait_set.AddHandle(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  WriteMessage(p.handle0, kTestMessage1);
-
-  size_t num_ready_handles = 2;
-  Handle ready_handles[2];
-  MojoResult ready_results[2] = {MOJO_RESULT_UNKNOWN, MOJO_RESULT_UNKNOWN};
-  HandleSignalsState hss[2];
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results, hss);
-
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(p.handle1.get(), ready_handles[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(hss[0].readable() && hss[0].writable() && !hss[0].peer_closed());
-
-  wait_set.RemoveHandle(p.handle1.get());
-
-  // Now watch only the other handle and write to the first one.
-
-  wait_set.AddHandle(p.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  WriteMessage(p.handle1, kTestMessage1);
-
-  num_ready_handles = 2;
-  ready_results[0] = MOJO_RESULT_UNKNOWN;
-  ready_results[1] = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results, hss);
-
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(p.handle0.get(), ready_handles[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(hss[0].readable() && hss[0].writable() && !hss[0].peer_closed());
-
-  // Now wait on both of them.
-  wait_set.AddHandle(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-  num_ready_handles = 2;
-  ready_results[0] = MOJO_RESULT_UNKNOWN;
-  ready_results[1] = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results, hss);
-  EXPECT_EQ(2u, num_ready_handles);
-  EXPECT_TRUE((ready_handles[0] == p.handle0.get() &&
-               ready_handles[1] == p.handle1.get()) ||
-              (ready_handles[0] == p.handle1.get() &&
-               ready_handles[1] == p.handle0.get()));
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[1]);
-  EXPECT_TRUE(hss[0].readable() && hss[0].writable() && !hss[0].peer_closed());
-  EXPECT_TRUE(hss[1].readable() && hss[1].writable() && !hss[1].peer_closed());
-
-  // Wait on both again, but with only enough output space for one result.
-  num_ready_handles = 1;
-  ready_results[0] = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results, hss);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_TRUE(ready_handles[0] == p.handle0.get() ||
-              ready_handles[0] == p.handle1.get());
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-
-  // Remove the ready handle from the set and wait one more time.
-  EXPECT_EQ(MOJO_RESULT_OK, wait_set.RemoveHandle(ready_handles[0]));
-
-  num_ready_handles = 1;
-  ready_results[0] = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results, hss);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_TRUE(ready_handles[0] == p.handle0.get() ||
-              ready_handles[0] == p.handle1.get());
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-
-  EXPECT_EQ(MOJO_RESULT_OK, wait_set.RemoveHandle(ready_handles[0]));
-
-  // The wait set should be empty now. Nothing to wait on.
-  num_ready_handles = 2;
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results);
-  EXPECT_EQ(0u, num_ready_handles);
-}
-
-TEST_F(WaitSetTest, Unsatisfiable) {
-  MessagePipe p, q;
-  WaitSet wait_set;
-
-  wait_set.AddHandle(q.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  wait_set.AddHandle(q.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  wait_set.AddHandle(p.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-  size_t num_ready_handles = 2;
-  Handle ready_handles[2];
-  MojoResult ready_results[2] = {MOJO_RESULT_UNKNOWN, MOJO_RESULT_UNKNOWN};
-
-  p.handle1.reset();
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(p.handle0.get(), ready_handles[0]);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, ready_results[0]);
-}
-
-TEST_F(WaitSetTest, CloseWhileWaiting) {
-  MessagePipe p;
-  WaitSet wait_set;
-
-  wait_set.AddHandle(p.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-  const Handle handle0_value = p.handle0.get();
-  ThreadedRunner close_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        // Wait a little while, then close the handle.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        handle->reset();
-      },
-      &p.handle0));
-  close_after_delay.Start();
-
-  size_t num_ready_handles = 2;
-  Handle ready_handles[2];
-  MojoResult ready_results[2] = {MOJO_RESULT_UNKNOWN, MOJO_RESULT_UNKNOWN};
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(handle0_value, ready_handles[0]);
-  EXPECT_EQ(MOJO_RESULT_CANCELLED, ready_results[0]);
-
-  EXPECT_EQ(MOJO_RESULT_NOT_FOUND, wait_set.RemoveHandle(handle0_value));
-}
-
-TEST_F(WaitSetTest, CloseBeforeWaiting) {
-  MessagePipe p;
-  WaitSet wait_set;
-
-  wait_set.AddHandle(p.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  wait_set.AddHandle(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-  Handle handle0_value = p.handle0.get();
-  Handle handle1_value = p.handle1.get();
-
-  p.handle0.reset();
-  p.handle1.reset();
-
-  // Ensure that the WaitSet user is always made aware of all cancellations even
-  // if they happen while not waiting, or they have to be returned over the span
-  // of multiple Wait() calls due to insufficient output storage.
-
-  size_t num_ready_handles = 1;
-  Handle ready_handle;
-  MojoResult ready_result = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(nullptr, &num_ready_handles, &ready_handle, &ready_result);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_TRUE(ready_handle == handle0_value || ready_handle == handle1_value);
-  EXPECT_EQ(MOJO_RESULT_CANCELLED, ready_result);
-  EXPECT_EQ(MOJO_RESULT_NOT_FOUND, wait_set.RemoveHandle(handle0_value));
-
-  wait_set.Wait(nullptr, &num_ready_handles, &ready_handle, &ready_result);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_TRUE(ready_handle == handle0_value || ready_handle == handle1_value);
-  EXPECT_EQ(MOJO_RESULT_CANCELLED, ready_result);
-  EXPECT_EQ(MOJO_RESULT_NOT_FOUND, wait_set.RemoveHandle(handle0_value));
-
-  // Nothing more to wait on.
-  wait_set.Wait(nullptr, &num_ready_handles, &ready_handle, &ready_result);
-  EXPECT_EQ(0u, num_ready_handles);
-}
-
-TEST_F(WaitSetTest, SatisfiedThenUnsatisfied) {
-  MessagePipe p;
-  WaitSet wait_set;
-
-  wait_set.AddHandle(p.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  wait_set.AddHandle(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-  const char kTestMessage1[] = "testing testing testing";
-  WriteMessage(p.handle0, kTestMessage1);
-
-  size_t num_ready_handles = 2;
-  Handle ready_handles[2];
-  MojoResult ready_results[2] = {MOJO_RESULT_UNKNOWN, MOJO_RESULT_UNKNOWN};
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(p.handle1.get(), ready_handles[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-
-  EXPECT_EQ(kTestMessage1, ReadMessage(p.handle1));
-
-  ThreadedRunner write_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        // Wait a little while, then write a message.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        WriteMessage(*handle, "wakey wakey");
-      },
-      &p.handle1));
-  write_after_delay.Start();
-
-  num_ready_handles = 2;
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(p.handle0.get(), ready_handles[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-}
-
-TEST_F(WaitSetTest, EventOnly) {
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::SIGNALED);
-  WaitSet wait_set;
-  wait_set.AddEvent(&event);
-
-  base::WaitableEvent* ready_event = nullptr;
-  size_t num_ready_handles = 1;
-  Handle ready_handle;
-  MojoResult ready_result = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(&ready_event, &num_ready_handles, &ready_handle, &ready_result);
-  EXPECT_EQ(0u, num_ready_handles);
-  EXPECT_EQ(&event, ready_event);
-}
-
-TEST_F(WaitSetTest, EventAndHandle) {
-  const char kTestMessage[] = "hello hello";
-
-  MessagePipe p;
-  WriteMessage(p.handle0, kTestMessage);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WaitSet wait_set;
-  wait_set.AddHandle(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  wait_set.AddEvent(&event);
-
-  base::WaitableEvent* ready_event = nullptr;
-  size_t num_ready_handles = 1;
-  Handle ready_handle;
-  MojoResult ready_result = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(&ready_event, &num_ready_handles, &ready_handle, &ready_result);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(nullptr, ready_event);
-  EXPECT_EQ(p.handle1.get(), ready_handle);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_result);
-
-  EXPECT_EQ(kTestMessage, ReadMessage(p.handle1));
-
-  ThreadedRunner signal_after_delay(base::Bind(
-      [](base::WaitableEvent* event) {
-        // Wait a little while, then close the handle.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        event->Signal();
-      },
-      &event));
-  signal_after_delay.Start();
-
-  wait_set.Wait(&ready_event, &num_ready_handles, &ready_handle, &ready_result);
-  EXPECT_EQ(0u, num_ready_handles);
-  EXPECT_EQ(&event, ready_event);
-}
-
-TEST_F(WaitSetTest, NoStarvation) {
-  const char kTestMessage[] = "wait for it";
-  const size_t kNumTestPipes = 50;
-  const size_t kNumTestEvents = 10;
-
-  // Create a bunch of handles and events which are always ready and add them
-  // to a shared WaitSet.
-
-  WaitSet wait_set;
-
-  MessagePipe pipes[kNumTestPipes];
-  for (size_t i = 0; i < kNumTestPipes; ++i) {
-    WriteMessage(pipes[i].handle0, kTestMessage);
-    Wait(pipes[i].handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-    WriteMessage(pipes[i].handle1, kTestMessage);
-    Wait(pipes[i].handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-    wait_set.AddHandle(pipes[i].handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-    wait_set.AddHandle(pipes[i].handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  }
-
-  std::vector<std::unique_ptr<base::WaitableEvent>> events(kNumTestEvents);
-  for (auto& event_ptr : events) {
-    event_ptr = base::MakeUnique<base::WaitableEvent>(
-        base::WaitableEvent::ResetPolicy::MANUAL,
-        base::WaitableEvent::InitialState::NOT_SIGNALED);
-    event_ptr->Signal();
-    wait_set.AddEvent(event_ptr.get());
-  }
-
-  // Now verify that all handle and event signals are deteceted within a finite
-  // number of consecutive Wait() calls. Do it a few times for good measure.
-  for (size_t i = 0; i < 3; ++i) {
-    std::set<base::WaitableEvent*> ready_events;
-    std::set<Handle> ready_handles;
-    while (ready_events.size() < kNumTestEvents ||
-           ready_handles.size() < kNumTestPipes * 2) {
-      base::WaitableEvent* ready_event = nullptr;
-      size_t num_ready_handles = 1;
-      Handle ready_handle;
-      MojoResult ready_result = MOJO_RESULT_UNKNOWN;
-      wait_set.Wait(&ready_event, &num_ready_handles, &ready_handle,
-                    &ready_result);
-      if (ready_event)
-        ready_events.insert(ready_event);
-
-      if (num_ready_handles) {
-        EXPECT_EQ(1u, num_ready_handles);
-        EXPECT_EQ(MOJO_RESULT_OK, ready_result);
-        ready_handles.insert(ready_handle);
-      }
-    }
-  }
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/tests/wait_unittest.cc b/mojo/public/cpp/system/tests/wait_unittest.cc
deleted file mode 100644
index 1d9d3c6..0000000
--- a/mojo/public/cpp/system/tests/wait_unittest.cc
+++ /dev/null
@@ -1,321 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/wait.h"
-
-#include <string>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/strings/string_piece.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/handle_signals_state.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-using WaitTest = testing::Test;
-using WaitManyTest = testing::Test;
-
-void WriteMessage(const ScopedMessagePipeHandle& handle,
-                  const base::StringPiece& message) {
-  MojoResult rv = WriteMessageRaw(handle.get(), message.data(),
-                                  static_cast<uint32_t>(message.size()),
-                                  nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE);
-  CHECK_EQ(MOJO_RESULT_OK, rv);
-}
-
-std::string ReadMessage(const ScopedMessagePipeHandle& handle) {
-  uint32_t num_bytes = 0;
-  uint32_t num_handles = 0;
-  MojoResult rv = ReadMessageRaw(handle.get(), nullptr, &num_bytes, nullptr,
-                                 &num_handles, MOJO_READ_MESSAGE_FLAG_NONE);
-  CHECK_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, rv);
-  CHECK_EQ(0u, num_handles);
-
-  std::vector<char> buffer(num_bytes);
-  rv = ReadMessageRaw(handle.get(), buffer.data(), &num_bytes, nullptr,
-                      &num_handles, MOJO_READ_MESSAGE_FLAG_NONE);
-  CHECK_EQ(MOJO_RESULT_OK, rv);
-  return std::string(buffer.data(), buffer.size());
-}
-
-class ThreadedRunner : public base::SimpleThread {
- public:
-  explicit ThreadedRunner(const base::Closure& callback)
-      : SimpleThread("ThreadedRunner"), callback_(callback) {}
-  ~ThreadedRunner() override { Join(); }
-
-  void Run() override { callback_.Run(); }
-
- private:
-  const base::Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadedRunner);
-};
-
-TEST_F(WaitTest, InvalidArguments) {
-  Handle invalid_handle;
-
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            Wait(invalid_handle, MOJO_HANDLE_SIGNAL_READABLE));
-
-  MessagePipe p;
-  Handle valid_handles[2] = {p.handle0.get(), p.handle1.get()};
-  Handle invalid_handles[2];
-  MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_NONE,
-                                  MOJO_HANDLE_SIGNAL_NONE};
-  size_t result_index = 0;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            WaitMany(invalid_handles, signals, 2, &result_index));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            WaitMany(nullptr, signals, 2, &result_index));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            WaitMany(valid_handles, nullptr, 2, &result_index));
-}
-
-TEST_F(WaitTest, Basic) {
-  MessagePipe p;
-
-  // Write to one end of the pipe and wait on the other.
-  const char kTestMessage1[] = "how about a nice game of chess?";
-  WriteMessage(p.handle0, kTestMessage1);
-  EXPECT_EQ(MOJO_RESULT_OK, Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE));
-
-  // And make sure we can also grab the handle signals state (with both the C
-  // and C++ library structs.)
-
-  MojoHandleSignalsState c_hss = {0, 0};
-  EXPECT_EQ(MOJO_RESULT_OK,
-            Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, &c_hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            c_hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            c_hss.satisfiable_signals);
-
-  HandleSignalsState hss;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_TRUE(hss.readable() && hss.writable() && !hss.peer_closed());
-  EXPECT_FALSE(hss.never_readable() || hss.never_writable() ||
-               hss.never_peer_closed());
-
-  // Now close the writing end and wait for peer closure.
-
-  p.handle0.reset();
-  EXPECT_EQ(MOJO_RESULT_OK,
-            Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-
-  // Still readable as there's still a message queued. No longer writable as
-  // peer closure has been detected.
-  EXPECT_TRUE(hss.readable() && hss.peer_closed() && !hss.writable());
-  EXPECT_TRUE(hss.never_writable() && !hss.never_readable() &&
-              !hss.never_peer_closed());
-
-  // Read the message and wait for readable again. Waiting should fail since
-  // there are no more messages and the peer is closed.
-  EXPECT_EQ(kTestMessage1, ReadMessage(p.handle1));
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-
-  // Sanity check the signals state again.
-  EXPECT_TRUE(hss.peer_closed() && !hss.readable() && !hss.writable());
-  EXPECT_TRUE(hss.never_readable() && hss.never_writable() &&
-              !hss.never_peer_closed());
-}
-
-TEST_F(WaitTest, DelayedWrite) {
-  MessagePipe p;
-
-  ThreadedRunner write_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        // Wait a little while, then write a message.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        WriteMessage(*handle, "wakey wakey");
-      },
-      &p.handle0));
-  write_after_delay.Start();
-
-  HandleSignalsState hss;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_TRUE(hss.readable() && hss.writable() && !hss.peer_closed());
-  EXPECT_TRUE(!hss.never_readable() && !hss.never_writable() &&
-              !hss.never_peer_closed());
-}
-
-TEST_F(WaitTest, DelayedPeerClosure) {
-  MessagePipe p;
-
-  ThreadedRunner close_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        // Wait a little while, then close the handle.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        handle->reset();
-      },
-      &p.handle0));
-  close_after_delay.Start();
-
-  HandleSignalsState hss;
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_TRUE(!hss.readable() && !hss.writable() && hss.peer_closed());
-  EXPECT_TRUE(hss.never_readable() && hss.never_writable() &&
-              !hss.never_peer_closed());
-}
-
-TEST_F(WaitTest, CloseWhileWaiting) {
-  MessagePipe p;
-  ThreadedRunner close_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        handle->reset();
-      },
-      &p.handle0));
-  close_after_delay.Start();
-  EXPECT_EQ(MOJO_RESULT_CANCELLED,
-            Wait(p.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE));
-}
-
-TEST_F(WaitManyTest, Basic) {
-  MessagePipe p;
-
-  const char kTestMessage1[] = "hello";
-  WriteMessage(p.handle0, kTestMessage1);
-
-  // Wait for either handle to become readable. Wait twice, just to verify that
-  // we can use either the C or C++ signaling state structure for the last
-  // argument.
-
-  Handle handles[2] = {p.handle0.get(), p.handle1.get()};
-  MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
-                                  MOJO_HANDLE_SIGNAL_READABLE};
-  size_t result_index = 0;
-  MojoHandleSignalsState c_hss[2];
-  HandleSignalsState hss[2];
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitMany(handles, signals, 2, &result_index, c_hss));
-  EXPECT_EQ(1u, result_index);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, c_hss[0].satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            c_hss[0].satisfiable_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            c_hss[1].satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            c_hss[1].satisfiable_signals);
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitMany(handles, signals, 2, &result_index, hss));
-  EXPECT_EQ(1u, result_index);
-  EXPECT_TRUE(!hss[0].readable() && hss[0].writable() && !hss[0].peer_closed());
-  EXPECT_TRUE(!hss[0].never_readable() && !hss[0].never_writable() &&
-              !hss[0].never_peer_closed());
-  EXPECT_TRUE(hss[1].readable() && hss[1].writable() && !hss[1].peer_closed());
-  EXPECT_TRUE(!hss[1].never_readable() && !hss[1].never_writable() &&
-              !hss[1].never_peer_closed());
-
-  // Close the writer and read the message. Try to wait again, and it should
-  // fail due to the conditions being unsatisfiable.
-
-  EXPECT_EQ(kTestMessage1, ReadMessage(p.handle1));
-  p.handle0.reset();
-
-  // handles[0] is invalid.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            WaitMany(handles, signals, 2, &result_index, hss));
-  handles[0] = handles[1];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitMany(handles, signals, 1, &result_index, hss));
-  EXPECT_EQ(0u, result_index);
-  EXPECT_TRUE(!hss[0].readable() && !hss[0].writable() && hss[0].peer_closed());
-  EXPECT_TRUE(hss[0].never_readable() && hss[0].never_writable() &&
-              !hss[0].never_peer_closed());
-}
-
-TEST_F(WaitManyTest, CloseWhileWaiting) {
-  MessagePipe p, q;
-
-  Handle handles[3] = {q.handle0.get(), q.handle1.get(), p.handle1.get()};
-  MojoHandleSignals signals[3] = {MOJO_HANDLE_SIGNAL_READABLE,
-                                  MOJO_HANDLE_SIGNAL_READABLE,
-                                  MOJO_HANDLE_SIGNAL_READABLE};
-
-  ThreadedRunner close_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        handle->reset();
-      },
-      &p.handle1));
-  close_after_delay.Start();
-
-  size_t result_index = 0;
-  EXPECT_EQ(MOJO_RESULT_CANCELLED,
-            WaitMany(handles, signals, 3, &result_index));
-  EXPECT_EQ(2u, result_index);
-}
-
-TEST_F(WaitManyTest, DelayedWrite) {
-  MessagePipe p;
-
-  ThreadedRunner write_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        // Wait a little while, then write a message.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        WriteMessage(*handle, "wakey wakey");
-      },
-      &p.handle0));
-  write_after_delay.Start();
-
-  Handle handles[2] = {p.handle0.get(), p.handle1.get()};
-  MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
-                                  MOJO_HANDLE_SIGNAL_READABLE};
-  size_t result_index = 0;
-  HandleSignalsState hss[2];
-  EXPECT_EQ(MOJO_RESULT_OK, WaitMany(handles, signals, 2, &result_index, hss));
-  EXPECT_EQ(1u, result_index);
-  EXPECT_TRUE(!hss[0].readable() && hss[0].writable() && !hss[0].peer_closed());
-  EXPECT_TRUE(!hss[0].never_readable() && !hss[0].never_writable() &&
-              !hss[0].never_peer_closed());
-  EXPECT_TRUE(hss[1].readable() && hss[1].writable() && !hss[1].peer_closed());
-  EXPECT_TRUE(!hss[1].never_readable() && !hss[1].never_writable() &&
-              !hss[1].never_peer_closed());
-}
-
-TEST_F(WaitManyTest, DelayedPeerClosure) {
-  MessagePipe p, q;
-
-  ThreadedRunner close_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        // Wait a little while, then close the handle.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        handle->reset();
-      },
-      &p.handle0));
-  close_after_delay.Start();
-
-  Handle handles[3] = {q.handle0.get(), q.handle1.get(), p.handle1.get()};
-  MojoHandleSignals signals[3] = {MOJO_HANDLE_SIGNAL_READABLE,
-                                  MOJO_HANDLE_SIGNAL_READABLE,
-                                  MOJO_HANDLE_SIGNAL_READABLE};
-  size_t result_index = 0;
-  HandleSignalsState hss[3];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitMany(handles, signals, 3, &result_index, hss));
-  EXPECT_EQ(2u, result_index);
-  EXPECT_TRUE(!hss[2].readable() && !hss[2].writable() && hss[2].peer_closed());
-  EXPECT_TRUE(hss[2].never_readable() && hss[2].never_writable() &&
-              !hss[2].never_peer_closed());
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/wait.cc b/mojo/public/cpp/system/wait.cc
deleted file mode 100644
index e4e124f..0000000
--- a/mojo/public/cpp/system/wait.cc
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/wait.h"
-
-#include <memory>
-#include <vector>
-
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/waitable_event.h"
-#include "mojo/public/c/system/watcher.h"
-#include "mojo/public/cpp/system/watcher.h"
-
-namespace mojo {
-namespace {
-
-class WatchContext : public base::RefCountedThreadSafe<WatchContext> {
- public:
-  WatchContext()
-      : event_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
-               base::WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  base::WaitableEvent& event() { return event_; }
-  MojoResult wait_result() const { return wait_result_; }
-  MojoHandleSignalsState wait_state() const { return wait_state_; }
-  uintptr_t context_value() const { return reinterpret_cast<uintptr_t>(this); }
-
-  static void OnNotification(uintptr_t context_value,
-                             MojoResult result,
-                             MojoHandleSignalsState state,
-                             MojoWatcherNotificationFlags flags) {
-    auto* context = reinterpret_cast<WatchContext*>(context_value);
-    context->Notify(result, state);
-    if (result == MOJO_RESULT_CANCELLED) {
-      // Balanced in Wait() or WaitMany().
-      context->Release();
-    }
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<WatchContext>;
-
-  ~WatchContext() {}
-
-  void Notify(MojoResult result, MojoHandleSignalsState state) {
-    if (wait_result_ == MOJO_RESULT_UNKNOWN) {
-      wait_result_ = result;
-      wait_state_ = state;
-    }
-    event_.Signal();
-  }
-
-  base::WaitableEvent event_;
-
-  // NOTE: Although these are modified in Notify() which may be called from any
-  // thread, Notify() is guaranteed to never run concurrently with itself.
-  // Furthermore, they are only modified once, before |event_| signals; so there
-  // is no need for a WatchContext user to synchronize access to these fields
-  // apart from waiting on |event()|.
-  MojoResult wait_result_ = MOJO_RESULT_UNKNOWN;
-  MojoHandleSignalsState wait_state_ = {0, 0};
-
-  DISALLOW_COPY_AND_ASSIGN(WatchContext);
-};
-
-}  // namespace
-
-MojoResult Wait(Handle handle,
-                MojoHandleSignals signals,
-                MojoHandleSignalsState* signals_state) {
-  ScopedWatcherHandle watcher;
-  MojoResult rv = CreateWatcher(&WatchContext::OnNotification, &watcher);
-  DCHECK_EQ(MOJO_RESULT_OK, rv);
-
-  scoped_refptr<WatchContext> context = new WatchContext;
-
-  // Balanced in WatchContext::OnNotification if MojoWatch() is successful.
-  // Otherwise balanced immediately below.
-  context->AddRef();
-
-  rv = MojoWatch(watcher.get().value(), handle.value(), signals,
-                 context->context_value());
-  if (rv == MOJO_RESULT_INVALID_ARGUMENT) {
-    // Balanced above.
-    context->Release();
-    return rv;
-  }
-  DCHECK_EQ(MOJO_RESULT_OK, rv);
-
-  uint32_t num_ready_contexts = 1;
-  uintptr_t ready_context;
-  MojoResult ready_result;
-  MojoHandleSignalsState ready_state;
-  rv = MojoArmWatcher(watcher.get().value(), &num_ready_contexts,
-                      &ready_context, &ready_result, &ready_state);
-  if (rv == MOJO_RESULT_FAILED_PRECONDITION) {
-    DCHECK_EQ(1u, num_ready_contexts);
-    if (signals_state)
-      *signals_state = ready_state;
-    return ready_result;
-  }
-
-  // Wait for the first notification only.
-  context->event().Wait();
-
-  ready_result = context->wait_result();
-  DCHECK_NE(MOJO_RESULT_UNKNOWN, ready_result);
-
-  if (signals_state)
-    *signals_state = context->wait_state();
-
-  return ready_result;
-}
-
-MojoResult WaitMany(const Handle* handles,
-                    const MojoHandleSignals* signals,
-                    size_t num_handles,
-                    size_t* result_index,
-                    MojoHandleSignalsState* signals_states) {
-  if (!handles || !signals)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  ScopedWatcherHandle watcher;
-  MojoResult rv = CreateWatcher(&WatchContext::OnNotification, &watcher);
-  DCHECK_EQ(MOJO_RESULT_OK, rv);
-
-  std::vector<scoped_refptr<WatchContext>> contexts(num_handles);
-  std::vector<base::WaitableEvent*> events(num_handles);
-  for (size_t i = 0; i < num_handles; ++i) {
-    contexts[i] = new WatchContext();
-
-    // Balanced in WatchContext::OnNotification if MojoWatch() is successful.
-    // Otherwise balanced immediately below.
-    contexts[i]->AddRef();
-
-    MojoResult rv = MojoWatch(watcher.get().value(), handles[i].value(),
-                              signals[i], contexts[i]->context_value());
-    if (rv == MOJO_RESULT_INVALID_ARGUMENT) {
-      if (result_index)
-        *result_index = i;
-
-      // Balanced above.
-      contexts[i]->Release();
-
-      return MOJO_RESULT_INVALID_ARGUMENT;
-    }
-
-    events[i] = &contexts[i]->event();
-  }
-
-  uint32_t num_ready_contexts = 1;
-  uintptr_t ready_context = 0;
-  MojoResult ready_result = MOJO_RESULT_UNKNOWN;
-  MojoHandleSignalsState ready_state{0, 0};
-  rv = MojoArmWatcher(watcher.get().value(), &num_ready_contexts,
-                      &ready_context, &ready_result, &ready_state);
-
-  size_t index = num_handles;
-  if (rv == MOJO_RESULT_FAILED_PRECONDITION) {
-    DCHECK_EQ(1u, num_ready_contexts);
-
-    // Most commonly we only watch a small number of handles. Just scan for
-    // the right index.
-    for (size_t i = 0; i < num_handles; ++i) {
-      if (contexts[i]->context_value() == ready_context) {
-        index = i;
-        break;
-      }
-    }
-  } else {
-    DCHECK_EQ(MOJO_RESULT_OK, rv);
-
-    // Wait for one of the contexts to signal. First one wins.
-    index = base::WaitableEvent::WaitMany(events.data(), events.size());
-    ready_result = contexts[index]->wait_result();
-    ready_state = contexts[index]->wait_state();
-  }
-
-  DCHECK_NE(MOJO_RESULT_UNKNOWN, ready_result);
-  DCHECK_LT(index, num_handles);
-
-  if (result_index)
-    *result_index = index;
-
-  if (signals_states) {
-    for (size_t i = 0; i < num_handles; ++i) {
-      if (i == index) {
-        signals_states[i] = ready_state;
-      } else {
-        signals_states[i] = handles[i].QuerySignalsState();
-      }
-    }
-  }
-
-  return ready_result;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/wait.h b/mojo/public/cpp/system/wait.h
deleted file mode 100644
index 808e44f..0000000
--- a/mojo/public/cpp/system/wait.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_WAIT_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_WAIT_H_
-
-#include <stddef.h>
-
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/system_export.h"
-
-namespace mojo {
-
-// Blocks the calling thread, waiting for one or more signals in |signals| to be
-// become satisfied -- or for all of them to become unsatisfiable -- on the
-// given Handle.
-//
-// If |signals_state| is non-null, |handle| is valid, the wait is not cancelled
-// (see return values below), the last known signaling state of |handle| is
-// written to |*signals_state| before returning.
-//
-// Return values:
-//   |MOJO_RESULT_OK| if one or more signals in |signals| has been raised on
-//       |handle| .
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the state of |handle| changes such
-//       that no signals in |signals| can ever be raised again.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |handle| is not a valid handle.
-//   |MOJO_RESULT_CANCELLED| if the wait was cancelled because |handle| was
-//       closed by some other thread while waiting.
-MOJO_CPP_SYSTEM_EXPORT MojoResult
-Wait(Handle handle,
-     MojoHandleSignals signals,
-     MojoHandleSignalsState* signals_state = nullptr);
-
-// Waits on |handles[0]|, ..., |handles[num_handles-1]| until:
-//  - At least one handle satisfies a signal indicated in its respective
-//    |signals[0]|, ..., |signals[num_handles-1]|.
-//  - It becomes known that no signal in some |signals[i]| will ever be
-//    satisfied.
-//
-// This means that |WaitMany()| behaves as if |Wait()| were called on each
-// handle/signals pair simultaneously, completing when the first |Wait()| would
-// complete.
-//
-// If |signals_states| is non-null, all other arguments are valid, and the wait
-// is not cancelled (see return values below), the last known signaling state of
-// each Handle |handles[i]| is written to its corresponding entry in
-// |signals_states[i]| before returning.
-//
-// Returns values:
-//   |MOJO_RESULT_OK| if one of the Handles in |handles| had one or more of its
-//       correpsonding signals satisfied. |*result_index| contains the index
-//       of the Handle in question if |result_index| is non-null.
-//   |MOJO_RESULT_FAILED_PRECONDITION| if one of the Handles in |handles|
-//       changes state such that its corresponding signals become permanently
-//       unsatisfiable. |*result_index| contains the index of the handle in
-//       question if |result_index| is non-null.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if any Handle in |handles| is invalid,
-//       or if either |handles| or |signals| is null.
-//   |MOJO_RESULT_CANCELLED| if the wait was cancelled because a handle in
-//       |handles| was closed by some other thread while waiting.
-//       |*result_index| contains the index of the closed Handle if
-//       |result_index| is non-null.
-MOJO_CPP_SYSTEM_EXPORT MojoResult
-WaitMany(const Handle* handles,
-         const MojoHandleSignals* signals,
-         size_t num_handles,
-         size_t* result_index = nullptr,
-         MojoHandleSignalsState* signals_states = nullptr);
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_WAIT_H_
diff --git a/mojo/public/cpp/system/wait_set.cc b/mojo/public/cpp/system/wait_set.cc
deleted file mode 100644
index 1728f81..0000000
--- a/mojo/public/cpp/system/wait_set.cc
+++ /dev/null
@@ -1,371 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/wait_set.h"
-
-#include <algorithm>
-#include <limits>
-#include <map>
-#include <set>
-#include <vector>
-
-#include "base/containers/stack_container.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "mojo/public/cpp/system/watcher.h"
-
-namespace mojo {
-
-class WaitSet::State : public base::RefCountedThreadSafe<State> {
- public:
-  State()
-      : handle_event_(base::WaitableEvent::ResetPolicy::MANUAL,
-                      base::WaitableEvent::InitialState::NOT_SIGNALED) {
-    MojoResult rv = CreateWatcher(&Context::OnNotification, &watcher_handle_);
-    DCHECK_EQ(MOJO_RESULT_OK, rv);
-  }
-
-  void ShutDown() {
-    // NOTE: This may immediately invoke Notify for every context.
-    watcher_handle_.reset();
-  }
-
-  MojoResult AddEvent(base::WaitableEvent* event) {
-    auto result = user_events_.insert(event);
-    if (result.second)
-      return MOJO_RESULT_OK;
-    return MOJO_RESULT_ALREADY_EXISTS;
-  }
-
-  MojoResult RemoveEvent(base::WaitableEvent* event) {
-    auto it = user_events_.find(event);
-    if (it == user_events_.end())
-      return MOJO_RESULT_NOT_FOUND;
-    user_events_.erase(it);
-    return MOJO_RESULT_OK;
-  }
-
-  MojoResult AddHandle(Handle handle, MojoHandleSignals signals) {
-    DCHECK(watcher_handle_.is_valid());
-
-    scoped_refptr<Context> context = new Context(this, handle);
-
-    {
-      base::AutoLock lock(lock_);
-
-      if (handle_to_context_.count(handle))
-        return MOJO_RESULT_ALREADY_EXISTS;
-      DCHECK(!contexts_.count(context->context_value()));
-
-      handle_to_context_[handle] = context;
-      contexts_[context->context_value()] = context;
-    }
-
-    // Balanced in State::Notify() with MOJO_RESULT_CANCELLED if
-    // MojoWatch() succeeds. Otherwise balanced immediately below.
-    context->AddRef();
-
-    // This can notify immediately if the watcher is already armed. Don't hold
-    // |lock_| while calling it.
-    MojoResult rv = MojoWatch(watcher_handle_.get().value(), handle.value(),
-                              signals, context->context_value());
-    if (rv == MOJO_RESULT_INVALID_ARGUMENT) {
-      base::AutoLock lock(lock_);
-      handle_to_context_.erase(handle);
-      contexts_.erase(context->context_value());
-
-      // Balanced above.
-      context->Release();
-      return rv;
-    }
-    DCHECK_EQ(MOJO_RESULT_OK, rv);
-
-    return rv;
-  }
-
-  MojoResult RemoveHandle(Handle handle) {
-    DCHECK(watcher_handle_.is_valid());
-
-    scoped_refptr<Context> context;
-    {
-      base::AutoLock lock(lock_);
-      auto it = handle_to_context_.find(handle);
-      if (it == handle_to_context_.end())
-        return MOJO_RESULT_NOT_FOUND;
-
-      context = std::move(it->second);
-      handle_to_context_.erase(it);
-
-      // Ensure that we never return this handle as a ready result again. Note
-      // that it's removal from |handle_to_context_| above ensures it will never
-      // be added back to this map.
-      ready_handles_.erase(handle);
-    }
-
-    // NOTE: This may enter the notification callback immediately, so don't hold
-    // |lock_| while calling it.
-    MojoResult rv = MojoCancelWatch(watcher_handle_.get().value(),
-                                    context->context_value());
-
-    // We don't really care whether or not this succeeds. In either case, the
-    // context was or will imminently be cancelled and moved from |contexts_|
-    // to |cancelled_contexts_|.
-    DCHECK(rv == MOJO_RESULT_OK || rv == MOJO_RESULT_NOT_FOUND);
-
-    {
-      // Always clear |cancelled_contexts_| in case it's accumulated any more
-      // entries since the last time we ran.
-      base::AutoLock lock(lock_);
-      cancelled_contexts_.clear();
-    }
-
-    return rv;
-  }
-
-  void Wait(base::WaitableEvent** ready_event,
-            size_t* num_ready_handles,
-            Handle* ready_handles,
-            MojoResult* ready_results,
-            MojoHandleSignalsState* signals_states) {
-    DCHECK(watcher_handle_.is_valid());
-    DCHECK(num_ready_handles);
-    DCHECK(ready_handles);
-    DCHECK(ready_results);
-    {
-      base::AutoLock lock(lock_);
-      if (ready_handles_.empty()) {
-        // No handles are currently in the ready set. Make sure the event is
-        // reset and try to arm the watcher.
-        handle_event_.Reset();
-
-        DCHECK_LE(*num_ready_handles, std::numeric_limits<uint32_t>::max());
-        uint32_t num_ready_contexts = static_cast<uint32_t>(*num_ready_handles);
-
-        base::StackVector<uintptr_t, 4> ready_contexts;
-        ready_contexts.container().resize(num_ready_contexts);
-        base::StackVector<MojoHandleSignalsState, 4> ready_states;
-        MojoHandleSignalsState* out_states = signals_states;
-        if (!out_states) {
-          // If the caller didn't provide a buffer for signal states, we provide
-          // our own locally. MojoArmWatcher() requires one if we want to handle
-          // arming failure properly.
-          ready_states.container().resize(num_ready_contexts);
-          out_states = ready_states.container().data();
-        }
-        MojoResult rv = MojoArmWatcher(
-            watcher_handle_.get().value(), &num_ready_contexts,
-            ready_contexts.container().data(), ready_results, out_states);
-
-        if (rv == MOJO_RESULT_FAILED_PRECONDITION) {
-          // Simulate the handles becoming ready. We do this in lieu of
-          // returning the results immediately so as to avoid potentially
-          // starving user events. i.e., we always want to call WaitMany()
-          // below.
-          handle_event_.Signal();
-          for (size_t i = 0; i < num_ready_contexts; ++i) {
-            auto it = contexts_.find(ready_contexts.container()[i]);
-            DCHECK(it != contexts_.end());
-            ready_handles_[it->second->handle()] = {ready_results[i],
-                                                    out_states[i]};
-          }
-        } else if (rv == MOJO_RESULT_NOT_FOUND) {
-          // Nothing to watch. If there are no user events, always signal to
-          // avoid deadlock.
-          if (user_events_.empty())
-            handle_event_.Signal();
-        } else {
-          // Watcher must be armed now. No need to manually signal.
-          DCHECK_EQ(MOJO_RESULT_OK, rv);
-        }
-      }
-    }
-
-    // Build a local contiguous array of events to wait on. These are rotated
-    // across Wait() calls to avoid starvation, by virtue of the fact that
-    // WaitMany guarantees left-to-right priority when multiple events are
-    // signaled.
-
-    base::StackVector<base::WaitableEvent*, 4> events;
-    events.container().resize(user_events_.size() + 1);
-    if (waitable_index_shift_ > user_events_.size())
-      waitable_index_shift_ = 0;
-
-    size_t dest_index = waitable_index_shift_++;
-    events.container()[dest_index] = &handle_event_;
-    for (auto* e : user_events_) {
-      dest_index = (dest_index + 1) % events.container().size();
-      events.container()[dest_index] = e;
-    }
-
-    size_t index = base::WaitableEvent::WaitMany(events.container().data(),
-                                                 events.container().size());
-    base::AutoLock lock(lock_);
-
-    // Pop as many handles as we can out of the ready set and return them. Note
-    // that we do this regardless of which event signaled, as there may be
-    // ready handles in any case and they may be interesting to the caller.
-    *num_ready_handles = std::min(*num_ready_handles, ready_handles_.size());
-    for (size_t i = 0; i < *num_ready_handles; ++i) {
-      auto it = ready_handles_.begin();
-      ready_handles[i] = it->first;
-      ready_results[i] = it->second.result;
-      if (signals_states)
-        signals_states[i] = it->second.signals_state;
-      ready_handles_.erase(it);
-    }
-
-    // If the caller cares, let them know which user event unblocked us, if any.
-    if (ready_event) {
-      if (events.container()[index] == &handle_event_)
-        *ready_event = nullptr;
-      else
-        *ready_event = events.container()[index];
-    }
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<State>;
-
-  class Context : public base::RefCountedThreadSafe<Context> {
-   public:
-    Context(scoped_refptr<State> state, Handle handle)
-        : state_(state), handle_(handle) {}
-
-    Handle handle() const { return handle_; }
-
-    uintptr_t context_value() const {
-      return reinterpret_cast<uintptr_t>(this);
-    }
-
-    static void OnNotification(uintptr_t context,
-                               MojoResult result,
-                               MojoHandleSignalsState signals_state,
-                               MojoWatcherNotificationFlags flags) {
-      reinterpret_cast<Context*>(context)->Notify(result, signals_state);
-    }
-
-   private:
-    friend class base::RefCountedThreadSafe<Context>;
-
-    ~Context() {}
-
-    void Notify(MojoResult result, MojoHandleSignalsState signals_state) {
-      state_->Notify(handle_, result, signals_state, this);
-    }
-
-    const scoped_refptr<State> state_;
-    const Handle handle_;
-
-    DISALLOW_COPY_AND_ASSIGN(Context);
-  };
-
-  ~State() {}
-
-  void Notify(Handle handle,
-              MojoResult result,
-              MojoHandleSignalsState signals_state,
-              Context* context) {
-    base::AutoLock lock(lock_);
-
-    // This could be a cancellation notification following an explicit
-    // RemoveHandle(), in which case we really don't care and don't want to
-    // add it to the ready set. Only update and signal if that's not the case.
-    if (!handle_to_context_.count(handle)) {
-      DCHECK_EQ(MOJO_RESULT_CANCELLED, result);
-    } else {
-      ready_handles_[handle] = {result, signals_state};
-      handle_event_.Signal();
-    }
-
-    // Whether it's an implicit or explicit cancellation, erase from |contexts_|
-    // and append to |cancelled_contexts_|.
-    if (result == MOJO_RESULT_CANCELLED) {
-      contexts_.erase(context->context_value());
-      handle_to_context_.erase(handle);
-
-      // NOTE: We retain a context ref in |cancelled_contexts_| to ensure that
-      // this Context's heap address is not reused too soon. For example, it
-      // would otherwise be possible for the user to call AddHandle() from the
-      // WaitSet's thread immediately after this notification has fired on
-      // another thread, potentially reusing the same heap address for the newly
-      // added Context; and then they may call RemoveHandle() for this handle
-      // (not knowing its context has just been implicitly cancelled) and
-      // cause the new Context to be incorrectly removed from |contexts_|.
-      //
-      // This vector is cleared on the WaitSet's own thread every time
-      // RemoveHandle is called.
-      cancelled_contexts_.emplace_back(make_scoped_refptr(context));
-
-      // Balanced in State::AddHandle().
-      context->Release();
-    }
-  }
-
-  struct ReadyState {
-    ReadyState() = default;
-    ReadyState(MojoResult result, MojoHandleSignalsState signals_state)
-        : result(result), signals_state(signals_state) {}
-    ~ReadyState() = default;
-
-    MojoResult result = MOJO_RESULT_UNKNOWN;
-    MojoHandleSignalsState signals_state = {0, 0};
-  };
-
-  // Not guarded by lock. Must only be accessed from the WaitSet's owning
-  // thread.
-  ScopedWatcherHandle watcher_handle_;
-
-  base::Lock lock_;
-  std::map<uintptr_t, scoped_refptr<Context>> contexts_;
-  std::map<Handle, scoped_refptr<Context>> handle_to_context_;
-  std::map<Handle, ReadyState> ready_handles_;
-  std::vector<scoped_refptr<Context>> cancelled_contexts_;
-  std::set<base::WaitableEvent*> user_events_;
-
-  // Event signaled any time a handle notification is received.
-  base::WaitableEvent handle_event_;
-
-  // Offset by which to rotate the current set of waitable objects. This is used
-  // to guard against event starvation, as base::WaitableEvent::WaitMany gives
-  // preference to events in left-to-right order.
-  size_t waitable_index_shift_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(State);
-};
-
-WaitSet::WaitSet() : state_(new State) {}
-
-WaitSet::~WaitSet() {
-  state_->ShutDown();
-}
-
-MojoResult WaitSet::AddEvent(base::WaitableEvent* event) {
-  return state_->AddEvent(event);
-}
-
-MojoResult WaitSet::RemoveEvent(base::WaitableEvent* event) {
-  return state_->RemoveEvent(event);
-}
-
-MojoResult WaitSet::AddHandle(Handle handle, MojoHandleSignals signals) {
-  return state_->AddHandle(handle, signals);
-}
-
-MojoResult WaitSet::RemoveHandle(Handle handle) {
-  return state_->RemoveHandle(handle);
-}
-
-void WaitSet::Wait(base::WaitableEvent** ready_event,
-                   size_t* num_ready_handles,
-                   Handle* ready_handles,
-                   MojoResult* ready_results,
-                   MojoHandleSignalsState* signals_states) {
-  state_->Wait(ready_event, num_ready_handles, ready_handles, ready_results,
-               signals_states);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/wait_set.h b/mojo/public/cpp/system/wait_set.h
deleted file mode 100644
index 5047a86..0000000
--- a/mojo/public/cpp/system/wait_set.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_WAIT_SET_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_WAIT_SET_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/system_export.h"
-
-namespace base {
-class WaitableEvent;
-}
-
-namespace mojo {
-
-// WaitSet provides an efficient means of blocking a thread on any number of
-// events and Mojo handle state changes.
-//
-// Unlike WaitMany(), which incurs some extra setup cost for every call, a
-// WaitSet maintains some persistent accounting of the handles added or removed
-// from the set. A blocking wait operation (see  the Wait() method  below) can
-// then be performed multiple times for the same set of events and handles with
-// minimal additional setup per call.
-//
-// WaitSet is NOT thread-safe, so naturally handles and events may not be added
-// to or removed from the set while waiting.
-class MOJO_CPP_SYSTEM_EXPORT WaitSet {
- public:
-  WaitSet();
-  ~WaitSet();
-
-  // Adds |event| to the set of events to wait on. If successful, any future
-  // Wait() on this WaitSet will wake up if the event is signaled.
-  //
-  // |event| is not owned.
-  //
-  // Return values:
-  //   |MOJO_RESULT_OK| if |event| has been successfully added.
-  //   |MOJO_RESULT_ALREADY_EXISTS| if |event| is already in this WaitSet.
-  MojoResult AddEvent(base::WaitableEvent* event);
-
-  // Removes |event| from the set of events to wait on.
-  //
-  // Return values:
-  //   |MOJO_RESULT_OK| if |event| has been successfully added.
-  //   |MOJO_RESULT_NOT_FOUND| if |event| was not in the set.
-  MojoResult RemoveEvent(base::WaitableEvent* event);
-
-  // Adds |handle| to the set of handles to wait on. If successful, any future
-  // Wait() on this WaitSet will wake up in the event that one or more signals
-  // in |signals| becomes satisfied on |handle| or all of them become
-  // permanently unsatisfiable.
-  //
-  // Return values:
-  //   |MOJO_RESULT_OK| if |handle| has been successfully added.
-  //   |MOJO_RESULT_ALREADY_EXISTS| if |handle| is already in this WaitSet.
-  //   |MOJO_RESULT_INVALID_ARGUMENT| if |handle| is not a valid handle.
-  MojoResult AddHandle(Handle handle, MojoHandleSignals signals);
-
-  // Removes |handle| from the set of handles to wait on. Future calls to
-  // Wait() will be unaffected by the state of this handle.
-  //
-  // Return values:
-  //   |MOJO_RESULT_OK| if |handle| has been successfully removed.
-  //   |MOJO_RESULT_NOT_FOUND| if |handle| was not in the set.
-  MojoResult RemoveHandle(Handle handle);
-
-  // Waits on the current set of handles, waking up when one more of them meets
-  // the signaling conditions which were specified when they were added via
-  // AddHandle() above.
-  //
-  // |*num_ready_handles| on input must specify the number of entries available
-  // for output storage in |ready_handles| and |ready_result| (which must both
-  // be non-null). If |signals_states| is non-null it must also point to enough
-  // storage for |*num_ready_handles| MojoHandleSignalsState structures.
-  //
-  // Upon return, |*num_ready_handles| will contain the total number of handles
-  // whose information is stored in the given output buffers.
-  //
-  // If |ready_event| is non-null and the Wait() was unblocked by a user event
-  // signaling, the address of the event which signaled will be placed in
-  // |*ready_event|. Note that this is not necessarily exclusive to one or more
-  // handles also being ready. If |ready_event| is non-null and no user event
-  // was signaled for this Wait(), |*ready_event| will be null upon return.
-  //
-  // Every entry in |ready_handles| on output corresponds to one of the handles
-  // whose signaling state termianted the Wait() operation. Every corresponding
-  // entry in |ready_results| indicates the status of a ready handle according
-  // to the following result codes:
-  //   |MOJO_RESULT_OK| one or more signals for the handle has been satisfied.
-  //   |MOJO_RESULT_FAILED_PRECONDITION| all of the signals for the handle have
-  //       become permanently unsatisfiable.
-  //   |MOJO_RESULT_CANCELLED| if the handle has been closed from another
-  //       thread. NOTE: It is important to recognize that this means the
-  //       corresponding value in |ready_handles| is either invalid, or valid
-  //       but referring to a different handle (i.e. has already been reused) by
-  //       the time Wait() returns. The handle in question is automatically
-  //       removed from the WaitSet.
-  void Wait(base::WaitableEvent** ready_event,
-            size_t* num_ready_handles,
-            Handle* ready_handles,
-            MojoResult* ready_results,
-            MojoHandleSignalsState* signals_states = nullptr);
-
- private:
-  class State;
-
-  // Thread-safe state associated with this WaitSet. Used to aggregate
-  // notifications from watched handles.
-  scoped_refptr<State> state_;
-
-  DISALLOW_COPY_AND_ASSIGN(WaitSet);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_WAIT_SET_H_
diff --git a/mojo/public/cpp/system/watcher.cc b/mojo/public/cpp/system/watcher.cc
deleted file mode 100644
index 0c62ba8..0000000
--- a/mojo/public/cpp/system/watcher.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/watcher.h"
-
-#include "mojo/public/c/system/functions.h"
-
-namespace mojo {
-
-MojoResult CreateWatcher(MojoWatcherCallback callback,
-                         ScopedWatcherHandle* watcher_handle) {
-  MojoHandle handle;
-  MojoResult rv = MojoCreateWatcher(callback, &handle);
-  if (rv == MOJO_RESULT_OK)
-    watcher_handle->reset(WatcherHandle(handle));
-  return rv;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/watcher.h b/mojo/public/cpp/system/watcher.h
deleted file mode 100644
index d0a2578..0000000
--- a/mojo/public/cpp/system/watcher.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_WATCHER_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_WATCHER_H_
-
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/c/system/watcher.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/system_export.h"
-
-namespace mojo {
-
-// A strongly-typed representation of a |MojoHandle| for a watcher.
-class WatcherHandle : public Handle {
- public:
-  WatcherHandle() = default;
-  explicit WatcherHandle(MojoHandle value) : Handle(value) {}
-
-  // Copying and assignment allowed.
-};
-
-static_assert(sizeof(WatcherHandle) == sizeof(Handle),
-              "Bad size for C++ WatcherHandle");
-
-typedef ScopedHandleBase<WatcherHandle> ScopedWatcherHandle;
-static_assert(sizeof(ScopedWatcherHandle) == sizeof(WatcherHandle),
-              "Bad size for C++ ScopedWatcherHandle");
-
-MOJO_CPP_SYSTEM_EXPORT MojoResult
-CreateWatcher(MojoWatcherCallback callback,
-              ScopedWatcherHandle* watcher_handle);
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_WATCHER_H_
diff --git a/mojo/public/cpp/test_support/BUILD.gn b/mojo/public/cpp/test_support/BUILD.gn
deleted file mode 100644
index efa1712..0000000
--- a/mojo/public/cpp/test_support/BUILD.gn
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-static_library("test_utils") {
-  testonly = true
-
-  sources = [
-    "lib/test_support.cc",
-    "lib/test_utils.cc",
-    "test_utils.h",
-  ]
-
-  deps = [
-    "//mojo/public/c/test_support",
-    "//mojo/public/cpp/system",
-    "//testing/gtest",
-  ]
-}
diff --git a/mojo/public/cpp/test_support/lib/test_support.cc b/mojo/public/cpp/test_support/lib/test_support.cc
deleted file mode 100644
index 0b6035b..0000000
--- a/mojo/public/cpp/test_support/lib/test_support.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/test_support/test_support.h"
-
-#include <stdlib.h>
-
-namespace mojo {
-namespace test {
-
-std::vector<std::string> EnumerateSourceRootRelativeDirectory(
-    const std::string& relative_path) {
-  char** names = MojoTestSupportEnumerateSourceRootRelativeDirectory(
-      relative_path.c_str());
-  std::vector<std::string> results;
-  for (char** ptr = names; *ptr != nullptr; ++ptr) {
-    results.push_back(*ptr);
-    free(*ptr);
-  }
-  free(names);
-  return results;
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/test_support/lib/test_utils.cc b/mojo/public/cpp/test_support/lib/test_utils.cc
deleted file mode 100644
index 7fe6f02..0000000
--- a/mojo/public/cpp/test_support/lib/test_utils.cc
+++ /dev/null
@@ -1,100 +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.
-
-#include "mojo/public/cpp/test_support/test_utils.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "mojo/public/cpp/test_support/test_support.h"
-
-namespace mojo {
-namespace test {
-
-bool WriteTextMessage(const MessagePipeHandle& handle,
-                      const std::string& text) {
-  MojoResult rv = WriteMessageRaw(handle,
-                                  text.data(),
-                                  static_cast<uint32_t>(text.size()),
-                                  nullptr,
-                                  0,
-                                  MOJO_WRITE_MESSAGE_FLAG_NONE);
-  return rv == MOJO_RESULT_OK;
-}
-
-bool ReadTextMessage(const MessagePipeHandle& handle, std::string* text) {
-  MojoResult rv;
-  bool did_wait = false;
-
-  uint32_t num_bytes = 0, num_handles = 0;
-  for (;;) {
-    rv = ReadMessageRaw(handle,
-                        nullptr,
-                        &num_bytes,
-                        nullptr,
-                        &num_handles,
-                        MOJO_READ_MESSAGE_FLAG_NONE);
-    if (rv == MOJO_RESULT_SHOULD_WAIT) {
-      if (did_wait) {
-        assert(false);  // Looping endlessly!?
-        return false;
-      }
-      rv = Wait(handle, MOJO_HANDLE_SIGNAL_READABLE);
-      if (rv != MOJO_RESULT_OK)
-        return false;
-      did_wait = true;
-    } else {
-      assert(!num_handles);
-      break;
-    }
-  }
-
-  text->resize(num_bytes);
-  rv = ReadMessageRaw(handle,
-                      &text->at(0),
-                      &num_bytes,
-                      nullptr,
-                      &num_handles,
-                      MOJO_READ_MESSAGE_FLAG_NONE);
-  return rv == MOJO_RESULT_OK;
-}
-
-bool DiscardMessage(const MessagePipeHandle& handle) {
-  MojoResult rv = ReadMessageRaw(handle,
-                                 nullptr,
-                                 nullptr,
-                                 nullptr,
-                                 nullptr,
-                                 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD);
-  return rv == MOJO_RESULT_OK;
-}
-
-void IterateAndReportPerf(const char* test_name,
-                          const char* sub_test_name,
-                          PerfTestSingleIteration single_iteration,
-                          void* closure) {
-  // TODO(vtl): These should be specifiable using command-line flags.
-  static const size_t kGranularity = 100;
-  static const MojoTimeTicks kPerftestTimeMicroseconds = 3 * 1000000;
-
-  const MojoTimeTicks start_time = GetTimeTicksNow();
-  MojoTimeTicks end_time;
-  size_t iterations = 0;
-  do {
-    for (size_t i = 0; i < kGranularity; i++)
-      (*single_iteration)(closure);
-    iterations += kGranularity;
-
-    end_time = GetTimeTicksNow();
-  } while (end_time - start_time < kPerftestTimeMicroseconds);
-
-  MojoTestSupportLogPerfResult(test_name, sub_test_name,
-                               1000000.0 * iterations / (end_time - start_time),
-                               "iterations/second");
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/test_support/test_support.h b/mojo/public/cpp/test_support/test_support.h
deleted file mode 100644
index 9a536e6..0000000
--- a/mojo/public/cpp/test_support/test_support.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_TEST_SUPPORT_TEST_SUPPORT_H_
-#define MOJO_PUBLIC_CPP_TEST_SUPPORT_TEST_SUPPORT_H_
-
-#include <string>
-#include <vector>
-
-#include "mojo/public/c/test_support/test_support.h"
-
-namespace mojo {
-namespace test {
-
-inline void LogPerfResult(const char* test_name,
-                          const char* sub_test_name,
-                          double value,
-                          const char* units) {
-  MojoTestSupportLogPerfResult(test_name, sub_test_name, value, units);
-}
-
-// Opens text file relative to the source root for reading.
-inline FILE* OpenSourceRootRelativeFile(const std::string& relative_path) {
-  return MojoTestSupportOpenSourceRootRelativeFile(relative_path.c_str());
-}
-
-// Returns the list of regular files in a directory relative to the source root.
-std::vector<std::string> EnumerateSourceRootRelativeDirectory(
-    const std::string& relative_path);
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_TEST_SUPPORT_TEST_SUPPORT_H_
diff --git a/mojo/public/cpp/test_support/test_utils.h b/mojo/public/cpp/test_support/test_utils.h
deleted file mode 100644
index 6fd5a9e..0000000
--- a/mojo/public/cpp/test_support/test_utils.h
+++ /dev/null
@@ -1,40 +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.
-
-#ifndef MOJO_PUBLIC_CPP_TEST_SUPPORT_TEST_UTILS_H_
-#define MOJO_PUBLIC_CPP_TEST_SUPPORT_TEST_UTILS_H_
-
-#include <string>
-
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-namespace test {
-
-// Writes a message to |handle| with message data |text|. Returns true on
-// success.
-bool WriteTextMessage(const MessagePipeHandle& handle, const std::string& text);
-
-// Reads a message from |handle|, putting its contents into |*text|. Returns
-// true on success. (This blocks if necessary and will call |MojoReadMessage()|
-// multiple times, e.g., to query the size of the message.)
-bool ReadTextMessage(const MessagePipeHandle& handle, std::string* text);
-
-// Discards a message from |handle|. Returns true on success. (This does not
-// block. It will fail if no message is available to discard.)
-bool DiscardMessage(const MessagePipeHandle& handle);
-
-// Run |single_iteration| an appropriate number of times and report its
-// performance appropriately. (This actually runs |single_iteration| for a fixed
-// amount of time and reports the number of iterations per unit time.)
-typedef void (*PerfTestSingleIteration)(void* closure);
-void IterateAndReportPerf(const char* test_name,
-                          const char* sub_test_name,
-                          PerfTestSingleIteration single_iteration,
-                          void* closure);
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_TEST_SUPPORT_TEST_UTILS_H_
diff --git a/mojo/public/interfaces/BUILD.gn b/mojo/public/interfaces/BUILD.gn
deleted file mode 100644
index fb11ec2..0000000
--- a/mojo/public/interfaces/BUILD.gn
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2015 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.
-
-group("interfaces") {
-  deps = [
-    "bindings",
-  ]
-}
diff --git a/mojo/public/interfaces/bindings/BUILD.gn b/mojo/public/interfaces/bindings/BUILD.gn
deleted file mode 100644
index c2cadcd..0000000
--- a/mojo/public/interfaces/bindings/BUILD.gn
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2015 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.
-
-import("../../tools/bindings/mojom.gni")
-
-mojom("bindings") {
-  visibility = []
-  sources = [
-    "interface_control_messages.mojom",
-    "pipe_control_messages.mojom",
-  ]
-
-  export_class_attribute = "MOJO_CPP_BINDINGS_EXPORT"
-  export_define = "MOJO_CPP_BINDINGS_IMPLEMENTATION"
-  export_header = "mojo/public/cpp/bindings/bindings_export.h"
-}
-
-# TODO(yzshen): Remove this target and use the one above once
-# |use_new_js_bindings| becomes true by default.
-mojom("new_bindings") {
-  visibility = []
-  sources = [
-    "new_bindings/interface_control_messages.mojom",
-    "new_bindings/pipe_control_messages.mojom",
-  ]
-
-  use_new_js_bindings = true
-}
diff --git a/mojo/public/interfaces/bindings/interface_control_messages.mojom b/mojo/public/interfaces/bindings/interface_control_messages.mojom
deleted file mode 100644
index 0a19042..0000000
--- a/mojo/public/interfaces/bindings/interface_control_messages.mojom
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2015 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.
-
-[JavaPackage="org.chromium.mojo.bindings.interfacecontrol"]
-module mojo.interface_control;
-
-// For each user-defined interface, some control functions are provided by the
-// interface endpoints at both sides.
-
-////////////////////////////////////////////////////////////////////////////////
-// Run@0xFFFFFFFF(RunInput input) => (RunOutput? output);
-//
-// This control function runs the input command. If the command is not
-// supported, |output| is set to null; otherwise |output| stores the result,
-// whose type depends on the input.
-
-const uint32 kRunMessageId = 0xFFFFFFFF;
-
-struct RunMessageParams {
-  RunInput input;
-};
-union RunInput {
-  QueryVersion query_version;
-  FlushForTesting flush_for_testing;
-};
-
-struct RunResponseMessageParams {
-  RunOutput? output;
-};
-union RunOutput {
-  QueryVersionResult query_version_result;
-};
-
-// Queries the max supported version of the user-defined interface.
-// Sent by the interface client side.
-struct QueryVersion {
-};
-struct QueryVersionResult {
-  uint32 version;
-};
-
-// Sent by either side of the interface.
-struct FlushForTesting {
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// RunOrClosePipe@0xFFFFFFFE(RunOrClosePipeInput input);
-//
-// This control function runs the input command. If the operation fails or the
-// command is not supported, the message pipe is closed.
-
-const uint32 kRunOrClosePipeMessageId = 0xFFFFFFFE;
-
-struct RunOrClosePipeMessageParams {
-  RunOrClosePipeInput input;
-};
-union RunOrClosePipeInput {
-  RequireVersion require_version;
-};
-
-// If the specified version of the user-defined interface is not supported, the
-// function fails and the pipe is closed.
-// Sent by the interface client side.
-struct RequireVersion {
-  uint32 version;
-};
diff --git a/mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom b/mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom
deleted file mode 100644
index e03ffd6..0000000
--- a/mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2015 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.
-
-[JavaPackage="org.chromium.mojo.bindings.interfacecontrol"]
-module mojo.interface_control2;
-
-// For each user-defined interface, some control functions are provided by the
-// interface endpoints at both sides.
-
-////////////////////////////////////////////////////////////////////////////////
-// Run@0xFFFFFFFF(RunInput input) => (RunOutput? output);
-//
-// This control function runs the input command. If the command is not
-// supported, |output| is set to null; otherwise |output| stores the result,
-// whose type depends on the input.
-
-const uint32 kRunMessageId = 0xFFFFFFFF;
-
-struct RunMessageParams {
-  RunInput input;
-};
-union RunInput {
-  QueryVersion query_version;
-  FlushForTesting flush_for_testing;
-};
-
-struct RunResponseMessageParams {
-  RunOutput? output;
-};
-union RunOutput {
-  QueryVersionResult query_version_result;
-};
-
-// Queries the max supported version of the user-defined interface.
-// Sent by the interface client side.
-struct QueryVersion {
-};
-struct QueryVersionResult {
-  uint32 version;
-};
-
-// Sent by either side of the interface.
-struct FlushForTesting {
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// RunOrClosePipe@0xFFFFFFFE(RunOrClosePipeInput input);
-//
-// This control function runs the input command. If the operation fails or the
-// command is not supported, the message pipe is closed.
-
-const uint32 kRunOrClosePipeMessageId = 0xFFFFFFFE;
-
-struct RunOrClosePipeMessageParams {
-  RunOrClosePipeInput input;
-};
-union RunOrClosePipeInput {
-  RequireVersion require_version;
-};
-
-// If the specified version of the user-defined interface is not supported, the
-// function fails and the pipe is closed.
-// Sent by the interface client side.
-struct RequireVersion {
-  uint32 version;
-};
diff --git a/mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom b/mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom
deleted file mode 100644
index 69975fc..0000000
--- a/mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2015 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.
-
-[JavaPackage="org.chromium.mojo.bindings.pipecontrol"]
-module mojo.pipe_control2;
-
-// For each message pipe running user-defined interfaces, some control
-// functions are provided and used by the routers at both ends of the pipe, so
-// that they can coordinate to manage interface endpoints.
-// All these control messages will have the interface ID field in the message
-// header set to invalid.
-
-////////////////////////////////////////////////////////////////////////////////
-// RunOrClosePipe@0xFFFFFFFE(RunOrClosePipeInput input);
-//
-// This control function runs the input command. If the operation fails or the
-// command is not supported, the message pipe is closed.
-
-const uint32 kRunOrClosePipeMessageId = 0xFFFFFFFE;
-
-struct RunOrClosePipeMessageParams {
-  RunOrClosePipeInput input;
-};
-
-union RunOrClosePipeInput {
-  PeerAssociatedEndpointClosedEvent peer_associated_endpoint_closed_event;
-};
-
-// A user-defined reason about why the interface is disconnected.
-struct DisconnectReason {
-  uint32 custom_reason;
-  string description;
-};
-
-// An event to notify that an interface endpoint set up at the message sender
-// side has been closed.
-//
-// This event is omitted if the endpoint belongs to the master interface and
-// there is no disconnect reason specified.
-struct PeerAssociatedEndpointClosedEvent {
-  // The interface ID.
-  uint32 id;
-  DisconnectReason? disconnect_reason;
-};
-
diff --git a/mojo/public/interfaces/bindings/pipe_control_messages.mojom b/mojo/public/interfaces/bindings/pipe_control_messages.mojom
deleted file mode 100644
index 74e9cc7..0000000
--- a/mojo/public/interfaces/bindings/pipe_control_messages.mojom
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2015 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.
-
-[JavaPackage="org.chromium.mojo.bindings.pipecontrol"]
-module mojo.pipe_control;
-
-// For each message pipe running user-defined interfaces, some control
-// functions are provided and used by the routers at both ends of the pipe, so
-// that they can coordinate to manage interface endpoints.
-// All these control messages will have the interface ID field in the message
-// header set to invalid.
-
-////////////////////////////////////////////////////////////////////////////////
-// RunOrClosePipe@0xFFFFFFFE(RunOrClosePipeInput input);
-//
-// This control function runs the input command. If the operation fails or the
-// command is not supported, the message pipe is closed.
-
-const uint32 kRunOrClosePipeMessageId = 0xFFFFFFFE;
-
-struct RunOrClosePipeMessageParams {
-  RunOrClosePipeInput input;
-};
-
-union RunOrClosePipeInput {
-  PeerAssociatedEndpointClosedEvent peer_associated_endpoint_closed_event;
-};
-
-// A user-defined reason about why the interface is disconnected.
-struct DisconnectReason {
-  uint32 custom_reason;
-  string description;
-};
-
-// An event to notify that an interface endpoint set up at the message sender
-// side has been closed.
-//
-// This event is omitted if the endpoint belongs to the master interface and
-// there is no disconnect reason specified.
-struct PeerAssociatedEndpointClosedEvent {
-  // The interface ID.
-  uint32 id;
-  DisconnectReason? disconnect_reason;
-};
-
diff --git a/mojo/public/interfaces/bindings/tests/BUILD.gn b/mojo/public/interfaces/bindings/tests/BUILD.gn
deleted file mode 100644
index e496eb6..0000000
--- a/mojo/public/interfaces/bindings/tests/BUILD.gn
+++ /dev/null
@@ -1,204 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("../../../tools/bindings/mojom.gni")
-
-mojom("test_interfaces") {
-  testonly = true
-  sources = [
-    "math_calculator.mojom",
-    "no_module.mojom",
-    "ping_service.mojom",
-    "rect.mojom",
-    "regression_tests.mojom",
-    "sample_factory.mojom",
-    "sample_interfaces.mojom",
-    "sample_service.mojom",
-    "scoping.mojom",
-    "serialization_test_structs.mojom",
-    "test_bad_messages.mojom",
-    "test_constants.mojom",
-    "test_data_view.mojom",
-    "test_native_types.mojom",
-    "test_structs.mojom",
-    "test_sync_methods.mojom",
-    "test_unions.mojom",
-    "validation_test_interfaces.mojom",
-  ]
-  public_deps = [
-    ":echo",
-    ":test_mojom_import",
-    ":test_mojom_import2",
-  ]
-}
-
-component("test_export_component") {
-  testonly = true
-  deps = [
-    ":test_export",
-  ]
-}
-
-if (!is_ios) {
-  component("test_export_blink_component") {
-    testonly = true
-    deps = [
-      ":test_export_blink",
-    ]
-  }
-}
-
-mojom("test_export") {
-  testonly = true
-  sources = [
-    "test_export.mojom",
-  ]
-  export_class_attribute = "MOJO_TEST_EXPORT"
-  export_define = "MOJO_TEST_IMPLEMENTATION=1"
-  export_header = "mojo/public/cpp/bindings/tests/mojo_test_export.h"
-  if (!is_ios) {
-    export_class_attribute_blink = "MOJO_TEST_BLINK_EXPORT"
-    export_define_blink = "MOJO_TEST_BLINK_IMPLEMENTATION=1"
-    export_header_blink =
-        "mojo/public/cpp/bindings/tests/mojo_test_blink_export.h"
-  }
-  visibility = [ ":test_export_component" ]
-  if (!is_ios) {
-    visibility_blink = [ ":test_export_blink_component" ]
-  }
-}
-
-mojom("test_exported_import") {
-  testonly = true
-  sources = [
-    "test_import.mojom",
-  ]
-  public_deps = [
-    ":test_export",
-  ]
-
-  overridden_deps = [ ":test_export" ]
-  component_deps = [ ":test_export_component" ]
-  if (!is_ios) {
-    overridden_deps_blink = [ ":test_export" ]
-    component_deps_blink = [ ":test_export_blink_component" ]
-  }
-}
-
-# Used to test that it is okay to call mojom::Foo::Serialize()/Deserialize()
-# even if the mojom target is linked into another component.
-#
-# We don't use |test_export_component| for this test because
-# //mojo/public/cpp/bindings/tests depends on both |test_export_component| and
-# |test_exported_import| and therefore actually get the shared cpp sources of
-# test_export.mojom from |test_exported_import|.
-component("test_export_component2") {
-  testonly = true
-  public_deps = [
-    ":test_export2",
-  ]
-}
-
-mojom("test_export2") {
-  testonly = true
-  sources = [
-    "test_export2.mojom",
-  ]
-  export_class_attribute = "MOJO_TEST_EXPORT"
-  export_define = "MOJO_TEST_IMPLEMENTATION=1"
-  export_header = "mojo/public/cpp/bindings/tests/mojo_test_export.h"
-  visibility = [ ":test_export_component2" ]
-}
-
-mojom("test_mojom_import") {
-  testonly = true
-  sources = [
-    "sample_import.mojom",
-  ]
-}
-
-mojom("test_mojom_import_wrapper") {
-  testonly = true
-  public_deps = [
-    ":test_mojom_import",
-  ]
-}
-
-mojom("test_mojom_import_wrapper_wrapper") {
-  testonly = true
-  public_deps = [
-    ":test_mojom_import_wrapper",
-  ]
-}
-
-mojom("test_mojom_import2") {
-  testonly = true
-  sources = [
-    "sample_import2.mojom",
-  ]
-  public_deps = [
-    ":test_mojom_import",
-    ":test_mojom_import_wrapper_wrapper",
-  ]
-}
-
-mojom("test_struct_traits_interfaces") {
-  testonly = true
-  sources = [
-    "struct_with_traits.mojom",
-  ]
-}
-
-mojom("test_associated_interfaces") {
-  # These files are not included in the test_interfaces target because
-  # associated interfaces are not supported by all bindings languages yet.
-  testonly = true
-  sources = [
-    "test_associated_interfaces.mojom",
-    "validation_test_associated_interfaces.mojom",
-  ]
-
-  public_deps = [
-    ":test_interfaces",
-  ]
-}
-
-mojom("versioning_test_service_interfaces") {
-  testonly = true
-  sources = [
-    "versioning_test_service.mojom",
-  ]
-}
-
-mojom("versioning_test_client_interfaces") {
-  testonly = true
-  sources = [
-    "versioning_test_client.mojom",
-  ]
-}
-
-mojom("test_wtf_types") {
-  testonly = true
-
-  sources = [
-    "test_wtf_types.mojom",
-  ]
-}
-
-mojom("test_no_sources") {
-  testonly = true
-
-  public_deps = [
-    ":test_interfaces",
-  ]
-}
-
-mojom("echo") {
-  testonly = true
-  sources = [
-    "echo.mojom",
-    "echo_import.mojom",
-  ]
-  use_new_js_bindings = true
-}
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_good.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_good.data
deleted file mode 100644
index b797fea..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_good.data
+++ /dev/null
@@ -1,26 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[u4]1                  // associated interface pointer: interface ID index
-[u4]1                  // associated interface pointer: version
-[anchr]method0_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]3                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_invalid_interface_id.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_invalid_interface_id.data
deleted file mode 100644
index a36d807..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_invalid_interface_id.data
+++ /dev/null
@@ -1,24 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[u4]1                  // associated interface pointer: interface ID index
-[u4]1                  // associated interface pointer: version
-[anchr]method0_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]2                      // num_elements
-[u4]3
-[u4]0xFFFFFFFF             // Unexpected invalid interface ID.
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_invalid_interface_id.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_invalid_interface_id.expected
deleted file mode 100644
index 420b421..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_invalid_interface_id.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_master_interface_id.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_master_interface_id.data
deleted file mode 100644
index e3fa5bb..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_master_interface_id.data
+++ /dev/null
@@ -1,24 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[u4]1                  // associated interface pointer: interface ID index
-[u4]1                  // associated interface pointer: version
-[anchr]method0_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]2                      // num_elements
-[u4]3
-[u4]0                      // Unexpected master interface ID.
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_master_interface_id.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_master_interface_id.expected
deleted file mode 100644
index 420b421..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_master_interface_id.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_interface_id_index_out_of_range.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_interface_id_index_out_of_range.data
deleted file mode 100644
index f9e6201..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_interface_id_index_out_of_range.data
+++ /dev/null
@@ -1,27 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[u4]1111               // associated interface pointer: The interface ID index
-                       // is out of range.
-[u4]1                  // associated interface pointer: version
-[anchr]method0_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]3                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_interface_id_index_out_of_range.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_interface_id_index_out_of_range.expected
deleted file mode 100644
index 420b421..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_interface_id_index_out_of_range.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_unexpected_invalid_associated_interface.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_unexpected_invalid_associated_interface.data
deleted file mode 100644
index b785ed1..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_unexpected_invalid_associated_interface.data
+++ /dev/null
@@ -1,25 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[u4]0xFFFFFFFF         // associated interface pointer: Unexpected invalid
-                       // interface ID index.
-[u4]1                  // associated interface pointer: version
-[anchr]method0_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]2                      // num_elements
-[u4]3
-[u4]4
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_unexpected_invalid_associated_interface.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_unexpected_invalid_associated_interface.expected
deleted file mode 100644
index d8eda1f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_unexpected_invalid_associated_interface.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_good.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_good.data
deleted file mode 100644
index efa2162..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_good.data
+++ /dev/null
@@ -1,26 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]1                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method1_params  // num_bytes
-[u4]0                  // version
-[u4]1                  // associated interface request: interface ID index
-[u4]0                  // padding
-[anchr]method1_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]3                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_unexpected_invalid_associated_request.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_unexpected_invalid_associated_request.data
deleted file mode 100644
index 5a66aad..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_unexpected_invalid_associated_request.data
+++ /dev/null
@@ -1,27 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]1                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method1_params  // num_bytes
-[u4]0                  // version
-[u4]0xFFFFFFFF         // associated interface request: Unexpected invalid
-                       // interface ID index.
-[u4]0                  // padding
-[anchr]method1_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]3                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_unexpected_invalid_associated_request.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_unexpected_invalid_associated_request.expected
deleted file mode 100644
index d8eda1f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_unexpected_invalid_associated_request.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd2_good.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd2_good.data
deleted file mode 100644
index ab29603..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd2_good.data
+++ /dev/null
@@ -1,18 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]2                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[u8]0                  // payload_interface_ids: This array is a nullable field.
-[anchr]message_header
-
-[anchr]payload
-[dist4]method2_params  // num_bytes
-[u4]0                  // version
-[u4]0xFFFFFFFF         // associated interface pointer: Invalid interface ID
-                       // index.
-[u4]1                  // associated interface pointer: version
-[anchr]method2_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd2_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd2_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd2_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_collided_interface_id_indices.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_collided_interface_id_indices.data
deleted file mode 100644
index 6cb71d3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_collided_interface_id_indices.data
+++ /dev/null
@@ -1,36 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[dist4]associated_interface_array  // num_bytes
-[u4]2                              // num_elements
-[u4]2                              // interface ID index
-[u4]14                             // version
-[u4]2                              // interface ID index: The same value as the
-                                   // one above.
-[u4]18                             // version
-[anchr]associated_interface_array
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]4                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[u4]19
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_collided_interface_id_indices.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_collided_interface_id_indices.expected
deleted file mode 100644
index 420b421..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_collided_interface_id_indices.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_good.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_good.data
deleted file mode 100644
index 13df01e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_good.data
+++ /dev/null
@@ -1,35 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[dist4]associated_interface_array  // num_bytes
-[u4]2                              // num_elements
-[u4]2                              // interface ID index
-[u4]14                             // version
-[u4]3                              // interface ID index
-[u4]18                             // version
-[anchr]associated_interface_array
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]4                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[u4]19
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_unexpected_invalid_associated_interface_in_array.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_unexpected_invalid_associated_interface_in_array.data
deleted file mode 100644
index 2e163be..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_unexpected_invalid_associated_interface_in_array.data
+++ /dev/null
@@ -1,36 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[dist4]associated_interface_array  // num_bytes
-[u4]2                              // num_elements
-[u4]2                              // interface ID index
-[u4]14                             // version
-[u4]0xFFFFFFFF                     // interface ID index: Unexpected invalid
-                                   // value.
-[u4]18                             // version
-[anchr]associated_interface_array
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]4                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[u4]19
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_unexpected_invalid_associated_interface_in_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_unexpected_invalid_associated_interface_in_array.expected
deleted file mode 100644
index d8eda1f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_unexpected_invalid_associated_interface_in_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_wrong_interface_id_index_order.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_wrong_interface_id_index_order.data
deleted file mode 100644
index 4a63003..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_wrong_interface_id_index_order.data
+++ /dev/null
@@ -1,38 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[dist4]associated_interface_array  // num_bytes
-[u4]3                              // num_elements
-[u4]2                              // interface ID index
-[u4]14                             // version
-[u4]3                              // interface ID index
-[u4]0                              // version
-[u4]0                              // interface ID index : It is smaller than
-                                   // the first element above, which is wrong.
-[u4]18                             // version
-[anchr]associated_interface_array
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]4                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[u4]19
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_wrong_interface_id_index_order.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_wrong_interface_id_index_order.expected
deleted file mode 100644
index 420b421..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_wrong_interface_id_index_order.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.data b/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.data
deleted file mode 100644
index 30032a1..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.data
+++ /dev/null
@@ -1,7 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version number
-[u4]0                  // interface ID
-[u4]2                  // There is no Method2
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.expected b/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.expected
deleted file mode 100644
index a32d895..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_empty.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_empty.data
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_empty.data
+++ /dev/null
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_empty.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_empty.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_empty.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.data
deleted file mode 100644
index 68899f4..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.data
+++ /dev/null
@@ -1,2 +0,0 @@
-[u4]24  // num_bytes: Bigger than the total size of the message.
-[u4]0   // version
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct_header.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct_header.data
deleted file mode 100644
index 21e7fbc..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct_header.data
+++ /dev/null
@@ -1 +0,0 @@
-0x00
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct_header.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.data
deleted file mode 100644
index dfb2dd2..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0x80000000         // name
-[u4]3                  // flags: This combination is illegal.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.data
deleted file mode 100644
index 27804a8..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0x80000000         // name
-[u4]1                  // flags: This is a response message which expects to
-                       // have a request ID.
-[u4]0                  // padding
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.expected
deleted file mode 100644
index 083db1a..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.data
deleted file mode 100644
index 6302bae..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.data
+++ /dev/null
@@ -1,7 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version number
-[u4]0                  // interface ID
-[u4]9999               // There is no Method9999.
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.expected
deleted file mode 100644
index a32d895..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.data
deleted file mode 100644
index 2fd0fcd..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.data
+++ /dev/null
@@ -1,6 +0,0 @@
-[u4]0xFFFFFFFF  // num_bytes: Test whether a huge value will cause overflow.
-[u4]0           // version
-[u4]0           // interface ID
-[u4]0x80000000  // name
-[u4]0           // flags
-[u4]0           // padding
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.data
deleted file mode 100644
index f58eca9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.data
+++ /dev/null
@@ -1,4 +0,0 @@
-[dist4]message_header  // num_bytes: Less than the minimal size of message
-                       // header.
-[u4]0                  // version
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_struct_header.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_struct_header.data
deleted file mode 100644
index e98f66f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_struct_header.data
+++ /dev/null
@@ -1,6 +0,0 @@
-[u4]0           // num_bytes
-[u4]0           // version
-[u4]0           // interface ID
-[u4]0x80000000  // name
-[u4]0           // flags
-[u4]0           // padding
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_struct_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_struct_header.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_struct_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.data
deleted file mode 100644
index df9e418..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.data
+++ /dev/null
@@ -1,9 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0x80000000         // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // Extra bytes that result in mismatched |num_bytes| and
-                       // |version|.
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.data
deleted file mode 100644
index e2c574e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.data
+++ /dev/null
@@ -1,10 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0x80000000         // name
-[u4]1                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[u8]0                  // Extra bytes that result in mismatched |num_bytes| and
-                       // |version|.
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_3.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_3.data
deleted file mode 100644
index f7a321b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_3.data
+++ /dev/null
@@ -1,7 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]8                  // version: |num_bytes| is too small for |version|.
-[u4]0                  // interface ID
-[u4]0x80000000         // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_3.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_3.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_3.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.data
deleted file mode 100644
index 841da5e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.data
+++ /dev/null
@@ -1,13 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[f]-1                  // param0
-[u4]0                  // padding
-[anchr]method0_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.data
deleted file mode 100644
index cff6a30..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.data
+++ /dev/null
@@ -1,11 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[u4]16  // num_bytes: Incomplete struct.
-[u4]0   // version
-[f]-1   // param0
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.data
deleted file mode 100644
index 3f03ab2..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.data
+++ /dev/null
@@ -1,9 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[u4]16  // num_bytes: Incomplete struct header.
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.data
deleted file mode 100644
index 7aee806..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]2                  // flags: kMessageIsResponse is set in a request.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.data
deleted file mode 100644
index 5448c5f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.data
+++ /dev/null
@@ -1,9 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]1                  // flags: kMessageExpectsResponse is set in a request
-                       // for a method that does not take a response.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.data
deleted file mode 100644
index 4a3e2fe..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.data
+++ /dev/null
@@ -1,12 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[u4]0xFFFFFFFF  // num_bytes: Test whether a huge value will cause overflow.
-[u4]0           // version
-[f]-1           // param0
-[u4]0           // padding
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.data
deleted file mode 100644
index fa4c555..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.data
+++ /dev/null
@@ -1,11 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes: Less than the minimal size that we expect.
-[u4]0                  // version
-[anchr]method0_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.data
deleted file mode 100644
index d62206e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.data
+++ /dev/null
@@ -1,12 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[u4]4                  // num_bytes: Less than the size of struct header.
-[u4]0                  // version
-[f]-1                  // param0
-[u4]0                  // padding
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.data
deleted file mode 100644
index 5dca2fe..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.data
+++ /dev/null
@@ -1,48 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]10                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method10_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method10_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member   // num_bytes
-[u4]2                     // num_elements
-[dist8]key_string_1
-[dist8]key_string_2
-[anchr]key_array_member
-
-[anchr]key_string_1
-[dist4]key_string_1_member  // num_bytes
-[u4]5                       // num_elements
-0 1 2 3 4
-[anchr]key_string_1_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]key_string_2
-[dist4]key_string_2_member  // num_bytes
-[u4]5                       // num_elements
-5 6 7 8 9
-[anchr]key_string_2_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]2                       // num_elements
-1 2
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.data
deleted file mode 100644
index f64fbc3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.data
+++ /dev/null
@@ -1,48 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]10                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method10_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method10_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member   // num_bytes
-[u4]2                     // num_elements
-[dist8]key_string_1
-[dist8]key_string_2
-[anchr]key_array_member
-
-[anchr]key_string_1
-[dist4]key_string_1_member  // num_bytes
-[u4]5                       // num_elements
-0 1 2 3 4
-[anchr]key_string_1_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]key_string_2
-[dist4]key_string_2_member  // num_bytes
-[u4]5                       // num_elements
-0 1 2 3 4
-[anchr]key_string_2_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]2                       // num_elements
-1 2
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.data
deleted file mode 100644
index 3a99dc2..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.data
+++ /dev/null
@@ -1,25 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]10                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method10_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method10_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[u8]0                          // null keys array
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]2                       // num_elements
-1 2
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.data
deleted file mode 100644
index 459d806..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.data
+++ /dev/null
@@ -1,40 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]10                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method10_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method10_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[u8]0                          // null values array
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member   // num_bytes
-[u4]2                     // num_elements
-[dist8]key_string_1
-[dist8]key_string_2
-[anchr]key_array_member
-
-[anchr]key_string_1
-[dist4]key_string_1_member  // num_bytes
-[u4]5                       // num_elements
-0 1 2 3 4
-[anchr]key_string_1_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]key_string_2
-[dist4]key_string_2_member  // num_bytes
-[u4]5                       // num_elements
-5 6 7 8 9
-[anchr]key_string_2_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.data
deleted file mode 100644
index 9127a26..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.data
+++ /dev/null
@@ -1,40 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]10                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method10_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method10_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member   // num_bytes
-[u4]2                     // num_elements
-[dist8]key_string_1
-[u8]0                     // one null key
-[anchr]key_array_member
-
-[anchr]key_string_1
-[dist4]key_string_1_member  // num_bytes
-[u4]5                       // num_elements
-0 1 2 3 4
-[anchr]key_string_1_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]2                       // num_elements
-1 2
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.data
deleted file mode 100644
index a2f9038..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.data
+++ /dev/null
@@ -1,48 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]10                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method10_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method10_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member   // num_bytes
-[u4]2                     // num_elements
-[dist8]key_string_1
-[dist8]key_string_2
-[anchr]key_array_member
-
-[anchr]key_string_1
-[dist4]key_string_1_member  // num_bytes
-[u4]5                       // num_elements
-0 1 2 3 4
-[anchr]key_string_1_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]key_string_2
-[dist4]key_string_2_member  // num_bytes
-[u4]5                       // num_elements
-5 6 7 8 9
-[anchr]key_string_2_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]1                       // num_elements
-1                           // unequal size
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.expected
deleted file mode 100644
index 2798d48..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.data
deleted file mode 100644
index 781079b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.data
+++ /dev/null
@@ -1,19 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes
-[u4]0                   // version
-[s4]123                 // i
-[u4]0                   // padding
-[anchr]struct_g
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.data
deleted file mode 100644
index b9ab5bf..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.data
+++ /dev/null
@@ -1,20 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes
-[u4]1                   // version
-[s4]123                 // i
-[u4]0                   // padding
-[u8]0                   // struct_a
-[anchr]struct_g
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.data
deleted file mode 100644
index 7d61446..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.data
+++ /dev/null
@@ -1,20 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes
-[u4]2                   // version
-[s4]123                 // i
-[u4]0                   // padding
-[u8]0                   // struct_a
-[anchr]struct_g
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.data
deleted file mode 100644
index 3c3ee12..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.data
+++ /dev/null
@@ -1,28 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes
-[u4]3                   // version
-[s4]123                 // i
-[b]00000001             // b
-0 0 0                   // padding
-[u8]0                   // struct_a
-[dist8]str_ptr          // str
-[anchr]struct_g
-
-[anchr]str_ptr
-[dist4]string           // num_bytes
-[u4]2                   // num_elements
-0 1
-[anchr]string
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.data
deleted file mode 100644
index 2e9fde6..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.data
+++ /dev/null
@@ -1,30 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes
-[u4]5                   // version: Newer than what the validator knows.
-                        // It is okay that the size is the same as the latest
-                        // version that the validator knows.
-[s4]123                 // i
-[b]00000001             // b
-0 0 0                   // padding
-[u8]0                   // struct_a
-[dist8]str_ptr          // str
-[anchr]struct_g
-
-[anchr]str_ptr
-[dist4]string           // num_bytes
-[u4]2                   // num_elements
-0 1
-[anchr]string
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.data
deleted file mode 100644
index 9a95626..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.data
+++ /dev/null
@@ -1,30 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes
-[u4]5                   // version: Newer than what the validator knows.
-[s4]123                 // i
-[b]00000001             // b
-0 0 0                   // padding
-[u8]0                   // struct_a
-[dist8]str_ptr          // str
-[u8]0                   // unknown contents
-[u8]0                   // unknown contents
-[anchr]struct_g
-
-[anchr]str_ptr
-[dist4]string           // num_bytes
-[u4]2                   // num_elements
-0 1
-[anchr]string
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.data
deleted file mode 100644
index c2e5a8d..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.data
+++ /dev/null
@@ -1,21 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes: The size is too big for the version.
-[u4]1                   // version
-[s4]123                 // i
-[u4]0                   // padding
-[u8]0                   // struct_a
-[u8]0                   // Unexpected contents that cause the mismatch.
-[anchr]struct_g
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.data
deleted file mode 100644
index edfe5fa..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.data
+++ /dev/null
@@ -1,19 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes: The size is too small for the version.
-[u4]2                   // version
-[s4]123                 // i
-[u4]0                   // padding
-[anchr]struct_g
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.data
deleted file mode 100644
index 13135ae..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.data
+++ /dev/null
@@ -1,9 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]12                 // name
-[u4]0                  // flags: kMessageExpectsResponse is not set but
-                       // expected.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.data
deleted file mode 100644
index 51973be..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.data
+++ /dev/null
@@ -1,17 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]13                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method13_params // num_bytes
-[u4]0                  // version
-[u4]0xFFFFFFFF         // param0
-[u4]1234
-[u4]65535              // param1
-[u4]0xFFFFFFFF         // param2
-[u4]3242
-[u4]0                  // padding
-[anchr]method13_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.data
deleted file mode 100644
index b739731..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.data
+++ /dev/null
@@ -1,19 +0,0 @@
-[handles]2
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]13                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method13_params // num_bytes
-[u4]0                  // version
-[u4]0                  // param0
-[u4]1234
-[u4]65535              // param1
-[u4]1                  // param2
-[u4]3242
-[u4]0                  // padding
-[anchr]method13_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_known_enum_values.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_known_enum_values.data
deleted file mode 100644
index 1444849..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_known_enum_values.data
+++ /dev/null
@@ -1,13 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]14                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method14_params // num_bytes
-[u4]0                  // version
-[u4]0                  // param0
-[u4]1                  // param1
-[anchr]method14_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_known_enum_values.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_known_enum_values.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_known_enum_values.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_uknown_extensible_enum_value.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_uknown_extensible_enum_value.data
deleted file mode 100644
index 50b9ea3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_uknown_extensible_enum_value.data
+++ /dev/null
@@ -1,13 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]14                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method14_params // num_bytes
-[u4]0                  // version
-[u4]0                  // param0
-[u4]0xFFFFFFFF         // param1: Unknown value is okay for extensible enum.
-[anchr]method14_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_uknown_extensible_enum_value.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_uknown_extensible_enum_value.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_uknown_extensible_enum_value.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_uknown_non_extensible_enum_value.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_uknown_non_extensible_enum_value.data
deleted file mode 100644
index 567f23b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_uknown_non_extensible_enum_value.data
+++ /dev/null
@@ -1,14 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]14                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method14_params // num_bytes
-[u4]0                  // version
-[u4]0xFFFFFFFF         // param0: Unknown value is not allowed for
-                       // non-extensible enum.
-[u4]2                  // param1
-[anchr]method14_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_uknown_non_extensible_enum_value.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_uknown_non_extensible_enum_value.expected
deleted file mode 100644
index 9ef4ce3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_uknown_non_extensible_enum_value.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNKNOWN_ENUM_VALUE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_empy_enum_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_empy_enum_array.data
deleted file mode 100644
index 21af8a3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_empy_enum_array.data
+++ /dev/null
@@ -1,22 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]15                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method15_params // num_bytes
-[u4]0                  // version
-[dist8]enum_array_0    // param0
-[u8]0                  // param1
-[anchr]method15_params
-
-[anchr]enum_array_0
-[dist4]enum_array_0_member  // num_bytes
-[u4]0                       // num_elements
-[anchr]enum_array_0_member
-
-[u8]0x5678                  // This is not part of the array above (which is
-                            // empty), so enum validation shouldn't be done on
-                            // it.
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_empy_enum_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_empy_enum_array.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_empy_enum_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_known_enum_array_values.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_known_enum_array_values.data
deleted file mode 100644
index c418d89..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_known_enum_array_values.data
+++ /dev/null
@@ -1,27 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]15                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method15_params // num_bytes
-[u4]0                  // version
-[dist8]enum_array_0    // param0
-[dist8]enum_array_1    // param1
-[anchr]method15_params
-
-[anchr]enum_array_0
-[dist4]enum_array_0_member  // num_bytes
-[u4]2                       // num_elements
-[u4]0
-[u4]1
-[anchr]enum_array_0_member
-
-[anchr]enum_array_1
-[dist4]enum_array_1_member  // num_bytes
-[u4]2                       // num_elements
-[u4]0
-[u4]1
-[anchr]enum_array_1_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_known_enum_array_values.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_known_enum_array_values.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_known_enum_array_values.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_uknown_extensible_enum_array_value.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_uknown_extensible_enum_array_value.data
deleted file mode 100644
index b6be6d9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_uknown_extensible_enum_array_value.data
+++ /dev/null
@@ -1,20 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]15                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method15_params // num_bytes
-[u4]0                  // version
-[u8]0                  // param0
-[dist8]enum_array_1    // param1
-[anchr]method15_params
-
-[anchr]enum_array_1
-[dist4]enum_array_1_member  // num_bytes
-[u4]2                       // num_elements
-[u4]0
-[u4]0x1234                  // Unknown value is okay for extensible enum.
-[anchr]enum_array_1_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_uknown_extensible_enum_array_value.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_uknown_extensible_enum_array_value.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_uknown_extensible_enum_array_value.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_uknown_non_extensible_enum_array_value.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_uknown_non_extensible_enum_array_value.data
deleted file mode 100644
index 0a46e0a..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_uknown_non_extensible_enum_array_value.data
+++ /dev/null
@@ -1,21 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]15                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method15_params // num_bytes
-[u4]0                  // version
-[dist8]enum_array_0    // param0
-[u8]0                  // param1
-[anchr]method15_params
-
-[anchr]enum_array_0
-[dist4]enum_array_0_member  // num_bytes
-[u4]2                       // num_elements
-[u4]1
-[u4]0x5678                  // Unknown value is not allowed for non-extensible
-                            // enum.
-[anchr]enum_array_0_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_uknown_non_extensible_enum_array_value.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_uknown_non_extensible_enum_array_value.expected
deleted file mode 100644
index 9ef4ce3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_uknown_non_extensible_enum_array_value.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNKNOWN_ENUM_VALUE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_key.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_key.data
deleted file mode 100644
index 0425ea7..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_key.data
+++ /dev/null
@@ -1,34 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]16                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method16_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method16_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member     // num_bytes
-[u4]2                       // num_elements
-[u4]0x5678                  // Unknown value is not allowed for non-extensible
-                            // enum.
-[u4]1
-[anchr]key_array_member
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]2                       // num_elements
-[u4]1
-[u4]2
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_key.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_key.expected
deleted file mode 100644
index 9ef4ce3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_key.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNKNOWN_ENUM_VALUE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_value.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_value.data
deleted file mode 100644
index 2c2ea26..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_value.data
+++ /dev/null
@@ -1,34 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]16                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method16_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method16_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member     // num_bytes
-[u4]2                       // num_elements
-[u4]1
-[u4]2
-[anchr]key_array_member
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]2                       // num_elements
-[u4]0x5678                  // Unknown value is not allowed for non-extensible
-                            // enum.
-[u4]1
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_value.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_value.expected
deleted file mode 100644
index 9ef4ce3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_value.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNKNOWN_ENUM_VALUE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_good.data
deleted file mode 100644
index 48807ab..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_good.data
+++ /dev/null
@@ -1,23 +0,0 @@
-[handles]10  // Larger than the number of handles that we know about is okay.
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]17                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method17_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method17_params
-
-[anchr]param0_ptr
-[dist4]interface_array  // num_bytes
-[u4]2                   // num_elements
-[u4]4                   // handle
-[u4]14                  // version
-[u4]5                   // handle
-[u4]18                  // version
-[anchr]interface_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_interface_handle_out_of_range_in_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_interface_handle_out_of_range_in_array.data
deleted file mode 100644
index e549a10..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_interface_handle_out_of_range_in_array.data
+++ /dev/null
@@ -1,24 +0,0 @@
-[handles]10
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]17                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method17_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method17_params
-
-[anchr]param0_ptr
-[dist4]interface_array  // num_bytes
-[u4]2                   // num_elements
-[u4]4                   // handle
-[u4]14                  // version
-[u4]10                  // handle: It is outside of the valid encoded handle
-                        // range [0, 10)
-[u4]18                  // version
-[anchr]interface_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_interface_handle_out_of_range_in_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_interface_handle_out_of_range_in_array.expected
deleted file mode 100644
index eef8e38..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_interface_handle_out_of_range_in_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_unexpected_invalid_interface_in_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_unexpected_invalid_interface_in_array.data
deleted file mode 100644
index 1ce1d92..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_unexpected_invalid_interface_in_array.data
+++ /dev/null
@@ -1,23 +0,0 @@
-[handles]10
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]17                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method17_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method17_params
-
-[anchr]param0_ptr
-[dist4]interface_array  // num_bytes
-[u4]2                   // num_elements
-[u4]4                   // handle
-[u4]14                  // version
-[u4]0xFFFFFFFF          // handle: An unexpected invalid handle.
-[u4]18                  // version
-[anchr]interface_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_unexpected_invalid_interface_in_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_unexpected_invalid_interface_in_array.expected
deleted file mode 100644
index 6768236..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_unexpected_invalid_interface_in_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd18_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd18_good.data
deleted file mode 100644
index 663796d..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd18_good.data
+++ /dev/null
@@ -1,14 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]18                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method18_params  // num_bytes
-[u4]0                   // version
-[u4]0                   // param0: Size 0 indicating the inlined union is null.
-[u4]0                   // param0: Tag field ignored.
-[u8]0                   // param0: Payload field ignored.
-[anchr]method18_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd18_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd18_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd18_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd19_exceed_recursion_limit.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd19_exceed_recursion_limit.data
deleted file mode 100644
index 96e52d5..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd19_exceed_recursion_limit.data
+++ /dev/null
@@ -1,612 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]19                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method0_params
-
-[anchr]param0_ptr
-[dist4]struct_a1      // num_bytes
-[u4]0                 // version
-[dist8]struct_a2_ptr  // struct_a2
-[anchr]struct_a1
-
-[anchr]struct_a2_ptr
-[dist4]struct_a2      // num_bytes
-[u4]0                 // version
-[dist8]struct_a3_ptr  // struct_a2
-[anchr]struct_a2
-
-[anchr]struct_a3_ptr
-[dist4]struct_a3      // num_bytes
-[u4]0                 // version
-[dist8]struct_a4_ptr  // struct_a3
-[anchr]struct_a3
-
-[anchr]struct_a4_ptr
-[dist4]struct_a4      // num_bytes
-[u4]0                 // version
-[dist8]struct_a5_ptr  // struct_a4
-[anchr]struct_a4
-
-[anchr]struct_a5_ptr
-[dist4]struct_a5      // num_bytes
-[u4]0                 // version
-[dist8]struct_a6_ptr  // struct_a5
-[anchr]struct_a5
-
-[anchr]struct_a6_ptr
-[dist4]struct_a6      // num_bytes
-[u4]0                 // version
-[dist8]struct_a7_ptr  // struct_a6
-[anchr]struct_a6
-
-[anchr]struct_a7_ptr
-[dist4]struct_a7      // num_bytes
-[u4]0                 // version
-[dist8]struct_a8_ptr  // struct_a7
-[anchr]struct_a7
-
-[anchr]struct_a8_ptr
-[dist4]struct_a8      // num_bytes
-[u4]0                 // version
-[dist8]struct_a9_ptr  // struct_a8
-[anchr]struct_a8
-
-[anchr]struct_a9_ptr
-[dist4]struct_a9       // num_bytes
-[u4]0                  // version
-[dist8]struct_a10_ptr  // struct_a9
-[anchr]struct_a9
-
-[anchr]struct_a10_ptr
-[dist4]struct_a10      // num_bytes
-[u4]0                  // version
-[dist8]struct_a11_ptr  // struct_a10
-[anchr]struct_a10
-
-[anchr]struct_a11_ptr
-[dist4]struct_a11      // num_bytes
-[u4]0                  // version
-[dist8]struct_a12_ptr  // struct_a11
-[anchr]struct_a11
-
-[anchr]struct_a12_ptr
-[dist4]struct_a12      // num_bytes
-[u4]0                  // version
-[dist8]struct_a13_ptr  // struct_a12
-[anchr]struct_a12
-
-[anchr]struct_a13_ptr
-[dist4]struct_a13      // num_bytes
-[u4]0                  // version
-[dist8]struct_a14_ptr  // struct_a13
-[anchr]struct_a13
-
-[anchr]struct_a14_ptr
-[dist4]struct_a14      // num_bytes
-[u4]0                  // version
-[dist8]struct_a15_ptr  // struct_a14
-[anchr]struct_a14
-
-[anchr]struct_a15_ptr
-[dist4]struct_a15      // num_bytes
-[u4]0                  // version
-[dist8]struct_a16_ptr  // struct_a15
-[anchr]struct_a15
-
-[anchr]struct_a16_ptr
-[dist4]struct_a16      // num_bytes
-[u4]0                  // version
-[dist8]struct_a17_ptr  // struct_a16
-[anchr]struct_a16
-
-[anchr]struct_a17_ptr
-[dist4]struct_a17      // num_bytes
-[u4]0                  // version
-[dist8]struct_a18_ptr  // struct_a17
-[anchr]struct_a17
-
-[anchr]struct_a18_ptr
-[dist4]struct_a18      // num_bytes
-[u4]0                  // version
-[dist8]struct_a19_ptr  // struct_a18
-[anchr]struct_a18
-
-[anchr]struct_a19_ptr
-[dist4]struct_a19      // num_bytes
-[u4]0                  // version
-[dist8]struct_a20_ptr  // struct_a19
-[anchr]struct_a19
-
-[anchr]struct_a20_ptr
-[dist4]struct_a20      // num_bytes
-[u4]0                  // version
-[dist8]struct_a21_ptr  // struct_a20
-[anchr]struct_a20
-
-[anchr]struct_a21_ptr
-[dist4]struct_a21      // num_bytes
-[u4]0                  // version
-[dist8]struct_a22_ptr  // struct_a21
-[anchr]struct_a21
-
-[anchr]struct_a22_ptr
-[dist4]struct_a22      // num_bytes
-[u4]0                  // version
-[dist8]struct_a23_ptr  // struct_a22
-[anchr]struct_a22
-
-[anchr]struct_a23_ptr
-[dist4]struct_a23      // num_bytes
-[u4]0                  // version
-[dist8]struct_a24_ptr  // struct_a23
-[anchr]struct_a23
-
-[anchr]struct_a24_ptr
-[dist4]struct_a24      // num_bytes
-[u4]0                  // version
-[dist8]struct_a25_ptr  // struct_a24
-[anchr]struct_a24
-
-[anchr]struct_a25_ptr
-[dist4]struct_a25      // num_bytes
-[u4]0                  // version
-[dist8]struct_a26_ptr  // struct_a25
-[anchr]struct_a25
-
-[anchr]struct_a26_ptr
-[dist4]struct_a26      // num_bytes
-[u4]0                  // version
-[dist8]struct_a27_ptr  // struct_a26
-[anchr]struct_a26
-
-[anchr]struct_a27_ptr
-[dist4]struct_a27      // num_bytes
-[u4]0                  // version
-[dist8]struct_a28_ptr  // struct_a27
-[anchr]struct_a27
-
-[anchr]struct_a28_ptr
-[dist4]struct_a28      // num_bytes
-[u4]0                  // version
-[dist8]struct_a29_ptr  // struct_a28
-[anchr]struct_a28
-
-[anchr]struct_a29_ptr
-[dist4]struct_a29      // num_bytes
-[u4]0                  // version
-[dist8]struct_a30_ptr  // struct_a29
-[anchr]struct_a29
-
-[anchr]struct_a30_ptr
-[dist4]struct_a30      // num_bytes
-[u4]0                  // version
-[dist8]struct_a31_ptr  // struct_a30
-[anchr]struct_a30
-
-[anchr]struct_a31_ptr
-[dist4]struct_a31      // num_bytes
-[u4]0                  // version
-[dist8]struct_a32_ptr  // struct_a31
-[anchr]struct_a31
-
-[anchr]struct_a32_ptr
-[dist4]struct_a32      // num_bytes
-[u4]0                  // version
-[dist8]struct_a33_ptr  // struct_a32
-[anchr]struct_a32
-
-[anchr]struct_a33_ptr
-[dist4]struct_a33      // num_bytes
-[u4]0                  // version
-[dist8]struct_a34_ptr  // struct_a33
-[anchr]struct_a33
-
-[anchr]struct_a34_ptr
-[dist4]struct_a34      // num_bytes
-[u4]0                  // version
-[dist8]struct_a35_ptr  // struct_a34
-[anchr]struct_a34
-
-[anchr]struct_a35_ptr
-[dist4]struct_a35      // num_bytes
-[u4]0                  // version
-[dist8]struct_a36_ptr  // struct_a35
-[anchr]struct_a35
-
-[anchr]struct_a36_ptr
-[dist4]struct_a36      // num_bytes
-[u4]0                  // version
-[dist8]struct_a37_ptr  // struct_a36
-[anchr]struct_a36
-
-[anchr]struct_a37_ptr
-[dist4]struct_a37      // num_bytes
-[u4]0                  // version
-[dist8]struct_a38_ptr  // struct_a37
-[anchr]struct_a37
-
-[anchr]struct_a38_ptr
-[dist4]struct_a38      // num_bytes
-[u4]0                  // version
-[dist8]struct_a39_ptr  // struct_a38
-[anchr]struct_a38
-
-[anchr]struct_a39_ptr
-[dist4]struct_a39      // num_bytes
-[u4]0                  // version
-[dist8]struct_a40_ptr  // struct_a39
-[anchr]struct_a39
-
-[anchr]struct_a40_ptr
-[dist4]struct_a40      // num_bytes
-[u4]0                  // version
-[dist8]struct_a41_ptr  // struct_a40
-[anchr]struct_a40
-
-[anchr]struct_a41_ptr
-[dist4]struct_a41      // num_bytes
-[u4]0                  // version
-[dist8]struct_a42_ptr  // struct_a41
-[anchr]struct_a41
-
-[anchr]struct_a42_ptr
-[dist4]struct_a42      // num_bytes
-[u4]0                  // version
-[dist8]struct_a43_ptr  // struct_a42
-[anchr]struct_a42
-
-[anchr]struct_a43_ptr
-[dist4]struct_a43      // num_bytes
-[u4]0                  // version
-[dist8]struct_a44_ptr  // struct_a43
-[anchr]struct_a43
-
-[anchr]struct_a44_ptr
-[dist4]struct_a44      // num_bytes
-[u4]0                  // version
-[dist8]struct_a45_ptr  // struct_a44
-[anchr]struct_a44
-
-[anchr]struct_a45_ptr
-[dist4]struct_a45      // num_bytes
-[u4]0                  // version
-[dist8]struct_a46_ptr  // struct_a45
-[anchr]struct_a45
-
-[anchr]struct_a46_ptr
-[dist4]struct_a46      // num_bytes
-[u4]0                  // version
-[dist8]struct_a47_ptr  // struct_a46
-[anchr]struct_a46
-
-[anchr]struct_a47_ptr
-[dist4]struct_a47      // num_bytes
-[u4]0                  // version
-[dist8]struct_a48_ptr  // struct_a47
-[anchr]struct_a47
-
-[anchr]struct_a48_ptr
-[dist4]struct_a48      // num_bytes
-[u4]0                  // version
-[dist8]struct_a49_ptr  // struct_a48
-[anchr]struct_a48
-
-[anchr]struct_a49_ptr
-[dist4]struct_a49      // num_bytes
-[u4]0                  // version
-[dist8]struct_a50_ptr  // struct_a49
-[anchr]struct_a49
-
-[anchr]struct_a50_ptr
-[dist4]struct_a50      // num_bytes
-[u4]0                  // version
-[dist8]struct_a51_ptr  // struct_a50
-[anchr]struct_a50
-
-[anchr]struct_a51_ptr
-[dist4]struct_a51      // num_bytes
-[u4]0                  // version
-[dist8]struct_a52_ptr  // struct_a51
-[anchr]struct_a51
-
-[anchr]struct_a52_ptr
-[dist4]struct_a52      // num_bytes
-[u4]0                  // version
-[dist8]struct_a53_ptr  // struct_a52
-[anchr]struct_a52
-
-[anchr]struct_a53_ptr
-[dist4]struct_a53      // num_bytes
-[u4]0                  // version
-[dist8]struct_a54_ptr  // struct_a53
-[anchr]struct_a53
-
-[anchr]struct_a54_ptr
-[dist4]struct_a54      // num_bytes
-[u4]0                  // version
-[dist8]struct_a55_ptr  // struct_a54
-[anchr]struct_a54
-
-[anchr]struct_a55_ptr
-[dist4]struct_a55      // num_bytes
-[u4]0                  // version
-[dist8]struct_a56_ptr  // struct_a55
-[anchr]struct_a55
-
-[anchr]struct_a56_ptr
-[dist4]struct_a56      // num_bytes
-[u4]0                  // version
-[dist8]struct_a57_ptr  // struct_a56
-[anchr]struct_a56
-
-[anchr]struct_a57_ptr
-[dist4]struct_a57      // num_bytes
-[u4]0                  // version
-[dist8]struct_a58_ptr  // struct_a57
-[anchr]struct_a57
-
-[anchr]struct_a58_ptr
-[dist4]struct_a58      // num_bytes
-[u4]0                  // version
-[dist8]struct_a59_ptr  // struct_a58
-[anchr]struct_a58
-
-[anchr]struct_a59_ptr
-[dist4]struct_a59      // num_bytes
-[u4]0                  // version
-[dist8]struct_a60_ptr  // struct_a59
-[anchr]struct_a59
-
-[anchr]struct_a60_ptr
-[dist4]struct_a60      // num_bytes
-[u4]0                  // version
-[dist8]struct_a61_ptr  // struct_a60
-[anchr]struct_a60
-
-[anchr]struct_a61_ptr
-[dist4]struct_a61      // num_bytes
-[u4]0                  // version
-[dist8]struct_a62_ptr  // struct_a61
-[anchr]struct_a61
-
-[anchr]struct_a62_ptr
-[dist4]struct_a62      // num_bytes
-[u4]0                  // version
-[dist8]struct_a63_ptr  // struct_a62
-[anchr]struct_a62
-
-[anchr]struct_a63_ptr
-[dist4]struct_a63      // num_bytes
-[u4]0                  // version
-[dist8]struct_a64_ptr  // struct_a63
-[anchr]struct_a63
-
-[anchr]struct_a64_ptr
-[dist4]struct_a64      // num_bytes
-[u4]0                  // version
-[dist8]struct_a65_ptr  // struct_a64
-[anchr]struct_a64
-
-[anchr]struct_a65_ptr
-[dist4]struct_a65      // num_bytes
-[u4]0                  // version
-[dist8]struct_a66_ptr  // struct_a65
-[anchr]struct_a65
-
-[anchr]struct_a66_ptr
-[dist4]struct_a66      // num_bytes
-[u4]0                  // version
-[dist8]struct_a67_ptr  // struct_a66
-[anchr]struct_a66
-
-[anchr]struct_a67_ptr
-[dist4]struct_a67      // num_bytes
-[u4]0                  // version
-[dist8]struct_a68_ptr  // struct_a67
-[anchr]struct_a67
-
-[anchr]struct_a68_ptr
-[dist4]struct_a68      // num_bytes
-[u4]0                  // version
-[dist8]struct_a69_ptr  // struct_a68
-[anchr]struct_a68
-
-[anchr]struct_a69_ptr
-[dist4]struct_a69      // num_bytes
-[u4]0                  // version
-[dist8]struct_a70_ptr  // struct_a69
-[anchr]struct_a69
-
-[anchr]struct_a70_ptr
-[dist4]struct_a70      // num_bytes
-[u4]0                  // version
-[dist8]struct_a71_ptr  // struct_a70
-[anchr]struct_a70
-
-[anchr]struct_a71_ptr
-[dist4]struct_a71      // num_bytes
-[u4]0                  // version
-[dist8]struct_a72_ptr  // struct_a71
-[anchr]struct_a71
-
-[anchr]struct_a72_ptr
-[dist4]struct_a72      // num_bytes
-[u4]0                  // version
-[dist8]struct_a73_ptr  // struct_a72
-[anchr]struct_a72
-
-[anchr]struct_a73_ptr
-[dist4]struct_a73      // num_bytes
-[u4]0                  // version
-[dist8]struct_a74_ptr  // struct_a73
-[anchr]struct_a73
-
-[anchr]struct_a74_ptr
-[dist4]struct_a74      // num_bytes
-[u4]0                  // version
-[dist8]struct_a75_ptr  // struct_a74
-[anchr]struct_a74
-
-[anchr]struct_a75_ptr
-[dist4]struct_a75      // num_bytes
-[u4]0                  // version
-[dist8]struct_a76_ptr  // struct_a75
-[anchr]struct_a75
-
-[anchr]struct_a76_ptr
-[dist4]struct_a76      // num_bytes
-[u4]0                  // version
-[dist8]struct_a77_ptr  // struct_a76
-[anchr]struct_a76
-
-[anchr]struct_a77_ptr
-[dist4]struct_a77      // num_bytes
-[u4]0                  // version
-[dist8]struct_a78_ptr  // struct_a77
-[anchr]struct_a77
-
-[anchr]struct_a78_ptr
-[dist4]struct_a78      // num_bytes
-[u4]0                  // version
-[dist8]struct_a79_ptr  // struct_a78
-[anchr]struct_a78
-
-[anchr]struct_a79_ptr
-[dist4]struct_a79      // num_bytes
-[u4]0                  // version
-[dist8]struct_a80_ptr  // struct_a79
-[anchr]struct_a79
-
-[anchr]struct_a80_ptr
-[dist4]struct_a80      // num_bytes
-[u4]0                  // version
-[dist8]struct_a81_ptr  // struct_a80
-[anchr]struct_a80
-
-[anchr]struct_a81_ptr
-[dist4]struct_a81      // num_bytes
-[u4]0                  // version
-[dist8]struct_a82_ptr  // struct_a81
-[anchr]struct_a81
-
-[anchr]struct_a82_ptr
-[dist4]struct_a82      // num_bytes
-[u4]0                  // version
-[dist8]struct_a83_ptr  // struct_a82
-[anchr]struct_a82
-
-[anchr]struct_a83_ptr
-[dist4]struct_a83      // num_bytes
-[u4]0                  // version
-[dist8]struct_a84_ptr  // struct_a83
-[anchr]struct_a83
-
-[anchr]struct_a84_ptr
-[dist4]struct_a84      // num_bytes
-[u4]0                  // version
-[dist8]struct_a85_ptr  // struct_a84
-[anchr]struct_a84
-
-[anchr]struct_a85_ptr
-[dist4]struct_a85      // num_bytes
-[u4]0                  // version
-[dist8]struct_a86_ptr  // struct_a85
-[anchr]struct_a85
-
-[anchr]struct_a86_ptr
-[dist4]struct_a86      // num_bytes
-[u4]0                  // version
-[dist8]struct_a87_ptr  // struct_a86
-[anchr]struct_a86
-
-[anchr]struct_a87_ptr
-[dist4]struct_a87      // num_bytes
-[u4]0                  // version
-[dist8]struct_a88_ptr  // struct_a87
-[anchr]struct_a87
-
-[anchr]struct_a88_ptr
-[dist4]struct_a88      // num_bytes
-[u4]0                  // version
-[dist8]struct_a89_ptr  // struct_a88
-[anchr]struct_a88
-
-[anchr]struct_a89_ptr
-[dist4]struct_a89      // num_bytes
-[u4]0                  // version
-[dist8]struct_a90_ptr  // struct_a89
-[anchr]struct_a89
-
-[anchr]struct_a90_ptr
-[dist4]struct_a90      // num_bytes
-[u4]0                  // version
-[dist8]struct_a91_ptr  // struct_a90
-[anchr]struct_a90
-
-[anchr]struct_a91_ptr
-[dist4]struct_a91      // num_bytes
-[u4]0                  // version
-[dist8]struct_a92_ptr  // struct_a91
-[anchr]struct_a91
-
-[anchr]struct_a92_ptr
-[dist4]struct_a92      // num_bytes
-[u4]0                  // version
-[dist8]struct_a93_ptr  // struct_a92
-[anchr]struct_a92
-
-[anchr]struct_a93_ptr
-[dist4]struct_a93      // num_bytes
-[u4]0                  // version
-[dist8]struct_a94_ptr  // struct_a93
-[anchr]struct_a93
-
-[anchr]struct_a94_ptr
-[dist4]struct_a94      // num_bytes
-[u4]0                  // version
-[dist8]struct_a95_ptr  // struct_a94
-[anchr]struct_a94
-
-[anchr]struct_a95_ptr
-[dist4]struct_a95      // num_bytes
-[u4]0                  // version
-[dist8]struct_a96_ptr  // struct_a95
-[anchr]struct_a95
-
-[anchr]struct_a96_ptr
-[dist4]struct_a96      // num_bytes
-[u4]0                  // version
-[dist8]struct_a97_ptr  // struct_a96
-[anchr]struct_a96
-
-[anchr]struct_a97_ptr
-[dist4]struct_a97      // num_bytes
-[u4]0                  // version
-[dist8]struct_a98_ptr  // struct_a97
-[anchr]struct_a97
-
-[anchr]struct_a98_ptr
-[dist4]struct_a98      // num_bytes
-[u4]0                  // version
-[dist8]struct_a99_ptr  // struct_a98
-[anchr]struct_a98
-
-[anchr]struct_a99_ptr
-[dist4]struct_a99       // num_bytes
-[u4]0                   // version
-[dist8]struct_a100_ptr  // struct_a99
-[anchr]struct_a99
-
-[anchr]struct_a100_ptr
-[dist4]struct_a100      // num_bytes
-[u4]0                   // version
-[u8]0                   // struct_a100
-[anchr]struct_a100
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd19_exceed_recursion_limit.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd19_exceed_recursion_limit.expected
deleted file mode 100644
index 81d6cd8..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd19_exceed_recursion_limit.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MAX_RECURSION_DEPTH
\ No newline at end of file
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.data
deleted file mode 100644
index b6c201a..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.data
+++ /dev/null
@@ -1,18 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]1                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method1_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method1_params
-
-[anchr]param0_ptr
-[dist4]struct_a  // num_bytes
-[u4]0            // version
-[u8]1234         // i
-[anchr]struct_a
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.data
deleted file mode 100644
index ec39b71..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.data
+++ /dev/null
@@ -1,20 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]1                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method1_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method1_params
-
-[u1]0  // Causes the following struct to be misaligned.
-
-[anchr]param0_ptr
-[dist4]struct_a  // num_bytes
-[u4]0            // version
-[u8]1234         // i
-[anchr]struct_a
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.expected
deleted file mode 100644
index acca999..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MISALIGNED_OBJECT
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.data
deleted file mode 100644
index 6d92050..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.data
+++ /dev/null
@@ -1,13 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]1                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method1_params   // num_bytes
-[u4]0                   // version
-[u8]0xFFFFFFFFFFFFFFFF  // param0: Test whether decoding the pointer causes
-                        // overflow.
-[anchr]method1_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.expected
deleted file mode 100644
index 23abb8c..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.data
deleted file mode 100644
index 569733b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.data
+++ /dev/null
@@ -1,12 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]1                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method1_params  // num_bytes
-[u4]0                  // version
-[u8]0                  // param0: An unexpected null pointer.
-[anchr]method1_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd20_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd20_good.data
deleted file mode 100644
index 8ec608b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd20_good.data
+++ /dev/null
@@ -1,57 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]20                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method20_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method20_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member  // num_bytes
-[u4]2                    // num_elements
-[dist8]key_struct_b_1
-[dist8]key_struct_b_2
-[anchr]key_array_member
-
-[anchr]key_struct_b_1
-[dist4]key_struct_b_1_member  // num_bytes
-[u4]0                         // version
-[dist8]key_struct_a_1         // struct_a
-[anchr]key_struct_b_1_member
-
-[anchr]key_struct_a_1
-[dist4]key_struct_a_1_member  // num_bytes
-[u4]0                         // version
-[u8]1234                      // i
-[anchr]key_struct_a_1_member
-
-[anchr]key_struct_b_2
-[dist4]key_struct_b_2_member  // num_bytes
-[u4]0                         // version
-[dist8]key_struct_a_2         // struct_a
-[anchr]key_struct_b_2_member
-
-[anchr]key_struct_a_2
-[dist4]key_struct_a_2_member  // num_bytes
-[u4]0                         // version
-[u8]5678                      // i
-[anchr]key_struct_a_2_member
-
-[anchr]value_array_ptr
-[dist4]value_array_member  // num_bytes
-[u4]2                      // num_elements
-[u1]1
-[u1]2
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd20_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd20_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd20_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd21_empty_extensible_enum_accepts_any_value.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd21_empty_extensible_enum_accepts_any_value.data
deleted file mode 100644
index d3ae88e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd21_empty_extensible_enum_accepts_any_value.data
+++ /dev/null
@@ -1,13 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]21                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method21_params // num_bytes
-[u4]0                  // version
-[u4]7                  // param0. All values are valid for an extensible enum.
-[u4]0                  // padding
-[anchr]method21_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd21_empty_extensible_enum_accepts_any_value.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd21_empty_extensible_enum_accepts_any_value.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd21_empty_extensible_enum_accepts_any_value.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd22_empty_nonextensible_enum_accepts_no_values.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd22_empty_nonextensible_enum_accepts_no_values.data
deleted file mode 100644
index 414785c..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd22_empty_nonextensible_enum_accepts_no_values.data
+++ /dev/null
@@ -1,14 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]22                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method21_params // num_bytes
-[u4]0                  // version
-[u4]0                  // param0. No values are valid for an empty
-                       // non-extensible enum.
-[u4]0                  // padding
-[anchr]method21_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd22_empty_nonextensible_enum_accepts_no_values.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd22_empty_nonextensible_enum_accepts_no_values.expected
deleted file mode 100644
index 9ef4ce3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd22_empty_nonextensible_enum_accepts_no_values.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNKNOWN_ENUM_VALUE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.data
deleted file mode 100644
index 40719f5..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.data
+++ /dev/null
@@ -1,34 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]2                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method2_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method2_params
-
-[anchr]param0_ptr
-[dist4]struct_b     // num_bytes
-[u4]0               // version
-[dist8]struct_a_ptr // struct_a
-[anchr]struct_b
-
-[u8]0  // Having extra bytes in the middle is okay if the following objects are
-       // still properly alignmented.
-
-[anchr]struct_a_ptr
-[dist4]struct_a_member  // num_bytes
-[u4]0                   // version
-[u8]12345               // i
-[anchr]struct_a_member
-
-[anchr]param1_ptr
-[dist4]struct_a_param  // num_bytes
-[u4]0                  // version
-[u8]67890              // i
-[anchr]struct_a_param
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.data
deleted file mode 100644
index ef6525b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.data
+++ /dev/null
@@ -1,27 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]2                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method2_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method2_params
-
-[anchr]param0_ptr
-[dist4]struct_b     // num_bytes
-[u4]0               // version
-[dist8]struct_a_ptr // struct_a
-[anchr]struct_b
-
-// There are two pointers pointing to the same struct.
-[anchr]struct_a_ptr
-[anchr]param1_ptr
-[dist4]struct_a  // num_bytes
-[u4]0            // version
-[u8]12345        // i
-[anchr]struct_a
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.data
deleted file mode 100644
index 58b25a1..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.data
+++ /dev/null
@@ -1,32 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]2                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method2_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method2_params
-
-[anchr]param0_ptr
-[dist4]struct_b     // num_bytes
-[u4]0               // version
-[dist8]struct_a_ptr // struct_a
-[anchr]struct_b
-
-[anchr]struct_a_ptr
-[dist4]struct_a_member  // num_bytes
-[u4]0                   // version
-
-[anchr]param1_ptr
-// The following |num_bytes| and |version| fields are also the |i| field of the
-// previous struct.
-[dist4]struct_a_param   // num_bytes
-[u4]0                   // version
-[anchr]struct_a_member
-[u8]67890               // i
-[anchr]struct_a_param
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.data
deleted file mode 100644
index 3038ed8..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.data
+++ /dev/null
@@ -1,34 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]2                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method2_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method2_params
-
-[anchr]param0_ptr
-[dist4]struct_b     // num_bytes
-[u4]0               // version
-[dist8]struct_a_ptr // struct_a
-[anchr]struct_b
-
-// The following two structs are arranged in wrong order.
-
-[anchr]param1_ptr
-[dist4]struct_a_param  // num_bytes
-[u4]0                  // version
-[u8]67890              // i
-[anchr]struct_a_param
-
-[anchr]struct_a_ptr
-[dist4]struct_a_member  // num_bytes
-[u4]0                   // version
-[u8]12345               // i
-[anchr]struct_a_member
-
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.data
deleted file mode 100644
index 6814636..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.data
+++ /dev/null
@@ -1,18 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[u4]0xFFFFFFFF  // num_bytes: Test whether a huge value will cause overflow.
-[u4]12          // num_elements
-[b]01010101
-[b]00001111
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.data
deleted file mode 100644
index 45021c0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.data
+++ /dev/null
@@ -1,18 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[u4]7   // num_bytes: Less than the size of array header.
-[u4]12  // num_elements
-[b]01010101
-[b]00001111
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.data
deleted file mode 100644
index 3d38702..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.data
+++ /dev/null
@@ -1,20 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[dist4]array  // num_bytes: Less than the size needed (array header + 12 boolean
-              // values).
-[u4]12        // num_elements
-[b]01010101
-[anchr]array
-[b]00001111
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.data
deleted file mode 100644
index 2f9e091..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.data
+++ /dev/null
@@ -1,13 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params   // num_bytes
-[u4]0                   // version
-[u8]0xFFFFFFFFFFFFFFFF  // param0: Test whether decoding the pointer causes
-                        // overflow.
-[anchr]method3_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.expected
deleted file mode 100644
index 23abb8c..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.data
deleted file mode 100644
index ad26763..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.data
+++ /dev/null
@@ -1,19 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[dist4]array  // num_bytes
-[u4]12        // num_elements
-[b]01010101
-[b]00001111
-[anchr]array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.data
deleted file mode 100644
index d773458..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.data
+++ /dev/null
@@ -1,16 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[u4]16  // num_bytes
-[u1]0   // num_elements: Incomplete array.
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.data
deleted file mode 100644
index ca462a5..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.data
+++ /dev/null
@@ -1,15 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[u4]16  // num_bytes: Incomplete array header.
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.data
deleted file mode 100644
index 5adfbba..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.data
+++ /dev/null
@@ -1,21 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[u2]0  // Causes the following array to be misaligned.
-
-[anchr]param0_ptr
-[dist4]array  // num_bytes
-[u4]12        // num_elements
-[b]01010101
-[b]00001111
-[anchr]array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.expected
deleted file mode 100644
index acca999..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MISALIGNED_OBJECT
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.data
deleted file mode 100644
index 0f96c4b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.data
+++ /dev/null
@@ -1,12 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[u8]0                  // param0: An unexpected null pointer.
-[anchr]method3_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.data
deleted file mode 100644
index 84943d2..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.data
+++ /dev/null
@@ -1,34 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]4                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method4_params  // num_bytes: Larger than what we know is okay.
-[u4]3                  // version: Larger than what we know is okay.
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[u8]0                  // unknown
-[anchr]method4_params
-
-[anchr]param0_ptr
-[dist4]struct_c   // num_bytes
-[u4]0             // version
-[dist8]array_ptr  // array
-[anchr]struct_c
-
-[anchr]array_ptr
-[dist4]array_member  // num_bytes
-[u4]3                // num_elements
-0 1 2
-[anchr]array_member
-
-[u4]0 [u1]0  // Padding to make the next array aligned properly.
-
-[anchr]param1_ptr
-[dist4]array_param  // num_bytes
-[u4]10              // num_elements
-0 1 2 3 4 5 6 7 8 9
-[anchr]array_param
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.data
deleted file mode 100644
index 2f84185..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.data
+++ /dev/null
@@ -1,26 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]4                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method4_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method4_params
-
-[anchr]param0_ptr
-[dist4]struct_c   // num_bytes
-[u4]0             // version
-[dist8]array_ptr  // array
-[anchr]struct_c
-
-[anchr]param1_ptr
-[anchr]array_ptr
-[dist4]array_member  // num_bytes
-[u4]3                // num_elements
-0 1 2
-[anchr]array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.data
deleted file mode 100644
index d863e64..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.data
+++ /dev/null
@@ -1,32 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]4                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method4_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method4_params
-
-[anchr]param0_ptr
-[dist4]struct_c   // num_bytes
-[u4]0             // version
-[dist8]array_ptr  // array
-[anchr]struct_c
-
-[anchr]array_ptr
-[dist4]array_member  // num_bytes
-[u4]3                // num_elements
-
-[anchr]param1_ptr
-// The first three bytes of |num_bytes| are also the elements of the previous
-// array.
-[dist4]array_param  // num_bytes
-[u4]10              // num_elements
-0 1 2 3 4 5 6 7 8 9
-[anchr]array_param
-[anchr]array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.data
deleted file mode 100644
index b61423a..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.data
+++ /dev/null
@@ -1,35 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]4                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method4_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method4_params
-
-[anchr]param0_ptr
-[dist4]struct_c   // num_bytes
-[u4]0             // version
-[dist8]array_ptr  // array
-[anchr]struct_c
-
-// The following two arrays are arranged in wrong order.
-
-[anchr]param1_ptr
-[dist4]array_param  // num_bytes
-[u4]10              // num_elements
-0 1 2 3 4 5 6 7 8 9
-[anchr]array_param
-
-[u4]0 [u2]0  // Padding to make the next array aligned properly.
-
-[anchr]array_ptr
-[dist4]array_member  // num_bytes
-[u4]3                // num_elements
-0 1 2
-[anchr]array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.data
deleted file mode 100644
index dcec895..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.data
+++ /dev/null
@@ -1,37 +0,0 @@
-[handles]10  // Larger than the number of handles that we know about is okay.
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]5                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method5_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[u4]4                  // param1
-[u4]0                  // padding
-[anchr]method5_params
-
-[anchr]param0_ptr
-[dist4]struct_e      // num_bytes
-[u4]0                // version
-[dist8]struct_d_ptr  // struct_d
-[u4]3                // data_pipe_consumer
-[u4]0                // padding
-[anchr]struct_e
-
-[anchr]struct_d_ptr
-[dist4]struct_d           // num_bytes
-[u4]0                     // version
-[dist8]message_pipes_ptr  // message_pipes
-[anchr]struct_d
-
-[anchr]message_pipes_ptr
-[dist4]message_pipe_array  // num_bytes
-[u4]2                      // num_elements
-[u4]0
-[u4]1
-[anchr]message_pipe_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.data
deleted file mode 100644
index d4a82ed..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.data
+++ /dev/null
@@ -1,38 +0,0 @@
-[handles]10
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]5                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method5_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[u4]10                 // param1: It is outside of the valid encoded handle
-                       // range [0, 10).
-[u4]0                  // padding
-[anchr]method5_params
-
-[anchr]param0_ptr
-[dist4]struct_e      // num_bytes
-[u4]0                // version
-[dist8]struct_d_ptr  // struct_d
-[u4]3                // data_pipe_consumer
-[u4]0                // padding
-[anchr]struct_e
-
-[anchr]struct_d_ptr
-[dist4]struct_d           // num_bytes
-[u4]0                     // version
-[dist8]message_pipes_ptr  // message_pipes
-[anchr]struct_d
-
-[anchr]message_pipes_ptr
-[dist4]message_pipe_array  // num_bytes
-[u4]2                      // num_elements
-[u4]0
-[u4]1
-[anchr]message_pipe_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.expected
deleted file mode 100644
index eef8e38..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.data
deleted file mode 100644
index 9ee7a48..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.data
+++ /dev/null
@@ -1,37 +0,0 @@
-[handles]10
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]5                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method5_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[u4]4                  // param1
-[u4]0                  // padding
-[anchr]method5_params
-
-[anchr]param0_ptr
-[dist4]struct_e      // num_bytes
-[u4]0                // version
-[dist8]struct_d_ptr  // struct_d
-[u4]4                // data_pipe_consumer: The same value as |param1| above.
-[u4]0                // padding
-[anchr]struct_e
-
-[anchr]struct_d_ptr
-[dist4]struct_d           // num_bytes
-[u4]0                     // version
-[dist8]message_pipes_ptr  // message_pipes
-[anchr]struct_d
-
-[anchr]message_pipes_ptr
-[dist4]message_pipe_array  // num_bytes
-[u4]2                      // num_elements
-[u4]0
-[u4]1
-[anchr]message_pipe_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.expected
deleted file mode 100644
index eef8e38..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.data
deleted file mode 100644
index cb01cae..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.data
+++ /dev/null
@@ -1,37 +0,0 @@
-[handles]10
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]5                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method5_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[u4]4                  // param1
-[u4]0                  // padding
-[anchr]method5_params
-
-[anchr]param0_ptr
-[dist4]struct_e      // num_bytes
-[u4]0                // version
-[dist8]struct_d_ptr  // struct_d
-[u4]3                // data_pipe_consumer
-[u4]0                // padding
-[anchr]struct_e
-
-[anchr]struct_d_ptr
-[dist4]struct_d           // num_bytes
-[u4]0                     // version
-[dist8]message_pipes_ptr  // message_pipes
-[anchr]struct_d
-
-[anchr]message_pipes_ptr
-[dist4]message_pipe_array  // num_bytes
-[u4]2                      // num_elements
-[u4]1                      // The two message pipe handles have the same value.
-[u4]1
-[anchr]message_pipe_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.expected
deleted file mode 100644
index eef8e38..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.data
deleted file mode 100644
index b06ae0a..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.data
+++ /dev/null
@@ -1,36 +0,0 @@
-[handles]5
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]5                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method5_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[u4]4                  // param1
-[u4]0                  // padding
-[anchr]method5_params
-
-[anchr]param0_ptr
-[dist4]struct_e      // num_bytes
-[u4]0                // version
-[dist8]struct_d_ptr  // struct_d
-[s4]-1               // data_pipe_consumer: An unexpected invalid handle.
-[u4]0                // padding
-[anchr]struct_e
-
-[anchr]struct_d_ptr
-[dist4]struct_d           // num_bytes
-[u4]0                     // version
-[dist8]message_pipes_ptr  // message_pipes
-[anchr]struct_d
-
-[anchr]message_pipes_ptr
-[dist4]message_pipe_array  // num_bytes
-[u4]1                      // num_elements
-[u4]2
-[anchr]message_pipe_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.expected
deleted file mode 100644
index 6768236..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.data
deleted file mode 100644
index f641de0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.data
+++ /dev/null
@@ -1,38 +0,0 @@
-[handles]10
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]5                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method5_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[u4]9                  // param1
-[u4]0                  // padding
-[anchr]method5_params
-
-[anchr]param0_ptr
-[dist4]struct_e      // num_bytes
-[u4]0                // version
-[dist8]struct_d_ptr  // struct_d
-[u4]1                // data_pipe_consumer: It is smaller than those handles
-                     // in |message_pipe_array|, which is wrong.
-[u4]0                // padding
-[anchr]struct_e
-
-[anchr]struct_d_ptr
-[dist4]struct_d           // num_bytes
-[u4]0                     // version
-[dist8]message_pipes_ptr  // message_pipes
-[anchr]struct_d
-
-[anchr]message_pipes_ptr
-[dist4]message_pipe_array  // num_bytes
-[u4]2                      // num_elements
-[u4]3
-[u4]4
-[anchr]message_pipe_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.expected
deleted file mode 100644
index eef8e38..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.data
deleted file mode 100644
index fb3f862..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.data
+++ /dev/null
@@ -1,24 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]6                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method6_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method6_params
-
-[anchr]param0_ptr
-[dist4]array_param  // num_bytes
-[u4]1               // num_elements
-[dist8]element_ptr
-[anchr]array_param
-
-[anchr]element_ptr
-[dist4]array_element  // num_bytes
-[u4]10                // num_elements
-0 1 2 3 4 5 6 7 8 9
-[anchr]array_element
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.data
deleted file mode 100644
index c8cacf0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.data
+++ /dev/null
@@ -1,24 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]6                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method6_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method6_params
-
-[anchr]param0_ptr
-[dist4]array_param  // num_bytes
-[u4]1               // num_elements
-[dist8]element_ptr
-[anchr]array_param
-
-[anchr]element_ptr
-[dist4]array_element  // num_bytes: It is insufficient to store 12 elements.
-[u4]12                // num_elements
-0 1 2 3 4 5 6 7 8 9
-[anchr]array_element
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.data
deleted file mode 100644
index c972676..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.data
+++ /dev/null
@@ -1,40 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]7                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method7_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method7_params
-
-[anchr]param0_ptr
-[dist4]struct_f        // num_bytes
-[u4]0                  // version
-[dist8]array_ptr       // fixed_size_array
-[anchr]struct_f
-
-[anchr]array_ptr
-[dist4]array_member    // num_bytes
-[u4]3                  // num_elements
-0 1 2
-[anchr]array_member
-
-[u4]0 [u1]0            // Padding to make the next array aligned properly.
-
-[anchr]param1_ptr
-[dist4]array_param     // num_bytes
-[u4]2                  // num_elements
-[u8]0                  // A null pointer, which is okay.
-[dist8]array_element_ptr
-[anchr]array_param
-
-[anchr]array_element_ptr
-[dist4]array_element   // num_bytes
-[u4]3                  // num_elements
-0 1 2
-[anchr]array_element
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.data
deleted file mode 100644
index 4d25cf2..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.data
+++ /dev/null
@@ -1,26 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]7                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method7_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method7_params
-
-[anchr]param0_ptr
-[dist4]struct_f        // num_bytes
-[u4]0                  // version
-[u8]0                  // fixed_size_array: An unexpected null pointer.
-[anchr]struct_f
-
-[anchr]param1_ptr
-[dist4]array_param     // num_bytes
-[u4]2                  // num_elements
-[u8]0                  // A null pointer, which is okay.
-[u8]0                  // A null pointer, which is okay.
-[anchr]array_param
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.data
deleted file mode 100644
index cee6e14..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.data
+++ /dev/null
@@ -1,34 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]7                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method7_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method7_params
-
-[anchr]param0_ptr
-[dist4]struct_f        // num_bytes
-[u4]0                  // version
-[dist8]array_ptr       // fixed_size_array
-[anchr]struct_f
-
-[anchr]array_ptr
-[dist4]array_member    // num_bytes
-[u4]2                  // num_elements: Too few elements.
-0 1
-[anchr]array_member
-
-[u4]0 [u1]0 [u1]0      // Padding for alignment of next array.
-
-[anchr]param1_ptr
-[dist4]array_param     // num_bytes
-[u4]2                  // num_elements
-[u8]0                  // A null pointer, which is okay.
-[u8]0                  // A null pointer, which is okay.
-[anchr]array_param
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.data
deleted file mode 100644
index 3095a73..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.data
+++ /dev/null
@@ -1,40 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]7                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method7_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method7_params
-
-[anchr]param0_ptr
-[dist4]struct_f        // num_bytes
-[u4]0                  // version
-[dist8]array_ptr       // fixed_size_array
-[anchr]struct_f
-
-[anchr]array_ptr
-[dist4]array_member    // num_bytes
-[u4]3                  // num_elements
-0 1 3
-[anchr]array_member
-
-[u4]0 [u1]0            // Padding for alignment of next array.
-
-[anchr]param1_ptr
-[dist4]array_param     // num_bytes
-[u4]2                  // num_elements
-[dist8]array_element_ptr
-[u8]0                  // A null pointer, which is okay.
-[anchr]array_param
-
-[anchr]array_element_ptr
-[dist4]array_element   // num_bytes
-[u4]4                  // num_elements: Too many elements.
-0 1 2 3
-[anchr]array_element
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.data
deleted file mode 100644
index b19e141..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.data
+++ /dev/null
@@ -1,21 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]8                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method8_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method8_params
-
-[anchr]param0_ptr
-[dist4]array_param  // num_bytes
-[u4]0x20000001      // num_elements: The corresponding array size should be
-                    // 0x20000001 * 8 + 8 = 0x100000010 which is
-                    // 2^32 + 16 (base-10), while |num_bytes| is a 32-bit
-                    // unsigned integer and its value is 16.
-[u8]0
-[anchr]array_param
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.data
deleted file mode 100644
index 08c4bc3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.data
+++ /dev/null
@@ -1,32 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]8                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method8_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method8_params
-
-[anchr]param0_ptr
-[dist4]array_param       // num_bytes
-[u4]3                    // num_elements
-[u8]0                    // A null pointer, which is okay.
-[dist8]nested_array_ptr
-[u8]0                    // A null pointer, which is okay.
-[anchr]array_param
-
-[anchr]nested_array_ptr
-[dist4]nested_array  // num_bytes
-[u4]1                // num_elements
-[dist8]string_ptr
-[anchr]nested_array
-
-[anchr]string_ptr
-[dist4]string  // num_bytes
-[u4]5          // num_elements
-0 1 2 3 4
-[anchr]string
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.data
deleted file mode 100644
index 03f2a10..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.data
+++ /dev/null
@@ -1,12 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]8                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method8_params  // num_bytes
-[u4]0                  // version
-[u8]0                  // param0: An unexpected null pointer.
-[anchr]method8_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.data
deleted file mode 100644
index b1b4462..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.data
+++ /dev/null
@@ -1,33 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]8                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method8_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method8_params
-
-[anchr]param0_ptr
-[dist4]array_param       // num_bytes
-[u4]3                    // num_elements
-[u8]0                    // A null pointer, which is okay.
-[dist8]nested_array_ptr
-[u8]0                    // A null pointer, which is okay.
-[anchr]array_param
-
-[anchr]nested_array_ptr
-[dist4]nested_array  // num_bytes
-[u4]2                // num_elements
-[dist8]string_ptr
-[u8]0                // An unexpected null pointer.
-[anchr]nested_array
-
-[anchr]string_ptr
-[dist4]string  // num_bytes
-[u4]5          // num_elements
-0 1 2 3 4
-[anchr]string
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.data
deleted file mode 100644
index 6ed0009..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.data
+++ /dev/null
@@ -1,36 +0,0 @@
-[handles]4
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]9                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method9_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method9_params
-
-[anchr]param0_ptr
-[dist4]array_param         // num_bytes
-[u4]2                      // num_elements
-[dist8]nested_array_ptr_0
-[dist8]nested_array_ptr_1
-[anchr]array_param
-
-[anchr]nested_array_ptr_0
-[dist4]nested_array_0  // num_bytes
-[u4]2                  // num_elements
-[u4]0
-[s4]-1                 // An invalid handle, which is okay.
-[anchr]nested_array_0
-
-[anchr]nested_array_ptr_1
-[dist4]nested_array_1  // num_bytes
-[u4]3                  // num_elements
-[u4]2
-[s4]-1                 // An invalid handle, which is okay.
-[u4]3
-[anchr]nested_array_1
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.data
deleted file mode 100644
index 90feced..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.data
+++ /dev/null
@@ -1,14 +0,0 @@
-[handles]4
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]9                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method9_params  // num_bytes
-[u4]0                  // version
-[u8]0                  // param0: A null pointer, which is okay.
-[anchr]method9_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.data
deleted file mode 100644
index e87fbcb..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.data
+++ /dev/null
@@ -1,27 +0,0 @@
-[handles]4
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]9                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method9_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method9_params
-
-[anchr]param0_ptr
-[dist4]array_param         // num_bytes
-[u4]2                      // num_elements
-[dist8]nested_array_ptr_0
-[u8]0                      // An unexpected null pointer.
-[anchr]array_param
-
-[anchr]nested_array_ptr_0
-[dist4]nested_array_0  // num_bytes
-[u4]1                  // num_elements
-[u4]0
-[anchr]nested_array_0
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.data b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.data
deleted file mode 100644
index 7da356f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.data
+++ /dev/null
@@ -1,19 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]2                  // flags kMessageIsResponse
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method0_params
-
-[anchr]param0_ptr
-[dist4]uint8_array  // num_bytes
-[u4]1               // num_elements
-[u1]0
-[anchr]uint8_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.data b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.data
deleted file mode 100644
index bdcfc46..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.data
+++ /dev/null
@@ -1,19 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]2                  // flags kMessageIsResponse
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method0_params
-
-[anchr]param0_ptr
-[dist4]uint8_array  // num_bytes
-[u4]2               // num_elements: The size is too small to hold 2 elements.
-[u1]0
-[anchr]uint8_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.data b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.data
deleted file mode 100644
index a1fe69d..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.data
+++ /dev/null
@@ -1,20 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]1                  // flags kMessageExpectsResponse
-[u4]0                  // padding
-[u8]7                  // request_id
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method0_params
-
-[anchr]param0_ptr
-[dist4]basic_struct  // num_bytes
-[u4]0                // version
-[s4]-1               // a
-[u4]0                // padding
-[anchr]basic_struct
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.data b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.data
deleted file mode 100644
index e689adb..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.data
+++ /dev/null
@@ -1,17 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]1                  // flags kMessageExpectsResponse
-[u4]0                  // padding
-[u8]7                  // request_id
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method0_params
-
-[anchr]param0_ptr
-[u4]0  // num_bytes: The struct size is too small.
-[u4]0  // version
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.data b/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.data
deleted file mode 100644
index 7198afa..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0xffffffff         // name
-[u4]3                  // flags: This combination is illegal.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.expected b/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.data b/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.data
deleted file mode 100644
index 7283509..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]1                  // name: Method1 does not have a response message.
-[u4]2                  // flags: kMessageIsResponse
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.expected b/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.expected
deleted file mode 100644
index 65a48b3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD
\ No newline at end of file
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.data b/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.data
deleted file mode 100644
index d1d8d3f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]12                 // name
-[u4]0                  // flags: kMessageIsResponse is not set in a response.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.expected b/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.data b/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.data
deleted file mode 100644
index 091b68c..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]12                 // name
-[u4]1                  // flags: kMessageExpectsResponse is set in a response.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.expected b/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.data b/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.data
deleted file mode 100644
index 0eda287..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]11                 // name: Method11 does not have a response message.
-[u4]2                  // flags: kMessageIsResponse
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.expected b/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.expected
deleted file mode 100644
index 65a48b3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD
\ No newline at end of file
diff --git a/mojo/public/interfaces/bindings/tests/echo.mojom b/mojo/public/interfaces/bindings/tests/echo.mojom
deleted file mode 100644
index 56c6063..0000000
--- a/mojo/public/interfaces/bindings/tests/echo.mojom
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module test.echo.mojom;
-
-import "echo_import.mojom";
-
-interface Echo {
-  EchoPoint(test.echo_import.mojom.Point point)
-      => (test.echo_import.mojom.Point result);
-};
diff --git a/mojo/public/interfaces/bindings/tests/echo_import.mojom b/mojo/public/interfaces/bindings/tests/echo_import.mojom
deleted file mode 100644
index a024ce2..0000000
--- a/mojo/public/interfaces/bindings/tests/echo_import.mojom
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module test.echo_import.mojom;
-
-struct Point {
-  int32 x;
-  int32 y;
-};
diff --git a/mojo/public/interfaces/bindings/tests/math_calculator.mojom b/mojo/public/interfaces/bindings/tests/math_calculator.mojom
deleted file mode 100644
index 7d1b171..0000000
--- a/mojo/public/interfaces/bindings/tests/math_calculator.mojom
+++ /dev/null
@@ -1,12 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.math"]
-module math;
-
-interface Calculator {
-  Clear@0() => (double value@0);
-  Add@1(double value@0) => (double value@0);
-  Multiply@2(double value@0) => (double value@0);
-};
diff --git a/mojo/public/interfaces/bindings/tests/no_module.mojom b/mojo/public/interfaces/bindings/tests/no_module.mojom
deleted file mode 100644
index f380011..0000000
--- a/mojo/public/interfaces/bindings/tests/no_module.mojom
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Entities without module
-
-enum EnumWithoutModule {
-  A
-};
diff --git a/mojo/public/interfaces/bindings/tests/ping_service.mojom b/mojo/public/interfaces/bindings/tests/ping_service.mojom
deleted file mode 100644
index ba6ad3d..0000000
--- a/mojo/public/interfaces/bindings/tests/ping_service.mojom
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2015 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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.ping"]
-module mojo.test;
-
-interface PingService {
-  Ping() => ();
-};
-
-interface EchoService {
-  Echo(string test_data) => (string echo_data);
-};
diff --git a/mojo/public/interfaces/bindings/tests/rect.mojom b/mojo/public/interfaces/bindings/tests/rect.mojom
deleted file mode 100644
index 4ecc4d9..0000000
--- a/mojo/public/interfaces/bindings/tests/rect.mojom
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.test_structs"]
-module mojo.test;
-
-struct Rect {
-  int32 x;
-  int32 y;
-  int32 width;
-  int32 height;
-};
-
-// A copy of Rect that is typemapped differently in the chromium and blink
-// variants.
-struct TypemappedRect {
-  int32 x;
-  int32 y;
-  int32 width;
-  int32 height;
-};
-
-// A copy of Rect that is typemapped to the same custom type in the chromium and
-// blink variants.
-struct SharedTypemappedRect {
-  int32 x;
-  int32 y;
-  int32 width;
-  int32 height;
-};
\ No newline at end of file
diff --git a/mojo/public/interfaces/bindings/tests/regression_tests.mojom b/mojo/public/interfaces/bindings/tests/regression_tests.mojom
deleted file mode 100644
index d87a3ad..0000000
--- a/mojo/public/interfaces/bindings/tests/regression_tests.mojom
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Module containing entities for regression tests of the generator. Entities
-// must never be modified, instead new entity must be added to add new tests.
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.regression_tests"]
-module regression_tests;
-
-interface CheckMethodWithEmptyResponse {
-WithouParameterAndEmptyResponse() => ();
-WithParameterAndEmptyResponse(bool b) => ();
-};
-
-interface CheckNameCollision {
-WithNameCollision(bool message, bool response) => (bool message, bool response);
-};
-
-enum EnumWithReference {
-  k_STEREO_AND_KEYBOARD_MIC = 30,
-  k_MAX = k_STEREO_AND_KEYBOARD_MIC
-};
-
-enum EnumWithLowercase {
-  PlanarF16,
-  PlanarF32
-};
-
-enum EnumWithNumbers {
-  k_2_1 = 4
-};
-
-enum EnumWithK {
-  K = 0
-};
-
-struct Edge {
-  Vertex? v;
-};
-
-struct Vertex {
-  EmptyStruct? e;
-};
-
-struct EmptyStruct {
-};
-
-struct A {
-  B? b;
-};
-
-struct B {
-  A? a;
-};
-
-// Previously, a field or parameter called |handles| would be shadowed by a
-// method parameter in generated C++ bindings code.
-struct HandlesNameCollisionStruct {
-  EmptyStruct handles;
-};
-
-struct HandlesHandleNameCollisionStruct {
-  handle handles;
-};
-
-union HandlesNameCollisionUnion {
-  int32 handles;
-};
-
-struct HandlesUnionNameCollisionStruct {
-  HandlesNameCollisionUnion handles;
-};
-
-interface HandlesNameCollisionInterface {
-  Method(EmptyStruct handles) => (handle handles);
-};
diff --git a/mojo/public/interfaces/bindings/tests/sample_factory.mojom b/mojo/public/interfaces/bindings/tests/sample_factory.mojom
deleted file mode 100644
index ade3bf3..0000000
--- a/mojo/public/interfaces/bindings/tests/sample_factory.mojom
+++ /dev/null
@@ -1,41 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.sample"]
-module sample;
-
-import "sample_import.mojom";
-
-// This sample shows how handles to MessagePipes can be sent as both parameters
-// to methods as well as fields on structs.
-
-struct Request {
-  int32 x;
-  handle<message_pipe>? pipe;
-  array<handle<message_pipe>>? more_pipes;
-
-  // Interfaces can be used as members.
-  imported.ImportedInterface? obj;
-};
-
-struct Response {
-  int32 x;
-  handle<message_pipe>? pipe;
-};
-
-interface NamedObject {
-  SetName(string name);
-  GetName() => (string name);
-};
-
-interface Factory {
-  DoStuff(Request request, handle<message_pipe>? pipe) =>
-      (Response response, string text);
-  DoStuff2(handle<data_pipe_consumer> pipe) => (string text);
-  CreateNamedObject(NamedObject& obj);
-  RequestImportedInterface(
-      imported.ImportedInterface& obj) => (imported.ImportedInterface& obj);
-  TakeImportedInterface(
-      imported.ImportedInterface obj) => (imported.ImportedInterface obj);
-};
diff --git a/mojo/public/interfaces/bindings/tests/sample_import.mojom b/mojo/public/interfaces/bindings/tests/sample_import.mojom
deleted file mode 100644
index d28cb7b..0000000
--- a/mojo/public/interfaces/bindings/tests/sample_import.mojom
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.imported"]
-module imported;
-
-// This sample just defines some types that are imported into
-// sample_service.mojom, to show how import works.
-
-enum Shape {
-  RECTANGLE = 1,
-  CIRCLE,
-  TRIANGLE,
-  LAST = TRIANGLE,
-};
-
-// These enum values should not interfere with those of Shape above.
-enum AnotherShape {
-  RECTANGLE = 10,
-  CIRCLE,
-  TRIANGLE,
-};
-
-enum YetAnotherShape {
-  RECTANGLE = 20,
-  CIRCLE,
-  TRIANGLE,
-};
-
-struct Point {
-  int32 x;
-  int32 y;
-};
-
-interface ImportedInterface {
-  DoSomething();
-};
diff --git a/mojo/public/interfaces/bindings/tests/sample_import2.mojom b/mojo/public/interfaces/bindings/tests/sample_import2.mojom
deleted file mode 100644
index ca4e81c..0000000
--- a/mojo/public/interfaces/bindings/tests/sample_import2.mojom
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.imported"]
-module imported;
-
-import "sample_import.mojom";
-
-// This sample adds more types and constants to the "imported" namespace,
-// to test a bug with importing multiple modules with the same namespace.
-
-enum Color {
-  RED,
-  BLACK,
-};
-
-struct Size {
-  int32 width;
-  int32 height;
-};
-
-struct Thing {
-  imported.Shape shape = RECTANGLE;
-  imported.Color color = Color.BLACK;
-  Point location;
-  Size size;
-};
diff --git a/mojo/public/interfaces/bindings/tests/sample_interfaces.mojom b/mojo/public/interfaces/bindings/tests/sample_interfaces.mojom
deleted file mode 100644
index 5960d75..0000000
--- a/mojo/public/interfaces/bindings/tests/sample_interfaces.mojom
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.sample",
- JavaConstantsClassName="InterfaceConstants",
- Foo = "hello world"]
-module sample;
-
-const uint64 kLong = 4405;
-
-enum Enum {
-  VALUE
-};
-
-interface PingTest {
-  Ping() => ();
-};
-
-interface Provider {
-  EchoString(string a) => (string a);
-  EchoStrings(string a, string b) => (string a, string b);
-  EchoMessagePipeHandle(handle<message_pipe> a) => (handle<message_pipe> a);
-  EchoEnum(Enum a) => (Enum a);
-  EchoInt(int32 a) => (int32 a);
-};
-
-interface IntegerAccessor {
-  GetInteger() => (int64 data, [MinVersion=2] Enum type);
-  [MinVersion=1]
-  SetInteger(int64 data, [MinVersion=3] Enum type);
-};
diff --git a/mojo/public/interfaces/bindings/tests/sample_service.mojom b/mojo/public/interfaces/bindings/tests/sample_service.mojom
deleted file mode 100644
index 761cb91..0000000
--- a/mojo/public/interfaces/bindings/tests/sample_service.mojom
+++ /dev/null
@@ -1,112 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.sample"]
-module sample;
-
-import "sample_import.mojom";
-import "sample_import2.mojom";
-
-const uint8 kTwelve = 12;
-
-struct Bar {
-  enum Type {
-    VERTICAL = 1,
-    HORIZONTAL,
-    BOTH,
-    INVALID
-  };
-  uint8 alpha@0 = 0xff;
-  uint8 beta@1;
-  uint8 gamma@2;
-  Type type@3 = sample.Bar.Type.VERTICAL;
-};
-
-struct Foo {
-  const string kFooby = "Fooby";
-  string name@8 = kFooby;
-  int32 x@0;
-  int32 y@1;
-  bool a@2 = true;
-  bool b@3;
-  bool c@4;
-  Bar? bar@5;
-  array<Bar>? extra_bars@7;
-  array<uint8>? data@6;
-  handle<message_pipe>? source@9;
-  array<handle<data_pipe_consumer>>? input_streams@10;
-  array<handle<data_pipe_producer>>? output_streams@11;
-  array<array<bool>>? array_of_array_of_bools@12;
-  array<array<array<string>>>? multi_array_of_strings@13;
-  array<bool>? array_of_bools@14;
-};
-
-struct DefaultsTest {
-  int8 a0@0 = -12;
-  uint8 a1@1 = sample.kTwelve;
-  int16 a2@2 = 1234;
-  uint16 a3@3 = 34567;
-  int32 a4@4 = 123456;
-  uint32 a5@5 = 3456789012;
-  int64 a6@6 = -111111111111;
-  uint64 a7@7 = 9999999999999999999;
-  int32 a8@8 = 0x12345;
-  int32 a9@9 = -0x12345;
-  int32 a10@10 = +1234;
-  bool a11@11 = true;
-  bool a12@12 = false;
-  float a13@13 = 123.25;
-  double a14@14 = 1234567890.123;
-  double a15@15 = 1E10;
-  double a16@16 = -1.2E+20;
-  double a17@17 = +1.23E-20;
-
-  // TODO(vtl): Add tests for default vs null when those are implemented (for
-  // structs, arrays, and strings).
-  array<uint8> a18@18;
-  string a19@19;
-
-  Bar.Type a20@20 = BOTH;
-  imported.Point a21@21;
-  imported.Thing a22@22 = default;
-
-  uint64 a23@23 = 0xFFFFFFFFFFFFFFFF;
-  int64 a24@24 = 0x123456789;
-  int64 a25@25 = -0x123456789;
-
-  double a26@26 = double.INFINITY;
-  double a27@27 = double.NEGATIVE_INFINITY;
-  double a28@28 = double.NAN;
-  float a29@29 = float.INFINITY;
-  float a30@30 = float.NEGATIVE_INFINITY;
-  float a31@31 = float.NAN;
-};
-
-struct StructWithHoleV1 {
-  int32 v1 = 1;
-  int64 v2 = 2;
-};
-
-struct StructWithHoleV2 {
-  int32 v1 = 1;
-  int64 v2 = 2;
-  int32 v3 = 3;
-};
-
-interface Service {
-  enum BazOptions {
-    REGULAR = 0,
-    EXTRA
-  };
-  const uint8 kFavoriteBaz = 1;
-  Frobinate@0(Foo? foo@0, BazOptions baz@1, Port? port@2) => (int32 result@0);
-  GetPort@1(Port& port @0);
-};
-
-// This interface is referenced above where it is defined. It also refers to
-// itself from a method.
-interface Port {
-  PostMessageToPort@0(string message_text@0, Port port@1);
-};
diff --git a/mojo/public/interfaces/bindings/tests/scoping.mojom b/mojo/public/interfaces/bindings/tests/scoping.mojom
deleted file mode 100644
index 2e9edb1..0000000
--- a/mojo/public/interfaces/bindings/tests/scoping.mojom
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-interface A {
-  GetB(B& b);
-};
-
-interface B {
-  GetC(C& c);
-};
-
-interface C {
-  D();
-};
diff --git a/mojo/public/interfaces/bindings/tests/serialization_test_structs.mojom b/mojo/public/interfaces/bindings/tests/serialization_test_structs.mojom
deleted file mode 100644
index 1239e16..0000000
--- a/mojo/public/interfaces/bindings/tests/serialization_test_structs.mojom
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.mojo"]
-module mojo.test;
-
-struct Struct1 {
-  uint8 i;
-};
-
-struct Struct2 {
-  handle hdl;
-};
-
-struct Struct3 {
-  Struct1 struct_1;
-};
-
-struct Struct4 {
-  array<Struct1> data;
-};
-
-struct Struct5 {
-  array<Struct1, 2> pair;
-};
-
-struct Struct6 {
-  string str;
-};
-
-struct StructOfNullables {
-  handle? hdl;
-  Struct1? struct_1;
-  string? str;
-};
diff --git a/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom b/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom
deleted file mode 100644
index b50409e..0000000
--- a/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-// TODO(yzshen): Rename *WithTraits* types to something more readable.
-
-struct NestedStructWithTraits {
-  int32 value;
-};
-
-enum EnumWithTraits {
-  VALUE_0,
-  VALUE_1
-};
-
-struct StructWithTraits {
-  EnumWithTraits f_enum;
-  bool f_bool;
-  uint32 f_uint32;
-  uint64 f_uint64;
-  string f_string;
-  string f_string2;
-  array<string> f_string_array;
-  array<string> f_string_set;
-  NestedStructWithTraits f_struct;
-  array<NestedStructWithTraits> f_struct_array;
-  map<string, NestedStructWithTraits> f_struct_map;
-};
-
-// Test that this container can be cloned.
-struct StructWithTraitsContainer {
-  StructWithTraits f_struct;
-};
-
-// Maps to a pass-by-value trivial struct.
-struct TrivialStructWithTraits {
-  int32 value;
-};
-
-// Maps to a move-only struct.
-struct MoveOnlyStructWithTraits {
-  handle f_handle;
-};
-
-// The custom type for MoveOnlyStructWithTraits is not clonable. Test that
-// this container can compile as long as Clone() is not used.
-struct MoveOnlyStructWithTraitsContainer {
-  MoveOnlyStructWithTraits f_struct;
-};
-
-struct StructWithTraitsForUniquePtr {
-  int32 f_int32;
-};
-
-union UnionWithTraits {
-  int32 f_int32;
-  NestedStructWithTraits f_struct;
-};
-
-interface TraitsTestService {
-  EchoStructWithTraits(StructWithTraits s) => (StructWithTraits passed);
-
-  EchoTrivialStructWithTraits(TrivialStructWithTraits s) =>
-      (TrivialStructWithTraits passed);
-
-  EchoMoveOnlyStructWithTraits(MoveOnlyStructWithTraits s) =>
-      (MoveOnlyStructWithTraits passed);
-
-  EchoNullableMoveOnlyStructWithTraits(MoveOnlyStructWithTraits? s) =>
-      (MoveOnlyStructWithTraits? passed);
-
-  EchoEnumWithTraits(EnumWithTraits e) => (EnumWithTraits passed);
-
-  EchoStructWithTraitsForUniquePtr(StructWithTraitsForUniquePtr e) => (
-      StructWithTraitsForUniquePtr passed);
-
-  EchoNullableStructWithTraitsForUniquePtr(StructWithTraitsForUniquePtr? e) => (
-      StructWithTraitsForUniquePtr? passed);
-
-  EchoUnionWithTraits(UnionWithTraits u) => (UnionWithTraits passed);
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom b/mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom
deleted file mode 100644
index adc4e7e..0000000
--- a/mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-import "mojo/public/interfaces/bindings/tests/ping_service.mojom";
-
-interface FooInterface {};
-
-struct StructContainsAssociated {
-  associated FooInterface? foo_interface;
-  associated FooInterface& foo_request;
-  array<associated FooInterface> foo_interfaces;
-  array<associated FooInterface&> foo_requests;
-};
-
-union UnionContainsAssociated {
-  associated FooInterface foo_interface;
-  associated FooInterface& foo_request;
-  array<associated FooInterface> foo_interfaces;
-  array<associated FooInterface&> foo_requests;
-};
-
-interface InterfacePassesAssociated {
-  PassFoo(associated FooInterface foo_interface,
-          associated FooInterface& foo_request) =>
-         (associated FooInterface foo_interface,
-          associated FooInterface& foo_request);
-
-  PassStruct(StructContainsAssociated foo_struct) =>
-            (StructContainsAssociated foo_struct);
-
-  PassUnion(UnionContainsAssociated foo_union) =>
-           (UnionContainsAssociated foo_union);
-};
-
-interface IntegerSender {
-  Echo(int32 value) => (int32 value);
-  Send(int32 value);
-};
-
-interface IntegerSenderConnection {
-  GetSender(associated IntegerSender& sender);
-  AsyncGetSender() => (associated IntegerSender sender);
-};
-
-interface AssociatedPingProvider {
-  GetPing(associated PingService& request);
-};
-
-interface AssociatedPingProviderProvider {
-  GetPingProvider(associated AssociatedPingProvider& request);
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_bad_messages.mojom b/mojo/public/interfaces/bindings/tests/test_bad_messages.mojom
deleted file mode 100644
index dcd5947..0000000
--- a/mojo/public/interfaces/bindings/tests/test_bad_messages.mojom
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-interface TestBadMessages {
-  RejectEventually() => ();
-  RequestResponse() => ();
-
-  [Sync] RejectSync() => ();
-  [Sync] RequestResponseSync() => ();
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_constants.mojom b/mojo/public/interfaces/bindings/tests/test_constants.mojom
deleted file mode 100644
index 272e603..0000000
--- a/mojo/public/interfaces/bindings/tests/test_constants.mojom
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2015 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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.test_constants"]
-module mojo.test;
-
-// Integral types.
-const bool kBoolValue = true;
-
-const int8 kInt8Value = -2;
-
-// In the range of (MAX_INT8, MAX_UINT8].
-const uint8 kUint8Value = 128;
-
-// In the range of [MIN_INT16, MIN_INT8).
-const int16 kInt16Value = -233;
-
-// In the range of (MAX_INT16, MAX_UINT16].
-const uint16 kUint16Value = 44204;
-
-// In the range of [MIN_INT32, MIN_INT16).
-const int32 kInt32Value = -44204;
-
-// In the range of (MAX_INT32, MAX_UINT32].
-const uint32 kUint32Value = 4294967295;
-
-// In the range of [MIN_INT64, MIN_INT32).
-const int64 kInt64Value = -9223372036854775807;
-
-// In the range of (MAX_INT64, MAX_UINT64].
-const uint64 kUint64Value = 9999999999999999999;
-
-// Floating point types.
-const double kDoubleValue = 3.14159;
-const double kDoubleInfinity = double.INFINITY;
-const double kDoubleNegativeInfinity = double.NEGATIVE_INFINITY;
-const double kDoubleNaN = double.NAN;
-
-const float kFloatValue = 2.71828;
-const float kFloatInfinity = float.INFINITY;
-const float kFloatNegativeInfinity = float.NEGATIVE_INFINITY;
-const float kFloatNaN = float.NAN;
-
-const string kStringValue = "test string contents";
-
-struct StructWithConstants {
-  const int8 kInt8Value = 5;
-  const float kFloatValue = 765.432;
-  const string kStringValue = "struct test string contents";
-};
-
-interface InterfaceWithConstants {
-  const uint32 kUint32Value = 20100722;
-  const double kDoubleValue = 12.34567;
-  const string kStringValue = "interface test string contents";
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_data_view.mojom b/mojo/public/interfaces/bindings/tests/test_data_view.mojom
deleted file mode 100644
index 1fe8c6a..0000000
--- a/mojo/public/interfaces/bindings/tests/test_data_view.mojom
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test.data_view;
-
-enum TestEnum {
-  VALUE_0,
-  VALUE_1
-};
-
-interface TestInterface {
-  [Sync]
-  Echo(int32 value) => (int32 out_value);
-};
-
-struct NestedStruct {
-  int32 f_int32;
-};
-
-[Native]
-struct TestNativeStruct;
-
-union TestUnion {
-  bool f_bool;
-  int32 f_int32;
-};
-
-struct TestStruct {
-  string f_string;
-  NestedStruct? f_struct;
-  TestNativeStruct? f_native_struct;
-  array<bool> f_bool_array;
-  array<int32> f_int32_array;
-  array<TestEnum> f_enum_array;
-  array<TestInterface> f_interface_array;
-  array<array<int32>> f_nested_array;
-  array<NestedStruct> f_struct_array;
-  array<TestUnion> f_union_array;
-  map<string, int32> f_map;
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_export.mojom b/mojo/public/interfaces/bindings/tests/test_export.mojom
deleted file mode 100644
index 319a15b..0000000
--- a/mojo/public/interfaces/bindings/tests/test_export.mojom
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test.test_export;
-
-struct StringPair {
-  string s1;
-  string s2;
-};
-
-// This is a regression test. On Windows, if we export the generated class *and*
-// not explicitly disallow copy constructor and assign operator, compilation
-// will fail because it tries to use copy constructor of
-// InlinedStructPtr<StringPair>.
-struct StringPairContainer {
-  array<StringPair> pairs;
-};
-
-interface ExportedInterface {};
diff --git a/mojo/public/interfaces/bindings/tests/test_export2.mojom b/mojo/public/interfaces/bindings/tests/test_export2.mojom
deleted file mode 100644
index 011395c..0000000
--- a/mojo/public/interfaces/bindings/tests/test_export2.mojom
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test.test_export2;
-
-struct StringPair {
-  string s1;
-  string s2;
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_import.mojom b/mojo/public/interfaces/bindings/tests/test_import.mojom
deleted file mode 100644
index 42014c6..0000000
--- a/mojo/public/interfaces/bindings/tests/test_import.mojom
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test.test_import;
-
-import "mojo/public/interfaces/bindings/tests/test_export.mojom";
-
-struct ImportingStruct {
-  mojo.test.test_export.StringPair strings;
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_native_types.mojom b/mojo/public/interfaces/bindings/tests/test_native_types.mojom
deleted file mode 100644
index 3df4318..0000000
--- a/mojo/public/interfaces/bindings/tests/test_native_types.mojom
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-import "mojo/public/interfaces/bindings/tests/rect.mojom";
-
-// Used to verify that structs can be declared with no body in mojom.
-
-[Native]
-struct PickledStruct;
-
-[Native]
-enum PickledEnum;
-
-struct PickleContainer {
-  PickledStruct f_struct;
-  PickledEnum f_enum;
-};
-
-interface PicklePasser {
-  PassPickledStruct(PickledStruct pickle) => (PickledStruct passed);
-  PassPickledEnum(PickledEnum pickle) => (PickledEnum passed);
-  PassPickleContainer(PickleContainer container) => (PickleContainer passed);
-  PassPickles(array<PickledStruct> pickles) => (array<PickledStruct> passed);
-  PassPickleArrays(array<array<PickledStruct>> pickle_arrays)
-      => (array<array<PickledStruct>> passed);
-};
-
-// Used to verify support for native serialization of mojom-defined structs
-// using StrucTraits with different variants of the Rect type from rect.mojom.
-
-interface RectService {
-  AddRect(TypemappedRect r);
-  GetLargestRect() => (TypemappedRect largest);
-  PassSharedRect(SharedTypemappedRect r) => (SharedTypemappedRect passed);
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_structs.mojom b/mojo/public/interfaces/bindings/tests/test_structs.mojom
deleted file mode 100644
index 03a0a20..0000000
--- a/mojo/public/interfaces/bindings/tests/test_structs.mojom
+++ /dev/null
@@ -1,414 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.test_structs"]
-module mojo.test;
-
-import "mojo/public/interfaces/bindings/tests/rect.mojom";
-
-struct NamedRegion {
-  string? name;
-  array<Rect>? rects;
-};
-
-struct RectPair {
-  Rect? first;
-  Rect? second;
-};
-
-struct EmptyStruct {
-};
-
-[Native]
-struct UnmappedNativeStruct;
-
-// Used to verify that struct fields which don't specify a default are
-// initialized to: false for bool, 0 for numbers, and null for strings,
-// handles, and structs. The "?" nullable suffix shouldn't have any
-// impact on initial field values.
-
-struct NoDefaultFieldValues {
-  bool f0;
-  int8 f1;
-  uint8 f2;
-  int16 f3;
-  uint16 f4;
-  int32 f5;
-  uint32 f6;
-  int64 f7;
-  uint64 f8;
-  float f9;
-  double f10;
-  string f11;
-  string? f12;
-  handle<message_pipe> f13;
-  handle<data_pipe_consumer> f14;
-  handle<data_pipe_producer> f15;
-  handle<message_pipe>? f16;
-  handle<data_pipe_consumer>? f17;
-  handle<data_pipe_producer>? f18;
-  handle f19;
-  handle? f20;
-  handle<shared_buffer> f21;
-  handle<shared_buffer>? f22;
-  array<string> f23;
-  array<string?> f24;
-  array<string>? f25;
-  array<string?>? f26;
-  EmptyStruct f27;
-  EmptyStruct? f28;
-};
-
-// Used to verify that struct fields with an explicit default value
-// are initialized correctly. The "?" nullable suffix shouldn't have any
-// impact on initial field values.
-
-struct DefaultFieldValues {
-  const string kFoo = "foo";
-  bool f0 = true;
-  int8 f1 = 100;
-  uint8 f2 = 100;
-  int16 f3 = 100;
-  uint16 f4 = 100;
-  int32 f5 = 100;
-  uint32 f6 = 100;
-  int64 f7 = 100;
-  uint64 f8 = 100;
-  float f9 = 100;
-  float f10 = 100.0;
-  double f11 = 100;
-  double f12 = 100.0;
-  string f13 = kFoo;
-  string? f14 = kFoo;
-  Rect f15 = default;
-  Rect? f16 = default;
-};
-
-// Used to verify that the code generated for enum and const values defined
-// within a struct is correct. Assuming that a constant's value can be a literal
-// or another constant and that enum values can either be an integer constant or
-// another value from the same enum type.
-
-struct ScopedConstants {
-  const int32 TEN = 10;
-  const int32 ALSO_TEN = TEN;
-  enum EType {
-    E0,
-    E1,
-    E2 = 10,
-    E3 = E2,
-    E4,
-  };
-  EType f0 = E0; // 0
-  EType f1 = E1; // 1
-  EType f2 = E2; // 10
-  EType f3 = E3; // 10
-  EType f4 = E4; // 11
-  int32 f5 = TEN;
-  int32 f6 = ALSO_TEN;
-};
-
-// Used to verify that all possible Map key field types can be encoded and
-// decoded successfully.
-
-struct MapKeyTypes {
-  // TODO(yzshen): WTF::HashMap doesn't support bool as key.
-  // map<bool, bool> f0;
-  map<int8, int8> f1;
-  map<uint8, uint8> f2;
-  map<int16, int16> f3;
-  map<uint16, uint16> f4;
-  map<int32, int32> f5;
-  map<uint32, uint32> f6;
-  map<int64, int64> f7;
-  map<uint64, uint64> f8;
-  map<float, float> f9;
-  map<double, double> f10;
-  map<string, string> f11;
-  // TODO(tibell): JS/Java don't support struct as key.
-  // map<Rect, Rect> f12;
-};
-
-// Used to verify that various map value types can be encoded and decoded
-// successfully.
-
-struct MapValueTypes {
-  map<string, array<string>> f0;
-  map<string, array<string>?> f1;
-  map<string, array<string?>> f2;
-  map<string, array<string, 2>> f3;
-  map<string, array<array<string, 2>?>> f4;
-  map<string, array<array<string, 2>, 1>> f5;
-  map<string, Rect?> f6;
-  map<string, map<string, string>> f7;
-  map<string, array<map<string, string>>> f8;
-  map<string, handle> f9;
-  map<string, array<handle>> f10;
-  map<string, map<string, handle>> f11;
-};
-
-// Used to verify that various array types can be encoded and decoded
-// successfully.
-
-struct ArrayValueTypes {
-  array<int8> f0;
-  array<int16> f1;
-  array<int32> f2;
-  array<int64> f3;
-  array<float> f4;
-  array<double> f5;
-  array<SomeInterface> f6;
-  array<SomeInterface&> f7;
-};
-
-// Used to verify that various float and double values can be encoded and
-// decoded correctly.
-
-struct FloatNumberValues {
-  const double V0 = double.INFINITY;
-  const double V1 = double.NEGATIVE_INFINITY;
-  const double V2 = double.NAN;
-  const float V3 = float.INFINITY;
-  const float V4 = float.NEGATIVE_INFINITY;
-  const float V5 = float.NAN;
-  const float V6 = 0;
-  const double V7 = 1234567890.123;
-  const double V8 = 1.2E+20;
-  const double V9 = -1.2E+20;
-
-  double f0 = V0;
-  double f1 = V1;
-  double f2 = V2;
-  float f3 = V3;
-  float f4 = V4;
-  float f5 = V5;
-  float f6 = V6;
-  double f7 = V7;
-  double f8 = V8;
-  double f9 = V9;
-};
-
-// Used to verify that various signed integer values can be encoded and
-// decoded correctly.
-
-struct IntegerNumberValues {
-  const int8 V0 = -128; // Minimum
-  const int8 V1 = -1;   // -1
-  const int8 V2 = 0;    // 0
-  const int8 V3 = 42;   // An arbitrary valid value.
-  const int8 V4 = 127;  // Maximum
-
-  const int16 V5 = -32768; // ...
-  const int16 V6 = -1;
-  const int16 V7 = 0;
-  const int16 V8 = 12345;
-  const int16 V9 = 32767;
-
-  const int32 V10 = -2147483648;
-  const int32 V11 = -1;
-  const int32 V12 = 0;
-  const int32 V13 = 1234567890;
-  const int32 V14 = 2147483647;
-
-  // The limits for JavaScript integers are +/- (2^53 - 1).
-  const int64 V15 = -9007199254740991; // Number.MIN_SAFE_INTEGER
-  const int64 V16 = -1;
-  const int64 V17 = 0;
-  const int64 V18 = 1234567890123456;
-  const int64 V19 = 9007199254740991; // Number.MAX_SAFE_INTEGER
-
-  int8 f0 = V0;
-  int8 f1 = V1;
-  int8 f2 = V2;
-  int8 f3 = V3;
-  int8 f4 = V4;
-
-  int16 f5 = V5;
-  int16 f6 = V6;
-  int16 f7 = V7;
-  int16 f8 = V8;
-  int16 f9 = V9;
-
-  int32 f10 = V10;
-  int32 f11 = V11;
-  int32 f12 = V12;
-  int32 f13 = V13;
-  int32 f14 = V14;
-
-  int64 f15 = V15;
-  int64 f16 = V16;
-  int64 f17 = V17;
-  int64 f18 = V18;
-  int64 f19 = V19;
-};
-
-// Used to verify that various unsigned integer values can be encoded and
-// decoded correctly.
-
-struct UnsignedNumberValues {
-  const uint8 V0 = 0;    // Minimum = 0.
-  const uint8 V1 = 42;   // An arbitrary valid value.
-  const uint8 V2 = 0xFF; // Maximum
-
-  const uint16 V3 = 0; // ...
-  const uint16 V4 = 12345;
-  const uint16 V5 = 0xFFFF;
-
-  const uint32 V6 = 0;
-  const uint32 V7 = 1234567890;
-  const uint32 V8 = 0xFFFFFFFF;
-
-  // The limits for JavaScript integers are +/- (2^53 - 1).
-  const uint64 V9 = 0;
-  const uint64 V10 = 1234567890123456;
-  const uint64 V11 = 9007199254740991; // Number.MAX_SAFE_INTEGER
-
-  uint8 f0 = V0;
-  uint8 f1 = V1;
-  uint8 f2 = V2;
-
-  uint16 f3 = V3;
-  uint16 f4 = V4;
-  uint16 f5 = V5;
-
-  uint32 f6 = V6;
-  uint32 f7  = V7;
-  uint32 f8 = V8;
-
-  uint64 f9 = V9;
-  uint64 f10 = V10;
-  uint64 f11 = V11;
-};
-
-// Used to verify that various (packed) boolean array values can be encoded
-// and decoded correctly.
-
-struct BitArrayValues {
-  array<bool, 1> f0;
-  array<bool, 7> f1;
-  array<bool, 9> f2;
-  array<bool> f3;
-  array<array<bool>> f4;
-  array<array<bool>?> f5;
-  array<array<bool, 2>?> f6;
-};
-
-// Used to verify that different versions can be decoded correctly.
-
-struct MultiVersionStruct {
-  [MinVersion=0]
-  int32 f_int32;
-  [MinVersion=1]
-  Rect? f_rect;
-  [MinVersion=3]
-  string? f_string;
-  [MinVersion=5]
-  array<int8>? f_array;
-  [MinVersion=7]
-  handle<message_pipe>? f_message_pipe;
-  [MinVersion=7]
-  bool f_bool;
-  [MinVersion=9]
-  int16 f_int16;
-};
-
-struct MultiVersionStructV0 {
-  [MinVersion=0]
-  int32 f_int32;
-};
-
-struct MultiVersionStructV1 {
-  [MinVersion=0]
-  int32 f_int32;
-  [MinVersion=1]
-  Rect? f_rect;
-};
-
-struct MultiVersionStructV3 {
-  [MinVersion=0]
-  int32 f_int32;
-  [MinVersion=1]
-  Rect? f_rect;
-  [MinVersion=3]
-  string? f_string;
-};
-
-struct MultiVersionStructV5 {
-  [MinVersion=0]
-  int32 f_int32;
-  [MinVersion=1]
-  Rect? f_rect;
-  [MinVersion=3]
-  string? f_string;
-  [MinVersion=5]
-  array<int8>? f_array;
-};
-
-struct MultiVersionStructV7 {
-  [MinVersion=0]
-  int32 f_int32;
-  [MinVersion=1]
-  Rect? f_rect;
-  [MinVersion=3]
-  string? f_string;
-  [MinVersion=5]
-  array<int8>? f_array;
-  [MinVersion=7]
-  handle<message_pipe>? f_message_pipe;
-  [MinVersion=7]
-  bool f_bool;
-};
-
-// A struct where the fields are not sorted by their ordinals.
-struct ReorderedStruct {
-  [MinVersion=2]
-  int32 a@3 = 3;
-  [MinVersion=4]
-  int32 b@6 = 6;
-  [MinVersion=1]
-  int32 c@1 = 1;
-};
-
-// Used to verify that interfaces that are struct members can be defined in the
-// same file.
-
-interface SomeInterface {
-  SomeMethod(RectPair pair) => (RectPair other_pair);
-};
-
-struct ContainsInterface {
-  SomeInterface some_interface;
-};
-
-// Verify that a field can be called |other|.
-
-struct ContainsOther {
-  int32 other;
-};
-
-// Used to verify that structs can contain interface requests.
-
-struct ContainsInterfaceRequest {
-  SomeInterface& request;
-};
-
-// Used to verify that boolean fields are correctly serialized/deserialized.
-
-struct SingleBoolStruct {
-  bool value;
-};
-
-// Used to verify that structs containing typemapped types can be hashed (if the
-// typemapped type itself is hashable).
-
-struct ContainsHashable {
-  TypemappedRect rect;
-};
-
-// Used to test that nested structs can be hashed. The nested struct mustn't be
-// nullable.
-
-struct SimpleNestedStruct {
-  ContainsOther nested;
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_sync_methods.mojom b/mojo/public/interfaces/bindings/tests/test_sync_methods.mojom
deleted file mode 100644
index 3b8cfe6..0000000
--- a/mojo/public/interfaces/bindings/tests/test_sync_methods.mojom
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-interface TestSyncCodeGeneration {
-  [Sync]
-  NoInput() => (int32 result);
-
-  [Sync]
-  NoOutput(int32 value) => ();
-
-  [Sync]
-  NoInOut() => ();
-
-  [Sync]
-  HaveInOut(int32 value1, int32 value2) => (int32 result1, int32 result2);
-};
-
-interface TestSync {
-  [Sync]
-  Ping() => ();
-
-  [Sync]
-  Echo(int32 value) => (int32 result);
-
-  AsyncEcho(int32 value) => (int32 result);
-};
-
-// Test sync method support with associated interfaces.
-interface TestSyncMaster {
-  [Sync]
-  Ping() => ();
-
-  [Sync]
-  Echo(int32 value) => (int32 result);
-
-  AsyncEcho(int32 value) => (int32 result);
-
-  SendInterface(associated TestSync ptr);
-
-  SendRequest(associated TestSync& request);
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_unions.mojom b/mojo/public/interfaces/bindings/tests/test_unions.mojom
deleted file mode 100644
index 41e1ed6..0000000
--- a/mojo/public/interfaces/bindings/tests/test_unions.mojom
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-enum AnEnum {
-  FIRST, SECOND
-};
-
-[Extensible]
-enum AnExtensibleEnum {
-  FIRST, SECOND, THIRD
-};
-
-union PodUnion {
-  int8   f_int8;
-  int8   f_int8_other;
-  uint8  f_uint8;
-  int16  f_int16;
-  uint16 f_uint16;
-  int32  f_int32;
-  uint32 f_uint32;
-  int64  f_int64;
-  uint64 f_uint64;
-  float  f_float;
-  double f_double;
-  bool   f_bool;
-  AnEnum f_enum;
-  AnExtensibleEnum f_extensible_enum;
-};
-
-union ObjectUnion {
-  int8   f_int8;
-  string f_string;
-  DummyStruct f_dummy;
-  DummyStruct? f_nullable;
-  array<int8> f_array_int8;
-  map<string, int8> f_map_int8;
-  PodUnion f_pod_union;
-  // Test that Clone() is defined after SmallStruct is declared.
-  array<SmallStruct> f_small_structs;
-};
-
-union HandleUnion {
-  handle f_handle;
-  handle<message_pipe> f_message_pipe;
-  handle<data_pipe_consumer> f_data_pipe_consumer;
-  handle<data_pipe_producer> f_data_pipe_producer;
-  handle<shared_buffer> f_shared_buffer;
-  SmallCache f_small_cache;
-  SmallCache& f_small_cache_request;
-};
-
-struct WrapperStruct {
-  ObjectUnion? object_union;
-  PodUnion? pod_union;
-  HandleUnion? handle_union;
-};
-
-struct DummyStruct {
-  int8 f_int8;
-};
-
-struct SmallStruct {
-  DummyStruct? dummy_struct;
-  PodUnion? pod_union;
-  array<PodUnion>? pod_union_array;
-  array<PodUnion?>? nullable_pod_union_array;
-  array<DummyStruct>? s_array;
-  map<string, PodUnion>? pod_union_map;
-  map<string, PodUnion?>? nullable_pod_union_map;
-};
-
-struct SmallStructNonNullableUnion {
-  PodUnion pod_union;
-};
-
-struct SmallObjStruct {
-  ObjectUnion obj_union;
-  int8 f_int8;
-};
-
-interface SmallCache {
-  SetIntValue(int64 int_value);
-  GetIntValue() => (int64 int_value);
-};
-
-interface UnionInterface {
-  Echo(PodUnion in_val) => (PodUnion out_val);
-};
-
-struct TryNonNullStruct {
-  DummyStruct? nullable;
-  DummyStruct non_nullable;
-};
-
-union OldUnion {
-  int8 f_int8;
-};
-
-union NewUnion {
-  int8 f_int8;
-  int16 f_int16;
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_wtf_types.mojom b/mojo/public/interfaces/bindings/tests/test_wtf_types.mojom
deleted file mode 100644
index 183f184..0000000
--- a/mojo/public/interfaces/bindings/tests/test_wtf_types.mojom
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-struct TestWTFCodeGeneration {
-  string str;
-  string? nullable_str;
-  array<string> strs;
-  array<string?> nullable_strs;
-  array<array<int32>> arrays;
-  array<bool> bools;
-  array<handle<message_pipe>> handles;
-  map<string, string?> str_map;
-  map<int32, array<int32>> array_map;
-  map<int32, handle<message_pipe>> handle_map;
-  array<map<string, string?>> str_maps;
-};
-
-union TestWTFCodeGeneration2 {
-  string str;
-  array<string> strs;
-  map<string, string?> str_map;
-};
-
-struct TestWTFStruct {
-  enum NestedEnum {
-    E0,
-    E1,
-  };
-  string str;
-  int32 integer;
-};
-
-interface TestWTF {
-  enum NestedEnum {
-    E0,
-    E1,
-  };
-  EchoString(string? str) => (string? str);
-  EchoStringArray(array<string?>? arr) => (array<string?>? arr);
-  EchoStringMap(map<string, string?>? str_map)
-      => (map<string, string?>? str_map);
-};
-
-enum TopLevelEnum {
-  E0,
-  E1,
-};
diff --git a/mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom b/mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom
deleted file mode 100644
index 2fa77ff..0000000
--- a/mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-// Associated interfaces are not supported by all language bindings yet.
-// Eventually these definitions should live in validation_test_interfaces.mojom.
-
-interface InterfaceX {};
-
-interface AssociatedConformanceTestInterface {
-  Method0(associated InterfaceX param0);
-  Method1(associated InterfaceX& param0);
-  Method2(associated InterfaceX? param0);
-  Method3(array<associated InterfaceX> param0);
-};
-
diff --git a/mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom b/mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom
deleted file mode 100644
index ab69045..0000000
--- a/mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.mojo"]
-module mojo.test;
-
-struct StructA {
-  uint64 i;
-};
-
-struct StructB {
-  StructA struct_a;
-};
-
-struct StructC {
-  array<uint8> data;
-};
-
-struct StructD {
-  array<handle<message_pipe>> message_pipes;
-};
-
-struct StructE {
-  StructD struct_d;
-  handle<data_pipe_consumer> data_pipe_consumer;
-};
-
-struct StructF {
-  array<uint8, 3> fixed_size_array;
-};
-
-struct StructG {
-  int32 i;
-  [MinVersion=1]
-  StructA? struct_a;
-  [MinVersion=3]
-  string? str;
-  [MinVersion=3]
-  bool b;
-};
-
-interface InterfaceA {
-};
-
-enum EnumA {
-  ENUM_A_0,
-  ENUM_A_1
-};
-
-[Extensible]
-enum EnumB {
-  ENUM_B_0,
-  ENUM_B_1,
-  ENUM_B_2
-};
-
-// A non-extensible enum with no values is valid, but about as useless as
-// you would expect: it will fail validation for all values.
-enum EmptyEnum {};
-
-[Extensible]
-enum ExtensibleEmptyEnum {};
-
-union UnionA {
-  StructA struct_a;
-  bool b;
-};
-
-// This interface is used for testing bounds-checking in the mojom
-// binding code. If you add a method please update the files
-// ./data/validation/boundscheck_*. If you add a response please update
-// ./data/validation/resp_boundscheck_*.
-interface BoundsCheckTestInterface {
-  Method0(uint8 param0) => (uint8 param0);
-  Method1(uint8 param0);
-};
-
-interface ConformanceTestInterface {
-  Method0(float param0);
-  Method1(StructA param0);
-  Method2(StructB param0, StructA param1);
-  Method3(array<bool> param0);
-  Method4(StructC param0, array<uint8> param1);
-  Method5(StructE param0, handle<data_pipe_producer> param1);
-  Method6(array<array<uint8>> param0);
-  Method7(StructF param0, array<array<uint8, 3>?, 2> param1);
-  Method8(array<array<string>?> param0);
-  Method9(array<array<handle?>>? param0);
-  Method10(map<string, uint8> param0);
-  Method11(StructG param0);
-  Method12(float param0) => (float param0);
-  Method13(InterfaceA? param0, uint32 param1, InterfaceA? param2);
-  Method14(EnumA param0, EnumB param1);
-  Method15(array<EnumA>? param0, array<EnumB>? param1);
-  Method16(map<EnumA, EnumA>? param0);
-  Method17(array<InterfaceA> param0);
-  Method18(UnionA? param0);
-  Method19(Recursive recursive);
-  Method20(map<StructB, uint8> param0);
-  Method21(ExtensibleEmptyEnum param0);
-  Method22(EmptyEnum param0);
-};
-
-struct BasicStruct {
-  int32 a;
-};
-
-interface IntegrationTestInterface {
-  Method0(BasicStruct param0) => (array<uint8> param0);
-};
-
-// An enum generates a enum-value validation function, so we want to test it.
-// E.g., valid enum values for this enum should be:  -3, 0, 1, 10
-enum BasicEnum {
-  A,
-  B,
-  C = A,
-  D = -3,
-  E = 0xA
-};
-
-// The enum validation function should be generated within the scope of this
-// struct.
-struct StructWithEnum {
-  enum EnumWithin {
-    A, B, C, D
-  };
-};
-
-// This is used to test that deeply recursive structures don't blow the stack.
-struct Recursive {
-  Recursive? recursive;
-};
diff --git a/mojo/public/interfaces/bindings/tests/versioning_test_client.mojom b/mojo/public/interfaces/bindings/tests/versioning_test_client.mojom
deleted file mode 100644
index f0136db..0000000
--- a/mojo/public/interfaces/bindings/tests/versioning_test_client.mojom
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test.versioning;
-
-// versioning_test_service.mojom and versioning_test_client.mojom contain
-// different versions of Mojom definitions for a fictitious human resource
-// management system. They are used to test the versioning mechanism.
-
-enum Department {
-  SALES,
-  DEV
-};
-
-struct Employee {
-  uint64 employee_id;
-  string name;
-  Department department;
-};
-
-interface HumanResourceDatabase {
-  AddEmployee(Employee employee) => (bool success);
-
-  QueryEmployee(uint64 id, [MinVersion=1] bool retrieve_finger_print)
-      => (Employee? employee, [MinVersion=1] array<uint8>? finger_print);
-
-  [MinVersion=1]
-  AttachFingerPrint(uint64 id, array<uint8> finger_print)
-      => (bool success);
-
-  [MinVersion=2]
-  ListEmployeeIds() => (array<uint64>? ids);
-};
diff --git a/mojo/public/interfaces/bindings/tests/versioning_test_service.mojom b/mojo/public/interfaces/bindings/tests/versioning_test_service.mojom
deleted file mode 100644
index 59b3832..0000000
--- a/mojo/public/interfaces/bindings/tests/versioning_test_service.mojom
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test.versioning;
-
-// versioning_test_service.mojom and versioning_test_client.mojom contain
-// different versions of Mojom definitions for a fictitious human resource
-// management system. They are used to test the versioning mechanism.
-
-enum Department {
-  SALES,
-  DEV
-};
-
-struct Date {
-  uint16 year;
-  uint8 month;
-  uint8 day;
-};
-
-struct Employee {
-  uint64 employee_id;
-  string name;
-  Department department;
-  [MinVersion=1] Date? birthday;
-};
-
-interface HumanResourceDatabase {
-  AddEmployee(Employee employee) => (bool success);
-
-  QueryEmployee(uint64 id, [MinVersion=1] bool retrieve_finger_print)
-      => (Employee? employee, [MinVersion=1] array<uint8>? finger_print);
-
-  [MinVersion=1]
-  AttachFingerPrint(uint64 id, array<uint8> finger_print)
-      => (bool success);
-};
diff --git a/mojo/public/java/BUILD.gn b/mojo/public/java/BUILD.gn
deleted file mode 100644
index 0780641..0000000
--- a/mojo/public/java/BUILD.gn
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/android/rules.gni")
-
-android_library("system_java") {
-  java_files = [
-    "system/src/org/chromium/mojo/system/Core.java",
-    "system/src/org/chromium/mojo/system/DataPipe.java",
-    "system/src/org/chromium/mojo/system/Flags.java",
-    "system/src/org/chromium/mojo/system/Handle.java",
-    "system/src/org/chromium/mojo/system/InvalidHandle.java",
-    "system/src/org/chromium/mojo/system/MessagePipeHandle.java",
-    "system/src/org/chromium/mojo/system/MojoException.java",
-    "system/src/org/chromium/mojo/system/MojoResult.java",
-    "system/src/org/chromium/mojo/system/Pair.java",
-    "system/src/org/chromium/mojo/system/ResultAnd.java",
-    "system/src/org/chromium/mojo/system/SharedBufferHandle.java",
-    "system/src/org/chromium/mojo/system/UntypedHandle.java",
-    "system/src/org/chromium/mojo/system/RunLoop.java",
-    "system/src/org/chromium/mojo/system/Watcher.java",
-  ]
-}
-
-android_library("bindings_java") {
-  java_files = [
-    "bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceNotSupported.java",
-    "bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceRequestNotSupported.java",
-    "bindings/src/org/chromium/mojo/bindings/AutoCloseableRouter.java",
-    "bindings/src/org/chromium/mojo/bindings/BindingsHelper.java",
-    "bindings/src/org/chromium/mojo/bindings/Callbacks.java",
-    "bindings/src/org/chromium/mojo/bindings/ConnectionErrorHandler.java",
-    "bindings/src/org/chromium/mojo/bindings/Connector.java",
-    "bindings/src/org/chromium/mojo/bindings/DataHeader.java",
-    "bindings/src/org/chromium/mojo/bindings/Decoder.java",
-    "bindings/src/org/chromium/mojo/bindings/DelegatingConnectionErrorHandler.java",
-    "bindings/src/org/chromium/mojo/bindings/DeserializationException.java",
-    "bindings/src/org/chromium/mojo/bindings/Encoder.java",
-    "bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java",
-    "bindings/src/org/chromium/mojo/bindings/HandleOwner.java",
-    "bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java",
-    "bindings/src/org/chromium/mojo/bindings/Interface.java",
-    "bindings/src/org/chromium/mojo/bindings/InterfaceRequest.java",
-    "bindings/src/org/chromium/mojo/bindings/MessageHeader.java",
-    "bindings/src/org/chromium/mojo/bindings/Message.java",
-    "bindings/src/org/chromium/mojo/bindings/MessageReceiver.java",
-    "bindings/src/org/chromium/mojo/bindings/MessageReceiverWithResponder.java",
-    "bindings/src/org/chromium/mojo/bindings/RouterImpl.java",
-    "bindings/src/org/chromium/mojo/bindings/Router.java",
-    "bindings/src/org/chromium/mojo/bindings/SerializationException.java",
-    "bindings/src/org/chromium/mojo/bindings/ServiceMessage.java",
-    "bindings/src/org/chromium/mojo/bindings/SideEffectFreeCloseable.java",
-    "bindings/src/org/chromium/mojo/bindings/Struct.java",
-    "bindings/src/org/chromium/mojo/bindings/Union.java",
-  ]
-
-  deps = [
-    ":system_java",
-    "//base:base_java",
-  ]
-
-  srcjar_deps = [ "../interfaces/bindings:bindings_java_sources" ]
-}
diff --git a/mojo/public/java/bindings/README.md b/mojo/public/java/bindings/README.md
deleted file mode 100644
index 821a230..0000000
--- a/mojo/public/java/bindings/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo Java Bindings API
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-
-This document provides a brief guide to API usage with example code snippets.
-For a detailed API references please consult the class definitions in
-[this directory](https://cs.chromium.org/chromium/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/)
-
-TODO: Make the contents of this document less non-existent.
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceNotSupported.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceNotSupported.java
deleted file mode 100644
index ee8f631..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceNotSupported.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.mojo.bindings;
-
-/**
- * Associated interface is not supported yet.
- */
-public class AssociatedInterfaceNotSupported {
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceRequestNotSupported.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceRequestNotSupported.java
deleted file mode 100644
index 1b07cd1..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceRequestNotSupported.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.mojo.bindings;
-
-/**
- * Associated interface is not supported yet.
- */
-public class AssociatedInterfaceRequestNotSupported {
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AutoCloseableRouter.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AutoCloseableRouter.java
deleted file mode 100644
index 8a83be9..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AutoCloseableRouter.java
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.MessagePipeHandle;
-
-import java.util.concurrent.Executor;
-
-/**
- * Wrapper around {@link Router} that will close the connection when not referenced anymore.
- */
-class AutoCloseableRouter implements Router {
-
-    /**
-     * The underlying router.
-     */
-    private final Router mRouter;
-
-    /**
-     * The executor to close the underlying router.
-     */
-    private final Executor mExecutor;
-
-    /**
-     * Flags to keep track if this router has been correctly closed.
-     */
-    private boolean mClosed;
-
-    /**
-     * Constructor.
-     */
-    public AutoCloseableRouter(Core core, Router router) {
-        mRouter = router;
-        mExecutor = ExecutorFactory.getExecutorForCurrentThread(core);
-    }
-
-    /**
-     * @see Router#setIncomingMessageReceiver(MessageReceiverWithResponder)
-     */
-    @Override
-    public void setIncomingMessageReceiver(MessageReceiverWithResponder incomingMessageReceiver) {
-        mRouter.setIncomingMessageReceiver(incomingMessageReceiver);
-    }
-
-    /**
-     * @see HandleOwner#passHandle()
-     */
-    @Override
-    public MessagePipeHandle passHandle() {
-        return mRouter.passHandle();
-    }
-
-    /**
-     * @see MessageReceiver#accept(Message)
-     */
-    @Override
-    public boolean accept(Message message) {
-        return mRouter.accept(message);
-    }
-
-    /**
-     * @see MessageReceiverWithResponder#acceptWithResponder(Message, MessageReceiver)
-     */
-    @Override
-    public boolean acceptWithResponder(Message message, MessageReceiver responder) {
-        return mRouter.acceptWithResponder(message, responder);
-
-    }
-
-    /**
-     * @see Router#start()
-     */
-    @Override
-    public void start() {
-        mRouter.start();
-    }
-
-    /**
-     * @see Router#setErrorHandler(ConnectionErrorHandler)
-     */
-    @Override
-    public void setErrorHandler(ConnectionErrorHandler errorHandler) {
-        mRouter.setErrorHandler(errorHandler);
-    }
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close() {
-        mRouter.close();
-        mClosed = true;
-    }
-
-    /**
-     * @see Object#finalize()
-     */
-    @Override
-    protected void finalize() throws Throwable {
-        if (!mClosed) {
-            mExecutor.execute(new Runnable() {
-
-                @Override
-                public void run() {
-                    close();
-                }
-            });
-            throw new IllegalStateException("Warning: Router objects should be explicitly closed " +
-                    "when no longer required otherwise you may leak handles.");
-        }
-        super.finalize();
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/BindingsHelper.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/BindingsHelper.java
deleted file mode 100644
index f77399d..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/BindingsHelper.java
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.Watcher;
-
-/**
- * Helper functions.
- */
-public class BindingsHelper {
-    /**
-     * Alignment in bytes for mojo serialization.
-     */
-    public static final int ALIGNMENT = 8;
-
-    /**
-     * The size, in bytes, of a serialized handle. A handle is serialized as an int representing the
-     * offset of the handle in the list of handles.
-     */
-    public static final int SERIALIZED_HANDLE_SIZE = 4;
-
-    /**
-     * The size, in bytes, of a serialized interface, which consists of a serialized handle (4
-     * bytes) and a version number (4 bytes).
-     */
-    public static final int SERIALIZED_INTERFACE_SIZE = 8;
-
-    /**
-     * The size, in bytes, of a serialized pointer. A pointer is serializaed as an unsigned long
-     * representing the offset from its position to the pointed elemnt.
-     */
-    public static final int POINTER_SIZE = 8;
-
-    /**
-     * The size, in bytes, of a serialized union.
-     */
-    public static final int UNION_SIZE = 16;
-
-    /**
-     * The header for a serialized map element.
-     */
-    public static final DataHeader MAP_STRUCT_HEADER = new DataHeader(24, 0);
-
-    /**
-     * The value used for the expected length of a non-fixed size array.
-     */
-    public static final int UNSPECIFIED_ARRAY_LENGTH = -1;
-
-    /**
-     * Passed as |arrayNullability| when neither the array nor its elements are nullable.
-     */
-    public static final int NOTHING_NULLABLE = 0;
-
-    /**
-     * "Array bit" of |arrayNullability| is set iff the array itself is nullable.
-     */
-    public static final int ARRAY_NULLABLE = (1 << 0);
-
-    /**
-     * "Element bit" of |arrayNullability| is set iff the array elements are nullable.
-     */
-    public static final int ELEMENT_NULLABLE = (1 << 1);
-
-    public static boolean isArrayNullable(int arrayNullability) {
-        return (arrayNullability & ARRAY_NULLABLE) > 0;
-    }
-
-    public static boolean isElementNullable(int arrayNullability) {
-        return (arrayNullability & ELEMENT_NULLABLE) > 0;
-    }
-
-    /**
-     * Align |size| on {@link BindingsHelper#ALIGNMENT}.
-     */
-    public static int align(int size) {
-        return (size + ALIGNMENT - 1) & ~(ALIGNMENT - 1);
-    }
-
-    /**
-     * Align |size| on {@link BindingsHelper#ALIGNMENT}.
-     */
-    public static long align(long size) {
-        return (size + ALIGNMENT - 1) & ~(ALIGNMENT - 1);
-    }
-
-    /**
-     * Compute the size in bytes of the given string encoded as utf8.
-     */
-    public static int utf8StringSizeInBytes(String s) {
-        int res = 0;
-        for (int i = 0; i < s.length(); ++i) {
-            char c = s.charAt(i);
-            int codepoint = c;
-            if (isSurrogate(c)) {
-                i++;
-                char c2 = s.charAt(i);
-                codepoint = Character.toCodePoint(c, c2);
-            }
-            res += 1;
-            if (codepoint > 0x7f) {
-                res += 1;
-                if (codepoint > 0x7ff) {
-                    res += 1;
-                    if (codepoint > 0xffff) {
-                        res += 1;
-                        if (codepoint > 0x1fffff) {
-                            res += 1;
-                            if (codepoint > 0x3ffffff) {
-                                res += 1;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return res;
-    }
-
-    /**
-     * Returns |true| if and only if the two objects are equals, handling |null|.
-     */
-    public static boolean equals(Object o1, Object o2) {
-        if (o1 == o2) {
-            return true;
-        }
-        if (o1 == null) {
-            return false;
-        }
-        return o1.equals(o2);
-    }
-
-    /**
-     * Returns the hash code of the object, handling |null|.
-     */
-    public static int hashCode(Object o) {
-        if (o == null) {
-            return 0;
-        }
-        return o.hashCode();
-    }
-
-    /**
-     * Returns the hash code of the value.
-     */
-    public static int hashCode(boolean o) {
-        return o ? 1231 : 1237;
-    }
-
-    /**
-     * Returns the hash code of the value.
-     */
-    public static int hashCode(long o) {
-        return (int) (o ^ (o >>> 32));
-    }
-
-    /**
-     * Returns the hash code of the value.
-     */
-    public static int hashCode(float o) {
-        return Float.floatToIntBits(o);
-    }
-
-    /**
-     * Returns the hash code of the value.
-     */
-    public static int hashCode(double o) {
-        return hashCode(Double.doubleToLongBits(o));
-    }
-
-    /**
-     * Returns the hash code of the value.
-     */
-    public static int hashCode(int o) {
-        return o;
-    }
-
-    /**
-     * Determines if the given {@code char} value is a Unicode <i>surrogate code unit</i>. See
-     * {@link Character#isSurrogate}. Extracting here because the method only exists at API level
-     * 19.
-     */
-    private static boolean isSurrogate(char c) {
-        return c >= Character.MIN_SURROGATE && c < (Character.MAX_SURROGATE + 1);
-    }
-
-    /**
-     * Returns an {@link AsyncWaiter} to use with the given handle, or |null| if none if available.
-     */
-    static Watcher getWatcherForHandle(Handle handle) {
-        if (handle.getCore() != null) {
-            return handle.getCore().getWatcher();
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Callbacks.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Callbacks.java
deleted file mode 100644
index c6b14c1..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Callbacks.java
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file was generated using
-//     mojo/tools/generate_java_callback_interfaces.py
-
-package org.chromium.mojo.bindings;
-
-/**
- * Contains a generic interface for callbacks.
- */
-public interface Callbacks {
-
-    /**
-     * A generic callback.
-     */
-    interface Callback0 {
-        /**
-         * Call the callback.
-         */
-        public void call();
-    }
-
-    /**
-     * A generic 1-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-     */
-    interface Callback1<T1> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1);
-    }
-
-    /**
-     * A generic 2-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-      * @param <T2> the type of argument 2.
-     */
-    interface Callback2<T1, T2> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1, T2 arg2);
-    }
-
-    /**
-     * A generic 3-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-      * @param <T2> the type of argument 2.
-      * @param <T3> the type of argument 3.
-     */
-    interface Callback3<T1, T2, T3> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1, T2 arg2, T3 arg3);
-    }
-
-    /**
-     * A generic 4-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-      * @param <T2> the type of argument 2.
-      * @param <T3> the type of argument 3.
-      * @param <T4> the type of argument 4.
-     */
-    interface Callback4<T1, T2, T3, T4> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
-    }
-
-    /**
-     * A generic 5-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-      * @param <T2> the type of argument 2.
-      * @param <T3> the type of argument 3.
-      * @param <T4> the type of argument 4.
-      * @param <T5> the type of argument 5.
-     */
-    interface Callback5<T1, T2, T3, T4, T5> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
-    }
-
-    /**
-     * A generic 6-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-      * @param <T2> the type of argument 2.
-      * @param <T3> the type of argument 3.
-      * @param <T4> the type of argument 4.
-      * @param <T5> the type of argument 5.
-      * @param <T6> the type of argument 6.
-     */
-    interface Callback6<T1, T2, T3, T4, T5, T6> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
-    }
-
-    /**
-     * A generic 7-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-      * @param <T2> the type of argument 2.
-      * @param <T3> the type of argument 3.
-      * @param <T4> the type of argument 4.
-      * @param <T5> the type of argument 5.
-      * @param <T6> the type of argument 6.
-      * @param <T7> the type of argument 7.
-     */
-    interface Callback7<T1, T2, T3, T4, T5, T6, T7> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ConnectionErrorHandler.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ConnectionErrorHandler.java
deleted file mode 100644
index f601fb8..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ConnectionErrorHandler.java
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.MojoException;
-
-/**
- * A {@link ConnectionErrorHandler} is notified of an error happening while using the bindings over
- * message pipes.
- */
-public interface ConnectionErrorHandler {
-    public void onConnectionError(MojoException e);
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java
deleted file mode 100644
index 2aa5ea6..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MessagePipeHandle.ReadMessageResult;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.Watcher;
-
-import java.nio.ByteBuffer;
-
-/**
- * A {@link Connector} owns a {@link MessagePipeHandle} and will send any received messages to the
- * registered {@link MessageReceiver}. It also acts as a {@link MessageReceiver} and will send any
- * message through the handle.
- * <p>
- * The method |start| must be called before the {@link Connector} will start listening to incoming
- * messages.
- */
-public class Connector implements MessageReceiver, HandleOwner<MessagePipeHandle> {
-
-    /**
-     * The callback that is notified when the state of the owned handle changes.
-     */
-    private final WatcherCallback mWatcherCallback = new WatcherCallback();
-
-    /**
-     * The owned message pipe.
-     */
-    private final MessagePipeHandle mMessagePipeHandle;
-
-    /**
-     * A watcher which is notified when a new message is available on the owned message pipe.
-     */
-    private final Watcher mWatcher;
-
-    /**
-     * The {@link MessageReceiver} to which received messages are sent.
-     */
-    private MessageReceiver mIncomingMessageReceiver;
-
-    /**
-     * The error handler to notify of errors.
-     */
-    private ConnectionErrorHandler mErrorHandler;
-
-    /**
-     * Create a new connector over a |messagePipeHandle|. The created connector will use the default
-     * {@link AsyncWaiter} from the {@link Core} implementation of |messagePipeHandle|.
-     */
-    public Connector(MessagePipeHandle messagePipeHandle) {
-        this(messagePipeHandle, BindingsHelper.getWatcherForHandle(messagePipeHandle));
-    }
-
-    /**
-     * Create a new connector over a |messagePipeHandle| using the given {@link AsyncWaiter} to get
-     * notified of changes on the handle.
-     */
-    public Connector(MessagePipeHandle messagePipeHandle, Watcher watcher) {
-        mMessagePipeHandle = messagePipeHandle;
-        mWatcher = watcher;
-    }
-
-    /**
-     * Set the {@link MessageReceiver} that will receive message from the owned message pipe.
-     */
-    public void setIncomingMessageReceiver(MessageReceiver incomingMessageReceiver) {
-        mIncomingMessageReceiver = incomingMessageReceiver;
-    }
-
-    /**
-     * Set the {@link ConnectionErrorHandler} that will be notified of errors on the owned message
-     * pipe.
-     */
-    public void setErrorHandler(ConnectionErrorHandler errorHandler) {
-        mErrorHandler = errorHandler;
-    }
-
-    /**
-     * Start listening for incoming messages.
-     */
-    public void start() {
-        mWatcher.start(mMessagePipeHandle, Core.HandleSignals.READABLE, mWatcherCallback);
-    }
-
-    /**
-     * @see MessageReceiver#accept(Message)
-     */
-    @Override
-    public boolean accept(Message message) {
-        try {
-            mMessagePipeHandle.writeMessage(message.getData(),
-                    message.getHandles(), MessagePipeHandle.WriteFlags.NONE);
-            return true;
-        } catch (MojoException e) {
-            onError(e);
-            return false;
-        }
-    }
-
-    /**
-     * Pass the owned handle of the connector. After this, the connector is disconnected. It cannot
-     * accept new message and it isn't listening to the handle anymore.
-     *
-     * @see org.chromium.mojo.bindings.HandleOwner#passHandle()
-     */
-    @Override
-    public MessagePipeHandle passHandle() {
-        cancelIfActive();
-        MessagePipeHandle handle = mMessagePipeHandle.pass();
-        if (mIncomingMessageReceiver != null) {
-            mIncomingMessageReceiver.close();
-        }
-        return handle;
-    }
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close() {
-        cancelIfActive();
-        mMessagePipeHandle.close();
-        if (mIncomingMessageReceiver != null) {
-            MessageReceiver incomingMessageReceiver = mIncomingMessageReceiver;
-            mIncomingMessageReceiver = null;
-            incomingMessageReceiver.close();
-        }
-    }
-
-    private class WatcherCallback implements Watcher.Callback {
-        /**
-         * @see org.chromium.mojo.system.Watcher.Callback#onResult(int)
-         */
-        @Override
-        public void onResult(int result) {
-            Connector.this.onWatcherResult(result);
-        }
-
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Watcher.Callback#onResult(int)
-     */
-    private void onWatcherResult(int result) {
-        if (result == MojoResult.OK) {
-            readOutstandingMessages();
-        } else {
-            onError(new MojoException(result));
-        }
-    }
-
-    private void onError(MojoException exception) {
-        close();
-        if (mErrorHandler != null) {
-            mErrorHandler.onConnectionError(exception);
-        }
-    }
-
-    /**
-     * Read all available messages on the owned message pipe.
-     */
-    private void readOutstandingMessages() {
-        ResultAnd<Boolean> result;
-        do {
-            try {
-                result = readAndDispatchMessage(mMessagePipeHandle, mIncomingMessageReceiver);
-            } catch (MojoException e) {
-                onError(e);
-                return;
-            }
-        } while (result.getValue());
-        if (result.getMojoResult() != MojoResult.SHOULD_WAIT) {
-            onError(new MojoException(result.getMojoResult()));
-        }
-    }
-
-    private void cancelIfActive() {
-        mWatcher.cancel();
-        mWatcher.destroy();
-    }
-
-    /**
-     * Read a message, and pass it to the given |MessageReceiver| if not null. If the
-     * |MessageReceiver| is null, the message is lost.
-     *
-     * @param receiver The {@link MessageReceiver} that will receive the read {@link Message}. Can
-     *            be <code>null</code>, in which case the message is discarded.
-     */
-    static ResultAnd<Boolean> readAndDispatchMessage(
-            MessagePipeHandle handle, MessageReceiver receiver) {
-        // TODO(qsr) Allow usage of a pool of pre-allocated buffer for performance.
-        ResultAnd<ReadMessageResult> result =
-                handle.readMessage(null, 0, MessagePipeHandle.ReadFlags.NONE);
-        if (result.getMojoResult() != MojoResult.RESOURCE_EXHAUSTED) {
-            return new ResultAnd<Boolean>(result.getMojoResult(), false);
-        }
-        ReadMessageResult readResult = result.getValue();
-        assert readResult != null;
-        ByteBuffer buffer = ByteBuffer.allocateDirect(readResult.getMessageSize());
-        result = handle.readMessage(
-                buffer, readResult.getHandlesCount(), MessagePipeHandle.ReadFlags.NONE);
-        if (receiver != null && result.getMojoResult() == MojoResult.OK) {
-            boolean accepted = receiver.accept(new Message(buffer, result.getValue().getHandles()));
-            return new ResultAnd<Boolean>(result.getMojoResult(), accepted);
-        }
-        return new ResultAnd<Boolean>(result.getMojoResult(), false);
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DataHeader.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DataHeader.java
deleted file mode 100644
index 96acec9..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DataHeader.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.mojo.bindings;
-
-/**
- * The header for a mojo complex element.
- */
-public final class DataHeader {
-    /**
-     * The size of a serialized header, in bytes.
-     */
-    public static final int HEADER_SIZE = 8;
-
-    /**
-     * The offset of the size field.
-     */
-    public static final int SIZE_OFFSET = 0;
-
-    /**
-     * The offset of the number of fields field.
-     */
-    public static final int ELEMENTS_OR_VERSION_OFFSET = 4;
-
-    /**
-     * The size of the object owning this header.
-     */
-    public final int size;
-
-    /**
-     * Number of element (for an array) or version (for a struct) of the object owning this
-     * header.
-     */
-    public final int elementsOrVersion;
-
-    /**
-     * Constructor.
-     */
-    public DataHeader(int size, int elementsOrVersion) {
-        super();
-        this.size = size;
-        this.elementsOrVersion = elementsOrVersion;
-    }
-
-    /**
-     * @see Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + elementsOrVersion;
-        result = prime * result + size;
-        return result;
-    }
-
-    /**
-     * @see Object#equals(Object)
-     */
-    @Override
-    public boolean equals(Object object) {
-        if (object == this) return true;
-        if (object == null) return false;
-        if (getClass() != object.getClass()) return false;
-
-        DataHeader other = (DataHeader) object;
-        return (elementsOrVersion == other.elementsOrVersion && size == other.size);
-    }
-}
\ No newline at end of file
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
deleted file mode 100644
index 64ff1c0..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
+++ /dev/null
@@ -1,776 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.bindings.Interface.Proxy;
-import org.chromium.mojo.system.DataPipe;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.InvalidHandle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.SharedBufferHandle;
-import org.chromium.mojo.system.UntypedHandle;
-
-import java.nio.ByteOrder;
-import java.nio.charset.Charset;
-
-/**
- * A Decoder is a helper class for deserializing a mojo struct. It enables deserialization of basic
- * types from a {@link Message} object at a given offset into it's byte buffer.
- */
-public class Decoder {
-
-    /**
-     * Helper class to validate the decoded message.
-     */
-    static final class Validator {
-
-        /**
-         * Minimal value for the next handle to deserialize.
-         */
-        private int mMinNextClaimedHandle;
-        /**
-         * Minimal value of the start of the next memory to claim.
-         */
-        private long mMinNextMemory;
-        /**
-         * The current nesting level when decoding.
-         */
-        private long mStackDepth;
-
-        /**
-         * The maximal memory accessible.
-         */
-        private final long mMaxMemory;
-
-        /**
-         * The number of handles in the message.
-         */
-        private final long mNumberOfHandles;
-
-        /**
-         * The maximum nesting level when decoding.
-         */
-        private static final int MAX_RECURSION_DEPTH = 100;
-
-        /**
-         * Constructor.
-         */
-        Validator(long maxMemory, int numberOfHandles) {
-            mMaxMemory = maxMemory;
-            mNumberOfHandles = numberOfHandles;
-            mStackDepth = 0;
-        }
-
-        public void claimHandle(int handle) {
-            if (handle < mMinNextClaimedHandle) {
-                throw new DeserializationException(
-                        "Trying to access handle out of order.");
-            }
-            if (handle >= mNumberOfHandles) {
-                throw new DeserializationException("Trying to access non present handle.");
-            }
-            mMinNextClaimedHandle = handle + 1;
-        }
-
-        public void claimMemory(long start, long end) {
-            if (start % BindingsHelper.ALIGNMENT != 0) {
-                throw new DeserializationException("Incorrect starting alignment: " + start + ".");
-            }
-            if (start < mMinNextMemory) {
-                throw new DeserializationException("Trying to access memory out of order.");
-            }
-            if (end < start) {
-                throw new DeserializationException("Incorrect memory range.");
-            }
-            if (end > mMaxMemory) {
-                throw new DeserializationException("Trying to access out of range memory.");
-            }
-            mMinNextMemory = BindingsHelper.align(end);
-        }
-
-        public void increaseStackDepth() {
-            ++mStackDepth;
-            if (mStackDepth >= MAX_RECURSION_DEPTH) {
-                throw new DeserializationException("Recursion depth limit exceeded.");
-            }
-        }
-
-        public void decreaseStackDepth() {
-            --mStackDepth;
-        }
-    }
-
-    /**
-     * The message to deserialize from.
-     */
-    private final Message mMessage;
-
-    /**
-     * The base offset in the byte buffer.
-     */
-    private final int mBaseOffset;
-
-    /**
-     * Validator for the decoded message.
-     */
-    private final Validator mValidator;
-
-    /**
-     * Constructor.
-     *
-     * @param message The message to decode.
-     */
-    public Decoder(Message message) {
-        this(message, new Validator(message.getData().limit(), message.getHandles().size()), 0);
-    }
-
-    private Decoder(Message message, Validator validator, int baseOffset) {
-        mMessage = message;
-        mMessage.getData().order(ByteOrder.LITTLE_ENDIAN);
-        mBaseOffset = baseOffset;
-        mValidator = validator;
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} at the current position.
-     */
-    public DataHeader readDataHeader() {
-        // Claim the memory for the header.
-        mValidator.claimMemory(mBaseOffset, mBaseOffset + DataHeader.HEADER_SIZE);
-        DataHeader result = readDataHeaderAtOffset(0, false);
-        // Claim the rest of the memory.
-        mValidator.claimMemory(mBaseOffset + DataHeader.HEADER_SIZE, mBaseOffset + result.size);
-        return result;
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} for an union at the given offset.
-     */
-    public DataHeader readDataHeaderForUnion(int offset) {
-        DataHeader result = readDataHeaderAtOffset(offset, true);
-        if (result.size == 0) {
-            if (result.elementsOrVersion != 0) {
-                throw new DeserializationException(
-                        "Unexpected version tag for a null union. Expecting 0, found: "
-                        + result.elementsOrVersion);
-            }
-        } else if (result.size != BindingsHelper.UNION_SIZE) {
-            throw new DeserializationException(
-                    "Unexpected size of an union. The size must be 0 for a null union, or 16 for "
-                    + "a non-null union.");
-        }
-        return result;
-    }
-
-    /**
-     * @returns a decoder suitable to decode an union defined as the root object of a message.
-     */
-    public Decoder decoderForSerializedUnion() {
-        mValidator.claimMemory(0, BindingsHelper.UNION_SIZE);
-        return this;
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} at the given offset.
-     */
-    private DataHeader readDataHeaderAtOffset(int offset, boolean isUnion) {
-        int size = readInt(offset + DataHeader.SIZE_OFFSET);
-        int elementsOrVersion = readInt(offset + DataHeader.ELEMENTS_OR_VERSION_OFFSET);
-        if (size < 0) {
-            throw new DeserializationException(
-                    "Negative size. Unsigned integers are not valid for java.");
-        }
-        if (elementsOrVersion < 0 && (!isUnion || elementsOrVersion != -1)) {
-            throw new DeserializationException(
-                    "Negative elements or version. Unsigned integers are not valid for java.");
-        }
-
-        return new DataHeader(size, elementsOrVersion);
-    }
-
-    public DataHeader readAndValidateDataHeader(DataHeader[] versionArray) {
-        DataHeader header = readDataHeader();
-        int maxVersionIndex = versionArray.length - 1;
-        if (header.elementsOrVersion <= versionArray[maxVersionIndex].elementsOrVersion) {
-            DataHeader referenceHeader = null;
-            for (int index = maxVersionIndex; index >= 0; index--) {
-                DataHeader dataHeader = versionArray[index];
-                if (header.elementsOrVersion >= dataHeader.elementsOrVersion) {
-                    referenceHeader = dataHeader;
-                    break;
-                }
-            }
-            if (referenceHeader == null || referenceHeader.size != header.size) {
-                throw new DeserializationException(
-                        "Header doesn't correspond to any known version.");
-            }
-        } else {
-            if (header.size < versionArray[maxVersionIndex].size) {
-                throw new DeserializationException("Message newer than the last known version"
-                        + " cannot be shorter than required by the last known version.");
-            }
-        }
-        return header;
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} at the given offset and checks if it is correct for an
-     * array where elements are pointers.
-     */
-    public DataHeader readDataHeaderForPointerArray(int expectedLength) {
-        return readDataHeaderForArray(BindingsHelper.POINTER_SIZE, expectedLength);
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} at the given offset and checks if it is correct for an
-     * array where elements are unions.
-     */
-    public DataHeader readDataHeaderForUnionArray(int expectedLength) {
-        return readDataHeaderForArray(BindingsHelper.UNION_SIZE, expectedLength);
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} at the given offset and checks if it is correct for a map.
-     */
-    public void readDataHeaderForMap() {
-        DataHeader si = readDataHeader();
-        if (si.size != BindingsHelper.MAP_STRUCT_HEADER.size) {
-            throw new DeserializationException(
-                    "Incorrect header for map. The size is incorrect.");
-        }
-        if (si.elementsOrVersion != BindingsHelper.MAP_STRUCT_HEADER.elementsOrVersion) {
-            throw new DeserializationException(
-                    "Incorrect header for map. The version is incorrect.");
-        }
-    }
-
-    /**
-     * Deserializes a byte at the given offset.
-     */
-    public byte readByte(int offset) {
-        validateBufferSize(offset, 1);
-        return mMessage.getData().get(mBaseOffset + offset);
-    }
-
-    /**
-     * Deserializes a boolean at the given offset, re-using any partially read byte.
-     */
-    public boolean readBoolean(int offset, int bit) {
-        validateBufferSize(offset, 1);
-        return (readByte(offset) & (1 << bit)) != 0;
-    }
-
-    /**
-     * Deserializes a short at the given offset.
-     */
-    public short readShort(int offset) {
-        validateBufferSize(offset, 2);
-        return mMessage.getData().getShort(mBaseOffset + offset);
-    }
-
-    /**
-     * Deserializes an int at the given offset.
-     */
-    public int readInt(int offset) {
-        validateBufferSize(offset, 4);
-        return mMessage.getData().getInt(mBaseOffset + offset);
-    }
-
-    /**
-     * Deserializes a float at the given offset.
-     */
-    public float readFloat(int offset) {
-        validateBufferSize(offset, 4);
-        return mMessage.getData().getFloat(mBaseOffset + offset);
-    }
-
-    /**
-     * Deserializes a long at the given offset.
-     */
-    public long readLong(int offset) {
-        validateBufferSize(offset, 8);
-        return mMessage.getData().getLong(mBaseOffset + offset);
-    }
-
-    /**
-     * Deserializes a double at the given offset.
-     */
-    public double readDouble(int offset) {
-        validateBufferSize(offset, 8);
-        return mMessage.getData().getDouble(mBaseOffset + offset);
-    }
-
-    /**
-     * Deserializes a pointer at the given offset. Returns a Decoder suitable to decode the content
-     * of the pointer.
-     */
-    public Decoder readPointer(int offset, boolean nullable) {
-        int basePosition = mBaseOffset + offset;
-        long pointerOffset = readLong(offset);
-        if (pointerOffset == 0) {
-            if (!nullable) {
-                throw new DeserializationException(
-                        "Trying to decode null pointer for a non-nullable type.");
-            }
-            return null;
-        }
-        int newPosition = (int) (basePosition + pointerOffset);
-        // The method |getDecoderAtPosition| will validate that the pointer address is valid.
-        return getDecoderAtPosition(newPosition);
-
-    }
-
-    /**
-     * Deserializes an array of boolean at the given offset.
-     */
-    public boolean[] readBooleans(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForBooleanArray(expectedLength);
-        byte[] bytes = new byte[(si.elementsOrVersion + 7) / BindingsHelper.ALIGNMENT];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().get(bytes);
-        boolean[] result = new boolean[si.elementsOrVersion];
-        for (int i = 0; i < bytes.length; ++i) {
-            for (int j = 0; j < BindingsHelper.ALIGNMENT; ++j) {
-                int booleanIndex = i * BindingsHelper.ALIGNMENT + j;
-                if (booleanIndex < result.length) {
-                    result[booleanIndex] = (bytes[i] & (1 << j)) != 0;
-                }
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Deserializes an array of bytes at the given offset.
-     */
-    public byte[] readBytes(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(1, expectedLength);
-        byte[] result = new byte[si.elementsOrVersion];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().get(result);
-        return result;
-    }
-
-    /**
-     * Deserializes an array of shorts at the given offset.
-     */
-    public short[] readShorts(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(2, expectedLength);
-        short[] result = new short[si.elementsOrVersion];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().asShortBuffer().get(result);
-        return result;
-    }
-
-    /**
-     * Deserializes an array of ints at the given offset.
-     */
-    public int[] readInts(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        int[] result = new int[si.elementsOrVersion];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().asIntBuffer().get(result);
-        return result;
-    }
-
-    /**
-     * Deserializes an array of floats at the given offset.
-     */
-    public float[] readFloats(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        float[] result = new float[si.elementsOrVersion];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().asFloatBuffer().get(result);
-        return result;
-    }
-
-    /**
-     * Deserializes an array of longs at the given offset.
-     */
-    public long[] readLongs(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(8, expectedLength);
-        long[] result = new long[si.elementsOrVersion];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().asLongBuffer().get(result);
-        return result;
-    }
-
-    /**
-     * Deserializes an array of doubles at the given offset.
-     */
-    public double[] readDoubles(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(8, expectedLength);
-        double[] result = new double[si.elementsOrVersion];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().asDoubleBuffer().get(result);
-        return result;
-    }
-
-    /**
-     * Deserializes an |Handle| at the given offset.
-     */
-    public Handle readHandle(int offset, boolean nullable) {
-        int index = readInt(offset);
-        if (index == -1) {
-            if (!nullable) {
-                throw new DeserializationException(
-                        "Trying to decode an invalid handle for a non-nullable type.");
-            }
-            return InvalidHandle.INSTANCE;
-        }
-        mValidator.claimHandle(index);
-        return mMessage.getHandles().get(index);
-    }
-
-    /**
-     * Deserializes an |UntypedHandle| at the given offset.
-     */
-    public UntypedHandle readUntypedHandle(int offset, boolean nullable) {
-        return readHandle(offset, nullable).toUntypedHandle();
-    }
-
-    /**
-     * Deserializes a |ConsumerHandle| at the given offset.
-     */
-    public DataPipe.ConsumerHandle readConsumerHandle(int offset, boolean nullable) {
-        return readUntypedHandle(offset, nullable).toDataPipeConsumerHandle();
-    }
-
-    /**
-     * Deserializes a |ProducerHandle| at the given offset.
-     */
-    public DataPipe.ProducerHandle readProducerHandle(int offset, boolean nullable) {
-        return readUntypedHandle(offset, nullable).toDataPipeProducerHandle();
-    }
-
-    /**
-     * Deserializes a |MessagePipeHandle| at the given offset.
-     */
-    public MessagePipeHandle readMessagePipeHandle(int offset, boolean nullable) {
-        return readUntypedHandle(offset, nullable).toMessagePipeHandle();
-    }
-
-    /**
-     * Deserializes a |SharedBufferHandle| at the given offset.
-     */
-    public SharedBufferHandle readSharedBufferHandle(int offset, boolean nullable) {
-        return readUntypedHandle(offset, nullable).toSharedBufferHandle();
-    }
-
-    /**
-     * Deserializes an interface at the given offset.
-     *
-     * @return a proxy to the service.
-     */
-    public <P extends Proxy> P readServiceInterface(int offset, boolean nullable,
-            Interface.Manager<?, P> manager) {
-        MessagePipeHandle handle = readMessagePipeHandle(offset, nullable);
-        if (!handle.isValid()) {
-            return null;
-        }
-        int version = readInt(offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
-        return manager.attachProxy(handle, version);
-    }
-
-    /**
-     * Deserializes a |InterfaceRequest| at the given offset.
-     */
-    public <I extends Interface> InterfaceRequest<I> readInterfaceRequest(int offset,
-            boolean nullable) {
-        MessagePipeHandle handle = readMessagePipeHandle(offset, nullable);
-        if (handle == null) {
-            return null;
-        }
-        return new InterfaceRequest<I>(handle);
-    }
-
-    /**
-     * Deserializes an associated interface at the given offset. Not yet supported.
-     */
-    public AssociatedInterfaceNotSupported readAssociatedServiceInterfaceNotSupported(int offset,
-            boolean nullable) {
-        return null;
-    }
-
-    /**
-     * Deserializes an associated interface request at the given offset. Not yet supported.
-     */
-    public AssociatedInterfaceRequestNotSupported readAssociatedInterfaceRequestNotSupported(
-            int offset, boolean nullable) {
-        return null;
-    }
-
-    /**
-     * Deserializes a string at the given offset.
-     */
-    public String readString(int offset, boolean nullable) {
-        final int arrayNullability = nullable ? BindingsHelper.ARRAY_NULLABLE : 0;
-        byte[] bytes = readBytes(offset, arrayNullability, BindingsHelper.UNSPECIFIED_ARRAY_LENGTH);
-        if (bytes == null) {
-            return null;
-        }
-        return new String(bytes, Charset.forName("utf8"));
-    }
-
-    /**
-     * Deserializes an array of |Handle| at the given offset.
-     */
-    public Handle[] readHandles(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        Handle[] result = new Handle[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readHandle(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-    }
-
-    /**
-     * Deserializes an array of |UntypedHandle| at the given offset.
-     */
-    public UntypedHandle[] readUntypedHandles(
-            int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        UntypedHandle[] result = new UntypedHandle[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readUntypedHandle(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-    }
-
-    /**
-     * Deserializes an array of |ConsumerHandle| at the given offset.
-     */
-    public DataPipe.ConsumerHandle[] readConsumerHandles(
-            int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        DataPipe.ConsumerHandle[] result = new DataPipe.ConsumerHandle[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readConsumerHandle(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-    }
-
-    /**
-     * Deserializes an array of |ProducerHandle| at the given offset.
-     */
-    public DataPipe.ProducerHandle[] readProducerHandles(
-            int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        DataPipe.ProducerHandle[] result = new DataPipe.ProducerHandle[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readProducerHandle(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-
-    }
-
-    /**
-     * Deserializes an array of |MessagePipeHandle| at the given offset.
-     */
-    public MessagePipeHandle[] readMessagePipeHandles(
-            int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        MessagePipeHandle[] result = new MessagePipeHandle[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readMessagePipeHandle(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-
-    }
-
-    /**
-     * Deserializes an array of |SharedBufferHandle| at the given offset.
-     */
-    public SharedBufferHandle[] readSharedBufferHandles(
-            int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        SharedBufferHandle[] result = new SharedBufferHandle[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readSharedBufferHandle(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-
-    }
-
-    /**
-     * Deserializes an array of |ServiceHandle| at the given offset.
-     */
-    public <S extends Interface, P extends Proxy> S[] readServiceInterfaces(
-            int offset, int arrayNullability, int expectedLength, Interface.Manager<S, P> manager) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si =
-                d.readDataHeaderForArray(BindingsHelper.SERIALIZED_INTERFACE_SIZE, expectedLength);
-        S[] result = manager.buildArray(si.elementsOrVersion);
-        for (int i = 0; i < result.length; ++i) {
-            // This cast is necessary because java 6 doesn't handle wildcard correctly when using
-            // Manager<S, ? extends S>
-            @SuppressWarnings("unchecked")
-            S value = (S) d.readServiceInterface(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_INTERFACE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability), manager);
-            result[i] = value;
-        }
-        return result;
-    }
-
-    /**
-     * Deserializes an array of |InterfaceRequest| at the given offset.
-     */
-    public <I extends Interface> InterfaceRequest<I>[] readInterfaceRequests(
-            int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        @SuppressWarnings("unchecked")
-        InterfaceRequest<I>[] result = new InterfaceRequest[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readInterfaceRequest(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-    }
-
-    /**
-     * Deserializes an array of associated interfaces at the given offset. Not yet supported.
-     */
-    public AssociatedInterfaceNotSupported[] readAssociatedServiceInterfaceNotSupporteds(
-            int offset, int arrayNullability, int expectedLength) {
-        return null;
-    }
-
-    /**
-     * Deserializes an array of associated interface requests at the given offset. Not yet
-     * supported.
-     */
-    public AssociatedInterfaceRequestNotSupported[] readAssociatedInterfaceRequestNotSupporteds(
-            int offset, int arrayNullability, int expectedLength) {
-        return null;
-    }
-
-    /**
-     * Returns a view of this decoder at the offset |offset|.
-     */
-    private Decoder getDecoderAtPosition(int offset) {
-        return new Decoder(mMessage, mValidator, offset);
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} at the given offset and checks if it is correct for an
-     * array of booleans.
-     */
-    private DataHeader readDataHeaderForBooleanArray(int expectedLength) {
-        DataHeader dataHeader = readDataHeader();
-        if (dataHeader.size < DataHeader.HEADER_SIZE + (dataHeader.elementsOrVersion + 7) / 8) {
-            throw new DeserializationException("Array header is incorrect.");
-        }
-        if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
-                && dataHeader.elementsOrVersion != expectedLength) {
-            throw new DeserializationException("Incorrect array length. Expected: " + expectedLength
-                    + ", but got: " + dataHeader.elementsOrVersion + ".");
-        }
-        return dataHeader;
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} of an array at the given offset.
-     */
-    private DataHeader readDataHeaderForArray(long elementSize, int expectedLength) {
-        DataHeader dataHeader = readDataHeader();
-        if (dataHeader.size
-                < (DataHeader.HEADER_SIZE + elementSize * dataHeader.elementsOrVersion)) {
-            throw new DeserializationException("Array header is incorrect.");
-        }
-        if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
-                && dataHeader.elementsOrVersion != expectedLength) {
-            throw new DeserializationException("Incorrect array length. Expected: " + expectedLength
-                    + ", but got: " + dataHeader.elementsOrVersion + ".");
-        }
-        return dataHeader;
-    }
-
-    private void validateBufferSize(int offset, int size) {
-        if (mMessage.getData().limit() < offset + size) {
-            throw new DeserializationException("Buffer is smaller than expected.");
-        }
-    }
-
-    public void increaseStackDepth() {
-        mValidator.increaseStackDepth();
-    }
-
-    public void decreaseStackDepth() {
-        mValidator.decreaseStackDepth();
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DelegatingConnectionErrorHandler.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DelegatingConnectionErrorHandler.java
deleted file mode 100644
index 2ee2ae7..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DelegatingConnectionErrorHandler.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.MojoException;
-
-import java.util.Collections;
-import java.util.Set;
-import java.util.WeakHashMap;
-
-/**
- * A {@link ConnectionErrorHandler} that delegate the errors to a list of registered handlers. This
- * class will use weak pointers to prevent keeping references to any handlers it delegates to.
- */
-public class DelegatingConnectionErrorHandler implements ConnectionErrorHandler {
-
-    /**
-     * The registered handlers. This uses a {@link WeakHashMap} so that it doesn't prevent the
-     * handler from being garbage collected.
-     */
-    private final Set<ConnectionErrorHandler> mHandlers =
-            Collections.newSetFromMap(new WeakHashMap<ConnectionErrorHandler, Boolean>());
-
-    /**
-     * @see ConnectionErrorHandler#onConnectionError(MojoException)
-     */
-    @Override
-    public void onConnectionError(MojoException e) {
-        for (ConnectionErrorHandler handler : mHandlers) {
-            handler.onConnectionError(e);
-        }
-    }
-
-    /**
-     * Add a handler that will be notified of any error this object receives.
-     */
-    public void addConnectionErrorHandler(ConnectionErrorHandler handler) {
-        mHandlers.add(handler);
-    }
-
-    /**
-     * Remove a previously registered handler.
-     */
-    public void removeConnectionErrorHandler(ConnectionErrorHandler handler) {
-        mHandlers.remove(handler);
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DeserializationException.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DeserializationException.java
deleted file mode 100644
index eeb511c..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DeserializationException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-/**
- * Error when deserializing a mojo message.
- */
-public class DeserializationException extends RuntimeException {
-
-    /**
-     * Constructs a new deserialization exception with the specified detail message.
-     */
-    public DeserializationException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructs a new deserialization exception with the specified cause.
-     */
-    public DeserializationException(Exception cause) {
-        super(cause);
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java
deleted file mode 100644
index 3c86a8d..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java
+++ /dev/null
@@ -1,587 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.bindings.Interface.Proxy.Handler;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.Pair;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Helper class to encode a mojo struct. It keeps track of the output buffer, resizing it as needed.
- * It also keeps track of the associated handles, and the offset of the current data section.
- */
-public class Encoder {
-
-    /**
-     * Container class for all state that must be shared between the main encoder and any used sub
-     * encoder.
-     */
-    private static class EncoderState {
-
-        /**
-         * The core used to encode interfaces.
-         */
-        public final Core core;
-
-        /**
-         * The ByteBuffer to which the message will be encoded.
-         */
-        public ByteBuffer byteBuffer;
-
-        /**
-         * The list of encountered handles.
-         */
-        public final List<Handle> handles = new ArrayList<Handle>();
-
-        /**
-         * The current absolute position for the next data section.
-         */
-        public int dataEnd;
-
-        /**
-         * @param core the |Core| implementation used to generate handles. Only used if the data
-         *            structure being encoded contains interfaces, can be |null| otherwise.
-         * @param bufferSize A hint on the size of the message. Used to build the initial byte
-         *            buffer.
-         */
-        private EncoderState(Core core, int bufferSize) {
-            assert bufferSize % BindingsHelper.ALIGNMENT == 0;
-            this.core = core;
-            byteBuffer = ByteBuffer.allocateDirect(
-                    bufferSize > 0 ? bufferSize : INITIAL_BUFFER_SIZE);
-            byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-            dataEnd = 0;
-        }
-
-        /**
-         * Claim the given amount of memory at the end of the buffer, resizing it if needed.
-         */
-        public void claimMemory(int size) {
-            dataEnd += size;
-            growIfNeeded();
-        }
-
-        /**
-         * Grow the associated ByteBuffer if needed.
-         */
-        private void growIfNeeded() {
-            if (byteBuffer.capacity() >= dataEnd) {
-                return;
-            }
-            int targetSize = byteBuffer.capacity() * 2;
-            while (targetSize < dataEnd) {
-                targetSize *= 2;
-            }
-            ByteBuffer newBuffer = ByteBuffer.allocateDirect(targetSize);
-            newBuffer.order(ByteOrder.nativeOrder());
-            byteBuffer.position(0);
-            byteBuffer.limit(byteBuffer.capacity());
-            newBuffer.put(byteBuffer);
-            byteBuffer = newBuffer;
-        }
-    }
-
-    /**
-     * Default initial size of the data buffer. This must be a multiple of 8 bytes.
-     */
-    private static final int INITIAL_BUFFER_SIZE = 1024;
-
-    /**
-     * Base offset in the byte buffer for writing.
-     */
-    private int mBaseOffset;
-
-    /**
-     * The encoder state shared by the main encoder and all its sub-encoder.
-     */
-    private final EncoderState mEncoderState;
-
-    /**
-     * Returns the result message.
-     */
-    public Message getMessage() {
-        mEncoderState.byteBuffer.position(0);
-        mEncoderState.byteBuffer.limit(mEncoderState.dataEnd);
-        return new Message(mEncoderState.byteBuffer, mEncoderState.handles);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param core the |Core| implementation used to generate handles. Only used if the data
-     *            structure being encoded contains interfaces, can be |null| otherwise.
-     * @param sizeHint A hint on the size of the message. Used to build the initial byte buffer.
-     */
-    public Encoder(Core core, int sizeHint) {
-        this(new EncoderState(core, sizeHint));
-    }
-
-    /**
-     * Private constructor for sub-encoders.
-     */
-    private Encoder(EncoderState bufferInformation) {
-        mEncoderState = bufferInformation;
-        mBaseOffset = bufferInformation.dataEnd;
-    }
-
-    /**
-     * Returns a new encoder that will append to the current buffer.
-     */
-    public Encoder getEncoderAtDataOffset(DataHeader dataHeader) {
-        Encoder result = new Encoder(mEncoderState);
-        result.encode(dataHeader);
-        return result;
-    }
-
-    /**
-     * Encode a {@link DataHeader} and claim the amount of memory required for the data section
-     * (resizing the buffer if required).
-     */
-    public void encode(DataHeader s) {
-        mEncoderState.claimMemory(BindingsHelper.align(s.size));
-        encode(s.size, DataHeader.SIZE_OFFSET);
-        encode(s.elementsOrVersion, DataHeader.ELEMENTS_OR_VERSION_OFFSET);
-    }
-
-    /**
-     * Encode a byte at the given offset.
-     */
-    public void encode(byte v, int offset) {
-        mEncoderState.byteBuffer.put(mBaseOffset + offset, v);
-    }
-
-    /**
-     * Encode a boolean at the given offset.
-     */
-    public void encode(boolean v, int offset, int bit) {
-        if (v) {
-            byte encodedValue = mEncoderState.byteBuffer.get(mBaseOffset + offset);
-            encodedValue |= (byte) (1 << bit);
-            mEncoderState.byteBuffer.put(mBaseOffset + offset, encodedValue);
-        }
-    }
-
-    /**
-     * Encode a short at the given offset.
-     */
-    public void encode(short v, int offset) {
-        mEncoderState.byteBuffer.putShort(mBaseOffset + offset, v);
-    }
-
-    /**
-     * Encode an int at the given offset.
-     */
-    public void encode(int v, int offset) {
-        mEncoderState.byteBuffer.putInt(mBaseOffset + offset, v);
-    }
-
-    /**
-     * Encode a float at the given offset.
-     */
-    public void encode(float v, int offset) {
-        mEncoderState.byteBuffer.putFloat(mBaseOffset + offset, v);
-    }
-
-    /**
-     * Encode a long at the given offset.
-     */
-    public void encode(long v, int offset) {
-        mEncoderState.byteBuffer.putLong(mBaseOffset + offset, v);
-    }
-
-    /**
-     * Encode a double at the given offset.
-     */
-    public void encode(double v, int offset) {
-        mEncoderState.byteBuffer.putDouble(mBaseOffset + offset, v);
-    }
-
-    /**
-     * Encode a {@link Struct} at the given offset.
-     */
-    public void encode(Struct v, int offset, boolean nullable) {
-        if (v == null) {
-            encodeNullPointer(offset, nullable);
-            return;
-        }
-        encodePointerToNextUnclaimedData(offset);
-        v.encode(this);
-    }
-
-    /**
-     * Encode a {@link Union} at the given offset.
-     */
-    public void encode(Union v, int offset, boolean nullable) {
-        if (v == null && !nullable) {
-            throw new SerializationException(
-                    "Trying to encode a null pointer for a non-nullable type.");
-        }
-        if (v == null) {
-            encode(0L, offset);
-            encode(0L, offset + DataHeader.HEADER_SIZE);
-            return;
-        }
-        v.encode(this, offset);
-    }
-
-    /**
-     * Encodes a String.
-     */
-    public void encode(String v, int offset, boolean nullable) {
-        if (v == null) {
-            encodeNullPointer(offset, nullable);
-            return;
-        }
-        final int arrayNullability = nullable
-                ? BindingsHelper.ARRAY_NULLABLE : BindingsHelper.NOTHING_NULLABLE;
-        encode(v.getBytes(Charset.forName("utf8")), offset, arrayNullability,
-                BindingsHelper.UNSPECIFIED_ARRAY_LENGTH);
-    }
-
-    /**
-     * Encodes a {@link Handle}.
-     */
-    public void encode(Handle v, int offset, boolean nullable) {
-        if (v == null || !v.isValid()) {
-            encodeInvalidHandle(offset, nullable);
-        } else {
-            encode(mEncoderState.handles.size(), offset);
-            mEncoderState.handles.add(v);
-        }
-    }
-
-    /**
-     * Encode an {@link Interface}.
-     */
-    public <T extends Interface> void encode(T v, int offset, boolean nullable,
-            Interface.Manager<T, ?> manager) {
-        if (v == null) {
-            encodeInvalidHandle(offset, nullable);
-            encode(0, offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
-            return;
-        }
-        if (mEncoderState.core == null) {
-            throw new UnsupportedOperationException(
-                    "The encoder has been created without a Core. It can't encode an interface.");
-        }
-        // If the instance is a proxy, pass the proxy's handle instead of creating a new stub.
-        if (v instanceof Interface.Proxy) {
-            Handler handler = ((Interface.Proxy) v).getProxyHandler();
-            encode(handler.passHandle(), offset, nullable);
-            encode(handler.getVersion(), offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
-            return;
-        }
-        Pair<MessagePipeHandle, MessagePipeHandle> handles =
-                mEncoderState.core.createMessagePipe(null);
-        manager.bind(v, handles.first);
-        encode(handles.second, offset, nullable);
-        encode(manager.getVersion(), offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
-    }
-
-    /**
-     * Encode an {@link InterfaceRequest}.
-     */
-    public <I extends Interface> void encode(InterfaceRequest<I> v, int offset, boolean nullable) {
-        if (v == null) {
-            encodeInvalidHandle(offset, nullable);
-            return;
-        }
-        if (mEncoderState.core == null) {
-            throw new UnsupportedOperationException(
-                    "The encoder has been created without a Core. It can't encode an interface.");
-        }
-        encode(v.passHandle(), offset, nullable);
-    }
-
-    /**
-     * Encode an associated interface. Not yet supported.
-     */
-    public void encode(AssociatedInterfaceNotSupported v, int offset, boolean nullable) {
-    }
-
-    /**
-     * Encode an associated interface request. Not yet supported.
-     */
-    public void encode(AssociatedInterfaceRequestNotSupported v, int offset, boolean nullable) {
-    }
-
-    /**
-     * Returns an {@link Encoder} suitable for encoding an array of pointer of the given length.
-     */
-    public Encoder encodePointerArray(int length, int offset, int expectedLength) {
-        return encoderForArray(BindingsHelper.POINTER_SIZE, length, offset, expectedLength);
-    }
-
-    /**
-     * Returns an {@link Encoder} suitable for encoding an array of union of the given length.
-     */
-    public Encoder encodeUnionArray(int length, int offset, int expectedLength) {
-        return encoderForArray(BindingsHelper.UNION_SIZE, length, offset, expectedLength);
-    }
-
-    /**
-     * Encodes an array of booleans.
-     */
-    public void encode(boolean[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
-                && expectedLength != v.length) {
-            throw new SerializationException("Trying to encode a fixed array of incorrect length.");
-        }
-        byte[] bytes = new byte[(v.length + 7) / BindingsHelper.ALIGNMENT];
-        for (int i = 0; i < bytes.length; ++i) {
-            for (int j = 0; j < BindingsHelper.ALIGNMENT; ++j) {
-                int booleanIndex = BindingsHelper.ALIGNMENT * i + j;
-                if (booleanIndex < v.length && v[booleanIndex]) {
-                    bytes[i] |= (byte) (1 << j);
-                }
-            }
-        }
-        encodeByteArray(bytes, v.length, offset);
-    }
-
-    /**
-     * Encodes an array of bytes.
-     */
-    public void encode(byte[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
-                && expectedLength != v.length) {
-            throw new SerializationException("Trying to encode a fixed array of incorrect length.");
-        }
-        encodeByteArray(v, v.length, offset);
-    }
-
-    /**
-     * Encodes an array of shorts.
-     */
-    public void encode(short[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        encoderForArray(2, v.length, offset, expectedLength).append(v);
-    }
-
-    /**
-     * Encodes an array of ints.
-     */
-    public void encode(int[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        encoderForArray(4, v.length, offset, expectedLength).append(v);
-    }
-
-    /**
-     * Encodes an array of floats.
-     */
-    public void encode(float[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        encoderForArray(4, v.length, offset, expectedLength).append(v);
-    }
-
-    /**
-     * Encodes an array of longs.
-     */
-    public void encode(long[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        encoderForArray(8, v.length, offset, expectedLength).append(v);
-    }
-
-    /**
-     * Encodes an array of doubles.
-     */
-    public void encode(double[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        encoderForArray(8, v.length, offset, expectedLength).append(v);
-    }
-
-    /**
-     * Encodes an array of {@link Handle}.
-     */
-    public void encode(Handle[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        Encoder e = encoderForArray(
-                BindingsHelper.SERIALIZED_HANDLE_SIZE, v.length, offset, expectedLength);
-        for (int i = 0; i < v.length; ++i) {
-            e.encode(v[i], DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-    }
-
-    /**
-     * Encodes an array of {@link Interface}.
-     */
-    public <T extends Interface> void encode(T[] v, int offset, int arrayNullability,
-            int expectedLength, Interface.Manager<T, ?> manager) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        Encoder e = encoderForArray(
-                BindingsHelper.SERIALIZED_INTERFACE_SIZE, v.length, offset, expectedLength);
-        for (int i = 0; i < v.length; ++i) {
-            e.encode(v[i], DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_INTERFACE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability), manager);
-        }
-    }
-
-    public Encoder encoderForMap(int offset) {
-        encodePointerToNextUnclaimedData(offset);
-        return getEncoderAtDataOffset(BindingsHelper.MAP_STRUCT_HEADER);
-    }
-
-    /**
-     * Encodes a pointer to the next unclaimed memory and returns an encoder suitable to encode an
-     * union at this location.
-     */
-    public Encoder encoderForUnionPointer(int offset) {
-        encodePointerToNextUnclaimedData(offset);
-        Encoder result = new Encoder(mEncoderState);
-        result.mEncoderState.claimMemory(16);
-        return result;
-    }
-
-    /**
-     * Encodes an array of {@link InterfaceRequest}.
-     */
-    public <I extends Interface> void encode(InterfaceRequest<I>[] v, int offset,
-            int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        Encoder e = encoderForArray(
-                BindingsHelper.SERIALIZED_HANDLE_SIZE, v.length, offset, expectedLength);
-        for (int i = 0; i < v.length; ++i) {
-            e.encode(v[i], DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-    }
-
-    /**
-     * Encodes an array of associated interfaces. Not yet supported.
-     */
-    public void encode(AssociatedInterfaceNotSupported[] v, int offset, int arrayNullability,
-            int expectedLength) {}
-
-    /**
-     * Encodes an array of associated interface requests. Not yet supported.
-     */
-    public void encode(AssociatedInterfaceRequestNotSupported[] v, int offset, int arrayNullability,
-            int expectedLength) {}
-
-    /**
-     * Encodes a <code>null</code> pointer iff the object is nullable, raises an exception
-     * otherwise.
-     */
-    public void encodeNullPointer(int offset, boolean nullable) {
-        if (!nullable) {
-            throw new SerializationException(
-                    "Trying to encode a null pointer for a non-nullable type.");
-        }
-        mEncoderState.byteBuffer.putLong(mBaseOffset + offset, 0);
-    }
-
-    /**
-     * Encodes an invalid handle iff the object is nullable, raises an exception otherwise.
-     */
-    public void encodeInvalidHandle(int offset, boolean nullable) {
-        if (!nullable) {
-            throw new SerializationException(
-                    "Trying to encode an invalid handle for a non-nullable type.");
-        }
-        mEncoderState.byteBuffer.putInt(mBaseOffset + offset, -1);
-    }
-
-    /**
-     * Claim the given amount of memory at the end of the buffer, resizing it if needed.
-     */
-    void claimMemory(int size) {
-        mEncoderState.claimMemory(BindingsHelper.align(size));
-    }
-
-    private void encodePointerToNextUnclaimedData(int offset) {
-        encode((long) mEncoderState.dataEnd - (mBaseOffset + offset), offset);
-    }
-
-    private Encoder encoderForArray(
-            int elementSizeInByte, int length, int offset, int expectedLength) {
-        if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
-                && expectedLength != length) {
-            throw new SerializationException("Trying to encode a fixed array of incorrect length.");
-        }
-        return encoderForArrayByTotalSize(length * elementSizeInByte, length, offset);
-    }
-
-    private Encoder encoderForArrayByTotalSize(int byteSize, int length, int offset) {
-        encodePointerToNextUnclaimedData(offset);
-        return getEncoderAtDataOffset(
-                new DataHeader(DataHeader.HEADER_SIZE + byteSize, length));
-    }
-
-    private void encodeByteArray(byte[] bytes, int length, int offset) {
-        encoderForArrayByTotalSize(bytes.length, length, offset).append(bytes);
-    }
-
-    private void append(byte[] v) {
-        mEncoderState.byteBuffer.position(mBaseOffset + DataHeader.HEADER_SIZE);
-        mEncoderState.byteBuffer.put(v);
-    }
-
-    private void append(short[] v) {
-        mEncoderState.byteBuffer.position(mBaseOffset + DataHeader.HEADER_SIZE);
-        mEncoderState.byteBuffer.asShortBuffer().put(v);
-    }
-
-    private void append(int[] v) {
-        mEncoderState.byteBuffer.position(mBaseOffset + DataHeader.HEADER_SIZE);
-        mEncoderState.byteBuffer.asIntBuffer().put(v);
-    }
-
-    private void append(float[] v) {
-        mEncoderState.byteBuffer.position(mBaseOffset + DataHeader.HEADER_SIZE);
-        mEncoderState.byteBuffer.asFloatBuffer().put(v);
-    }
-
-    private void append(double[] v) {
-        mEncoderState.byteBuffer.position(mBaseOffset + DataHeader.HEADER_SIZE);
-        mEncoderState.byteBuffer.asDoubleBuffer().put(v);
-    }
-
-    private void append(long[] v) {
-        mEncoderState.byteBuffer.position(mBaseOffset + DataHeader.HEADER_SIZE);
-        mEncoderState.byteBuffer.asLongBuffer().put(v);
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java
deleted file mode 100644
index bb49cbc..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MessagePipeHandle.ReadMessageResult;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.Watcher;
-import org.chromium.mojo.system.Watcher.Callback;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executor;
-
-/**
- * A factory which provides per-thread executors, which enable execution on the thread from which
- * they were obtained.
- */
-class ExecutorFactory {
-
-    /**
-     * A null buffer which is used to send messages without any data on the PipedExecutor's
-     * signaling handles.
-     */
-    private static final ByteBuffer NOTIFY_BUFFER = null;
-
-    /**
-     * Implementation of the executor which uses a pair of {@link MessagePipeHandle} for signaling.
-     * The executor will wait asynchronously on one end of a {@link MessagePipeHandle} on the thread
-     * on which it was created. Other threads can call execute with a {@link Runnable}, and the
-     * executor will queue the {@link Runnable} and write a message on the other end of the handle.
-     * This will wake up the executor which is waiting on the handle, which will then dequeue the
-     * {@link Runnable} and execute it on the original thread.
-     */
-    private static class PipedExecutor implements Executor, Callback {
-
-        /**
-         * The handle which is written to. Access to this object must be protected with |mLock|.
-         */
-        private final MessagePipeHandle mWriteHandle;
-        /**
-         * The handle which is read from.
-         */
-        private final MessagePipeHandle mReadHandle;
-        /**
-         * The list of actions left to be run. Access to this object must be protected with |mLock|.
-         */
-        private final List<Runnable> mPendingActions;
-        /**
-         * Lock protecting access to |mWriteHandle| and |mPendingActions|.
-         */
-        private final Object mLock;
-        /**
-         * The {@link Watcher} to get notified of new message availability on |mReadHandle|.
-         */
-        private final Watcher mWatcher;
-
-        /**
-         * Constructor.
-         */
-        public PipedExecutor(Core core) {
-            mWatcher = core.getWatcher();
-            assert mWatcher != null;
-            mLock = new Object();
-            Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(
-                    new MessagePipeHandle.CreateOptions());
-            mReadHandle = handles.first;
-            mWriteHandle = handles.second;
-            mPendingActions = new ArrayList<Runnable>();
-            mWatcher.start(mReadHandle, Core.HandleSignals.READABLE, this);
-        }
-
-        /**
-         * @see Callback#onResult(int)
-         */
-        @Override
-        public void onResult(int result) {
-            if (result == MojoResult.OK && readNotifyBufferMessage()) {
-                runNextAction();
-            } else {
-                close();
-            }
-        }
-
-        /**
-         * Close the handles. Should only be called on the executor thread.
-         */
-        private void close() {
-            synchronized (mLock) {
-                mWriteHandle.close();
-                mPendingActions.clear();
-            }
-            mWatcher.cancel();
-            mWatcher.destroy();
-            mReadHandle.close();
-        }
-
-        /**
-         * Read the next message on |mReadHandle|, and return |true| if successful, |false|
-         * otherwise.
-         */
-        private boolean readNotifyBufferMessage() {
-            try {
-                ResultAnd<ReadMessageResult> readMessageResult =
-                        mReadHandle.readMessage(NOTIFY_BUFFER, 0, MessagePipeHandle.ReadFlags.NONE);
-                if (readMessageResult.getMojoResult() == MojoResult.OK) {
-                    return true;
-                }
-            } catch (MojoException e) {
-                // Will be closed by the fall back at the end of this method.
-            }
-            return false;
-        }
-
-        /**
-         * Run the next action in the |mPendingActions| queue.
-         */
-        private void runNextAction() {
-            Runnable toRun = null;
-            synchronized (mLock) {
-                toRun = mPendingActions.remove(0);
-            }
-            toRun.run();
-        }
-
-        /**
-         * Execute the given |command| in the executor thread. This can be called on any thread.
-         *
-         * @see Executor#execute(Runnable)
-         */
-        @Override
-        public void execute(Runnable command) {
-            // Accessing the write handle must be protected by the lock, because it can be closed
-            // from the executor's thread.
-            synchronized (mLock) {
-                if (!mWriteHandle.isValid()) {
-                    throw new IllegalStateException(
-                            "Trying to execute an action on a closed executor.");
-                }
-                mPendingActions.add(command);
-                mWriteHandle.writeMessage(NOTIFY_BUFFER, null, MessagePipeHandle.WriteFlags.NONE);
-            }
-        }
-    }
-
-    /**
-     * Keep one executor per executor thread.
-     */
-    private static final ThreadLocal<Executor> EXECUTORS = new ThreadLocal<Executor>();
-
-    /**
-     * Returns an {@link Executor} that will run all of its actions in the current thread.
-     */
-    public static Executor getExecutorForCurrentThread(Core core) {
-        Executor executor = EXECUTORS.get();
-        if (executor == null) {
-            executor = new PipedExecutor(core);
-            EXECUTORS.set(executor);
-        }
-        return executor;
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/HandleOwner.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/HandleOwner.java
deleted file mode 100644
index 60fc33b..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/HandleOwner.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Handle;
-
-import java.io.Closeable;
-
-/**
- * Describes a class that owns a handle.
- *
- * @param <H> The type of the owned handle.
- */
-public interface HandleOwner<H extends Handle> extends Closeable {
-
-    /**
-     * Pass the handle owned by this class.
-     */
-    public H passHandle();
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close();
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java
deleted file mode 100644
index 2699ab8..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java
+++ /dev/null
@@ -1,425 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.bindings.Callbacks.Callback1;
-import org.chromium.mojo.bindings.Interface.AbstractProxy.HandlerImpl;
-import org.chromium.mojo.bindings.interfacecontrol.QueryVersion;
-import org.chromium.mojo.bindings.interfacecontrol.RequireVersion;
-import org.chromium.mojo.bindings.interfacecontrol.RunInput;
-import org.chromium.mojo.bindings.interfacecontrol.RunMessageParams;
-import org.chromium.mojo.bindings.interfacecontrol.RunOrClosePipeInput;
-import org.chromium.mojo.bindings.interfacecontrol.RunOrClosePipeMessageParams;
-import org.chromium.mojo.bindings.interfacecontrol.RunOutput;
-import org.chromium.mojo.bindings.interfacecontrol.RunResponseMessageParams;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.Pair;
-
-import java.io.Closeable;
-
-/**
- * Base class for mojo generated interfaces.
- */
-public interface Interface extends ConnectionErrorHandler, Closeable {
-
-    /**
-     * The close method is called when the connection to the interface is closed.
-     *
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close();
-
-    /**
-     * A proxy to a mojo interface. This is base class for all generated proxies. It implements the
-     * Interface and each time a method is called, the parameters are serialized and sent to the
-     * {@link MessageReceiverWithResponder}, along with the response callback if needed.
-     */
-    public interface Proxy extends Interface {
-        /**
-         * Class allowing to interact with the proxy itself.
-         */
-        public interface Handler extends Closeable {
-            /**
-             * Sets the {@link ConnectionErrorHandler} that will be notified of errors.
-             */
-            public void setErrorHandler(ConnectionErrorHandler errorHandler);
-
-            /**
-             * Unbinds the proxy and passes the handle. Can return null if the proxy is not bound or
-             * if the proxy is not over a message pipe.
-             */
-            public MessagePipeHandle passHandle();
-
-            /**
-             * Returns the version number of the interface that the remote side supports.
-             */
-            public int getVersion();
-
-            /**
-             * Queries the max version that the remote side supports. On completion, the result will
-             * be returned as the input of |callback|. The version number of this interface pointer
-             * will also be updated.
-             */
-            public void queryVersion(Callback1<Integer> callback);
-
-            /**
-             * If the remote side doesn't support the specified version, it will close its end of
-             * the message pipe asynchronously. The call does nothing if |version| is no greater
-             * than getVersion().
-             * <p>
-             * If you make a call to requireVersion() with a version number X which is not supported
-             * by the remote side, it is guaranteed that all calls to the interface methods after
-             * requireVersion(X) will be ignored.
-             */
-            public void requireVersion(int version);
-        }
-
-        /**
-         * Returns the {@link Handler} object allowing to interact with the proxy itself.
-         */
-        public Handler getProxyHandler();
-    }
-
-    /**
-     * Base implementation of {@link Proxy}.
-     */
-    abstract class AbstractProxy implements Proxy {
-        /**
-         * Implementation of {@link Handler}.
-         */
-        protected static class HandlerImpl implements Proxy.Handler, ConnectionErrorHandler {
-            /**
-             * The {@link Core} implementation to use.
-             */
-            private final Core mCore;
-
-            /**
-             * The {@link MessageReceiverWithResponder} that will receive a serialized message for
-             * each method call.
-             */
-            private final MessageReceiverWithResponder mMessageReceiver;
-
-            /**
-             * The {@link ConnectionErrorHandler} that will be notified of errors.
-             */
-            private ConnectionErrorHandler mErrorHandler;
-
-            /**
-             * The currently known version of the interface.
-             */
-            private int mVersion;
-
-            /**
-             * Constructor.
-             *
-             * @param core the Core implementation used to create pipes and access the async waiter.
-             * @param messageReceiver the message receiver to send message to.
-             */
-            protected HandlerImpl(Core core, MessageReceiverWithResponder messageReceiver) {
-                this.mCore = core;
-                this.mMessageReceiver = messageReceiver;
-            }
-
-            void setVersion(int version) {
-                mVersion = version;
-            }
-
-            /**
-             * Returns the message receiver to send message to.
-             */
-            public MessageReceiverWithResponder getMessageReceiver() {
-                return mMessageReceiver;
-            }
-
-            /**
-             * Returns the Core implementation.
-             */
-            public Core getCore() {
-                return mCore;
-            }
-
-            /**
-             * Sets the {@link ConnectionErrorHandler} that will be notified of errors.
-             */
-            @Override
-            public void setErrorHandler(ConnectionErrorHandler errorHandler) {
-                this.mErrorHandler = errorHandler;
-            }
-
-            /**
-             * @see ConnectionErrorHandler#onConnectionError(MojoException)
-             */
-            @Override
-            public void onConnectionError(MojoException e) {
-                if (mErrorHandler != null) {
-                    mErrorHandler.onConnectionError(e);
-                }
-            }
-
-            /**
-             * @see Closeable#close()
-             */
-            @Override
-            public void close() {
-                mMessageReceiver.close();
-            }
-
-            /**
-             * @see Interface.Proxy.Handler#passHandle()
-             */
-            @Override
-            public MessagePipeHandle passHandle() {
-                @SuppressWarnings("unchecked")
-                HandleOwner<MessagePipeHandle> handleOwner =
-                        (HandleOwner<MessagePipeHandle>) mMessageReceiver;
-                return handleOwner.passHandle();
-            }
-
-            /**
-             * @see Handler#getVersion()
-             */
-            @Override
-            public int getVersion() {
-                return mVersion;
-            }
-
-            /**
-             * @see Handler#queryVersion(org.chromium.mojo.bindings.Callbacks.Callback1)
-             */
-            @Override
-            public void queryVersion(final Callback1<Integer> callback) {
-                RunMessageParams message = new RunMessageParams();
-                message.input = new RunInput();
-                message.input.setQueryVersion(new QueryVersion());
-
-                InterfaceControlMessagesHelper.sendRunMessage(getCore(), mMessageReceiver, message,
-                        new Callback1<RunResponseMessageParams>() {
-                            @Override
-                            public void call(RunResponseMessageParams response) {
-                                if (response.output != null
-                                        && response.output.which()
-                                                == RunOutput.Tag.QueryVersionResult) {
-                                    mVersion = response.output.getQueryVersionResult().version;
-                                }
-                                try {
-                                    callback.call(mVersion);
-                                } catch (RuntimeException e) {
-                                    // TODO(lhchavez): Remove this hack. See b/28986534 for details.
-                                    android.util.Log.wtf("org.chromium.mojo.bindings.Interface",
-                                            "Uncaught runtime exception", e);
-                                }
-                            }
-                        });
-            }
-
-            /**
-             * @see Handler#requireVersion(int)
-             */
-            @Override
-            public void requireVersion(int version) {
-                if (mVersion >= version) {
-                    return;
-                }
-                mVersion = version;
-                RunOrClosePipeMessageParams message = new RunOrClosePipeMessageParams();
-                message.input = new RunOrClosePipeInput();
-                message.input.setRequireVersion(new RequireVersion());
-                message.input.getRequireVersion().version = version;
-                InterfaceControlMessagesHelper.sendRunOrClosePipeMessage(
-                        getCore(), mMessageReceiver, message);
-            }
-        }
-
-        /**
-         * The handler associated with this proxy.
-         */
-        private final HandlerImpl mHandler;
-
-        protected AbstractProxy(Core core, MessageReceiverWithResponder messageReceiver) {
-            mHandler = new HandlerImpl(core, messageReceiver);
-        }
-
-        /**
-         * @see Interface#close()
-         */
-        @Override
-        public void close() {
-            mHandler.close();
-        }
-
-        /**
-         * @see Proxy#getProxyHandler()
-         */
-        @Override
-        public HandlerImpl getProxyHandler() {
-            return mHandler;
-        }
-
-        /**
-         * @see ConnectionErrorHandler#onConnectionError(org.chromium.mojo.system.MojoException)
-         */
-        @Override
-        public void onConnectionError(MojoException e) {
-            mHandler.onConnectionError(e);
-        }
-    }
-
-    /**
-     * Base implementation of Stub. Stubs are message receivers that deserialize the payload and
-     * call the appropriate method in the implementation. If the method returns result, the stub
-     * serializes the response and sends it back.
-     *
-     * @param <I> the type of the interface to delegate calls to.
-     */
-    abstract class Stub<I extends Interface> implements MessageReceiverWithResponder {
-
-        /**
-         * The {@link Core} implementation to use.
-         */
-        private final Core mCore;
-
-        /**
-         * The implementation to delegate calls to.
-         */
-        private final I mImpl;
-
-        /**
-         * Constructor.
-         *
-         * @param core the {@link Core} implementation to use.
-         * @param impl the implementation to delegate calls to.
-         */
-        public Stub(Core core, I impl) {
-            mCore = core;
-            mImpl = impl;
-        }
-
-        /**
-         * Returns the Core implementation.
-         */
-        protected Core getCore() {
-            return mCore;
-        }
-
-        /**
-         * Returns the implementation to delegate calls to.
-         */
-        protected I getImpl() {
-            return mImpl;
-        }
-
-        /**
-         * @see org.chromium.mojo.bindings.MessageReceiver#close()
-         */
-        @Override
-        public void close() {
-            mImpl.close();
-        }
-
-    }
-
-    /**
-     * The |Manager| object enables building of proxies and stubs for a given interface.
-     *
-     * @param <I> the type of the interface the manager can handle.
-     * @param <P> the type of the proxy the manager can handle. To be noted, P always extends I.
-     */
-    abstract class Manager<I extends Interface, P extends Proxy> {
-
-        /**
-         * Returns the name of the interface. This is an opaque (but human readable) identifier used
-         * by the service provider to identify services.
-         */
-        public abstract String getName();
-
-        /**
-         * Returns the version of the managed interface.
-         */
-        public abstract int getVersion();
-
-        /**
-         * Binds the given implementation to the handle.
-         */
-        public void bind(I impl, MessagePipeHandle handle) {
-            // The router (and by consequence the handle) is intentionally leaked. It will close
-            // itself when the connected handle is closed and the proxy receives the connection
-            // error.
-            Router router = new RouterImpl(handle);
-            bind(handle.getCore(), impl, router);
-            router.start();
-        }
-
-        /**
-         * Binds the given implementation to the InterfaceRequest.
-         */
-        public final void bind(I impl, InterfaceRequest<I> request) {
-            bind(impl, request.passHandle());
-        }
-
-        /**
-         * Returns a Proxy that will send messages to the given |handle|. This implies that the
-         * other end of the handle must be bound to an implementation of the interface.
-         */
-        public final P attachProxy(MessagePipeHandle handle, int version) {
-            RouterImpl router = new RouterImpl(handle);
-            P proxy = attachProxy(handle.getCore(), router);
-            DelegatingConnectionErrorHandler handlers = new DelegatingConnectionErrorHandler();
-            handlers.addConnectionErrorHandler(proxy);
-            router.setErrorHandler(handlers);
-            router.start();
-            ((HandlerImpl) proxy.getProxyHandler()).setVersion(version);
-            return proxy;
-        }
-
-        /**
-         * Constructs a new |InterfaceRequest| for the interface. This method returns a Pair where
-         * the first element is a proxy, and the second element is the request. The proxy can be
-         * used immediately.
-         */
-        public final Pair<P, InterfaceRequest<I>> getInterfaceRequest(Core core) {
-            Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-            P proxy = attachProxy(handles.first, 0);
-            return Pair.create(proxy, new InterfaceRequest<I>(handles.second));
-        }
-
-        public final InterfaceRequest<I> asInterfaceRequest(MessagePipeHandle handle) {
-            return new InterfaceRequest<I>(handle);
-        }
-
-        /**
-         * Binds the implementation to the given |router|.
-         */
-        final void bind(Core core, I impl, Router router) {
-            router.setErrorHandler(impl);
-            router.setIncomingMessageReceiver(buildStub(core, impl));
-        }
-
-        /**
-         * Returns a Proxy that will send messages to the given |router|.
-         */
-        final P attachProxy(Core core, Router router) {
-            return buildProxy(core, new AutoCloseableRouter(core, router));
-        }
-
-        /**
-         * Creates a new array of the given |size|.
-         */
-        protected abstract I[] buildArray(int size);
-
-        /**
-         * Constructs a Stub delegating to the given implementation.
-         */
-        protected abstract Stub<I> buildStub(Core core, I impl);
-
-        /**
-         * Constructs a Proxy forwarding the calls to the given message receiver.
-         */
-        protected abstract P buildProxy(Core core, MessageReceiverWithResponder messageReceiver);
-
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java
deleted file mode 100644
index 51f543d..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.bindings.Callbacks.Callback1;
-import org.chromium.mojo.bindings.Interface.Manager;
-import org.chromium.mojo.bindings.Interface.Proxy;
-import org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants;
-import org.chromium.mojo.bindings.interfacecontrol.QueryVersionResult;
-import org.chromium.mojo.bindings.interfacecontrol.RunInput;
-import org.chromium.mojo.bindings.interfacecontrol.RunMessageParams;
-import org.chromium.mojo.bindings.interfacecontrol.RunOrClosePipeInput;
-import org.chromium.mojo.bindings.interfacecontrol.RunOrClosePipeMessageParams;
-import org.chromium.mojo.bindings.interfacecontrol.RunOutput;
-import org.chromium.mojo.bindings.interfacecontrol.RunResponseMessageParams;
-import org.chromium.mojo.system.Core;
-
-/**
- * Helper class to handle interface control messages. See
- * mojo/public/interfaces/bindings/interface_control_messages.mojom.
- */
-public class InterfaceControlMessagesHelper {
-    /**
-     * MessageReceiver that forwards a message containing a {@link RunResponseMessageParams} to a
-     * callback.
-     */
-    private static class RunResponseForwardToCallback
-            extends SideEffectFreeCloseable implements MessageReceiver {
-        private final Callback1<RunResponseMessageParams> mCallback;
-
-        RunResponseForwardToCallback(Callback1<RunResponseMessageParams> callback) {
-            mCallback = callback;
-        }
-
-        /**
-         * @see MessageReceiver#accept(Message)
-         */
-        @Override
-        public boolean accept(Message message) {
-            RunResponseMessageParams response =
-                    RunResponseMessageParams.deserialize(message.asServiceMessage().getPayload());
-            mCallback.call(response);
-            return true;
-        }
-    }
-
-    /**
-     * Sends the given run message through the receiver, registering the callback.
-     */
-    public static void sendRunMessage(Core core, MessageReceiverWithResponder receiver,
-            RunMessageParams params, Callback1<RunResponseMessageParams> callback) {
-        Message message = params.serializeWithHeader(
-                core, new MessageHeader(InterfaceControlMessagesConstants.RUN_MESSAGE_ID,
-                        MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, 0));
-        receiver.acceptWithResponder(message, new RunResponseForwardToCallback(callback));
-    }
-
-    /**
-     * Sends the given run or close pipe message through the receiver.
-     */
-    public static void sendRunOrClosePipeMessage(
-            Core core, MessageReceiverWithResponder receiver, RunOrClosePipeMessageParams params) {
-        Message message = params.serializeWithHeader(core,
-                new MessageHeader(InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID));
-        receiver.accept(message);
-    }
-
-    /**
-     * Handles a received run message.
-     */
-    public static <I extends Interface, P extends Proxy> boolean handleRun(
-            Core core, Manager<I, P> manager, ServiceMessage message, MessageReceiver responder) {
-        Message payload = message.getPayload();
-        RunMessageParams query = RunMessageParams.deserialize(payload);
-        RunResponseMessageParams response = new RunResponseMessageParams();
-        response.output = new RunOutput();
-        if (query.input.which() == RunInput.Tag.QueryVersion) {
-            response.output.setQueryVersionResult(new QueryVersionResult());
-            response.output.getQueryVersionResult().version = manager.getVersion();
-        } else {
-            response.output = null;
-        }
-
-        return responder.accept(response.serializeWithHeader(
-                core, new MessageHeader(InterfaceControlMessagesConstants.RUN_MESSAGE_ID,
-                        MessageHeader.MESSAGE_IS_RESPONSE_FLAG,
-                        message.getHeader().getRequestId())));
-    }
-
-    /**
-     * Handles a received run or close pipe message. Closing the pipe is handled by returning
-     * |false|.
-     */
-    public static <I extends Interface, P extends Proxy> boolean handleRunOrClosePipe(
-            Manager<I, P> manager, ServiceMessage message) {
-        Message payload = message.getPayload();
-        RunOrClosePipeMessageParams query = RunOrClosePipeMessageParams.deserialize(payload);
-        if (query.input.which() == RunOrClosePipeInput.Tag.RequireVersion) {
-            return query.input.getRequireVersion().version <= manager.getVersion();
-        }
-        return false;
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceRequest.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceRequest.java
deleted file mode 100644
index 61899b4..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceRequest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.MessagePipeHandle;
-
-/**
- * One end of the message pipe representing a request to create an implementation to be bound to it.
- * The other end of the pipe is bound to a proxy, which can be used immediately, while the
- * InterfaceRequest is being sent.
- * <p>
- * InterfaceRequest are built using |Interface.Manager|.
- *
- * @param <P> the type of the remote interface proxy.
- */
-public class InterfaceRequest<P extends Interface> implements HandleOwner<MessagePipeHandle> {
-
-    /**
-     * The handle which will be sent and will be connected to the implementation.
-     */
-    private final MessagePipeHandle mHandle;
-
-    /**
-     * Constructor.
-     *
-     * @param handle the handle which will be sent and will be connected to the implementation.
-     */
-    InterfaceRequest(MessagePipeHandle handle) {
-        mHandle = handle;
-    }
-
-    /**
-     * @see HandleOwner#passHandle()
-     */
-    @Override
-    public MessagePipeHandle passHandle() {
-        return mHandle.pass();
-    }
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close() {
-        mHandle.close();
-    }
-
-    /**
-     * Returns an {@link InterfaceRequest} that wraps the given handle. This method is not type safe
-     * and should be avoided unless absolutely necessary.
-     */
-    @SuppressWarnings("rawtypes")
-    public static InterfaceRequest asInterfaceRequestUnsafe(MessagePipeHandle handle) {
-        return new InterfaceRequest(handle);
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Message.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Message.java
deleted file mode 100644
index 996c457..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Message.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-
-/**
- * A raw message to be sent/received from a {@link MessagePipeHandle}. Note that this can contain
- * any data, not necessarily a Mojo message with a proper header. See also {@link ServiceMessage}.
- */
-public class Message {
-
-    /**
-     * The data of the message.
-     */
-    private final ByteBuffer mBuffer;
-
-    /**
-     * The handles of the message.
-     */
-    private final List<? extends Handle> mHandle;
-
-    /**
-     * This message interpreted as a message for a mojo service with an appropriate header.
-     */
-    private ServiceMessage mWithHeader;
-
-    /**
-     * Constructor.
-     *
-     * @param buffer The buffer containing the bytes to send. This must be a direct buffer.
-     * @param handles The list of handles to send.
-     */
-    public Message(ByteBuffer buffer, List<? extends Handle> handles) {
-        assert buffer.isDirect();
-        mBuffer = buffer;
-        mHandle = handles;
-    }
-
-    /**
-     * The data of the message.
-     */
-    public ByteBuffer getData() {
-        return mBuffer;
-    }
-
-    /**
-     * The handles of the message.
-     */
-    public List<? extends Handle> getHandles() {
-        return mHandle;
-    }
-
-    /**
-     * Returns the message interpreted as a message for a mojo service.
-     */
-    public ServiceMessage asServiceMessage() {
-        if (mWithHeader == null) {
-            mWithHeader = new ServiceMessage(this);
-        }
-        return mWithHeader;
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageHeader.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageHeader.java
deleted file mode 100644
index 771d22b..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageHeader.java
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import java.nio.ByteBuffer;
-
-/**
- * Header information for a message.
- */
-public class MessageHeader {
-
-    private static final int SIMPLE_MESSAGE_SIZE = 24;
-    private static final int SIMPLE_MESSAGE_VERSION = 0;
-    private static final DataHeader SIMPLE_MESSAGE_STRUCT_INFO =
-            new DataHeader(SIMPLE_MESSAGE_SIZE, SIMPLE_MESSAGE_VERSION);
-
-    private static final int MESSAGE_WITH_REQUEST_ID_SIZE = 32;
-    private static final int MESSAGE_WITH_REQUEST_ID_VERSION = 1;
-    private static final DataHeader MESSAGE_WITH_REQUEST_ID_STRUCT_INFO =
-            new DataHeader(MESSAGE_WITH_REQUEST_ID_SIZE, MESSAGE_WITH_REQUEST_ID_VERSION);
-
-    private static final int INTERFACE_ID_OFFSET = 8;
-    private static final int TYPE_OFFSET = 12;
-    private static final int FLAGS_OFFSET = 16;
-    private static final int REQUEST_ID_OFFSET = 24;
-
-    /**
-     * Flag for a header of a simple message.
-     */
-    public static final int NO_FLAG = 0;
-
-    /**
-     * Flag for a header of a message that expected a response.
-     */
-    public static final int MESSAGE_EXPECTS_RESPONSE_FLAG = 1 << 0;
-
-    /**
-     * Flag for a header of a message that is a response.
-     */
-    public static final int MESSAGE_IS_RESPONSE_FLAG = 1 << 1;
-
-    private final DataHeader mDataHeader;
-    private final int mType;
-    private final int mFlags;
-    private long mRequestId;
-
-    /**
-     * Constructor for the header of a message which does not have a response.
-     */
-    public MessageHeader(int type) {
-        mDataHeader = SIMPLE_MESSAGE_STRUCT_INFO;
-        mType = type;
-        mFlags = 0;
-        mRequestId = 0;
-    }
-
-    /**
-     * Constructor for the header of a message which have a response or being itself a response.
-     */
-    public MessageHeader(int type, int flags, long requestId) {
-        assert mustHaveRequestId(flags);
-        mDataHeader = MESSAGE_WITH_REQUEST_ID_STRUCT_INFO;
-        mType = type;
-        mFlags = flags;
-        mRequestId = requestId;
-    }
-
-    /**
-     * Constructor, parsing the header from a message. Should only be used by {@link Message}
-     * itself.
-     */
-    MessageHeader(Message message) {
-        Decoder decoder = new Decoder(message);
-        mDataHeader = decoder.readDataHeader();
-        validateDataHeader(mDataHeader);
-
-        // Currently associated interfaces are not supported.
-        int interfaceId = decoder.readInt(INTERFACE_ID_OFFSET);
-        if (interfaceId != 0) {
-          throw new DeserializationException("Non-zero interface ID, expecting zero since "
-                  + "associated interfaces are not yet supported.");
-        }
-
-        mType = decoder.readInt(TYPE_OFFSET);
-        mFlags = decoder.readInt(FLAGS_OFFSET);
-        if (mustHaveRequestId(mFlags)) {
-            if (mDataHeader.size < MESSAGE_WITH_REQUEST_ID_SIZE) {
-                throw new DeserializationException("Incorrect message size, expecting at least "
-                        + MESSAGE_WITH_REQUEST_ID_SIZE
-                        + " for a message with a request identifier, but got: " + mDataHeader.size);
-
-            }
-            mRequestId = decoder.readLong(REQUEST_ID_OFFSET);
-        } else {
-            mRequestId = 0;
-        }
-    }
-
-    /**
-     * Returns the size in bytes of the serialization of the header.
-     */
-    public int getSize() {
-        return mDataHeader.size;
-    }
-
-    /**
-     * Returns the type of the message.
-     */
-    public int getType() {
-        return mType;
-    }
-
-    /**
-     * Returns the flags associated to the message.
-     */
-    public int getFlags() {
-        return mFlags;
-    }
-
-    /**
-     * Returns if the message has the given flag.
-     */
-    public boolean hasFlag(int flag) {
-        return (mFlags & flag) == flag;
-    }
-
-    /**
-     * Returns if the message has a request id.
-     */
-    public boolean hasRequestId() {
-        return mustHaveRequestId(mFlags);
-    }
-
-    /**
-     * Return the request id for the message. Must only be called if the message has a request id.
-     */
-    public long getRequestId() {
-        assert hasRequestId();
-        return mRequestId;
-    }
-
-    /**
-     * Encode the header.
-     */
-    public void encode(Encoder encoder) {
-        encoder.encode(mDataHeader);
-        // Set the interface ID field to 0.
-        encoder.encode(0, INTERFACE_ID_OFFSET);
-        encoder.encode(getType(), TYPE_OFFSET);
-        encoder.encode(getFlags(), FLAGS_OFFSET);
-        if (hasRequestId()) {
-            encoder.encode(getRequestId(), REQUEST_ID_OFFSET);
-        }
-    }
-
-    /**
-     * Returns true if the header has the expected flags. Only considers flags this class knows
-     * about in order to allow this class to work with future version of the header format.
-     */
-    public boolean validateHeader(int expectedFlags) {
-        int knownFlags = getFlags() & (MESSAGE_EXPECTS_RESPONSE_FLAG | MESSAGE_IS_RESPONSE_FLAG);
-        return knownFlags == expectedFlags;
-    }
-
-    /**
-     * Returns true if the header has the expected type and flags. Only consider flags this class
-     * knows about in order to allow this class to work with future version of the header format.
-     */
-    public boolean validateHeader(int expectedType, int expectedFlags) {
-        return getType() == expectedType && validateHeader(expectedFlags);
-    }
-
-    /**
-     * @see Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((mDataHeader == null) ? 0 : mDataHeader.hashCode());
-        result = prime * result + mFlags;
-        result = prime * result + (int) (mRequestId ^ (mRequestId >>> 32));
-        result = prime * result + mType;
-        return result;
-    }
-
-    /**
-     * @see Object#equals(Object)
-     */
-    @Override
-    public boolean equals(Object object) {
-        if (object == this) return true;
-        if (object == null) return false;
-        if (getClass() != object.getClass()) return false;
-
-        MessageHeader other = (MessageHeader) object;
-        return (BindingsHelper.equals(mDataHeader, other.mDataHeader)
-                && mFlags == other.mFlags
-                && mRequestId == other.mRequestId
-                && mType == other.mType);
-    }
-
-    /**
-     * Set the request id on the message contained in the given buffer.
-     */
-    void setRequestId(ByteBuffer buffer, long requestId) {
-        assert mustHaveRequestId(buffer.getInt(FLAGS_OFFSET));
-        buffer.putLong(REQUEST_ID_OFFSET, requestId);
-        mRequestId = requestId;
-    }
-
-    /**
-     * Returns whether a message with the given flags must have a request Id.
-     */
-    private static boolean mustHaveRequestId(int flags) {
-        return (flags & (MESSAGE_EXPECTS_RESPONSE_FLAG | MESSAGE_IS_RESPONSE_FLAG)) != 0;
-    }
-
-    /**
-     * Validate that the given {@link DataHeader} can be the data header of a message header.
-     */
-    private static void validateDataHeader(DataHeader dataHeader) {
-        if (dataHeader.elementsOrVersion < SIMPLE_MESSAGE_VERSION) {
-            throw new DeserializationException("Incorrect number of fields, expecting at least "
-                    + SIMPLE_MESSAGE_VERSION + ", but got: " + dataHeader.elementsOrVersion);
-        }
-        if (dataHeader.size < SIMPLE_MESSAGE_SIZE) {
-            throw new DeserializationException(
-                    "Incorrect message size, expecting at least " + SIMPLE_MESSAGE_SIZE
-                    + ", but got: " + dataHeader.size);
-        }
-        if (dataHeader.elementsOrVersion == SIMPLE_MESSAGE_VERSION
-                && dataHeader.size != SIMPLE_MESSAGE_SIZE) {
-            throw new DeserializationException("Incorrect message size for a message with "
-                    + SIMPLE_MESSAGE_VERSION + " fields, expecting " + SIMPLE_MESSAGE_SIZE
-                    + ", but got: " + dataHeader.size);
-        }
-        if (dataHeader.elementsOrVersion == MESSAGE_WITH_REQUEST_ID_VERSION
-                && dataHeader.size != MESSAGE_WITH_REQUEST_ID_SIZE) {
-            throw new DeserializationException("Incorrect message size for a message with "
-                    + MESSAGE_WITH_REQUEST_ID_VERSION + " fields, expecting "
-                    + MESSAGE_WITH_REQUEST_ID_SIZE + ", but got: " + dataHeader.size);
-        }
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageReceiver.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageReceiver.java
deleted file mode 100644
index 4223297..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageReceiver.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import java.io.Closeable;
-
-/**
- * A class which implements this interface can receive {@link Message} objects.
- */
-public interface MessageReceiver extends Closeable {
-
-    /**
-     * Receive a {@link Message}. The {@link MessageReceiver} is allowed to mutate the message.
-     * Returns |true| if the message has been handled, |false| otherwise.
-     */
-    boolean accept(Message message);
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close();
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageReceiverWithResponder.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageReceiverWithResponder.java
deleted file mode 100644
index e24a558..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageReceiverWithResponder.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-/**
- * A {@link MessageReceiver} that can also handle the handle the response message generated from the
- * given message.
- */
-public interface MessageReceiverWithResponder extends MessageReceiver {
-
-    /**
-     * A variant on {@link #accept(Message)} that registers a {@link MessageReceiver}
-     * (known as the responder) to handle the response message generated from the given message. The
-     * responder's {@link #accept(Message)} method may be called as part of the call to
-     * {@link #acceptWithResponder(Message, MessageReceiver)}, or some time after its
-     * return.
-     */
-    boolean acceptWithResponder(Message message, MessageReceiver responder);
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Router.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Router.java
deleted file mode 100644
index ba19ae5..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Router.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.MessagePipeHandle;
-
-/**
- * A {@link Router} will handle mojo message and forward those to a {@link Connector}. It deals with
- * parsing of headers and adding of request ids in order to be able to match a response to a
- * request.
- */
-public interface Router extends MessageReceiverWithResponder, HandleOwner<MessagePipeHandle> {
-
-    /**
-     * Start listening for incoming messages.
-     */
-    public void start();
-
-    /**
-     * Set the {@link MessageReceiverWithResponder} that will deserialize and use the message
-     * received from the pipe.
-     */
-    public void setIncomingMessageReceiver(MessageReceiverWithResponder incomingMessageReceiver);
-
-    /**
-     * Set the handle that will be notified of errors on the message pipe.
-     */
-    public void setErrorHandler(ConnectionErrorHandler errorHandler);
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java
deleted file mode 100644
index aebc9e2..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.annotation.SuppressLint;
-
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.Watcher;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.Executor;
-
-/**
- * Implementation of {@link Router}.
- */
-@SuppressLint("UseSparseArrays")  // https://crbug.com/600699
-public class RouterImpl implements Router {
-
-    /**
-     * {@link MessageReceiver} used as the {@link Connector} callback.
-     */
-    private class HandleIncomingMessageThunk implements MessageReceiver {
-
-        /**
-         * @see MessageReceiver#accept(Message)
-         */
-        @Override
-        public boolean accept(Message message) {
-            return handleIncomingMessage(message);
-        }
-
-        /**
-         * @see MessageReceiver#close()
-         */
-        @Override
-        public void close() {
-            handleConnectorClose();
-        }
-
-    }
-
-    /**
-     *
-     * {@link MessageReceiver} used to return responses to the caller.
-     */
-    class ResponderThunk implements MessageReceiver {
-        private boolean mAcceptWasInvoked;
-
-        /**
-         * @see
-         * MessageReceiver#accept(Message)
-         */
-        @Override
-        public boolean accept(Message message) {
-            mAcceptWasInvoked = true;
-            return RouterImpl.this.accept(message);
-        }
-
-        /**
-         * @see MessageReceiver#close()
-         */
-        @Override
-        public void close() {
-            RouterImpl.this.close();
-        }
-
-        @Override
-        protected void finalize() throws Throwable {
-            if (!mAcceptWasInvoked) {
-                // We close the pipe here as a way of signaling to the calling application that an
-                // error condition occurred. Without this the calling application would have no
-                // way of knowing it should stop waiting for a response.
-                RouterImpl.this.closeOnHandleThread();
-            }
-            super.finalize();
-        }
-    }
-
-    /**
-     * The {@link Connector} which is connected to the handle.
-     */
-    private final Connector mConnector;
-
-    /**
-     * The {@link MessageReceiverWithResponder} that will consume the messages received from the
-     * pipe.
-     */
-    private MessageReceiverWithResponder mIncomingMessageReceiver;
-
-    /**
-     * The next id to use for a request id which needs a response. It is auto-incremented.
-     */
-    private long mNextRequestId = 1;
-
-    /**
-     * The map from request ids to {@link MessageReceiver} of request currently in flight.
-     */
-    private Map<Long, MessageReceiver> mResponders = new HashMap<Long, MessageReceiver>();
-
-    /**
-     * An Executor that will run on the thread associated with the MessagePipe to which
-     * this Router is bound. This may be {@code Null} if the MessagePipeHandle passed
-     * in to the constructor is not valid.
-     */
-    private final Executor mExecutor;
-
-    /**
-     * Constructor that will use the default {@link Watcher}.
-     *
-     * @param messagePipeHandle The {@link MessagePipeHandle} to route message for.
-     */
-    public RouterImpl(MessagePipeHandle messagePipeHandle) {
-        this(messagePipeHandle, BindingsHelper.getWatcherForHandle(messagePipeHandle));
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param messagePipeHandle The {@link MessagePipeHandle} to route message for.
-     * @param watcher the {@link Watcher} to use to get notification of new messages on the
-     *            handle.
-     */
-    public RouterImpl(MessagePipeHandle messagePipeHandle, Watcher watcher) {
-        mConnector = new Connector(messagePipeHandle, watcher);
-        mConnector.setIncomingMessageReceiver(new HandleIncomingMessageThunk());
-        Core core = messagePipeHandle.getCore();
-        if (core != null) {
-            mExecutor = ExecutorFactory.getExecutorForCurrentThread(core);
-        } else {
-            mExecutor = null;
-        }
-    }
-
-    /**
-     * @see org.chromium.mojo.bindings.Router#start()
-     */
-    @Override
-    public void start() {
-        mConnector.start();
-    }
-
-    /**
-     * @see Router#setIncomingMessageReceiver(MessageReceiverWithResponder)
-     */
-    @Override
-    public void setIncomingMessageReceiver(MessageReceiverWithResponder incomingMessageReceiver) {
-        this.mIncomingMessageReceiver = incomingMessageReceiver;
-    }
-
-    /**
-     * @see MessageReceiver#accept(Message)
-     */
-    @Override
-    public boolean accept(Message message) {
-        // A message without responder is directly forwarded to the connector.
-        return mConnector.accept(message);
-    }
-
-    /**
-     * @see MessageReceiverWithResponder#acceptWithResponder(Message, MessageReceiver)
-     */
-    @Override
-    public boolean acceptWithResponder(Message message, MessageReceiver responder) {
-        // The message must have a header.
-        ServiceMessage messageWithHeader = message.asServiceMessage();
-        // Checking the message expects a response.
-        assert messageWithHeader.getHeader().hasFlag(MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG);
-
-        // Compute a request id for being able to route the response.
-        // TODO(lhchavez): Remove this hack. See b/28986534 for details.
-        synchronized (mResponders) {
-            long requestId = mNextRequestId++;
-            // Reserve 0 in case we want it to convey special meaning in the future.
-            if (requestId == 0) {
-                requestId = mNextRequestId++;
-            }
-            if (mResponders.containsKey(requestId)) {
-                throw new IllegalStateException("Unable to find a new request identifier.");
-            }
-            messageWithHeader.setRequestId(requestId);
-            if (!mConnector.accept(messageWithHeader)) {
-                return false;
-            }
-            // Only keep the responder is the message has been accepted.
-            mResponders.put(requestId, responder);
-        }
-        return true;
-    }
-
-    /**
-     * @see org.chromium.mojo.bindings.HandleOwner#passHandle()
-     */
-    @Override
-    public MessagePipeHandle passHandle() {
-        return mConnector.passHandle();
-    }
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close() {
-        mConnector.close();
-    }
-
-    /**
-     * @see Router#setErrorHandler(ConnectionErrorHandler)
-     */
-    @Override
-    public void setErrorHandler(ConnectionErrorHandler errorHandler) {
-        mConnector.setErrorHandler(errorHandler);
-    }
-
-    /**
-     * Receive a message from the connector. Returns |true| if the message has been handled.
-     */
-    private boolean handleIncomingMessage(Message message) {
-        MessageHeader header = message.asServiceMessage().getHeader();
-        if (header.hasFlag(MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG)) {
-            if (mIncomingMessageReceiver != null) {
-                return mIncomingMessageReceiver.acceptWithResponder(message, new ResponderThunk());
-            }
-            // If we receive a request expecting a response when the client is not
-            // listening, then we have no choice but to tear down the pipe.
-            close();
-            return false;
-        } else if (header.hasFlag(MessageHeader.MESSAGE_IS_RESPONSE_FLAG)) {
-            long requestId = header.getRequestId();
-            MessageReceiver responder;
-            // TODO(lhchavez): Remove this hack. See b/28986534 for details.
-            synchronized (mResponders) {
-                responder = mResponders.get(requestId);
-                if (responder == null) {
-                    return false;
-                }
-                mResponders.remove(requestId);
-            }
-            return responder.accept(message);
-        } else {
-            if (mIncomingMessageReceiver != null) {
-                return mIncomingMessageReceiver.accept(message);
-            }
-            // OK to drop the message.
-        }
-        return false;
-    }
-
-    private void handleConnectorClose() {
-        if (mIncomingMessageReceiver != null) {
-            mIncomingMessageReceiver.close();
-        }
-    }
-
-    /**
-     * Invokes {@link #close()} asynchronously on the thread associated with
-     * this Router's Handle. If this Router was constructed with an invalid
-     * handle then this method does nothing.
-     */
-    private void closeOnHandleThread() {
-        if (mExecutor != null) {
-            mExecutor.execute(new Runnable() {
-
-                @Override
-                public void run() {
-                    close();
-                }
-            });
-        }
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/SerializationException.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/SerializationException.java
deleted file mode 100644
index d4f5502..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/SerializationException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-/**
- * Error that can be thrown when serializing a mojo message.
- */
-public class SerializationException extends RuntimeException {
-
-    /**
-     * Constructs a new serialization exception with the specified detail message.
-     */
-    public SerializationException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructs a new serialization exception with the specified cause.
-     */
-    public SerializationException(Exception cause) {
-        super(cause);
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ServiceMessage.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ServiceMessage.java
deleted file mode 100644
index 313dc6a..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ServiceMessage.java
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Represents a {@link Message} which contains a {@link MessageHeader}. Deals with parsing the
- * {@link MessageHeader} for a message.
- */
-public class ServiceMessage extends Message {
-
-    private final MessageHeader mHeader;
-    private Message mPayload;
-
-    /**
-     * Reinterpret the given |message| as a message with the given |header|. The |message| must
-     * contain the |header| as the start of its raw data.
-     */
-    public ServiceMessage(Message baseMessage, MessageHeader header) {
-        super(baseMessage.getData(), baseMessage.getHandles());
-        assert header.equals(new org.chromium.mojo.bindings.MessageHeader(baseMessage));
-        this.mHeader = header;
-    }
-
-    /**
-     * Reinterpret the given |message| as a message with a header. The |message| must contain a
-     * header as the start of it's raw data, which will be parsed by this constructor.
-     */
-    ServiceMessage(Message baseMessage) {
-        this(baseMessage, new org.chromium.mojo.bindings.MessageHeader(baseMessage));
-    }
-
-    /**
-     * @see Message#asServiceMessage()
-     */
-    @Override
-    public ServiceMessage asServiceMessage() {
-        return this;
-    }
-
-    /**
-     * Returns the header of the given message. This will throw a {@link DeserializationException}
-     * if the start of the message is not a valid header.
-     */
-    public MessageHeader getHeader() {
-        return mHeader;
-    }
-
-    /**
-     * Returns the payload of the message.
-     */
-    public Message getPayload() {
-        if (mPayload == null) {
-            ByteBuffer truncatedBuffer =
-                    ((ByteBuffer) getData().position(getHeader().getSize())).slice();
-            truncatedBuffer.order(ByteOrder.LITTLE_ENDIAN);
-            mPayload = new Message(truncatedBuffer, getHandles());
-        }
-        return mPayload;
-    }
-
-    /**
-     * Set the request identifier on the message.
-     */
-    void setRequestId(long requestId) {
-        mHeader.setRequestId(getData(), requestId);
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/SideEffectFreeCloseable.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/SideEffectFreeCloseable.java
deleted file mode 100644
index 118c991..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/SideEffectFreeCloseable.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import java.io.Closeable;
-
-/**
- * An implementation of closeable that doesn't do anything.
- */
-public class SideEffectFreeCloseable implements Closeable {
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close() {
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Struct.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Struct.java
deleted file mode 100644
index 14f4e1e..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Struct.java
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Core;
-
-import java.nio.ByteBuffer;
-
-/**
- * Base class for all mojo structs.
- */
-public abstract class Struct {
-    /**
-     * The base size of the encoded struct.
-     */
-    private final int mEncodedBaseSize;
-
-    /**
-     * The version of the struct.
-     */
-    private final int mVersion;
-
-    /**
-     * Constructor.
-     */
-    protected Struct(int encodedBaseSize, int version) {
-        mEncodedBaseSize = encodedBaseSize;
-        mVersion = version;
-    }
-
-    /**
-     * Returns the version of the struct. It is the max version of the struct in the mojom if it has
-     * been created locally, and the version of the received struct if it has been deserialized.
-     */
-    public int getVersion() {
-        return mVersion;
-    }
-
-    /**
-     * Returns the serialization of the struct. This method can close Handles.
-     *
-     * @param core the |Core| implementation used to generate handles. Only used if the data
-     *            structure being encoded contains interfaces, can be |null| otherwise.
-     */
-    public Message serialize(Core core) {
-        Encoder encoder = new Encoder(core, mEncodedBaseSize);
-        encode(encoder);
-        return encoder.getMessage();
-    }
-
-    /**
-     * Similar to the method above, but returns the serialization result as |ByteBuffer|.
-     *
-     * @throws UnsupportedOperationException if the struct contains interfaces or handles.
-     * @throws SerializationException on serialization failure.
-     */
-    public ByteBuffer serialize() {
-        // If the struct contains interfaces which require a non-null |Core| instance, it will throw
-        // UnsupportedOperationException.
-        Message message = serialize(null);
-
-        if (!message.getHandles().isEmpty())
-            throw new UnsupportedOperationException("Handles are discarded.");
-
-        return message.getData();
-    }
-
-    /**
-     * Returns the serialization of the struct prepended with the given header.
-     *
-     * @param header the header to prepend to the returned message.
-     * @param core the |Core| implementation used to generate handles. Only used if the |Struct|
-     *            being encoded contains interfaces, can be |null| otherwise.
-     */
-    public ServiceMessage serializeWithHeader(Core core, MessageHeader header) {
-        Encoder encoder = new Encoder(core, mEncodedBaseSize + header.getSize());
-        header.encode(encoder);
-        encode(encoder);
-        return new ServiceMessage(encoder.getMessage(), header);
-    }
-
-    /**
-     * Use the given encoder to serialize this data structure.
-     */
-    protected abstract void encode(Encoder encoder);
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Union.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Union.java
deleted file mode 100644
index 90b40ea..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Union.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Core;
-
-/**
- * Base class for all mojo unions.
- */
-public abstract class Union {
-    /**
-     * Returns the serialization of the union. This method can close Handles.
-     *
-     * @param core the |Core| implementation used to generate handles. Only used if the data
-     *            structure being encoded contains interfaces, can be |null| otherwise.
-     */
-    public Message serialize(Core core) {
-        Encoder encoder = new Encoder(core, BindingsHelper.UNION_SIZE);
-        encoder.claimMemory(16);
-        encode(encoder, 0);
-        return encoder.getMessage();
-    }
-
-    /**
-     * Serializes this data structure using the given encoder.
-     */
-    protected abstract void encode(Encoder encoder, int offset);
-}
diff --git a/mojo/public/java/system/README.md b/mojo/public/java/system/README.md
deleted file mode 100644
index 3213e4c..0000000
--- a/mojo/public/java/system/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo Java System API
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-
-This document provides a brief guide to Java Mojo bindings usage with example
-code snippets.
-
-For a detailed API references please consult the class definitions in
-[this directory](https://cs.chromium.org/chromium/src/mojo/public/java/system/src/org/chromium/mojo/system/).
-
-*TODO: Make the contents of this document less non-existent.*
-
-## Message Pipes
-
-## Data Pipes
-
-## Shared Buffers
-
-## Native Platform Handles (File Descriptors, Windows Handles, *etc.*)
-
-## Watchers
-
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/Core.java b/mojo/public/java/system/src/org/chromium/mojo/system/Core.java
deleted file mode 100644
index 40e4be3..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/Core.java
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-/**
- * Core mojo interface giving access to the base operations. See |src/mojo/public/c/system/core.h|
- * for the underlying api.
- */
-public interface Core {
-
-    /**
-     * Used to indicate an infinite deadline (timeout).
-     */
-    public static final long DEADLINE_INFINITE = -1;
-
-    /**
-     * Signals for the wait operations on handles.
-     */
-    public static class HandleSignals extends Flags<HandleSignals> {
-        /**
-         * Constructor.
-         *
-         * @param signals the serialized signals.
-         */
-        public HandleSignals(int signals) {
-            super(signals);
-        }
-
-        private static final int FLAG_NONE = 0;
-        private static final int FLAG_READABLE = 1 << 0;
-        private static final int FLAG_WRITABLE = 1 << 1;
-        private static final int FLAG_PEER_CLOSED = 1 << 2;
-
-        /**
-         * Immutable signals.
-         */
-        public static final HandleSignals NONE = HandleSignals.none().immutable();
-        public static final HandleSignals READABLE =
-                HandleSignals.none().setReadable(true).immutable();
-        public static final HandleSignals WRITABLE =
-                HandleSignals.none().setWritable(true).immutable();
-
-        /**
-         * Change the readable bit of this signal.
-         *
-         * @param readable the new value of the readable bit.
-         * @return this.
-         */
-        public HandleSignals setReadable(boolean readable) {
-            return setFlag(FLAG_READABLE, readable);
-        }
-
-        /**
-         * Change the writable bit of this signal.
-         *
-         * @param writable the new value of the writable bit.
-         * @return this.
-         */
-        public HandleSignals setWritable(boolean writable) {
-            return setFlag(FLAG_WRITABLE, writable);
-        }
-
-        /**
-         * Change the peer closed bit of this signal.
-         *
-         * @param peerClosed the new value of the peer closed bit.
-         * @return this.
-         */
-        public HandleSignals setPeerClosed(boolean peerClosed) {
-            return setFlag(FLAG_PEER_CLOSED, peerClosed);
-        }
-
-        /**
-         * Returns a signal with no bit set.
-         */
-        public static HandleSignals none() {
-            return new HandleSignals(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Returns a platform-dependent monotonically increasing tick count representing "right now."
-     */
-    public long getTimeTicksNow();
-
-    /**
-     * Returned by wait functions to indicate the signaling state of handles.
-     */
-    public static class HandleSignalsState {
-        /**
-         * Signals that were satisfied at some time // before the call returned.
-         */
-        private final HandleSignals mSatisfiedSignals;
-
-        /**
-         * Signals that are possible to satisfy. For example, if the return value was
-         * |MOJO_RESULT_FAILED_PRECONDITION|, you can use this field to determine which, if any, of
-         * the signals can still be satisfied.
-         */
-        private final HandleSignals mSatisfiableSignals;
-
-        /**
-         * Constructor.
-         */
-        public HandleSignalsState(
-                HandleSignals satisfiedSignals, HandleSignals satisfiableSignals) {
-            mSatisfiedSignals = satisfiedSignals;
-            mSatisfiableSignals = satisfiableSignals;
-        }
-
-        /**
-         * Returns the satisfiedSignals.
-         */
-        public HandleSignals getSatisfiedSignals() {
-            return mSatisfiedSignals;
-        }
-
-        /**
-         * Returns the satisfiableSignals.
-         */
-        public HandleSignals getSatisfiableSignals() {
-            return mSatisfiableSignals;
-        }
-    }
-
-    /**
-     * Creates a message pipe, which is a bidirectional communication channel for framed data (i.e.,
-     * messages), with the given options. Messages can contain plain data and/or Mojo handles.
-     *
-     * @return the set of handles for the two endpoints (ports) of the message pipe.
-     */
-    public Pair<MessagePipeHandle, MessagePipeHandle> createMessagePipe(
-            MessagePipeHandle.CreateOptions options);
-
-    /**
-     * Creates a data pipe, which is a unidirectional communication channel for unframed data, with
-     * the given options. Data is unframed, but must come as (multiples of) discrete elements, of
-     * the size given in |options|. See |DataPipe.CreateOptions| for a description of the different
-     * options available for data pipes. |options| may be set to null for a data pipe with the
-     * default options (which will have an element size of one byte and have some system-dependent
-     * capacity).
-     *
-     * @return the set of handles for the two endpoints of the data pipe.
-     */
-    public Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> createDataPipe(
-            DataPipe.CreateOptions options);
-
-    /**
-     * Creates a buffer that can be shared between applications (by duplicating the handle -- see
-     * |SharedBufferHandle.duplicate()| -- and passing it over a message pipe). To access the
-     * buffer, one must call |SharedBufferHandle.map|.
-     *
-     * @return the new |SharedBufferHandle|.
-     */
-    public SharedBufferHandle createSharedBuffer(SharedBufferHandle.CreateOptions options,
-            long numBytes);
-
-    /**
-     * Acquires a handle from the native side. The handle will be owned by the returned object and
-     * must not be closed outside of it.
-     *
-     * @return a new {@link UntypedHandle} representing the native handle.
-     */
-    public UntypedHandle acquireNativeHandle(int handle);
-
-    /**
-     * Returns an implementation of {@link Watcher}.
-     */
-    public Watcher getWatcher();
-
-    /**
-     * Returns a new run loop.
-     */
-    public RunLoop createDefaultRunLoop();
-
-    /**
-     * Returns the current run loop if it exists.
-     */
-    public RunLoop getCurrentRunLoop();
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/DataPipe.java b/mojo/public/java/system/src/org/chromium/mojo/system/DataPipe.java
deleted file mode 100644
index 4deaf09..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/DataPipe.java
+++ /dev/null
@@ -1,334 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-import java.nio.ByteBuffer;
-
-/**
- * Interface for data pipes. A data pipe is a unidirectional communication channel for unframed
- * data. Data is unframed, but must come as (multiples of) discrete elements, of the size given at
- * creation time.
- */
-public interface DataPipe {
-
-    /**
-     * Flags for the data pipe creation operation.
-     */
-    public static class CreateFlags extends Flags<CreateFlags> {
-        private static final int FLAG_NONE = 0;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final CreateFlags NONE = CreateFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flags.
-         */
-        protected CreateFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * @return flags with no bit set.
-         */
-        public static CreateFlags none() {
-            return new CreateFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Used to specify creation parameters for a data pipe to |Core.createDataPipe()|.
-     */
-    public static class CreateOptions {
-
-        /**
-         * Used to specify different modes of operation, see |DataPipe.CreateFlags|.
-         */
-        private CreateFlags mFlags = CreateFlags.none();
-        /**
-         * The size of an element, in bytes. All transactions and buffers will consist of an
-         * integral number of elements. Must be nonzero.
-         */
-        private int mElementNumBytes;
-        /**
-         * The capacity of the data pipe, in number of bytes; must be a multiple of
-         * |element_num_bytes|. The data pipe will always be able to queue AT LEAST this much data.
-         * Set to zero to opt for a system-dependent automatically-calculated capacity (which will
-         * always be at least one element).
-         */
-        private int mCapacityNumBytes;
-
-        /**
-         * @return the flags
-         */
-        public CreateFlags getFlags() {
-            return mFlags;
-        }
-
-        /**
-         * @return the elementNumBytes
-         */
-        public int getElementNumBytes() {
-            return mElementNumBytes;
-        }
-
-        /**
-         * @param elementNumBytes the elementNumBytes to set
-         */
-        public void setElementNumBytes(int elementNumBytes) {
-            mElementNumBytes = elementNumBytes;
-        }
-
-        /**
-         * @return the capacityNumBytes
-         */
-        public int getCapacityNumBytes() {
-            return mCapacityNumBytes;
-        }
-
-        /**
-         * @param capacityNumBytes the capacityNumBytes to set
-         */
-        public void setCapacityNumBytes(int capacityNumBytes) {
-            mCapacityNumBytes = capacityNumBytes;
-        }
-
-    }
-
-    /**
-     * Flags for the write operations on MessagePipeHandle .
-     */
-    public static class WriteFlags extends Flags<WriteFlags> {
-        private static final int FLAG_NONE = 0;
-        private static final int FLAG_ALL_OR_NONE = 1 << 0;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final WriteFlags NONE = WriteFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flags.
-         */
-        private WriteFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * Change the all-or-none bit of those flags. If set, write either all the elements
-         * requested or none of them.
-         *
-         * @param allOrNone the new value of all-or-none bit.
-         * @return this.
-         */
-        public WriteFlags setAllOrNone(boolean allOrNone) {
-            return setFlag(FLAG_ALL_OR_NONE, allOrNone);
-        }
-
-        /**
-         * @return a flag with no bit set.
-         */
-        public static WriteFlags none() {
-            return new WriteFlags(FLAG_NONE);
-        }
-    }
-
-    /**
-     * Flags for the read operations on MessagePipeHandle.
-     */
-    public static class ReadFlags extends Flags<ReadFlags> {
-        private static final int FLAG_NONE = 0;
-        private static final int FLAG_ALL_OR_NONE = 1 << 0;
-        private static final int FLAG_QUERY = 1 << 2;
-        private static final int FLAG_PEEK = 1 << 3;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final ReadFlags NONE = ReadFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flag.
-         */
-        private ReadFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * Change the all-or-none bit of this flag. If set, read (or discard) either the requested
-         * number of elements or none.
-         *
-         * @param allOrNone the new value of the all-or-none bit.
-         * @return this.
-         */
-        public ReadFlags setAllOrNone(boolean allOrNone) {
-            return setFlag(FLAG_ALL_OR_NONE, allOrNone);
-        }
-
-        /**
-         * Change the query bit of this flag. If set query the number of elements available to read.
-         * Mutually exclusive with |discard| and |allOrNone| is ignored if this flag is set.
-         *
-         * @param query the new value of the query bit.
-         * @return this.
-         */
-        public ReadFlags query(boolean query) {
-            return setFlag(FLAG_QUERY, query);
-        }
-
-        /**
-         * Change the peek bit of this flag. If set, read the requested number of elements, and
-         * leave those elements in the pipe. A later read will return the same data.
-         * Mutually exclusive with |discard| and |query|.
-         *
-         * @param peek the new value of the peek bit.
-         * @return this.
-         */
-        public ReadFlags peek(boolean peek) {
-            return setFlag(FLAG_PEEK, peek);
-        }
-
-        /**
-         * @return a flag with no bit set.
-         */
-        public static ReadFlags none() {
-            return new ReadFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Handle for the producer part of a data pipe.
-     */
-    public static interface ProducerHandle extends Handle {
-
-        /**
-         * @see org.chromium.mojo.system.Handle#pass()
-         */
-        @Override
-        public ProducerHandle pass();
-
-        /**
-         * Writes the given data to the data pipe producer. |elements| points to data; the buffer
-         * must be a direct ByteBuffer and the limit should be a multiple of the data pipe's element
-         * size. If |allOrNone| is set in |flags|, either all the data will be written or none is.
-         * <p>
-         * On success, returns the amount of data that was actually written.
-         * <p>
-         * Note: If the data pipe has the "may discard" option flag (specified on creation), this
-         * will discard as much data as required to write the given data, starting with the earliest
-         * written data that has not been consumed. However, even with "may discard", if the buffer
-         * limit is greater than the data pipe's capacity (and |allOrNone| is not set), this will
-         * write the maximum amount possible (namely, the data pipe's capacity) and return that
-         * amount. It will *not* discard data from |elements|.
-         *
-         * @return number of written bytes.
-         */
-        public ResultAnd<Integer> writeData(ByteBuffer elements, WriteFlags flags);
-
-        /**
-         * Begins a two-phase write to the data pipe producer . On success, returns a |ByteBuffer|
-         * to which the caller can write. If flags has |allOrNone| set, then the buffer capacity
-         * will be at least as large as |numBytes|, which must also be a multiple of the element
-         * size (if |allOrNone| is not set, |numBytes| is ignored and the caller must check the
-         * capacity of the buffer).
-         * <p>
-         * During a two-phase write, this handle is *not* writable. E.g., if another thread tries to
-         * write to it, it will throw a |MojoException| with code |MojoResult.BUSY|; that thread can
-         * then wait for this handle to become writable again.
-         * <p>
-         * Once the caller has finished writing data to the buffer, it should call |endWriteData()|
-         * to specify the amount written and to complete the two-phase write.
-         * <p>
-         * Note: If the data pipe has the "may discard" option flag (specified on creation) and
-         * |flags| has |allOrNone| set, this may discard some data.
-         *
-         * @return The buffer to write to.
-         */
-        public ByteBuffer beginWriteData(int numBytes, WriteFlags flags);
-
-        /**
-         * Ends a two-phase write to the data pipe producer that was begun by a call to
-         * |beginWriteData()| on the same handle. |numBytesWritten| should indicate the amount of
-         * data actually written; it must be less than or equal to the capacity of the buffer
-         * returned by |beginWriteData()| and must be a multiple of the element size. The buffer
-         * returned from |beginWriteData()| must have been filled with exactly |numBytesWritten|
-         * bytes of data.
-         * <p>
-         * On failure, the two-phase write (if any) is ended (so the handle may become writable
-         * again, if there's space available) but no data written to the buffer is "put into" the
-         * data pipe.
-         */
-        public void endWriteData(int numBytesWritten);
-    }
-
-    /**
-     * Handle for the consumer part of a data pipe.
-     */
-    public static interface ConsumerHandle extends Handle {
-        /**
-         * @see org.chromium.mojo.system.Handle#pass()
-         */
-        @Override
-        public ConsumerHandle pass();
-
-       /**
-         * Discards data on the data pie consumer. This method discards up to |numBytes| (which
-         * again be a multiple of the element size) bytes of data, returning the amount actually
-         * discarded. if |flags| has |allOrNone|, it will either discard exactly |numBytes| bytes of
-         * data or none. In this case, |query| must not be set.
-         */
-        public int discardData(int numBytes, ReadFlags flags);
-
-        /**
-         * Reads data from the data pipe consumer. May also be used to query the amount of data
-         * available. If |flags| has not |query| set, this tries to read up to |elements| capacity
-         * (which must be a multiple of the data pipe's element size) bytes of data to |elements|
-         * and returns the amount actually read. |elements| must be a direct ByteBuffer. If flags
-         * has |allOrNone| set, it will either read exactly |elements| capacity bytes of data or
-         * none.
-         * <p>
-         * If flags has |query| set, it queries the amount of data available, returning the number
-         * of bytes available. In this case |allOrNone| is ignored, as are |elements|.
-         */
-        public ResultAnd<Integer> readData(ByteBuffer elements, ReadFlags flags);
-
-        /**
-         * Begins a two-phase read from the data pipe consumer. On success, returns a |ByteBuffer|
-         * from which the caller can read up to its limit bytes of data. If flags has |allOrNone|
-         * set, then the limit will be at least as large as |numBytes|, which must also be a
-         * multiple of the element size (if |allOrNone| is not set, |numBytes| is ignored). |flags|
-         * must not have |query| set.
-         * <p>
-         * During a two-phase read, this handle is *not* readable. E.g., if another thread tries to
-         * read from it, it will throw a |MojoException| with code |MojoResult.BUSY|; that thread
-         * can then wait for this handle to become readable again.
-         * <p>
-         * Once the caller has finished reading data from the buffer, it should call |endReadData()|
-         * to specify the amount read and to complete the two-phase read.
-         */
-        public ByteBuffer beginReadData(int numBytes, ReadFlags flags);
-
-        /**
-         * Ends a two-phase read from the data pipe consumer that was begun by a call to
-         * |beginReadData()| on the same handle. |numBytesRead| should indicate the amount of data
-         * actually read; it must be less than or equal to the limit of the buffer returned by
-         * |beginReadData()| and must be a multiple of the element size.
-         * <p>
-         * On failure, the two-phase read (if any) is ended (so the handle may become readable
-         * again) but no data is "removed" from the data pipe.
-         */
-        public void endReadData(int numBytesRead);
-    }
-
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/Flags.java b/mojo/public/java/system/src/org/chromium/mojo/system/Flags.java
deleted file mode 100644
index 30ff07f..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/Flags.java
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-/**
- * Base class for bit field used as flags.
- *
- * @param <F> the type of the flags.
- */
-public abstract class Flags<F extends Flags<F>> {
-    private int mFlags;
-    private boolean mImmutable;
-
-    /**
-     * Dedicated constructor.
-     *
-     * @param flags initial value of the flag.
-     */
-    protected Flags(int flags) {
-        mImmutable = false;
-        mFlags = flags;
-    }
-
-    /**
-     * @return the computed flag.
-     */
-    public int getFlags() {
-        return mFlags;
-    }
-
-    /**
-     * Change the given bit of this flag.
-     *
-     * @param value the new value of given bit.
-     * @return this.
-     */
-    protected F setFlag(int flag, boolean value) {
-        if (mImmutable) {
-            throw new UnsupportedOperationException("Flags is immutable.");
-        }
-        if (value) {
-            mFlags |= flag;
-        } else {
-            mFlags &= ~flag;
-        }
-        @SuppressWarnings("unchecked")
-        F f = (F) this;
-        return f;
-    }
-
-    /**
-     * Makes this flag immutable. This is a non-reversable operation.
-     */
-    protected F immutable() {
-        mImmutable = true;
-        @SuppressWarnings("unchecked")
-        F f = (F) this;
-        return f;
-    }
-
-    /**
-     * @see Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        return mFlags;
-    }
-
-    /**
-     * @see Object#equals(Object)
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) return true;
-        if (obj == null) return false;
-        if (getClass() != obj.getClass()) return false;
-        Flags<?> other = (Flags<?>) obj;
-        if (mFlags != other.mFlags) return false;
-        return true;
-    }
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/Handle.java b/mojo/public/java/system/src/org/chromium/mojo/system/Handle.java
deleted file mode 100644
index 903f36d..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/Handle.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-import org.chromium.mojo.system.Core.HandleSignalsState;
-
-import java.io.Closeable;
-
-/**
- * A generic mojo handle.
- */
-public interface Handle extends Closeable {
-
-    /**
-     * Closes the given |handle|.
-     * <p>
-     * Concurrent operations on |handle| may succeed (or fail as usual) if they happen before the
-     * close, be cancelled with result |MojoResult.CANCELLED| if they properly overlap (this is
-     * likely the case with |wait()|, etc.), or fail with |MojoResult.INVALID_ARGUMENT| if they
-     * happen after.
-     */
-    @Override
-    public void close();
-
-    /**
-     * @return the last known signaling state of the handle.
-     */
-    public HandleSignalsState querySignalsState();
-
-    /**
-     * @return whether the handle is valid. A handle is valid until it has been explicitly closed or
-     *         send through a message pipe via |MessagePipeHandle.writeMessage|.
-     */
-    public boolean isValid();
-
-    /**
-     * Converts this handle into an {@link UntypedHandle}, invalidating this handle.
-     */
-    public UntypedHandle toUntypedHandle();
-
-    /**
-     * Returns the {@link Core} implementation for this handle. Can be null if this handle is
-     * invalid.
-     */
-    public Core getCore();
-
-    /**
-     * Passes ownership of the handle from this handle to the newly created Handle object,
-     * invalidating this handle object in the process.
-     */
-    public Handle pass();
-
-    /**
-     * Releases the native handle backed by this {@link Handle}. The caller owns the handle and must
-     * close it.
-     */
-    public int releaseNativeHandle();
-
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/InvalidHandle.java b/mojo/public/java/system/src/org/chromium/mojo/system/InvalidHandle.java
deleted file mode 100644
index f8b99c6..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/InvalidHandle.java
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-import org.chromium.mojo.system.Core.HandleSignalsState;
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-
-/**
- * A handle that will always be invalid.
- */
-public class InvalidHandle implements UntypedHandle, MessagePipeHandle, ConsumerHandle,
-        ProducerHandle, SharedBufferHandle {
-
-    /**
-     * Instance singleton.
-     */
-    public static final InvalidHandle INSTANCE = new InvalidHandle();
-
-    /**
-     * Private constructor.
-     */
-    private InvalidHandle() {
-    }
-
-    /**
-     * @see Handle#close()
-     */
-    @Override
-    public void close() {
-        // Do nothing.
-    }
-
-    /**
-     * @see Handle#querySignalsState()
-     */
-    @Override
-    public HandleSignalsState querySignalsState() {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see Handle#isValid()
-     */
-    @Override
-    public boolean isValid() {
-        return false;
-    }
-
-    /**
-     * @see Handle#getCore()
-     */
-    @Override
-    public Core getCore() {
-        return null;
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#pass()
-     */
-    @Override
-    public InvalidHandle pass() {
-        return this;
-    }
-
-    /**
-     * @see Handle#toUntypedHandle()
-     */
-    @Override
-    public UntypedHandle toUntypedHandle() {
-        return this;
-    }
-
-    /**
-     * @see Handle#releaseNativeHandle()
-     */
-    @Override
-    public int releaseNativeHandle() {
-        return 0;
-    }
-
-    /**
-     * @see UntypedHandle#toMessagePipeHandle()
-     */
-    @Override
-    public MessagePipeHandle toMessagePipeHandle() {
-        return this;
-    }
-
-    /**
-     * @see UntypedHandle#toDataPipeConsumerHandle()
-     */
-    @Override
-    public ConsumerHandle toDataPipeConsumerHandle() {
-        return this;
-    }
-
-    /**
-     * @see UntypedHandle#toDataPipeProducerHandle()
-     */
-    @Override
-    public ProducerHandle toDataPipeProducerHandle() {
-        return this;
-    }
-
-    /**
-     * @see UntypedHandle#toSharedBufferHandle()
-     */
-    @Override
-    public SharedBufferHandle toSharedBufferHandle() {
-        return this;
-    }
-
-    /**
-     * @see SharedBufferHandle#duplicate(SharedBufferHandle.DuplicateOptions)
-     */
-    @Override
-    public SharedBufferHandle duplicate(DuplicateOptions options) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see SharedBufferHandle#map(long, long, SharedBufferHandle.MapFlags)
-     */
-    @Override
-    public ByteBuffer map(long offset, long numBytes, MapFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see SharedBufferHandle#unmap(java.nio.ByteBuffer)
-     */
-    @Override
-    public void unmap(ByteBuffer buffer) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ProducerHandle#writeData(java.nio.ByteBuffer, DataPipe.WriteFlags)
-     */
-    @Override
-    public ResultAnd<Integer> writeData(ByteBuffer elements, DataPipe.WriteFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ProducerHandle#beginWriteData(int, DataPipe.WriteFlags)
-     */
-    @Override
-    public ByteBuffer beginWriteData(int numBytes,
-            DataPipe.WriteFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ProducerHandle#endWriteData(int)
-     */
-    @Override
-    public void endWriteData(int numBytesWritten) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ConsumerHandle#discardData(int, DataPipe.ReadFlags)
-     */
-    @Override
-    public int discardData(int numBytes, DataPipe.ReadFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ConsumerHandle#readData(java.nio.ByteBuffer, DataPipe.ReadFlags)
-     */
-    @Override
-    public ResultAnd<Integer> readData(ByteBuffer elements, DataPipe.ReadFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ConsumerHandle#beginReadData(int, DataPipe.ReadFlags)
-     */
-    @Override
-    public ByteBuffer beginReadData(int numBytes,
-            DataPipe.ReadFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ConsumerHandle#endReadData(int)
-     */
-    @Override
-    public void endReadData(int numBytesRead) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see MessagePipeHandle#writeMessage(java.nio.ByteBuffer, java.util.List,
-     *      MessagePipeHandle.WriteFlags)
-     */
-    @Override
-    public void writeMessage(ByteBuffer bytes, List<? extends Handle> handles, WriteFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see MessagePipeHandle#readMessage(java.nio.ByteBuffer, int, MessagePipeHandle.ReadFlags)
-     */
-    @Override
-    public ResultAnd<ReadMessageResult> readMessage(
-            ByteBuffer bytes, int maxNumberOfHandles, ReadFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/MessagePipeHandle.java b/mojo/public/java/system/src/org/chromium/mojo/system/MessagePipeHandle.java
deleted file mode 100644
index deb6ac0..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/MessagePipeHandle.java
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-
-/**
- * Message pipes are bidirectional communication channel for framed data (i.e., messages). Messages
- * can contain plain data and/or Mojo handles.
- */
-public interface MessagePipeHandle extends Handle {
-
-    /**
-     * Flags for the message pipe creation operation.
-     */
-    public static class CreateFlags extends Flags<CreateFlags> {
-        private static final int FLAG_NONE = 0;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final CreateFlags NONE = CreateFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flags.
-         */
-        protected CreateFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * @return flags with no bit set.
-         */
-        public static CreateFlags none() {
-            return new CreateFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Used to specify creation parameters for a message pipe to |Core#createMessagePipe()|.
-     */
-    public static class CreateOptions {
-        private CreateFlags mFlags = CreateFlags.NONE;
-
-        /**
-         * @return the flags
-         */
-        public CreateFlags getFlags() {
-            return mFlags;
-        }
-
-    }
-
-    /**
-     * Flags for the write operations on MessagePipeHandle .
-     */
-    public static class WriteFlags extends Flags<WriteFlags> {
-        private static final int FLAG_NONE = 0;
-
-        /**
-         * Immutable flag with no bit set.
-         */
-        public static final WriteFlags NONE = WriteFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flag.
-         */
-        private WriteFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * @return a flag with no bit set.
-         */
-        public static WriteFlags none() {
-            return new WriteFlags(FLAG_NONE);
-        }
-    }
-
-    /**
-     * Flags for the read operations on MessagePipeHandle.
-     */
-    public static class ReadFlags extends Flags<ReadFlags> {
-        private static final int FLAG_NONE = 0;
-        private static final int FLAG_MAY_DISCARD = 1 << 0;
-
-        /**
-         * Immutable flag with no bit set.
-         */
-        public static final ReadFlags NONE = ReadFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flag.
-         */
-        private ReadFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * Change the may-discard bit of this flag. If set, if the message is unable to be read for
-         * whatever reason (e.g., the caller-supplied buffer is too small), discard the message
-         * (i.e., simply dequeue it).
-         *
-         * @param mayDiscard the new value of the may-discard bit.
-         * @return this.
-         */
-        public ReadFlags setMayDiscard(boolean mayDiscard) {
-            return setFlag(FLAG_MAY_DISCARD, mayDiscard);
-        }
-
-        /**
-         * @return a flag with no bit set.
-         */
-        public static ReadFlags none() {
-            return new ReadFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Result of the |readMessage| method.
-     */
-    public static class ReadMessageResult {
-        /**
-         * If a message was read, the size in bytes of the message, otherwise the size in bytes of
-         * the next message.
-         */
-        private int mMessageSize;
-        /**
-         * If a message was read, the number of handles contained in the message, otherwise the
-         * number of handles contained in the next message.
-         */
-        private int mHandlesCount;
-        /**
-         * If a message was read, the handles contained in the message, undefined otherwise.
-         */
-        private List<UntypedHandle> mHandles;
-
-        /**
-         * @return the messageSize
-         */
-        public int getMessageSize() {
-            return mMessageSize;
-        }
-
-        /**
-         * @param messageSize the messageSize to set
-         */
-        public void setMessageSize(int messageSize) {
-            mMessageSize = messageSize;
-        }
-
-        /**
-         * @return the handlesCount
-         */
-        public int getHandlesCount() {
-            return mHandlesCount;
-        }
-
-        /**
-         * @param handlesCount the handlesCount to set
-         */
-        public void setHandlesCount(int handlesCount) {
-            mHandlesCount = handlesCount;
-        }
-
-        /**
-         * @return the handles
-         */
-        public List<UntypedHandle> getHandles() {
-            return mHandles;
-        }
-
-        /**
-         * @param handles the handles to set
-         */
-        public void setHandles(List<UntypedHandle> handles) {
-            mHandles = handles;
-        }
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#pass()
-     */
-    @Override
-    public MessagePipeHandle pass();
-
-    /**
-     * Writes a message to the message pipe endpoint, with message data specified by |bytes| and
-     * attached handles specified by |handles|, and options specified by |flags|. If there is no
-     * message data, |bytes| may be null, otherwise it must be a direct ByteBuffer. If there are no
-     * attached handles, |handles| may be null.
-     * <p>
-     * If handles are attached, on success the handles will no longer be valid (the receiver will
-     * receive equivalent, but logically different, handles). Handles to be sent should not be in
-     * simultaneous use (e.g., on another thread).
-     */
-    void writeMessage(ByteBuffer bytes, List<? extends Handle> handles, WriteFlags flags);
-
-    /**
-     * Reads a message from the message pipe endpoint; also usable to query the size of the next
-     * message or discard the next message. |bytes| indicate the buffer/buffer size to receive the
-     * message data (if any) and |maxNumberOfHandles| indicate the maximum handle count to receive
-     * the attached handles (if any). |bytes| is optional. If null, |maxNumberOfHandles| must be
-     * zero, and the return value will indicate the size of the next message. If non-null, it must
-     * be a direct ByteBuffer and the return value will indicate if the message was read or not. If
-     * the message was read its content will be in |bytes|, and the attached handles will be in the
-     * return value. Partial reads are NEVER done. Either a full read is done and |wasMessageRead|
-     * will be true, or the read is NOT done and |wasMessageRead| will be false (if |mayDiscard| was
-     * set, the message is also discarded in this case).
-     */
-    ResultAnd<ReadMessageResult> readMessage(
-            ByteBuffer bytes, int maxNumberOfHandles, ReadFlags flags);
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/MojoException.java b/mojo/public/java/system/src/org/chromium/mojo/system/MojoException.java
deleted file mode 100644
index 4e0e3e9..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/MojoException.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-/**
- * Exception for the core mojo API.
- */
-public class MojoException extends RuntimeException {
-
-    private final int mCode;
-
-    /**
-     * Constructor.
-     */
-    public MojoException(int code) {
-        mCode = code;
-    }
-
-    /**
-     * Constructor.
-     */
-    public MojoException(Throwable cause) {
-        super(cause);
-        mCode = MojoResult.UNKNOWN;
-    }
-
-    /**
-     * The mojo result code associated with this exception. See {@link MojoResult} for possible
-     * values.
-     */
-    public int getMojoResult() {
-        return mCode;
-    }
-
-    /**
-     * @see Object#toString()
-     */
-    @Override
-    public String toString() {
-        return "MojoResult(" + mCode + "): " + MojoResult.describe(mCode);
-    }
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/MojoResult.java b/mojo/public/java/system/src/org/chromium/mojo/system/MojoResult.java
deleted file mode 100644
index 2602cb5..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/MojoResult.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-/**
- * The different mojo result codes.
- */
-public final class MojoResult {
-    public static final int OK = 0;
-    public static final int CANCELLED = 1;
-    public static final int UNKNOWN = 2;
-    public static final int INVALID_ARGUMENT = 3;
-    public static final int DEADLINE_EXCEEDED = 4;
-    public static final int NOT_FOUND = 5;
-    public static final int ALREADY_EXISTS = 6;
-    public static final int PERMISSION_DENIED = 7;
-    public static final int RESOURCE_EXHAUSTED = 8;
-    public static final int FAILED_PRECONDITION = 9;
-    public static final int ABORTED = 10;
-    public static final int OUT_OF_RANGE = 11;
-    public static final int UNIMPLEMENTED = 12;
-    public static final int INTERNAL = 13;
-    public static final int UNAVAILABLE = 14;
-    public static final int DATA_LOSS = 15;
-    public static final int BUSY = 16;
-    public static final int SHOULD_WAIT = 17;
-
-    /**
-     * never instantiate.
-     */
-    private MojoResult() {
-    }
-
-    /**
-     * Describes the given result code.
-     */
-    public static String describe(int mCode) {
-        switch (mCode) {
-            case OK:
-                return "OK";
-            case CANCELLED:
-                return "CANCELLED";
-            case UNKNOWN:
-                return "UNKNOWN";
-            case INVALID_ARGUMENT:
-                return "INVALID_ARGUMENT";
-            case DEADLINE_EXCEEDED:
-                return "DEADLINE_EXCEEDED";
-            case NOT_FOUND:
-                return "NOT_FOUND";
-            case ALREADY_EXISTS:
-                return "ALREADY_EXISTS";
-            case PERMISSION_DENIED:
-                return "PERMISSION_DENIED";
-            case RESOURCE_EXHAUSTED:
-                return "RESOURCE_EXHAUSTED";
-            case FAILED_PRECONDITION:
-                return "FAILED_PRECONDITION";
-            case ABORTED:
-                return "ABORTED";
-            case OUT_OF_RANGE:
-                return "OUT_OF_RANGE";
-            case UNIMPLEMENTED:
-                return "UNIMPLEMENTED";
-            case INTERNAL:
-                return "INTERNAL";
-            case UNAVAILABLE:
-                return "UNAVAILABLE";
-            case DATA_LOSS:
-                return "DATA_LOSS";
-            case BUSY:
-                return "BUSY";
-            case SHOULD_WAIT:
-                return "SHOULD_WAIT";
-            default:
-                return "UNKNOWN";
-        }
-
-    }
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/Pair.java b/mojo/public/java/system/src/org/chromium/mojo/system/Pair.java
deleted file mode 100644
index 2ead020..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/Pair.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-
-/**
- * A pair of object.
- *
- * @param <F> Type of the first element.
- * @param <S> Type of the second element.
- */
-public class Pair<F, S> {
-
-    public final F first;
-    public final S second;
-
-    /**
-     * Dedicated constructor.
-     *
-     * @param first the first element of the pair.
-     * @param second the second element of the pair.
-     */
-    public Pair(F first, S second) {
-        this.first = first;
-        this.second = second;
-    }
-
-    /**
-     * equals() that handles null values.
-     */
-    private boolean equals(Object o1, Object o2) {
-        return o1 == null ? o2 == null : o1.equals(o2);
-    }
-
-    /**
-     * @see Object#equals(Object)
-     */
-    @Override
-    public boolean equals(Object o) {
-        if (!(o instanceof Pair)) {
-            return false;
-        }
-        Pair<?, ?> p = (Pair<?, ?>) o;
-        return equals(first, p.first) && equals(second, p.second);
-    }
-
-    /**
-     * @see Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        return (first == null ? 0 : first.hashCode()) ^ (second == null ? 0 : second.hashCode());
-    }
-
-    /**
-     * Helper method for creating a pair.
-     *
-     * @param a the first element of the pair.
-     * @param b the second element of the pair.
-     * @return the pair containing a and b.
-     */
-    public static <A, B> Pair<A, B> create(A a, B b) {
-        return new Pair<A, B>(a, b);
-    }
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/ResultAnd.java b/mojo/public/java/system/src/org/chromium/mojo/system/ResultAnd.java
deleted file mode 100644
index 656d0d6..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/ResultAnd.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-/**
- * Container that contains a mojo result and a value.
- *
- * @param <A> the type of the value.
- */
-public class ResultAnd<A> {
-    private final int mMojoResult;
-    private final A mValue;
-
-    public ResultAnd(int result, A value) {
-        this.mMojoResult = result;
-        this.mValue = value;
-    }
-
-    /**
-     * Returns the mojo result.
-     */
-    public int getMojoResult() {
-        return mMojoResult;
-    }
-
-    /**
-     * Returns the value.
-     */
-    public A getValue() {
-        return mValue;
-    }
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/RunLoop.java b/mojo/public/java/system/src/org/chromium/mojo/system/RunLoop.java
deleted file mode 100644
index 4038b29..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/RunLoop.java
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-import java.io.Closeable;
-
-/**
- * Definition of a run loop.
- */
-public interface RunLoop extends Closeable {
-    /**
-     * Start the run loop. It will continue until quit() is called.
-     */
-    public void run();
-
-    /**
-     * Start the run loop and stop it as soon as no task is present in the work queue.
-     */
-    public void runUntilIdle();
-
-    /*
-     * Quit the currently running run loop.
-     */
-    public void quit();
-
-    /**
-     * Add a runnable to the queue of tasks.
-     * @param runnable Callback to be executed by the run loop.
-     * @param delay Delay, in MojoTimeTicks (microseconds) before the callback should
-     * be executed.
-     */
-    public void postDelayedTask(Runnable runnable, long delay);
-
-    /**
-     * Destroy the run loop and deregister it from Core.
-     */
-    @Override
-    public abstract void close();
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/SharedBufferHandle.java b/mojo/public/java/system/src/org/chromium/mojo/system/SharedBufferHandle.java
deleted file mode 100644
index df317d1..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/SharedBufferHandle.java
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-import java.nio.ByteBuffer;
-
-/**
- * A buffer that can be shared between applications.
- */
-public interface SharedBufferHandle extends Handle {
-
-    /**
-     * Flags for the shared buffer creation operation.
-     */
-    public static class CreateFlags extends Flags<CreateFlags> {
-        private static final int FLAG_NONE = 0;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final CreateFlags NONE = CreateFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flags.
-         */
-        protected CreateFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * @return flags with no bit set.
-         */
-        public static CreateFlags none() {
-            return new CreateFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Used to specify creation parameters for a shared buffer to |Core#createSharedBuffer()|.
-     */
-    public static class CreateOptions {
-        private CreateFlags mFlags = CreateFlags.NONE;
-
-        /**
-         * @return the flags
-         */
-        public CreateFlags getFlags() {
-            return mFlags;
-        }
-
-    }
-
-    /**
-     * Flags for the shared buffer duplication operation.
-     */
-    public static class DuplicateFlags extends Flags<DuplicateFlags> {
-        private static final int FLAG_NONE = 0;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final DuplicateFlags NONE = DuplicateFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flags.
-         */
-        protected DuplicateFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * @return flags with no bit set.
-         */
-        public static DuplicateFlags none() {
-            return new DuplicateFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Used to specify parameters in duplicating access to a shared buffer to
-     * |SharedBufferHandle#duplicate|
-     */
-    public static class DuplicateOptions {
-        private DuplicateFlags mFlags = DuplicateFlags.NONE;
-
-        /**
-         * @return the flags
-         */
-        public DuplicateFlags getFlags() {
-            return mFlags;
-        }
-
-    }
-
-    /**
-     * Flags for the shared buffer map operation.
-     */
-    public static class MapFlags extends Flags<MapFlags> {
-        private static final int FLAG_NONE = 0;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final MapFlags NONE = MapFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flags.
-         */
-        protected MapFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * @return flags with no bit set.
-         */
-        public static MapFlags none() {
-            return new MapFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#pass()
-     */
-    @Override
-    public SharedBufferHandle pass();
-
-    /**
-     * Duplicates the handle. This creates another handle (returned on success), which can then be
-     * sent to another application over a message pipe, while retaining access to this handle (and
-     * any mappings that it may have).
-     */
-    public SharedBufferHandle duplicate(DuplicateOptions options);
-
-    /**
-     * Map the part (at offset |offset| of length |numBytes|) of the buffer given by this handle
-     * into memory. |offset + numBytes| must be less than or equal to the size of the buffer. On
-     * success, the returned buffer points to memory with the requested part of the buffer. A single
-     * buffer handle may have multiple active mappings (possibly depending on the buffer type). The
-     * permissions (e.g., writable or executable) of the returned memory may depend on the
-     * properties of the buffer and properties attached to the buffer handle as well as |flags|.
-     */
-    public ByteBuffer map(long offset, long numBytes, MapFlags flags);
-
-    /**
-     * Unmap a buffer pointer that was mapped by |map()|.
-     */
-    public void unmap(ByteBuffer buffer);
-
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/UntypedHandle.java b/mojo/public/java/system/src/org/chromium/mojo/system/UntypedHandle.java
deleted file mode 100644
index 199b0a1..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/UntypedHandle.java
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-
-/**
- * A mojo handle of unknown type. This handle can be typed by using one of its methods, which will
- * return a handle of the requested type and invalidate this object. No validation is made when the
- * conversion operation is called.
- */
-public interface UntypedHandle extends Handle {
-
-    /**
-     * @see org.chromium.mojo.system.Handle#pass()
-     */
-    @Override
-    public UntypedHandle pass();
-
-    /**
-     * Returns the underlying handle, as a {@link MessagePipeHandle}, invalidating this
-     * representation.
-     */
-    public MessagePipeHandle toMessagePipeHandle();
-
-    /**
-     * Returns the underlying handle, as a {@link ConsumerHandle}, invalidating this representation.
-     */
-    public ConsumerHandle toDataPipeConsumerHandle();
-
-    /**
-     * Returns the underlying handle, as a {@link ProducerHandle}, invalidating this representation.
-     */
-    public ProducerHandle toDataPipeProducerHandle();
-
-    /**
-     * Returns the underlying handle, as a {@link SharedBufferHandle}, invalidating this
-     * representation.
-     */
-    public SharedBufferHandle toSharedBufferHandle();
-
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/Watcher.java b/mojo/public/java/system/src/org/chromium/mojo/system/Watcher.java
deleted file mode 100644
index 9c70161..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/Watcher.java
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-import org.chromium.mojo.system.Core.HandleSignals;
-
-/**
- * Watches a handle for signals being satisfied.
- */
-public interface Watcher {
-    /**
-     * Callback passed to {@link Watcher#start}.
-     */
-    public interface Callback {
-        /**
-         * Called when the handle is ready.
-         */
-        public void onResult(int result);
-    }
-
-    /**
-     * Starts watching a handle.
-     */
-    int start(Handle handle, HandleSignals signals, Callback callback);
-
-    /**
-     * Cancels an already-started watch.
-     */
-    void cancel();
-
-    /**
-     * Destroys the underlying implementation. Other methods will fail after destroy has been
-     * called.
-     */
-    void destroy();
-}
diff --git a/mojo/public/js/BUILD.gn b/mojo/public/js/BUILD.gn
deleted file mode 100644
index 5ed57a1..0000000
--- a/mojo/public/js/BUILD.gn
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-interfaces_bindings_gen_dir = "$root_gen_dir/mojo/public/interfaces/bindings"
-
-source_set("js") {
-  sources = [
-    "constants.cc",
-    "constants.h",
-  ]
-}
-
-group("bindings") {
-  data = [
-    "$interfaces_bindings_gen_dir/interface_control_messages.mojom.js",
-    "$interfaces_bindings_gen_dir/pipe_control_messages.mojom.js",
-    "bindings.js",
-    "buffer.js",
-    "codec.js",
-    "connector.js",
-    "core.js",
-    "interface_types.js",
-    "lib/control_message_handler.js",
-    "lib/control_message_proxy.js",
-    "lib/interface_endpoint_client.js",
-    "lib/interface_endpoint_handle.js",
-    "lib/pipe_control_message_handler.js",
-    "lib/pipe_control_message_proxy.js",
-    "router.js",
-    "support.js",
-    "threading.js",
-    "unicode.js",
-    "validator.js",
-  ]
-
-  deps = [
-    ":new_bindings",
-    "//mojo/public/interfaces/bindings:bindings__generator",
-  ]
-}
-
-action("new_bindings") {
-  new_bindings_js_files = [
-    # This must be the first file in the list, because it initializes global
-    # variable |mojoBindings| that the others need to refer to.
-    "new_bindings/base.js",
-
-    "$interfaces_bindings_gen_dir/new_bindings/interface_control_messages.mojom.js",
-    "new_bindings/bindings.js",
-    "new_bindings/buffer.js",
-    "new_bindings/codec.js",
-    "new_bindings/connector.js",
-    "new_bindings/interface_types.js",
-    "new_bindings/lib/control_message_handler.js",
-    "new_bindings/lib/control_message_proxy.js",
-    "new_bindings/router.js",
-    "new_bindings/unicode.js",
-    "new_bindings/validator.js",
-  ]
-  compiled_file = "$target_gen_dir/mojo_bindings.js"
-
-  # TODO(yzshen): Eventually we would like to use Closure Compiler to minify the
-  # bindings instead of simply concatenating the files.
-  script = "//v8/tools/concatenate-files.py"
-
-  sources = new_bindings_js_files
-  outputs = [
-    compiled_file,
-  ]
-
-  args = rebase_path(new_bindings_js_files)
-  args += [ rebase_path(compiled_file) ]
-
-  deps = [
-    "//mojo/public/interfaces/bindings:new_bindings__generator",
-  ]
-}
-
-group("tests") {
-  testonly = true
-
-  data = [
-    "//mojo/public/interfaces/bindings/tests/data/validation/",
-    "tests/core_unittest.js",
-    "tests/validation_test_input_parser.js",
-    "tests/validation_unittest.js",
-  ]
-
-  public_deps = [
-    ":bindings",
-  ]
-}
diff --git a/mojo/public/js/README.md b/mojo/public/js/README.md
deleted file mode 100644
index b6eafe9..0000000
--- a/mojo/public/js/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo JavaScript System and Bindings APIs
-This document is a subset of the [Mojo documentation](/mojo).
-
-**NOTE:** The JavaScript APIs are currently in flux and will stabilize soon.
-More info forthcoming ASAP!
-
-TODO: Make the contents of this document less non-existent.
diff --git a/mojo/public/js/bindings.js b/mojo/public/js/bindings.js
deleted file mode 100644
index a944e2f..0000000
--- a/mojo/public/js/bindings.js
+++ /dev/null
@@ -1,322 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/bindings", [
-  "mojo/public/js/core",
-  "mojo/public/js/interface_types",
-  "mojo/public/js/lib/interface_endpoint_client",
-  "mojo/public/js/router",
-], function(core, types, interfaceEndpointClient, router) {
-
-  var InterfaceEndpointClient = interfaceEndpointClient.InterfaceEndpointClient;
-
-  // ---------------------------------------------------------------------------
-
-  function makeRequest(interfacePtr) {
-    var pipe = core.createMessagePipe();
-    interfacePtr.ptr.bind(new types.InterfacePtrInfo(pipe.handle0, 0));
-    return new types.InterfaceRequest(pipe.handle1);
-  }
-
-  // ---------------------------------------------------------------------------
-
-  // Operations used to setup/configure an interface pointer. Exposed as the
-  // |ptr| field of generated interface pointer classes.
-  // |ptrInfoOrHandle| could be omitted and passed into bind() later.
-  function InterfacePtrController(interfaceType, ptrInfoOrHandle) {
-    this.version = 0;
-
-    this.interfaceType_ = interfaceType;
-    this.router_ = null;
-    this.interfaceEndpointClient_ = null;
-    this.proxy_ = null;
-
-    // |router_| and |interfaceEndpointClient_| are lazily initialized.
-    // |handle_| is valid between bind() and
-    // the initialization of |router_| and |interfaceEndpointClient_|.
-    this.handle_ = null;
-
-    if (ptrInfoOrHandle)
-      this.bind(ptrInfoOrHandle);
-  }
-
-  InterfacePtrController.prototype.bind = function(ptrInfoOrHandle) {
-    this.reset();
-
-    if (ptrInfoOrHandle instanceof types.InterfacePtrInfo) {
-      this.version = ptrInfoOrHandle.version;
-      this.handle_ = ptrInfoOrHandle.handle;
-    } else {
-      this.handle_ = ptrInfoOrHandle;
-    }
-  };
-
-  InterfacePtrController.prototype.isBound = function() {
-    return this.router_ !== null || this.handle_ !== null;
-  };
-
-  // Although users could just discard the object, reset() closes the pipe
-  // immediately.
-  InterfacePtrController.prototype.reset = function() {
-    this.version = 0;
-    if (this.interfaceEndpointClient_) {
-      this.interfaceEndpointClient_.close();
-      this.interfaceEndpointClient_ = null;
-    }
-    if (this.router_) {
-      this.router_.close();
-      this.router_ = null;
-
-      this.proxy_ = null;
-    }
-    if (this.handle_) {
-      core.close(this.handle_);
-      this.handle_ = null;
-    }
-  };
-
-  InterfacePtrController.prototype.resetWithReason = function(reason) {
-    this.configureProxyIfNecessary_();
-    this.interfaceEndpointClient_.close(reason);
-    this.interfaceEndpointClient_ = null;
-    this.reset();
-  };
-
-  InterfacePtrController.prototype.setConnectionErrorHandler = function(
-      callback) {
-    if (!this.isBound())
-      throw new Error("Cannot set connection error handler if not bound.");
-
-    this.configureProxyIfNecessary_();
-    this.interfaceEndpointClient_.setConnectionErrorHandler(callback);
-  };
-
-  InterfacePtrController.prototype.passInterface = function() {
-    var result;
-    if (this.router_) {
-      // TODO(yzshen): Fix Router interface to support extracting handle.
-      result = new types.InterfacePtrInfo(
-          this.router_.connector_.handle_, this.version);
-      this.router_.connector_.handle_ = null;
-    } else {
-      // This also handles the case when this object is not bound.
-      result = new types.InterfacePtrInfo(this.handle_, this.version);
-      this.handle_ = null;
-    }
-
-    this.reset();
-    return result;
-  };
-
-  InterfacePtrController.prototype.getProxy = function() {
-    this.configureProxyIfNecessary_();
-    return this.proxy_;
-  };
-
-  InterfacePtrController.prototype.waitForNextMessageForTesting = function() {
-    this.configureProxyIfNecessary_();
-    this.router_.waitForNextMessageForTesting();
-  };
-
-  InterfacePtrController.prototype.configureProxyIfNecessary_ = function() {
-    if (!this.handle_)
-      return;
-
-    this.router_ = new router.Router(this.handle_);
-    this.handle_ = null;
-
-    this.interfaceEndpointClient_ = new InterfaceEndpointClient(
-        this.router_.createLocalEndpointHandle(types.kMasterInterfaceId),
-        this.router_);
-
-    this.interfaceEndpointClient_ .setPayloadValidators([
-        this.interfaceType_.validateResponse]);
-    this.proxy_ = new this.interfaceType_.proxyClass(
-        this.interfaceEndpointClient_);
-  };
-
-  InterfacePtrController.prototype.queryVersion = function() {
-    function onQueryVersion(version) {
-      this.version = version;
-      return version;
-    }
-
-    this.configureProxyIfNecessary_();
-    return this.interfaceEndpointClient_.queryVersion().then(
-      onQueryVersion.bind(this));
-  };
-
-  InterfacePtrController.prototype.requireVersion = function(version) {
-    this.configureProxyIfNecessary_();
-
-    if (this.version >= version) {
-      return;
-    }
-    this.version = version;
-    this.interfaceEndpointClient_.requireVersion(version);
-  };
-
-  // ---------------------------------------------------------------------------
-
-  // |request| could be omitted and passed into bind() later.
-  //
-  // Example:
-  //
-  //    // FooImpl implements mojom.Foo.
-  //    function FooImpl() { ... }
-  //    FooImpl.prototype.fooMethod1 = function() { ... }
-  //    FooImpl.prototype.fooMethod2 = function() { ... }
-  //
-  //    var fooPtr = new mojom.FooPtr();
-  //    var request = makeRequest(fooPtr);
-  //    var binding = new Binding(mojom.Foo, new FooImpl(), request);
-  //    fooPtr.fooMethod1();
-  function Binding(interfaceType, impl, requestOrHandle) {
-    this.interfaceType_ = interfaceType;
-    this.impl_ = impl;
-    this.router_ = null;
-    this.interfaceEndpointClient_ = null;
-    this.stub_ = null;
-
-    if (requestOrHandle)
-      this.bind(requestOrHandle);
-  }
-
-  Binding.prototype.isBound = function() {
-    return this.router_ !== null;
-  };
-
-  Binding.prototype.createInterfacePtrAndBind = function() {
-    var ptr = new this.interfaceType_.ptrClass();
-    // TODO(yzshen): Set the version of the interface pointer.
-    this.bind(makeRequest(ptr));
-    return ptr;
-  };
-
-  Binding.prototype.bind = function(requestOrHandle) {
-    this.close();
-
-    var handle = requestOrHandle instanceof types.InterfaceRequest ?
-        requestOrHandle.handle : requestOrHandle;
-    if (!core.isHandle(handle))
-      return;
-
-    this.router_ = new router.Router(handle);
-
-    this.stub_ = new this.interfaceType_.stubClass(this.impl_);
-    this.interfaceEndpointClient_ = new InterfaceEndpointClient(
-        this.router_.createLocalEndpointHandle(types.kMasterInterfaceId),
-        this.router_, this.interfaceType_.kVersion);
-    this.interfaceEndpointClient_.setIncomingReceiver(this.stub_);
-    this.interfaceEndpointClient_ .setPayloadValidators([
-        this.interfaceType_.validateRequest]);
-  };
-
-  Binding.prototype.close = function() {
-    if (!this.isBound())
-      return;
-
-    if (this.interfaceEndpointClient_) {
-      this.interfaceEndpointClient_.close();
-      this.interfaceEndpointClient_ = null;
-    }
-
-    this.router_.close();
-    this.router_ = null;
-    this.stub_ = null;
-  };
-
-  Binding.prototype.closeWithReason = function(reason) {
-    if (this.interfaceEndpointClient_) {
-      this.interfaceEndpointClient_.close(reason);
-      this.interfaceEndpointClient_ = null;
-    }
-    this.close();
-  };
-
-  Binding.prototype.setConnectionErrorHandler
-      = function(callback) {
-    if (!this.isBound()) {
-      throw new Error("Cannot set connection error handler if not bound.");
-    }
-    this.interfaceEndpointClient_.setConnectionErrorHandler(callback);
-  };
-
-  Binding.prototype.unbind = function() {
-    if (!this.isBound())
-      return new types.InterfaceRequest(null);
-
-    var result = new types.InterfaceRequest(this.router_.connector_.handle_);
-    this.router_.connector_.handle_ = null;
-    this.close();
-    return result;
-  };
-
-  Binding.prototype.waitForNextMessageForTesting = function() {
-    this.router_.waitForNextMessageForTesting();
-  };
-
-  // ---------------------------------------------------------------------------
-
-  function BindingSetEntry(bindingSet, interfaceType, impl, requestOrHandle,
-                           bindingId) {
-    this.bindingSet_ = bindingSet;
-    this.bindingId_ = bindingId;
-    this.binding_ = new Binding(interfaceType, impl, requestOrHandle);
-
-    this.binding_.setConnectionErrorHandler(function() {
-      this.bindingSet_.onConnectionError(bindingId);
-    }.bind(this));
-  }
-
-  BindingSetEntry.prototype.close = function() {
-    this.binding_.close();
-  };
-
-  function BindingSet(interfaceType) {
-    this.interfaceType_ = interfaceType;
-    this.nextBindingId_ = 0;
-    this.bindings_ = new Map();
-    this.errorHandler_ = null;
-  }
-
-  BindingSet.prototype.isEmpty = function() {
-    return this.bindings_.size == 0;
-  };
-
-  BindingSet.prototype.addBinding = function(impl, requestOrHandle) {
-    this.bindings_.set(
-        this.nextBindingId_,
-        new BindingSetEntry(this, this.interfaceType_, impl, requestOrHandle,
-                            this.nextBindingId_));
-    ++this.nextBindingId_;
-  };
-
-  BindingSet.prototype.closeAllBindings = function() {
-    for (var entry of this.bindings_.values())
-      entry.close();
-    this.bindings_.clear();
-  };
-
-  BindingSet.prototype.setConnectionErrorHandler = function(callback) {
-    this.errorHandler_ = callback;
-  };
-
-  BindingSet.prototype.onConnectionError = function(bindingId) {
-    this.bindings_.delete(bindingId);
-
-    if (this.errorHandler_)
-      this.errorHandler_();
-  };
-
-  var exports = {};
-  exports.InterfacePtrInfo = types.InterfacePtrInfo;
-  exports.InterfaceRequest = types.InterfaceRequest;
-  exports.makeRequest = makeRequest;
-  exports.InterfacePtrController = InterfacePtrController;
-  exports.Binding = Binding;
-  exports.BindingSet = BindingSet;
-
-  return exports;
-});
diff --git a/mojo/public/js/buffer.js b/mojo/public/js/buffer.js
deleted file mode 100644
index e35f695..0000000
--- a/mojo/public/js/buffer.js
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/buffer", function() {
-
-  var kHostIsLittleEndian = (function () {
-    var endianArrayBuffer = new ArrayBuffer(2);
-    var endianUint8Array = new Uint8Array(endianArrayBuffer);
-    var endianUint16Array = new Uint16Array(endianArrayBuffer);
-    endianUint16Array[0] = 1;
-    return endianUint8Array[0] == 1;
-  })();
-
-  var kHighWordMultiplier = 0x100000000;
-
-  function Buffer(sizeOrArrayBuffer) {
-    if (sizeOrArrayBuffer instanceof ArrayBuffer)
-      this.arrayBuffer = sizeOrArrayBuffer;
-    else
-      this.arrayBuffer = new ArrayBuffer(sizeOrArrayBuffer);
-
-    this.dataView = new DataView(this.arrayBuffer);
-    this.next = 0;
-  }
-
-  Object.defineProperty(Buffer.prototype, "byteLength", {
-    get: function() { return this.arrayBuffer.byteLength; }
-  });
-
-  Buffer.prototype.alloc = function(size) {
-    var pointer = this.next;
-    this.next += size;
-    if (this.next > this.byteLength) {
-      var newSize = (1.5 * (this.byteLength + size)) | 0;
-      this.grow(newSize);
-    }
-    return pointer;
-  };
-
-  function copyArrayBuffer(dstArrayBuffer, srcArrayBuffer) {
-    (new Uint8Array(dstArrayBuffer)).set(new Uint8Array(srcArrayBuffer));
-  }
-
-  Buffer.prototype.grow = function(size) {
-    var newArrayBuffer = new ArrayBuffer(size);
-    copyArrayBuffer(newArrayBuffer, this.arrayBuffer);
-    this.arrayBuffer = newArrayBuffer;
-    this.dataView = new DataView(this.arrayBuffer);
-  };
-
-  Buffer.prototype.trim = function() {
-    this.arrayBuffer = this.arrayBuffer.slice(0, this.next);
-    this.dataView = new DataView(this.arrayBuffer);
-  };
-
-  Buffer.prototype.getUint8 = function(offset) {
-    return this.dataView.getUint8(offset);
-  }
-  Buffer.prototype.getUint16 = function(offset) {
-    return this.dataView.getUint16(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getUint32 = function(offset) {
-    return this.dataView.getUint32(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getUint64 = function(offset) {
-    var lo, hi;
-    if (kHostIsLittleEndian) {
-      lo = this.dataView.getUint32(offset, kHostIsLittleEndian);
-      hi = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
-    } else {
-      hi = this.dataView.getUint32(offset, kHostIsLittleEndian);
-      lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
-    }
-    return lo + hi * kHighWordMultiplier;
-  }
-
-  Buffer.prototype.getInt8 = function(offset) {
-    return this.dataView.getInt8(offset);
-  }
-  Buffer.prototype.getInt16 = function(offset) {
-    return this.dataView.getInt16(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getInt32 = function(offset) {
-    return this.dataView.getInt32(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getInt64 = function(offset) {
-    var lo, hi;
-    if (kHostIsLittleEndian) {
-      lo = this.dataView.getUint32(offset, kHostIsLittleEndian);
-      hi = this.dataView.getInt32(offset + 4, kHostIsLittleEndian);
-    } else {
-      hi = this.dataView.getInt32(offset, kHostIsLittleEndian);
-      lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
-    }
-    return lo + hi * kHighWordMultiplier;
-  }
-
-  Buffer.prototype.getFloat32 = function(offset) {
-    return this.dataView.getFloat32(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getFloat64 = function(offset) {
-    return this.dataView.getFloat64(offset, kHostIsLittleEndian);
-  }
-
-  Buffer.prototype.setUint8 = function(offset, value) {
-    this.dataView.setUint8(offset, value);
-  }
-  Buffer.prototype.setUint16 = function(offset, value) {
-    this.dataView.setUint16(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setUint32 = function(offset, value) {
-    this.dataView.setUint32(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setUint64 = function(offset, value) {
-    var hi = (value / kHighWordMultiplier) | 0;
-    if (kHostIsLittleEndian) {
-      this.dataView.setInt32(offset, value, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian);
-    } else {
-      this.dataView.setInt32(offset, hi, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian);
-    }
-  }
-
-  Buffer.prototype.setInt8 = function(offset, value) {
-    this.dataView.setInt8(offset, value);
-  }
-  Buffer.prototype.setInt16 = function(offset, value) {
-    this.dataView.setInt16(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setInt32 = function(offset, value) {
-    this.dataView.setInt32(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setInt64 = function(offset, value) {
-    var hi = Math.floor(value / kHighWordMultiplier);
-    if (kHostIsLittleEndian) {
-      this.dataView.setInt32(offset, value, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian);
-    } else {
-      this.dataView.setInt32(offset, hi, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian);
-    }
-  }
-
-  Buffer.prototype.setFloat32 = function(offset, value) {
-    this.dataView.setFloat32(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setFloat64 = function(offset, value) {
-    this.dataView.setFloat64(offset, value, kHostIsLittleEndian);
-  }
-
-  var exports = {};
-  exports.Buffer = Buffer;
-  return exports;
-});
diff --git a/mojo/public/js/codec.js b/mojo/public/js/codec.js
deleted file mode 100644
index ce58a8c..0000000
--- a/mojo/public/js/codec.js
+++ /dev/null
@@ -1,926 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/codec", [
-  "mojo/public/js/buffer",
-  "mojo/public/js/interface_types",
-  "mojo/public/js/unicode",
-], function(buffer, types, unicode) {
-
-  var kErrorUnsigned = "Passing negative value to unsigned";
-  var kErrorArray = "Passing non Array for array type";
-  var kErrorString = "Passing non String for string type";
-  var kErrorMap = "Passing non Map for map type";
-
-  // Memory -------------------------------------------------------------------
-
-  var kAlignment = 8;
-
-  function align(size) {
-    return size + (kAlignment - (size % kAlignment)) % kAlignment;
-  }
-
-  function isAligned(offset) {
-    return offset >= 0 && (offset % kAlignment) === 0;
-  }
-
-  // Constants ----------------------------------------------------------------
-
-  var kArrayHeaderSize = 8;
-  var kStructHeaderSize = 8;
-  var kMessageHeaderSize = 24;
-  var kMessageWithRequestIDHeaderSize = 32;
-  var kMapStructPayloadSize = 16;
-
-  var kStructHeaderNumBytesOffset = 0;
-  var kStructHeaderVersionOffset = 4;
-
-  var kEncodedInvalidHandleValue = 0xFFFFFFFF;
-
-  // Decoder ------------------------------------------------------------------
-
-  function Decoder(buffer, handles, base) {
-    this.buffer = buffer;
-    this.handles = handles;
-    this.base = base;
-    this.next = base;
-  }
-
-  Decoder.prototype.align = function() {
-    this.next = align(this.next);
-  };
-
-  Decoder.prototype.skip = function(offset) {
-    this.next += offset;
-  };
-
-  Decoder.prototype.readInt8 = function() {
-    var result = this.buffer.getInt8(this.next);
-    this.next += 1;
-    return result;
-  };
-
-  Decoder.prototype.readUint8 = function() {
-    var result = this.buffer.getUint8(this.next);
-    this.next += 1;
-    return result;
-  };
-
-  Decoder.prototype.readInt16 = function() {
-    var result = this.buffer.getInt16(this.next);
-    this.next += 2;
-    return result;
-  };
-
-  Decoder.prototype.readUint16 = function() {
-    var result = this.buffer.getUint16(this.next);
-    this.next += 2;
-    return result;
-  };
-
-  Decoder.prototype.readInt32 = function() {
-    var result = this.buffer.getInt32(this.next);
-    this.next += 4;
-    return result;
-  };
-
-  Decoder.prototype.readUint32 = function() {
-    var result = this.buffer.getUint32(this.next);
-    this.next += 4;
-    return result;
-  };
-
-  Decoder.prototype.readInt64 = function() {
-    var result = this.buffer.getInt64(this.next);
-    this.next += 8;
-    return result;
-  };
-
-  Decoder.prototype.readUint64 = function() {
-    var result = this.buffer.getUint64(this.next);
-    this.next += 8;
-    return result;
-  };
-
-  Decoder.prototype.readFloat = function() {
-    var result = this.buffer.getFloat32(this.next);
-    this.next += 4;
-    return result;
-  };
-
-  Decoder.prototype.readDouble = function() {
-    var result = this.buffer.getFloat64(this.next);
-    this.next += 8;
-    return result;
-  };
-
-  Decoder.prototype.decodePointer = function() {
-    // TODO(abarth): To correctly decode a pointer, we need to know the real
-    // base address of the array buffer.
-    var offsetPointer = this.next;
-    var offset = this.readUint64();
-    if (!offset)
-      return 0;
-    return offsetPointer + offset;
-  };
-
-  Decoder.prototype.decodeAndCreateDecoder = function(pointer) {
-    return new Decoder(this.buffer, this.handles, pointer);
-  };
-
-  Decoder.prototype.decodeHandle = function() {
-    return this.handles[this.readUint32()] || null;
-  };
-
-  Decoder.prototype.decodeString = function() {
-    var numberOfBytes = this.readUint32();
-    var numberOfElements = this.readUint32();
-    var base = this.next;
-    this.next += numberOfElements;
-    return unicode.decodeUtf8String(
-        new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements));
-  };
-
-  Decoder.prototype.decodeArray = function(cls) {
-    var numberOfBytes = this.readUint32();
-    var numberOfElements = this.readUint32();
-    var val = new Array(numberOfElements);
-    if (cls === PackedBool) {
-      var byte;
-      for (var i = 0; i < numberOfElements; ++i) {
-        if (i % 8 === 0)
-          byte = this.readUint8();
-        val[i] = (byte & (1 << i % 8)) ? true : false;
-      }
-    } else {
-      for (var i = 0; i < numberOfElements; ++i) {
-        val[i] = cls.decode(this);
-      }
-    }
-    return val;
-  };
-
-  Decoder.prototype.decodeStruct = function(cls) {
-    return cls.decode(this);
-  };
-
-  Decoder.prototype.decodeStructPointer = function(cls) {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return cls.decode(this.decodeAndCreateDecoder(pointer));
-  };
-
-  Decoder.prototype.decodeArrayPointer = function(cls) {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return this.decodeAndCreateDecoder(pointer).decodeArray(cls);
-  };
-
-  Decoder.prototype.decodeStringPointer = function() {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return this.decodeAndCreateDecoder(pointer).decodeString();
-  };
-
-  Decoder.prototype.decodeMap = function(keyClass, valueClass) {
-    this.skip(4); // numberOfBytes
-    this.skip(4); // version
-    var keys = this.decodeArrayPointer(keyClass);
-    var values = this.decodeArrayPointer(valueClass);
-    var val = new Map();
-    for (var i = 0; i < keys.length; i++)
-      val.set(keys[i], values[i]);
-    return val;
-  };
-
-  Decoder.prototype.decodeMapPointer = function(keyClass, valueClass) {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    var decoder = this.decodeAndCreateDecoder(pointer);
-    return decoder.decodeMap(keyClass, valueClass);
-  };
-
-  // Encoder ------------------------------------------------------------------
-
-  function Encoder(buffer, handles, base) {
-    this.buffer = buffer;
-    this.handles = handles;
-    this.base = base;
-    this.next = base;
-  }
-
-  Encoder.prototype.align = function() {
-    this.next = align(this.next);
-  };
-
-  Encoder.prototype.skip = function(offset) {
-    this.next += offset;
-  };
-
-  Encoder.prototype.writeInt8 = function(val) {
-    this.buffer.setInt8(this.next, val);
-    this.next += 1;
-  };
-
-  Encoder.prototype.writeUint8 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint8(this.next, val);
-    this.next += 1;
-  };
-
-  Encoder.prototype.writeInt16 = function(val) {
-    this.buffer.setInt16(this.next, val);
-    this.next += 2;
-  };
-
-  Encoder.prototype.writeUint16 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint16(this.next, val);
-    this.next += 2;
-  };
-
-  Encoder.prototype.writeInt32 = function(val) {
-    this.buffer.setInt32(this.next, val);
-    this.next += 4;
-  };
-
-  Encoder.prototype.writeUint32 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint32(this.next, val);
-    this.next += 4;
-  };
-
-  Encoder.prototype.writeInt64 = function(val) {
-    this.buffer.setInt64(this.next, val);
-    this.next += 8;
-  };
-
-  Encoder.prototype.writeUint64 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint64(this.next, val);
-    this.next += 8;
-  };
-
-  Encoder.prototype.writeFloat = function(val) {
-    this.buffer.setFloat32(this.next, val);
-    this.next += 4;
-  };
-
-  Encoder.prototype.writeDouble = function(val) {
-    this.buffer.setFloat64(this.next, val);
-    this.next += 8;
-  };
-
-  Encoder.prototype.encodePointer = function(pointer) {
-    if (!pointer)
-      return this.writeUint64(0);
-    // TODO(abarth): To correctly encode a pointer, we need to know the real
-    // base address of the array buffer.
-    var offset = pointer - this.next;
-    this.writeUint64(offset);
-  };
-
-  Encoder.prototype.createAndEncodeEncoder = function(size) {
-    var pointer = this.buffer.alloc(align(size));
-    this.encodePointer(pointer);
-    return new Encoder(this.buffer, this.handles, pointer);
-  };
-
-  Encoder.prototype.encodeHandle = function(handle) {
-    if (handle) {
-      this.handles.push(handle);
-      this.writeUint32(this.handles.length - 1);
-    } else {
-      this.writeUint32(kEncodedInvalidHandleValue);
-    }
-  };
-
-  Encoder.prototype.encodeString = function(val) {
-    var base = this.next + kArrayHeaderSize;
-    var numberOfElements = unicode.encodeUtf8String(
-        val, new Uint8Array(this.buffer.arrayBuffer, base));
-    var numberOfBytes = kArrayHeaderSize + numberOfElements;
-    this.writeUint32(numberOfBytes);
-    this.writeUint32(numberOfElements);
-    this.next += numberOfElements;
-  };
-
-  Encoder.prototype.encodeArray =
-      function(cls, val, numberOfElements, encodedSize) {
-    if (numberOfElements === undefined)
-      numberOfElements = val.length;
-    if (encodedSize === undefined)
-      encodedSize = kArrayHeaderSize + cls.encodedSize * numberOfElements;
-
-    this.writeUint32(encodedSize);
-    this.writeUint32(numberOfElements);
-
-    if (cls === PackedBool) {
-      var byte = 0;
-      for (i = 0; i < numberOfElements; ++i) {
-        if (val[i])
-          byte |= (1 << i % 8);
-        if (i % 8 === 7 || i == numberOfElements - 1) {
-          Uint8.encode(this, byte);
-          byte = 0;
-        }
-      }
-    } else {
-      for (var i = 0; i < numberOfElements; ++i)
-        cls.encode(this, val[i]);
-    }
-  };
-
-  Encoder.prototype.encodeStruct = function(cls, val) {
-    return cls.encode(this, val);
-  };
-
-  Encoder.prototype.encodeStructPointer = function(cls, val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-    var encoder = this.createAndEncodeEncoder(cls.encodedSize);
-    cls.encode(encoder, val);
-  };
-
-  Encoder.prototype.encodeArrayPointer = function(cls, val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-
-    var numberOfElements = val.length;
-    if (!Number.isSafeInteger(numberOfElements) || numberOfElements < 0)
-      throw new Error(kErrorArray);
-
-    var encodedSize = kArrayHeaderSize + ((cls === PackedBool) ?
-        Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements);
-    var encoder = this.createAndEncodeEncoder(encodedSize);
-    encoder.encodeArray(cls, val, numberOfElements, encodedSize);
-  };
-
-  Encoder.prototype.encodeStringPointer = function(val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-    // Only accepts string primivites, not String Objects like new String("foo")
-    if (typeof(val) !== "string") {
-      throw new Error(kErrorString);
-    }
-    var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
-    var encoder = this.createAndEncodeEncoder(encodedSize);
-    encoder.encodeString(val);
-  };
-
-  Encoder.prototype.encodeMap = function(keyClass, valueClass, val) {
-    var keys = new Array(val.size);
-    var values = new Array(val.size);
-    var i = 0;
-    val.forEach(function(value, key) {
-      values[i] = value;
-      keys[i++] = key;
-    });
-    this.writeUint32(kStructHeaderSize + kMapStructPayloadSize);
-    this.writeUint32(0);  // version
-    this.encodeArrayPointer(keyClass, keys);
-    this.encodeArrayPointer(valueClass, values);
-  }
-
-  Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-    if (!(val instanceof Map)) {
-      throw new Error(kErrorMap);
-    }
-    var encodedSize = kStructHeaderSize + kMapStructPayloadSize;
-    var encoder = this.createAndEncodeEncoder(encodedSize);
-    encoder.encodeMap(keyClass, valueClass, val);
-  };
-
-  // Message ------------------------------------------------------------------
-
-  var kMessageInterfaceIdOffset = kStructHeaderSize;
-  var kMessageNameOffset = kMessageInterfaceIdOffset + 4;
-  var kMessageFlagsOffset = kMessageNameOffset + 4;
-  var kMessageRequestIDOffset = kMessageFlagsOffset + 8;
-
-  var kMessageExpectsResponse = 1 << 0;
-  var kMessageIsResponse      = 1 << 1;
-
-  function Message(buffer, handles) {
-    this.buffer = buffer;
-    this.handles = handles;
-  }
-
-  Message.prototype.getHeaderNumBytes = function() {
-    return this.buffer.getUint32(kStructHeaderNumBytesOffset);
-  };
-
-  Message.prototype.getHeaderVersion = function() {
-    return this.buffer.getUint32(kStructHeaderVersionOffset);
-  };
-
-  Message.prototype.getName = function() {
-    return this.buffer.getUint32(kMessageNameOffset);
-  };
-
-  Message.prototype.getFlags = function() {
-    return this.buffer.getUint32(kMessageFlagsOffset);
-  };
-
-  Message.prototype.getInterfaceId = function() {
-    return this.buffer.getUint32(kMessageInterfaceIdOffset);
-  };
-
-  Message.prototype.isResponse = function() {
-    return (this.getFlags() & kMessageIsResponse) != 0;
-  };
-
-  Message.prototype.expectsResponse = function() {
-    return (this.getFlags() & kMessageExpectsResponse) != 0;
-  };
-
-  Message.prototype.setRequestID = function(requestID) {
-    // TODO(darin): Verify that space was reserved for this field!
-    this.buffer.setUint64(kMessageRequestIDOffset, requestID);
-  };
-
-  Message.prototype.setInterfaceId = function(interfaceId) {
-    this.buffer.setUint32(kMessageInterfaceIdOffset, interfaceId);
-  };
-
-
-  // MessageBuilder -----------------------------------------------------------
-
-  function MessageBuilder(messageName, payloadSize) {
-    // Currently, we don't compute the payload size correctly ahead of time.
-    // Instead, we resize the buffer at the end.
-    var numberOfBytes = kMessageHeaderSize + payloadSize;
-    this.buffer = new buffer.Buffer(numberOfBytes);
-    this.handles = [];
-    var encoder = this.createEncoder(kMessageHeaderSize);
-    encoder.writeUint32(kMessageHeaderSize);
-    encoder.writeUint32(0);  // version.
-    encoder.writeUint32(0);  // interface ID.
-    encoder.writeUint32(messageName);
-    encoder.writeUint32(0);  // flags.
-    encoder.writeUint32(0);  // padding.
-  }
-
-  MessageBuilder.prototype.createEncoder = function(size) {
-    var pointer = this.buffer.alloc(size);
-    return new Encoder(this.buffer, this.handles, pointer);
-  };
-
-  MessageBuilder.prototype.encodeStruct = function(cls, val) {
-    cls.encode(this.createEncoder(cls.encodedSize), val);
-  };
-
-  MessageBuilder.prototype.finish = function() {
-    // TODO(abarth): Rather than resizing the buffer at the end, we could
-    // compute the size we need ahead of time, like we do in C++.
-    this.buffer.trim();
-    var message = new Message(this.buffer, this.handles);
-    this.buffer = null;
-    this.handles = null;
-    this.encoder = null;
-    return message;
-  };
-
-  // MessageWithRequestIDBuilder -----------------------------------------------
-
-  function MessageWithRequestIDBuilder(messageName, payloadSize, flags,
-                                       requestID) {
-    // Currently, we don't compute the payload size correctly ahead of time.
-    // Instead, we resize the buffer at the end.
-    var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize;
-    this.buffer = new buffer.Buffer(numberOfBytes);
-    this.handles = [];
-    var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize);
-    encoder.writeUint32(kMessageWithRequestIDHeaderSize);
-    encoder.writeUint32(1);  // version.
-    encoder.writeUint32(0);  // interface ID.
-    encoder.writeUint32(messageName);
-    encoder.writeUint32(flags);
-    encoder.writeUint32(0);  // padding.
-    encoder.writeUint64(requestID);
-  }
-
-  MessageWithRequestIDBuilder.prototype =
-      Object.create(MessageBuilder.prototype);
-
-  MessageWithRequestIDBuilder.prototype.constructor =
-      MessageWithRequestIDBuilder;
-
-  // MessageReader ------------------------------------------------------------
-
-  function MessageReader(message) {
-    this.decoder = new Decoder(message.buffer, message.handles, 0);
-    var messageHeaderSize = this.decoder.readUint32();
-    this.payloadSize = message.buffer.byteLength - messageHeaderSize;
-    var version = this.decoder.readUint32();
-    var interface_id = this.decoder.readUint32();
-    this.messageName = this.decoder.readUint32();
-    this.flags = this.decoder.readUint32();
-    // Skip the padding.
-    this.decoder.skip(4);
-    if (version >= 1)
-      this.requestID = this.decoder.readUint64();
-    this.decoder.skip(messageHeaderSize - this.decoder.next);
-  }
-
-  MessageReader.prototype.decodeStruct = function(cls) {
-    return cls.decode(this.decoder);
-  };
-
-  // Built-in types -----------------------------------------------------------
-
-  // This type is only used with ArrayOf(PackedBool).
-  function PackedBool() {
-  }
-
-  function Int8() {
-  }
-
-  Int8.encodedSize = 1;
-
-  Int8.decode = function(decoder) {
-    return decoder.readInt8();
-  };
-
-  Int8.encode = function(encoder, val) {
-    encoder.writeInt8(val);
-  };
-
-  Uint8.encode = function(encoder, val) {
-    encoder.writeUint8(val);
-  };
-
-  function Uint8() {
-  }
-
-  Uint8.encodedSize = 1;
-
-  Uint8.decode = function(decoder) {
-    return decoder.readUint8();
-  };
-
-  Uint8.encode = function(encoder, val) {
-    encoder.writeUint8(val);
-  };
-
-  function Int16() {
-  }
-
-  Int16.encodedSize = 2;
-
-  Int16.decode = function(decoder) {
-    return decoder.readInt16();
-  };
-
-  Int16.encode = function(encoder, val) {
-    encoder.writeInt16(val);
-  };
-
-  function Uint16() {
-  }
-
-  Uint16.encodedSize = 2;
-
-  Uint16.decode = function(decoder) {
-    return decoder.readUint16();
-  };
-
-  Uint16.encode = function(encoder, val) {
-    encoder.writeUint16(val);
-  };
-
-  function Int32() {
-  }
-
-  Int32.encodedSize = 4;
-
-  Int32.decode = function(decoder) {
-    return decoder.readInt32();
-  };
-
-  Int32.encode = function(encoder, val) {
-    encoder.writeInt32(val);
-  };
-
-  function Uint32() {
-  }
-
-  Uint32.encodedSize = 4;
-
-  Uint32.decode = function(decoder) {
-    return decoder.readUint32();
-  };
-
-  Uint32.encode = function(encoder, val) {
-    encoder.writeUint32(val);
-  };
-
-  function Int64() {
-  }
-
-  Int64.encodedSize = 8;
-
-  Int64.decode = function(decoder) {
-    return decoder.readInt64();
-  };
-
-  Int64.encode = function(encoder, val) {
-    encoder.writeInt64(val);
-  };
-
-  function Uint64() {
-  }
-
-  Uint64.encodedSize = 8;
-
-  Uint64.decode = function(decoder) {
-    return decoder.readUint64();
-  };
-
-  Uint64.encode = function(encoder, val) {
-    encoder.writeUint64(val);
-  };
-
-  function String() {
-  };
-
-  String.encodedSize = 8;
-
-  String.decode = function(decoder) {
-    return decoder.decodeStringPointer();
-  };
-
-  String.encode = function(encoder, val) {
-    encoder.encodeStringPointer(val);
-  };
-
-  function NullableString() {
-  }
-
-  NullableString.encodedSize = String.encodedSize;
-
-  NullableString.decode = String.decode;
-
-  NullableString.encode = String.encode;
-
-  function Float() {
-  }
-
-  Float.encodedSize = 4;
-
-  Float.decode = function(decoder) {
-    return decoder.readFloat();
-  };
-
-  Float.encode = function(encoder, val) {
-    encoder.writeFloat(val);
-  };
-
-  function Double() {
-  }
-
-  Double.encodedSize = 8;
-
-  Double.decode = function(decoder) {
-    return decoder.readDouble();
-  };
-
-  Double.encode = function(encoder, val) {
-    encoder.writeDouble(val);
-  };
-
-  function Enum(cls) {
-    this.cls = cls;
-  }
-
-  Enum.prototype.encodedSize = 4;
-
-  Enum.prototype.decode = function(decoder) {
-    return decoder.readInt32();
-  };
-
-  Enum.prototype.encode = function(encoder, val) {
-    encoder.writeInt32(val);
-  };
-
-  function PointerTo(cls) {
-    this.cls = cls;
-  }
-
-  PointerTo.prototype.encodedSize = 8;
-
-  PointerTo.prototype.decode = function(decoder) {
-    var pointer = decoder.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return this.cls.decode(decoder.decodeAndCreateDecoder(pointer));
-  };
-
-  PointerTo.prototype.encode = function(encoder, val) {
-    if (!val) {
-      encoder.encodePointer(val);
-      return;
-    }
-    var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize);
-    this.cls.encode(objectEncoder, val);
-  };
-
-  function NullablePointerTo(cls) {
-    PointerTo.call(this, cls);
-  }
-
-  NullablePointerTo.prototype = Object.create(PointerTo.prototype);
-
-  function ArrayOf(cls, length) {
-    this.cls = cls;
-    this.length = length || 0;
-  }
-
-  ArrayOf.prototype.encodedSize = 8;
-
-  ArrayOf.prototype.dimensions = function() {
-    return [this.length].concat(
-      (this.cls instanceof ArrayOf) ? this.cls.dimensions() : []);
-  }
-
-  ArrayOf.prototype.decode = function(decoder) {
-    return decoder.decodeArrayPointer(this.cls);
-  };
-
-  ArrayOf.prototype.encode = function(encoder, val) {
-    encoder.encodeArrayPointer(this.cls, val);
-  };
-
-  function NullableArrayOf(cls) {
-    ArrayOf.call(this, cls);
-  }
-
-  NullableArrayOf.prototype = Object.create(ArrayOf.prototype);
-
-  function Handle() {
-  }
-
-  Handle.encodedSize = 4;
-
-  Handle.decode = function(decoder) {
-    return decoder.decodeHandle();
-  };
-
-  Handle.encode = function(encoder, val) {
-    encoder.encodeHandle(val);
-  };
-
-  function NullableHandle() {
-  }
-
-  NullableHandle.encodedSize = Handle.encodedSize;
-
-  NullableHandle.decode = Handle.decode;
-
-  NullableHandle.encode = Handle.encode;
-
-  function Interface(cls) {
-    this.cls = cls;
-  }
-
-  Interface.prototype.encodedSize = 8;
-
-  Interface.prototype.decode = function(decoder) {
-    var interfacePtrInfo = new types.InterfacePtrInfo(
-        decoder.decodeHandle(), decoder.readUint32());
-    var interfacePtr = new this.cls();
-    interfacePtr.ptr.bind(interfacePtrInfo);
-    return interfacePtr;
-  };
-
-  Interface.prototype.encode = function(encoder, val) {
-    var interfacePtrInfo =
-        val ? val.ptr.passInterface() : new types.InterfacePtrInfo(null, 0);
-    encoder.encodeHandle(interfacePtrInfo.handle);
-    encoder.writeUint32(interfacePtrInfo.version);
-  };
-
-  function NullableInterface(cls) {
-    Interface.call(this, cls);
-  }
-
-  NullableInterface.prototype = Object.create(Interface.prototype);
-
-  function InterfaceRequest() {
-  }
-
-  InterfaceRequest.encodedSize = 4;
-
-  InterfaceRequest.decode = function(decoder) {
-    return new types.InterfaceRequest(decoder.decodeHandle());
-  };
-
-  InterfaceRequest.encode = function(encoder, val) {
-    encoder.encodeHandle(val ? val.handle : null);
-  };
-
-  function NullableInterfaceRequest() {
-  }
-
-  NullableInterfaceRequest.encodedSize = InterfaceRequest.encodedSize;
-
-  NullableInterfaceRequest.decode = InterfaceRequest.decode;
-
-  NullableInterfaceRequest.encode = InterfaceRequest.encode;
-
-  function MapOf(keyClass, valueClass) {
-    this.keyClass = keyClass;
-    this.valueClass = valueClass;
-  }
-
-  MapOf.prototype.encodedSize = 8;
-
-  MapOf.prototype.decode = function(decoder) {
-    return decoder.decodeMapPointer(this.keyClass, this.valueClass);
-  };
-
-  MapOf.prototype.encode = function(encoder, val) {
-    encoder.encodeMapPointer(this.keyClass, this.valueClass, val);
-  };
-
-  function NullableMapOf(keyClass, valueClass) {
-    MapOf.call(this, keyClass, valueClass);
-  }
-
-  NullableMapOf.prototype = Object.create(MapOf.prototype);
-
-  var exports = {};
-  exports.align = align;
-  exports.isAligned = isAligned;
-  exports.Message = Message;
-  exports.MessageBuilder = MessageBuilder;
-  exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder;
-  exports.MessageReader = MessageReader;
-  exports.kArrayHeaderSize = kArrayHeaderSize;
-  exports.kMapStructPayloadSize = kMapStructPayloadSize;
-  exports.kStructHeaderSize = kStructHeaderSize;
-  exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue;
-  exports.kMessageHeaderSize = kMessageHeaderSize;
-  exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize;
-  exports.kMessageExpectsResponse = kMessageExpectsResponse;
-  exports.kMessageIsResponse = kMessageIsResponse;
-  exports.Int8 = Int8;
-  exports.Uint8 = Uint8;
-  exports.Int16 = Int16;
-  exports.Uint16 = Uint16;
-  exports.Int32 = Int32;
-  exports.Uint32 = Uint32;
-  exports.Int64 = Int64;
-  exports.Uint64 = Uint64;
-  exports.Float = Float;
-  exports.Double = Double;
-  exports.String = String;
-  exports.Enum = Enum;
-  exports.NullableString = NullableString;
-  exports.PointerTo = PointerTo;
-  exports.NullablePointerTo = NullablePointerTo;
-  exports.ArrayOf = ArrayOf;
-  exports.NullableArrayOf = NullableArrayOf;
-  exports.PackedBool = PackedBool;
-  exports.Handle = Handle;
-  exports.NullableHandle = NullableHandle;
-  exports.Interface = Interface;
-  exports.NullableInterface = NullableInterface;
-  exports.InterfaceRequest = InterfaceRequest;
-  exports.NullableInterfaceRequest = NullableInterfaceRequest;
-  exports.MapOf = MapOf;
-  exports.NullableMapOf = NullableMapOf;
-  return exports;
-});
diff --git a/mojo/public/js/connector.js b/mojo/public/js/connector.js
deleted file mode 100644
index 012e3c7..0000000
--- a/mojo/public/js/connector.js
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/connector", [
-  "mojo/public/js/buffer",
-  "mojo/public/js/codec",
-  "mojo/public/js/core",
-  "mojo/public/js/support",
-], function(buffer, codec, core, support) {
-
-  function Connector(handle) {
-    if (!core.isHandle(handle))
-      throw new Error("Connector: not a handle " + handle);
-    this.handle_ = handle;
-    this.dropWrites_ = false;
-    this.error_ = false;
-    this.incomingReceiver_ = null;
-    this.readWatcher_ = null;
-    this.errorHandler_ = null;
-
-    if (handle) {
-      this.readWatcher_ = support.watch(handle,
-                                        core.HANDLE_SIGNAL_READABLE,
-                                        this.readMore_.bind(this));
-    }
-  }
-
-  Connector.prototype.close = function() {
-    if (this.readWatcher_) {
-      support.cancelWatch(this.readWatcher_);
-      this.readWatcher_ = null;
-    }
-    if (this.handle_ != null) {
-      core.close(this.handle_);
-      this.handle_ = null;
-    }
-  };
-
-  Connector.prototype.accept = function(message) {
-    if (this.error_)
-      return false;
-
-    if (this.dropWrites_)
-      return true;
-
-    var result = core.writeMessage(this.handle_,
-                                   new Uint8Array(message.buffer.arrayBuffer),
-                                   message.handles,
-                                   core.WRITE_MESSAGE_FLAG_NONE);
-    switch (result) {
-      case core.RESULT_OK:
-        // The handles were successfully transferred, so we don't own them
-        // anymore.
-        message.handles = [];
-        break;
-      case core.RESULT_FAILED_PRECONDITION:
-        // There's no point in continuing to write to this pipe since the other
-        // end is gone. Avoid writing any future messages. Hide write failures
-        // from the caller since we'd like them to continue consuming any
-        // backlog of incoming messages before regarding the message pipe as
-        // closed.
-        this.dropWrites_ = true;
-        break;
-      default:
-        // This particular write was rejected, presumably because of bad input.
-        // The pipe is not necessarily in a bad state.
-        return false;
-    }
-    return true;
-  };
-
-  Connector.prototype.setIncomingReceiver = function(receiver) {
-    this.incomingReceiver_ = receiver;
-  };
-
-  Connector.prototype.setErrorHandler = function(handler) {
-    this.errorHandler_ = handler;
-  };
-
-  Connector.prototype.waitForNextMessageForTesting = function() {
-    var wait = core.wait(this.handle_, core.HANDLE_SIGNAL_READABLE);
-    this.readMore_(wait.result);
-  };
-
-  Connector.prototype.readMore_ = function(result) {
-    for (;;) {
-      var read = core.readMessage(this.handle_,
-                                  core.READ_MESSAGE_FLAG_NONE);
-      if (this.handle_ == null) // The connector has been closed.
-        return;
-      if (read.result == core.RESULT_SHOULD_WAIT)
-        return;
-      if (read.result != core.RESULT_OK) {
-        // TODO(wangjimmy): Add a handleError method to swap the handle to be
-        // closed with a dummy handle in the case when
-        // read.result != MOJO_RESULT_FAILED_PRECONDITION
-        this.error_ = true;
-        if (this.errorHandler_)
-          this.errorHandler_.onError();
-        return;
-      }
-      var messageBuffer = new buffer.Buffer(read.buffer);
-      var message = new codec.Message(messageBuffer, read.handles);
-      if (this.incomingReceiver_)
-        this.incomingReceiver_.accept(message);
-    }
-  };
-
-  var exports = {};
-  exports.Connector = Connector;
-  return exports;
-});
diff --git a/mojo/public/js/constants.cc b/mojo/public/js/constants.cc
deleted file mode 100644
index a0ce7d4..0000000
--- a/mojo/public/js/constants.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/js/constants.h"
-
-namespace mojo {
-
-const char kBindingsModuleName[] = "mojo/public/js/bindings";
-const char kBufferModuleName[] = "mojo/public/js/buffer";
-const char kCodecModuleName[] = "mojo/public/js/codec";
-const char kConnectorModuleName[] = "mojo/public/js/connector";
-const char kControlMessageHandlerModuleName[] =
-    "mojo/public/js/lib/control_message_handler";
-const char kControlMessageProxyModuleName[] =
-    "mojo/public/js/lib/control_message_proxy";
-const char kInterfaceControlMessagesMojom[] =
-    "mojo/public/interfaces/bindings/interface_control_messages.mojom";
-const char kInterfaceEndpointClientModuleName[] =
-    "mojo/public/js/lib/interface_endpoint_client";
-const char kInterfaceEndpointHandleModuleName[] =
-    "mojo/public/js/lib/interface_endpoint_handle";
-const char kInterfaceTypesModuleName[] = "mojo/public/js/interface_types";
-const char kPipeControlMessageHandlerModuleName[] =
-    "mojo/public/js/lib/pipe_control_message_handler";
-const char kPipeControlMessageProxyModuleName[] =
-    "mojo/public/js/lib/pipe_control_message_proxy";
-const char kPipeControlMessagesMojom[] =
-    "mojo/public/interfaces/bindings/pipe_control_messages.mojom";
-const char kRouterModuleName[] = "mojo/public/js/router";
-const char kUnicodeModuleName[] = "mojo/public/js/unicode";
-const char kValidatorModuleName[] = "mojo/public/js/validator";
-}  // namespace mojo
diff --git a/mojo/public/js/constants.h b/mojo/public/js/constants.h
deleted file mode 100644
index f561d73..0000000
--- a/mojo/public/js/constants.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_JS_BINDINGS_CONSTANTS_H_
-#define MOJO_PUBLIC_JS_BINDINGS_CONSTANTS_H_
-
-namespace mojo {
-
-// JavaScript module names:
-extern const char kBindingsModuleName[];
-extern const char kBufferModuleName[];
-extern const char kCodecModuleName[];
-extern const char kConnectorModuleName[];
-extern const char kControlMessageHandlerModuleName[];
-extern const char kControlMessageProxyModuleName[];
-extern const char kInterfaceControlMessagesMojom[];
-extern const char kInterfaceEndpointClientModuleName[];
-extern const char kInterfaceEndpointHandleModuleName[];
-extern const char kInterfaceTypesModuleName[];
-extern const char kPipeControlMessageHandlerModuleName[];
-extern const char kPipeControlMessageProxyModuleName[];
-extern const char kPipeControlMessagesMojom[];
-extern const char kRouterModuleName[];
-extern const char kUnicodeModuleName[];
-extern const char kValidatorModuleName[];
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_JS_BINDINGS_CONSTANTS_H_
diff --git a/mojo/public/js/core.js b/mojo/public/js/core.js
deleted file mode 100644
index b2c4ee2..0000000
--- a/mojo/public/js/core.js
+++ /dev/null
@@ -1,304 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Module "mojo/public/js/core"
-//
-// Note: This file is for documentation purposes only. The code here is not
-// actually executed. The real module is implemented natively in Mojo.
-//
-// This module provides the JavaScript bindings for mojo/public/c/system/core.h.
-// Refer to that file for more detailed documentation for equivalent methods.
-
-while (1);
-
-/**
- * MojoHandle: An opaque handles to a Mojo object (e.g. a message pipe).
- */
-var kInvalidHandle;
-
-/**
- * MojoResult {number}: Result codes for Mojo operations.
- * See core.h for more information.
- */
-var RESULT_OK;
-var RESULT_CANCELLED;
-var RESULT_UNKNOWN;
-var RESULT_INVALID_ARGUMENT;
-var RESULT_DEADLINE_EXCEEDED;
-var RESULT_NOT_FOUND;
-var RESULT_ALREADY_EXISTS;
-var RESULT_PERMISSION_DENIED;
-var RESULT_RESOURCE_EXHAUSTED;
-var RESULT_FAILED_PRECONDITION;
-var RESULT_ABORTED;
-var RESULT_OUT_OF_RANGE;
-var RESULT_UNIMPLEMENTED;
-var RESULT_INTERNAL;
-var RESULT_UNAVAILABLE;
-var RESULT_DATA_LOSS;
-var RESULT_BUSY;
-var RESULT_SHOULD_WAIT;
-
-/**
- * MojoHandleSignals: Used to specify signals that can be waited on for a handle
- *(and which can be triggered), e.g., the ability to read or write to
- * the handle.
- * See core.h for more information.
- */
-var HANDLE_SIGNAL_NONE;
-var HANDLE_SIGNAL_READABLE;
-var HANDLE_SIGNAL_WRITABLE;
-var HANDLE_SIGNAL_PEER_CLOSED;
-
-/**
- * MojoCreateDataMessageOptions: Used to specify creation parameters for a data
- * pipe to |createDataMessage()|.
- * See core.h for more information.
- */
-dictionary MojoCreateDataMessageOptions {
-  MojoCreateDataMessageOptionsFlags flags;  // See below.
-};
-
-// MojoCreateDataMessageOptionsFlags
-var CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE;
-
-/*
- * MojoWriteMessageFlags: Used to specify different modes to |writeMessage()|.
- * See core.h for more information.
- */
-var WRITE_MESSAGE_FLAG_NONE;
-
-/**
- * MojoReadMessageFlags: Used to specify different modes to |readMessage()|.
- * See core.h for more information.
- */
-var READ_MESSAGE_FLAG_NONE;
-var READ_MESSAGE_FLAG_MAY_DISCARD;
-
-/**
- * MojoCreateDataPipeOptions: Used to specify creation parameters for a data
- * pipe to |createDataPipe()|.
- * See core.h for more information.
- */
-dictionary MojoCreateDataPipeOptions {
-  MojoCreateDataPipeOptionsFlags flags;  // See below.
-  int32 elementNumBytes;  // The size of an element, in bytes.
-  int32 capacityNumBytes;  // The capacity of the data pipe, in bytes.
-};
-
-// MojoCreateDataPipeOptionsFlags
-var CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
-
-/*
- * MojoWriteDataFlags: Used to specify different modes to |writeData()|.
- * See core.h for more information.
- */
-var WRITE_DATA_FLAG_NONE;
-var WRITE_DATA_FLAG_ALL_OR_NONE;
-
-/**
- * MojoReadDataFlags: Used to specify different modes to |readData()|.
- * See core.h for more information.
- */
-var READ_DATA_FLAG_NONE;
-var READ_DATA_FLAG_ALL_OR_NONE;
-var READ_DATA_FLAG_DISCARD;
-var READ_DATA_FLAG_QUERY;
-var READ_DATA_FLAG_PEEK;
-
-/**
- * MojoCreateSharedBufferOptionsFlags: Used to specify options to
- *   |createSharedBuffer()|.
- * See core.h for more information.
- */
-var CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
-
-/**
- * MojoDuplicateBufferHandleOptionsFlags: Used to specify options to
- *   |duplicateBufferHandle()|.
- * See core.h for more information.
- */
-var DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE;
-var DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
-
-/**
- * MojoMapBufferFlags: Used to specify options to |mapBuffer()|.
- * See core.h for more information.
- */
-var MAP_BUFFER_FLAG_NONE;
-
-/**
- * Closes the given |handle|. See MojoClose for more info.
- * @param {MojoHandle} Handle to close.
- * @return {MojoResult} Result code.
- */
-function close(handle) { [native code] }
-
-/**
- * Queries the last known signaling state of |handle|.
- *
- * @param {MojoHandle} handle Handle to query.
- * @return {object} An object of the form {
- *     result,              // MOJO_RESULT_OK or MOJO_RESULT_INVALID_ARGUMENT
- *     satisfiedSignals,    // MojoHandleSignals (see above)
- *     satisfiableSignals,  // MojoHandleSignals
- * }
- */
-function queryHandleSignalsState(handle) { [native code] }
-
-/**
- * Waits on the given handle until a signal indicated by |signals| is
- * satisfied or an error occurs.
- *
- * @param {MojoHandle} handle Handle to wait on.
- * @param {MojoHandleSignals} signals Specifies the condition to wait for.
- * @return {MojoResult} Result code.
- */
-function wait(handle, signals) { [native code] }
-
-/**
- * Creates a message pipe. This function always succeeds.
- * See MojoCreateMessagePipe for more information on message pipes.
- *
- * @param {MojoCreateMessagePipeOptions} optionsDict Options to control the
- * message pipe parameters. May be null.
- * @return {MessagePipe} An object of the form {
- *     handle0,
- *     handle1,
- *   }
- *   where |handle0| and |handle1| are MojoHandles to each end of the channel.
- */
-function createMessagePipe(optionsDict) { [native code] }
-
-/**
- * Writes a message to the message pipe endpoint given by |handle|. See
- * MojoWriteMessage for more information, including return codes.
- *
- * @param {MojoHandle} handle The endpoint to write to.
- * @param {ArrayBufferView} buffer The message data. May be empty.
- * @param {Array.MojoHandle} handlesArray Any handles to attach. Handles are
- *   transferred on success and will no longer be valid. May be empty.
- * @param {MojoWriteMessageFlags} flags Flags.
- * @return {MojoResult} Result code.
- */
-function writeMessage(handle, buffer, handlesArray, flags) { [native code] }
-
-/**
- * Reads a message from the message pipe endpoint given by |handle|. See
- * MojoReadMessage for more information, including return codes.
- *
- * @param {MojoHandle} handle The endpoint to read from.
- * @param {MojoReadMessageFlags} flags Flags.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     buffer,  // An ArrayBufferView of the message data (only on success).
- *     handles  // An array of MojoHandles transferred, if any.
- *   }
- */
-function readMessage(handle, flags) { [native code] }
-
-/**
- * Creates a data pipe, which is a unidirectional communication channel for
- * unframed data, with the given options. See MojoCreateDataPipe for more
- * more information, including return codes.
- *
- * @param {MojoCreateDataPipeOptions} optionsDict Options to control the data
- *   pipe parameters. May be null.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     producerHandle,  // MojoHandle to use with writeData (only on success).
- *     consumerHandle,  // MojoHandle to use with readData (only on success).
- *   }
- */
-function createDataPipe(optionsDict) { [native code] }
-
-/**
- * Writes the given data to the data pipe producer given by |handle|. See
- * MojoWriteData for more information, including return codes.
- *
- * @param {MojoHandle} handle A producerHandle returned by createDataPipe.
- * @param {ArrayBufferView} buffer The data to write.
- * @param {MojoWriteDataFlags} flags Flags.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     numBytes,  // The number of bytes written.
- *   }
- */
-function writeData(handle, buffer, flags) { [native code] }
-
-/**
- * Reads data from the data pipe consumer given by |handle|. May also
- * be used to discard data. See MojoReadData for more information, including
- * return codes.
- *
- * @param {MojoHandle} handle A consumerHandle returned by createDataPipe.
- * @param {MojoReadDataFlags} flags Flags.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     buffer,  // An ArrayBufferView of the data read (only on success).
- *   }
- */
-function readData(handle, flags) { [native code] }
-
-/**
- * True if the argument is a message or data pipe handle.
- *
- * @param {value} an arbitrary JS value.
- * @return true or false
- */
-function isHandle(value) { [native code] }
-
-/**
- * Creates shared buffer of specified size |num_bytes|.
- * See MojoCreateSharedBuffer for more information including error codes.
- *
- * @param {number} num_bytes Size of the memory to be allocated for shared
- * @param {MojoCreateSharedBufferOptionsFlags} flags Flags.
- *   buffer.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     handle,  // An MojoHandle for shared buffer (only on success).
- *   }
- */
-function createSharedBuffer(num_bytes, flags) { [native code] }
-
-/**
- * Duplicates the |buffer_handle| to a shared buffer. Duplicated handle can be
- * sent to another process over message pipe. See MojoDuplicateBufferHandle for
- * more information including error codes.
- *
- * @param {MojoHandle} buffer_handle MojoHandle.
- * @param {MojoCreateSharedBufferOptionsFlags} flags Flags.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     handle,  // A duplicated MojoHandle for shared buffer (only on success).
- *   }
- */
-function duplicateBufferHandle(buffer_handle, flags) { [native code] }
-
-/**
- * Maps the part (at offset |offset| of length |num_bytes|) of the buffer given
- * by |buffer_handle| into ArrayBuffer memory |buffer|, with options specified
- * by |flags|. See MojoMapBuffer for more information including error codes.
- *
- * @param {MojoHandle} buffer_handle A sharedBufferHandle returned by
- *   createSharedBuffer.
- * @param {number} offset Offset.
- * @param {number} num_bytes Size of the memory to be mapped.
- * @param {MojoMapBufferFlags} flags Flags.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     buffer,  // An ArrayBuffer (only on success).
- *   }
- */
-function mapBuffer(buffer_handle, offset, num_bytes, flags) { [native code] }
-
-/**
- * Unmaps buffer that was mapped using mapBuffer.
- * See MojoUnmapBuffer for more information including error codes.
- *
- * @param {ArrayBuffer} buffer ArrayBuffer.
- * @return {MojoResult} Result code.
- */
-function unmapBuffer(buffer) { [native code] }
diff --git a/mojo/public/js/interface_types.js b/mojo/public/js/interface_types.js
deleted file mode 100644
index e8ed37a..0000000
--- a/mojo/public/js/interface_types.js
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/interface_types", [
-  "mojo/public/js/core",
-], function(core) {
-
-  // Constants ----------------------------------------------------------------
-  var kInterfaceIdNamespaceMask = 0x80000000;
-  var kMasterInterfaceId = 0x00000000;
-  var kInvalidInterfaceId = 0xFFFFFFFF;
-
-  // ---------------------------------------------------------------------------
-
-  function InterfacePtrInfo(handle, version) {
-    this.handle = handle;
-    this.version = version;
-  }
-
-  InterfacePtrInfo.prototype.isValid = function() {
-    return core.isHandle(this.handle);
-  };
-
-  InterfacePtrInfo.prototype.close = function() {
-    if (!this.isValid())
-      return;
-
-    core.close(this.handle);
-    this.handle = null;
-    this.version = 0;
-  };
-
-  // ---------------------------------------------------------------------------
-
-  function InterfaceRequest(handle) {
-    this.handle = handle;
-  }
-
-  InterfaceRequest.prototype.isValid = function() {
-    return core.isHandle(this.handle);
-  };
-
-  InterfaceRequest.prototype.close = function() {
-    if (!this.isValid())
-      return;
-
-    core.close(this.handle);
-    this.handle = null;
-  };
-
-  function isMasterInterfaceId(interfaceId) {
-    return interfaceId === kMasterInterfaceId;
-  }
-
-  function isValidInterfaceId(interfaceId) {
-    return interfaceId !== kInvalidInterfaceId;
-  }
-
-  var exports = {};
-  exports.InterfacePtrInfo = InterfacePtrInfo;
-  exports.InterfaceRequest = InterfaceRequest;
-  exports.isMasterInterfaceId = isMasterInterfaceId;
-  exports.isValidInterfaceId = isValidInterfaceId;
-  exports.kInvalidInterfaceId = kInvalidInterfaceId;
-  exports.kMasterInterfaceId = kMasterInterfaceId;
-  exports.kInterfaceIdNamespaceMask = kInterfaceIdNamespaceMask;
-
-  return exports;
-});
diff --git a/mojo/public/js/lib/control_message_handler.js b/mojo/public/js/lib/control_message_handler.js
deleted file mode 100644
index 5da306e..0000000
--- a/mojo/public/js/lib/control_message_handler.js
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/lib/control_message_handler", [
-  "mojo/public/interfaces/bindings/interface_control_messages.mojom",
-  "mojo/public/js/codec",
-  "mojo/public/js/validator",
-], function(controlMessages, codec, validator) {
-
-  var Validator = validator.Validator;
-
-  function validateControlRequestWithResponse(message) {
-    var messageValidator = new Validator(message);
-    var error = messageValidator.validateMessageIsRequestExpectingResponse();
-    if (error !== validator.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != controlMessages.kRunMessageId) {
-      throw new Error("Control message name is not kRunMessageId");
-    }
-
-    // Validate payload.
-    error = controlMessages.RunMessageParams.validate(messageValidator,
-        message.getHeaderNumBytes());
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function validateControlRequestWithoutResponse(message) {
-    var messageValidator = new Validator(message);
-    var error = messageValidator.validateMessageIsRequestWithoutResponse();
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != controlMessages.kRunOrClosePipeMessageId) {
-      throw new Error("Control message name is not kRunOrClosePipeMessageId");
-    }
-
-    // Validate payload.
-    error = controlMessages.RunOrClosePipeMessageParams.validate(
-        messageValidator, message.getHeaderNumBytes());
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function runOrClosePipe(message, interface_version) {
-    var reader = new codec.MessageReader(message);
-    var runOrClosePipeMessageParams = reader.decodeStruct(
-        controlMessages.RunOrClosePipeMessageParams);
-    return interface_version >=
-        runOrClosePipeMessageParams.input.require_version.version;
-  }
-
-  function run(message, responder, interface_version) {
-    var reader = new codec.MessageReader(message);
-    var runMessageParams =
-        reader.decodeStruct(controlMessages.RunMessageParams);
-    var runOutput = null;
-
-    if (runMessageParams.input.query_version) {
-      runOutput = new controlMessages.RunOutput();
-      runOutput.query_version_result = new
-          controlMessages.QueryVersionResult({'version': interface_version});
-    }
-
-    var runResponseMessageParams = new
-        controlMessages.RunResponseMessageParams();
-    runResponseMessageParams.output = runOutput;
-
-    var messageName = controlMessages.kRunMessageId;
-    var payloadSize = controlMessages.RunResponseMessageParams.encodedSize;
-    var requestID = reader.requestID;
-    var builder = new codec.MessageWithRequestIDBuilder(messageName,
-        payloadSize, codec.kMessageIsResponse, requestID);
-    builder.encodeStruct(controlMessages.RunResponseMessageParams,
-                         runResponseMessageParams);
-    responder.accept(builder.finish());
-    return true;
-  }
-
-  function isControlMessage(message) {
-    return message.getName() == controlMessages.kRunMessageId ||
-           message.getName() == controlMessages.kRunOrClosePipeMessageId;
-  }
-
-  function ControlMessageHandler(interface_version) {
-    this.interface_version_ = interface_version;
-  }
-
-  ControlMessageHandler.prototype.accept = function(message) {
-    validateControlRequestWithoutResponse(message);
-    return runOrClosePipe(message, this.interface_version_);
-  };
-
-  ControlMessageHandler.prototype.acceptWithResponder = function(message,
-      responder) {
-    validateControlRequestWithResponse(message);
-    return run(message, responder, this.interface_version_);
-  };
-
-  var exports = {};
-  exports.ControlMessageHandler = ControlMessageHandler;
-  exports.isControlMessage = isControlMessage;
-
-  return exports;
-});
diff --git a/mojo/public/js/lib/control_message_proxy.js b/mojo/public/js/lib/control_message_proxy.js
deleted file mode 100644
index b6f1d3c..0000000
--- a/mojo/public/js/lib/control_message_proxy.js
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/lib/control_message_proxy", [
-  "mojo/public/interfaces/bindings/interface_control_messages.mojom",
-  "mojo/public/js/codec",
-  "mojo/public/js/validator",
-], function(controlMessages, codec, validator) {
-
-  var Validator = validator.Validator;
-
-  function constructRunOrClosePipeMessage(runOrClosePipeInput) {
-    var runOrClosePipeMessageParams = new
-        controlMessages.RunOrClosePipeMessageParams();
-    runOrClosePipeMessageParams.input = runOrClosePipeInput;
-
-    var messageName = controlMessages.kRunOrClosePipeMessageId;
-    var payloadSize = controlMessages.RunOrClosePipeMessageParams.encodedSize;
-    var builder = new codec.MessageBuilder(messageName, payloadSize);
-    builder.encodeStruct(controlMessages.RunOrClosePipeMessageParams,
-                         runOrClosePipeMessageParams);
-    var message = builder.finish();
-    return message;
-  }
-
-  function validateControlResponse(message) {
-    var messageValidator = new Validator(message);
-    var error = messageValidator.validateMessageIsResponse();
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != controlMessages.kRunMessageId) {
-      throw new Error("Control message name is not kRunMessageId");
-    }
-
-    // Validate payload.
-    error = controlMessages.RunResponseMessageParams.validate(
-        messageValidator, message.getHeaderNumBytes());
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function acceptRunResponse(message) {
-    validateControlResponse(message);
-
-    var reader = new codec.MessageReader(message);
-    var runResponseMessageParams = reader.decodeStruct(
-        controlMessages.RunResponseMessageParams);
-
-    return Promise.resolve(runResponseMessageParams);
-  }
-
- /**
-  * Sends the given run message through the receiver.
-  * Accepts the response message from the receiver and decodes the message
-  * struct to RunResponseMessageParams.
-  *
-  * @param  {Router} receiver.
-  * @param  {RunMessageParams} runMessageParams to be sent via a message.
-  * @return {Promise} that resolves to a RunResponseMessageParams.
-  */
-  function sendRunMessage(receiver, runMessageParams) {
-    var messageName = controlMessages.kRunMessageId;
-    var payloadSize = controlMessages.RunMessageParams.encodedSize;
-    // |requestID| is set to 0, but is later properly set by Router.
-    var builder = new codec.MessageWithRequestIDBuilder(messageName,
-        payloadSize, codec.kMessageExpectsResponse, 0);
-    builder.encodeStruct(controlMessages.RunMessageParams, runMessageParams);
-    var message = builder.finish();
-
-    return receiver.acceptAndExpectResponse(message).then(acceptRunResponse);
-  }
-
-  function ControlMessageProxy(receiver) {
-    this.receiver_ = receiver;
-  }
-
-  ControlMessageProxy.prototype.queryVersion = function() {
-    var runMessageParams = new controlMessages.RunMessageParams();
-    runMessageParams.input = new controlMessages.RunInput();
-    runMessageParams.input.query_version = new controlMessages.QueryVersion();
-
-    return sendRunMessage(this.receiver_, runMessageParams).then(function(
-        runResponseMessageParams) {
-      return runResponseMessageParams.output.query_version_result.version;
-    });
-  };
-
-  ControlMessageProxy.prototype.requireVersion = function(version) {
-    var runOrClosePipeInput = new controlMessages.RunOrClosePipeInput();
-    runOrClosePipeInput.require_version = new controlMessages.RequireVersion({
-        'version': version});
-    var message = constructRunOrClosePipeMessage(runOrClosePipeInput);
-    this.receiver_.accept(message);
-  };
-
-  var exports = {};
-  exports.ControlMessageProxy = ControlMessageProxy;
-
-  return exports;
-});
diff --git a/mojo/public/js/lib/interface_endpoint_client.js b/mojo/public/js/lib/interface_endpoint_client.js
deleted file mode 100644
index 631c52e..0000000
--- a/mojo/public/js/lib/interface_endpoint_client.js
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/lib/interface_endpoint_client", [
-  "console",
-  "mojo/public/js/codec",
-  "mojo/public/js/lib/control_message_handler",
-  "mojo/public/js/lib/control_message_proxy",
-  "mojo/public/js/lib/interface_endpoint_handle",
-  "mojo/public/js/validator",
-  "timer",
-], function(console,
-            codec,
-            controlMessageHandler,
-            controlMessageProxy,
-            interfaceEndpointHandle,
-            validator,
-            timer) {
-
-  var ControlMessageHandler = controlMessageHandler.ControlMessageHandler;
-  var ControlMessageProxy = controlMessageProxy.ControlMessageProxy;
-  var MessageReader = codec.MessageReader;
-  var Validator = validator.Validator;
-  var InterfaceEndpointHandle = interfaceEndpointHandle.InterfaceEndpointHandle;
-
-  function InterfaceEndpointClient(interfaceEndpointHandle, receiver,
-      interfaceVersion) {
-    this.controller_ = null;
-    this.encounteredError_ = false;
-    this.handle_ = interfaceEndpointHandle;
-    this.incomingReceiver_ = receiver;
-
-    if (interfaceVersion !== undefined) {
-      this.controlMessageHandler_ = new ControlMessageHandler(
-          interfaceVersion);
-    } else {
-      this.controlMessageProxy_ = new ControlMessageProxy(this);
-    }
-
-    this.nextRequestID_ = 0;
-    this.completers_ = new Map();
-    this.payloadValidators_ = [];
-    this.connectionErrorHandler_ = null;
-
-    if (interfaceEndpointHandle.pendingAssociation()) {
-      interfaceEndpointHandle.setAssociationEventHandler(
-          this.onAssociationEvent.bind(this));
-    } else {
-      this.initControllerIfNecessary_();
-    }
-  }
-
-  InterfaceEndpointClient.prototype.initControllerIfNecessary_ = function() {
-    if (this.controller_ || this.handle_.pendingAssociation()) {
-      return;
-    }
-
-    this.controller_ = this.handle_.groupController().attachEndpointClient(
-        this.handle_, this);
-  };
-
-  InterfaceEndpointClient.prototype.onAssociationEvent = function(
-      associationEvent) {
-    if (associationEvent ===
-        InterfaceEndpointHandle.AssociationEvent.ASSOCIATED) {
-      this.initControllerIfNecessary_();
-    } else if (associationEvent ===
-        InterfaceEndpointHandle.AssociationEvent
-                               .PEER_CLOSED_BEFORE_ASSOCIATION) {
-      timer.createOneShot(0, this.notifyError.bind(this,
-          this.handle_.disconnectReason()));
-    }
-  };
-
-  InterfaceEndpointClient.prototype.passHandle = function() {
-    if (!this.handle_.isValid()) {
-      return new InterfaceEndpointHandle();
-    }
-
-    // Used to clear the previously set callback.
-    this.handle_.setAssociationEventHandler(undefined);
-
-    if (this.controller_) {
-      this.controller_ = null;
-      this.handle_.groupController().detachEndpointClient(this.handle_);
-    }
-    var handle = this.handle_;
-    this.handle_ = null;
-    return handle;
-  };
-
-  InterfaceEndpointClient.prototype.close = function(reason) {
-    var handle = this.passHandle();
-    handle.reset(reason);
-  };
-
-  InterfaceEndpointClient.prototype.accept = function(message) {
-    if (this.encounteredError_) {
-      return false;
-    }
-
-    this.initControllerIfNecessary_();
-    return this.controller_.sendMessage(message);
-  };
-
-  InterfaceEndpointClient.prototype.acceptAndExpectResponse = function(
-      message) {
-    if (this.encounteredError_) {
-      return Promise.reject();
-    }
-
-    this.initControllerIfNecessary_();
-
-    // Reserve 0 in case we want it to convey special meaning in the future.
-    var requestID = this.nextRequestID_++;
-    if (requestID === 0)
-      requestID = this.nextRequestID_++;
-
-    message.setRequestID(requestID);
-    var result = this.controller_.sendMessage(message);
-    if (!result)
-      return Promise.reject(Error("Connection error"));
-
-    var completer = {};
-    this.completers_.set(requestID, completer);
-    return new Promise(function(resolve, reject) {
-      completer.resolve = resolve;
-      completer.reject = reject;
-    });
-  };
-
-  InterfaceEndpointClient.prototype.setPayloadValidators = function(
-      payloadValidators) {
-    this.payloadValidators_ = payloadValidators;
-  };
-
-  InterfaceEndpointClient.prototype.setIncomingReceiver = function(receiver) {
-    this.incomingReceiver_ = receiver;
-  };
-
-  InterfaceEndpointClient.prototype.setConnectionErrorHandler = function(
-      handler) {
-    this.connectionErrorHandler_ = handler;
-  };
-
-  InterfaceEndpointClient.prototype.handleIncomingMessage_ = function(
-      message) {
-    var noError = validator.validationError.NONE;
-    var messageValidator = new Validator(message);
-    var err = noError;
-    for (var i = 0; err === noError && i < this.payloadValidators_.length; ++i)
-      err = this.payloadValidators_[i](messageValidator);
-
-    if (err == noError) {
-      return this.handleValidIncomingMessage_(message);
-    } else {
-      validator.reportValidationError(err);
-      return false;
-    }
-  };
-
-  InterfaceEndpointClient.prototype.handleValidIncomingMessage_ = function(
-      message) {
-    if (validator.isTestingMode()) {
-      return true;
-    }
-
-    if (this.encounteredError_) {
-      return false;
-    }
-
-    var ok = false;
-
-    if (message.expectsResponse()) {
-      if (controlMessageHandler.isControlMessage(message) &&
-          this.controlMessageHandler_) {
-        ok = this.controlMessageHandler_.acceptWithResponder(message, this);
-      } else if (this.incomingReceiver_) {
-        ok = this.incomingReceiver_.acceptWithResponder(message, this);
-      }
-    } else if (message.isResponse()) {
-      var reader = new MessageReader(message);
-      var requestID = reader.requestID;
-      var completer = this.completers_.get(requestID);
-      if (completer) {
-        this.completers_.delete(requestID);
-        completer.resolve(message);
-        ok = true;
-      } else {
-        console.log("Unexpected response with request ID: " + requestID);
-      }
-    } else {
-      if (controlMessageHandler.isControlMessage(message) &&
-          this.controlMessageHandler_) {
-        ok = this.controlMessageHandler_.accept(message);
-      } else if (this.incomingReceiver_) {
-        ok = this.incomingReceiver_.accept(message);
-      }
-    }
-    return ok;
-  };
-
-  InterfaceEndpointClient.prototype.notifyError = function(reason) {
-    if (this.encounteredError_) {
-      return;
-    }
-    this.encounteredError_ = true;
-
-    this.completers_.forEach(function(value) {
-      value.reject();
-    });
-    this.completers_.clear();  // Drop any responders.
-
-    if (this.connectionErrorHandler_) {
-      this.connectionErrorHandler_(reason);
-    }
-  };
-
-  InterfaceEndpointClient.prototype.queryVersion = function() {
-    return this.controlMessageProxy_.queryVersion();
-  };
-
-  InterfaceEndpointClient.prototype.requireVersion = function(version) {
-    this.controlMessageProxy_.requireVersion(version);
-  };
-
-  var exports = {};
-  exports.InterfaceEndpointClient = InterfaceEndpointClient;
-
-  return exports;
-});
diff --git a/mojo/public/js/lib/interface_endpoint_handle.js b/mojo/public/js/lib/interface_endpoint_handle.js
deleted file mode 100644
index f48b89b..0000000
--- a/mojo/public/js/lib/interface_endpoint_handle.js
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/lib/interface_endpoint_handle", [
-  "mojo/public/js/interface_types",
-  "timer",
-], function(types, timer) {
-
-  var AssociationEvent = {
-    // The interface has been associated with a message pipe.
-    ASSOCIATED: 'associated',
-    // The peer of this object has been closed before association.
-    PEER_CLOSED_BEFORE_ASSOCIATION: 'peer_closed_before_association'
-  };
-
-  function State(interfaceId, associatedGroupController) {
-    if (interfaceId === undefined) {
-      interfaceId = types.kInvalidInterfaceId;
-    }
-
-    this.interfaceId = interfaceId;
-    this.associatedGroupController = associatedGroupController;
-    this.pendingAssociation = false;
-    this.disconnectReason = null;
-    this.peerState_ = null;
-    this.associationEventHandler_ = null;
-  }
-
-  State.prototype.initPendingState = function(peer) {
-    this.pendingAssociation = true;
-    this.peerState_ = peer;
-  };
-
-  State.prototype.isValid = function() {
-    return this.pendingAssociation ||
-        types.isValidInterfaceId(this.interfaceId);
-  };
-
-  State.prototype.close = function(disconnectReason) {
-    var cachedGroupController;
-    var cachedPeerState;
-    var cachedId = types.kInvalidInterfaceId;
-
-    if (!this.pendingAssociation) {
-      if (types.isValidInterfaceId(this.interfaceId)) {
-        cachedGroupController = this.associatedGroupController;
-        this.associatedGroupController = null;
-        cachedId = this.interfaceId;
-        this.interfaceId = types.kInvalidInterfaceId;
-      }
-    } else {
-      this.pendingAssociation = false;
-      cachedPeerState = this.peerState_;
-      this.peerState_ = null;
-    }
-
-    if (cachedGroupController) {
-      cachedGroupController.closeEndpointHandle(cachedId,
-          disconnectReason);
-    } else if (cachedPeerState) {
-      cachedPeerState.onPeerClosedBeforeAssociation(disconnectReason);
-    }
-  };
-
-  State.prototype.runAssociationEventHandler = function(associationEvent) {
-    if (this.associationEventHandler_) {
-      var handler = this.associationEventHandler_;
-      this.associationEventHandler_ = null;
-      handler(associationEvent);
-    }
-  };
-
-  State.prototype.setAssociationEventHandler = function(handler) {
-    if (!this.pendingAssociation &&
-        !types.isValidInterfaceId(this.interfaceId)) {
-      return;
-    }
-
-    if (!handler) {
-      this.associationEventHandler_ = null;
-      return;
-    }
-
-    this.associationEventHandler_ = handler;
-    if (!this.pendingAssociation) {
-      timer.createOneShot(0, this.runAssociationEventHandler.bind(this,
-          AssociationEvent.ASSOCIATED));
-    } else if (!this.peerState_) {
-      timer.createOneShot(0, this.runAssociationEventHandler.bind(this,
-          AssociationEvent.PEER_CLOSED_BEFORE_ASSOCIATION));
-    }
-  };
-
-  State.prototype.onAssociated = function(interfaceId,
-      associatedGroupController) {
-    if (!this.pendingAssociation) {
-      return;
-    }
-
-    this.pendingAssociation = false;
-    this.peerState_ = null;
-    this.interfaceId = interfaceId;
-    this.associatedGroupController = associatedGroupController;
-    this.runAssociationEventHandler(AssociationEvent.ASSOCIATED);
-  };
-
-  State.prototype.onPeerClosedBeforeAssociation = function(disconnectReason) {
-    if (!this.pendingAssociation) {
-      return;
-    }
-
-    this.peerState_ = null;
-    this.disconnectReason = disconnectReason;
-
-    this.runAssociationEventHandler(
-        AssociationEvent.PEER_CLOSED_BEFORE_ASSOCIATION);
-  };
-
-  function InterfaceEndpointHandle(interfaceId, associatedGroupController) {
-    this.state_ = new State(interfaceId, associatedGroupController);
-  }
-
-  InterfaceEndpointHandle.prototype.isValid = function() {
-    return this.state_.isValid();
-  };
-
-  InterfaceEndpointHandle.prototype.pendingAssociation = function() {
-    return this.state_.pendingAssociation;
-  };
-
-  InterfaceEndpointHandle.prototype.id = function() {
-    return this.state_.interfaceId;
-  };
-
-  InterfaceEndpointHandle.prototype.groupController = function() {
-    return this.state_.associatedGroupController;
-  };
-
-  InterfaceEndpointHandle.prototype.disconnectReason = function() {
-    return this.state_.disconnectReason;
-  };
-
-  InterfaceEndpointHandle.prototype.setAssociationEventHandler = function(
-      handler) {
-    this.state_.setAssociationEventHandler(handler);
-  };
-
-  InterfaceEndpointHandle.prototype.reset = function(reason) {
-    this.state_.close(reason);
-    this.state_ = new State();
-  };
-
-  var exports = {};
-  exports.InterfaceEndpointHandle = InterfaceEndpointHandle;
-
-  return exports;
-});
diff --git a/mojo/public/js/lib/pipe_control_message_handler.js b/mojo/public/js/lib/pipe_control_message_handler.js
deleted file mode 100644
index 2eb45d1..0000000
--- a/mojo/public/js/lib/pipe_control_message_handler.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/lib/pipe_control_message_handler", [
-  "mojo/public/interfaces/bindings/pipe_control_messages.mojom",
-  "mojo/public/js/codec",
-  "mojo/public/js/interface_types",
-  "mojo/public/js/validator",
-], function(pipeControlMessages, codec, types, validator) {
-
-  var Validator = validator.Validator;
-
-  function validateControlRequestWithoutResponse(message) {
-    var messageValidator = new Validator(message);
-    var error = messageValidator.validateMessageIsRequestWithoutResponse();
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != pipeControlMessages.kRunOrClosePipeMessageId) {
-      throw new Error("Control message name is not kRunOrClosePipeMessageId");
-    }
-
-    // Validate payload.
-    error = pipeControlMessages.RunOrClosePipeMessageParams.validate(
-        messageValidator, message.getHeaderNumBytes());
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function runOrClosePipe(message, delegate) {
-    var reader = new codec.MessageReader(message);
-    var runOrClosePipeMessageParams = reader.decodeStruct(
-        pipeControlMessages.RunOrClosePipeMessageParams);
-    var event = runOrClosePipeMessageParams.input
-        .peer_associated_endpoint_closed_event;
-    return delegate.onPeerAssociatedEndpointClosed(event.id,
-        event.disconnect_reason);
-  }
-
-  function isPipeControlMessage(message) {
-    return !types.isValidInterfaceId(message.getInterfaceId());
-  }
-
-  function PipeControlMessageHandler(delegate) {
-    this.delegate_ = delegate;
-  }
-
-  PipeControlMessageHandler.prototype.accept = function(message) {
-    validateControlRequestWithoutResponse(message);
-    return runOrClosePipe(message, this.delegate_);
-  };
-
-  var exports = {};
-  exports.PipeControlMessageHandler = PipeControlMessageHandler;
-  exports.isPipeControlMessage = isPipeControlMessage;
-
-  return exports;
-});
diff --git a/mojo/public/js/lib/pipe_control_message_proxy.js b/mojo/public/js/lib/pipe_control_message_proxy.js
deleted file mode 100644
index 4b8e7a2..0000000
--- a/mojo/public/js/lib/pipe_control_message_proxy.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/lib/pipe_control_message_proxy", [
-  "mojo/public/interfaces/bindings/pipe_control_messages.mojom",
-  "mojo/public/js/codec",
-  "mojo/public/js/interface_types",
-], function(pipeControlMessages, codec, types) {
-
-  function constructRunOrClosePipeMessage(runOrClosePipeInput) {
-    var runOrClosePipeMessageParams = new
-        pipeControlMessages.RunOrClosePipeMessageParams();
-    runOrClosePipeMessageParams.input = runOrClosePipeInput;
-
-    var messageName = pipeControlMessages.kRunOrClosePipeMessageId;
-    var payloadSize =
-        pipeControlMessages.RunOrClosePipeMessageParams.encodedSize;
-
-    var builder = new codec.MessageBuilder(messageName, payloadSize);
-    builder.encodeStruct(pipeControlMessages.RunOrClosePipeMessageParams,
-                         runOrClosePipeMessageParams);
-    var message = builder.finish();
-    message.setInterfaceId(types.kInvalidInterfaceId);
-    return message;
-  }
-
-  function PipeControlMessageProxy(receiver) {
-    this.receiver_ = receiver;
-  }
-
-  PipeControlMessageProxy.prototype.notifyPeerEndpointClosed = function(
-      interfaceId, reason) {
-    var message = this.constructPeerEndpointClosedMessage(interfaceId, reason);
-    this.receiver_.accept(message);
-  };
-
-  PipeControlMessageProxy.prototype.constructPeerEndpointClosedMessage =
-      function(interfaceId, reason) {
-    var event = new pipeControlMessages.PeerAssociatedEndpointClosedEvent();
-    event.id = interfaceId;
-    if (reason) {
-      event.disconnect_reason = new pipeControlMessages.DisconnectReason({
-          custom_reason: reason.custom_reason,
-          description: reason.description});
-    }
-    var runOrClosePipeInput = new pipeControlMessages.RunOrClosePipeInput();
-    runOrClosePipeInput.peer_associated_endpoint_closed_event = event;
-    return constructRunOrClosePipeMessage(runOrClosePipeInput);
-  };
-
-  var exports = {};
-  exports.PipeControlMessageProxy = PipeControlMessageProxy;
-
-  return exports;
-});
diff --git a/mojo/public/js/new_bindings/base.js b/mojo/public/js/new_bindings/base.js
deleted file mode 100644
index db72d48..0000000
--- a/mojo/public/js/new_bindings/base.js
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-'use strict';
-
-if (mojo && mojo.internal) {
-  throw new Error('The Mojo bindings library has been initialized.');
-}
-
-var mojo = mojo || {};
-mojo.internal = {};
-mojo.internal.global = this;
-mojo.config = {
-  // Whether to automatically load mojom dependencies.
-  // For example, if foo.mojom imports bar.mojom, |autoLoadMojomDeps| set to
-  // true means that loading foo.mojom.js will insert a <script> tag to load
-  // bar.mojom.js, if it hasn't been loaded.
-  //
-  // The URL of bar.mojom.js is determined by the relative path of bar.mojom
-  // (relative to the position of foo.mojom at build time) and the URL of
-  // foo.mojom.js. For exmple, if at build time the two mojom files are
-  // located at:
-  //   a/b/c/foo.mojom
-  //   a/b/d/bar.mojom
-  // and the URL of foo.mojom.js is:
-  //   http://example.org/scripts/b/c/foo.mojom.js
-  // then the URL of bar.mojom.js will be:
-  //   http://example.org/scripts/b/d/bar.mojom.js
-  //
-  // If you would like bar.mojom.js to live at a different location, you need
-  // to turn off |autoLoadMojomDeps| before loading foo.mojom.js, and manually
-  // load bar.mojom.js yourself. Similarly, you need to turn off the option if
-  // you merge bar.mojom.js and foo.mojom.js into a single file.
-  //
-  // Performance tip: Avoid loading the same mojom.js file multiple times.
-  // Assume that |autoLoadMojomDeps| is set to true:
-  // <!-- No duplicate loading; recommended. -->
-  // <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
-  //
-  // <!-- No duplicate loading, although unnecessary. -->
-  // <script src="http://example.org/scripts/b/d/bar.mojom.js"></script>
-  // <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
-  //
-  // <!-- Load bar.mojom.js twice; should be avoided. -->
-  // <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
-  // <script src="http://example.org/scripts/b/d/bar.mojom.js"></script>
-  autoLoadMojomDeps: true
-};
-
-(function() {
-  var internal = mojo.internal;
-
-  var LoadState = {
-    PENDING_LOAD: 1,
-    LOADED: 2
-  };
-
-  var mojomRegistry = new Map();
-
-  function exposeNamespace(namespace) {
-    var current = internal.global;
-    var parts = namespace.split('.');
-
-    for (var part; parts.length && (part = parts.shift());) {
-      if (!current[part]) {
-        current[part] = {};
-      }
-      current = current[part];
-    }
-
-    return current;
-  }
-
-  function isMojomPendingLoad(id) {
-    return mojomRegistry.get(id) === LoadState.PENDING_LOAD;
-  }
-
-  function isMojomLoaded(id) {
-    return mojomRegistry.get(id) === LoadState.LOADED;
-  }
-
-  function markMojomPendingLoad(id) {
-    if (isMojomLoaded(id)) {
-      throw new Error('The following mojom file has been loaded: ' + id);
-    }
-
-    mojomRegistry.set(id, LoadState.PENDING_LOAD);
-  }
-
-  function markMojomLoaded(id) {
-    mojomRegistry.set(id, LoadState.LOADED);
-  }
-
-  function loadMojomIfNecessary(id, url) {
-    if (mojomRegistry.has(id)) {
-      return;
-    }
-
-    markMojomPendingLoad(id);
-    internal.global.document.write('<script type="text/javascript" src="' +
-                                   url + '"></script>');
-  }
-
-  internal.exposeNamespace = exposeNamespace;
-  internal.isMojomPendingLoad = isMojomPendingLoad;
-  internal.isMojomLoaded = isMojomLoaded;
-  internal.markMojomPendingLoad = markMojomPendingLoad;
-  internal.markMojomLoaded = markMojomLoaded;
-  internal.loadMojomIfNecessary = loadMojomIfNecessary;
-})();
diff --git a/mojo/public/js/new_bindings/bindings.js b/mojo/public/js/new_bindings/bindings.js
deleted file mode 100644
index 5b3b66e..0000000
--- a/mojo/public/js/new_bindings/bindings.js
+++ /dev/null
@@ -1,275 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-  var internal = mojo.internal;
-  // ---------------------------------------------------------------------------
-
-  function makeRequest(interfacePtr) {
-    var pipe = Mojo.createMessagePipe();
-    interfacePtr.ptr.bind(new mojo.InterfacePtrInfo(pipe.handle0, 0));
-    return new mojo.InterfaceRequest(pipe.handle1);
-  }
-
-  // ---------------------------------------------------------------------------
-
-  // Operations used to setup/configure an interface pointer. Exposed as the
-  // |ptr| field of generated interface pointer classes.
-  // |ptrInfoOrHandle| could be omitted and passed into bind() later.
-  function InterfacePtrController(interfaceType, ptrInfoOrHandle) {
-    this.version = 0;
-
-    this.interfaceType_ = interfaceType;
-    this.router_ = null;
-    this.proxy_ = null;
-
-    // |router_| is lazily initialized. |handle_| is valid between bind() and
-    // the initialization of |router_|.
-    this.handle_ = null;
-    this.controlMessageProxy_ = null;
-
-    if (ptrInfoOrHandle)
-      this.bind(ptrInfoOrHandle);
-  }
-
-  InterfacePtrController.prototype.bind = function(ptrInfoOrHandle) {
-    this.reset();
-
-    if (ptrInfoOrHandle instanceof mojo.InterfacePtrInfo) {
-      this.version = ptrInfoOrHandle.version;
-      this.handle_ = ptrInfoOrHandle.handle;
-    } else {
-      this.handle_ = ptrInfoOrHandle;
-    }
-  };
-
-  InterfacePtrController.prototype.isBound = function() {
-    return this.router_ !== null || this.handle_ !== null;
-  };
-
-  // Although users could just discard the object, reset() closes the pipe
-  // immediately.
-  InterfacePtrController.prototype.reset = function() {
-    this.version = 0;
-    if (this.router_) {
-      this.router_.close();
-      this.router_ = null;
-
-      this.proxy_ = null;
-    }
-    if (this.handle_) {
-      this.handle_.close();
-      this.handle_ = null;
-    }
-  };
-
-  InterfacePtrController.prototype.setConnectionErrorHandler
-      = function(callback) {
-    if (!this.isBound())
-      throw new Error("Cannot set connection error handler if not bound.");
-
-    this.configureProxyIfNecessary_();
-    this.router_.setErrorHandler(callback);
-  };
-
-  InterfacePtrController.prototype.passInterface = function() {
-    var result;
-    if (this.router_) {
-      // TODO(yzshen): Fix Router interface to support extracting handle.
-      result = new mojo.InterfacePtrInfo(
-          this.router_.connector_.handle_, this.version);
-      this.router_.connector_.handle_ = null;
-    } else {
-      // This also handles the case when this object is not bound.
-      result = new mojo.InterfacePtrInfo(this.handle_, this.version);
-      this.handle_ = null;
-    }
-
-    this.reset();
-    return result;
-  };
-
-  InterfacePtrController.prototype.getProxy = function() {
-    this.configureProxyIfNecessary_();
-    return this.proxy_;
-  };
-
-  InterfacePtrController.prototype.enableTestingMode = function() {
-    this.configureProxyIfNecessary_();
-    return this.router_.enableTestingMode();
-  };
-
-  InterfacePtrController.prototype.configureProxyIfNecessary_ = function() {
-    if (!this.handle_)
-      return;
-
-    this.router_ = new internal.Router(this.handle_);
-    this.handle_ = null;
-    this.router_ .setPayloadValidators([this.interfaceType_.validateResponse]);
-
-    this.controlMessageProxy_ = new internal.ControlMessageProxy(this.router_);
-
-    this.proxy_ = new this.interfaceType_.proxyClass(this.router_);
-  };
-
-  InterfacePtrController.prototype.queryVersion = function() {
-    function onQueryVersion(version) {
-      this.version = version;
-      return version;
-    }
-
-    this.configureProxyIfNecessary_();
-    return this.controlMessageProxy_.queryVersion().then(
-      onQueryVersion.bind(this));
-  };
-
-  InterfacePtrController.prototype.requireVersion = function(version) {
-    this.configureProxyIfNecessary_();
-
-    if (this.version >= version) {
-      return;
-    }
-    this.version = version;
-    this.controlMessageProxy_.requireVersion(version);
-  };
-
-  // ---------------------------------------------------------------------------
-
-  // |request| could be omitted and passed into bind() later.
-  //
-  // Example:
-  //
-  //    // FooImpl implements mojom.Foo.
-  //    function FooImpl() { ... }
-  //    FooImpl.prototype.fooMethod1 = function() { ... }
-  //    FooImpl.prototype.fooMethod2 = function() { ... }
-  //
-  //    var fooPtr = new mojom.FooPtr();
-  //    var request = makeRequest(fooPtr);
-  //    var binding = new Binding(mojom.Foo, new FooImpl(), request);
-  //    fooPtr.fooMethod1();
-  function Binding(interfaceType, impl, requestOrHandle) {
-    this.interfaceType_ = interfaceType;
-    this.impl_ = impl;
-    this.router_ = null;
-    this.stub_ = null;
-
-    if (requestOrHandle)
-      this.bind(requestOrHandle);
-  }
-
-  Binding.prototype.isBound = function() {
-    return this.router_ !== null;
-  };
-
-  Binding.prototype.createInterfacePtrAndBind = function() {
-    var ptr = new this.interfaceType_.ptrClass();
-    // TODO(yzshen): Set the version of the interface pointer.
-    this.bind(makeRequest(ptr));
-    return ptr;
-  }
-
-  Binding.prototype.bind = function(requestOrHandle) {
-    this.close();
-
-    var handle = requestOrHandle instanceof mojo.InterfaceRequest ?
-        requestOrHandle.handle : requestOrHandle;
-    if (!(handle instanceof MojoHandle))
-      return;
-
-    this.stub_ = new this.interfaceType_.stubClass(this.impl_);
-    this.router_ = new internal.Router(handle, this.interfaceType_.kVersion);
-    this.router_.setIncomingReceiver(this.stub_);
-    this.router_ .setPayloadValidators([this.interfaceType_.validateRequest]);
-  };
-
-  Binding.prototype.close = function() {
-    if (!this.isBound())
-      return;
-
-    this.router_.close();
-    this.router_ = null;
-    this.stub_ = null;
-  };
-
-  Binding.prototype.setConnectionErrorHandler
-      = function(callback) {
-    if (!this.isBound())
-      throw new Error("Cannot set connection error handler if not bound.");
-    this.router_.setErrorHandler(callback);
-  };
-
-  Binding.prototype.unbind = function() {
-    if (!this.isBound())
-      return new mojo.InterfaceRequest(null);
-
-    var result = new mojo.InterfaceRequest(this.router_.connector_.handle_);
-    this.router_.connector_.handle_ = null;
-    this.close();
-    return result;
-  };
-
-  Binding.prototype.enableTestingMode = function() {
-    return this.router_.enableTestingMode();
-  };
-
-  // ---------------------------------------------------------------------------
-
-  function BindingSetEntry(bindingSet, interfaceType, impl, requestOrHandle,
-                           bindingId) {
-    this.bindingSet_ = bindingSet;
-    this.bindingId_ = bindingId;
-    this.binding_ = new Binding(interfaceType, impl, requestOrHandle);
-
-    this.binding_.setConnectionErrorHandler(function() {
-      this.bindingSet_.onConnectionError(bindingId);
-    }.bind(this));
-  }
-
-  BindingSetEntry.prototype.close = function() {
-    this.binding_.close();
-  };
-
-  function BindingSet(interfaceType) {
-    this.interfaceType_ = interfaceType;
-    this.nextBindingId_ = 0;
-    this.bindings_ = new Map();
-    this.errorHandler_ = null;
-  }
-
-  BindingSet.prototype.isEmpty = function() {
-    return this.bindings_.size == 0;
-  };
-
-  BindingSet.prototype.addBinding = function(impl, requestOrHandle) {
-    this.bindings_.set(
-        this.nextBindingId_,
-        new BindingSetEntry(this, this.interfaceType_, impl, requestOrHandle,
-                            this.nextBindingId_));
-    ++this.nextBindingId_;
-  };
-
-  BindingSet.prototype.closeAllBindings = function() {
-    for (var entry of this.bindings_.values())
-      entry.close();
-    this.bindings_.clear();
-  };
-
-  BindingSet.prototype.setConnectionErrorHandler = function(callback) {
-    this.errorHandler_ = callback;
-  };
-
-  BindingSet.prototype.onConnectionError = function(bindingId) {
-    this.bindings_.delete(bindingId);
-
-    if (this.errorHandler_)
-      this.errorHandler_();
-  };
-
-
-  mojo.makeRequest = makeRequest;
-  mojo.Binding = Binding;
-  mojo.BindingSet = BindingSet;
-  mojo.InterfacePtrController = InterfacePtrController;
-})();
diff --git a/mojo/public/js/new_bindings/buffer.js b/mojo/public/js/new_bindings/buffer.js
deleted file mode 100644
index c44058b..0000000
--- a/mojo/public/js/new_bindings/buffer.js
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-  var internal = mojo.internal;
-
-  var kHostIsLittleEndian = (function () {
-    var endianArrayBuffer = new ArrayBuffer(2);
-    var endianUint8Array = new Uint8Array(endianArrayBuffer);
-    var endianUint16Array = new Uint16Array(endianArrayBuffer);
-    endianUint16Array[0] = 1;
-    return endianUint8Array[0] == 1;
-  })();
-
-  var kHighWordMultiplier = 0x100000000;
-
-  function Buffer(sizeOrArrayBuffer) {
-    if (sizeOrArrayBuffer instanceof ArrayBuffer)
-      this.arrayBuffer = sizeOrArrayBuffer;
-    else
-      this.arrayBuffer = new ArrayBuffer(sizeOrArrayBuffer);
-
-    this.dataView = new DataView(this.arrayBuffer);
-    this.next = 0;
-  }
-
-  Object.defineProperty(Buffer.prototype, "byteLength", {
-    get: function() { return this.arrayBuffer.byteLength; }
-  });
-
-  Buffer.prototype.alloc = function(size) {
-    var pointer = this.next;
-    this.next += size;
-    if (this.next > this.byteLength) {
-      var newSize = (1.5 * (this.byteLength + size)) | 0;
-      this.grow(newSize);
-    }
-    return pointer;
-  };
-
-  function copyArrayBuffer(dstArrayBuffer, srcArrayBuffer) {
-    (new Uint8Array(dstArrayBuffer)).set(new Uint8Array(srcArrayBuffer));
-  }
-
-  Buffer.prototype.grow = function(size) {
-    var newArrayBuffer = new ArrayBuffer(size);
-    copyArrayBuffer(newArrayBuffer, this.arrayBuffer);
-    this.arrayBuffer = newArrayBuffer;
-    this.dataView = new DataView(this.arrayBuffer);
-  };
-
-  Buffer.prototype.trim = function() {
-    this.arrayBuffer = this.arrayBuffer.slice(0, this.next);
-    this.dataView = new DataView(this.arrayBuffer);
-  };
-
-  Buffer.prototype.getUint8 = function(offset) {
-    return this.dataView.getUint8(offset);
-  }
-  Buffer.prototype.getUint16 = function(offset) {
-    return this.dataView.getUint16(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getUint32 = function(offset) {
-    return this.dataView.getUint32(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getUint64 = function(offset) {
-    var lo, hi;
-    if (kHostIsLittleEndian) {
-      lo = this.dataView.getUint32(offset, kHostIsLittleEndian);
-      hi = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
-    } else {
-      hi = this.dataView.getUint32(offset, kHostIsLittleEndian);
-      lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
-    }
-    return lo + hi * kHighWordMultiplier;
-  }
-
-  Buffer.prototype.getInt8 = function(offset) {
-    return this.dataView.getInt8(offset);
-  }
-  Buffer.prototype.getInt16 = function(offset) {
-    return this.dataView.getInt16(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getInt32 = function(offset) {
-    return this.dataView.getInt32(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getInt64 = function(offset) {
-    var lo, hi;
-    if (kHostIsLittleEndian) {
-      lo = this.dataView.getUint32(offset, kHostIsLittleEndian);
-      hi = this.dataView.getInt32(offset + 4, kHostIsLittleEndian);
-    } else {
-      hi = this.dataView.getInt32(offset, kHostIsLittleEndian);
-      lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
-    }
-    return lo + hi * kHighWordMultiplier;
-  }
-
-  Buffer.prototype.getFloat32 = function(offset) {
-    return this.dataView.getFloat32(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getFloat64 = function(offset) {
-    return this.dataView.getFloat64(offset, kHostIsLittleEndian);
-  }
-
-  Buffer.prototype.setUint8 = function(offset, value) {
-    this.dataView.setUint8(offset, value);
-  }
-  Buffer.prototype.setUint16 = function(offset, value) {
-    this.dataView.setUint16(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setUint32 = function(offset, value) {
-    this.dataView.setUint32(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setUint64 = function(offset, value) {
-    var hi = (value / kHighWordMultiplier) | 0;
-    if (kHostIsLittleEndian) {
-      this.dataView.setInt32(offset, value, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian);
-    } else {
-      this.dataView.setInt32(offset, hi, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian);
-    }
-  }
-
-  Buffer.prototype.setInt8 = function(offset, value) {
-    this.dataView.setInt8(offset, value);
-  }
-  Buffer.prototype.setInt16 = function(offset, value) {
-    this.dataView.setInt16(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setInt32 = function(offset, value) {
-    this.dataView.setInt32(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setInt64 = function(offset, value) {
-    var hi = Math.floor(value / kHighWordMultiplier);
-    if (kHostIsLittleEndian) {
-      this.dataView.setInt32(offset, value, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian);
-    } else {
-      this.dataView.setInt32(offset, hi, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian);
-    }
-  }
-
-  Buffer.prototype.setFloat32 = function(offset, value) {
-    this.dataView.setFloat32(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setFloat64 = function(offset, value) {
-    this.dataView.setFloat64(offset, value, kHostIsLittleEndian);
-  }
-
-  internal.Buffer = Buffer;
-})();
diff --git a/mojo/public/js/new_bindings/codec.js b/mojo/public/js/new_bindings/codec.js
deleted file mode 100644
index 339fc16..0000000
--- a/mojo/public/js/new_bindings/codec.js
+++ /dev/null
@@ -1,917 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-  var internal = mojo.internal;
-
-  var kErrorUnsigned = "Passing negative value to unsigned";
-  var kErrorArray = "Passing non Array for array type";
-  var kErrorString = "Passing non String for string type";
-  var kErrorMap = "Passing non Map for map type";
-
-  // Memory -------------------------------------------------------------------
-
-  var kAlignment = 8;
-
-  function align(size) {
-    return size + (kAlignment - (size % kAlignment)) % kAlignment;
-  }
-
-  function isAligned(offset) {
-    return offset >= 0 && (offset % kAlignment) === 0;
-  }
-
-  // Constants ----------------------------------------------------------------
-
-  var kArrayHeaderSize = 8;
-  var kStructHeaderSize = 8;
-  var kMessageHeaderSize = 24;
-  var kMessageWithRequestIDHeaderSize = 32;
-  var kMapStructPayloadSize = 16;
-
-  var kStructHeaderNumBytesOffset = 0;
-  var kStructHeaderVersionOffset = 4;
-
-  var kEncodedInvalidHandleValue = 0xFFFFFFFF;
-
-  // Decoder ------------------------------------------------------------------
-
-  function Decoder(buffer, handles, base) {
-    this.buffer = buffer;
-    this.handles = handles;
-    this.base = base;
-    this.next = base;
-  }
-
-  Decoder.prototype.align = function() {
-    this.next = align(this.next);
-  };
-
-  Decoder.prototype.skip = function(offset) {
-    this.next += offset;
-  };
-
-  Decoder.prototype.readInt8 = function() {
-    var result = this.buffer.getInt8(this.next);
-    this.next += 1;
-    return result;
-  };
-
-  Decoder.prototype.readUint8 = function() {
-    var result = this.buffer.getUint8(this.next);
-    this.next += 1;
-    return result;
-  };
-
-  Decoder.prototype.readInt16 = function() {
-    var result = this.buffer.getInt16(this.next);
-    this.next += 2;
-    return result;
-  };
-
-  Decoder.prototype.readUint16 = function() {
-    var result = this.buffer.getUint16(this.next);
-    this.next += 2;
-    return result;
-  };
-
-  Decoder.prototype.readInt32 = function() {
-    var result = this.buffer.getInt32(this.next);
-    this.next += 4;
-    return result;
-  };
-
-  Decoder.prototype.readUint32 = function() {
-    var result = this.buffer.getUint32(this.next);
-    this.next += 4;
-    return result;
-  };
-
-  Decoder.prototype.readInt64 = function() {
-    var result = this.buffer.getInt64(this.next);
-    this.next += 8;
-    return result;
-  };
-
-  Decoder.prototype.readUint64 = function() {
-    var result = this.buffer.getUint64(this.next);
-    this.next += 8;
-    return result;
-  };
-
-  Decoder.prototype.readFloat = function() {
-    var result = this.buffer.getFloat32(this.next);
-    this.next += 4;
-    return result;
-  };
-
-  Decoder.prototype.readDouble = function() {
-    var result = this.buffer.getFloat64(this.next);
-    this.next += 8;
-    return result;
-  };
-
-  Decoder.prototype.decodePointer = function() {
-    // TODO(abarth): To correctly decode a pointer, we need to know the real
-    // base address of the array buffer.
-    var offsetPointer = this.next;
-    var offset = this.readUint64();
-    if (!offset)
-      return 0;
-    return offsetPointer + offset;
-  };
-
-  Decoder.prototype.decodeAndCreateDecoder = function(pointer) {
-    return new Decoder(this.buffer, this.handles, pointer);
-  };
-
-  Decoder.prototype.decodeHandle = function() {
-    return this.handles[this.readUint32()] || null;
-  };
-
-  Decoder.prototype.decodeString = function() {
-    var numberOfBytes = this.readUint32();
-    var numberOfElements = this.readUint32();
-    var base = this.next;
-    this.next += numberOfElements;
-    return internal.decodeUtf8String(
-        new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements));
-  };
-
-  Decoder.prototype.decodeArray = function(cls) {
-    var numberOfBytes = this.readUint32();
-    var numberOfElements = this.readUint32();
-    var val = new Array(numberOfElements);
-    if (cls === PackedBool) {
-      var byte;
-      for (var i = 0; i < numberOfElements; ++i) {
-        if (i % 8 === 0)
-          byte = this.readUint8();
-        val[i] = (byte & (1 << i % 8)) ? true : false;
-      }
-    } else {
-      for (var i = 0; i < numberOfElements; ++i) {
-        val[i] = cls.decode(this);
-      }
-    }
-    return val;
-  };
-
-  Decoder.prototype.decodeStruct = function(cls) {
-    return cls.decode(this);
-  };
-
-  Decoder.prototype.decodeStructPointer = function(cls) {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return cls.decode(this.decodeAndCreateDecoder(pointer));
-  };
-
-  Decoder.prototype.decodeArrayPointer = function(cls) {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return this.decodeAndCreateDecoder(pointer).decodeArray(cls);
-  };
-
-  Decoder.prototype.decodeStringPointer = function() {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return this.decodeAndCreateDecoder(pointer).decodeString();
-  };
-
-  Decoder.prototype.decodeMap = function(keyClass, valueClass) {
-    this.skip(4); // numberOfBytes
-    this.skip(4); // version
-    var keys = this.decodeArrayPointer(keyClass);
-    var values = this.decodeArrayPointer(valueClass);
-    var val = new Map();
-    for (var i = 0; i < keys.length; i++)
-      val.set(keys[i], values[i]);
-    return val;
-  };
-
-  Decoder.prototype.decodeMapPointer = function(keyClass, valueClass) {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    var decoder = this.decodeAndCreateDecoder(pointer);
-    return decoder.decodeMap(keyClass, valueClass);
-  };
-
-  // Encoder ------------------------------------------------------------------
-
-  function Encoder(buffer, handles, base) {
-    this.buffer = buffer;
-    this.handles = handles;
-    this.base = base;
-    this.next = base;
-  }
-
-  Encoder.prototype.align = function() {
-    this.next = align(this.next);
-  };
-
-  Encoder.prototype.skip = function(offset) {
-    this.next += offset;
-  };
-
-  Encoder.prototype.writeInt8 = function(val) {
-    this.buffer.setInt8(this.next, val);
-    this.next += 1;
-  };
-
-  Encoder.prototype.writeUint8 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint8(this.next, val);
-    this.next += 1;
-  };
-
-  Encoder.prototype.writeInt16 = function(val) {
-    this.buffer.setInt16(this.next, val);
-    this.next += 2;
-  };
-
-  Encoder.prototype.writeUint16 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint16(this.next, val);
-    this.next += 2;
-  };
-
-  Encoder.prototype.writeInt32 = function(val) {
-    this.buffer.setInt32(this.next, val);
-    this.next += 4;
-  };
-
-  Encoder.prototype.writeUint32 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint32(this.next, val);
-    this.next += 4;
-  };
-
-  Encoder.prototype.writeInt64 = function(val) {
-    this.buffer.setInt64(this.next, val);
-    this.next += 8;
-  };
-
-  Encoder.prototype.writeUint64 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint64(this.next, val);
-    this.next += 8;
-  };
-
-  Encoder.prototype.writeFloat = function(val) {
-    this.buffer.setFloat32(this.next, val);
-    this.next += 4;
-  };
-
-  Encoder.prototype.writeDouble = function(val) {
-    this.buffer.setFloat64(this.next, val);
-    this.next += 8;
-  };
-
-  Encoder.prototype.encodePointer = function(pointer) {
-    if (!pointer)
-      return this.writeUint64(0);
-    // TODO(abarth): To correctly encode a pointer, we need to know the real
-    // base address of the array buffer.
-    var offset = pointer - this.next;
-    this.writeUint64(offset);
-  };
-
-  Encoder.prototype.createAndEncodeEncoder = function(size) {
-    var pointer = this.buffer.alloc(align(size));
-    this.encodePointer(pointer);
-    return new Encoder(this.buffer, this.handles, pointer);
-  };
-
-  Encoder.prototype.encodeHandle = function(handle) {
-    if (handle) {
-      this.handles.push(handle);
-      this.writeUint32(this.handles.length - 1);
-    } else {
-      this.writeUint32(kEncodedInvalidHandleValue);
-    }
-  };
-
-  Encoder.prototype.encodeString = function(val) {
-    var base = this.next + kArrayHeaderSize;
-    var numberOfElements = internal.encodeUtf8String(
-        val, new Uint8Array(this.buffer.arrayBuffer, base));
-    var numberOfBytes = kArrayHeaderSize + numberOfElements;
-    this.writeUint32(numberOfBytes);
-    this.writeUint32(numberOfElements);
-    this.next += numberOfElements;
-  };
-
-  Encoder.prototype.encodeArray =
-      function(cls, val, numberOfElements, encodedSize) {
-    if (numberOfElements === undefined)
-      numberOfElements = val.length;
-    if (encodedSize === undefined)
-      encodedSize = kArrayHeaderSize + cls.encodedSize * numberOfElements;
-
-    this.writeUint32(encodedSize);
-    this.writeUint32(numberOfElements);
-
-    if (cls === PackedBool) {
-      var byte = 0;
-      for (i = 0; i < numberOfElements; ++i) {
-        if (val[i])
-          byte |= (1 << i % 8);
-        if (i % 8 === 7 || i == numberOfElements - 1) {
-          Uint8.encode(this, byte);
-          byte = 0;
-        }
-      }
-    } else {
-      for (var i = 0; i < numberOfElements; ++i)
-        cls.encode(this, val[i]);
-    }
-  };
-
-  Encoder.prototype.encodeStruct = function(cls, val) {
-    return cls.encode(this, val);
-  };
-
-  Encoder.prototype.encodeStructPointer = function(cls, val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-    var encoder = this.createAndEncodeEncoder(cls.encodedSize);
-    cls.encode(encoder, val);
-  };
-
-  Encoder.prototype.encodeArrayPointer = function(cls, val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-
-    var numberOfElements = val.length;
-    if (!Number.isSafeInteger(numberOfElements) || numberOfElements < 0)
-      throw new Error(kErrorArray);
-
-    var encodedSize = kArrayHeaderSize + ((cls === PackedBool) ?
-        Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements);
-    var encoder = this.createAndEncodeEncoder(encodedSize);
-    encoder.encodeArray(cls, val, numberOfElements, encodedSize);
-  };
-
-  Encoder.prototype.encodeStringPointer = function(val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-    // Only accepts string primivites, not String Objects like new String("foo")
-    if (typeof(val) !== "string") {
-      throw new Error(kErrorString);
-    }
-    var encodedSize = kArrayHeaderSize + internal.utf8Length(val);
-    var encoder = this.createAndEncodeEncoder(encodedSize);
-    encoder.encodeString(val);
-  };
-
-  Encoder.prototype.encodeMap = function(keyClass, valueClass, val) {
-    var keys = new Array(val.size);
-    var values = new Array(val.size);
-    var i = 0;
-    val.forEach(function(value, key) {
-      values[i] = value;
-      keys[i++] = key;
-    });
-    this.writeUint32(kStructHeaderSize + kMapStructPayloadSize);
-    this.writeUint32(0);  // version
-    this.encodeArrayPointer(keyClass, keys);
-    this.encodeArrayPointer(valueClass, values);
-  }
-
-  Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-    if (!(val instanceof Map)) {
-      throw new Error(kErrorMap);
-    }
-    var encodedSize = kStructHeaderSize + kMapStructPayloadSize;
-    var encoder = this.createAndEncodeEncoder(encodedSize);
-    encoder.encodeMap(keyClass, valueClass, val);
-  };
-
-  // Message ------------------------------------------------------------------
-
-  var kMessageInterfaceIdOffset = kStructHeaderSize;
-  var kMessageNameOffset = kMessageInterfaceIdOffset + 4;
-  var kMessageFlagsOffset = kMessageNameOffset + 4;
-  var kMessageRequestIDOffset = kMessageFlagsOffset + 8;
-
-  var kMessageExpectsResponse = 1 << 0;
-  var kMessageIsResponse      = 1 << 1;
-
-  function Message(buffer, handles) {
-    this.buffer = buffer;
-    this.handles = handles;
-  }
-
-  Message.prototype.getHeaderNumBytes = function() {
-    return this.buffer.getUint32(kStructHeaderNumBytesOffset);
-  };
-
-  Message.prototype.getHeaderVersion = function() {
-    return this.buffer.getUint32(kStructHeaderVersionOffset);
-  };
-
-  Message.prototype.getName = function() {
-    return this.buffer.getUint32(kMessageNameOffset);
-  };
-
-  Message.prototype.getFlags = function() {
-    return this.buffer.getUint32(kMessageFlagsOffset);
-  };
-
-  Message.prototype.isResponse = function() {
-    return (this.getFlags() & kMessageIsResponse) != 0;
-  };
-
-  Message.prototype.expectsResponse = function() {
-    return (this.getFlags() & kMessageExpectsResponse) != 0;
-  };
-
-  Message.prototype.setRequestID = function(requestID) {
-    // TODO(darin): Verify that space was reserved for this field!
-    this.buffer.setUint64(kMessageRequestIDOffset, requestID);
-  };
-
-
-  // MessageBuilder -----------------------------------------------------------
-
-  function MessageBuilder(messageName, payloadSize) {
-    // Currently, we don't compute the payload size correctly ahead of time.
-    // Instead, we resize the buffer at the end.
-    var numberOfBytes = kMessageHeaderSize + payloadSize;
-    this.buffer = new internal.Buffer(numberOfBytes);
-    this.handles = [];
-    var encoder = this.createEncoder(kMessageHeaderSize);
-    encoder.writeUint32(kMessageHeaderSize);
-    encoder.writeUint32(0);  // version.
-    encoder.writeUint32(0);  // interface ID.
-    encoder.writeUint32(messageName);
-    encoder.writeUint32(0);  // flags.
-    encoder.writeUint32(0);  // padding.
-  }
-
-  MessageBuilder.prototype.createEncoder = function(size) {
-    var pointer = this.buffer.alloc(size);
-    return new Encoder(this.buffer, this.handles, pointer);
-  };
-
-  MessageBuilder.prototype.encodeStruct = function(cls, val) {
-    cls.encode(this.createEncoder(cls.encodedSize), val);
-  };
-
-  MessageBuilder.prototype.finish = function() {
-    // TODO(abarth): Rather than resizing the buffer at the end, we could
-    // compute the size we need ahead of time, like we do in C++.
-    this.buffer.trim();
-    var message = new Message(this.buffer, this.handles);
-    this.buffer = null;
-    this.handles = null;
-    this.encoder = null;
-    return message;
-  };
-
-  // MessageWithRequestIDBuilder -----------------------------------------------
-
-  function MessageWithRequestIDBuilder(messageName, payloadSize, flags,
-                                       requestID) {
-    // Currently, we don't compute the payload size correctly ahead of time.
-    // Instead, we resize the buffer at the end.
-    var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize;
-    this.buffer = new internal.Buffer(numberOfBytes);
-    this.handles = [];
-    var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize);
-    encoder.writeUint32(kMessageWithRequestIDHeaderSize);
-    encoder.writeUint32(1);  // version.
-    encoder.writeUint32(0);  // interface ID.
-    encoder.writeUint32(messageName);
-    encoder.writeUint32(flags);
-    encoder.writeUint32(0);  // padding.
-    encoder.writeUint64(requestID);
-  }
-
-  MessageWithRequestIDBuilder.prototype =
-      Object.create(MessageBuilder.prototype);
-
-  MessageWithRequestIDBuilder.prototype.constructor =
-      MessageWithRequestIDBuilder;
-
-  // MessageReader ------------------------------------------------------------
-
-  function MessageReader(message) {
-    this.decoder = new Decoder(message.buffer, message.handles, 0);
-    var messageHeaderSize = this.decoder.readUint32();
-    this.payloadSize = message.buffer.byteLength - messageHeaderSize;
-    var version = this.decoder.readUint32();
-    var interface_id = this.decoder.readUint32();
-    if (interface_id != 0) {
-      throw new Error("Receiving non-zero interface ID. Associated interfaces " +
-                      "are not yet supported.");
-    }
-    this.messageName = this.decoder.readUint32();
-    this.flags = this.decoder.readUint32();
-    // Skip the padding.
-    this.decoder.skip(4);
-    if (version >= 1)
-      this.requestID = this.decoder.readUint64();
-    this.decoder.skip(messageHeaderSize - this.decoder.next);
-  }
-
-  MessageReader.prototype.decodeStruct = function(cls) {
-    return cls.decode(this.decoder);
-  };
-
-  // Built-in types -----------------------------------------------------------
-
-  // This type is only used with ArrayOf(PackedBool).
-  function PackedBool() {
-  }
-
-  function Int8() {
-  }
-
-  Int8.encodedSize = 1;
-
-  Int8.decode = function(decoder) {
-    return decoder.readInt8();
-  };
-
-  Int8.encode = function(encoder, val) {
-    encoder.writeInt8(val);
-  };
-
-  Uint8.encode = function(encoder, val) {
-    encoder.writeUint8(val);
-  };
-
-  function Uint8() {
-  }
-
-  Uint8.encodedSize = 1;
-
-  Uint8.decode = function(decoder) {
-    return decoder.readUint8();
-  };
-
-  Uint8.encode = function(encoder, val) {
-    encoder.writeUint8(val);
-  };
-
-  function Int16() {
-  }
-
-  Int16.encodedSize = 2;
-
-  Int16.decode = function(decoder) {
-    return decoder.readInt16();
-  };
-
-  Int16.encode = function(encoder, val) {
-    encoder.writeInt16(val);
-  };
-
-  function Uint16() {
-  }
-
-  Uint16.encodedSize = 2;
-
-  Uint16.decode = function(decoder) {
-    return decoder.readUint16();
-  };
-
-  Uint16.encode = function(encoder, val) {
-    encoder.writeUint16(val);
-  };
-
-  function Int32() {
-  }
-
-  Int32.encodedSize = 4;
-
-  Int32.decode = function(decoder) {
-    return decoder.readInt32();
-  };
-
-  Int32.encode = function(encoder, val) {
-    encoder.writeInt32(val);
-  };
-
-  function Uint32() {
-  }
-
-  Uint32.encodedSize = 4;
-
-  Uint32.decode = function(decoder) {
-    return decoder.readUint32();
-  };
-
-  Uint32.encode = function(encoder, val) {
-    encoder.writeUint32(val);
-  };
-
-  function Int64() {
-  }
-
-  Int64.encodedSize = 8;
-
-  Int64.decode = function(decoder) {
-    return decoder.readInt64();
-  };
-
-  Int64.encode = function(encoder, val) {
-    encoder.writeInt64(val);
-  };
-
-  function Uint64() {
-  }
-
-  Uint64.encodedSize = 8;
-
-  Uint64.decode = function(decoder) {
-    return decoder.readUint64();
-  };
-
-  Uint64.encode = function(encoder, val) {
-    encoder.writeUint64(val);
-  };
-
-  function String() {
-  };
-
-  String.encodedSize = 8;
-
-  String.decode = function(decoder) {
-    return decoder.decodeStringPointer();
-  };
-
-  String.encode = function(encoder, val) {
-    encoder.encodeStringPointer(val);
-  };
-
-  function NullableString() {
-  }
-
-  NullableString.encodedSize = String.encodedSize;
-
-  NullableString.decode = String.decode;
-
-  NullableString.encode = String.encode;
-
-  function Float() {
-  }
-
-  Float.encodedSize = 4;
-
-  Float.decode = function(decoder) {
-    return decoder.readFloat();
-  };
-
-  Float.encode = function(encoder, val) {
-    encoder.writeFloat(val);
-  };
-
-  function Double() {
-  }
-
-  Double.encodedSize = 8;
-
-  Double.decode = function(decoder) {
-    return decoder.readDouble();
-  };
-
-  Double.encode = function(encoder, val) {
-    encoder.writeDouble(val);
-  };
-
-  function Enum(cls) {
-    this.cls = cls;
-  }
-
-  Enum.prototype.encodedSize = 4;
-
-  Enum.prototype.decode = function(decoder) {
-    return decoder.readInt32();
-  };
-
-  Enum.prototype.encode = function(encoder, val) {
-    encoder.writeInt32(val);
-  };
-
-  function PointerTo(cls) {
-    this.cls = cls;
-  }
-
-  PointerTo.prototype.encodedSize = 8;
-
-  PointerTo.prototype.decode = function(decoder) {
-    var pointer = decoder.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return this.cls.decode(decoder.decodeAndCreateDecoder(pointer));
-  };
-
-  PointerTo.prototype.encode = function(encoder, val) {
-    if (!val) {
-      encoder.encodePointer(val);
-      return;
-    }
-    var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize);
-    this.cls.encode(objectEncoder, val);
-  };
-
-  function NullablePointerTo(cls) {
-    PointerTo.call(this, cls);
-  }
-
-  NullablePointerTo.prototype = Object.create(PointerTo.prototype);
-
-  function ArrayOf(cls, length) {
-    this.cls = cls;
-    this.length = length || 0;
-  }
-
-  ArrayOf.prototype.encodedSize = 8;
-
-  ArrayOf.prototype.dimensions = function() {
-    return [this.length].concat(
-      (this.cls instanceof ArrayOf) ? this.cls.dimensions() : []);
-  }
-
-  ArrayOf.prototype.decode = function(decoder) {
-    return decoder.decodeArrayPointer(this.cls);
-  };
-
-  ArrayOf.prototype.encode = function(encoder, val) {
-    encoder.encodeArrayPointer(this.cls, val);
-  };
-
-  function NullableArrayOf(cls) {
-    ArrayOf.call(this, cls);
-  }
-
-  NullableArrayOf.prototype = Object.create(ArrayOf.prototype);
-
-  function Handle() {
-  }
-
-  Handle.encodedSize = 4;
-
-  Handle.decode = function(decoder) {
-    return decoder.decodeHandle();
-  };
-
-  Handle.encode = function(encoder, val) {
-    encoder.encodeHandle(val);
-  };
-
-  function NullableHandle() {
-  }
-
-  NullableHandle.encodedSize = Handle.encodedSize;
-
-  NullableHandle.decode = Handle.decode;
-
-  NullableHandle.encode = Handle.encode;
-
-  function Interface(cls) {
-    this.cls = cls;
-  }
-
-  Interface.prototype.encodedSize = 8;
-
-  Interface.prototype.decode = function(decoder) {
-    var interfacePtrInfo = new mojo.InterfacePtrInfo(
-        decoder.decodeHandle(), decoder.readUint32());
-    var interfacePtr = new this.cls();
-    interfacePtr.ptr.bind(interfacePtrInfo);
-    return interfacePtr;
-  };
-
-  Interface.prototype.encode = function(encoder, val) {
-    var interfacePtrInfo =
-        val ? val.ptr.passInterface() : new mojo.InterfacePtrInfo(null, 0);
-    encoder.encodeHandle(interfacePtrInfo.handle);
-    encoder.writeUint32(interfacePtrInfo.version);
-  };
-
-  function NullableInterface(cls) {
-    Interface.call(this, cls);
-  }
-
-  NullableInterface.prototype = Object.create(Interface.prototype);
-
-  function InterfaceRequest() {
-  }
-
-  InterfaceRequest.encodedSize = 4;
-
-  InterfaceRequest.decode = function(decoder) {
-    return new mojo.InterfaceRequest(decoder.decodeHandle());
-  };
-
-  InterfaceRequest.encode = function(encoder, val) {
-    encoder.encodeHandle(val ? val.handle : null);
-  };
-
-  function NullableInterfaceRequest() {
-  }
-
-  NullableInterfaceRequest.encodedSize = InterfaceRequest.encodedSize;
-
-  NullableInterfaceRequest.decode = InterfaceRequest.decode;
-
-  NullableInterfaceRequest.encode = InterfaceRequest.encode;
-
-  function MapOf(keyClass, valueClass) {
-    this.keyClass = keyClass;
-    this.valueClass = valueClass;
-  }
-
-  MapOf.prototype.encodedSize = 8;
-
-  MapOf.prototype.decode = function(decoder) {
-    return decoder.decodeMapPointer(this.keyClass, this.valueClass);
-  };
-
-  MapOf.prototype.encode = function(encoder, val) {
-    encoder.encodeMapPointer(this.keyClass, this.valueClass, val);
-  };
-
-  function NullableMapOf(keyClass, valueClass) {
-    MapOf.call(this, keyClass, valueClass);
-  }
-
-  NullableMapOf.prototype = Object.create(MapOf.prototype);
-
-  internal.align = align;
-  internal.isAligned = isAligned;
-  internal.Message = Message;
-  internal.MessageBuilder = MessageBuilder;
-  internal.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder;
-  internal.MessageReader = MessageReader;
-  internal.kArrayHeaderSize = kArrayHeaderSize;
-  internal.kMapStructPayloadSize = kMapStructPayloadSize;
-  internal.kStructHeaderSize = kStructHeaderSize;
-  internal.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue;
-  internal.kMessageHeaderSize = kMessageHeaderSize;
-  internal.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize;
-  internal.kMessageExpectsResponse = kMessageExpectsResponse;
-  internal.kMessageIsResponse = kMessageIsResponse;
-  internal.Int8 = Int8;
-  internal.Uint8 = Uint8;
-  internal.Int16 = Int16;
-  internal.Uint16 = Uint16;
-  internal.Int32 = Int32;
-  internal.Uint32 = Uint32;
-  internal.Int64 = Int64;
-  internal.Uint64 = Uint64;
-  internal.Float = Float;
-  internal.Double = Double;
-  internal.String = String;
-  internal.Enum = Enum;
-  internal.NullableString = NullableString;
-  internal.PointerTo = PointerTo;
-  internal.NullablePointerTo = NullablePointerTo;
-  internal.ArrayOf = ArrayOf;
-  internal.NullableArrayOf = NullableArrayOf;
-  internal.PackedBool = PackedBool;
-  internal.Handle = Handle;
-  internal.NullableHandle = NullableHandle;
-  internal.Interface = Interface;
-  internal.NullableInterface = NullableInterface;
-  internal.InterfaceRequest = InterfaceRequest;
-  internal.NullableInterfaceRequest = NullableInterfaceRequest;
-  internal.MapOf = MapOf;
-  internal.NullableMapOf = NullableMapOf;
-})();
diff --git a/mojo/public/js/new_bindings/connector.js b/mojo/public/js/new_bindings/connector.js
deleted file mode 100644
index 7fa4822..0000000
--- a/mojo/public/js/new_bindings/connector.js
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-  var internal = mojo.internal;
-
-  function Connector(handle) {
-    if (!(handle instanceof MojoHandle))
-      throw new Error("Connector: not a handle " + handle);
-    this.handle_ = handle;
-    this.dropWrites_ = false;
-    this.error_ = false;
-    this.incomingReceiver_ = null;
-    this.readWatcher_ = null;
-    this.errorHandler_ = null;
-
-    if (handle) {
-      this.readWatcher_ = handle.watch({readable: true},
-                                       this.readMore_.bind(this));
-    }
-  }
-
-  Connector.prototype.close = function() {
-    if (this.readWatcher_) {
-      this.readWatcher_.cancel();
-      this.readWatcher_ = null;
-    }
-    if (this.handle_ != null) {
-      this.handle_.close();
-      this.handle_ = null;
-    }
-  };
-
-  Connector.prototype.accept = function(message) {
-    if (this.error_)
-      return false;
-
-    if (this.dropWrites_)
-      return true;
-
-    var result = this.handle_.writeMessage(
-        new Uint8Array(message.buffer.arrayBuffer), message.handles);
-    switch (result) {
-      case Mojo.RESULT_OK:
-        // The handles were successfully transferred, so we don't own them
-        // anymore.
-        message.handles = [];
-        break;
-      case Mojo.RESULT_FAILED_PRECONDITION:
-        // There's no point in continuing to write to this pipe since the other
-        // end is gone. Avoid writing any future messages. Hide write failures
-        // from the caller since we'd like them to continue consuming any
-        // backlog of incoming messages before regarding the message pipe as
-        // closed.
-        this.dropWrites_ = true;
-        break;
-      default:
-        // This particular write was rejected, presumably because of bad input.
-        // The pipe is not necessarily in a bad state.
-        return false;
-    }
-    return true;
-  };
-
-  Connector.prototype.setIncomingReceiver = function(receiver) {
-    this.incomingReceiver_ = receiver;
-  };
-
-  Connector.prototype.setErrorHandler = function(handler) {
-    this.errorHandler_ = handler;
-  };
-
-  Connector.prototype.encounteredError = function() {
-    return this.error_;
-  };
-
-  Connector.prototype.waitForNextMessageForTesting = function() {
-    // TODO(yzshen): Change the tests that use this method.
-    throw new Error("Not supported!");
-  };
-
-  Connector.prototype.readMore_ = function(result) {
-    for (;;) {
-      var read = this.handle_.readMessage();
-      if (this.handle_ == null) // The connector has been closed.
-        return;
-      if (read.result == Mojo.RESULT_SHOULD_WAIT)
-        return;
-      if (read.result != Mojo.RESULT_OK) {
-        this.error_ = true;
-        if (this.errorHandler_)
-          this.errorHandler_.onError(read.result);
-        return;
-      }
-      var messageBuffer = new internal.Buffer(read.buffer);
-      var message = new internal.Message(messageBuffer, read.handles);
-      if (this.incomingReceiver_)
-        this.incomingReceiver_.accept(message);
-    }
-  };
-
-  internal.Connector = Connector;
-})();
diff --git a/mojo/public/js/new_bindings/interface_types.js b/mojo/public/js/new_bindings/interface_types.js
deleted file mode 100644
index c52f6c7..0000000
--- a/mojo/public/js/new_bindings/interface_types.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-  // ---------------------------------------------------------------------------
-
-  function InterfacePtrInfo(handle, version) {
-    this.handle = handle;
-    this.version = version;
-  }
-
-  InterfacePtrInfo.prototype.isValid = function() {
-    return this.handle instanceof MojoHandle;
-  };
-
-  InterfacePtrInfo.prototype.close = function() {
-    if (!this.isValid())
-      return;
-
-    this.handle.close();
-    this.handle = null;
-    this.version = 0;
-  };
-
-  // ---------------------------------------------------------------------------
-
-  function InterfaceRequest(handle) {
-    this.handle = handle;
-  }
-
-  InterfaceRequest.prototype.isValid = function() {
-    return this.handle instanceof MojoHandle;
-  };
-
-  InterfaceRequest.prototype.close = function() {
-    if (!this.isValid())
-      return;
-
-    this.handle.close();
-    this.handle = null;
-  };
-
-  mojo.InterfacePtrInfo = InterfacePtrInfo;
-  mojo.InterfaceRequest = InterfaceRequest;
-})();
diff --git a/mojo/public/js/new_bindings/lib/control_message_handler.js b/mojo/public/js/new_bindings/lib/control_message_handler.js
deleted file mode 100644
index 3f122fb..0000000
--- a/mojo/public/js/new_bindings/lib/control_message_handler.js
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-  var internal = mojo.internal;
-
-  function validateControlRequestWithResponse(message) {
-    var messageValidator = new internal.Validator(message);
-    var error = messageValidator.validateMessageIsRequestExpectingResponse();
-    if (error !== internal.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != mojo.interface_control2.kRunMessageId) {
-      throw new Error("Control message name is not kRunMessageId");
-    }
-
-    // Validate payload.
-    error = mojo.interface_control2.RunMessageParams.validate(messageValidator,
-        message.getHeaderNumBytes());
-    if (error != internal.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function validateControlRequestWithoutResponse(message) {
-    var messageValidator = new internal.Validator(message);
-    var error = messageValidator.validateMessageIsRequestWithoutResponse();
-    if (error != internal.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != mojo.interface_control2.kRunOrClosePipeMessageId) {
-      throw new Error("Control message name is not kRunOrClosePipeMessageId");
-    }
-
-    // Validate payload.
-    error = mojo.interface_control2.RunOrClosePipeMessageParams.validate(
-        messageValidator, message.getHeaderNumBytes());
-    if (error != internal.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function runOrClosePipe(message, interface_version) {
-    var reader = new internal.MessageReader(message);
-    var runOrClosePipeMessageParams = reader.decodeStruct(
-        mojo.interface_control2.RunOrClosePipeMessageParams);
-    return interface_version >=
-        runOrClosePipeMessageParams.input.require_version.version;
-  }
-
-  function run(message, responder, interface_version) {
-    var reader = new internal.MessageReader(message);
-    var runMessageParams =
-        reader.decodeStruct(mojo.interface_control2.RunMessageParams);
-    var runOutput = null;
-
-    if (runMessageParams.input.query_version) {
-      runOutput = new mojo.interface_control2.RunOutput();
-      runOutput.query_version_result = new
-          mojo.interface_control2.QueryVersionResult(
-              {'version': interface_version});
-    }
-
-    var runResponseMessageParams = new
-        mojo.interface_control2.RunResponseMessageParams();
-    runResponseMessageParams.output = runOutput;
-
-    var messageName = mojo.interface_control2.kRunMessageId;
-    var payloadSize =
-        mojo.interface_control2.RunResponseMessageParams.encodedSize;
-    var requestID = reader.requestID;
-    var builder = new internal.MessageWithRequestIDBuilder(messageName,
-        payloadSize, internal.kMessageIsResponse, requestID);
-    builder.encodeStruct(mojo.interface_control2.RunResponseMessageParams,
-                         runResponseMessageParams);
-    responder.accept(builder.finish());
-    return true;
-  }
-
-  function isInterfaceControlMessage(message) {
-    return message.getName() == mojo.interface_control2.kRunMessageId ||
-           message.getName() ==
-               mojo.interface_control2.kRunOrClosePipeMessageId;
-  }
-
-  function ControlMessageHandler(interface_version) {
-    this.interface_version = interface_version;
-  }
-
-  ControlMessageHandler.prototype.accept = function(message) {
-    validateControlRequestWithoutResponse(message);
-    return runOrClosePipe(message, this.interface_version);
-  };
-
-  ControlMessageHandler.prototype.acceptWithResponder = function(message,
-      responder) {
-    validateControlRequestWithResponse(message);
-    return run(message, responder, this.interface_version);
-  };
-
-  internal.ControlMessageHandler = ControlMessageHandler;
-  internal.isInterfaceControlMessage = isInterfaceControlMessage;
-})();
diff --git a/mojo/public/js/new_bindings/lib/control_message_proxy.js b/mojo/public/js/new_bindings/lib/control_message_proxy.js
deleted file mode 100644
index 1d57557..0000000
--- a/mojo/public/js/new_bindings/lib/control_message_proxy.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-  var internal = mojo.internal;
-
-  function sendRunOrClosePipeMessage(receiver, runOrClosePipeMessageParams) {
-    var messageName = mojo.interface_control2.kRunOrClosePipeMessageId;
-    var payloadSize =
-        mojo.interface_control2.RunOrClosePipeMessageParams.encodedSize;
-    var builder = new internal.MessageBuilder(messageName, payloadSize);
-    builder.encodeStruct(mojo.interface_control2.RunOrClosePipeMessageParams,
-                         runOrClosePipeMessageParams);
-    var message = builder.finish();
-    receiver.accept(message);
-  }
-
-  function validateControlResponse(message) {
-    var messageValidator = new internal.Validator(message);
-    var error = messageValidator.validateMessageIsResponse();
-    if (error != internal.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != mojo.interface_control2.kRunMessageId) {
-      throw new Error("Control message name is not kRunMessageId");
-    }
-
-    // Validate payload.
-    error = mojo.interface_control2.RunResponseMessageParams.validate(
-        messageValidator, message.getHeaderNumBytes());
-    if (error != internal.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function acceptRunResponse(message) {
-    validateControlResponse(message);
-
-    var reader = new internal.MessageReader(message);
-    var runResponseMessageParams = reader.decodeStruct(
-        mojo.interface_control2.RunResponseMessageParams);
-
-    return Promise.resolve(runResponseMessageParams);
-  }
-
- /**
-  * Sends the given run message through the receiver.
-  * Accepts the response message from the receiver and decodes the message
-  * struct to RunResponseMessageParams.
-  *
-  * @param  {Router} receiver.
-  * @param  {RunMessageParams} runMessageParams to be sent via a message.
-  * @return {Promise} that resolves to a RunResponseMessageParams.
-  */
-  function sendRunMessage(receiver, runMessageParams) {
-    var messageName = mojo.interface_control2.kRunMessageId;
-    var payloadSize = mojo.interface_control2.RunMessageParams.encodedSize;
-    // |requestID| is set to 0, but is later properly set by Router.
-    var builder = new internal.MessageWithRequestIDBuilder(messageName,
-        payloadSize, internal.kMessageExpectsResponse, 0);
-    builder.encodeStruct(mojo.interface_control2.RunMessageParams,
-                         runMessageParams);
-    var message = builder.finish();
-
-    return receiver.acceptAndExpectResponse(message).then(acceptRunResponse);
-  }
-
-  function ControlMessageProxy(receiver) {
-    this.receiver = receiver;
-  }
-
-  ControlMessageProxy.prototype.queryVersion = function() {
-    var runMessageParams = new mojo.interface_control2.RunMessageParams();
-    runMessageParams.input = new mojo.interface_control2.RunInput();
-    runMessageParams.input.query_version =
-        new mojo.interface_control2.QueryVersion();
-
-    return sendRunMessage(this.receiver, runMessageParams).then(function(
-        runResponseMessageParams) {
-      return runResponseMessageParams.output.query_version_result.version;
-    });
-  };
-
-  ControlMessageProxy.prototype.requireVersion = function(version) {
-    var runOrClosePipeMessageParams = new
-        mojo.interface_control2.RunOrClosePipeMessageParams();
-    runOrClosePipeMessageParams.input = new
-        mojo.interface_control2.RunOrClosePipeInput();
-    runOrClosePipeMessageParams.input.require_version = new
-        mojo.interface_control2.RequireVersion({'version': version});
-    sendRunOrClosePipeMessage(this.receiver, runOrClosePipeMessageParams);
-  };
-
-  internal.ControlMessageProxy = ControlMessageProxy;
-})();
diff --git a/mojo/public/js/new_bindings/router.js b/mojo/public/js/new_bindings/router.js
deleted file mode 100644
index 1272407..0000000
--- a/mojo/public/js/new_bindings/router.js
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-  var internal = mojo.internal;
-
-  function Router(handle, interface_version, connectorFactory) {
-    if (!(handle instanceof MojoHandle))
-      throw new Error("Router constructor: Not a handle");
-    if (connectorFactory === undefined)
-      connectorFactory = internal.Connector;
-    this.connector_ = new connectorFactory(handle);
-    this.incomingReceiver_ = null;
-    this.errorHandler_ = null;
-    this.nextRequestID_ = 0;
-    this.completers_ = new Map();
-    this.payloadValidators_ = [];
-    this.testingController_ = null;
-
-    if (interface_version !== undefined) {
-      this.controlMessageHandler_ = new
-          internal.ControlMessageHandler(interface_version);
-    }
-
-    this.connector_.setIncomingReceiver({
-        accept: this.handleIncomingMessage_.bind(this),
-    });
-    this.connector_.setErrorHandler({
-        onError: this.handleConnectionError_.bind(this),
-    });
-  }
-
-  Router.prototype.close = function() {
-    this.completers_.clear();  // Drop any responders.
-    this.connector_.close();
-    this.testingController_ = null;
-  };
-
-  Router.prototype.accept = function(message) {
-    this.connector_.accept(message);
-  };
-
-  Router.prototype.reject = function(message) {
-    // TODO(mpcomplete): no way to trasmit errors over a Connection.
-  };
-
-  Router.prototype.acceptAndExpectResponse = function(message) {
-    // Reserve 0 in case we want it to convey special meaning in the future.
-    var requestID = this.nextRequestID_++;
-    if (requestID == 0)
-      requestID = this.nextRequestID_++;
-
-    message.setRequestID(requestID);
-    var result = this.connector_.accept(message);
-    if (!result)
-      return Promise.reject(Error("Connection error"));
-
-    var completer = {};
-    this.completers_.set(requestID, completer);
-    return new Promise(function(resolve, reject) {
-      completer.resolve = resolve;
-      completer.reject = reject;
-    });
-  };
-
-  Router.prototype.setIncomingReceiver = function(receiver) {
-    this.incomingReceiver_ = receiver;
-  };
-
-  Router.prototype.setPayloadValidators = function(payloadValidators) {
-    this.payloadValidators_ = payloadValidators;
-  };
-
-  Router.prototype.setErrorHandler = function(handler) {
-    this.errorHandler_ = handler;
-  };
-
-  Router.prototype.encounteredError = function() {
-    return this.connector_.encounteredError();
-  };
-
-  Router.prototype.enableTestingMode = function() {
-    this.testingController_ = new RouterTestingController(this.connector_);
-    return this.testingController_;
-  };
-
-  Router.prototype.handleIncomingMessage_ = function(message) {
-    var noError = internal.validationError.NONE;
-    var messageValidator = new internal.Validator(message);
-    var err = messageValidator.validateMessageHeader();
-    for (var i = 0; err === noError && i < this.payloadValidators_.length; ++i)
-      err = this.payloadValidators_[i](messageValidator);
-
-    if (err == noError)
-      this.handleValidIncomingMessage_(message);
-    else
-      this.handleInvalidIncomingMessage_(message, err);
-  };
-
-  Router.prototype.handleValidIncomingMessage_ = function(message) {
-    if (this.testingController_)
-      return;
-
-    if (message.expectsResponse()) {
-      if (internal.isInterfaceControlMessage(message)) {
-        if (this.controlMessageHandler_) {
-          this.controlMessageHandler_.acceptWithResponder(message, this);
-        } else {
-          this.close();
-        }
-      } else if (this.incomingReceiver_) {
-        this.incomingReceiver_.acceptWithResponder(message, this);
-      } else {
-        // If we receive a request expecting a response when the client is not
-        // listening, then we have no choice but to tear down the pipe.
-        this.close();
-      }
-    } else if (message.isResponse()) {
-      var reader = new internal.MessageReader(message);
-      var requestID = reader.requestID;
-      var completer = this.completers_.get(requestID);
-      if (completer) {
-        this.completers_.delete(requestID);
-        completer.resolve(message);
-      } else {
-        console.log("Unexpected response with request ID: " + requestID);
-      }
-    } else {
-      if (internal.isInterfaceControlMessage(message)) {
-        if (this.controlMessageHandler_) {
-          var ok = this.controlMessageHandler_.accept(message);
-          if (ok) return;
-        }
-        this.close();
-      } else if (this.incomingReceiver_) {
-        this.incomingReceiver_.accept(message);
-      }
-    }
-  };
-
-  Router.prototype.handleInvalidIncomingMessage_ = function(message, error) {
-    if (!this.testingController_) {
-      // TODO(yzshen): Consider notifying the embedder.
-      // TODO(yzshen): This should also trigger connection error handler.
-      // Consider making accept() return a boolean and let the connector deal
-      // with this, as the C++ code does.
-      console.log("Invalid message: " + internal.validationError[error]);
-
-      this.close();
-      return;
-    }
-
-    this.testingController_.onInvalidIncomingMessage(error);
-  };
-
-  Router.prototype.handleConnectionError_ = function(result) {
-    this.completers_.forEach(function(value) {
-      value.reject(result);
-    });
-    if (this.errorHandler_)
-      this.errorHandler_();
-    this.close();
-  };
-
-  // The RouterTestingController is used in unit tests. It defeats valid message
-  // handling and delgates invalid message handling.
-
-  function RouterTestingController(connector) {
-    this.connector_ = connector;
-    this.invalidMessageHandler_ = null;
-  }
-
-  RouterTestingController.prototype.waitForNextMessage = function() {
-    this.connector_.waitForNextMessageForTesting();
-  };
-
-  RouterTestingController.prototype.setInvalidIncomingMessageHandler =
-      function(callback) {
-    this.invalidMessageHandler_ = callback;
-  };
-
-  RouterTestingController.prototype.onInvalidIncomingMessage =
-      function(error) {
-    if (this.invalidMessageHandler_)
-      this.invalidMessageHandler_(error);
-  };
-
-  internal.Router = Router;
-})();
diff --git a/mojo/public/js/new_bindings/unicode.js b/mojo/public/js/new_bindings/unicode.js
deleted file mode 100644
index 6ed8839..0000000
--- a/mojo/public/js/new_bindings/unicode.js
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * Defines functions for translating between JavaScript strings and UTF8 strings
- * stored in ArrayBuffers. There is much room for optimization in this code if
- * it proves necessary.
- */
-(function() {
-  var internal = mojo.internal;
-
-  /**
-   * Decodes the UTF8 string from the given buffer.
-   * @param {ArrayBufferView} buffer The buffer containing UTF8 string data.
-   * @return {string} The corresponding JavaScript string.
-   */
-  function decodeUtf8String(buffer) {
-    return decodeURIComponent(escape(String.fromCharCode.apply(null, buffer)));
-  }
-
-  /**
-   * Encodes the given JavaScript string into UTF8.
-   * @param {string} str The string to encode.
-   * @param {ArrayBufferView} outputBuffer The buffer to contain the result.
-   * Should be pre-allocated to hold enough space. Use |utf8Length| to determine
-   * how much space is required.
-   * @return {number} The number of bytes written to |outputBuffer|.
-   */
-  function encodeUtf8String(str, outputBuffer) {
-    var utf8String = unescape(encodeURIComponent(str));
-    if (outputBuffer.length < utf8String.length)
-      throw new Error("Buffer too small for encodeUtf8String");
-    for (var i = 0; i < outputBuffer.length && i < utf8String.length; i++)
-      outputBuffer[i] = utf8String.charCodeAt(i);
-    return i;
-  }
-
-  /**
-   * Returns the number of bytes that a UTF8 encoding of the JavaScript string
-   * |str| would occupy.
-   */
-  function utf8Length(str) {
-    var utf8String = unescape(encodeURIComponent(str));
-    return utf8String.length;
-  }
-
-  internal.decodeUtf8String = decodeUtf8String;
-  internal.encodeUtf8String = encodeUtf8String;
-  internal.utf8Length = utf8Length;
-})();
diff --git a/mojo/public/js/new_bindings/validator.js b/mojo/public/js/new_bindings/validator.js
deleted file mode 100644
index 610112b..0000000
--- a/mojo/public/js/new_bindings/validator.js
+++ /dev/null
@@ -1,511 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-  var internal = mojo.internal;
-
-  var validationError = {
-    NONE: 'VALIDATION_ERROR_NONE',
-    MISALIGNED_OBJECT: 'VALIDATION_ERROR_MISALIGNED_OBJECT',
-    ILLEGAL_MEMORY_RANGE: 'VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE',
-    UNEXPECTED_STRUCT_HEADER: 'VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER',
-    UNEXPECTED_ARRAY_HEADER: 'VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER',
-    ILLEGAL_HANDLE: 'VALIDATION_ERROR_ILLEGAL_HANDLE',
-    UNEXPECTED_INVALID_HANDLE: 'VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE',
-    ILLEGAL_POINTER: 'VALIDATION_ERROR_ILLEGAL_POINTER',
-    UNEXPECTED_NULL_POINTER: 'VALIDATION_ERROR_UNEXPECTED_NULL_POINTER',
-    MESSAGE_HEADER_INVALID_FLAGS:
-        'VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS',
-    MESSAGE_HEADER_MISSING_REQUEST_ID:
-        'VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID',
-    DIFFERENT_SIZED_ARRAYS_IN_MAP:
-        'VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP',
-    INVALID_UNION_SIZE: 'VALIDATION_ERROR_INVALID_UNION_SIZE',
-    UNEXPECTED_NULL_UNION: 'VALIDATION_ERROR_UNEXPECTED_NULL_UNION',
-    UNKNOWN_ENUM_VALUE: 'VALIDATION_ERROR_UNKNOWN_ENUM_VALUE',
-  };
-
-  var NULL_MOJO_POINTER = "NULL_MOJO_POINTER";
-
-  function isEnumClass(cls) {
-    return cls instanceof internal.Enum;
-  }
-
-  function isStringClass(cls) {
-    return cls === internal.String || cls === internal.NullableString;
-  }
-
-  function isHandleClass(cls) {
-    return cls === internal.Handle || cls === internal.NullableHandle;
-  }
-
-  function isInterfaceClass(cls) {
-    return cls instanceof internal.Interface;
-  }
-
-  function isInterfaceRequestClass(cls) {
-    return cls === internal.InterfaceRequest ||
-        cls === internal.NullableInterfaceRequest;
-  }
-
-  function isNullable(type) {
-    return type === internal.NullableString ||
-        type === internal.NullableHandle ||
-        type === internal.NullableInterface ||
-        type === internal.NullableInterfaceRequest ||
-        type instanceof internal.NullableArrayOf ||
-        type instanceof internal.NullablePointerTo;
-  }
-
-  function Validator(message) {
-    this.message = message;
-    this.offset = 0;
-    this.handleIndex = 0;
-  }
-
-  Object.defineProperty(Validator.prototype, "offsetLimit", {
-    get: function() { return this.message.buffer.byteLength; }
-  });
-
-  Object.defineProperty(Validator.prototype, "handleIndexLimit", {
-    get: function() { return this.message.handles.length; }
-  });
-
-  // True if we can safely allocate a block of bytes from start to
-  // to start + numBytes.
-  Validator.prototype.isValidRange = function(start, numBytes) {
-    // Only positive JavaScript integers that are less than 2^53
-    // (Number.MAX_SAFE_INTEGER) can be represented exactly.
-    if (start < this.offset || numBytes <= 0 ||
-        !Number.isSafeInteger(start) ||
-        !Number.isSafeInteger(numBytes))
-      return false;
-
-    var newOffset = start + numBytes;
-    if (!Number.isSafeInteger(newOffset) || newOffset > this.offsetLimit)
-      return false;
-
-    return true;
-  };
-
-  Validator.prototype.claimRange = function(start, numBytes) {
-    if (this.isValidRange(start, numBytes)) {
-      this.offset = start + numBytes;
-      return true;
-    }
-    return false;
-  };
-
-  Validator.prototype.claimHandle = function(index) {
-    if (index === internal.kEncodedInvalidHandleValue)
-      return true;
-
-    if (index < this.handleIndex || index >= this.handleIndexLimit)
-      return false;
-
-    // This is safe because handle indices are uint32.
-    this.handleIndex = index + 1;
-    return true;
-  };
-
-  Validator.prototype.validateEnum = function(offset, enumClass) {
-    // Note: Assumes that enums are always 32 bits! But this matches
-    // mojom::generate::pack::PackedField::GetSizeForKind, so it should be okay.
-    var value = this.message.buffer.getInt32(offset);
-    return enumClass.validate(value);
-  }
-
-  Validator.prototype.validateHandle = function(offset, nullable) {
-    var index = this.message.buffer.getUint32(offset);
-
-    if (index === internal.kEncodedInvalidHandleValue)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_INVALID_HANDLE;
-
-    if (!this.claimHandle(index))
-      return validationError.ILLEGAL_HANDLE;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateInterface = function(offset, nullable) {
-    return this.validateHandle(offset, nullable);
-  };
-
-  Validator.prototype.validateInterfaceRequest = function(offset, nullable) {
-    return this.validateHandle(offset, nullable);
-  };
-
-  Validator.prototype.validateStructHeader = function(offset, minNumBytes) {
-    if (!internal.isAligned(offset))
-      return validationError.MISALIGNED_OBJECT;
-
-    if (!this.isValidRange(offset, internal.kStructHeaderSize))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    var numBytes = this.message.buffer.getUint32(offset);
-
-    if (numBytes < minNumBytes)
-      return validationError.UNEXPECTED_STRUCT_HEADER;
-
-    if (!this.claimRange(offset, numBytes))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateStructVersion = function(offset, versionSizes) {
-    var numBytes = this.message.buffer.getUint32(offset);
-    var version = this.message.buffer.getUint32(offset + 4);
-
-    if (version <= versionSizes[versionSizes.length - 1].version) {
-      // Scan in reverse order to optimize for more recent versionSizes.
-      for (var i = versionSizes.length - 1; i >= 0; --i) {
-        if (version >= versionSizes[i].version) {
-          if (numBytes == versionSizes[i].numBytes)
-            break;
-          return validationError.UNEXPECTED_STRUCT_HEADER;
-        }
-      }
-    } else if (numBytes < versionSizes[versionSizes.length-1].numBytes) {
-      return validationError.UNEXPECTED_STRUCT_HEADER;
-    }
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.isFieldInStructVersion = function(offset, fieldVersion) {
-    var structVersion = this.message.buffer.getUint32(offset + 4);
-    return fieldVersion <= structVersion;
-  };
-
-  Validator.prototype.validateMessageHeader = function() {
-
-    var err = this.validateStructHeader(0, internal.kMessageHeaderSize);
-    if (err != validationError.NONE)
-      return err;
-
-    var numBytes = this.message.getHeaderNumBytes();
-    var version = this.message.getHeaderVersion();
-
-    var validVersionAndNumBytes =
-        (version == 0 && numBytes == internal.kMessageHeaderSize) ||
-        (version == 1 &&
-         numBytes == internal.kMessageWithRequestIDHeaderSize) ||
-        (version > 1 &&
-         numBytes >= internal.kMessageWithRequestIDHeaderSize);
-    if (!validVersionAndNumBytes)
-      return validationError.UNEXPECTED_STRUCT_HEADER;
-
-    var expectsResponse = this.message.expectsResponse();
-    var isResponse = this.message.isResponse();
-
-    if (version == 0 && (expectsResponse || isResponse))
-      return validationError.MESSAGE_HEADER_MISSING_REQUEST_ID;
-
-    if (isResponse && expectsResponse)
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateMessageIsRequestWithoutResponse = function() {
-    if (this.message.isResponse() || this.message.expectsResponse()) {
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateMessageIsRequestExpectingResponse = function() {
-    if (this.message.isResponse() || !this.message.expectsResponse()) {
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateMessageIsResponse = function() {
-    if (this.message.expectsResponse() || !this.message.isResponse()) {
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-    }
-    return validationError.NONE;
-  };
-
-  // Returns the message.buffer relative offset this pointer "points to",
-  // NULL_MOJO_POINTER if the pointer represents a null, or JS null if the
-  // pointer's value is not valid.
-  Validator.prototype.decodePointer = function(offset) {
-    var pointerValue = this.message.buffer.getUint64(offset);
-    if (pointerValue === 0)
-      return NULL_MOJO_POINTER;
-    var bufferOffset = offset + pointerValue;
-    return Number.isSafeInteger(bufferOffset) ? bufferOffset : null;
-  };
-
-  Validator.prototype.decodeUnionSize = function(offset) {
-    return this.message.buffer.getUint32(offset);
-  };
-
-  Validator.prototype.decodeUnionTag = function(offset) {
-    return this.message.buffer.getUint32(offset + 4);
-  };
-
-  Validator.prototype.validateArrayPointer = function(
-      offset, elementSize, elementType, nullable, expectedDimensionSizes,
-      currentDimension) {
-    var arrayOffset = this.decodePointer(offset);
-    if (arrayOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (arrayOffset === NULL_MOJO_POINTER)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
-
-    return this.validateArray(arrayOffset, elementSize, elementType,
-                              expectedDimensionSizes, currentDimension);
-  };
-
-  Validator.prototype.validateStructPointer = function(
-      offset, structClass, nullable) {
-    var structOffset = this.decodePointer(offset);
-    if (structOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (structOffset === NULL_MOJO_POINTER)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
-
-    return structClass.validate(this, structOffset);
-  };
-
-  Validator.prototype.validateUnion = function(
-      offset, unionClass, nullable) {
-    var size = this.message.buffer.getUint32(offset);
-    if (size == 0) {
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_UNION;
-    }
-
-    return unionClass.validate(this, offset);
-  };
-
-  Validator.prototype.validateNestedUnion = function(
-      offset, unionClass, nullable) {
-    var unionOffset = this.decodePointer(offset);
-    if (unionOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (unionOffset === NULL_MOJO_POINTER)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_UNION;
-
-    return this.validateUnion(unionOffset, unionClass, nullable);
-  };
-
-  // This method assumes that the array at arrayPointerOffset has
-  // been validated.
-
-  Validator.prototype.arrayLength = function(arrayPointerOffset) {
-    var arrayOffset = this.decodePointer(arrayPointerOffset);
-    return this.message.buffer.getUint32(arrayOffset + 4);
-  };
-
-  Validator.prototype.validateMapPointer = function(
-      offset, mapIsNullable, keyClass, valueClass, valueIsNullable) {
-    // Validate the implicit map struct:
-    // struct {array<keyClass> keys; array<valueClass> values};
-    var structOffset = this.decodePointer(offset);
-    if (structOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (structOffset === NULL_MOJO_POINTER)
-      return mapIsNullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
-
-    var mapEncodedSize = internal.kStructHeaderSize +
-        internal.kMapStructPayloadSize;
-    var err = this.validateStructHeader(structOffset, mapEncodedSize);
-    if (err !== validationError.NONE)
-        return err;
-
-    // Validate the keys array.
-    var keysArrayPointerOffset = structOffset + internal.kStructHeaderSize;
-    err = this.validateArrayPointer(
-        keysArrayPointerOffset, keyClass.encodedSize, keyClass, false, [0], 0);
-    if (err !== validationError.NONE)
-        return err;
-
-    // Validate the values array.
-    var valuesArrayPointerOffset = keysArrayPointerOffset + 8;
-    var valuesArrayDimensions = [0]; // Validate the actual length below.
-    if (valueClass instanceof internal.ArrayOf)
-      valuesArrayDimensions =
-          valuesArrayDimensions.concat(valueClass.dimensions());
-    var err = this.validateArrayPointer(valuesArrayPointerOffset,
-                                        valueClass.encodedSize,
-                                        valueClass,
-                                        valueIsNullable,
-                                        valuesArrayDimensions,
-                                        0);
-    if (err !== validationError.NONE)
-        return err;
-
-    // Validate the lengths of the keys and values arrays.
-    var keysArrayLength = this.arrayLength(keysArrayPointerOffset);
-    var valuesArrayLength = this.arrayLength(valuesArrayPointerOffset);
-    if (keysArrayLength != valuesArrayLength)
-      return validationError.DIFFERENT_SIZED_ARRAYS_IN_MAP;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateStringPointer = function(offset, nullable) {
-    return this.validateArrayPointer(
-        offset, internal.Uint8.encodedSize, internal.Uint8, nullable, [0], 0);
-  };
-
-  // Similar to Array_Data<T>::Validate()
-  // mojo/public/cpp/bindings/lib/array_internal.h
-
-  Validator.prototype.validateArray =
-      function (offset, elementSize, elementType, expectedDimensionSizes,
-                currentDimension) {
-    if (!internal.isAligned(offset))
-      return validationError.MISALIGNED_OBJECT;
-
-    if (!this.isValidRange(offset, internal.kArrayHeaderSize))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    var numBytes = this.message.buffer.getUint32(offset);
-    var numElements = this.message.buffer.getUint32(offset + 4);
-
-    // Note: this computation is "safe" because elementSize <= 8 and
-    // numElements is a uint32.
-    var elementsTotalSize = (elementType === internal.PackedBool) ?
-        Math.ceil(numElements / 8) : (elementSize * numElements);
-
-    if (numBytes < internal.kArrayHeaderSize + elementsTotalSize)
-      return validationError.UNEXPECTED_ARRAY_HEADER;
-
-    if (expectedDimensionSizes[currentDimension] != 0 &&
-        numElements != expectedDimensionSizes[currentDimension]) {
-      return validationError.UNEXPECTED_ARRAY_HEADER;
-    }
-
-    if (!this.claimRange(offset, numBytes))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    // Validate the array's elements if they are pointers or handles.
-
-    var elementsOffset = offset + internal.kArrayHeaderSize;
-    var nullable = isNullable(elementType);
-
-    if (isHandleClass(elementType))
-      return this.validateHandleElements(elementsOffset, numElements, nullable);
-    if (isInterfaceClass(elementType))
-      return this.validateInterfaceElements(
-          elementsOffset, numElements, nullable);
-    if (isInterfaceRequestClass(elementType))
-      return this.validateInterfaceRequestElements(
-          elementsOffset, numElements, nullable);
-    if (isStringClass(elementType))
-      return this.validateArrayElements(
-          elementsOffset, numElements, internal.Uint8, nullable, [0], 0);
-    if (elementType instanceof internal.PointerTo)
-      return this.validateStructElements(
-          elementsOffset, numElements, elementType.cls, nullable);
-    if (elementType instanceof internal.ArrayOf)
-      return this.validateArrayElements(
-          elementsOffset, numElements, elementType.cls, nullable,
-          expectedDimensionSizes, currentDimension + 1);
-    if (isEnumClass(elementType))
-      return this.validateEnumElements(elementsOffset, numElements,
-                                       elementType.cls);
-
-    return validationError.NONE;
-  };
-
-  // Note: the |offset + i * elementSize| computation in the validateFooElements
-  // methods below is "safe" because elementSize <= 8, offset and
-  // numElements are uint32, and 0 <= i < numElements.
-
-  Validator.prototype.validateHandleElements =
-      function(offset, numElements, nullable) {
-    var elementSize = internal.Handle.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateHandle(elementOffset, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateInterfaceElements =
-      function(offset, numElements, nullable) {
-    var elementSize = internal.Interface.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateInterface(elementOffset, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateInterfaceRequestElements =
-      function(offset, numElements, nullable) {
-    var elementSize = internal.InterfaceRequest.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateInterfaceRequest(elementOffset, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  // The elementClass parameter is the element type of the element arrays.
-  Validator.prototype.validateArrayElements =
-      function(offset, numElements, elementClass, nullable,
-               expectedDimensionSizes, currentDimension) {
-    var elementSize = internal.PointerTo.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateArrayPointer(
-          elementOffset, elementClass.encodedSize, elementClass, nullable,
-          expectedDimensionSizes, currentDimension);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateStructElements =
-      function(offset, numElements, structClass, nullable) {
-    var elementSize = internal.PointerTo.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err =
-          this.validateStructPointer(elementOffset, structClass, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateEnumElements =
-      function(offset, numElements, enumClass) {
-    var elementSize = internal.Enum.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateEnum(elementOffset, enumClass);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  internal.validationError = validationError;
-  internal.Validator = Validator;
-})();
diff --git a/mojo/public/js/router.js b/mojo/public/js/router.js
deleted file mode 100644
index 89d9a2f..0000000
--- a/mojo/public/js/router.js
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/router", [
-  "mojo/public/js/connector",
-  "mojo/public/js/core",
-  "mojo/public/js/interface_types",
-  "mojo/public/js/lib/interface_endpoint_handle",
-  "mojo/public/js/lib/pipe_control_message_handler",
-  "mojo/public/js/lib/pipe_control_message_proxy",
-  "mojo/public/js/validator",
-  "timer",
-], function(connector, core, types, interfaceEndpointHandle,
-      controlMessageHandler, controlMessageProxy, validator, timer) {
-
-  var Connector = connector.Connector;
-  var PipeControlMessageHandler =
-      controlMessageHandler.PipeControlMessageHandler;
-  var PipeControlMessageProxy = controlMessageProxy.PipeControlMessageProxy;
-  var Validator = validator.Validator;
-  var InterfaceEndpointHandle = interfaceEndpointHandle.InterfaceEndpointHandle;
-
-  /**
-   * The state of |endpoint|. If both the endpoint and its peer have been
-   * closed, removes it from |endpoints_|.
-   * @enum {string}
-   */
-  var EndpointStateUpdateType = {
-    ENDPOINT_CLOSED: 'endpoint_closed',
-    PEER_ENDPOINT_CLOSED: 'peer_endpoint_closed'
-  };
-
-  function check(condition, output) {
-    if (!condition) {
-      // testharness.js does not rethrow errors so the error stack needs to be
-      // included as a string in the error we throw for debugging layout tests.
-      throw new Error((new Error()).stack);
-    }
-  }
-
-  function InterfaceEndpoint(router, interfaceId) {
-    this.router_ = router;
-    this.id = interfaceId;
-    this.closed = false;
-    this.peerClosed = false;
-    this.handleCreated = false;
-    this.disconnectReason = null;
-    this.client = null;
-  }
-
-  InterfaceEndpoint.prototype.sendMessage = function(message) {
-    message.setInterfaceId(this.id);
-    return this.router_.connector_.accept(message);
-  };
-
-  function Router(handle, setInterfaceIdNamespaceBit) {
-    if (!core.isHandle(handle)) {
-      throw new Error("Router constructor: Not a handle");
-    }
-    if (setInterfaceIdNamespaceBit === undefined) {
-      setInterfaceIdNamespaceBit = false;
-    }
-
-    this.connector_ = new Connector(handle);
-
-    this.connector_.setIncomingReceiver({
-        accept: this.accept.bind(this),
-    });
-    this.connector_.setErrorHandler({
-        onError: this.onPipeConnectionError.bind(this),
-    });
-
-    this.setInterfaceIdNamespaceBit_ = setInterfaceIdNamespaceBit;
-    this.controlMessageHandler_ = new PipeControlMessageHandler(this);
-    this.controlMessageProxy_ = new PipeControlMessageProxy(this.connector_);
-    this.nextInterfaceIdValue = 1;
-    this.encounteredError_ = false;
-    this.endpoints_ = new Map();
-  }
-
-  Router.prototype.attachEndpointClient = function(
-      interfaceEndpointHandle, interfaceEndpointClient) {
-    check(types.isValidInterfaceId(interfaceEndpointHandle.id()));
-    check(interfaceEndpointClient);
-
-    var endpoint = this.endpoints_.get(interfaceEndpointHandle.id());
-    check(endpoint);
-    check(!endpoint.client);
-    check(!endpoint.closed);
-    endpoint.client = interfaceEndpointClient;
-
-    if (endpoint.peerClosed) {
-      timer.createOneShot(0,
-          endpoint.client.notifyError.bind(endpoint.client));
-    }
-
-    return endpoint;
-  };
-
-  Router.prototype.detachEndpointClient = function(
-      interfaceEndpointHandle) {
-    check(types.isValidInterfaceId(interfaceEndpointHandle.id()));
-    var endpoint = this.endpoints_.get(interfaceEndpointHandle.id());
-    check(endpoint);
-    check(endpoint.client);
-    check(!endpoint.closed);
-
-    endpoint.client = null;
-  };
-
-  Router.prototype.createLocalEndpointHandle = function(
-      interfaceId) {
-    if (!types.isValidInterfaceId(interfaceId)) {
-      return new InterfaceEndpointHandle();
-    }
-
-    var endpoint = this.endpoints_.get(interfaceId);
-
-    if (!endpoint) {
-      endpoint = new InterfaceEndpoint(this, interfaceId);
-      this.endpoints_.set(interfaceId, endpoint);
-
-      check(!endpoint.handleCreated);
-
-      if (this.encounteredError_) {
-        this.updateEndpointStateMayRemove(endpoint,
-            EndpointStateUpdateType.PEER_ENDPOINT_CLOSED);
-      }
-    } else {
-      // If the endpoint already exist, it is because we have received a
-      // notification that the peer endpoint has closed.
-      check(!endpoint.closed);
-      check(endpoint.peerClosed);
-
-      if (endpoint.handleCreated) {
-        return new InterfaceEndpointHandle();
-      }
-    }
-
-    endpoint.handleCreated = true;
-    return new InterfaceEndpointHandle(interfaceId, this);
-  };
-
-  Router.prototype.accept = function(message) {
-    var messageValidator = new Validator(message);
-    var err = messageValidator.validateMessageHeader();
-
-    var ok = false;
-    if (err !== validator.validationError.NONE) {
-      validator.reportValidationError(err);
-    } else if (controlMessageHandler.isPipeControlMessage(message)) {
-      ok = this.controlMessageHandler_.accept(message);
-    } else {
-      var interfaceId = message.getInterfaceId();
-      var endpoint = this.endpoints_.get(interfaceId);
-      if (!endpoint || endpoint.closed) {
-        return true;
-      }
-
-      if (!endpoint.client) {
-        // We need to wait until a client is attached in order to dispatch
-        // further messages.
-        return false;
-      }
-      ok = endpoint.client.handleIncomingMessage_(message);
-    }
-
-    if (!ok) {
-      this.handleInvalidIncomingMessage_();
-    }
-    return ok;
-  };
-
-  Router.prototype.close = function() {
-    this.connector_.close();
-    // Closing the message pipe won't trigger connection error handler.
-    // Explicitly call onPipeConnectionError() so that associated endpoints
-    // will get notified.
-    this.onPipeConnectionError();
-  };
-
-  Router.prototype.waitForNextMessageForTesting = function() {
-    this.connector_.waitForNextMessageForTesting();
-  };
-
-  Router.prototype.handleInvalidIncomingMessage_ = function(message) {
-    if (!validator.isTestingMode()) {
-      // TODO(yzshen): Consider notifying the embedder.
-      // TODO(yzshen): This should also trigger connection error handler.
-      // Consider making accept() return a boolean and let the connector deal
-      // with this, as the C++ code does.
-      this.close();
-      return;
-    }
-  };
-
-  Router.prototype.onPeerAssociatedEndpointClosed = function(interfaceId,
-      reason) {
-    check(!types.isMasterInterfaceId(interfaceId) || reason);
-
-    var endpoint = this.endpoints_.get(interfaceId);
-    if (!endpoint) {
-      endpoint = new InterfaceEndpoint(this, interfaceId);
-      this.endpoints_.set(interfaceId, endpoint);
-    }
-
-    if (reason) {
-      endpoint.disconnectReason = reason;
-    }
-
-    if (!endpoint.peerClosed) {
-      if (endpoint.client) {
-        timer.createOneShot(0,
-            endpoint.client.notifyError.bind(endpoint.client, reason));
-      }
-      this.updateEndpointStateMayRemove(endpoint,
-          EndpointStateUpdateType.PEER_ENDPOINT_CLOSED);
-    }
-    return true;
-  };
-
-  Router.prototype.onPipeConnectionError = function() {
-    this.encounteredError_ = true;
-
-    for (var endpoint of this.endpoints_.values()) {
-      if (endpoint.client) {
-        timer.createOneShot(0,
-            endpoint.client.notifyError.bind(endpoint.client,
-              endpoint.disconnectReason));
-      }
-      this.updateEndpointStateMayRemove(endpoint,
-          EndpointStateUpdateType.PEER_ENDPOINT_CLOSED);
-    }
-  };
-
-  Router.prototype.closeEndpointHandle = function(interfaceId, reason) {
-    if (!types.isValidInterfaceId(interfaceId)) {
-      return;
-    }
-    var endpoint = this.endpoints_.get(interfaceId);
-    check(endpoint);
-    check(!endpoint.client);
-    check(!endpoint.closed);
-
-    this.updateEndpointStateMayRemove(endpoint,
-        EndpointStateUpdateType.ENDPOINT_CLOSED);
-
-    if (!types.isMasterInterfaceId(interfaceId) || reason) {
-      this.controlMessageProxy_.notifyPeerEndpointClosed(interfaceId, reason);
-    }
-  };
-
-  Router.prototype.updateEndpointStateMayRemove = function(endpoint,
-      endpointStateUpdateType) {
-    if (endpointStateUpdateType === EndpointStateUpdateType.ENDPOINT_CLOSED) {
-      endpoint.closed = true;
-    } else {
-      endpoint.peerClosed = true;
-    }
-    if (endpoint.closed && endpoint.peerClosed) {
-      this.endpoints_.delete(endpoint.id);
-    }
-  };
-
-  var exports = {};
-  exports.Router = Router;
-  return exports;
-});
diff --git a/mojo/public/js/support.js b/mojo/public/js/support.js
deleted file mode 100644
index 7e27504..0000000
--- a/mojo/public/js/support.js
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Module "mojo/public/js/support"
-//
-// Note: This file is for documentation purposes only. The code here is not
-// actually executed. The real module is implemented natively in Mojo.
-
-while (1);
-
-/* @deprecated Please use watch()/cancelWatch() instead of
- *     asyncWait()/cancelWait().
- *
- * Waits on the given handle until the state indicated by |signals| is
- * satisfied.
- *
- * @param {MojoHandle} handle The handle to wait on.
- * @param {MojoHandleSignals} signals Specifies the condition to wait for.
- * @param {function (mojoResult)} callback Called with the result the wait is
- *     complete. See MojoWait for possible result codes.
- *
- * @return {MojoWaitId} A waitId that can be passed to cancelWait to cancel the
- *     wait.
- */
-function asyncWait(handle, signals, callback) { [native code] }
-
-/* @deprecated Please use watch()/cancelWatch() instead of
- *     asyncWait()/cancelWait().
- *
- * Cancels the asyncWait operation specified by the given |waitId|.
- *
- * @param {MojoWaitId} waitId The waitId returned by asyncWait.
- */
-function cancelWait(waitId) { [native code] }
-
-/* Begins watching a handle for |signals| to be satisfied or unsatisfiable.
- *
-  * @param {MojoHandle} handle The handle to watch.
-  * @param {MojoHandleSignals} signals The signals to watch.
-  * @param {function (mojoResult)} calback Called with a result any time
-  *     the watched signals become satisfied or unsatisfiable.
-  *
-  * @param {MojoWatchId} watchId An opaque identifier that identifies this
-  *     watch.
-  */
-function watch(handle, signals, callback) { [native code] }
-
-/* Cancels a handle watch initiated by watch().
- *
- * @param {MojoWatchId} watchId The watch identifier returned by watch().
- */
-function cancelWatch(watchId) { [native code] }
diff --git a/mojo/public/js/tests/core_unittest.js b/mojo/public/js/tests/core_unittest.js
deleted file mode 100644
index 86a997f..0000000
--- a/mojo/public/js/tests/core_unittest.js
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define([
-    "gin/test/expect",
-    "mojo/public/js/core",
-    "gc",
-  ], function(expect, core, gc) {
-
-  var HANDLE_SIGNAL_READWRITABLE = core.HANDLE_SIGNAL_WRITABLE |
-                                   core.HANDLE_SIGNAL_READABLE;
-  var HANDLE_SIGNAL_ALL = core.HANDLE_SIGNAL_WRITABLE |
-                          core.HANDLE_SIGNAL_READABLE |
-                          core.HANDLE_SIGNAL_PEER_CLOSED;
-
-  runWithMessagePipe(testNop);
-  runWithMessagePipe(testReadAndWriteMessage);
-  runWithMessagePipeWithOptions(testNop);
-  runWithMessagePipeWithOptions(testReadAndWriteMessage);
-  runWithDataPipe(testNop);
-  runWithDataPipe(testReadAndWriteDataPipe);
-  runWithDataPipeWithOptions(testNop);
-  runWithDataPipeWithOptions(testReadAndWriteDataPipe);
-  runWithMessagePipe(testIsHandleMessagePipe);
-  runWithDataPipe(testIsHandleDataPipe);
-  runWithSharedBuffer(testSharedBuffer);
-  gc.collectGarbage();  // should not crash
-  this.result = "PASS";
-
-  function runWithMessagePipe(test) {
-    var pipe = core.createMessagePipe();
-    expect(pipe.result).toBe(core.RESULT_OK);
-
-    test(pipe);
-
-    expect(core.close(pipe.handle0)).toBe(core.RESULT_OK);
-    expect(core.close(pipe.handle1)).toBe(core.RESULT_OK);
-  }
-
-  function runWithMessagePipeWithOptions(test) {
-    var pipe = core.createMessagePipe({
-        flags: core.CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE
-    });
-    expect(pipe.result).toBe(core.RESULT_OK);
-
-    test(pipe);
-
-    expect(core.close(pipe.handle0)).toBe(core.RESULT_OK);
-    expect(core.close(pipe.handle1)).toBe(core.RESULT_OK);
-  }
-
-  function runWithDataPipe(test) {
-    var pipe = core.createDataPipe();
-    expect(pipe.result).toBe(core.RESULT_OK);
-
-    test(pipe);
-
-    expect(core.close(pipe.producerHandle)).toBe(core.RESULT_OK);
-    expect(core.close(pipe.consumerHandle)).toBe(core.RESULT_OK);
-  }
-
-  function runWithDataPipeWithOptions(test) {
-    var pipe = core.createDataPipe({
-        flags: core.CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,
-        elementNumBytes: 1,
-        capacityNumBytes: 64
-        });
-    expect(pipe.result).toBe(core.RESULT_OK);
-
-    test(pipe);
-
-    expect(core.close(pipe.producerHandle)).toBe(core.RESULT_OK);
-    expect(core.close(pipe.consumerHandle)).toBe(core.RESULT_OK);
-  }
-
-  function runWithSharedBuffer(test) {
-    let buffer_size = 32;
-    let sharedBuffer = core.createSharedBuffer(buffer_size,
-        core.CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE);
-
-    expect(sharedBuffer.result).toBe(core.RESULT_OK);
-    expect(core.isHandle(sharedBuffer.handle)).toBeTruthy();
-
-    test(sharedBuffer, buffer_size);
-  }
-
-  function testNop(pipe) {
-  }
-
-  function testReadAndWriteMessage(pipe) {
-    var state0 = core.queryHandleSignalsState(pipe.handle0);
-    expect(state0.result).toBe(core.RESULT_OK);
-    expect(state0.satisfiedSignals).toBe(core.HANDLE_SIGNAL_WRITABLE);
-    expect(state0.satisfiableSignals).toBe(HANDLE_SIGNAL_ALL);
-
-    var state1 = core.queryHandleSignalsState(pipe.handle1);
-    expect(state1.result).toBe(core.RESULT_OK);
-    expect(state1.satisfiedSignals).toBe(core.HANDLE_SIGNAL_WRITABLE);
-    expect(state1.satisfiableSignals).toBe(HANDLE_SIGNAL_ALL);
-
-    var senderData = new Uint8Array(42);
-    for (var i = 0; i < senderData.length; ++i) {
-      senderData[i] = i * i;
-    }
-
-    var result = core.writeMessage(
-      pipe.handle0, senderData, [],
-      core.WRITE_MESSAGE_FLAG_NONE);
-
-    expect(result).toBe(core.RESULT_OK);
-
-    state0 = core.queryHandleSignalsState(pipe.handle0);
-    expect(state0.result).toBe(core.RESULT_OK);
-    expect(state0.satisfiedSignals).toBe(core.HANDLE_SIGNAL_WRITABLE);
-    expect(state0.satisfiableSignals).toBe(HANDLE_SIGNAL_ALL);
-
-    var wait = core.wait(pipe.handle1, core.HANDLE_SIGNAL_READABLE);
-    expect(wait.result).toBe(core.RESULT_OK);
-    expect(wait.signalsState.satisfiedSignals).toBe(HANDLE_SIGNAL_READWRITABLE);
-    expect(wait.signalsState.satisfiableSignals).toBe(HANDLE_SIGNAL_ALL);
-
-    var read = core.readMessage(pipe.handle1, core.READ_MESSAGE_FLAG_NONE);
-
-    expect(read.result).toBe(core.RESULT_OK);
-    expect(read.buffer.byteLength).toBe(42);
-    expect(read.handles.length).toBe(0);
-
-    var memory = new Uint8Array(read.buffer);
-    for (var i = 0; i < memory.length; ++i)
-      expect(memory[i]).toBe((i * i) & 0xFF);
-  }
-
-  function testReadAndWriteDataPipe(pipe) {
-    var senderData = new Uint8Array(42);
-    for (var i = 0; i < senderData.length; ++i) {
-      senderData[i] = i * i;
-    }
-
-    var write = core.writeData(
-      pipe.producerHandle, senderData,
-      core.WRITE_DATA_FLAG_ALL_OR_NONE);
-
-    expect(write.result).toBe(core.RESULT_OK);
-    expect(write.numBytes).toBe(42);
-
-    var wait = core.wait(pipe.consumerHandle, core.HANDLE_SIGNAL_READABLE);
-    expect(wait.result).toBe(core.RESULT_OK);
-    var peeked = core.readData(
-         pipe.consumerHandle,
-         core.READ_DATA_FLAG_PEEK | core.READ_DATA_FLAG_ALL_OR_NONE);
-    expect(peeked.result).toBe(core.RESULT_OK);
-    expect(peeked.buffer.byteLength).toBe(42);
-
-    var peeked_memory = new Uint8Array(peeked.buffer);
-    for (var i = 0; i < peeked_memory.length; ++i)
-      expect(peeked_memory[i]).toBe((i * i) & 0xFF);
-
-    var read = core.readData(
-      pipe.consumerHandle, core.READ_DATA_FLAG_ALL_OR_NONE);
-
-    expect(read.result).toBe(core.RESULT_OK);
-    expect(read.buffer.byteLength).toBe(42);
-
-    var memory = new Uint8Array(read.buffer);
-    for (var i = 0; i < memory.length; ++i)
-      expect(memory[i]).toBe((i * i) & 0xFF);
-  }
-
-  function testIsHandleMessagePipe(pipe) {
-    expect(core.isHandle(123).toBeFalsy);
-    expect(core.isHandle("123").toBeFalsy);
-    expect(core.isHandle({}).toBeFalsy);
-    expect(core.isHandle([]).toBeFalsy);
-    expect(core.isHandle(undefined).toBeFalsy);
-    expect(core.isHandle(pipe).toBeFalsy);
-    expect(core.isHandle(pipe.handle0)).toBeTruthy();
-    expect(core.isHandle(pipe.handle1)).toBeTruthy();
-    expect(core.isHandle(null)).toBeTruthy();
-  }
-
-  function testIsHandleDataPipe(pipe) {
-    expect(core.isHandle(pipe.consumerHandle)).toBeTruthy();
-    expect(core.isHandle(pipe.producerHandle)).toBeTruthy();
-  }
-
-  function testSharedBuffer(sharedBuffer, buffer_size) {
-    let offset = 0;
-    let mappedBuffer0 = core.mapBuffer(sharedBuffer.handle,
-                                       offset,
-                                       buffer_size,
-                                       core.MAP_BUFFER_FLAG_NONE);
-
-    expect(mappedBuffer0.result).toBe(core.RESULT_OK);
-
-    let dupedBufferHandle = core.duplicateBufferHandle(sharedBuffer.handle,
-        core.DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE);
-
-    expect(dupedBufferHandle.result).toBe(core.RESULT_OK);
-    expect(core.isHandle(dupedBufferHandle.handle)).toBeTruthy();
-
-    let mappedBuffer1 = core.mapBuffer(dupedBufferHandle.handle,
-                                       offset,
-                                       buffer_size,
-                                       core.MAP_BUFFER_FLAG_NONE);
-
-    expect(mappedBuffer1.result).toBe(core.RESULT_OK);
-
-    let buffer0 = new Uint8Array(mappedBuffer0.buffer);
-    let buffer1 = new Uint8Array(mappedBuffer1.buffer);
-    for(let i = 0; i < buffer0.length; ++i) {
-      buffer0[i] = i;
-      expect(buffer1[i]).toBe(i);
-    }
-
-    expect(core.unmapBuffer(mappedBuffer0.buffer)).toBe(core.RESULT_OK);
-    expect(core.unmapBuffer(mappedBuffer1.buffer)).toBe(core.RESULT_OK);
-
-    expect(core.close(dupedBufferHandle.handle)).toBe(core.RESULT_OK);
-    expect(core.close(sharedBuffer.handle)).toBe(core.RESULT_OK);
-  }
-
-});
diff --git a/mojo/public/js/tests/validation_test_input_parser.js b/mojo/public/js/tests/validation_test_input_parser.js
deleted file mode 100644
index f5a57f9..0000000
--- a/mojo/public/js/tests/validation_test_input_parser.js
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Support for parsing binary sequences encoded as readable strings
-// or ".data" files. The input format is described here:
-// mojo/public/cpp/bindings/tests/validation_test_input_parser.h
-
-define([
-    "mojo/public/js/buffer"
-  ], function(buffer) {
-
-  // Files and Lines represent the raw text from an input string
-  // or ".data" file.
-
-  function InputError(message, line) {
-    this.message = message;
-    this.line = line;
-  }
-
-  InputError.prototype.toString = function() {
-    var s = 'Error: ' + this.message;
-    if (this.line)
-      s += ', at line ' +
-           (this.line.number + 1) + ': "' + this.line.contents + '"';
-    return s;
-  }
-
-  function File(contents) {
-    this.contents = contents;
-    this.index = 0;
-    this.lineNumber = 0;
-  }
-
-  File.prototype.endReached = function() {
-    return this.index >= this.contents.length;
-  }
-
-  File.prototype.nextLine = function() {
-    if (this.endReached())
-      return null;
-    var start = this.index;
-    var end = this.contents.indexOf('\n', start);
-    if (end == -1)
-      end = this.contents.length;
-    this.index = end + 1;
-    return new Line(this.contents.substring(start, end), this.lineNumber++);
-  }
-
-  function Line(contents, number) {
-    var i = contents.indexOf('//');
-    var s = (i == -1) ? contents.trim() : contents.substring(0, i).trim();
-    this.contents = contents;
-    this.items = (s.length > 0) ? s.split(/\s+/) : [];
-    this.index = 0;
-    this.number = number;
-  }
-
-  Line.prototype.endReached = function() {
-    return this.index >= this.items.length;
-  }
-
-  var ITEM_TYPE_SIZES = {
-    u1: 1, u2: 2, u4: 4, u8: 8, s1: 1, s2: 2, s4: 4, s8: 8, b: 1, f: 4, d: 8,
-    dist4: 4, dist8: 8, anchr: 0, handles: 0
-  };
-
-  function isValidItemType(type) {
-    return ITEM_TYPE_SIZES[type] !== undefined;
-  }
-
-  Line.prototype.nextItem = function() {
-    if (this.endReached())
-      return null;
-
-    var itemString = this.items[this.index++];
-    var type = 'u1';
-    var value = itemString;
-
-    if (itemString.charAt(0) == '[') {
-      var i = itemString.indexOf(']');
-      if (i != -1 && i + 1 < itemString.length) {
-        type = itemString.substring(1, i);
-        value = itemString.substring(i + 1);
-      } else {
-        throw new InputError('invalid item', this);
-      }
-    }
-    if (!isValidItemType(type))
-      throw new InputError('invalid item type', this);
-
-    return new Item(this, type, value);
-  }
-
-  // The text for each whitespace delimited binary data "item" is represented
-  // by an Item.
-
-  function Item(line, type, value) {
-    this.line = line;
-    this.type = type;
-    this.value = value;
-    this.size = ITEM_TYPE_SIZES[type];
-  }
-
-  Item.prototype.isFloat = function() {
-    return this.type == 'f' || this.type == 'd';
-  }
-
-  Item.prototype.isInteger = function() {
-    return ['u1', 'u2', 'u4', 'u8',
-            's1', 's2', 's4', 's8'].indexOf(this.type) != -1;
-  }
-
-  Item.prototype.isNumber = function() {
-    return this.isFloat() || this.isInteger();
-  }
-
-  Item.prototype.isByte = function() {
-    return this.type == 'b';
-  }
-
-  Item.prototype.isDistance = function() {
-    return this.type == 'dist4' || this.type == 'dist8';
-  }
-
-  Item.prototype.isAnchor = function() {
-    return this.type == 'anchr';
-  }
-
-  Item.prototype.isHandles = function() {
-    return this.type == 'handles';
-  }
-
-  // A TestMessage represents the complete binary message loaded from an input
-  // string or ".data" file. The parseTestMessage() function below constructs
-  // a TestMessage from a File.
-
-  function TestMessage(byteLength) {
-    this.index = 0;
-    this.buffer = new buffer.Buffer(byteLength);
-    this.distances = {};
-    this.handleCount = 0;
-  }
-
-  function checkItemNumberValue(item, n, min, max) {
-    if (n < min || n > max)
-      throw new InputError('invalid item value', item.line);
-  }
-
-  TestMessage.prototype.addNumber = function(item) {
-    var n = item.isInteger() ? parseInt(item.value) : parseFloat(item.value);
-    if (Number.isNaN(n))
-      throw new InputError("can't parse item value", item.line);
-
-    switch(item.type) {
-      case 'u1':
-        checkItemNumberValue(item, n, 0, 0xFF);
-        this.buffer.setUint8(this.index, n);
-        break;
-      case 'u2':
-        checkItemNumberValue(item, n, 0, 0xFFFF);
-        this.buffer.setUint16(this.index, n);
-        break;
-      case 'u4':
-        checkItemNumberValue(item, n, 0, 0xFFFFFFFF);
-        this.buffer.setUint32(this.index, n);
-        break;
-      case 'u8':
-        checkItemNumberValue(item, n, 0, Number.MAX_SAFE_INTEGER);
-        this.buffer.setUint64(this.index, n);
-        break;
-      case 's1':
-        checkItemNumberValue(item, n, -128, 127);
-        this.buffer.setInt8(this.index, n);
-        break;
-      case 's2':
-        checkItemNumberValue(item, n, -32768, 32767);
-        this.buffer.setInt16(this.index, n);
-        break;
-      case 's4':
-        checkItemNumberValue(item, n, -2147483648, 2147483647);
-        this.buffer.setInt32(this.index, n);
-        break;
-      case 's8':
-        checkItemNumberValue(item, n,
-                             Number.MIN_SAFE_INTEGER,
-                             Number.MAX_SAFE_INTEGER);
-        this.buffer.setInt64(this.index, n);
-        break;
-      case 'f':
-        this.buffer.setFloat32(this.index, n);
-        break;
-      case 'd':
-        this.buffer.setFloat64(this.index, n);
-        break;
-
-      default:
-        throw new InputError('unrecognized item type', item.line);
-      }
-  }
-
-  TestMessage.prototype.addByte = function(item) {
-    if (!/^[01]{8}$/.test(item.value))
-      throw new InputError('invalid byte item value', item.line);
-    function b(i) {
-      return (item.value.charAt(7 - i) == '1') ? 1 << i : 0;
-    }
-    var n = b(0) | b(1) | b(2) | b(3) | b(4) | b(5) | b(6) | b(7);
-    this.buffer.setUint8(this.index, n);
-  }
-
-  TestMessage.prototype.addDistance = function(item) {
-    if (this.distances[item.value])
-      throw new InputError('duplicate distance item', item.line);
-    this.distances[item.value] = {index: this.index, item: item};
-  }
-
-  TestMessage.prototype.addAnchor = function(item) {
-    var dist = this.distances[item.value];
-    if (!dist)
-      throw new InputError('unmatched anchor item', item.line);
-    delete this.distances[item.value];
-
-    var n = this.index - dist.index;
-    // TODO(hansmuller): validate n
-
-    if (dist.item.type == 'dist4')
-      this.buffer.setUint32(dist.index, n);
-    else if (dist.item.type == 'dist8')
-      this.buffer.setUint64(dist.index, n);
-    else
-      throw new InputError('unrecognzed distance item type', dist.item.line);
-  }
-
-  TestMessage.prototype.addHandles = function(item) {
-    this.handleCount = parseInt(item.value);
-    if (Number.isNaN(this.handleCount))
-      throw new InputError("can't parse handleCount", item.line);
-  }
-
-  TestMessage.prototype.addItem = function(item) {
-    if (item.isNumber())
-      this.addNumber(item);
-    else if (item.isByte())
-      this.addByte(item);
-    else if (item.isDistance())
-      this.addDistance(item);
-    else if (item.isAnchor())
-      this.addAnchor(item);
-    else if (item.isHandles())
-      this.addHandles(item);
-    else
-      throw new InputError('unrecognized item type', item.line);
-
-    this.index += item.size;
-  }
-
-  TestMessage.prototype.unanchoredDistances = function() {
-    var names = null;
-    for (var name in this.distances) {
-      if (this.distances.hasOwnProperty(name))
-        names = (names === null) ? name : names + ' ' + name;
-    }
-    return names;
-  }
-
-  function parseTestMessage(text) {
-    var file = new File(text);
-    var items = [];
-    var messageLength = 0;
-    while(!file.endReached()) {
-      var line = file.nextLine();
-      while (!line.endReached()) {
-        var item = line.nextItem();
-        if (item.isHandles() && items.length > 0)
-          throw new InputError('handles item is not first');
-        messageLength += item.size;
-        items.push(item);
-      }
-    }
-
-    var msg = new TestMessage(messageLength);
-    for (var i = 0; i < items.length; i++)
-      msg.addItem(items[i]);
-
-    if (messageLength != msg.index)
-      throw new InputError('failed to compute message length');
-    var names = msg.unanchoredDistances();
-    if (names)
-      throw new InputError('no anchors for ' + names, 0);
-
-    return msg;
-  }
-
-  var exports = {};
-  exports.parseTestMessage = parseTestMessage;
-  exports.InputError = InputError;
-  return exports;
-});
diff --git a/mojo/public/js/tests/validation_unittest.js b/mojo/public/js/tests/validation_unittest.js
deleted file mode 100644
index 2a07315..0000000
--- a/mojo/public/js/tests/validation_unittest.js
+++ /dev/null
@@ -1,334 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define([
-    "console",
-    "file",
-    "gin/test/expect",
-    "mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom",
-    "mojo/public/js/bindings",
-    "mojo/public/js/buffer",
-    "mojo/public/js/codec",
-    "mojo/public/js/core",
-    "mojo/public/js/tests/validation_test_input_parser",
-    "mojo/public/js/validator",
-], function(console,
-            file,
-            expect,
-            testInterface,
-            bindings,
-            buffer,
-            codec,
-            core,
-            parser,
-            validator) {
-
-  var noError = validator.validationError.NONE;
-
-  function checkTestMessageParser() {
-    function TestMessageParserFailure(message, input) {
-      this.message = message;
-      this.input = input;
-    }
-
-    TestMessageParserFailure.prototype.toString = function() {
-      return 'Error: ' + this.message + ' for "' + this.input + '"';
-    };
-
-    function checkData(data, expectedData, input) {
-      if (data.byteLength != expectedData.byteLength) {
-        var s = "message length (" + data.byteLength + ") doesn't match " +
-            "expected length: " + expectedData.byteLength;
-        throw new TestMessageParserFailure(s, input);
-      }
-
-      for (var i = 0; i < data.byteLength; i++) {
-        if (data.getUint8(i) != expectedData.getUint8(i)) {
-          var s = 'message data mismatch at byte offset ' + i;
-          throw new TestMessageParserFailure(s, input);
-        }
-      }
-    }
-
-    function testFloatItems() {
-      var input = '[f]+.3e9 [d]-10.03';
-      var msg = parser.parseTestMessage(input);
-      var expectedData = new buffer.Buffer(12);
-      expectedData.setFloat32(0, +.3e9);
-      expectedData.setFloat64(4, -10.03);
-      checkData(msg.buffer, expectedData, input);
-    }
-
-    function testUnsignedIntegerItems() {
-      var input = '[u1]0x10// hello world !! \n\r  \t [u2]65535 \n' +
-          '[u4]65536 [u8]0xFFFFFFFFFFFFF 0 0Xff';
-      var msg = parser.parseTestMessage(input);
-      var expectedData = new buffer.Buffer(17);
-      expectedData.setUint8(0, 0x10);
-      expectedData.setUint16(1, 65535);
-      expectedData.setUint32(3, 65536);
-      expectedData.setUint64(7, 0xFFFFFFFFFFFFF);
-      expectedData.setUint8(15, 0);
-      expectedData.setUint8(16, 0xff);
-      checkData(msg.buffer, expectedData, input);
-    }
-
-    function testSignedIntegerItems() {
-      var input = '[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40';
-      var msg = parser.parseTestMessage(input);
-      var expectedData = new buffer.Buffer(15);
-      expectedData.setInt64(0, -0x800);
-      expectedData.setInt8(8, -128);
-      expectedData.setInt16(9, 0);
-      expectedData.setInt32(11, -40);
-      checkData(msg.buffer, expectedData, input);
-    }
-
-    function testByteItems() {
-      var input = '[b]00001011 [b]10000000  // hello world\n [b]00000000';
-      var msg = parser.parseTestMessage(input);
-      var expectedData = new buffer.Buffer(3);
-      expectedData.setUint8(0, 11);
-      expectedData.setUint8(1, 128);
-      expectedData.setUint8(2, 0);
-      checkData(msg.buffer, expectedData, input);
-    }
-
-    function testAnchors() {
-      var input = '[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar';
-      var msg = parser.parseTestMessage(input);
-      var expectedData = new buffer.Buffer(14);
-      expectedData.setUint32(0, 14);
-      expectedData.setUint8(4, 0);
-      expectedData.setUint64(5, 9);
-      expectedData.setUint8(13, 0);
-      checkData(msg.buffer, expectedData, input);
-    }
-
-    function testHandles() {
-      var input = '// This message has handles! \n[handles]50 [u8]2';
-      var msg = parser.parseTestMessage(input);
-      var expectedData = new buffer.Buffer(8);
-      expectedData.setUint64(0, 2);
-
-      if (msg.handleCount != 50) {
-        var s = 'wrong handle count (' + msg.handleCount + ')';
-        throw new TestMessageParserFailure(s, input);
-      }
-      checkData(msg.buffer, expectedData, input);
-    }
-
-    function testEmptyInput() {
-      var msg = parser.parseTestMessage('');
-      if (msg.buffer.byteLength != 0)
-        throw new TestMessageParserFailure('expected empty message', '');
-    }
-
-    function testBlankInput() {
-      var input = '    \t  // hello world \n\r \t// the answer is 42   ';
-      var msg = parser.parseTestMessage(input);
-      if (msg.buffer.byteLength != 0)
-        throw new TestMessageParserFailure('expected empty message', input);
-    }
-
-    function testInvalidInput() {
-      function parserShouldFail(input) {
-        try {
-          parser.parseTestMessage(input);
-        } catch (e) {
-          if (e instanceof parser.InputError)
-            return;
-          throw new TestMessageParserFailure(
-            'unexpected exception ' + e.toString(), input);
-        }
-        throw new TestMessageParserFailure("didn't detect invalid input", file);
-      }
-
-      ['/ hello world',
-       '[u1]x',
-       '[u2]-1000',
-       '[u1]0x100',
-       '[s2]-0x8001',
-       '[b]1',
-       '[b]1111111k',
-       '[dist4]unmatched',
-       '[anchr]hello [dist8]hello',
-       '[dist4]a [dist4]a [anchr]a',
-       // '[dist4]a [anchr]a [dist4]a [anchr]a',
-       '0 [handles]50'
-      ].forEach(parserShouldFail);
-    }
-
-    try {
-      testFloatItems();
-      testUnsignedIntegerItems();
-      testSignedIntegerItems();
-      testByteItems();
-      testInvalidInput();
-      testEmptyInput();
-      testBlankInput();
-      testHandles();
-      testAnchors();
-    } catch (e) {
-      return e.toString();
-    }
-    return null;
-  }
-
-  function getMessageTestFiles(prefix) {
-    var sourceRoot = file.getSourceRootDirectory();
-    expect(sourceRoot).not.toBeNull();
-
-    var testDir = sourceRoot +
-      "/mojo/public/interfaces/bindings/tests/data/validation/";
-    var testFiles = file.getFilesInDirectory(testDir);
-    expect(testFiles).not.toBeNull();
-    expect(testFiles.length).toBeGreaterThan(0);
-
-    // The matching ".data" pathnames with the extension removed.
-    return testFiles.filter(function(s) {
-      return s.substr(-5) == ".data" && s.indexOf(prefix) == 0;
-    }).map(function(s) {
-      return testDir + s.slice(0, -5);
-    });
-  }
-
-  function readTestMessage(filename) {
-    var contents = file.readFileToString(filename + ".data");
-    expect(contents).not.toBeNull();
-    return parser.parseTestMessage(contents);
-  }
-
-  function readTestExpected(filename) {
-    var contents = file.readFileToString(filename + ".expected");
-    expect(contents).not.toBeNull();
-    return contents.trim();
-  }
-
-  function checkValidationResult(testFile, err) {
-    var actualResult = (err === noError) ? "PASS" : err;
-    var expectedResult = readTestExpected(testFile);
-    if (actualResult != expectedResult)
-      console.log("[Test message validation failed: " + testFile + " ]");
-    expect(actualResult).toEqual(expectedResult);
-  }
-
-  function testMessageValidation(prefix, filters) {
-    var testFiles = getMessageTestFiles(prefix);
-    expect(testFiles.length).toBeGreaterThan(0);
-
-    for (var i = 0; i < testFiles.length; i++) {
-      // TODO(hansmuller) Temporarily skipping array pointer overflow tests
-      // because JS numbers are limited to 53 bits.
-      // TODO(rudominer): Temporarily skipping 'no-such-method',
-      // 'invalid_request_flags', and 'invalid_response_flags' until additional
-      // logic in *RequestValidator and *ResponseValidator is ported from
-      // cpp to js.
-      // TODO(crbug/640298): Implement max recursion depth for JS.
-      // TODO(crbug/628104): Support struct map keys for JS.
-      if (testFiles[i].indexOf("overflow") != -1 ||
-          testFiles[i].indexOf("conformance_mthd19") != -1 ||
-          testFiles[i].indexOf("conformance_mthd20") != -1 ||
-          testFiles[i].indexOf("no_such_method") != -1 ||
-          testFiles[i].indexOf("invalid_request_flags") != -1 ||
-          testFiles[i].indexOf("invalid_response_flags") != -1) {
-        console.log("[Skipping " + testFiles[i] + "]");
-        continue;
-      }
-
-      var testMessage = readTestMessage(testFiles[i]);
-      var handles = new Array(testMessage.handleCount);
-      var message = new codec.Message(testMessage.buffer, handles);
-      var messageValidator = new validator.Validator(message);
-
-      var err = messageValidator.validateMessageHeader();
-      for (var j = 0; err === noError && j < filters.length; ++j)
-        err = filters[j](messageValidator);
-
-      checkValidationResult(testFiles[i], err);
-    }
-  }
-
-  function testConformanceMessageValidation() {
-    testMessageValidation("conformance_", [
-        testInterface.ConformanceTestInterface.validateRequest]);
-  }
-
-  function testBoundsCheckMessageValidation() {
-    testMessageValidation("boundscheck_", [
-        testInterface.BoundsCheckTestInterface.validateRequest]);
-  }
-
-  function testResponseConformanceMessageValidation() {
-    testMessageValidation("resp_conformance_", [
-        testInterface.ConformanceTestInterface.validateResponse]);
-  }
-
-  function testResponseBoundsCheckMessageValidation() {
-    testMessageValidation("resp_boundscheck_", [
-        testInterface.BoundsCheckTestInterface.validateResponse]);
-  }
-
-  function testIntegratedMessageValidation(testFilesPattern, endpoint) {
-    var testFiles = getMessageTestFiles(testFilesPattern);
-    expect(testFiles.length).toBeGreaterThan(0);
-
-    var testMessagePipe = core.createMessagePipe();
-    expect(testMessagePipe.result).toBe(core.RESULT_OK);
-
-    endpoint.bind(testMessagePipe.handle1);
-    var observer = validator.ValidationErrorObserverForTesting.getInstance();
-
-    for (var i = 0; i < testFiles.length; i++) {
-      var testMessage = readTestMessage(testFiles[i]);
-      var handles = new Array(testMessage.handleCount);
-
-      var writeMessageValue = core.writeMessage(
-          testMessagePipe.handle0,
-          new Uint8Array(testMessage.buffer.arrayBuffer),
-          new Array(testMessage.handleCount),
-          core.WRITE_MESSAGE_FLAG_NONE);
-      expect(writeMessageValue).toBe(core.RESULT_OK);
-
-      endpoint.waitForNextMessageForTesting();
-      checkValidationResult(testFiles[i], observer.lastError);
-      observer.reset();
-    }
-
-    expect(core.close(testMessagePipe.handle0)).toBe(core.RESULT_OK);
-  }
-
-  function testIntegratedMessageHeaderValidation() {
-    testIntegratedMessageValidation(
-        "integration_msghdr",
-        new bindings.Binding(testInterface.IntegrationTestInterface, {}));
-    testIntegratedMessageValidation(
-        "integration_msghdr",
-        new testInterface.IntegrationTestInterfacePtr().ptr);
-  }
-
-  function testIntegratedRequestMessageValidation() {
-    testIntegratedMessageValidation(
-        "integration_intf_rqst",
-        new bindings.Binding(testInterface.IntegrationTestInterface, {}));
-  }
-
-  function testIntegratedResponseMessageValidation() {
-    testIntegratedMessageValidation(
-        "integration_intf_resp",
-        new testInterface.IntegrationTestInterfacePtr().ptr);
-  }
-
-  expect(checkTestMessageParser()).toBeNull();
-  testConformanceMessageValidation();
-  testBoundsCheckMessageValidation();
-  testResponseConformanceMessageValidation();
-  testResponseBoundsCheckMessageValidation();
-  testIntegratedMessageHeaderValidation();
-  testIntegratedResponseMessageValidation();
-  testIntegratedRequestMessageValidation();
-  validator.clearTestingMode();
-
-  this.result = "PASS";
-});
diff --git a/mojo/public/js/threading.js b/mojo/public/js/threading.js
deleted file mode 100644
index 49ab5c9..0000000
--- a/mojo/public/js/threading.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Module "mojo/public/js/threading"
-//
-// Note: This file is for documentation purposes only. The code here is not
-// actually executed. The real module is implemented natively in Mojo.
-//
-// This module provides a way for a Service implemented in JS
-// to exit by quitting the current message loop. This module is not
-// intended to be used by Mojo JS application started by the JS
-// content handler.
-
-while (1);
-
-/**
- * Quits the current message loop, esssentially:
- * base::MessageLoop::current()->QuitNow();
-*/
-function quit() { [native code] }
diff --git a/mojo/public/js/unicode.js b/mojo/public/js/unicode.js
deleted file mode 100644
index be2ba0e..0000000
--- a/mojo/public/js/unicode.js
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * Defines functions for translating between JavaScript strings and UTF8 strings
- * stored in ArrayBuffers. There is much room for optimization in this code if
- * it proves necessary.
- */
-define("mojo/public/js/unicode", function() {
-  /**
-   * Decodes the UTF8 string from the given buffer.
-   * @param {ArrayBufferView} buffer The buffer containing UTF8 string data.
-   * @return {string} The corresponding JavaScript string.
-   */
-  function decodeUtf8String(buffer) {
-    return decodeURIComponent(escape(String.fromCharCode.apply(null, buffer)));
-  }
-
-  /**
-   * Encodes the given JavaScript string into UTF8.
-   * @param {string} str The string to encode.
-   * @param {ArrayBufferView} outputBuffer The buffer to contain the result.
-   * Should be pre-allocated to hold enough space. Use |utf8Length| to determine
-   * how much space is required.
-   * @return {number} The number of bytes written to |outputBuffer|.
-   */
-  function encodeUtf8String(str, outputBuffer) {
-    var utf8String = unescape(encodeURIComponent(str));
-    if (outputBuffer.length < utf8String.length)
-      throw new Error("Buffer too small for encodeUtf8String");
-    for (var i = 0; i < outputBuffer.length && i < utf8String.length; i++)
-      outputBuffer[i] = utf8String.charCodeAt(i);
-    return i;
-  }
-
-  /**
-   * Returns the number of bytes that a UTF8 encoding of the JavaScript string
-   * |str| would occupy.
-   */
-  function utf8Length(str) {
-    var utf8String = unescape(encodeURIComponent(str));
-    return utf8String.length;
-  }
-
-  var exports = {};
-  exports.decodeUtf8String = decodeUtf8String;
-  exports.encodeUtf8String = encodeUtf8String;
-  exports.utf8Length = utf8Length;
-  return exports;
-});
diff --git a/mojo/public/js/validator.js b/mojo/public/js/validator.js
deleted file mode 100644
index 283546d..0000000
--- a/mojo/public/js/validator.js
+++ /dev/null
@@ -1,560 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/validator", [
-  "mojo/public/js/codec",
-], function(codec) {
-
-  var validationError = {
-    NONE: 'VALIDATION_ERROR_NONE',
-    MISALIGNED_OBJECT: 'VALIDATION_ERROR_MISALIGNED_OBJECT',
-    ILLEGAL_MEMORY_RANGE: 'VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE',
-    UNEXPECTED_STRUCT_HEADER: 'VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER',
-    UNEXPECTED_ARRAY_HEADER: 'VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER',
-    ILLEGAL_HANDLE: 'VALIDATION_ERROR_ILLEGAL_HANDLE',
-    UNEXPECTED_INVALID_HANDLE: 'VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE',
-    ILLEGAL_POINTER: 'VALIDATION_ERROR_ILLEGAL_POINTER',
-    UNEXPECTED_NULL_POINTER: 'VALIDATION_ERROR_UNEXPECTED_NULL_POINTER',
-    MESSAGE_HEADER_INVALID_FLAGS:
-        'VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS',
-    MESSAGE_HEADER_MISSING_REQUEST_ID:
-        'VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID',
-    DIFFERENT_SIZED_ARRAYS_IN_MAP:
-        'VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP',
-    INVALID_UNION_SIZE: 'VALIDATION_ERROR_INVALID_UNION_SIZE',
-    UNEXPECTED_NULL_UNION: 'VALIDATION_ERROR_UNEXPECTED_NULL_UNION',
-    UNKNOWN_ENUM_VALUE: 'VALIDATION_ERROR_UNKNOWN_ENUM_VALUE',
-  };
-
-  var NULL_MOJO_POINTER = "NULL_MOJO_POINTER";
-  var gValidationErrorObserver = null;
-
-  function reportValidationError(error) {
-    if (gValidationErrorObserver) {
-      gValidationErrorObserver.setLastError(error);
-    }
-  }
-
-  var ValidationErrorObserverForTesting = (function() {
-    function Observer() {
-      this.lastError = validationError.NONE;
-      this.callback = null;
-    }
-
-    Observer.prototype.setLastError = function(error) {
-      this.lastError = error;
-      if (this.callback) {
-        this.callback(error);
-      }
-    };
-
-    Observer.prototype.reset = function(error) {
-      this.lastError = validationError.NONE;
-      this.callback = null;
-    };
-
-    return {
-      getInstance: function() {
-        if (!gValidationErrorObserver) {
-          gValidationErrorObserver = new Observer();
-        }
-        return gValidationErrorObserver;
-      }
-    };
-  })();
-
-  function isTestingMode() {
-    return Boolean(gValidationErrorObserver);
-  }
-
-  function clearTestingMode() {
-    gValidationErrorObserver = null;
-  }
-
-  function isEnumClass(cls) {
-    return cls instanceof codec.Enum;
-  }
-
-  function isStringClass(cls) {
-    return cls === codec.String || cls === codec.NullableString;
-  }
-
-  function isHandleClass(cls) {
-    return cls === codec.Handle || cls === codec.NullableHandle;
-  }
-
-  function isInterfaceClass(cls) {
-    return cls instanceof codec.Interface;
-  }
-
-  function isInterfaceRequestClass(cls) {
-    return cls === codec.InterfaceRequest ||
-        cls === codec.NullableInterfaceRequest;
-  }
-
-  function isNullable(type) {
-    return type === codec.NullableString || type === codec.NullableHandle ||
-        type === codec.NullableInterface ||
-        type === codec.NullableInterfaceRequest ||
-        type instanceof codec.NullableArrayOf ||
-        type instanceof codec.NullablePointerTo;
-  }
-
-  function Validator(message) {
-    this.message = message;
-    this.offset = 0;
-    this.handleIndex = 0;
-  }
-
-  Object.defineProperty(Validator.prototype, "offsetLimit", {
-    get: function() { return this.message.buffer.byteLength; }
-  });
-
-  Object.defineProperty(Validator.prototype, "handleIndexLimit", {
-    get: function() { return this.message.handles.length; }
-  });
-
-  // True if we can safely allocate a block of bytes from start to
-  // to start + numBytes.
-  Validator.prototype.isValidRange = function(start, numBytes) {
-    // Only positive JavaScript integers that are less than 2^53
-    // (Number.MAX_SAFE_INTEGER) can be represented exactly.
-    if (start < this.offset || numBytes <= 0 ||
-        !Number.isSafeInteger(start) ||
-        !Number.isSafeInteger(numBytes))
-      return false;
-
-    var newOffset = start + numBytes;
-    if (!Number.isSafeInteger(newOffset) || newOffset > this.offsetLimit)
-      return false;
-
-    return true;
-  };
-
-  Validator.prototype.claimRange = function(start, numBytes) {
-    if (this.isValidRange(start, numBytes)) {
-      this.offset = start + numBytes;
-      return true;
-    }
-    return false;
-  };
-
-  Validator.prototype.claimHandle = function(index) {
-    if (index === codec.kEncodedInvalidHandleValue)
-      return true;
-
-    if (index < this.handleIndex || index >= this.handleIndexLimit)
-      return false;
-
-    // This is safe because handle indices are uint32.
-    this.handleIndex = index + 1;
-    return true;
-  };
-
-  Validator.prototype.validateEnum = function(offset, enumClass) {
-    // Note: Assumes that enums are always 32 bits! But this matches
-    // mojom::generate::pack::PackedField::GetSizeForKind, so it should be okay.
-    var value = this.message.buffer.getInt32(offset);
-    return enumClass.validate(value);
-  }
-
-  Validator.prototype.validateHandle = function(offset, nullable) {
-    var index = this.message.buffer.getUint32(offset);
-
-    if (index === codec.kEncodedInvalidHandleValue)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_INVALID_HANDLE;
-
-    if (!this.claimHandle(index))
-      return validationError.ILLEGAL_HANDLE;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateInterface = function(offset, nullable) {
-    return this.validateHandle(offset, nullable);
-  };
-
-  Validator.prototype.validateInterfaceRequest = function(offset, nullable) {
-    return this.validateHandle(offset, nullable);
-  };
-
-  Validator.prototype.validateStructHeader = function(offset, minNumBytes) {
-    if (!codec.isAligned(offset))
-      return validationError.MISALIGNED_OBJECT;
-
-    if (!this.isValidRange(offset, codec.kStructHeaderSize))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    var numBytes = this.message.buffer.getUint32(offset);
-
-    if (numBytes < minNumBytes)
-      return validationError.UNEXPECTED_STRUCT_HEADER;
-
-    if (!this.claimRange(offset, numBytes))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateStructVersion = function(offset, versionSizes) {
-    var numBytes = this.message.buffer.getUint32(offset);
-    var version = this.message.buffer.getUint32(offset + 4);
-
-    if (version <= versionSizes[versionSizes.length - 1].version) {
-      // Scan in reverse order to optimize for more recent versionSizes.
-      for (var i = versionSizes.length - 1; i >= 0; --i) {
-        if (version >= versionSizes[i].version) {
-          if (numBytes == versionSizes[i].numBytes)
-            break;
-          return validationError.UNEXPECTED_STRUCT_HEADER;
-        }
-      }
-    } else if (numBytes < versionSizes[versionSizes.length-1].numBytes) {
-      return validationError.UNEXPECTED_STRUCT_HEADER;
-    }
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.isFieldInStructVersion = function(offset, fieldVersion) {
-    var structVersion = this.message.buffer.getUint32(offset + 4);
-    return fieldVersion <= structVersion;
-  };
-
-  // TODO(wangjimmy): Add support for v2 messages.
-  Validator.prototype.validateMessageHeader = function() {
-
-    var err = this.validateStructHeader(0, codec.kMessageHeaderSize);
-    if (err != validationError.NONE)
-      return err;
-
-    var numBytes = this.message.getHeaderNumBytes();
-    var version = this.message.getHeaderVersion();
-
-    var validVersionAndNumBytes =
-        (version == 0 && numBytes == codec.kMessageHeaderSize) ||
-        (version == 1 &&
-         numBytes == codec.kMessageWithRequestIDHeaderSize) ||
-        (version > 1 &&
-         numBytes >= codec.kMessageWithRequestIDHeaderSize);
-    if (!validVersionAndNumBytes)
-      return validationError.UNEXPECTED_STRUCT_HEADER;
-
-    var expectsResponse = this.message.expectsResponse();
-    var isResponse = this.message.isResponse();
-
-    if (version == 0 && (expectsResponse || isResponse))
-      return validationError.MESSAGE_HEADER_MISSING_REQUEST_ID;
-
-    if (isResponse && expectsResponse)
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateMessageIsRequestWithoutResponse = function() {
-    if (this.message.isResponse() || this.message.expectsResponse()) {
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateMessageIsRequestExpectingResponse = function() {
-    if (this.message.isResponse() || !this.message.expectsResponse()) {
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateMessageIsResponse = function() {
-    if (this.message.expectsResponse() || !this.message.isResponse()) {
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-    }
-    return validationError.NONE;
-  };
-
-  // Returns the message.buffer relative offset this pointer "points to",
-  // NULL_MOJO_POINTER if the pointer represents a null, or JS null if the
-  // pointer's value is not valid.
-  Validator.prototype.decodePointer = function(offset) {
-    var pointerValue = this.message.buffer.getUint64(offset);
-    if (pointerValue === 0)
-      return NULL_MOJO_POINTER;
-    var bufferOffset = offset + pointerValue;
-    return Number.isSafeInteger(bufferOffset) ? bufferOffset : null;
-  };
-
-  Validator.prototype.decodeUnionSize = function(offset) {
-    return this.message.buffer.getUint32(offset);
-  };
-
-  Validator.prototype.decodeUnionTag = function(offset) {
-    return this.message.buffer.getUint32(offset + 4);
-  };
-
-  Validator.prototype.validateArrayPointer = function(
-      offset, elementSize, elementType, nullable, expectedDimensionSizes,
-      currentDimension) {
-    var arrayOffset = this.decodePointer(offset);
-    if (arrayOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (arrayOffset === NULL_MOJO_POINTER)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
-
-    return this.validateArray(arrayOffset, elementSize, elementType,
-                              expectedDimensionSizes, currentDimension);
-  };
-
-  Validator.prototype.validateStructPointer = function(
-      offset, structClass, nullable) {
-    var structOffset = this.decodePointer(offset);
-    if (structOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (structOffset === NULL_MOJO_POINTER)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
-
-    return structClass.validate(this, structOffset);
-  };
-
-  Validator.prototype.validateUnion = function(
-      offset, unionClass, nullable) {
-    var size = this.message.buffer.getUint32(offset);
-    if (size == 0) {
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_UNION;
-    }
-
-    return unionClass.validate(this, offset);
-  };
-
-  Validator.prototype.validateNestedUnion = function(
-      offset, unionClass, nullable) {
-    var unionOffset = this.decodePointer(offset);
-    if (unionOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (unionOffset === NULL_MOJO_POINTER)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_UNION;
-
-    return this.validateUnion(unionOffset, unionClass, nullable);
-  };
-
-  // This method assumes that the array at arrayPointerOffset has
-  // been validated.
-
-  Validator.prototype.arrayLength = function(arrayPointerOffset) {
-    var arrayOffset = this.decodePointer(arrayPointerOffset);
-    return this.message.buffer.getUint32(arrayOffset + 4);
-  };
-
-  Validator.prototype.validateMapPointer = function(
-      offset, mapIsNullable, keyClass, valueClass, valueIsNullable) {
-    // Validate the implicit map struct:
-    // struct {array<keyClass> keys; array<valueClass> values};
-    var structOffset = this.decodePointer(offset);
-    if (structOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (structOffset === NULL_MOJO_POINTER)
-      return mapIsNullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
-
-    var mapEncodedSize = codec.kStructHeaderSize + codec.kMapStructPayloadSize;
-    var err = this.validateStructHeader(structOffset, mapEncodedSize);
-    if (err !== validationError.NONE)
-        return err;
-
-    // Validate the keys array.
-    var keysArrayPointerOffset = structOffset + codec.kStructHeaderSize;
-    err = this.validateArrayPointer(
-        keysArrayPointerOffset, keyClass.encodedSize, keyClass, false, [0], 0);
-    if (err !== validationError.NONE)
-        return err;
-
-    // Validate the values array.
-    var valuesArrayPointerOffset = keysArrayPointerOffset + 8;
-    var valuesArrayDimensions = [0]; // Validate the actual length below.
-    if (valueClass instanceof codec.ArrayOf)
-      valuesArrayDimensions =
-          valuesArrayDimensions.concat(valueClass.dimensions());
-    var err = this.validateArrayPointer(valuesArrayPointerOffset,
-                                        valueClass.encodedSize,
-                                        valueClass,
-                                        valueIsNullable,
-                                        valuesArrayDimensions,
-                                        0);
-    if (err !== validationError.NONE)
-        return err;
-
-    // Validate the lengths of the keys and values arrays.
-    var keysArrayLength = this.arrayLength(keysArrayPointerOffset);
-    var valuesArrayLength = this.arrayLength(valuesArrayPointerOffset);
-    if (keysArrayLength != valuesArrayLength)
-      return validationError.DIFFERENT_SIZED_ARRAYS_IN_MAP;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateStringPointer = function(offset, nullable) {
-    return this.validateArrayPointer(
-        offset, codec.Uint8.encodedSize, codec.Uint8, nullable, [0], 0);
-  };
-
-  // Similar to Array_Data<T>::Validate()
-  // mojo/public/cpp/bindings/lib/array_internal.h
-
-  Validator.prototype.validateArray =
-      function (offset, elementSize, elementType, expectedDimensionSizes,
-                currentDimension) {
-    if (!codec.isAligned(offset))
-      return validationError.MISALIGNED_OBJECT;
-
-    if (!this.isValidRange(offset, codec.kArrayHeaderSize))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    var numBytes = this.message.buffer.getUint32(offset);
-    var numElements = this.message.buffer.getUint32(offset + 4);
-
-    // Note: this computation is "safe" because elementSize <= 8 and
-    // numElements is a uint32.
-    var elementsTotalSize = (elementType === codec.PackedBool) ?
-        Math.ceil(numElements / 8) : (elementSize * numElements);
-
-    if (numBytes < codec.kArrayHeaderSize + elementsTotalSize)
-      return validationError.UNEXPECTED_ARRAY_HEADER;
-
-    if (expectedDimensionSizes[currentDimension] != 0 &&
-        numElements != expectedDimensionSizes[currentDimension]) {
-      return validationError.UNEXPECTED_ARRAY_HEADER;
-    }
-
-    if (!this.claimRange(offset, numBytes))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    // Validate the array's elements if they are pointers or handles.
-
-    var elementsOffset = offset + codec.kArrayHeaderSize;
-    var nullable = isNullable(elementType);
-
-    if (isHandleClass(elementType))
-      return this.validateHandleElements(elementsOffset, numElements, nullable);
-    if (isInterfaceClass(elementType))
-      return this.validateInterfaceElements(
-          elementsOffset, numElements, nullable);
-    if (isInterfaceRequestClass(elementType))
-      return this.validateInterfaceRequestElements(
-          elementsOffset, numElements, nullable);
-    if (isStringClass(elementType))
-      return this.validateArrayElements(
-          elementsOffset, numElements, codec.Uint8, nullable, [0], 0);
-    if (elementType instanceof codec.PointerTo)
-      return this.validateStructElements(
-          elementsOffset, numElements, elementType.cls, nullable);
-    if (elementType instanceof codec.ArrayOf)
-      return this.validateArrayElements(
-          elementsOffset, numElements, elementType.cls, nullable,
-          expectedDimensionSizes, currentDimension + 1);
-    if (isEnumClass(elementType))
-      return this.validateEnumElements(elementsOffset, numElements,
-                                       elementType.cls);
-
-    return validationError.NONE;
-  };
-
-  // Note: the |offset + i * elementSize| computation in the validateFooElements
-  // methods below is "safe" because elementSize <= 8, offset and
-  // numElements are uint32, and 0 <= i < numElements.
-
-  Validator.prototype.validateHandleElements =
-      function(offset, numElements, nullable) {
-    var elementSize = codec.Handle.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateHandle(elementOffset, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateInterfaceElements =
-      function(offset, numElements, nullable) {
-    var elementSize = codec.Interface.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateInterface(elementOffset, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateInterfaceRequestElements =
-      function(offset, numElements, nullable) {
-    var elementSize = codec.InterfaceRequest.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateInterfaceRequest(elementOffset, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  // The elementClass parameter is the element type of the element arrays.
-  Validator.prototype.validateArrayElements =
-      function(offset, numElements, elementClass, nullable,
-               expectedDimensionSizes, currentDimension) {
-    var elementSize = codec.PointerTo.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateArrayPointer(
-          elementOffset, elementClass.encodedSize, elementClass, nullable,
-          expectedDimensionSizes, currentDimension);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateStructElements =
-      function(offset, numElements, structClass, nullable) {
-    var elementSize = codec.PointerTo.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err =
-          this.validateStructPointer(elementOffset, structClass, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateEnumElements =
-      function(offset, numElements, enumClass) {
-    var elementSize = codec.Enum.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateEnum(elementOffset, enumClass);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  var exports = {};
-  exports.validationError = validationError;
-  exports.Validator = Validator;
-  exports.ValidationErrorObserverForTesting = ValidationErrorObserverForTesting;
-  exports.reportValidationError = reportValidationError;
-  exports.isTestingMode = isTestingMode;
-  exports.clearTestingMode = clearTestingMode;
-  return exports;
-});
diff --git a/mojo/public/tests/test_support_private.cc b/mojo/public/tests/test_support_private.cc
deleted file mode 100644
index 0081984..0000000
--- a/mojo/public/tests/test_support_private.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/tests/test_support_private.h"
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-static mojo::test::TestSupport* g_test_support = NULL;
-
-extern "C" {
-
-void MojoTestSupportLogPerfResult(const char* test_name,
-                                  const char* sub_test_name,
-                                  double value,
-                                  const char* units) {
-  if (g_test_support) {
-    g_test_support->LogPerfResult(test_name, sub_test_name, value, units);
-  } else {
-    if (sub_test_name) {
-      printf("[no test runner]\t%s/%s\t%g\t%s\n", test_name, sub_test_name,
-             value, units);
-    } else {
-      printf("[no test runner]\t%s\t%g\t%s\n", test_name, value, units);
-    }
-  }
-}
-
-FILE* MojoTestSupportOpenSourceRootRelativeFile(const char* relative_path) {
-  if (g_test_support)
-    return g_test_support->OpenSourceRootRelativeFile(relative_path);
-  printf("[no test runner]\n");
-  return NULL;
-}
-
-char** MojoTestSupportEnumerateSourceRootRelativeDirectory(
-    const char* relative_path) {
-  if (g_test_support)
-    return g_test_support->EnumerateSourceRootRelativeDirectory(relative_path);
-
-  printf("[no test runner]\n");
-
-  // Return empty list:
-  char** rv = static_cast<char**>(calloc(1, sizeof(char*)));
-  rv[0] = NULL;
-  return rv;
-}
-
-}  // extern "C"
-
-namespace mojo {
-namespace test {
-
-TestSupport::~TestSupport() {
-}
-
-// static
-void TestSupport::Init(TestSupport* test_support) {
-  assert(!g_test_support);
-  g_test_support = test_support;
-}
-
-// static
-TestSupport* TestSupport::Get() {
-  return g_test_support;
-}
-
-// static
-void TestSupport::Reset() {
-  g_test_support = NULL;
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/tests/test_support_private.h b/mojo/public/tests/test_support_private.h
deleted file mode 100644
index 2742605..0000000
--- a/mojo/public/tests/test_support_private.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_TESTS_TEST_SUPPORT_PRIVATE_H_
-#define MOJO_PUBLIC_TESTS_TEST_SUPPORT_PRIVATE_H_
-
-#include <stdio.h>
-
-#include "mojo/public/c/test_support/test_support.h"
-
-namespace mojo {
-namespace test {
-
-// Implementors of the test support APIs can use this interface to install their
-// implementation into the mojo_test_support dynamic library.
-class TestSupport {
- public:
-  virtual ~TestSupport();
-
-  static void Init(TestSupport* test_support);
-  static TestSupport* Get();
-  static void Reset();
-
-  virtual void LogPerfResult(const char* test_name,
-                             const char* sub_test_name,
-                             double value,
-                             const char* units) = 0;
-  virtual FILE* OpenSourceRootRelativeFile(const char* relative_path) = 0;
-  virtual char** EnumerateSourceRootRelativeDirectory(
-      const char* relative_path) = 0;
-};
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_TESTS_TEST_SUPPORT_PRIVATE_H_
diff --git a/mojo/public/tools/bindings/BUILD.gn b/mojo/public/tools/bindings/BUILD.gn
deleted file mode 100644
index 153d110..0000000
--- a/mojo/public/tools/bindings/BUILD.gn
+++ /dev/null
@@ -1,77 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-
-action("precompile_templates") {
-  sources = mojom_generator_sources
-  sources += [
-    "$mojom_generator_root/generators/cpp_templates/enum_macros.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/enum_serialization_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_macros.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_proxy_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_request_validator_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_response_validator_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_stub_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/module-shared-internal.h.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/module-shared.cc.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/module-shared.h.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/module.cc.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/module.h.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_data_view_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_data_view_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_macros.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_serialization_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_traits_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_traits_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_data_view_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_data_view_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_serialization_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_traits_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_traits_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/validation_macros.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/wrapper_class_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/wrapper_class_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/wrapper_class_template_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/wrapper_union_class_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/wrapper_union_class_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/wrapper_union_class_template_definition.tmpl",
-    "$mojom_generator_root/generators/java_templates/constant_definition.tmpl",
-    "$mojom_generator_root/generators/java_templates/constants.java.tmpl",
-    "$mojom_generator_root/generators/java_templates/data_types_definition.tmpl",
-    "$mojom_generator_root/generators/java_templates/enum.java.tmpl",
-    "$mojom_generator_root/generators/java_templates/enum_definition.tmpl",
-    "$mojom_generator_root/generators/java_templates/header.java.tmpl",
-    "$mojom_generator_root/generators/java_templates/interface.java.tmpl",
-    "$mojom_generator_root/generators/java_templates/interface_definition.tmpl",
-    "$mojom_generator_root/generators/java_templates/interface_internal.java.tmpl",
-    "$mojom_generator_root/generators/java_templates/struct.java.tmpl",
-    "$mojom_generator_root/generators/java_templates/union.java.tmpl",
-    "$mojom_generator_root/generators/js_templates/enum_definition.tmpl",
-    "$mojom_generator_root/generators/js_templates/interface_definition.tmpl",
-    "$mojom_generator_root/generators/js_templates/module.amd.tmpl",
-    "$mojom_generator_root/generators/js_templates/module_definition.tmpl",
-    "$mojom_generator_root/generators/js_templates/struct_definition.tmpl",
-    "$mojom_generator_root/generators/js_templates/union_definition.tmpl",
-    "$mojom_generator_root/generators/js_templates/validation_macros.tmpl",
-  ]
-  script = mojom_generator_script
-  outputs = [
-    "$target_gen_dir/cpp_templates.zip",
-    "$target_gen_dir/java_templates.zip",
-    "$target_gen_dir/js_templates.zip",
-  ]
-  args = [
-    "--use_bundled_pylibs",
-    "precompile",
-    "-o",
-    rebase_path(target_gen_dir),
-  ]
-}
diff --git a/mojo/public/tools/bindings/README.md b/mojo/public/tools/bindings/README.md
deleted file mode 100644
index 737c7e6..0000000
--- a/mojo/public/tools/bindings/README.md
+++ /dev/null
@@ -1,749 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojom IDL and Bindings Generator
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-
-Mojom is the IDL for Mojo bindings interfaces. Given a `.mojom` file, the
-[bindings generator](https://cs.chromium.org/chromium/src/mojo/public/tools/bindings)
-outputs bindings for all supported languages: **C++**, **JavaScript**, and
-**Java**.
-
-For a trivial example consider the following hypothetical Mojom file we write to
-`//services/widget/public/interfaces/frobinator.mojom`:
-
-```
-module widget.mojom;
-
-interface Frobinator {
-  Frobinate();
-};
-```
-
-This defines a single [interface](#Interfaces) named `Frobinator` in a
-[module](#Modules) named `widget.mojom` (and thus fully qualified in Mojom as
-`widget.mojom.Frobinator`.) Note that many interfaces and/or other types of
-definitions may be included in a single Mojom file.
-
-If we add a corresponding GN target to
-`//services/widget/public/interfaces/BUILD.gn`:
-
-```
-import("mojo/public/tools/bindings/mojom.gni")
-
-mojom("interfaces") {
-  sources = [
-    "frobinator.mojom",
-  ]
-}
-```
-
-and then build this target:
-
-```
-ninja -C out/r services/widget/public/interfaces
-```
-
-we'll find several generated sources in our output directory:
-
-```
-out/r/gen/services/widget/public/interfaces/frobinator.mojom.cc
-out/r/gen/services/widget/public/interfaces/frobinator.mojom.h
-out/r/gen/services/widget/public/interfaces/frobinator.mojom.js
-out/r/gen/services/widget/public/interfaces/frobinator.mojom.srcjar
-...
-```
-
-Each of these generated source modules includes a set of definitions
-representing the Mojom contents within the target language. For more details
-regarding the generated outputs please see
-[documentation for individual target languages](#Generated-Code-For-Target-Languages).
-
-## Mojom Syntax
-
-Mojom IDL allows developers to define **structs**, **unions**, **interfaces**,
-**constants**, and **enums**, all within the context of a **module**. These
-definitions are used to generate code in the supported target languages at build
-time.
-
-Mojom files may **import** other Mojom files in order to reference their
-definitions.
-
-### Primitive Types
-Mojom supports a few basic data types which may be composed into structs or used
-for message parameters.
-
-| Type                          | Description
-|-------------------------------|-------------------------------------------------------|
-| `bool`                        | Boolean type (`true` or `false`.)
-| `int8`, `uint8`               | Signed or unsigned 8-bit integer.
-| `int16`, `uint16`             | Signed or unsigned 16-bit integer.
-| `int32`, `uint32`             | Signed or unsigned 32-bit integer.
-| `int64`, `uint64`             | Signed or unsigned 64-bit integer.
-| `float`, `double`             | 32- or 64-bit floating point number.
-| `string`                      | UTF-8 encoded string.
-| `array<T>`                    | Array of any Mojom type *T*; for example, `array<uint8>` or `array<array<string>>`.
-| `array<T, N>`                 | Fixed-length array of any Mojom type *T*. The parameter *N* must be an integral constant.
-| `map<S, T>`                   | Associated array maping values of type *S* to values of type *T*. *S* may be a `string`, `enum`, or numeric type.
-| `handle`                      | Generic Mojo handle. May be any type of handle, including a wrapped native platform handle.
-| `handle<message_pipe>`        | Generic message pipe handle.
-| `handle<shared_buffer>`       | Shared buffer handle.
-| `handle<data_pipe_producer>`  | Data pipe producer handle.
-| `handle<data_pipe_consumer>`  | Data pipe consumer handle.
-| *`InterfaceType`*             | Any user-defined Mojom interface type. This is sugar for a strongly-typed message pipe handle which should eventually be used to make outgoing calls on the interface.
-| *`InterfaceType&`*            | An interface request for any user-defined Mojom interface type. This is sugar for a more strongly-typed message pipe handle which is expected to receive request messages and should therefore eventually be bound to an implementation of the interface.
-| *`associated InterfaceType`*  | An associated interface handle. See [Associated Interfaces](#Associated-Interfaces)
-| *`associated InterfaceType&`* | An associated interface request. See [Associated Interfaces](#Associated-Interfaces)
-| *T*?                          | An optional (nullable) value. Primitive numeric types (integers, floats, booleans, and enums) are not nullable. All other types are nullable.
-
-### Modules
-
-Every Mojom file may optionally specify a single **module** to which it belongs.
-
-This is used strictly for aggregaging all defined symbols therein within a
-common Mojom namespace. The specific impact this has on generated binidngs code
-varies for each target language. For example, if the following Mojom is used to
-generate bindings:
-
-```
-module business.stuff;
-
-interface MoneyGenerator {
-  GenerateMoney();
-};
-```
-
-Generated C++ bindings will define a class interface `MoneyGenerator` in the
-`business::stuff` namespace, while Java bindings will define an interface
-`MoneyGenerator` in the `org.chromium.business.stuff` package. JavaScript
-bindings at this time are unaffected by module declarations.
-
-**NOTE:** By convention in the Chromium codebase, **all** Mojom files should
-declare a module name with at least (and preferrably exactly) one top-level name
-as well as an inner `mojom` module suffix. *e.g.*, `chrome.mojom`,
-`business.mojom`, *etc.*
-
-This convention makes it easy to tell which symbols are generated by Mojom when
-reading non-Mojom code, and it also avoids namespace collisions in the fairly
-common scenario where you have a real C++ or Java `Foo` along with a
-corresponding Mojom `Foo` for its serialized representation.
-
-### Imports
-
-If your Mojom references definitions from other Mojom files, you must **import**
-those files. Import syntax is as follows:
-
-```
-import "services/widget/public/interfaces/frobinator.mojom";
-```
-
-Import paths are always relative to the top-level directory.
-
-Note that circular imports are **not** supported.
-
-### Structs
-
-Structs are defined using the **struct** keyword, and they provide a way to
-group related fields together:
-
-``` cpp
-struct StringPair {
-  string first;
-  string second;
-};
-```
-
-Struct fields may be comprised of any of the types listed above in the
-[Primitive Types](#Primitive-Types) section.
-
-Default values may be specified as long as they are constant:
-
-``` cpp
-struct Request {
-  int32 id = -1;
-  string details;
-};
-```
-
-What follows is a fairly
-comprehensive example using the supported field types:
-
-``` cpp
-struct StringPair {
-  string first;
-  string second;
-};
-
-enum AnEnum {
-  YES,
-  NO
-};
-
-interface SampleInterface {
-  DoStuff();
-};
-
-struct AllTheThings {
-  // Note that these types can never be marked nullable!
-  bool boolean_value;
-  int8 signed_8bit_value = 42;
-  uint8 unsigned_8bit_value;
-  int16 signed_16bit_value;
-  uint16 unsigned_16bit_value;
-  int32 signed_32bit_value;
-  uint32 unsigned_32bit_value;
-  int64 signed_64bit_value;
-  uint64 unsigned_64bit_value;
-  float float_value_32bit;
-  double float_value_64bit;
-  AnEnum enum_value = AnEnum.YES;
-
-  // Strings may be nullable.
-  string? maybe_a_string_maybe_not;
-
-  // Structs may contain other structs. These may also be nullable.
-  StringPair some_strings;
-  StringPair? maybe_some_more_strings;
-
-  // In fact structs can also be nested, though in practice you must always make
-  // such fields nullable -- otherwise messages would need to be infinitely long
-  // in order to pass validation!
-  AllTheThings? more_things;
-
-  // Arrays may be templated over any Mojom type, and are always nullable:
-  array<int32> numbers;
-  array<int32>? maybe_more_numbers;
-
-  // Arrays of arrays of arrays... are fine.
-  array<array<array<AnEnum>>> this_works_but_really_plz_stop;
-
-  // The element type may be nullable if it's a type which is allowed to be
-  // nullable.
-  array<AllTheThings?> more_maybe_things;
-
-  // Fixed-size arrays get some extra validation on the receiving end to ensure
-  // that the correct number of elements is always received.
-  array<uint64, 2> uuid;
-
-  // Maps follow many of the same rules as arrays. Key types may be any
-  // non-handle, non-collection type, and value types may be any supported
-  // struct field type. Maps may also be nullable.
-  map<string, int32> one_map;
-  map<AnEnum, string>? maybe_another_map;
-  map<StringPair, AllTheThings?>? maybe_a_pretty_weird_but_valid_map;
-  map<StringPair, map<int32, array<map<string, string>?>?>?> ridiculous;
-
-  // And finally, all handle types are valid as struct fields and may be
-  // nullable. Note that interfaces and interface requests (the "Foo" and
-  // "Foo&" type syntax respectively) are just strongly-typed message pipe
-  // handles.
-  handle generic_handle;
-  handle<data_pipe_consumer> reader;
-  handle<data_pipe_producer>? maybe_writer;
-  handle<shared_buffer> dumping_ground;
-  handle<message_pipe> raw_message_pipe;
-  SampleInterface? maybe_a_sample_interface_client_pipe;
-  SampleInterface& non_nullable_sample_interface_request;
-  SampleInterface&? nullable_sample_interface_request;
-  associated SampleInterface associated_interface_client;
-  associated SampleInterface& associated_interface_request;
-  assocaited SampleInterface&? maybe_another_associated_request;
-};
-```
-
-For details on how all of these different types translate to usable generated
-code, see
-[documentation for individual target languages](#Generated-Code-For-Target-Languages).
-
-### Enumeration Types
-
-Enumeration types may be defined using the **enum** keyword either directly
-within a module or within the namespace of some struct or interface:
-
-```
-module business.mojom;
-
-enum Department {
-  SALES = 0,
-  DEV,
-};
-
-struct Employee {
-  enum Type {
-    FULL_TIME,
-    PART_TIME,
-  };
-
-  Type type;
-  // ...
-};
-```
-
-That that similar to C-style enums, individual values may be explicitly assigned
-within an enum definition. By default values are based at zero and incremenet by
-1 sequentially.
-
-The effect of nested definitions on generated bindings varies depending on the
-target language. See [documentation for individual target languages](#Generated-Code-For-Target-Languages)
-
-### Constants
-
-Constants may be defined using the **const** keyword either directly within a
-module or within the namespace of some struct or interface:
-
-```
-module business.mojom;
-
-const string kServiceName = "business";
-
-struct Employee {
-  const uint64 kInvalidId = 0;
-
-  enum Type {
-    FULL_TIME,
-    PART_TIME,
-  };
-
-  uint64 id = kInvalidId;
-  Type type;
-};
-```
-
-The effect of nested definitions on generated bindings varies depending on the
-target language. See [documentation for individual target languages](#Generated-Code-For-Target-Languages)
-
-### Interfaces
-
-An **interface** is a logical bundle of parameterized request messages. Each
-request message may optionally define a parameterized response message. Here's
-syntax to define an interface `Foo` with various kinds of requests:
-
-```
-interface Foo {
-  // A request which takes no arguments and expects no response.
-  MyMessage();
-
-  // A request which has some arguments and expects no response.
-  MyOtherMessage(string name, array<uint8> bytes);
-
-  // A request which expects a single-argument response.
-  MyMessageWithResponse(string command) => (bool success);
-
-  // A request which expects a response with multiple arguments.
-  MyMessageWithMoarResponse(string a, string b) => (int8 c, int8 d);
-};
-```
-
-Anything which is a valid struct field type (see [Structs](#Structs)) is also a
-valid request or response argument type. The type notation is the same for both.
-
-### Attributes
-
-Mojom definitions may have their meaning altered by **attributes**, specified
-with a syntax similar to Java or C# attributes. There are a handle of
-interesting attributes supported today.
-
-**`[Sync]`**
-:   The `Sync` attribute may be specified for any interface method which expects
-    a response. This makes it so that callers of the method can wait
-    synchronously for a response. See
-    [Synchronous Calls](/mojo/public/cpp/bindings#Synchronous-Calls) in the C++
-    bindings documentation. Note that sync calls are not currently supported in
-    other target languages.
-
-**`[Extensible]`**
-:   The `Extensible` attribute may be specified for any enum definition. This
-    essentially disables builtin range validation when receiving values of the
-    enum type in a message, allowing older bindings to tolerate unrecognized
-    values from newer versions of the enum.
-
-**`[Native]`**
-:   The `Native` attribute may be specified for an empty struct declaration to
-    provide a nominal bridge between Mojo IPC and legacy `IPC::ParamTraits` or
-    `IPC_STRUCT_TRAITS*` macros.
-    See [Using Legacy IPC Traits](/ipc#Using-Legacy-IPC-Traits) for more
-    details. Note support for this attribute is strictly limited to C++ bindings
-    generation.
-
-**`[MinVersion=N]`**
-:   The `MinVersion` attribute is used to specify the version at which a given
-    field, enum value, interface method, or method parameter was introduced.
-    See [Versioning](#Versioning) for more details.
-
-## Generated Code For Target Languages
-
-When the bindings generator successfully processes an input Mojom file, it emits
-corresponding code for each supported target language. For more details on how
-Mojom concepts translate to a given target langauge, please refer to the
-bindings API documentation for that language:
-
-* [C++ Bindings](/mojo/public/cpp/bindings)
-* [JavaScript Bindings](/mojo/public/js)
-* [Java Bindings](/mojo/public/java/bindings)
-
-## Message Validation
-
-Regardless of target language, all interface messages are validated during
-deserialization before they are dispatched to a receiving implementation of the
-interface. This helps to ensure consitent validation across interfaces without
-leaving the burden to developers and security reviewers every time a new message
-is added.
-
-If a message fails validation, it is never dispatched. Instead a **connection
-error** is raised on the binding object (see
-[C++ Connection Errors](/mojo/public/cpp/bindings#Connection-Errors),
-[Java Connection Errors](/mojo/public/java/bindings#Connection-Errors), or
-[JavaScript Connection Errors](/mojo/public/js#Connection-Errors) for details.)
-
-Some baseline level of validation is done automatically for primitive Mojom
-types.
-
-### Non-Nullable Objects
-
-Mojom fields or parameter values (*e.g.*, structs, interfaces, arrays, *etc.*)
-may be marked nullable in Mojom definitions (see
-[Primitive Types](#Primitive-Types).) If a field or parameter is **not** marked
-nullable but a message is received with a null value in its place, that message
-will fail validation.
-
-### Enums
-
-Enums declared in Mojom are automatically validated against the range of legal
-values. For example if a Mojom declares the enum:
-
-``` cpp
-enum AdvancedBoolean {
-  TRUE = 0,
-  FALSE = 1,
-  FILE_NOT_FOUND = 2,
-};
-```
-
-and a message is received with the integral value 3 (or anything other than 0,
-1, or 2) in place of some `AdvancedBoolean` field or parameter, the message will
-fail validation.
-
-*** note
-NOTE: It's possible to avoid this type of validation error by explicitly marking
-an enum as [Extensible](#Attributes) if you anticipate your enum being exchanged
-between two different versions of the binding interface. See
-[Versioning](#Versioning).
-***
-
-### Other failures
-
-There are a  host of internal validation errors that may occur when a malformed
-message is received, but developers should not be concerned with these
-specifically; in general they can only result from internal bindings bugs,
-compromised processes, or some remote endpoint making a dubious effort to
-manually encode their own bindings messages.
-
-### Custom Validation
-
-It's also possible for developers to define custom validation logic for specific
-Mojom struct types by exploiting the
-[type mapping](/mojo/public/cpp/bindings#Type-Mapping) system for C++ bindings.
-Messages rejected by custom validation logic trigger the same validation failure
-behavior as the built-in type validation routines.
-
-## Associated Interfaces
-
-As mentioned in the [Primitive Types](#Primitive-Types) section above, interface
-and interface request fields and parameters may be marked as `associated`. This
-essentially means that they are piggy-backed on some other interface's message
-pipe.
-
-Because individual interface message pipes operate independently there can be no
-relative ordering guarantees among them. Associated interfaces are useful when
-one interface needs to guarantee strict FIFO ordering with respect to one or
-more other interfaces, as they allow interfaces to share a single pipe.
-
-Currenly associated interfaces are only supported in generated C++ bindings.
-See the documentation for
-[C++ Associated Interfaces](/mojo/public/cpp/bindings#Associated-Interfaces).
-
-## Versioning
-
-### Overview
-
-*** note
-**NOTE:** You don't need to worry about versioning if you don't care about
-backwards compatibility. Specifically, all parts of Chrome are updated
-atomically today and there is not yet any possibility of any two Chrome
-processes communicating with two different versions of any given Mojom
-interface.
-***
-
-Services extend their interfaces to support new features over time, and clients
-want to use those new features when they are available. If services and clients
-are not updated at the same time, it's important for them to be able to
-communicate with each other using different snapshots (versions) of their
-interfaces.
-
-This document shows how to extend Mojom interfaces in a backwards-compatible
-way. Changing interfaces in a non-backwards-compatible way is not discussed,
-because in that case communication between different interface versions is
-impossible anyway.
-
-### Versioned Structs
-
-You can use the `MinVersion` [attribute](#Attributes) to indicate from which
-version a struct field is introduced. Assume you have the following struct:
-
-``` cpp
-struct Employee {
-  uint64 employee_id;
-  string name;
-};
-```
-
-and you would like to add a birthday field. You can do:
-
-``` cpp
-struct Employee {
-  uint64 employee_id;
-  string name;
-  [MinVersion=1] Date? birthday;
-};
-```
-
-By default, fields belong to version 0. New fields must be appended to the
-struct definition (*i.e*., existing fields must not change **ordinal value**)
-with the `MinVersion` attribute set to a number greater than any previous
-existing versions.
-
-**Ordinal value** refers to the relative positional layout of a struct's fields
-(and an interface's methods) when encoded in a message. Implicitly, ordinal
-numbers are assigned to fields according to lexical position. In the example
-above, `employee_id` has an ordinal value of 0 and `name` has an ordinal value
-of 1.
-
-Ordinal values can be specified explicitly using `**@**` notation, subject to
-the following hard constraints:
-
-* For any given struct or interface, if any field or method explicitly specifies
-    an ordinal value, all fields or methods must explicitly specify an ordinal
-    value.
-* For an *N*-field struct or *N*-method interface, the set of explicitly
-    assigned ordinal values must be limited to the range *[0, N-1]*.
-
-You may reorder fields, but you must ensure that the ordinal values of existing
-fields remain unchanged. For example, the following struct remains
-backwards-compatible:
-
-``` cpp
-struct Employee {
-  uint64 employee_id@0;
-  [MinVersion=1] Date? birthday@2;
-  string name@1;
-};
-```
-
-*** note
-**NOTE:** Newly added fields of Mojo object or handle types MUST be nullable.
-See [Primitive Types](#Primitive-Types).
-***
-
-### Versioned Interfaces
-
-There are two dimensions on which an interface can be extended
-
-**Appending New Parameters To Existing Methods**
-:   Parameter lists are treated as structs internally, so all the rules of
-    versioned structs apply to method parameter lists. The only difference is
-    that the version number is scoped to the whole interface rather than to any
-    individual parameter list.
-
-    Please note that adding a response to a message which did not previously
-    expect a response is a not a backwards-compatible change.
-
-**Appending New Methods**
-:   Similarly, you can reorder methods with explicit ordinal values as long as
-    the ordinal values of existing methods are unchanged.
-
-For example:
-
-``` cpp
-// Old version:
-interface HumanResourceDatabase {
-  AddEmployee(Employee employee) => (bool success);
-  QueryEmployee(uint64 id) => (Employee? employee);
-};
-
-// New version:
-interface HumanResourceDatabase {
-  AddEmployee(Employee employee) => (bool success);
-
-  QueryEmployee(uint64 id, [MinVersion=1] bool retrieve_finger_print)
-      => (Employee? employee,
-          [MinVersion=1] array<uint8>? finger_print);
-
-  [MinVersion=1]
-  AttachFingerPrint(uint64 id, array<uint8> finger_print)
-      => (bool success);
-};
-```
-
-Similar to [versioned structs](#Versioned-Structs), when you pass the parameter
-list of a request or response method to a destination using an older version of
-an interface, unrecognized fields are silently discarded. However, if the method
-call itself is not recognized, it is considered a validation error and the
-receiver will close its end of the interface pipe. For example, if a client on
-version 1 of the above interface sends an `AttachFingerPrint` request to an
-implementation of version 0, the client will be disconnected.
-
-Bindings target languages that support versioning expose means to query or
-assert the remote version from a client handle (*e.g.*, an
-`InterfacePtr<T>` in C++ bindings.)
-
-See
-[C++ Versioning Considerations](/mojo/public/cpp/bindings#Versioning-Considerations)
-and [Java Versioning Considerations](/mojo/public/java/bindings#Versioning-Considerations)
-
-### Versioned Enums
-
-**By default, enums are non-extensible**, which means that generated message
-validation code does not expect to see new values in the future. When an unknown
-value is seen for a non-extensible enum field or parameter, a validation error
-is raised.
-
-If you want an enum to be extensible in the future, you can apply the
-`[Extensible]` [attribute](#Attributes):
-
-``` cpp
-[Extensible]
-enum Department {
-  SALES,
-  DEV,
-};
-```
-
-And later you can extend this enum without breaking backwards compatibility:
-
-``` cpp
-[Extensible]
-enum Department {
-  SALES,
-  DEV,
-  [MinVersion=1] RESEARCH,
-};
-```
-
-*** note
-**NOTE:** For versioned enum definitions, the use of a `[MinVersion]` attribute
-is strictly for documentation purposes. It has no impact on the generated code.
-***
-
-With extensible enums, bound interface implementations may receive unknown enum
-values and will need to deal with them gracefully. See
-[C++ Versioning Considerations](/mojo/public/cpp/bindings#Versioning-Considerations)
-for details.
-
-## Grammar Reference
-
-Below is the (BNF-ish) context-free grammar of the Mojom language:
-
-```
-MojomFile = StatementList
-StatementList = Statement StatementList | Statement
-Statement = ModuleStatement | ImportStatement | Definition
-
-ModuleStatement = AttributeSection "module" Identifier ";"
-ImportStatement = "import" StringLiteral ";"
-Definition = Struct Union Interface Enum Const
-
-AttributeSection = "[" AttributeList "]"
-AttributeList = <empty> | NonEmptyAttributeList
-NonEmptyAttributeList = Attribute
-                      | Attribute "," NonEmptyAttributeList
-Attribute = Name
-          | Name "=" Name
-          | Name "=" Literal
-
-Struct = AttributeSection "struct" Name "{" StructBody "}" ";"
-       | AttributeSection "struct" Name ";"
-StructBody = <empty>
-           | StructBody Const
-           | StructBody Enum
-           | StructBody StructField
-StructField = AttributeSection TypeSpec Name Orginal Default ";"
-
-Union = AttributeSection "union" Name "{" UnionBody "}" ";"
-UnionBody = <empty> | UnionBody UnionField
-UnionField = AttributeSection TypeSpec Name Ordinal ";"
-
-Interface = AttributeSection "interface" Name "{" InterfaceBody "}" ";"
-InterfaceBody = <empty>
-              | InterfaceBody Const
-              | InterfaceBody Enum
-              | InterfaceBody Method
-Method = AttributeSection Name Ordinal "(" ParamterList ")" Response ";"
-ParameterList = <empty> | NonEmptyParameterList
-NonEmptyParameterList = Parameter
-                      | Parameter "," NonEmptyParameterList
-Parameter = AttributeSection TypeSpec Name Ordinal
-Response = <empty> | "=>" "(" ParameterList ")"
-
-TypeSpec = TypeName "?" | TypeName
-TypeName = BasicTypeName
-         | Array
-         | FixedArray
-         | Map
-         | InterfaceRequest
-BasicTypeName = Identifier | "associated" Identifier | HandleType | NumericType
-NumericType = "bool" | "int8" | "uint8" | "int16" | "uint16" | "int32"
-            | "uint32" | "int64" | "uint64" | "float" | "double"
-HandleType = "handle" | "handle" "<" SpecificHandleType ">"
-SpecificHandleType = "message_pipe"
-                   | "shared_buffer"
-                   | "data_pipe_consumer"
-                   | "data_pipe_producer"
-Array = "array" "<" TypeSpec ">"
-FixedArray = "array" "<" TypeSpec "," IntConstDec ">"
-Map = "map" "<" Identifier "," TypeSpec ">"
-InterfaceRequest = Identifier "&" | "associated" Identifier "&"
-
-Ordinal = <empty> | OrdinalValue
-
-Default = <empty> | "=" Constant
-
-Enum = AttributeSection "enum" Name "{" NonEmptyEnumValueList "}" ";"
-     | AttributeSection "enum" Name "{" NonEmptyEnumValueList "," "}" ";"
-NonEmptyEnumValueList = EnumValue | NonEmptyEnumValueList "," EnumValue
-EnumValue = AttributeSection Name
-          | AttributeSection Name "=" Integer
-          | AttributeSection Name "=" Identifier
-
-Const = "const" TypeSpec Name "=" Constant ";"
-
-Constant = Literal | Identifier ";"
-
-Identifier = Name | Name "." Identifier
-
-Literal = Integer | Float | "true" | "false" | "default" | StringLiteral
-
-Integer = IntConst | "+" IntConst | "-" IntConst
-IntConst = IntConstDec | IntConstHex
-
-Float = FloatConst | "+" FloatConst | "-" FloatConst
-
-; The rules below are for tokens matched strictly according to the given regexes
-
-Identifier = /[a-zA-Z_][0-9a-zA-Z_]*/
-IntConstDec = /0|(1-9[0-9]*)/
-IntConstHex = /0[xX][0-9a-fA-F]+/
-OrdinalValue = /@(0|(1-9[0-9]*))/
-FloatConst = ... # Imagine it's close enough to C-style float syntax.
-StringLiteral = ... # Imagine it's close enough to C-style string literals, including escapes.
-```
-
-## Additional Documentation
-
-[Mojom Message Format](https://docs.google.com/document/d/13pv9cFh5YKuBggDBQ1-AL8VReF-IYpFOFpRfvWFrwio/edit)
-:    Describes the wire format used by Mojo bindings interfaces over message
-     pipes.
-
-[Input Format of Mojom Message Validation Tests](https://docs.google.com/document/d/1-y-2IYctyX2NPaLxJjpJfzVNWCC2SR2MJAD9MpIytHQ/edit)
-:    Describes a text format used to facilitate bindings message validation
-     tests.
diff --git a/mojo/public/tools/bindings/blink_bindings_configuration.gni b/mojo/public/tools/bindings/blink_bindings_configuration.gni
deleted file mode 100644
index bb0fc43..0000000
--- a/mojo/public/tools/bindings/blink_bindings_configuration.gni
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-variant = "blink"
-
-for_blink = true
-
-_typemap_imports = [
-  "//mojo/public/cpp/bindings/tests/blink_typemaps.gni",
-  "//third_party/WebKit/Source/platform/mojo/blink_typemaps.gni",
-  "//third_party/WebKit/public/blink_typemaps.gni",
-  "//third_party/WebKit/public/public_typemaps.gni",
-]
-_typemaps = []
-
-foreach(typemap_import, _typemap_imports) {
-  # Avoid reassignment error by assigning to empty scope first.
-  _imported = {
-  }
-  _imported = read_file(typemap_import, "scope")
-  _typemaps += _imported.typemaps
-}
-
-typemaps = []
-foreach(typemap, _typemaps) {
-  typemaps += [ {
-        filename = typemap
-        config = read_file(typemap, "scope")
-      } ]
-}
-
-blacklist = []
diff --git a/mojo/public/tools/bindings/chromium_bindings_configuration.gni b/mojo/public/tools/bindings/chromium_bindings_configuration.gni
deleted file mode 100644
index ca36723..0000000
--- a/mojo/public/tools/bindings/chromium_bindings_configuration.gni
+++ /dev/null
@@ -1,83 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-_typemap_imports = [
-  "//ash/public/interfaces/typemaps.gni",
-  "//cc/ipc/typemaps.gni",
-  "//chrome/browser/media/router/mojo/typemaps.gni",
-  "//chrome/common/extensions/typemaps.gni",
-  "//chrome/common/importer/typemaps.gni",
-  "//chrome/typemaps.gni",
-  "//components/arc/common/typemaps.gni",
-  "//components/metrics/public/cpp/typemaps.gni",
-  "//components/typemaps.gni",
-  "//content/common/bluetooth/typemaps.gni",
-  "//content/common/indexed_db/typemaps.gni",
-  "//content/common/presentation/typemaps.gni",
-  "//content/common/typemaps.gni",
-  "//content/public/common/typemaps.gni",
-  "//device/bluetooth/public/interfaces/typemaps.gni",
-  "//device/gamepad/public/interfaces/typemaps.gni",
-  "//device/generic_sensor/public/interfaces/typemaps.gni",
-  "//device/usb/public/interfaces/typemaps.gni",
-  "//extensions/common/typemaps.gni",
-  "//gpu/ipc/common/typemaps.gni",
-  "//media/capture/mojo/typemaps.gni",
-  "//media/mojo/interfaces/typemaps.gni",
-  "//mojo/common/typemaps.gni",
-  "//mojo/public/cpp/bindings/tests/chromium_typemaps.gni",
-  "//net/interfaces/typemaps.gni",
-  "//services/preferences/public/cpp/typemaps.gni",
-  "//services/resource_coordinator/public/cpp/typemaps.gni",
-  "//services/service_manager/public/cpp/typemaps.gni",
-  "//services/ui/gpu/interfaces/typemaps.gni",
-  "//services/ui/public/interfaces/cursor/typemaps.gni",
-  "//services/ui/public/interfaces/ime/typemaps.gni",
-  "//services/video_capture/public/interfaces/typemaps.gni",
-  "//skia/public/interfaces/typemaps.gni",
-  "//third_party/WebKit/public/public_typemaps.gni",
-  "//ui/base/mojo/typemaps.gni",
-  "//ui/display/mojo/typemaps.gni",
-  "//ui/events/devices/mojo/typemaps.gni",
-  "//ui/events/mojo/typemaps.gni",
-  "//ui/gfx/typemaps.gni",
-  "//ui/latency/mojo/typemaps.gni",
-  "//ui/message_center/mojo/typemaps.gni",
-  "//url/mojo/typemaps.gni",
-]
-
-_typemap_imports_mac = [ "//content/common/typemaps_mac.gni" ]
-
-_typemaps = []
-foreach(typemap_import, _typemap_imports) {
-  # Avoid reassignment error by assigning to empty scope first.
-  _imported = {
-  }
-  _imported = read_file(typemap_import, "scope")
-  _typemaps += _imported.typemaps
-}
-
-typemaps = []
-foreach(typemap, _typemaps) {
-  typemaps += [ {
-        filename = typemap
-        config = read_file(typemap, "scope")
-      } ]
-}
-
-_typemaps_mac = []
-foreach(typemap_import, _typemap_imports_mac) {
-  _imported = {
-  }
-  _imported = read_file(typemap_import, "scope")
-  _typemaps_mac += _imported.typemaps
-}
-
-typemaps_mac = []
-foreach(typemap, _typemaps_mac) {
-  typemaps_mac += [ {
-        filename = typemap
-        config = read_file(typemap, "scope")
-      } ]
-}
diff --git a/mojo/public/tools/bindings/format_typemap_generator_args.py b/mojo/public/tools/bindings/format_typemap_generator_args.py
deleted file mode 100755
index 5057d6c..0000000
--- a/mojo/public/tools/bindings/format_typemap_generator_args.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import sys
-
-# This utility converts mojom dependencies into their corresponding typemap
-# paths and formats them to be consumed by generate_type_mappings.py.
-
-
-def FormatTypemap(typemap_filename):
-  # A simple typemap is valid Python with a minor alteration.
-  with open(typemap_filename) as f:
-    typemap_content = f.read().replace('=\n', '=')
-  typemap = {}
-  exec typemap_content in typemap
-
-  for header in typemap.get('public_headers', []):
-    yield 'public_headers=%s' % header
-  for header in typemap.get('traits_headers', []):
-    yield 'traits_headers=%s' % header
-  for header in typemap.get('type_mappings', []):
-    yield 'type_mappings=%s' % header
-
-
-def main():
-  typemaps = sys.argv[1:]
-  print ' '.join('--start-typemap %s' % ' '.join(FormatTypemap(typemap))
-                 for typemap in typemaps)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/public/tools/bindings/generate_type_mappings.py b/mojo/public/tools/bindings/generate_type_mappings.py
deleted file mode 100755
index 824f804..0000000
--- a/mojo/public/tools/bindings/generate_type_mappings.py
+++ /dev/null
@@ -1,148 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Generates a JSON typemap from its command-line arguments and dependencies.
-
-Each typemap should be specified in an command-line argument of the form
-key=value, with an argument of "--start-typemap" preceding each typemap.
-
-For example,
-generate_type_mappings.py --output=foo.typemap --start-typemap \\
-    public_headers=foo.h traits_headers=foo_traits.h \\
-    type_mappings=mojom.Foo=FooImpl
-
-generates a foo.typemap containing
-{
-  "c++": {
-    "mojom.Foo": {
-      "typename": "FooImpl",
-      "traits_headers": [
-        "foo_traits.h"
-      ],
-      "public_headers": [
-        "foo.h"
-      ]
-    }
-  }
-}
-
-Then,
-generate_type_mappings.py --dependency foo.typemap --output=bar.typemap \\
-    --start-typemap public_headers=bar.h traits_headers=bar_traits.h \\
-    type_mappings=mojom.Bar=BarImpl
-
-generates a bar.typemap containing
-{
-  "c++": {
-    "mojom.Bar": {
-      "typename": "BarImpl",
-      "traits_headers": [
-        "bar_traits.h"
-      ],
-      "public_headers": [
-        "bar.h"
-      ]
-    },
-    "mojom.Foo": {
-      "typename": "FooImpl",
-      "traits_headers": [
-        "foo_traits.h"
-      ],
-      "public_headers": [
-        "foo.h"
-      ]
-    }
-  }
-}
-"""
-
-import argparse
-import json
-import os
-import re
-
-
-def ReadTypemap(path):
-  with open(path) as f:
-    return json.load(f)['c++']
-
-
-def ParseTypemapArgs(args):
-  typemaps = [s for s in '\n'.join(args).split('--start-typemap\n') if s]
-  result = {}
-  for typemap in typemaps:
-    result.update(ParseTypemap(typemap))
-  return result
-
-
-def ParseTypemap(typemap):
-  values = {'type_mappings': [], 'public_headers': [], 'traits_headers': []}
-  for line in typemap.split('\n'):
-    if not line:
-      continue
-    key, _, value = line.partition('=')
-    values[key].append(value.lstrip('/'))
-  result = {}
-  mapping_pattern = \
-      re.compile(r"""^([^=]+)           # mojom type
-                     =
-                     ([^[]+)            # native type
-                     (?:\[([^]]+)\])?$  # optional attribute in square brackets
-                 """, re.X)
-  for typename in values['type_mappings']:
-    match_result = mapping_pattern.match(typename)
-    assert match_result, (
-        "Cannot parse entry in the \"type_mappings\" section: %s" % typename)
-
-    mojom_type = match_result.group(1)
-    native_type = match_result.group(2)
-    attributes = []
-    if match_result.group(3):
-      attributes = match_result.group(3).split(',')
-
-    assert mojom_type not in result, (
-        "Cannot map multiple native types (%s, %s) to the same mojom type: %s" %
-        (result[mojom_type]['typename'], native_type, mojom_type))
-
-    result[mojom_type] = {
-        'typename': native_type,
-        'non_copyable_non_movable': 'non_copyable_non_movable' in attributes,
-        'move_only': 'move_only' in attributes,
-        'copyable_pass_by_value': 'copyable_pass_by_value' in attributes,
-        'nullable_is_same_type': 'nullable_is_same_type' in attributes,
-        'hashable': 'hashable' in attributes,
-        'public_headers': values['public_headers'],
-        'traits_headers': values['traits_headers'],
-    }
-  return result
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description=__doc__,
-      formatter_class=argparse.RawDescriptionHelpFormatter)
-  parser.add_argument(
-      '--dependency',
-      type=str,
-      action='append',
-      default=[],
-      help=('A path to another JSON typemap to merge into the output. '
-            'This may be repeated to merge multiple typemaps.'))
-  parser.add_argument('--output',
-                      type=str,
-                      required=True,
-                      help='The path to which to write the generated JSON.')
-  params, typemap_params = parser.parse_known_args()
-  typemaps = ParseTypemapArgs(typemap_params)
-  missing = [path for path in params.dependency if not os.path.exists(path)]
-  if missing:
-    raise IOError('Missing dependencies: %s' % ', '.join(missing))
-  for path in params.dependency:
-    typemaps.update(ReadTypemap(path))
-  with open(params.output, 'w') as f:
-    json.dump({'c++': typemaps}, f, indent=2)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/mojo/public/tools/bindings/generators/__init__.py b/mojo/public/tools/bindings/generators/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/generators/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/enum_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/enum_macros.tmpl
deleted file mode 100644
index f0d503e..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/enum_macros.tmpl
+++ /dev/null
@@ -1,131 +0,0 @@
-{#---
-  Macro for enum definition, and the declaration of associated functions.
----#}
-
-{%- macro enum_decl(enum) %}
-{%-   set enum_name = enum|get_name_for_kind(flatten_nested_kind=True) %}
-enum class {{enum_name}} : int32_t {
-{%-   for field in enum.fields %}
-{%-     if field.value %}
-  {{field.name}} = {{field.value|expression_to_text}},
-{%-     else %}
-  {{field.name}},
-{%-     endif %}
-{%-   endfor %}
-};
-
-inline std::ostream& operator<<(std::ostream& os, {{enum_name}} value) {
-{%- if enum.fields %}
-  switch(value) {
-{%-   for _, values in enum.fields|groupby('numeric_value') %}
-    case {{enum_name}}::{{values[0].name}}:
-      return os << "{{enum_name}}::
-{%-     if values|length > 1 -%}
-      {{'{'}}
-{%-     endif -%}
-      {{values|map(attribute='name')|join(', ')}}
-{%-     if values|length > 1 -%}
-      {{'}'}}
-{%-     endif -%}
-      ";
-{%-   endfor %}
-    default:
-      return os << "Unknown {{enum_name}} value: " << static_cast<int32_t>(value);
-  }
-{%- else %}
-  return os << "Unknown {{enum_name}} value: " << static_cast<int32_t>(value);
-{%- endif %}
-}
-
-{#-   Returns true if the given enum value exists in this version of enum. #}
-inline bool IsKnownEnumValue({{enum_name}} value) {
-  return {{enum|get_name_for_kind(internal=True,
-                                  flatten_nested_kind=True)}}::IsKnownValue(
-      static_cast<int32_t>(value));
-}
-{%- endmacro %}
-
-{%- macro enum_data_decl(enum) %}
-{%-   set enum_name = enum|get_name_for_kind(flatten_nested_kind=True) %}
-struct {{enum_name}}_Data {
- public:
-  static bool constexpr kIsExtensible = {% if enum.extensible %}true{% else %}false{% endif %};
-
-  static bool IsKnownValue(int32_t value) {
-{%- if enum.fields %}
-    switch (value) {
-{%-   for enum_field in enum.fields|groupby('numeric_value') %}
-      case {{enum_field[0]}}:
-{%-   endfor %}
-        return true;
-    }
-{%- endif %}
-    return false;
-  }
-
-  static bool Validate(int32_t value,
-                       mojo::internal::ValidationContext* validation_context) {
-    if (kIsExtensible || IsKnownValue(value))
-      return true;
-
-    ReportValidationError(validation_context,
-                          mojo::internal::VALIDATION_ERROR_UNKNOWN_ENUM_VALUE);
-    return false;
-  }
-};
-{%- endmacro %}
-
-{%- macro enum_hash(enum) %}
-{%-   set enum_name = enum|get_qualified_name_for_kind(
-          flatten_nested_kind=True) %}
-template <>
-struct hash<{{enum_name}}>
-    : public mojo::internal::EnumHashImpl<{{enum_name}}> {};
-{%- endmacro %}
-
-{%- macro enum_hash_blink(enum) %}
-{%-   set enum_name = enum|get_qualified_name_for_kind(
-          flatten_nested_kind=True, include_variant=False) %}
-{%-   set hash_fn_name = enum|wtf_hash_fn_name_for_enum %}
-{#    We need two unused enum values: #}
-{%-   set empty_value = -1000000 %}
-{%-   set deleted_value = -1000001 %}
-{%-   set empty_value_unused = "false" if empty_value in enum|all_enum_values else "true" %}
-{%-   set deleted_value_unused = "false" if empty_value in enum|all_enum_values else "true" %}
-namespace WTF {
-struct {{hash_fn_name}} {
-  static unsigned hash(const {{enum_name}}& value) {
-    typedef base::underlying_type<{{enum_name}}>::type utype;
-    return DefaultHash<utype>::Hash().hash(static_cast<utype>(value));
-  }
-  static bool equal(const {{enum_name}}& left, const {{enum_name}}& right) {
-    return left == right;
-  }
-  static const bool safeToCompareToEmptyOrDeleted = true;
-};
-
-template <>
-struct DefaultHash<{{enum_name}}> {
-  using Hash = {{hash_fn_name}};
-};
-
-template <>
-struct HashTraits<{{enum_name}}>
-    : public GenericHashTraits<{{enum_name}}> {
-  static_assert({{empty_value_unused}},
-                "{{empty_value}} is a reserved enum value");
-  static_assert({{deleted_value_unused}},
-                "{{deleted_value}} is a reserved enum value");
-  static const bool hasIsEmptyValueFunction = true;
-  static bool isEmptyValue(const {{enum_name}}& value) {
-    return value == static_cast<{{enum_name}}>({{empty_value}});
-  }
-  static void constructDeletedValue({{enum_name}}& slot, bool) {
-    slot = static_cast<{{enum_name}}>({{deleted_value}});
-  }
-  static bool isDeletedValue(const {{enum_name}}& value) {
-    return value == static_cast<{{enum_name}}>({{deleted_value}});
-  }
-};
-}  // namespace WTF
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/enum_serialization_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/enum_serialization_declaration.tmpl
deleted file mode 100644
index d7d0e5d..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/enum_serialization_declaration.tmpl
+++ /dev/null
@@ -1,29 +0,0 @@
-{%- set mojom_type = enum|get_qualified_name_for_kind(
-        flatten_nested_kind=True) %}
-
-template <>
-struct EnumTraits<{{mojom_type}}, {{mojom_type}}> {
-  static {{mojom_type}} ToMojom({{mojom_type}} input) { return input; }
-  static bool FromMojom({{mojom_type}} input, {{mojom_type}}* output) {
-    *output = input;
-    return true;
-  }
-};
-
-namespace internal {
-
-template <typename MaybeConstUserType>
-struct Serializer<{{mojom_type}}, MaybeConstUserType> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = EnumTraits<{{mojom_type}}, UserType>;
-
-  static void Serialize(UserType input, int32_t* output) {
-    *output = static_cast<int32_t>(Traits::ToMojom(input));
-  }
-
-  static bool Deserialize(int32_t input, UserType* output) {
-    return Traits::FromMojom(static_cast<{{mojom_type}}>(input), output);
-  }
-};
-
-}  // namespace internal
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
deleted file mode 100644
index 7f64974..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
+++ /dev/null
@@ -1,65 +0,0 @@
-{%- import "interface_macros.tmpl" as interface_macros %}
-class {{interface.name}}Proxy;
-
-template <typename ImplRefTraits>
-class {{interface.name}}Stub;
-
-class {{interface.name}}RequestValidator;
-{%- if interface|has_callbacks %}
-class {{interface.name}}ResponseValidator;
-{%- endif %}
-
-class {{export_attribute}} {{interface.name}}
-    : public {{interface.name}}InterfaceBase {
- public:
-  static const char Name_[];
-  static constexpr uint32_t Version_ = {{interface.version}};
-  static constexpr bool PassesAssociatedKinds_ = {% if interface|passes_associated_kinds %}true{% else %}false{% endif %};
-  static constexpr bool HasSyncMethods_ = {% if interface|has_sync_methods %}true{% else %}false{% endif %};
-
-  using Proxy_ = {{interface.name}}Proxy;
-
-  template <typename ImplRefTraits>
-  using Stub_ = {{interface.name}}Stub<ImplRefTraits>;
-
-  using RequestValidator_ = {{interface.name}}RequestValidator;
-{%- if interface|has_callbacks %}
-  using ResponseValidator_ = {{interface.name}}ResponseValidator;
-{%- else %}
-  using ResponseValidator_ = mojo::PassThroughFilter;
-{%- endif %}
-
-{#--- Metadata #}
-  enum MethodMinVersions : uint32_t {
-{%- for method in interface.methods %}
-    k{{method.name}}MinVersion = {{method.min_version|default(0, true)}},
-{%- endfor %}
-  };
-
-{#--- Enums #}
-{%- for enum in interface.enums %}
-  using {{enum.name}} = {{enum|get_name_for_kind(flatten_nested_kind=True)}};
-{%- endfor %}
-
-{#--- Constants #}
-{%- for constant in interface.constants %}
-  static {{constant|format_constant_declaration(nested=True)}};
-{%- endfor %}
-
-{#--- Methods #}
-  virtual ~{{interface.name}}() {}
-
-{%- for method in interface.methods %}
-{%    if method.response_parameters != None %}
-{%-     if method.sync %}
-  // Sync method. This signature is used by the client side; the service side
-  // should implement the signature with callback below.
-  virtual bool {{method.name}}({{interface_macros.declare_sync_method_params("", method)}});
-{%-     endif %}
-
-  using {{method.name}}Callback = {{interface_macros.declare_callback(method,
-      for_blink, use_once_callback)}};
-{%-   endif %}
-  virtual void {{method.name}}({{interface_macros.declare_request_params("", method, use_once_callback)}}) = 0;
-{%- endfor %}
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
deleted file mode 100644
index aba1838..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
+++ /dev/null
@@ -1,448 +0,0 @@
-{%- import "interface_macros.tmpl" as interface_macros %}
-{%- import "struct_macros.tmpl" as struct_macros %}
-
-{%- set class_name = interface.name %}
-{%- set proxy_name = interface.name ~ "Proxy" %}
-{%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %}
-
-{%- macro alloc_params(struct, params, message, description) %}
-  mojo::internal::SerializationContext serialization_context;
-  serialization_context.handles.Swap(({{message}})->mutable_handles());
-  serialization_context.associated_endpoint_handles.swap(
-      *({{message}})->mutable_associated_endpoint_handles());
-  bool success = true;
-{%-   for param in struct.packed.packed_fields_in_ordinal_order %}
-  {{param.field.kind|cpp_wrapper_type}} p_{{param.field.name}}{};
-{%-   endfor %}
-  {{struct.name}}DataView input_data_view({{params}}, &serialization_context);
-  {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}}
-  if (!success) {
-    ReportValidationErrorForMessage(
-        {{message}},
-        mojo::internal::VALIDATION_ERROR_DESERIALIZATION_FAILED,
-        "{{description}} deserializer");
-    return false;
-  }
-{%- endmacro %}
-
-{%- macro pass_params(parameters) %}
-{%-   for param in parameters %}
-std::move(p_{{param.name}})
-{%-     if not loop.last %}, {% endif %}
-{%-   endfor %}
-{%- endmacro %}
-
-{%- macro build_message(struct, input_pattern, struct_display_name,
-                        serialization_context) -%}
-  {{struct_macros.serialize(struct, struct_display_name, input_pattern,
-                            "params", "builder.buffer()",
-                            serialization_context)}}
-  ({{serialization_context}})->handles.Swap(
-      builder.message()->mutable_handles());
-  ({{serialization_context}})->associated_endpoint_handles.swap(
-      *builder.message()->mutable_associated_endpoint_handles());
-{%- endmacro %}
-
-{#--- Begin #}
-const char {{class_name}}::Name_[] = "{{namespace_as_string}}::{{class_name}}";
-
-{#--- Constants #}
-{%-  for constant in interface.constants %}
-{%-   if constant.kind|is_string_kind %}
-const char {{interface.name}}::{{constant.name}}[] = {{constant|constant_value}};
-{%-   endif %}
-{%- endfor %}
-
-
-{%- for method in interface.methods %}
-{%-   if method.sync %}
-bool {{class_name}}::{{method.name}}({{interface_macros.declare_sync_method_params("", method)}}) {
-  NOTREACHED();
-  return false;
-}
-{%-   endif %}
-{%- endfor %}
-
-{#--- ForwardToCallback definition #}
-{%- for method in interface.methods -%}
-{%-   if method.response_parameters != None %}
-{%-     if method.sync %}
-class {{class_name}}_{{method.name}}_HandleSyncResponse
-    : public mojo::MessageReceiver {
- public:
-  {{class_name}}_{{method.name}}_HandleSyncResponse(
-      bool* result
-{%-       for param in method.response_parameters -%}
-      , {{param.kind|cpp_wrapper_type}}* out_{{param.name}}
-{%-       endfor %})
-      : result_(result)
-{%-       for param in method.response_parameters -%}
-        , out_{{param.name}}_(out_{{param.name}})
-{%-       endfor %} {
-    DCHECK(!*result_);
-  }
-  bool Accept(mojo::Message* message) override;
- private:
-  bool* result_;
-{%-       for param in method.response_parameters %}
-  {{param.kind|cpp_wrapper_type}}* out_{{param.name}}_;
-{%-       endfor -%}
-  DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse);
-};
-bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept(
-    mojo::Message* message) {
-  internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
-      reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_Data*>(
-          message->mutable_payload());
-
-{%-       set desc = class_name~"::"~method.name~" response" %}
-  {{alloc_params(method.response_param_struct, "params", "message", desc)}}
-
-{%-       for param in method.response_parameters %}
-  *out_{{param.name}}_ = std::move(p_{{param.name}});
-{%-       endfor %}
-  mojo::internal::SyncMessageResponseSetup::SetCurrentSyncResponseMessage(
-      message);
-  *result_ = true;
-  return true;
-}
-{%-     endif %}
-
-class {{class_name}}_{{method.name}}_ForwardToCallback
-    : public mojo::MessageReceiver {
- public:
-  {{class_name}}_{{method.name}}_ForwardToCallback(
-{%-     if use_once_callback %}
-      {{class_name}}::{{method.name}}Callback callback
-{%-     else %}
-      const {{class_name}}::{{method.name}}Callback& callback
-{%-     endif %}
-      ) : callback_(std::move(callback)) {
-  }
-  bool Accept(mojo::Message* message) override;
- private:
-  {{class_name}}::{{method.name}}Callback callback_;
-  DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback);
-};
-bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
-    mojo::Message* message) {
-  internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
-      reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_Data*>(
-          message->mutable_payload());
-
-{%-     set desc = class_name~"::"~method.name~" response" %}
-  {{alloc_params(method.response_param_struct, "params", "message", desc)}}
-  if (!callback_.is_null()) {
-    mojo::internal::MessageDispatchContext context(message);
-    std::move(callback_).Run({{pass_params(method.response_parameters)}});
-  }
-  return true;
-}
-{%-   endif %}
-{%- endfor %}
-
-{{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver)
-    : receiver_(receiver) {
-}
-
-{#--- Proxy definitions #}
-
-{%- for method in interface.methods %}
-{%-   set message_name =
-          "internal::k%s_%s_Name"|format(interface.name, method.name) %}
-{%-   set params_struct = method.param_struct %}
-{%-   set params_description =
-          "%s.%s request"|format(interface.name, method.name) %}
-{%-   if method.sync %}
-bool {{proxy_name}}::{{method.name}}(
-    {{interface_macros.declare_sync_method_params("param_", method)}}) {
-  mojo::internal::SerializationContext serialization_context;
-  {{struct_macros.get_serialized_size(params_struct, "param_%s",
-                                      "&serialization_context")}}
-
-  mojo::internal::MessageBuilder builder(
-      {{message_name}},
-      mojo::Message::kFlagIsSync | mojo::Message::kFlagExpectsResponse,
-      size, serialization_context.associated_endpoint_count);
-
-  {{build_message(params_struct, "param_%s", params_description,
-                  "&serialization_context")}}
-
-  bool result = false;
-  std::unique_ptr<mojo::MessageReceiver> responder(
-      new {{class_name}}_{{method.name}}_HandleSyncResponse(
-          &result
-{%-     for param in method.response_parameters -%}
-          , param_{{param.name}}
-{%-     endfor %}));
-  ignore_result(receiver_->AcceptWithResponder(builder.message(),
-                                               std::move(responder)));
-  return result;
-}
-{%-   endif %}
-
-void {{proxy_name}}::{{method.name}}(
-    {{interface_macros.declare_request_params("in_", method, use_once_callback)}}) {
-  mojo::internal::SerializationContext serialization_context;
-  {{struct_macros.get_serialized_size(params_struct, "in_%s",
-                                      "&serialization_context")}}
-
-{%- if method.response_parameters != None %}
-  constexpr uint32_t kFlags = mojo::Message::kFlagExpectsResponse;
-{%- else %}
-  constexpr uint32_t kFlags = 0;
-{%- endif %}
-  mojo::internal::MessageBuilder builder(
-      {{message_name}}, kFlags, size,
-      serialization_context.associated_endpoint_count);
-
-  {{build_message(params_struct, "in_%s", params_description,
-                  "&serialization_context")}}
-
-{%- if method.response_parameters != None %}
-  std::unique_ptr<mojo::MessageReceiver> responder(
-      new {{class_name}}_{{method.name}}_ForwardToCallback(
-          std::move(callback)));
-  ignore_result(receiver_->AcceptWithResponder(builder.message(),
-                                               std::move(responder)));
-{%- else %}
-  // This return value may be ignored as false implies the Connector has
-  // encountered an error, which will be visible through other means.
-  ignore_result(receiver_->Accept(builder.message()));
-{%- endif %}
-}
-{%- endfor %}
-
-{#--- ProxyToResponder definition #}
-{%- for method in interface.methods -%}
-{%-   if method.response_parameters != None %}
-{%-     set message_name =
-            "internal::k%s_%s_Name"|format(interface.name, method.name) %}
-{%-     set response_params_struct = method.response_param_struct %}
-{%-     set params_description =
-            "%s.%s response"|format(interface.name, method.name) %}
-class {{class_name}}_{{method.name}}_ProxyToResponder {
- public:
-  static {{class_name}}::{{method.name}}Callback CreateCallback(
-      uint64_t request_id,
-      bool is_sync,
-      std::unique_ptr<mojo::MessageReceiverWithStatus> responder) {
-    std::unique_ptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy(
-        new {{class_name}}_{{method.name}}_ProxyToResponder(
-            request_id, is_sync, std::move(responder)));
-    return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run,
-                      base::Passed(&proxy));
-  }
-
-  ~{{class_name}}_{{method.name}}_ProxyToResponder() {
-#if DCHECK_IS_ON()
-    if (responder_) {
-      // Is the Service destroying the callback without running it
-      // and without first closing the pipe?
-      responder_->DCheckInvalid("The callback passed to "
-          "{{class_name}}::{{method.name}}() was never run.");
-    }
-#endif
-    // If the Callback was dropped then deleting the responder will close
-    // the pipe so the calling application knows to stop waiting for a reply.
-    responder_ = nullptr;
-  }
-
- private:
-  {{class_name}}_{{method.name}}_ProxyToResponder(
-      uint64_t request_id,
-      bool is_sync,
-      std::unique_ptr<mojo::MessageReceiverWithStatus> responder)
-      : request_id_(request_id),
-        is_sync_(is_sync),
-        responder_(std::move(responder)) {
-  }
-
-  void Run(
-      {{interface_macros.declare_responder_params(
-          "in_", method.response_parameters, for_blink)}});
-
-  uint64_t request_id_;
-  bool is_sync_;
-  std::unique_ptr<mojo::MessageReceiverWithStatus> responder_;
-
-  DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder);
-};
-
-void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
-    {{interface_macros.declare_responder_params(
-        "in_", method.response_parameters, for_blink)}}) {
-  mojo::internal::SerializationContext serialization_context;
-  {{struct_macros.get_serialized_size(response_params_struct, "in_%s",
-                                      "&serialization_context")}}
-
-  uint32_t flags = (is_sync_ ? mojo::Message::kFlagIsSync : 0) |
-                   mojo::Message::kFlagIsResponse;
-  mojo::internal::MessageBuilder builder(
-      {{message_name}}, flags, size,
-      serialization_context.associated_endpoint_count);
-  builder.message()->set_request_id(request_id_);
-
-  {{build_message(response_params_struct, "in_%s", params_description,
-                  "&serialization_context")}}
-  ignore_result(responder_->Accept(builder.message()));
-  // TODO(darin): Accept() returning false indicates a malformed message, and
-  // that may be good reason to close the connection. However, we don't have a
-  // way to do that from here. We should add a way.
-  responder_ = nullptr;
-}
-{%-   endif -%}
-{%- endfor %}
-
-{#--- StubDispatch definition #}
-
-// static
-bool {{class_name}}StubDispatch::Accept(
-    {{interface.name}}* impl,
-    mojo::Message* message) {
-{%- if interface.methods %}
-  switch (message->header()->name) {
-{%-   for method in interface.methods %}
-    case internal::k{{class_name}}_{{method.name}}_Name: {
-{%-     if method.response_parameters == None %}
-      internal::{{class_name}}_{{method.name}}_Params_Data* params =
-          reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*>(
-              message->mutable_payload());
-
-{%-       set desc = class_name~"::"~method.name %}
-      {{alloc_params(method.param_struct, "params", "message", desc)|
-          indent(4)}}
-      // A null |impl| means no implementation was bound.
-      assert(impl);
-      TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
-      mojo::internal::MessageDispatchContext context(message);
-      impl->{{method.name}}({{pass_params(method.parameters)}});
-      return true;
-{%-     else %}
-      break;
-{%-     endif %}
-    }
-{%-   endfor %}
-  }
-{%- endif %}
-  return false;
-}
-
-// static
-bool {{class_name}}StubDispatch::AcceptWithResponder(
-    {{interface.name}}* impl,
-    mojo::Message* message,
-    std::unique_ptr<mojo::MessageReceiverWithStatus> responder) {
-{%- if interface.methods %}
-  switch (message->header()->name) {
-{%-   for method in interface.methods %}
-    case internal::k{{class_name}}_{{method.name}}_Name: {
-{%-     if method.response_parameters != None %}
-      internal::{{class_name}}_{{method.name}}_Params_Data* params =
-          reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*>(
-              message->mutable_payload());
-
-{%-       set desc = class_name~"::"~method.name %}
-      {{alloc_params(method.param_struct, "params", "message", desc)|
-          indent(4)}}
-      {{class_name}}::{{method.name}}Callback callback =
-          {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback(
-              message->request_id(),
-              message->has_flag(mojo::Message::kFlagIsSync),
-              std::move(responder));
-      // A null |impl| means no implementation was bound.
-      assert(impl);
-      TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
-      mojo::internal::MessageDispatchContext context(message);
-      impl->{{method.name}}(
-{%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}std::move(callback));
-      return true;
-{%-     else %}
-      break;
-{%-     endif %}
-    }
-{%-   endfor %}
-  }
-{%- endif %}
-  return false;
-}
-
-{#--- Request validator definitions #}
-
-bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
-  if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
-    return true;
-
-  mojo::internal::ValidationContext validation_context(
-    message->payload(), message->payload_num_bytes(),
-    message->handles()->size(), message->payload_num_interface_ids(), message,
-    "{{class_name}} RequestValidator");
-
-  switch (message->header()->name) {
-{%- for method in interface.methods %}
-    case internal::k{{class_name}}_{{method.name}}_Name: {
-{%-   if method.response_parameters != None %}
-      if (!mojo::internal::ValidateMessageIsRequestExpectingResponse(
-              message, &validation_context)) {
-        return false;
-      }
-{%-   else %}
-      if (!mojo::internal::ValidateMessageIsRequestWithoutResponse(
-              message, &validation_context)) {
-        return false;
-      }
-{%-   endif %}
-      if (!mojo::internal::ValidateMessagePayload<
-               internal::{{class_name}}_{{method.name}}_Params_Data>(
-                  message, &validation_context)) {
-        return false;
-      }
-      return true;
-    }
-{%- endfor %}
-    default:
-      break;
-  }
-
-  // Unrecognized message.
-  ReportValidationError(
-      &validation_context,
-      mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
-  return false;
-}
-
-{#--- Response validator definitions #}
-{% if interface|has_callbacks %}
-bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) {
-  if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
-    return true;
-
-  mojo::internal::ValidationContext validation_context(
-    message->payload(), message->payload_num_bytes(),
-    message->handles()->size(), message->payload_num_interface_ids(), message,
-    "{{class_name}} ResponseValidator");
-
-  if (!mojo::internal::ValidateMessageIsResponse(message, &validation_context))
-    return false;
-  switch (message->header()->name) {
-{%- for method in interface.methods if method.response_parameters != None %}
-    case internal::k{{class_name}}_{{method.name}}_Name: {
-      if (!mojo::internal::ValidateMessagePayload<
-               internal::{{class_name}}_{{method.name}}_ResponseParams_Data>(
-                    message, &validation_context)) {
-        return false;
-      }
-      return true;
-    }
-{%- endfor %}
-    default:
-      break;
-  }
-
-  // Unrecognized message.
-  ReportValidationError(
-      &validation_context,
-      mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
-  return false;
-}
-{%- endif -%}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_macros.tmpl
deleted file mode 100644
index 8649273..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_macros.tmpl
+++ /dev/null
@@ -1,49 +0,0 @@
-{%- macro declare_params(prefix, parameters) %}
-{%-   for param in parameters -%}
-{{param.kind|cpp_wrapper_param_type}} {{prefix}}{{param.name}}
-{%- if not loop.last %}, {% endif %}
-{%-   endfor %}
-{%- endmacro %}
-
-{%- macro declare_responder_params(prefix, parameters, for_blink) %}
-{%-   for param in parameters -%}
-{{param.kind|cpp_wrapper_param_type}} {{prefix}}{{param.name}}
-{%- if not loop.last %}, {% endif %}
-{%-   endfor %}
-{%- endmacro %}
-
-{%- macro declare_callback(method, for_blink, use_once_callback) -%}
-{%-   if use_once_callback -%}
-base::OnceCallback<void(
-{%-   else -%}
-base::Callback<void(
-{%-   endif -%}
-{%-   for param in method.response_parameters -%}
-{{param.kind|cpp_wrapper_param_type}}
-{%-     if not loop.last %}, {% endif %}
-{%-   endfor -%}
-)>
-{%- endmacro -%}
-
-{%- macro declare_request_params(prefix, method, use_once_callback) -%}
-{{declare_params(prefix, method.parameters)}}
-{%-   if method.response_parameters != None -%}
-{%-     if method.parameters %}, {% endif -%}
-{%-     if use_once_callback -%}
-{{method.name}}Callback callback
-{%-     else -%}
-const {{method.name}}Callback& callback
-{%-     endif -%}
-{%-   endif -%}
-{%- endmacro -%}
-
-{%- macro declare_sync_method_params(prefix, method) -%}
-{{declare_params(prefix, method.parameters)}}
-{%-   if method.response_parameters %}
-{%-     if method.parameters %}, {% endif %}
-{%-     for param in method.response_parameters -%}
-{{param.kind|cpp_wrapper_type}}* {{prefix}}{{param.name}}
-{%-       if not loop.last %}, {% endif %}
-{%-     endfor %}
-{%-   endif -%}
-{%- endmacro -%}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_proxy_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_proxy_declaration.tmpl
deleted file mode 100644
index 0a158ec..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_proxy_declaration.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-{%- import "interface_macros.tmpl" as interface_macros %}
-class {{export_attribute}} {{interface.name}}Proxy
-    : public {{interface.name}} {
- public:
-  explicit {{interface.name}}Proxy(mojo::MessageReceiverWithResponder* receiver);
-
-{%- for method in interface.methods %}
-{%-   if method.sync %}
-  bool {{method.name}}({{interface_macros.declare_sync_method_params("", method)}}) override;
-{%-   endif %}
-  void {{method.name}}({{interface_macros.declare_request_params("", method, use_once_callback)}}) override;
-{%- endfor %}
-
- private:
-  mojo::MessageReceiverWithResponder* receiver_;
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_request_validator_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_request_validator_declaration.tmpl
deleted file mode 100644
index a00d148..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_request_validator_declaration.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-class {{export_attribute}} {{interface.name}}RequestValidator : public NON_EXPORTED_BASE(mojo::MessageReceiver) {
- public:
-  bool Accept(mojo::Message* message) override;
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_response_validator_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_response_validator_declaration.tmpl
deleted file mode 100644
index e2caa02..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_response_validator_declaration.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-class {{export_attribute}} {{interface.name}}ResponseValidator : public NON_EXPORTED_BASE(mojo::MessageReceiver) {
- public:
-  bool Accept(mojo::Message* message) override;
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_stub_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_stub_declaration.tmpl
deleted file mode 100644
index 79ab46f..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_stub_declaration.tmpl
+++ /dev/null
@@ -1,41 +0,0 @@
-class {{export_attribute}} {{interface.name}}StubDispatch {
- public:
-  static bool Accept({{interface.name}}* impl, mojo::Message* message);
-  static bool AcceptWithResponder(
-      {{interface.name}}* impl,
-      mojo::Message* message,
-      std::unique_ptr<mojo::MessageReceiverWithStatus> responder);
-};
-
-template <typename ImplRefTraits =
-              mojo::RawPtrImplRefTraits<{{interface.name}}>>
-class {{interface.name}}Stub
-    : public NON_EXPORTED_BASE(mojo::MessageReceiverWithResponderStatus) {
- public:
-  using ImplPointerType = typename ImplRefTraits::PointerType;
-
-  {{interface.name}}Stub() {}
-  ~{{interface.name}}Stub() override {}
-
-  void set_sink(ImplPointerType sink) { sink_ = std::move(sink); }
-  ImplPointerType& sink() { return sink_; }
-
-  bool Accept(mojo::Message* message) override {
-    if (ImplRefTraits::IsNull(sink_))
-      return false;
-    return {{interface.name}}StubDispatch::Accept(
-        ImplRefTraits::GetRawPointer(&sink_), message);
-  }
-
-  bool AcceptWithResponder(
-      mojo::Message* message,
-      std::unique_ptr<mojo::MessageReceiverWithStatus> responder) override {
-    if (ImplRefTraits::IsNull(sink_))
-      return false;
-    return {{interface.name}}StubDispatch::AcceptWithResponder(
-        ImplRefTraits::GetRawPointer(&sink_), message, std::move(responder));
-  }
-
- private:
-  ImplPointerType sink_;
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module-shared-internal.h.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module-shared-internal.h.tmpl
deleted file mode 100644
index 964b254..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/module-shared-internal.h.tmpl
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-{%- set header_guard = "%s_SHARED_INTERNAL_H_"|format(
-        module.path|upper|replace("/","_")|replace(".","_")|
-            replace("-", "_")) %}
-
-#ifndef {{header_guard}}
-#define {{header_guard}}
-
-#include <stdint.h>
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/map_data_internal.h"
-#include "mojo/public/cpp/bindings/lib/native_enum_data.h"
-#include "mojo/public/cpp/bindings/lib/native_struct_data.h"
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-
-{%- for import in imports %}
-#include "{{import.module.path}}-shared-internal.h"
-{%- endfor %}
-
-namespace mojo {
-namespace internal {
-class ValidationContext;
-}
-}
-
-{%- for namespace in namespaces_as_array %}
-namespace {{namespace}} {
-{%- endfor %}
-namespace internal {
-
-{#--- Internal forward declarations #}
-{%- for struct in structs %}
-{%-   if struct|is_native_only_kind %}
-using {{struct.name}}_Data = mojo::internal::NativeStruct_Data;
-{%-   else %}
-class {{struct.name}}_Data;
-{%-   endif %}
-{%- endfor %}
-
-{%- for union in unions %}
-class {{union.name}}_Data;
-{%- endfor %}
-
-{#--- Enums #}
-{%- from "enum_macros.tmpl" import enum_data_decl -%}
-{%- for enum in all_enums %}
-{%-   if enum|is_native_only_kind %}
-using {{enum|get_name_for_kind(flatten_nested_kind=True)}}_Data =
-    mojo::internal::NativeEnum_Data;
-{%-   else %}
-{{enum_data_decl(enum)}}
-{%-   endif %}
-{%- endfor %}
-
-#pragma pack(push, 1)
-
-{#--- Unions must be declared first because they can be members of structs #}
-{#--- Union class declarations #}
-{%- for union in unions %}
-{%    include "union_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- Struct class declarations #}
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_declaration.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Interface parameter definitions #}
-{%- for interface in interfaces %}
-{%-   for method in interface.methods %}
-{%-     set method_name = "k%s_%s_Name"|format(interface.name, method.name) %}
-constexpr uint32_t {{method_name}} = {{method.ordinal}};
-{%-     set struct = method.param_struct %}
-{%      include "struct_declaration.tmpl" %}
-{%-     if method.response_parameters != None %}
-{%-       set struct = method.response_param_struct %}
-{%        include "struct_declaration.tmpl" %}
-{%-     endif %}
-{%-   endfor %}
-{%- endfor %}
-
-#pragma pack(pop)
-
-}  // namespace internal
-{%- for namespace in namespaces_as_array|reverse %}
-}  // namespace {{namespace}}
-{%- endfor %}
-
-#endif  // {{header_guard}}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module-shared.cc.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module-shared.cc.tmpl
deleted file mode 100644
index 645bb69..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/module-shared.cc.tmpl
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#if defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable:4065)
-#endif
-
-#include "{{module.path}}-shared.h"
-
-#include <utility>
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/lib/validate_params.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-
-{%- for header in extra_traits_headers %}
-#include "{{header}}"
-{%- endfor %}
-
-{%- for namespace in namespaces_as_array %}
-namespace {{namespace}} {
-{%- endfor %}
-
-namespace internal {
-
-{#--- Union definitions #}
-{%- for union in unions %}
-{%    include "union_definition.tmpl" %}
-{%- endfor %}
-
-{#--- Struct definitions #}
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_definition.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Interface parameter definitions #}
-{%- for interface in interfaces %}
-{%-   for method in interface.methods %}
-{%-     set method_name = "k%s_%s_Name"|format(interface.name, method.name) %}
-{%-     set struct = method.param_struct %}
-{%      include "struct_definition.tmpl" %}
-{%-     if method.response_parameters != None %}
-{%-       set struct = method.response_param_struct %}
-{%        include "struct_definition.tmpl" %}
-{%-     endif %}
-{%-   endfor %}
-{%- endfor %}
-
-}  // namespace internal
-
-{%- for namespace in namespaces_as_array|reverse %}
-}  // namespace {{namespace}}
-{%- endfor %}
-
-#if defined(_MSC_VER)
-#pragma warning(pop)
-#endif
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module-shared.h.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module-shared.h.tmpl
deleted file mode 100644
index dd13466..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/module-shared.h.tmpl
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-{%- set header_guard = "%s_SHARED_H_"|format(
-        module.path|upper|replace("/","_")|replace(".","_")|
-            replace("-", "_")) %}
-
-{%- macro mojom_type_traits(kind) %}
-template <>
-struct MojomTypeTraits<{{kind|get_qualified_name_for_kind}}DataView> {
-  using Data = {{kind|get_qualified_name_for_kind(internal=True)}};
-{%-  if kind|is_union_kind %}
-  using DataAsArrayElement = Data;
-  static constexpr MojomTypeCategory category = MojomTypeCategory::UNION;
-{%-  else %}
-  using DataAsArrayElement = Pointer<Data>;
-  static constexpr MojomTypeCategory category = MojomTypeCategory::STRUCT;
-{%-  endif %}
-};
-{%- endmacro %}
-
-{%- macro namespace_begin() %}
-{%-   for namespace in namespaces_as_array %}
-namespace {{namespace}} {
-{%-   endfor %}
-{%- endmacro %}
-
-{%- macro namespace_end() %}
-{%-   for namespace in namespaces_as_array|reverse %}
-}  // namespace {{namespace}}
-{%-   endfor %}
-{%- endmacro %}
-
-#ifndef {{header_guard}}
-#define {{header_guard}}
-
-#include <stdint.h>
-
-#include <functional>
-#include <ostream>
-#include <type_traits>
-#include <utility>
-
-#include "base/compiler_specific.h"
-#include "mojo/public/cpp/bindings/array_data_view.h"
-#include "mojo/public/cpp/bindings/enum_traits.h"
-#include "mojo/public/cpp/bindings/interface_data_view.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/map_data_view.h"
-#include "mojo/public/cpp/bindings/native_enum.h"
-#include "mojo/public/cpp/bindings/native_struct_data_view.h"
-#include "mojo/public/cpp/bindings/string_data_view.h"
-#include "{{module.path}}-shared-internal.h"
-{%- for import in imports %}
-#include "{{import.module.path}}-shared.h"
-{%- endfor %}
-
-{{namespace_begin()}}
-
-{#--- Struct Forward Declarations -#}
-{%- for struct in structs %}
-{%-   if struct|is_native_only_kind %}
-using {{struct.name}}DataView = mojo::NativeStructDataView;
-{%-   else %}
-class {{struct.name}}DataView;
-{%-   endif %}
-{%  endfor %}
-
-{#--- Union Forward Declarations -#}
-{%- for union in unions %}
-class {{union.name}}DataView;
-{%- endfor %}
-
-{{namespace_end()}}
-
-namespace mojo {
-namespace internal {
-
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{{mojom_type_traits(struct)}}
-{%-   endif %}
-{%- endfor %}
-
-{%- for union in unions %}
-{{mojom_type_traits(union)}}
-{%- endfor %}
-
-}  // namespace internal
-}  // namespace mojo
-
-{{namespace_begin()}}
-
-{#--- Enums #}
-{%- from "enum_macros.tmpl" import enum_decl%}
-{%- for enum in all_enums %}
-{%-   if enum|is_native_only_kind %}
-using {{enum|get_name_for_kind(flatten_nested_kind=True)}} = mojo::NativeEnum;
-{%-   else %}
-{{enum_decl(enum)}}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Interfaces #}
-{%- if interfaces %}
-// Interface base classes. They are used for type safety check.
-{%- endif %}
-{%- for interface in interfaces %}
-class {{interface.name}}InterfaceBase {};
-
-using {{interface.name}}PtrDataView =
-    mojo::InterfacePtrDataView<{{interface.name}}InterfaceBase>;
-using {{interface.name}}RequestDataView =
-    mojo::InterfaceRequestDataView<{{interface.name}}InterfaceBase>;
-using {{interface.name}}AssociatedPtrInfoDataView =
-    mojo::AssociatedInterfacePtrInfoDataView<{{interface.name}}InterfaceBase>;
-using {{interface.name}}AssociatedRequestDataView =
-    mojo::AssociatedInterfaceRequestDataView<{{interface.name}}InterfaceBase>;
-
-{%- endfor %}
-
-{#--- Structs #}
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_data_view_declaration.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Interface parameter definitions #}
-{%- for interface in interfaces %}
-{%-   for method in interface.methods %}
-{%-     set struct = method.param_struct %}
-{%      include "struct_data_view_declaration.tmpl" %}
-{%-     if method.response_parameters != None %}
-{%-       set struct = method.response_param_struct %}
-{%        include "struct_data_view_declaration.tmpl" %}
-{%-     endif %}
-{%-   endfor %}
-{%- endfor %}
-
-{#--- Unions #}
-{%- for union in unions %}
-{%    include "union_data_view_declaration.tmpl" %}
-{%- endfor %}
-
-{{namespace_end()}}
-
-namespace std {
-
-{%- from "enum_macros.tmpl" import enum_hash %}
-{%- for enum in all_enums %}
-{%-   if not enum|is_native_only_kind %}
-{{enum_hash(enum)}}
-{%-   endif %}
-{%- endfor %}
-
-}  // namespace std
-
-namespace mojo {
-
-{#--- Enum Serialization Helpers -#}
-{%- for enum in all_enums %}
-{%-   if not enum|is_native_only_kind %}
-{%      include "enum_serialization_declaration.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Struct Serialization Helpers -#}
-{%  for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_serialization_declaration.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Union Serialization Helpers -#}
-{%  if unions %}
-{%-   for union in unions %}
-{%      include "union_serialization_declaration.tmpl" %}
-{%-   endfor %}
-{%- endif %}
-
-}  // namespace mojo
-
-{{namespace_begin()}}
-
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_data_view_definition.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{%- for interface in interfaces %}
-{%-   for method in interface.methods %}
-{%-     set struct = method.param_struct %}
-{%      include "struct_data_view_definition.tmpl" %}
-{%-     if method.response_parameters != None %}
-{%-       set struct = method.response_param_struct %}
-{%        include "struct_data_view_definition.tmpl" %}
-{%-     endif %}
-{%-   endfor %}
-{%- endfor %}
-
-{%- for union in unions %}
-{%    include "union_data_view_definition.tmpl" %}
-{%- endfor %}
-
-{{namespace_end()}}
-
-#endif  // {{header_guard}}
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
deleted file mode 100644
index 2c66a85..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
+++ /dev/null
@@ -1,111 +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.
-
-{%- if variant -%}
-{%-   set variant_path = "%s-%s"|format(module.path, variant) -%}
-{%- else -%}
-{%-   set variant_path = module.path -%}
-{%- endif %}
-
-#if defined(__clang__)
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-private-field"
-#elif defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable:4056)
-#pragma warning(disable:4065)
-#pragma warning(disable:4756)
-#endif
-
-#include "{{variant_path}}.h"
-
-#include <math.h>
-#include <stdint.h>
-#include <utility>
-
-#include "base/logging.h"
-#include "base/trace_event/trace_event.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/lib/validate_params.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
-
-{%- if for_blink %}
-#include "mojo/public/cpp/bindings/lib/wtf_serialization.h"
-{%- endif %}
-
-{%- for header in extra_traits_headers %}
-#include "{{header}}"
-{%- endfor %}
-
-{%- for namespace in namespaces_as_array %}
-namespace {{namespace}} {
-{%- endfor %}
-{%- if variant %}
-namespace {{variant}} {
-{%- endif %}
-
-{#--- Constants #}
-{%- for constant in module.constants %}
-{%-   if constant.kind|is_string_kind %}
-const char {{constant.name}}[] = {{constant|constant_value}};
-{%-   endif %}
-{%- endfor %}
-
-{#--- Struct Constants #}
-{%- for struct in structs %}
-{%-   for constant in struct.constants %}
-{%-     if constant.kind|is_string_kind %}
-const char {{struct.name}}::{{constant.name}}[] = {{constant|constant_value}};
-{%-     endif %}
-{%-   endfor %}
-{%- endfor %}
-
-{#--- Struct builder definitions #}
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%-     include "wrapper_class_definition.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Union builder definitions #}
-{%- for union in unions %}
-{%-   include "wrapper_union_class_definition.tmpl" %}
-{%- endfor %}
-
-{#--- Interface definitions #}
-{%- for interface in interfaces %}
-{%-   include "interface_definition.tmpl" %}
-{%- endfor %}
-
-{%- if variant %}
-}  // namespace {{variant}}
-{%- endif %}
-{%- for namespace in namespaces_as_array|reverse %}
-}  // namespace {{namespace}}
-{%- endfor %}
-
-namespace mojo {
-
-{#--- Struct Serialization Helpers -#}
-{%  for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_traits_definition.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Union Serialization Helpers #}
-{%- for union in unions %}
-{%-   include "union_traits_definition.tmpl" %}
-{%- endfor %}
-
-}  // namespace mojo
-
-#if defined(__clang__)
-#pragma clang diagnostic pop
-#elif defined(_MSC_VER)
-#pragma warning(pop)
-#endif
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl
deleted file mode 100644
index 804a46b..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl
+++ /dev/null
@@ -1,236 +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.
-
-{%- if variant -%}
-{%-   set variant_path = "%s-%s"|format(module.path, variant) -%}
-{%- else -%}
-{%-   set variant_path = module.path -%}
-{%- endif -%}
-
-{%- set header_guard = "%s_H_"|format(
-        variant_path|upper|replace("/","_")|replace(".","_")|
-            replace("-", "_")) %}
-
-{%- macro namespace_begin() %}
-{%-   for namespace in namespaces_as_array %}
-namespace {{namespace}} {
-{%-   endfor %}
-{%-   if variant %}
-namespace {{variant}} {
-{%-   endif %}
-{%- endmacro %}
-
-{%- macro namespace_end() %}
-{%-   if variant %}
-}  // namespace {{variant}}
-{%-   endif %}
-{%-   for namespace in namespaces_as_array|reverse %}
-}  // namespace {{namespace}}
-{%-   endfor %}
-{%- endmacro %}
-
-#ifndef {{header_guard}}
-#define {{header_guard}}
-
-#include <stdint.h>
-
-#include <limits>
-#include <type_traits>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/clone_traits.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/lib/equals_traits.h"
-#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
-#include "mojo/public/cpp/bindings/lib/control_message_proxy.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/union_accessor.h"
-#include "mojo/public/cpp/bindings/native_struct.h"
-#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"
-#include "mojo/public/cpp/bindings/struct_ptr.h"
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"
-#include "mojo/public/cpp/bindings/union_traits.h"
-#include "{{module.path}}-shared.h"
-{%- for import in imports %}
-{%-   if variant %}
-#include "{{"%s-%s.h"|format(import.module.path, variant)}}"
-{%-   else %}
-#include "{{import.module.path}}.h"
-{%-   endif %}
-{%- endfor %}
-{%- if not for_blink %}
-#include <string>
-#include <vector>
-{%- else %}
-{# hash_util.h includes template specializations that should be present for
-   every use of {Inlined}StructPtr. #}
-#include "mojo/public/cpp/bindings/lib/wtf_hash_util.h"
-#include "third_party/WebKit/Source/wtf/HashFunctions.h"
-#include "third_party/WebKit/Source/wtf/Optional.h"
-#include "third_party/WebKit/Source/wtf/text/WTFString.h"
-{%- endif %}
-
-{%- for header in extra_public_headers %}
-#include "{{header}}"
-{%- endfor %}
-
-{%- if export_header %}
-#include "{{export_header}}"
-{%- endif %}
-
-{#--- WTF enum hashing #}
-{%- from "enum_macros.tmpl" import enum_hash_blink%}
-{%- if for_blink %}
-{%-   for enum in all_enums %}
-{%-     if not enum|is_native_only_kind %}
-{{enum_hash_blink(enum)}}
-{%-     endif %}
-{%-   endfor %}
-{%- endif %}
-
-{{namespace_begin()}}
-
-{#--- Enums #}
-{%- if variant %}
-{%-   for enum in enums %}
-using {{enum.name}} = {{enum.name}};  // Alias for definition in the parent namespace.
-{%-   endfor %}
-{%- endif %}
-
-{#--- Constants #}
-{%- for constant in module.constants %}
-{{constant|format_constant_declaration}};
-{%- endfor %}
-
-{#--- Interface Forward Declarations -#}
-{%  for interface in interfaces %}
-class {{interface.name}};
-using {{interface.name}}Ptr = mojo::InterfacePtr<{{interface.name}}>;
-using {{interface.name}}PtrInfo = mojo::InterfacePtrInfo<{{interface.name}}>;
-using ThreadSafe{{interface.name}}Ptr =
-    mojo::ThreadSafeInterfacePtr<{{interface.name}}>;
-using {{interface.name}}Request = mojo::InterfaceRequest<{{interface.name}}>;
-using {{interface.name}}AssociatedPtr =
-    mojo::AssociatedInterfacePtr<{{interface.name}}>;
-using ThreadSafe{{interface.name}}AssociatedPtr =
-    mojo::ThreadSafeAssociatedInterfacePtr<{{interface.name}}>;
-using {{interface.name}}AssociatedPtrInfo =
-    mojo::AssociatedInterfacePtrInfo<{{interface.name}}>;
-using {{interface.name}}AssociatedRequest =
-    mojo::AssociatedInterfaceRequest<{{interface.name}}>;
-{%  endfor %}
-
-{#--- Struct Forward Declarations -#}
-{%  for struct in structs %}
-{%-   if struct|is_native_only_kind %}
-using {{struct.name}} = mojo::NativeStruct;
-using {{struct.name}}Ptr = mojo::NativeStructPtr;
-{%-   else %}
-class {{struct.name}};
-{%-     if struct|should_inline %}
-using {{struct.name}}Ptr = mojo::InlinedStructPtr<{{struct.name}}>;
-{%-     else %}
-using {{struct.name}}Ptr = mojo::StructPtr<{{struct.name}}>;
-{%-     endif %}
-{%-   endif %}
-{%  endfor %}
-
-{#--- Union Forward Declarations -#}
-{%  for union in unions %}
-class {{union.name}};
-{%    if union|should_inline_union %}
-typedef mojo::InlinedStructPtr<{{union.name}}> {{union.name}}Ptr;
-{%    else %}
-typedef mojo::StructPtr<{{union.name}}> {{union.name}}Ptr;
-{%    endif %}
-{%- endfor %}
-
-{#--- Interfaces -#}
-{%  for interface in interfaces %}
-{%    include "interface_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- Interface Proxies -#}
-{%  for interface in interfaces %}
-{%    include "interface_proxy_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- Interface Stubs -#}
-{%  for interface in interfaces %}
-{%    include "interface_stub_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- Interface Request Validators -#}
-{%  for interface in interfaces %}
-{%    include "interface_request_validator_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- Interface Response Validators -#}
-{%  for interface in interfaces if interface|has_callbacks %}
-{%    include "interface_response_validator_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- NOTE: Unions and non-inlined structs may have pointers to inlined structs,
-      so we need to fully define inlined structs ahead of the others. #}
-
-{#--- Inlined structs #}
-{%  for struct in structs %}
-{%    if struct|should_inline and not struct|is_native_only_kind %}
-{%      include "wrapper_class_declaration.tmpl" %}
-{%    endif %}
-{%- endfor %}
-
-{#--- Unions must be declared before non-inlined structs because they can be
-      members of structs. #}
-{#--- Unions #}
-{%  for union in unions %}
-{%    include "wrapper_union_class_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- Non-inlined structs #}
-{%  for struct in structs %}
-{%    if not struct|should_inline and not struct|is_native_only_kind %}
-{%      include "wrapper_class_declaration.tmpl" %}
-{%    endif %}
-{%- endfor %}
-
-{%- for union in unions %}
-{%    include "wrapper_union_class_template_definition.tmpl" %}
-{%- endfor %}
-
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "wrapper_class_template_definition.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{{namespace_end()}}
-
-namespace mojo {
-
-{#--- Struct Serialization Helpers -#}
-{%  for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_traits_declaration.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Union Serialization Helpers -#}
-{%  if unions %}
-{%-   for union in unions %}
-{%      include "union_traits_declaration.tmpl" %}
-{%-   endfor %}
-{%- endif %}
-
-}  // namespace mojo
-
-#endif  // {{header_guard}}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_declaration.tmpl
deleted file mode 100644
index 96e0d61..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_declaration.tmpl
+++ /dev/null
@@ -1,118 +0,0 @@
-class {{struct.name}}DataView {
- public:
-  {{struct.name}}DataView() {}
-
-  {{struct.name}}DataView(
-      internal::{{struct.name}}_Data* data,
-      mojo::internal::SerializationContext* context)
-{%- if struct|requires_context_for_data_view %}
-      : data_(data), context_(context) {}
-{%- else %}
-      : data_(data) {}
-{%- endif %}
-
-  bool is_null() const { return !data_; }
-
-{%- for pf in struct.packed.packed_fields_in_ordinal_order %}
-{%-   set kind = pf.field.kind %}
-{%-   set name = pf.field.name %}
-{%-   if kind|is_union_kind %}
-  inline void Get{{name|under_to_camel}}DataView(
-      {{kind|cpp_data_view_type}}* output);
-
-  template <typename UserType>
-  WARN_UNUSED_RESULT bool Read{{name|under_to_camel}}(UserType* output) {
-{%-     if pf.min_version != 0 %}
-    auto* pointer = data_->header_.version >= {{pf.min_version}}
-                    ? &data_->{{name}} : nullptr;
-{%-     else %}
-    auto* pointer = &data_->{{name}};
-{%-     endif %}
-    return mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-        pointer, output, context_);
-  }
-
-{%-   elif kind|is_object_kind %}
-  inline void Get{{name|under_to_camel}}DataView(
-      {{kind|cpp_data_view_type}}* output);
-
-  template <typename UserType>
-  WARN_UNUSED_RESULT bool Read{{name|under_to_camel}}(UserType* output) {
-{%-     if pf.min_version != 0 %}
-    auto* pointer = data_->header_.version >= {{pf.min_version}}
-                    ? data_->{{name}}.Get() : nullptr;
-{%-     else %}
-    auto* pointer = data_->{{name}}.Get();
-{%-     endif %}
-    return mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-        pointer, output, context_);
-  }
-
-{%-   elif kind|is_enum_kind %}
-  template <typename UserType>
-  WARN_UNUSED_RESULT bool Read{{name|under_to_camel}}(UserType* output) const {
-{%-     if pf.min_version != 0 %}
-    auto data_value = data_->header_.version >= {{pf.min_version}}
-                      ? data_->{{name}} : 0;
-{%-     else %}
-    auto data_value = data_->{{name}};
-{%-     endif %}
-    return mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-        data_value, output);
-  }
-
-  {{kind|cpp_data_view_type}} {{name}}() const {
-{%-     if pf.min_version != 0 %}
-    if (data_->header_.version < {{pf.min_version}})
-      return {{kind|get_qualified_name_for_kind}}{};
-{%-     endif %}
-    return static_cast<{{kind|cpp_data_view_type}}>(data_->{{name}});
-  }
-
-{%-   elif kind|is_any_handle_kind %}
-  {{kind|cpp_data_view_type}} Take{{name|under_to_camel}}() {
-    {{kind|cpp_data_view_type}} result;
-{%-     if pf.min_version != 0 %}
-    if (data_->header_.version < {{pf.min_version}})
-      return result;
-{%-     endif %}
-    bool ret =
-        mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-            &data_->{{name}}, &result, context_);
-    DCHECK(ret);
-    return result;
-  }
-
-{%-   elif kind|is_any_interface_kind %}
-  template <typename UserType>
-  UserType Take{{name|under_to_camel}}() {
-    UserType result;
-{%-     if pf.min_version != 0 %}
-    if (data_->header_.version < {{pf.min_version}})
-      return result;
-{%-     endif %}
-    bool ret =
-        mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-            &data_->{{name}}, &result, context_);
-    DCHECK(ret);
-    return result;
-  }
-
-{%-   else %}
-  {{kind|cpp_data_view_type}} {{name}}() const {
-{%-     if pf.min_version != 0 %}
-    if (data_->header_.version < {{pf.min_version}})
-      return {{kind|cpp_data_view_type}}{};
-{%-     endif %}
-    return data_->{{name}};
-  }
-
-{%-   endif %}
-{%- endfor %}
- private:
-  internal::{{struct.name}}_Data* data_ = nullptr;
-{%- if struct|requires_context_for_data_view %}
-  mojo::internal::SerializationContext* context_ = nullptr;
-{%- endif %}
-};
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_definition.tmpl
deleted file mode 100644
index 95311dc..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_definition.tmpl
+++ /dev/null
@@ -1,30 +0,0 @@
-{%- for pf in struct.packed.packed_fields_in_ordinal_order %}
-{%-   set kind = pf.field.kind %}
-{%-   set name = pf.field.name %}
-
-{%-   if kind|is_union_kind %}
-inline void {{struct.name}}DataView::Get{{name|under_to_camel}}DataView(
-    {{kind|cpp_data_view_type}}* output) {
-{%-     if pf.min_version != 0 %}
-  auto pointer = data_->header_.version >= {{pf.min_version}}
-                 ? &data_->{{name}} : nullptr;
-{%-     else %}
-  auto pointer = &data_->{{name}};
-{%-     endif %}
-  *output = {{kind|cpp_data_view_type}}(pointer, context_);
-}
-
-{%-   elif kind|is_object_kind %}
-inline void {{struct.name}}DataView::Get{{name|under_to_camel}}DataView(
-    {{kind|cpp_data_view_type}}* output) {
-{%-     if pf.min_version != 0 %}
-  auto pointer = data_->header_.version >= {{pf.min_version}}
-                 ? data_->{{name}}.Get() : nullptr;
-{%-     else %}
-  auto pointer = data_->{{name}}.Get();
-{%-     endif %}
-  *output = {{kind|cpp_data_view_type}}(pointer, context_);
-}
-{%-   endif %}
-{%- endfor %}
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_declaration.tmpl
deleted file mode 100644
index 156f774..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_declaration.tmpl
+++ /dev/null
@@ -1,46 +0,0 @@
-{%- set class_name = struct.name ~ "_Data" -%}
-
-class {{class_name}} {
- public:
-  static {{class_name}}* New(mojo::internal::Buffer* buf) {
-    return new (buf->Allocate(sizeof({{class_name}}))) {{class_name}}();
-  }
-
-  static bool Validate(const void* data,
-                       mojo::internal::ValidationContext* validation_context);
-
-  mojo::internal::StructHeader header_;
-{%- for packed_field in struct.packed.packed_fields %}
-{%-   set name = packed_field.field.name %}
-{%-   set kind = packed_field.field.kind %}
-{%-   if kind.spec == 'b' %}
-  uint8_t {{name}} : 1;
-{%-   else %}
-  {{kind|cpp_field_type}} {{name}};
-{%-   endif %}
-{%-   if not loop.last %}
-{%-     set next_pf = struct.packed.packed_fields[loop.index0 + 1] %}
-{%-     set pad = next_pf.offset - (packed_field.offset + packed_field.size) %}
-{%-     if pad > 0 %}
-  uint8_t pad{{loop.index0}}_[{{pad}}];
-{%-     endif %}
-{%-   endif %}
-{%- endfor %}
-
-{%- set num_fields = struct.versions[-1].num_fields %}
-{%- if num_fields > 0 %}
-{%-   set last_field = struct.packed.packed_fields[num_fields - 1] %}
-{%-   set offset = last_field.offset + last_field.size %}
-{%-   set pad = offset|get_pad(8) %}
-{%-   if pad > 0 %}
-  uint8_t padfinal_[{{pad}}];
-{%-   endif %}
-{%- endif %}
-
- private:
-  {{class_name}}() : header_({sizeof(*this), {{struct.versions[-1].version}}}) {
-  }
-  ~{{class_name}}() = delete;
-};
-static_assert(sizeof({{class_name}}) == {{struct.versions[-1].num_bytes}},
-              "Bad sizeof({{class_name}})");
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl
deleted file mode 100644
index 60dca40..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl
+++ /dev/null
@@ -1,70 +0,0 @@
-{%- import "validation_macros.tmpl" as validation_macros %}
-{%- set class_name = struct.name ~ "_Data" %}
-
-// static
-bool {{class_name}}::Validate(
-    const void* data,
-    mojo::internal::ValidationContext* validation_context) {
-  if (!data)
-    return true;
-
-  if (!ValidateStructHeaderAndClaimMemory(data, validation_context))
-    return false;
-
-  // NOTE: The memory backing |object| may be smaller than |sizeof(*object)| if
-  // the message comes from an older version.
-  const {{class_name}}* object = static_cast<const {{class_name}}*>(data);
-
-  static constexpr struct {
-    uint32_t version;
-    uint32_t num_bytes;
-  } kVersionSizes[] = {
-{%- for version in struct.versions -%}
-    { {{version.version}}, {{version.num_bytes}} }{% if not loop.last %}, {% endif -%}
-{%- endfor -%}
-  };
-
-  if (object->header_.version <=
-          kVersionSizes[arraysize(kVersionSizes) - 1].version) {
-    // Scan in reverse order to optimize for more recent versions.
-    for (int i = arraysize(kVersionSizes) - 1; i >= 0; --i) {
-      if (object->header_.version >= kVersionSizes[i].version) {
-        if (object->header_.num_bytes == kVersionSizes[i].num_bytes)
-          break;
-
-        ReportValidationError(
-            validation_context,
-            mojo::internal::VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
-        return false;
-      }
-    }
-  } else if (object->header_.num_bytes <
-                 kVersionSizes[arraysize(kVersionSizes) - 1].num_bytes) {
-    ReportValidationError(
-        validation_context,
-        mojo::internal::VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
-    return false;
-  }
-
-{#- Before validating fields introduced at a certain version, we need to add
-    a version check, which makes sure we skip further validation if |object|
-    is from an earlier version. |last_checked_version| records the last
-    version that we have added such version check. #}
-{%- set last_checked_version = 0 %}
-{%- for packed_field in struct.packed.packed_fields_in_ordinal_order %}
-{%-   set kind = packed_field.field.kind %}
-{%-   if kind|is_object_kind or kind|is_any_handle_or_interface_kind or
-         kind|is_enum_kind %}
-{%-     if packed_field.min_version > last_checked_version %}
-{%-       set last_checked_version = packed_field.min_version %}
-  if (object->header_.version < {{packed_field.min_version}})
-    return true;
-{%-     endif %}
-{%-     set field_expr = "object->" ~ packed_field.field.name %}
-{{validation_macros.validate_field(packed_field.field, field_expr, struct.name, true)}}
-{%-   endif %}
-{%- endfor %}
-
-  return true;
-}
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
deleted file mode 100644
index bb5fb9c..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
+++ /dev/null
@@ -1,161 +0,0 @@
-{#  TODO(yzshen): Make these templates more readable. #}
-
-{#  Computes the serialized size for the specified struct.
-    |struct| is the struct definition.
-    |input_field_pattern| should be a pattern that contains one string
-    placeholder, for example, "input->%s", "p_%s". The placeholder will be
-    substituted with struct field names to refer to the input fields.
-    |context| is the name of the serialization context.
-    |input_may_be_temp| indicates whether any input may be temporary obejcts.
-    We need to assign temporary objects to local variables before passing it to
-    Serializer, because it is illegal to pass temporary objects as non-const
-    references.
-    This macro is expanded to compute seriailized size for both:
-    - user-defined structs: the input is an instance of the corresponding struct
-      wrapper class.
-    - method parameters/response parameters: the input is a list of
-      arguments.
-    It declares |size| of type size_t to store the resulting size. #}
-{%- macro get_serialized_size(struct, input_field_pattern, context,
-                              input_may_be_temp=False) -%}
-  size_t size = sizeof({{struct|get_qualified_name_for_kind(internal=True)}});
-{%-   for pf in struct.packed.packed_fields_in_ordinal_order
-          if pf.field.kind|is_object_kind or pf.field.kind|is_associated_kind %}
-{%-     set name = pf.field.name -%}
-{%-     set kind = pf.field.kind -%}
-{%-     set original_input_field = input_field_pattern|format(name) %}
-{%-     set input_field = "in_%s"|format(name) if input_may_be_temp
-                                               else original_input_field %}
-{%-     if input_may_be_temp %}
-  decltype({{original_input_field}}) in_{{name}} = {{original_input_field}};
-{%-     endif %}
-
-{%-     set serializer_type = kind|unmapped_type_for_serializer %}
-{%-     if kind|is_union_kind %}
-  size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
-      {{input_field}}, true, {{context}});
-{%-     else %}
-  size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
-      {{input_field}}, {{context}});
-{%-     endif %}
-{%-   endfor %}
-{%- endmacro -%}
-
-{#  Serializes the specified struct.
-    |struct| is the struct definition.
-    |struct_display_name| is the display name for the struct that can be showed
-    in error/log messages, for example, "FooStruct", "FooMethod request".
-    |input_field_pattern| should be a pattern that contains one string
-    placeholder, for example, "input->%s", "p_%s". The placeholder will be
-    substituted with struct field names to refer to the input fields.
-    |output| is the name of the output struct instance.
-    |buffer| is the name of the Buffer instance used.
-    |context| is the name of the serialization context.
-    |input_may_be_temp|: please see the comments of get_serialized_size.
-    This macro is expanded to do serialization for both:
-    - user-defined structs: the input is an instance of the corresponding struct
-      wrapper class.
-    - method parameters/response parameters: the input is a list of
-      arguments. #}
-{%- macro serialize(struct, struct_display_name, input_field_pattern, output,
-                    buffer, context, input_may_be_temp=False) -%}
-  auto {{output}} =
-      {{struct|get_qualified_name_for_kind(internal=True)}}::New({{buffer}});
-  ALLOW_UNUSED_LOCAL({{output}});
-{%- for pf in struct.packed.packed_fields_in_ordinal_order %}
-{%-   set input_field = input_field_pattern|format(pf.field.name) %}
-{%-   set name = pf.field.name %}
-{%-   set kind = pf.field.kind %}
-{%-   set serializer_type = kind|unmapped_type_for_serializer %}
-
-{%-   if kind|is_object_kind or kind|is_any_handle_or_interface_kind %}
-{%-     set original_input_field = input_field_pattern|format(name) %}
-{%-     set input_field = "in_%s"|format(name) if input_may_be_temp
-                                               else original_input_field %}
-{%-     if input_may_be_temp %}
-  decltype({{original_input_field}}) in_{{name}} = {{original_input_field}};
-{%-     endif %}
-{%-   endif %}
-
-{%-   if kind|is_object_kind %}
-{%-     if kind|is_array_kind or kind|is_map_kind %}
-  typename decltype({{output}}->{{name}})::BaseType* {{name}}_ptr;
-  const mojo::internal::ContainerValidateParams {{name}}_validate_params(
-      {{kind|get_container_validate_params_ctor_args|indent(10)}});
-  mojo::internal::Serialize<{{serializer_type}}>(
-      {{input_field}}, {{buffer}}, &{{name}}_ptr, &{{name}}_validate_params,
-      {{context}});
-  {{output}}->{{name}}.Set({{name}}_ptr);
-{%-     elif kind|is_union_kind %}
-  auto {{name}}_ptr = &{{output}}->{{name}};
-  mojo::internal::Serialize<{{serializer_type}}>(
-      {{input_field}}, {{buffer}}, &{{name}}_ptr, true, {{context}});
-{%-     else %}
-  typename decltype({{output}}->{{name}})::BaseType* {{name}}_ptr;
-  mojo::internal::Serialize<{{serializer_type}}>(
-      {{input_field}}, {{buffer}}, &{{name}}_ptr, {{context}});
-  {{output}}->{{name}}.Set({{name}}_ptr);
-{%-     endif %}
-{%-     if not kind|is_nullable_kind %}
-  MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-      {{output}}->{{name}}.is_null(),
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-      "null {{name}} in {{struct_display_name}}");
-{%-     endif %}
-
-{%-   elif kind|is_any_handle_or_interface_kind %}
-  mojo::internal::Serialize<{{serializer_type}}>(
-      {{input_field}}, &{{output}}->{{name}}, {{context}});
-{%-     if not kind|is_nullable_kind %}
-  MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-      !mojo::internal::IsHandleOrInterfaceValid({{output}}->{{name}}),
-{%-       if kind|is_associated_kind %}
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID,
-{%-       else %}
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-{%-       endif %}
-      "invalid {{name}} in {{struct_display_name}}");
-{%-     endif %}
-
-{%-   elif kind|is_enum_kind %}
-  mojo::internal::Serialize<{{serializer_type}}>(
-      {{input_field}}, &{{output}}->{{name}});
-
-{%-   else %}
-  {{output}}->{{name}} = {{input_field}};
-{%-   endif %}
-{%- endfor %}
-{%- endmacro -%}
-
-{#  Deserializes the specified struct.
-    |struct| is the struct definition.
-    |input| is the name of the input struct data view. It is expected to be
-    non-null.
-    |output_field_pattern| should be a pattern that contains one string
-    placeholder, for example, "result->%s", "p_%s". The placeholder will be
-    substituted with struct field names to refer to the output fields.
-    |context| is the name of the serialization context.
-    |success| is the name of a bool variable to track success of the operation.
-    This macro is expanded to do deserialization for both:
-    - user-defined structs: the output is an instance of the corresponding
-      struct wrapper class.
-    - method parameters/response parameters: the output is a list of
-      arguments. #}
-{%- macro deserialize(struct, input, output_field_pattern, success) -%}
-{%-   for pf in struct.packed.packed_fields_in_ordinal_order %}
-{%-     set output_field = output_field_pattern|format(pf.field.name) %}
-{%-     set name = pf.field.name %}
-{%-     set kind = pf.field.kind %}
-{%-     if kind|is_object_kind or kind|is_enum_kind %}
-  if (!{{input}}.Read{{name|under_to_camel}}(&{{output_field}}))
-    {{success}} = false;
-{%-     elif kind|is_any_handle_kind %}
-  {{output_field}} = {{input}}.Take{{name|under_to_camel}}();
-{%-     elif kind|is_any_interface_kind %}
-  {{output_field}} =
-      {{input}}.Take{{name|under_to_camel}}<decltype({{output_field}})>();
-{%-     else %}
-  {{output_field}} = {{input}}.{{name}}();
-{%-     endif %}
-{%-   endfor %}
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
deleted file mode 100644
index 835178b..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
+++ /dev/null
@@ -1,57 +0,0 @@
-{%- import "struct_macros.tmpl" as struct_macros %}
-{%- set data_view = struct|get_qualified_name_for_kind ~ "DataView" %}
-{%- set data_type = struct|get_qualified_name_for_kind(internal=True) %}
-
-namespace internal {
-
-template <typename MaybeConstUserType>
-struct Serializer<{{data_view}}, MaybeConstUserType> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = StructTraits<{{data_view}}, UserType>;
-
-  static size_t PrepareToSerialize(MaybeConstUserType& input,
-                                   SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input))
-      return 0;
-
-    void* custom_context = CustomContextHelper<Traits>::SetUp(input, context);
-    ALLOW_UNUSED_LOCAL(custom_context);
-
-    {{struct_macros.get_serialized_size(
-          struct, "CallWithContext(Traits::%s, input, custom_context)",
-          "context", True)|indent(2)}}
-    return size;
-  }
-
-  static void Serialize(MaybeConstUserType& input,
-                        Buffer* buffer,
-                        {{data_type}}** output,
-                        SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input)) {
-      *output = nullptr;
-      return;
-    }
-
-    void* custom_context = CustomContextHelper<Traits>::GetNext(context);
-
-    {{struct_macros.serialize(
-          struct, struct.name ~ " struct",
-          "CallWithContext(Traits::%s, input, custom_context)", "result",
-          "buffer", "context", True)|indent(2)}}
-    *output = result;
-
-    CustomContextHelper<Traits>::TearDown(input, custom_context);
-  }
-
-  static bool Deserialize({{data_type}}* input,
-                          UserType* output,
-                          SerializationContext* context) {
-    if (!input)
-      return CallSetToNullIfExists<Traits>(output);
-
-    {{data_view}} data_view(input, context);
-    return Traits::Read(data_view, output);
-  }
-};
-
-}  // namespace internal
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_declaration.tmpl
deleted file mode 100644
index 1b7cf89..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_declaration.tmpl
+++ /dev/null
@@ -1,32 +0,0 @@
-{%- set mojom_type = struct|get_qualified_name_for_kind %}
-
-template <>
-struct {{export_attribute}} StructTraits<{{mojom_type}}::DataView,
-                                         {{mojom_type}}Ptr> {
-  static bool IsNull(const {{mojom_type}}Ptr& input) { return !input; }
-  static void SetToNull({{mojom_type}}Ptr* output) { output->reset(); }
-
-{%- for field in struct.fields %}
-{%-   set return_ref = field.kind|is_object_kind or
-  field.kind|is_any_handle_or_interface_kind %}
-{#    We want the field accessor to be const whenever possible to allow
-      structs to be used as map keys.
-      TODO(tibell): Make this check more precise to deal with e.g.
-          custom types which don't contain handles but require non-const
-          reference for serialization. #}
-{%-   set maybe_const = "" if field.kind|contains_handles_or_interfaces else "const" %}
-{%-   if return_ref %}
-  static {{maybe_const}} decltype({{mojom_type}}::{{field.name}})& {{field.name}}(
-      {{maybe_const}} {{mojom_type}}Ptr& input) {
-    return input->{{field.name}};
-  }
-{%-   else %}
-  static decltype({{mojom_type}}::{{field.name}}) {{field.name}}(
-      const {{mojom_type}}Ptr& input) {
-    return input->{{field.name}};
-  }
-{%-   endif %}
-{%- endfor %}
-
-  static bool Read({{mojom_type}}::DataView input, {{mojom_type}}Ptr* output);
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_definition.tmpl
deleted file mode 100644
index f84337f..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_definition.tmpl
+++ /dev/null
@@ -1,14 +0,0 @@
-{%- import "struct_macros.tmpl" as struct_macros %}
-{%- set mojom_type = struct|get_qualified_name_for_kind %}
-
-// static
-bool StructTraits<{{mojom_type}}::DataView, {{mojom_type}}Ptr>::Read(
-    {{mojom_type}}::DataView input,
-    {{mojom_type}}Ptr* output) {
-  bool success = true;
-  {{mojom_type}}Ptr result({{mojom_type}}::New());
-  {{struct_macros.deserialize(struct, "input", "result->%s",
-                              "success")|indent(4)}}
-  *output = std::move(result);
-  return success;
-}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_data_view_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_data_view_declaration.tmpl
deleted file mode 100644
index 5973ba2..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_data_view_declaration.tmpl
+++ /dev/null
@@ -1,92 +0,0 @@
-class {{union.name}}DataView {
- public:
-  using Tag = internal::{{union.name}}_Data::{{union.name}}_Tag;
-
-  {{union.name}}DataView() {}
-
-  {{union.name}}DataView(
-      internal::{{union.name}}_Data* data,
-      mojo::internal::SerializationContext* context)
-{%- if union|requires_context_for_data_view %}
-      : data_(data), context_(context) {}
-{%- else %}
-      : data_(data) {}
-{%- endif %}
-
-  bool is_null() const {
-    // For inlined unions, |data_| is always non-null. In that case we need to
-    // check |data_->is_null()|.
-    return !data_ || data_->is_null();
-  }
-
-  Tag tag() const { return data_->tag; }
-
-{%- for field in union.fields %}
-{%-   set kind = field.kind %}
-{%-   set name = field.name %}
-  bool is_{{name}}() const { return data_->tag == Tag::{{name|upper}}; }
-
-{%-   if kind|is_object_kind %}
-  inline void Get{{name|under_to_camel}}DataView(
-      {{kind|cpp_data_view_type}}* output);
-
-  template <typename UserType>
-  WARN_UNUSED_RESULT bool Read{{name|under_to_camel}}(UserType* output) {
-    DCHECK(is_{{name}}());
-    return mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-        data_->data.f_{{name}}.Get(), output, context_);
-  }
-
-{%-   elif kind|is_enum_kind %}
-  template <typename UserType>
-  WARN_UNUSED_RESULT bool Read{{name|under_to_camel}}(UserType* output) const {
-    DCHECK(is_{{name}}());
-    return mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-        data_->data.f_{{name}}, output);
-  }
-
-  {{kind|cpp_data_view_type}} {{name}}() const {
-    DCHECK(is_{{name}}());
-    return static_cast<{{kind|cpp_data_view_type}}>(
-        data_->data.f_{{name}});
-  }
-
-{%-   elif kind|is_any_handle_kind %}
-  {{kind|cpp_data_view_type}} Take{{name|under_to_camel}}() {
-    DCHECK(is_{{name}}());
-    {{kind|cpp_data_view_type}} result;
-    bool ret =
-        mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-            &data_->data.f_{{name}}, &result, context_);
-    DCHECK(ret);
-    return result;
-  }
-
-{%-   elif kind|is_any_interface_kind %}
-  template <typename UserType>
-  UserType Take{{name|under_to_camel}}() {
-    DCHECK(is_{{name}}());
-    UserType result;
-    bool ret =
-        mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-            &data_->data.f_{{name}}, &result, context_);
-    DCHECK(ret);
-    return result;
-  }
-
-{%-   else %}
-  {{kind|cpp_data_view_type}} {{name}}() const {
-    DCHECK(is_{{name}}());
-    return data_->data.f_{{name}};
-  }
-
-{%-   endif %}
-{%- endfor %}
-
- private:
-  internal::{{union.name}}_Data* data_ = nullptr;
-{%- if union|requires_context_for_data_view %}
-  mojo::internal::SerializationContext* context_ = nullptr;
-{%- endif %}
-};
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_data_view_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_data_view_definition.tmpl
deleted file mode 100644
index 6da9280..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_data_view_definition.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{%- for field in union.fields %}
-{%-   set kind = field.kind %}
-{%-   set name = field.name %}
-
-{%-   if kind|is_object_kind %}
-inline void {{union.name}}DataView::Get{{name|under_to_camel}}DataView(
-    {{kind|cpp_data_view_type}}* output) {
-  DCHECK(is_{{name}}());
-  *output = {{kind|cpp_data_view_type}}(data_->data.f_{{name}}.Get(), context_);
-}
-{%-   endif %}
-{%- endfor %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_declaration.tmpl
deleted file mode 100644
index 005ba76..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_declaration.tmpl
+++ /dev/null
@@ -1,56 +0,0 @@
-{%- set class_name = union.name ~ "_Data" -%}
-{%- set enum_name = union.name ~ "_Tag" -%}
-{%- import "struct_macros.tmpl" as struct_macros %}
-
-class {{class_name}} {
- public:
-  // Used to identify Mojom Union Data Classes.
-  typedef void MojomUnionDataType;
-
-  {{class_name}}() {}
-  // Do nothing in the destructor since it won't be called when it is a
-  // non-inlined union.
-  ~{{class_name}}() {}
-
-  static {{class_name}}* New(mojo::internal::Buffer* buf) {
-    return new (buf->Allocate(sizeof({{class_name}}))) {{class_name}}();
-  }
-
-  static bool Validate(const void* data,
-                       mojo::internal::ValidationContext* validation_context,
-                       bool inlined);
-
-  bool is_null() const { return size == 0; }
-
-  void set_null() {
-    size = 0U;
-    tag = static_cast<{{enum_name}}>(0);
-    data.unknown = 0U;
-  }
-
-  enum class {{enum_name}} : uint32_t {
-{%  for field in union.fields %}
-    {{field.name|upper}},
-{%- endfor %}
-  };
-
-  // A note on layout:
-  // "Each non-static data member is allocated as if it were the sole member of
-  // a struct." - Section 9.5.2 ISO/IEC 14882:2011 (The C++ Spec)
-  union MOJO_ALIGNAS(8) Union_ {
-{%- for field in union.fields %}
-{%-   if field.kind.spec == 'b' %}
-    uint8_t f_{{field.name}} : 1;
-{%-   else %}
-    {{field.kind|cpp_union_field_type}} f_{{field.name}};
-{%-   endif %}
-{%- endfor %}
-    uint64_t unknown;
-  };
-
-  uint32_t size;
-  {{enum_name}} tag;
-  Union_ data;
-};
-static_assert(sizeof({{class_name}}) == mojo::internal::kUnionDataSize,
-              "Bad sizeof({{class_name}})");
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl
deleted file mode 100644
index af5ea9f..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl
+++ /dev/null
@@ -1,47 +0,0 @@
-{%- import "validation_macros.tmpl" as validation_macros %}
-{%- set class_name = union.name ~ "_Data" %}
-{%- set enum_name = union.name ~ "_Tag" -%}
-
-// static
-bool {{class_name}}::Validate(
-    const void* data,
-    mojo::internal::ValidationContext* validation_context,
-    bool inlined) {
-  if (!data) {
-    DCHECK(!inlined);
-    return true;
-  }
-
-  // If it is inlined, the alignment is already enforced by its enclosing
-  // object. We don't have to validate that.
-  DCHECK(!inlined || mojo::internal::IsAligned(data));
-
-  if (!inlined &&
-      !mojo::internal::ValidateNonInlinedUnionHeaderAndClaimMemory(
-          data, validation_context)) {
-    return false;
-  }
-
-  const {{class_name}}* object = static_cast<const {{class_name}}*>(data);
-  ALLOW_UNUSED_LOCAL(object);
-
-  if (inlined && object->is_null())
-    return true;
-
-  switch (object->tag) {
-{%  for field in union.fields %}
-    case {{enum_name}}::{{field.name|upper}}: {
-{%-   set field_expr = "object->data.f_" ~ field.name %}
-{{validation_macros.validate_field(field, field_expr, union.name, false)|indent(4)}}
-      return true;
-    }
-{%- endfor %}
-    default: {
-      ReportValidationError(
-          validation_context,
-          mojo::internal::VALIDATION_ERROR_UNKNOWN_UNION_TAG,
-          "unknown tag in {{union.name}}");
-      return false;
-    }
-  }
-}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_declaration.tmpl
deleted file mode 100644
index b589ae9..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_declaration.tmpl
+++ /dev/null
@@ -1,141 +0,0 @@
-{%- set data_view = union|get_qualified_name_for_kind ~ "DataView" %}
-{%- set data_type = union|get_qualified_name_for_kind(internal=True) %}
-
-namespace internal {
-
-template <typename MaybeConstUserType>
-struct Serializer<{{data_view}}, MaybeConstUserType> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = UnionTraits<{{data_view}}, UserType>;
-
-  static size_t PrepareToSerialize(MaybeConstUserType& input,
-                                   bool inlined,
-                                   SerializationContext* context) {
-    size_t size = inlined ? 0 : sizeof({{data_type}});
-
-    if (CallIsNullIfExists<Traits>(input))
-      return size;
-
-    void* custom_context = CustomContextHelper<Traits>::SetUp(input, context);
-    ALLOW_UNUSED_LOCAL(custom_context);
-
-    switch (CallWithContext(Traits::GetTag, input, custom_context)) {
-{%- for field in union.fields %}
-{%-   set name = field.name %}
-      case {{data_view}}::Tag::{{name|upper}}: {
-{%-   if field.kind|is_object_kind or field.kind|is_associated_kind %}
-{%-     set kind = field.kind %}
-{%-     set serializer_type = kind|unmapped_type_for_serializer %}
-        decltype(CallWithContext(Traits::{{name}}, input, custom_context))
-            in_{{name}} = CallWithContext(Traits::{{name}}, input,
-                                          custom_context);
-{%-     if kind|is_union_kind %}
-        size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
-            in_{{name}}, false, context);
-{%-     else %}
-        size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
-            in_{{name}}, context);
-{%-     endif %}
-{%-   endif %}
-        break;
-      }
-{%- endfor %}
-    }
-    return size;
-  }
-
-  static void Serialize(MaybeConstUserType& input,
-                        Buffer* buffer,
-                        {{data_type}}** output,
-                        bool inlined,
-                        SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input)) {
-      if (inlined)
-        (*output)->set_null();
-      else
-        *output = nullptr;
-      return;
-    }
-
-    void* custom_context = CustomContextHelper<Traits>::GetNext(context);
-
-    if (!inlined)
-      *output = {{data_type}}::New(buffer);
-
-    {{data_type}}* result = *output;
-    ALLOW_UNUSED_LOCAL(result);
-    // TODO(azani): Handle unknown and objects.
-    // Set the not-null flag.
-    result->size = kUnionDataSize;
-    result->tag = CallWithContext(Traits::GetTag, input, custom_context);
-    switch (result->tag) {
-{%- for field in union.fields %}
-{%-   set name = field.name %}
-{%-   set kind = field.kind %}
-{%-   set serializer_type = kind|unmapped_type_for_serializer %}
-      case {{data_view}}::Tag::{{field.name|upper}}: {
-        decltype(CallWithContext(Traits::{{name}}, input, custom_context))
-            in_{{name}} = CallWithContext(Traits::{{name}}, input,
-                                          custom_context);
-{%-   if kind|is_object_kind %}
-        typename decltype(result->data.f_{{name}})::BaseType* ptr;
-{%-     if kind|is_union_kind %}
-        mojo::internal::Serialize<{{serializer_type}}>(
-            in_{{name}}, buffer, &ptr, false, context);
-{%-     elif kind|is_array_kind or kind|is_map_kind %}
-        const ContainerValidateParams {{name}}_validate_params(
-            {{kind|get_container_validate_params_ctor_args|indent(16)}});
-        mojo::internal::Serialize<{{serializer_type}}>(
-            in_{{name}}, buffer, &ptr, &{{name}}_validate_params, context);
-{%-     else %}
-        mojo::internal::Serialize<{{serializer_type}}>(
-            in_{{name}}, buffer, &ptr, context);
-{%-     endif %}
-        result->data.f_{{name}}.Set(ptr);
-{%-     if not kind|is_nullable_kind %}
-        MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-            !ptr, mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-            "null {{name}} in {{union.name}} union");
-{%-     endif %}
-
-{%-   elif kind|is_any_handle_or_interface_kind %}
-        mojo::internal::Serialize<{{serializer_type}}>(
-            in_{{name}}, &result->data.f_{{name}}, context);
-{%-     if not kind|is_nullable_kind %}
-        MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-            !mojo::internal::IsHandleOrInterfaceValid(result->data.f_{{name}}),
-{%-       if kind|is_associated_kind %}
-            mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID,
-{%-       else %}
-            mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-{%-       endif %}
-            "invalid {{name}} in {{union.name}} union");
-{%-     endif %}
-
-{%-   elif kind|is_enum_kind %}
-        mojo::internal::Serialize<{{serializer_type}}>(
-            in_{{name}}, &result->data.f_{{name}});
-
-{%-   else %}
-        result->data.f_{{name}} = in_{{name}};
-{%-   endif %}
-        break;
-      }
-{%- endfor %}
-    }
-
-    CustomContextHelper<Traits>::TearDown(input, custom_context);
-  }
-
-  static bool Deserialize({{data_type}}* input,
-                          UserType* output,
-                          SerializationContext* context) {
-    if (!input || input->is_null())
-      return CallSetToNullIfExists<Traits>(output);
-
-    {{data_view}} data_view(input, context);
-    return Traits::Read(data_view, output);
-  }
-};
-
-}  // namespace internal
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_traits_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_traits_declaration.tmpl
deleted file mode 100644
index 4933e57..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_traits_declaration.tmpl
+++ /dev/null
@@ -1,24 +0,0 @@
-{%- set mojom_type = union|get_qualified_name_for_kind %}
-
-template <>
-struct {{export_attribute}} UnionTraits<{{mojom_type}}::DataView,
-                                        {{mojom_type}}Ptr> {
-  static bool IsNull(const {{mojom_type}}Ptr& input) { return !input; }
-  static void SetToNull({{mojom_type}}Ptr* output) { output->reset(); }
-
-  static {{mojom_type}}::Tag GetTag(const {{mojom_type}}Ptr& input) {
-    return input->which();
-  }
-
-{%- for field in union.fields %}
-{%-   set maybe_const_in = "" if field.kind|contains_handles_or_interfaces else "const" %}
-{%-   set maybe_const_out = "" if field.kind|contains_handles_or_interfaces or not field.kind|is_reference_kind else "const" %}
-{#    We want the field accessor to be const whenever possible to allow
-      structs to be used as map keys. #}
-  static {{maybe_const_out}} {{field.kind|cpp_union_trait_getter_return_type}} {{field.name}}({{maybe_const_in}} {{mojom_type}}Ptr& input) {
-    return input->get_{{field.name}}();
-  }
-{%- endfor %}
-
-  static bool Read({{mojom_type}}::DataView input, {{mojom_type}}Ptr* output);
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl
deleted file mode 100644
index cde3f95..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl
+++ /dev/null
@@ -1,47 +0,0 @@
-{%- set mojom_type = union|get_qualified_name_for_kind %}
-
-// static
-bool UnionTraits<{{mojom_type}}::DataView, {{mojom_type}}Ptr>::Read(
-    {{mojom_type}}::DataView input,
-    {{mojom_type}}Ptr* output) {
-  *output = {{mojom_type}}::New();
-  {{mojom_type}}Ptr& result = *output;
-
-  internal::UnionAccessor<{{mojom_type}}> result_acc(result.get());
-  switch (input.tag()) {
-{%- for field in union.fields %}
-    case {{mojom_type}}::Tag::{{field.name|upper}}: {
-{%-   set name = field.name %}
-{%-   set kind = field.kind %}
-{%-   set serializer_type = kind|unmapped_type_for_serializer %}
-{%-   if kind|is_object_kind %}
-      result_acc.SwitchActive({{mojom_type}}::Tag::{{name|upper}});
-      if (!input.Read{{name|under_to_camel}}(result_acc.data()->{{name}}))
-        return false;
-
-{%-   elif kind|is_any_handle_kind %}
-      auto result_{{name}} = input.Take{{name|under_to_camel}}();
-      result->set_{{name}}(std::move(result_{{name}}));
-
-{%-   elif kind|is_any_interface_kind %}
-      auto result_{{name}} =
-          input.Take{{name|under_to_camel}}<typename std::remove_reference<decltype(result->get_{{name}}())>::type>();
-      result->set_{{name}}(std::move(result_{{name}}));
-
-{%-   elif kind|is_enum_kind %}
-      decltype(result->get_{{name}}()) result_{{name}};
-      if (!input.Read{{name|under_to_camel}}(&result_{{name}}))
-        return false;
-      result->set_{{name}}(result_{{name}});
-
-{%-   else %}
-      result->set_{{name}}(input.{{name}}());
-{%-   endif %}
-      break;
-    }
-{%- endfor %}
-    default:
-      return false;
-  }
-  return true;
-}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/validation_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/validation_macros.tmpl
deleted file mode 100644
index a50a585..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/validation_macros.tmpl
+++ /dev/null
@@ -1,82 +0,0 @@
-{#- Validates the specified field, which is supposed to be an object
-    (struct/array/string/map/union). If it is a union, |union_is_inlined|
-    indicates whether the union is inlined. (Nested unions are not inlined.)
-    This macro is expanded by the Validate() method. #}
-{%- macro validate_object(field, field_expr, object_name, union_is_inlined) %}
-{%-   set name = field.name %}
-{%-   set kind = field.kind %}
-{%-   if not kind|is_nullable_kind %}
-{%-     if kind|is_union_kind and union_is_inlined %}
-  if (!mojo::internal::ValidateInlinedUnionNonNullable(
-          {{field_expr}}, "null {{name}} field in {{object_name}}",
-          validation_context)) {
-    return false;
-  }
-{%-     else %}
-  if (!mojo::internal::ValidatePointerNonNullable(
-          {{field_expr}}, "null {{name}} field in {{object_name}}",
-          validation_context)) {
-    return false;
-  }
-{%-     endif %}
-{%-   endif %}
-{%-   if kind|is_array_kind or kind|is_string_kind or kind|is_map_kind %}
-  const mojo::internal::ContainerValidateParams {{name}}_validate_params(
-      {{kind|get_container_validate_params_ctor_args|indent(6)}});
-  if (!mojo::internal::ValidateContainer({{field_expr}}, validation_context,
-                                         &{{name}}_validate_params)) {
-    return false;
-  }
-{%-   elif kind|is_struct_kind %}
-  if (!mojo::internal::ValidateStruct({{field_expr}}, validation_context))
-    return false;
-{%-   elif kind|is_union_kind %}
-{%-     if union_is_inlined %}
-  if (!mojo::internal::ValidateInlinedUnion({{field_expr}}, validation_context))
-    return false;
-{%-     else %}
-  if (!mojo::internal::ValidateNonInlinedUnion({{field_expr}},
-                                               validation_context))
-    return false;
-{%-     endif %}
-{%-   else %}
-#error Not reached!
-{%-   endif %}
-{%- endmacro %}
-
-{#- Validates the specified field, which is supposed to be a handle,
-    an interface, an associated interface or an associated interface request.
-    This macro is expanded by the Validate() method. #}
-{%- macro validate_handle_or_interface(field, field_expr, object_name) %}
-{%-   set name = field.name %}
-{%-   set kind = field.kind %}
-{%-   if not kind|is_nullable_kind %}
-  if (!mojo::internal::ValidateHandleOrInterfaceNonNullable(
-          {{field_expr}},
-          "invalid {{name}} field in {{object_name}}", validation_context)) {
-    return false;
-  }
-{%-   endif %}
-  if (!mojo::internal::ValidateHandleOrInterface({{field_expr}},
-                                                 validation_context)) {
-    return false;
-  }
-{%- endmacro %}
-
-{#- Validates the specified field, which is supposed to be an enum.
-    This macro is expanded by the Validate() method. #}
-{%- macro validate_enum(field, field_expr) %}
-  if (!{{field.kind|get_qualified_name_for_kind(internal=True,flatten_nested_kind=True)}}
-        ::Validate({{field_expr}}, validation_context))
-    return false;
-{%- endmacro %}
-
-{%- macro validate_field(field, field_expr, object_name, union_is_inlined) %}
-{%-   if field.kind|is_object_kind -%}
-{{validate_object(field, field_expr, object_name, union_is_inlined)}}
-{%-   elif field.kind|is_any_handle_or_interface_kind -%}
-{{validate_handle_or_interface(field, field_expr, object_name)}}
-{%-   elif field.kind|is_enum_kind %}
-{{validate_enum(field, field_expr)}}
-{%-   endif %}
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl
deleted file mode 100644
index 7ad9b4e..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl
+++ /dev/null
@@ -1,94 +0,0 @@
-class {{export_attribute}} {{struct.name}} {
- public:
-  using DataView = {{struct.name}}DataView;
-  using Data_ = internal::{{struct.name}}_Data;
-
-{#--- Enums #}
-{%- for enum in struct.enums -%}
-  using {{enum.name}} = {{enum|get_name_for_kind(flatten_nested_kind=True)}};
-{%- endfor %}
-
-{#--- Constants #}
-{%- for constant in struct.constants %}
-  static {{constant|format_constant_declaration(nested=True)}};
-{%- endfor %}
-
-  template <typename... Args>
-  static {{struct.name}}Ptr New(Args&&... args) {
-    return {{struct.name}}Ptr(
-        base::in_place,
-        std::forward<Args>(args)...);
-  }
-
-  template <typename U>
-  static {{struct.name}}Ptr From(const U& u) {
-    return mojo::TypeConverter<{{struct.name}}Ptr, U>::Convert(u);
-  }
-
-  template <typename U>
-  U To() const {
-    return mojo::TypeConverter<U, {{struct.name}}>::Convert(*this);
-  }
-
-{% for constructor in struct|struct_constructors %}
-  {% if constructor.params|length == 1 %}explicit {% endif %}{{struct.name}}(
-{%-   for field in constructor.params %}
-{%-     set type = field.kind|cpp_wrapper_param_type %}
-{%-     set name = field.name %}
-      {{type}} {{name}}
-{%-     if not loop.last -%},{%- endif %}
-{%-   endfor %});
-{% endfor %}
-  ~{{struct.name}}();
-
-  // Clone() is a template so it is only instantiated if it is used. Thus, the
-  // bindings generator does not need to know whether Clone() or copy
-  // constructor/assignment are available for members.
-  template <typename StructPtrType = {{struct.name}}Ptr>
-  {{struct.name}}Ptr Clone() const;
-
-  // Equals() is a template so it is only instantiated if it is used. Thus, the
-  // bindings generator does not need to know whether Equals() or == operator
-  // are available for members.
-  template <typename T,
-            typename std::enable_if<std::is_same<
-                T, {{struct.name}}>::value>::type* = nullptr>
-  bool Equals(const T& other) const;
-
-{%- if struct|is_hashable %}
-  size_t Hash(size_t seed) const;
-{%- endif %}
-
-{%- set serialization_result_type = "WTF::Vector<uint8_t>"
-        if for_blink else "std::vector<uint8_t>" %}
-
-  template <typename UserType>
-  static {{serialization_result_type}} Serialize(UserType* input) {
-    return mojo::internal::StructSerializeImpl<
-        {{struct.name}}::DataView, {{serialization_result_type}}>(input);
-  }
-
-  template <typename UserType>
-  static bool Deserialize(const {{serialization_result_type}}& input,
-                          UserType* output) {
-    return mojo::internal::StructDeserializeImpl<
-        {{struct.name}}::DataView, {{serialization_result_type}}>(
-            input, output, Validate);
-  }
-
-{#--- Struct members #}
-{%  for field in struct.fields %}
-{%-   set type = field.kind|cpp_wrapper_type %}
-{%-   set name = field.name %}
-  {{type}} {{name}};
-{%- endfor %}
-
- private:
-  static bool Validate(const void* data,
-                       mojo::internal::ValidationContext* validation_context);
-
-{%- if struct|contains_move_only_members %}
-  DISALLOW_COPY_AND_ASSIGN({{struct.name}});
-{%- endif %}
-};
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_definition.tmpl
deleted file mode 100644
index ab8c22d..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_definition.tmpl
+++ /dev/null
@@ -1,39 +0,0 @@
-{% for constructor in struct|struct_constructors %}
-{{struct.name}}::{{struct.name}}(
-{%-  for field in constructor.params  %}
-{%-    set type = field.kind|cpp_wrapper_param_type %}
-{%-    set name = field.name %}
-    {{type}} {{name}}_in
-{%-    if not loop.last -%},{%- endif %}
-{%-  endfor %})
-{%-  for field, is_parameter in constructor.fields %}
-{%-    set name = field.name %}
-    {% if loop.first %}:{% else %} {% endif %} {{name}}(
-{%-    if is_parameter -%}
-std::move({{name}}_in)
-{%-    else -%}
-{{ field|default_value }}
-{%-    endif -%}
-){%  if not loop.last %},{% endif %}
-{%-  endfor %} {}
-{% endfor %}
-{{struct.name}}::~{{struct.name}}() = default;
-
-{%- if struct|is_hashable %}
-size_t {{struct.name}}::Hash(size_t seed) const {
-{%-   for field in struct.fields %}
-{%-     if for_blink %}
-  seed = mojo::internal::WTFHash(seed, this->{{field.name}});
-{%-     else %}
-  seed = mojo::internal::Hash(seed, this->{{field.name}});
-{%-     endif %}
-{%-   endfor %}
-  return seed;
-}
-{%- endif %}
-
-bool {{struct.name}}::Validate(
-    const void* data,
-    mojo::internal::ValidationContext* validation_context) {
-  return Data_::Validate(data, validation_context);
-}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_template_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_template_definition.tmpl
deleted file mode 100644
index feb8615..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_template_definition.tmpl
+++ /dev/null
@@ -1,20 +0,0 @@
-template <typename StructPtrType>
-{{struct.name}}Ptr {{struct.name}}::Clone() const {
-  return New(
-{%- for field in struct.fields %}
-      mojo::Clone({{field.name}})
-{%-   if not loop.last -%},{%- endif %}
-{%- endfor %}
-  );
-}
-
-template <typename T,
-          typename std::enable_if<std::is_same<
-              T, {{struct.name}}>::value>::type*>
-bool {{struct.name}}::Equals(const T& other) const {
-{%- for field in struct.fields %}
-  if (!mojo::internal::Equals(this->{{field.name}}, other.{{field.name}}))
-    return false;
-{%- endfor %}
-  return true;
-}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl
deleted file mode 100644
index 8b7cf9e..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl
+++ /dev/null
@@ -1,80 +0,0 @@
-class {{export_attribute}} {{union.name}} {
- public:
-  using DataView = {{union.name}}DataView;
-  using Data_ = internal::{{union.name}}_Data;
-  using Tag = Data_::{{union.name}}_Tag;
-
-  static {{union.name}}Ptr New();
-
-  template <typename U>
-  static {{union.name}}Ptr From(const U& u) {
-    return mojo::TypeConverter<{{union.name}}Ptr, U>::Convert(u);
-  }
-
-  template <typename U>
-  U To() const {
-    return mojo::TypeConverter<U, {{union.name}}>::Convert(*this);
-  }
-
-  {{union.name}}();
-  ~{{union.name}}();
-
-  // Clone() is a template so it is only instantiated if it is used. Thus, the
-  // bindings generator does not need to know whether Clone() or copy
-  // constructor/assignment are available for members.
-  template <typename UnionPtrType = {{union.name}}Ptr>
-  {{union.name}}Ptr Clone() const;
-
-  // Equals() is a template so it is only instantiated if it is used. Thus, the
-  // bindings generator does not need to know whether Equals() or == operator
-  // are available for members.
-  template <typename T,
-            typename std::enable_if<std::is_same<
-                T, {{union.name}}>::value>::type* = nullptr>
-  bool Equals(const T& other) const;
-
-{%- if union|is_hashable %}
-  size_t Hash(size_t seed) const;
-{%- endif %}
-
-  Tag which() const {
-    return tag_;
-  }
-
-{%  for field in union.fields %}
-  bool is_{{field.name}}() const { return tag_ == Tag::{{field.name|upper}}; }
-
-  {{field.kind|cpp_union_getter_return_type}} get_{{field.name}}() const {
-    DCHECK(tag_ == Tag::{{field.name|upper}});
-{%-   if field.kind|is_object_kind or
-         field.kind|is_any_handle_or_interface_kind %}
-    return *(data_.{{field.name}});
-{%-   else %}
-    return data_.{{field.name}};
-{%-   endif %}
-  }
-
-  void set_{{field.name}}({{field.kind|cpp_wrapper_param_type}} {{field.name}});
-{%- endfor %}
-
- private:
-  friend class mojo::internal::UnionAccessor<{{union.name}}>;
-  union Union_ {
-    Union_() {}
-    ~Union_() {}
-
-{%- for field in union.fields %}
-{%-   if field.kind|is_object_kind or
-         field.kind|is_any_handle_or_interface_kind %}
-    {{field.kind|cpp_wrapper_type}}* {{field.name}};
-{%-   else %}
-    {{field.kind|cpp_wrapper_type}} {{field.name}};
-{%-   endif %}
-{%- endfor %}
-  };
-  void SwitchActive(Tag new_active);
-  void SetActive(Tag new_active);
-  void DestroyActive();
-  Tag tag_;
-  Union_ data_;
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl
deleted file mode 100644
index b9e416a..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl
+++ /dev/null
@@ -1,85 +0,0 @@
-// static
-{{union.name}}Ptr {{union.name}}::New() {
-  return {{union.name}}Ptr(base::in_place);
-}
-
-{{union.name}}::{{union.name}}() {
-  // TODO(azani): Implement default values here when/if we support them.
-  // TODO(azani): Set to UNKNOWN when unknown is implemented.
-  SetActive(static_cast<Tag>(0));
-}
-
-{{union.name}}::~{{union.name}}() {
-  DestroyActive();
-}
-
-{%  for field in union.fields %}
-void {{union.name}}::set_{{field.name}}({{field.kind|cpp_wrapper_param_type}} {{field.name}}) {
-  SwitchActive(Tag::{{field.name|upper}});
-{%    if field.kind|is_string_kind %}
-  *(data_.{{field.name}}) = {{field.name}};
-{%    elif field.kind|is_object_kind or
-           field.kind|is_any_handle_or_interface_kind %}
-  *(data_.{{field.name}}) = std::move({{field.name}});
-{%-   else %}
-  data_.{{field.name}} = {{field.name}};
-{%-   endif %}
-}
-{%- endfor %}
-
-void {{union.name}}::SwitchActive(Tag new_active) {
-  if (new_active == tag_) {
-    return;
-  }
-
-  DestroyActive();
-  SetActive(new_active);
-}
-
-void {{union.name}}::SetActive(Tag new_active) {
-  switch (new_active) {
-{%  for field in union.fields %}
-    case Tag::{{field.name|upper}}:
-{%    if field.kind|is_object_kind or
-         field.kind|is_any_handle_or_interface_kind %}
-      data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}();
-{%-   endif %}
-      break;
-{%- endfor %}
-  }
-
-  tag_ = new_active;
-}
-
-void {{union.name}}::DestroyActive() {
-  switch (tag_) {
-{%  for field in union.fields %}
-    case Tag::{{field.name|upper}}:
-{%    if field.kind|is_object_kind or
-         field.kind|is_any_handle_or_interface_kind %}
-      delete data_.{{field.name}};
-{%-   endif %}
-      break;
-{%- endfor %}
-  }
-}
-
-{%- if union|is_hashable %}
-size_t {{union.name}}::Hash(size_t seed) const {
-  seed = mojo::internal::HashCombine(seed, static_cast<uint32_t>(tag_));
-  switch (tag_) {
-{%  for field in union.fields %}
-    case Tag::{{field.name|upper}}:
-{%-   if for_blink %}
-      return mojo::internal::WTFHash(seed, data_.{{field.name}});
-{%-   else %}
-      return mojo::internal::Hash(seed, data_.{{field.name}});
-{%-   endif %}
-{%- endfor %}
-    default:
-      NOTREACHED();
-      return seed;
-  }
-}
-
-{%- endif %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_template_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_template_definition.tmpl
deleted file mode 100644
index 4c4851f..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_template_definition.tmpl
+++ /dev/null
@@ -1,41 +0,0 @@
-template <typename UnionPtrType>
-{{union.name}}Ptr {{union.name}}::Clone() const {
-  // Use UnionPtrType to prevent the compiler from trying to compile this
-  // without being asked.
-  UnionPtrType rv(New());
-  switch (tag_) {
-{%- for field in union.fields %}
-    case Tag::{{field.name|upper}}:
-{%-   if field.kind|is_object_kind or
-         field.kind|is_any_handle_or_interface_kind %}
-      rv->set_{{field.name}}(mojo::Clone(*data_.{{field.name}}));
-{%-   else %}
-      rv->set_{{field.name}}(mojo::Clone(data_.{{field.name}}));
-{%-   endif %}
-      break;
-{%- endfor %}
-  };
-  return rv;
-}
-
-template <typename T,
-          typename std::enable_if<std::is_same<
-              T, {{union.name}}>::value>::type*>
-bool {{union.name}}::Equals(const T& other) const {
-  if (tag_ != other.which())
-    return false;
-
-  switch (tag_) {
-{%- for field in union.fields %}
-    case Tag::{{field.name|upper}}:
-{%-   if field.kind|is_object_kind or
-         field.kind|is_any_handle_or_interface_kind %}
-      return mojo::internal::Equals(*(data_.{{field.name}}), *(other.data_.{{field.name}}));
-{%-   else %}
-      return mojo::internal::Equals(data_.{{field.name}}, other.data_.{{field.name}});
-{%-   endif %}
-{%- endfor %}
-  };
-
-  return false;
-}
diff --git a/mojo/public/tools/bindings/generators/java_templates/constant_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/constant_definition.tmpl
deleted file mode 100644
index db193e2..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/constant_definition.tmpl
+++ /dev/null
@@ -1,3 +0,0 @@
-{% macro constant_def(constant) %}
-public static final {{constant.kind|java_type}} {{constant|name}} = {{constant|constant_value}};
-{% endmacro %}
diff --git a/mojo/public/tools/bindings/generators/java_templates/constants.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/constants.java.tmpl
deleted file mode 100644
index 0a4e299..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/constants.java.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{% from "constant_definition.tmpl" import constant_def %}
-{% include "header.java.tmpl" %}
-
-public final class {{main_entity}} {
-{%  for constant in constants %}
-
-    {{constant_def(constant)|indent(4)}}
-{%  endfor %}
-
-    private {{main_entity}}() {}
-
-}
diff --git a/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl
deleted file mode 100644
index 4c0823c..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl
+++ /dev/null
@@ -1,418 +0,0 @@
-{%- from "constant_definition.tmpl" import constant_def %}
-{%- from "enum_definition.tmpl" import enum_def %}
-
-{%- macro equality(kind, v1, v2, ne=False) -%}
-{%-   if kind|is_reference_kind -%}
-{%-     if kind|is_array_kind -%}
-{%-       if kind.kind|is_reference_kind -%}
-{%- if ne %}!{%- endif %}java.util.Arrays.deepEquals({{v1}}, {{v2}})
-{%-       else -%}
-{%- if ne %}!{%- endif %}java.util.Arrays.equals({{v1}}, {{v2}})
-{%-       endif -%}
-{%-     else -%}
-{%- if ne %}!{%- endif %}org.chromium.mojo.bindings.BindingsHelper.equals({{v1}}, {{v2}})
-{%-     endif -%}
-{%-   else -%}
-{{v1}} {%- if ne %}!={%- else %}=={%- endif %} {{v2}}
-{%-   endif -%}
-{%- endmacro -%}
-
-{%- macro hash(kind, v) -%}
-{%-   if kind|is_array_kind -%}
-{%-     if kind.kind|is_reference_kind -%}
-java.util.Arrays.deepHashCode({{v}})
-{%-     else -%}
-java.util.Arrays.hashCode({{v}})
-{%-     endif -%}
-{%-   else -%}
-org.chromium.mojo.bindings.BindingsHelper.hashCode({{v}})
-{%-   endif -%}
-{%- endmacro -%}
-
-{%- macro array_element_size(kind) -%}
-{%-  if kind|is_union_kind %}
-org.chromium.mojo.bindings.BindingsHelper.UNION_SIZE
-{%-  else -%}
-org.chromium.mojo.bindings.BindingsHelper.POINTER_SIZE
-{%-  endif -%}
-{%- endmacro -%}
-
-{%- macro encode(variable, kind, offset, bit, level=0, check_for_null=True) %}
-{%- if kind|is_pointer_array_kind or kind|is_union_array_kind %}
-{%- set sub_kind = kind.kind %}
-{%-   if check_for_null %}
-if ({{variable}} == null) {
-    encoder{{level}}.encodeNullPointer({{offset}}, {{kind|is_nullable_kind|java_true_false}});
-} else {
-{%-   else %}
-{
-{%-   endif %}
-{%-   if kind|is_pointer_array_kind %}
-{%-     set encodePointer = 'encodePointerArray' %}
-{%-   else %}
-{%-     set encodePointer = 'encodeUnionArray' %}
-{%-   endif %}
-    org.chromium.mojo.bindings.Encoder encoder{{level + 1}} = encoder{{level}}.{{encodePointer}}({{variable}}.length, {{offset}}, {{kind|array_expected_length}});
-    for (int i{{level}} = 0; i{{level}} < {{variable}}.length; ++i{{level}}) {
-        {{encode(variable~'[i'~level~']', sub_kind, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE + ' ~ array_element_size(sub_kind) ~ ' * i'~level, 0, level+1)|indent(8)}}
-    }
-}
-{%- elif kind|is_map_kind %}
-if ({{variable}} == null) {
-    encoder{{level}}.encodeNullPointer({{offset}}, {{kind|is_nullable_kind|java_true_false}});
-} else {
-    org.chromium.mojo.bindings.Encoder encoder{{level + 1}} = encoder{{level}}.encoderForMap({{offset}});
-    int size{{level}} = {{variable}}.size();
-    {{kind.key_kind|java_type}}[] keys{{level}} = {{kind.key_kind|array|new_array('size'~level)}};
-    {{kind.value_kind|java_type}}[] values{{level}} = {{kind.value_kind|array|new_array('size'~level)}};
-    int index{{level}} = 0;
-    for (java.util.Map.Entry<{{kind.key_kind|java_type(true)}}, {{kind.value_kind|java_type(true)}}> entry{{level}} : {{variable}}.entrySet()) {
-        keys{{level}}[index{{level}}] = entry{{level}}.getKey();
-        values{{level}}[index{{level}}] = entry{{level}}.getValue();
-        ++index{{level}};
-    }
-    {{encode('keys'~level, kind.key_kind|array, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE', 0, level+1, False)|indent(4)}}
-    {{encode('values'~level, kind.value_kind|array, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE + org.chromium.mojo.bindings.BindingsHelper.POINTER_SIZE', 0, level+1, False)|indent(4)}}
-}
-{%- else %}
-encoder{{level}}.{{kind|encode_method(variable, offset, bit)}};
-{%- endif %}
-{%- endmacro %}
-
-{%- macro decode(variable, kind, offset, bit, level=0) %}
-{%- if kind|is_struct_kind or
-      kind|is_pointer_array_kind or
-      kind|is_union_array_kind or
-      kind|is_map_kind %}
-org.chromium.mojo.bindings.Decoder decoder{{level+1}} = decoder{{level}}.readPointer({{offset}}, {{kind|is_nullable_kind|java_true_false}});
-{%-   if kind|is_struct_kind %}
-{{variable}} = {{kind|java_type}}.decode(decoder{{level+1}});
-{%-   else %}{# kind|is_pointer_array_kind or is_map_kind #}
-{%-     if kind|is_nullable_kind %}
-if (decoder{{level+1}} == null) {
-    {{variable}} = null;
-} else {
-{%-     else %}
-{
-{%-     endif %}
-{%-     if kind|is_map_kind %}
-    decoder{{level+1}}.readDataHeaderForMap();
-    {{kind.key_kind|java_type}}[] keys{{level}};
-    {{kind.value_kind|java_type}}[] values{{level}};
-    {
-        {{decode('keys'~level, kind.key_kind|array, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE', 0, level+1)|indent(8)}}
-    }
-    {
-        {{decode('values'~level, kind.value_kind|array('keys'~level~'.length'), 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE + org.chromium.mojo.bindings.BindingsHelper.POINTER_SIZE', 0, level+1)|indent(8)}}
-    }
-    {{variable}} = new java.util.HashMap<{{kind.key_kind|java_type(true)}}, {{kind.value_kind|java_type(true)}}>();
-    for (int index{{level}} = 0; index{{level}} < keys{{level}}.length; ++index{{level}}) {
-        {{variable}}.put(keys{{level}}[index{{level}}],  values{{level}}[index{{level}}]);
-    }
-{%-     else %}
-    org.chromium.mojo.bindings.DataHeader si{{level+1}} = decoder{{level+1}}.readDataHeaderForPointerArray({{kind|array_expected_length}});
-    {{variable}} = {{kind|new_array('si'~(level+1)~'.elementsOrVersion')}};
-    for (int i{{level+1}} = 0; i{{level+1}} < si{{level+1}}.elementsOrVersion; ++i{{level+1}}) {
-        {{decode(variable~'[i'~(level+1)~']', kind.kind, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE + ' ~ array_element_size(kind.kind) ~' * i'~(level+1), 0, level+1)|indent(8)}}
-    }
-{%-     endif %}
-}
-{%-   endif %}
-{%- elif kind|is_union_kind %}
-{{variable}} = {{kind|java_type}}.decode(decoder{{level}}, {{offset}});
-{%- else %}
-{{variable}} = decoder{{level}}.{{kind|decode_method(offset, bit)}};
-{%-   if kind|is_array_kind and kind.kind|is_enum_kind %}
-{%-     if kind|is_nullable_kind %}
-if ({{variable}} != null) {
-{%-     else %}
-{
-{%-     endif %}
-    for (int i{{level}} = 0; i{{level}} < {{variable}}.length; ++i{{level}}) {
-        {{kind.kind|java_class_for_enum}}.validate({{variable}}[i{{level}}]);
-    }
-}
-{%-   elif kind|is_enum_kind %}
-    {{kind|java_class_for_enum}}.validate({{variable}});
-{%-   endif %}
-{%- endif %}
-{%- endmacro %}
-
-{%- macro struct_def(struct, inner_class=False) %}
-{{'static' if inner_class else 'public'}} final class {{struct|name}} extends org.chromium.mojo.bindings.Struct {
-
-    private static final int STRUCT_SIZE = {{struct.versions[-1].num_bytes}};
-    private static final org.chromium.mojo.bindings.DataHeader[] VERSION_ARRAY = new org.chromium.mojo.bindings.DataHeader[] {
-{%-   for version in struct.versions -%}
-        new org.chromium.mojo.bindings.DataHeader({{version.num_bytes}}, {{version.version}}){%- if not loop.last %}, {%- endif -%}
-{%-   endfor -%}
-    };
-    private static final org.chromium.mojo.bindings.DataHeader DEFAULT_STRUCT_INFO = VERSION_ARRAY[{{struct.versions|length - 1}}];
-{%-  for constant in struct.constants %}
-
-    {{constant_def(constant)|indent(4)}}
-{%-  endfor %}
-{%-  for enum in struct.enums %}
-
-    {{enum_def(enum, false)|indent(4)}}
-{%- endfor %}
-{%- if struct.fields %}
-
-{%-   for field in struct.fields %}
-    public {{field.kind|java_type}} {{field|name}};
-{%-   endfor %}
-{%- endif %}
-
-    private {{struct|name}}(int version) {
-        super(STRUCT_SIZE, version);
-{%- for field in struct.fields %}
-{%-   if field.default %}
-        {{field|name}} = {{field|default_value}};
-{%-   elif field.kind|is_any_handle_kind %}
-        {{field|name}} = org.chromium.mojo.system.InvalidHandle.INSTANCE;
-{%-   endif %}
-{%- endfor %}
-    }
-
-    public {{struct|name}}() {
-        this({{struct.versions[-1].version}});
-    }
-
-    public static {{struct|name}} deserialize(org.chromium.mojo.bindings.Message message) {
-        return decode(new org.chromium.mojo.bindings.Decoder(message));
-    }
-
-    /**
-     * Similar to the method above, but deserializes from a |ByteBuffer| instance.
-     *
-     * @throws org.chromium.mojo.bindings.DeserializationException on deserialization failure.
-     */
-    public static {{struct|name}} deserialize(java.nio.ByteBuffer data) {
-        if (data == null)
-            return null;
-
-        return deserialize(new org.chromium.mojo.bindings.Message(
-                data, new java.util.ArrayList<org.chromium.mojo.system.Handle>()));
-    }
-
-    @SuppressWarnings("unchecked")
-    public static {{struct|name}} decode(org.chromium.mojo.bindings.Decoder decoder0) {
-        if (decoder0 == null) {
-            return null;
-        }
-        decoder0.increaseStackDepth();
-        {{struct|name}} result;
-        try {
-            org.chromium.mojo.bindings.DataHeader mainDataHeader = decoder0.readAndValidateDataHeader(VERSION_ARRAY);
-            result = new {{struct|name}}(mainDataHeader.elementsOrVersion);
-{%- for byte in struct.bytes %}
-{%-   for packed_field in byte.packed_fields %}
-            if (mainDataHeader.elementsOrVersion >= {{packed_field.min_version}}) {
-                {{decode('result.' ~ packed_field.field|name, packed_field.field.kind, 8+packed_field.offset, packed_field.bit)|indent(16)}}
-            }
-{%-   endfor %}
-{%- endfor %}
-        } finally {
-            decoder0.decreaseStackDepth();
-        }
-        return result;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected final void encode(org.chromium.mojo.bindings.Encoder encoder) {
-{%- if not struct.bytes %}
-        encoder.getEncoderAtDataOffset(DEFAULT_STRUCT_INFO);
-{%- else %}
-        org.chromium.mojo.bindings.Encoder encoder0 = encoder.getEncoderAtDataOffset(DEFAULT_STRUCT_INFO);
-{%- endif %}
-{%- for byte in struct.bytes %}
-{%-   for packed_field in byte.packed_fields %}
-        {{encode(packed_field.field|name, packed_field.field.kind, 8+packed_field.offset, packed_field.bit)|indent(8)}}
-{%-   endfor %}
-{%- endfor %}
-    }
-
-    /**
-     * @see Object#equals(Object)
-     */
-    @Override
-    public boolean equals(Object object) {
-        if (object == this)
-            return true;
-        if (object == null)
-            return false;
-        if (getClass() != object.getClass())
-            return false;
-{%- if struct.fields|length %}
-        {{struct|name}} other = ({{struct|name}}) object;
-{%-   for field in struct.fields %}
-        if ({{equality(field.kind, 'this.'~field|name, 'other.'~field|name, True)}})
-            return false;
-{%-   endfor %}
-{%- endif %}
-        return true;
-    }
-
-    /**
-     * @see Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = prime + getClass().hashCode();
-{%- for field in struct.fields %}
-        result = prime * result + {{hash(field.kind, field|name)}};
-{%- endfor %}
-        return result;
-    }
-}
-{%- endmacro %}
-
-
-{%- macro union_def(union) %}
-public final class {{union|name}} extends org.chromium.mojo.bindings.Union {
-
-    public static final class Tag {
-{%-   for field in union.fields %}
-        public static final int {{field|ucc}} = {{loop.index0}};
-{%-   endfor %}
-    };
-
-    private int mTag_ = -1;
-{%-   for field in union.fields %}
-    private {{field.kind|java_type}} m{{field|ucc}};
-{%-   endfor %}
-
-    public int which() {
-      return mTag_;
-    }
-
-    public boolean isUnknown() {
-      return mTag_ == -1;
-    }
-{%-   for field in union.fields %}
-
-    // TODO(rockot): Fix the findbugs error and remove this suppression.
-    // See http://crbug.com/570386.
-    @SuppressFBWarnings("EI_EXPOSE_REP2")
-    public void set{{field|ucc}}({{field.kind|java_type}} {{field|name}}) {
-        mTag_ = Tag.{{field|ucc}};
-        m{{field|ucc}} = {{field|name}};
-    }
-
-    // TODO(rockot): Fix the findbugs error and remove this suppression.
-    // See http://crbug.com/570386.
-    @SuppressFBWarnings("EI_EXPOSE_REP")
-    public {{field.kind|java_type}} get{{field|ucc}}() {
-        assert mTag_ == Tag.{{field|ucc}};
-        return m{{field|ucc}};
-    }
-{%-   endfor %}
-
-
-    @Override
-    protected final void encode(org.chromium.mojo.bindings.Encoder encoder0, int offset) {
-        encoder0.encode(org.chromium.mojo.bindings.BindingsHelper.UNION_SIZE, offset);
-        encoder0.encode(mTag_, offset + 4);
-        switch (mTag_) {
-{%-   for field in union.fields %}
-            case Tag.{{field|ucc}}: {
-{%-     if field.kind|is_union_kind %}
-                if (m{{field|ucc}} == null) {
-                    encoder0.encodeNullPointer(offset + 8, {{field.kind|is_nullable_kind|java_true_false}});
-                } else {
-                    m{{field|ucc}}.encode(encoder0.encoderForUnionPointer(offset + 8), 0);
-                }
-{%-     else %}
-                {{encode('m' ~ field|ucc, field.kind, 'offset + 8', 0)|indent(16)}}
-{%-     endif %}
-                break;
-            }
-{%-   endfor %}
-            default: {
-                break;
-            }
-        }
-    }
-
-    public static {{union|name}} deserialize(org.chromium.mojo.bindings.Message message) {
-        return decode(new org.chromium.mojo.bindings.Decoder(message).decoderForSerializedUnion(), 0);
-    }
-
-    public static final {{union|name}} decode(org.chromium.mojo.bindings.Decoder decoder0, int offset) {
-        org.chromium.mojo.bindings.DataHeader dataHeader = decoder0.readDataHeaderForUnion(offset);
-        if (dataHeader.size == 0) {
-            return null;
-        }
-        {{union|name}} result = new {{union|name}}();
-        switch (dataHeader.elementsOrVersion) {
-{%-   for field in union.fields %}
-            case Tag.{{field|ucc}}: {
-{%-     if field.kind|is_union_kind %}
-                org.chromium.mojo.bindings.Decoder decoder1 = decoder0.readPointer(offset + org.chromium.mojo.bindings.DataHeader.HEADER_SIZE, {{field.kind|is_nullable_kind|java_true_false}});
-                if (decoder1 != null) {
-                    result.m{{field|ucc}} = {{field.kind|name}}.decode(decoder1, 0);
-                }
-{%-     else %}
-                {{decode('result.m'~field|ucc, field.kind, 'offset + org.chromium.mojo.bindings.DataHeader.HEADER_SIZE', 0)|indent(16)}}
-{%-     endif %}
-                result.mTag_ = Tag.{{field|ucc}};
-                break;
-            }
-{%-   endfor %}
-            default: {
-                break;
-            }
-        }
-        return result;
-    }
-
-    /**
-     * @see Object#equals(Object)
-     */
-    @Override
-    public boolean equals(Object object) {
-        if (object == this)
-            return true;
-        if (object == null)
-            return false;
-        if (getClass() != object.getClass())
-            return false;
-        {{union|name}} other = ({{union|name}}) object;
-        if (mTag_ != other.mTag_)
-            return false;
-        switch (mTag_) {
-{%-   for field in union.fields %}
-            case Tag.{{field|ucc}}:
-                return {{equality(field.kind, 'm'~field|ucc, 'other.m'~field|ucc)}};
-{%-   endfor %}
-            default:
-                break;
-        }
-        return false;
-    }
-
-    /**
-     * @see Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = prime + getClass().hashCode();
-        result = prime * result + org.chromium.mojo.bindings.BindingsHelper.hashCode(mTag_);
-        switch (mTag_) {
-{%-   for field in union.fields %}
-            case Tag.{{field|ucc}}: {
-                result = prime * result + {{hash(field.kind, 'm'~field|ucc)}};
-                break;
-            }
-{%-   endfor %}
-            default: {
-                break;
-            }
-        }
-        return result;
-    }
-}
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/java_templates/enum.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/enum.java.tmpl
deleted file mode 100644
index 7096a18..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/enum.java.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-{% from "enum_definition.tmpl" import enum_def %}
-{% include "header.java.tmpl" %}
-
-{{enum_def(enum, true)}}
diff --git a/mojo/public/tools/bindings/generators/java_templates/enum_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/enum_definition.tmpl
deleted file mode 100644
index d37288a..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/enum_definition.tmpl
+++ /dev/null
@@ -1,42 +0,0 @@
-{%- macro enum_value(enum, field, index) -%}
-{%- if field.value -%}
-(int) ({{field.value|expression_to_text('i32')}})
-{%- elif index == 0 -%}
-0
-{%- else -%}
-{{enum.fields[index - 1]|name}} + 1
-{%- endif -%}
-{%- endmacro -%}
-
-{%- macro enum_def(enum, top_level) -%}
-public {{ 'static ' if not top_level }}final class {{enum|name}} {
-
-{% for field in enum.fields %}
-    public static final int {{field|name}} = {{enum_value(enum, field, loop.index0)}};
-{% endfor %}
-
-    private static final boolean IS_EXTENSIBLE = {% if enum.extensible %}true{% else %}false{% endif %};
-
-    public static boolean isKnownValue(int value) {
-{%- if enum.fields %}
-        switch (value) {
-{%-   for enum_field in enum.fields|groupby('numeric_value') %}
-            case {{enum_field[0]}}:
-{%-   endfor %}
-                return true;
-        }
-{%- endif %}
-        return false;
-    }
-
-    public static void validate(int value) {
-        if (IS_EXTENSIBLE || isKnownValue(value))
-            return;
-
-        throw new DeserializationException("Invalid enum value.");
-    }
-
-    private {{enum|name}}() {}
-
-}
-{%- endmacro -%}
diff --git a/mojo/public/tools/bindings/generators/java_templates/header.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/header.java.tmpl
deleted file mode 100644
index 1d67890..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/header.java.tmpl
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is autogenerated by:
-//     mojo/public/tools/bindings/mojom_bindings_generator.py
-// For:
-//     {{module.path}}
-//
-
-package {{package}};
-
-import org.chromium.base.annotations.SuppressFBWarnings;
-import org.chromium.mojo.bindings.DeserializationException;
\ No newline at end of file
diff --git a/mojo/public/tools/bindings/generators/java_templates/interface.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/interface.java.tmpl
deleted file mode 100644
index a13be3e..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/interface.java.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-{% from "interface_definition.tmpl" import interface_def %}
-{% include "header.java.tmpl" %}
-
-{{ interface_def(interface) }}
diff --git a/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl
deleted file mode 100644
index a723f8c..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl
+++ /dev/null
@@ -1,297 +0,0 @@
-{% from "constant_definition.tmpl" import constant_def %}
-{% from "enum_definition.tmpl" import enum_def %}
-{% from "data_types_definition.tmpl" import struct_def %}
-
-{%- macro declare_params(parameters, boxed=false) %}
-{%-   for param in parameters -%}
-{{param.kind|java_type(boxed)}} {{param|name}}
-{%- if not loop.last %}, {% endif %}
-{%-   endfor %}
-{%- endmacro %}
-
-{% macro declare_request_params(method) %}
-{{declare_params(method.parameters)}}
-{%-   if method.response_parameters != None -%}
-{%- if method.parameters %}, {% endif %}
-{{method|interface_response_name}} callback
-{%-   endif -%}
-{% endmacro %}
-
-{%- macro declare_callback(method) -%}
-
-interface {{method|interface_response_name}} extends org.chromium.mojo.bindings.Callbacks.Callback{{method.response_parameters|length}}{% if method.response_parameters %}<
-{%-   for param in method.response_parameters -%}
-{{param.kind|java_type(True)}}
-{%- if not loop.last %}, {% endif %}
-{%-   endfor -%}
->{% endif %} { }
-{%- endmacro -%}
-
-{%- macro run_callback(variable, parameters) -%}
-{%-   if parameters -%}
-{%-     for param in parameters -%}
-{{variable}}.{{param|name}}
-{%-   if not loop.last %}, {% endif %}
-{%-     endfor -%}
-{%-   endif -%}
-{%- endmacro -%}
-
-{%- macro flags_for_method(method, is_request) -%}
-{{flags(method.response_parameters != None, is_request)}}
-{%- endmacro -%}
-
-{%- macro flags(use_response_flag, is_request) -%}
-{%-  if not use_response_flag -%}
-org.chromium.mojo.bindings.MessageHeader.NO_FLAG
-{%-   elif is_request: -%}
-org.chromium.mojo.bindings.MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG
-{%-   else -%}
-org.chromium.mojo.bindings.MessageHeader.MESSAGE_IS_RESPONSE_FLAG
-{%-   endif -%}
-{%- endmacro -%}
-
-{%- macro manager_class(interface, fully_qualified=False) -%}
-{% if fully_qualified %}org.chromium.mojo.bindings.Interface.{% endif %}Manager<{{interface|name}}, {{interface|name}}.Proxy>
-{%- endmacro -%}
-
-{%- macro manager_def(interface) -%}
-public static final {{manager_class(interface, True)}} MANAGER =
-        new {{manager_class(interface, True)}}() {
-
-    public String getName() {
-        return "{{namespace|replace(".","::")}}::{{interface.name}}";
-    }
-
-    public int getVersion() {
-      return {{interface.version}};
-    }
-
-    public Proxy buildProxy(org.chromium.mojo.system.Core core,
-                            org.chromium.mojo.bindings.MessageReceiverWithResponder messageReceiver) {
-        return new Proxy(core, messageReceiver);
-    }
-
-    public Stub buildStub(org.chromium.mojo.system.Core core, {{interface|name}} impl) {
-        return new Stub(core, impl);
-    }
-
-    public {{interface|name}}[] buildArray(int size) {
-      return new {{interface|name}}[size];
-    }
-};
-{%- endmacro -%}
-
-{%- macro accept_body(interface, with_response) -%}
-try {
-    org.chromium.mojo.bindings.ServiceMessage messageWithHeader =
-            message.asServiceMessage();
-    org.chromium.mojo.bindings.MessageHeader header = messageWithHeader.getHeader();
-    if (!header.validateHeader({{flags(with_response, True)}})) {
-        return false;
-    }
-    switch(header.getType()) {
-{%   if with_response %}
-        case org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants.RUN_MESSAGE_ID:
-            return org.chromium.mojo.bindings.InterfaceControlMessagesHelper.handleRun(
-                    getCore(), {{interface|name}}_Internal.MANAGER, messageWithHeader, receiver);
-{%   else %}
-        case org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID:
-            return org.chromium.mojo.bindings.InterfaceControlMessagesHelper.handleRunOrClosePipe(
-                    {{interface|name}}_Internal.MANAGER, messageWithHeader);
-{%   endif %}
-{%   for method in interface.methods %}
-{%     if (with_response and method.response_parameters != None) or
-        (not with_response and method.response_parameters == None) %}
-{%       set request_struct = method.param_struct %}
-{%       if with_response %}
-{%         set response_struct = method.response_param_struct %}
-{%       endif %}
-        case {{method|method_ordinal_name}}: {
-{%       if method.parameters %}
-            {{request_struct|name}} data =
-                    {{request_struct|name}}.deserialize(messageWithHeader.getPayload());
-{%       else %}
-            {{request_struct|name}}.deserialize(messageWithHeader.getPayload());
-{%       endif %}
-            try {
-                getImpl().{{method|name}}({{run_callback('data', method.parameters)}}{% if with_response %}{% if method.parameters %}, {% endif %}new {{response_struct|name}}ProxyToResponder(getCore(), receiver, header.getRequestId()){% endif %});
-            } catch (RuntimeException e) {
-                // TODO(lhchavez): Remove this hack. See b/28814913 for details.
-                android.util.Log.wtf("{{namespace}}.{{interface.name}}", "Uncaught runtime exception", e);
-            }
-            return true;
-        }
-{%     endif %}
-{%   endfor %}
-        default:
-            return false;
-    }
-} catch (org.chromium.mojo.bindings.DeserializationException e) {
-    System.err.println(e.toString());
-    return false;
-}
-{%- endmacro -%}
-
-{% macro interface_def(interface) %}
-public interface {{interface|name}} extends org.chromium.mojo.bindings.Interface {
-{%  for constant in interface.constants %}
-
-    {{constant_def(constant)|indent(4)}}
-{%  endfor %}
-{%  for enum in interface.enums %}
-
-    {{enum_def(enum, false)|indent(4)}}
-{% endfor %}
-
-    public interface Proxy extends {{interface|name}}, org.chromium.mojo.bindings.Interface.Proxy {
-    }
-
-    {{manager_class(interface)}} MANAGER = {{interface|name}}_Internal.MANAGER;
-{% for method in interface.methods %}
-
-    void {{method|name}}({{declare_request_params(method)}});
-{%   if method.response_parameters != None %}
-    {{declare_callback(method)|indent(4)}}
-{%   endif %}
-{% endfor %}
-}
-{% endmacro %}
-
-{% macro interface_internal_def(interface) %}
-class {{interface|name}}_Internal {
-
-    {{manager_def(interface)|indent(4)}}
-
-{% for method in interface.methods %}
-    private static final int {{method|method_ordinal_name}} = {{method.ordinal}};
-{% endfor %}
-
-    static final class Proxy extends org.chromium.mojo.bindings.Interface.AbstractProxy implements {{interface|name}}.Proxy {
-
-        Proxy(org.chromium.mojo.system.Core core,
-              org.chromium.mojo.bindings.MessageReceiverWithResponder messageReceiver) {
-            super(core, messageReceiver);
-        }
-{% for method in interface.methods %}
-
-        @Override
-        public void {{method|name}}({{declare_request_params(method)}}) {
-{%   set request_struct = method.param_struct %}
-            {{request_struct|name}} _message = new {{request_struct|name}}();
-{%   for param in method.parameters %}
-            _message.{{param|name}} = {{param|name}};
-{%   endfor %}
-{%   if method.response_parameters != None %}
-            getProxyHandler().getMessageReceiver().acceptWithResponder(
-                    _message.serializeWithHeader(
-                            getProxyHandler().getCore(),
-                            new org.chromium.mojo.bindings.MessageHeader(
-                                    {{method|method_ordinal_name}},
-                                    {{flags_for_method(method, True)}},
-                                    0)),
-                    new {{method.response_param_struct|name}}ForwardToCallback(callback));
-{%   else %}
-            getProxyHandler().getMessageReceiver().accept(
-                    _message.serializeWithHeader(
-                            getProxyHandler().getCore(),
-                            new org.chromium.mojo.bindings.MessageHeader({{method|method_ordinal_name}})));
-{%   endif %}
-        }
-{% endfor %}
-
-    }
-
-    static final class Stub extends org.chromium.mojo.bindings.Interface.Stub<{{interface|name}}> {
-
-        Stub(org.chromium.mojo.system.Core core, {{interface|name}} impl) {
-            super(core, impl);
-        }
-
-        @Override
-        public boolean accept(org.chromium.mojo.bindings.Message message) {
-            {{accept_body(interface, False)|indent(12)}}
-        }
-
-        @Override
-        public boolean acceptWithResponder(org.chromium.mojo.bindings.Message message, org.chromium.mojo.bindings.MessageReceiver receiver) {
-            {{accept_body(interface, True)|indent(12)}}
-        }
-    }
-{% for method in interface.methods %}
-
-    {{ struct_def(method.param_struct, True)|indent(4) }}
-{%   if method.response_parameters != None %}
-{%   set response_struct = method.response_param_struct %}
-
-    {{ struct_def(response_struct, True)|indent(4) }}
-
-    static class {{response_struct|name}}ForwardToCallback extends org.chromium.mojo.bindings.SideEffectFreeCloseable
-            implements org.chromium.mojo.bindings.MessageReceiver {
-        private final {{interface|name}}.{{method|interface_response_name}} mCallback;
-
-        {{response_struct|name}}ForwardToCallback({{interface|name}}.{{method|interface_response_name}} callback) {
-            this.mCallback = callback;
-        }
-
-        @Override
-        public boolean accept(org.chromium.mojo.bindings.Message message) {
-            try {
-                org.chromium.mojo.bindings.ServiceMessage messageWithHeader =
-                        message.asServiceMessage();
-                org.chromium.mojo.bindings.MessageHeader header = messageWithHeader.getHeader();
-                if (!header.validateHeader({{method|method_ordinal_name}},
-                                           {{flags_for_method(method, False)}})) {
-                    return false;
-                }
-{%   if method.response_parameters|length %}
-                {{response_struct|name}} response = {{response_struct|name}}.deserialize(messageWithHeader.getPayload());
-{%   endif %}
-                try {
-                    mCallback.call({{run_callback('response', method.response_parameters)}});
-                } catch (RuntimeException e) {
-                    // TODO(lhchavez): Remove this hack. See b/28814913 for details.
-                    android.util.Log.wtf("{{namespace}}.{{interface.name}}", "Uncaught runtime exception", e);
-                }
-                return true;
-            } catch (org.chromium.mojo.bindings.DeserializationException e) {
-                return false;
-            }
-        }
-    }
-
-    static class {{response_struct|name}}ProxyToResponder implements {{interface|name}}.{{method|interface_response_name}} {
-
-        private final org.chromium.mojo.system.Core mCore;
-        private final org.chromium.mojo.bindings.MessageReceiver mMessageReceiver;
-        private final long mRequestId;
-
-        {{response_struct|name}}ProxyToResponder(
-                org.chromium.mojo.system.Core core,
-                org.chromium.mojo.bindings.MessageReceiver messageReceiver,
-                long requestId) {
-            mCore = core;
-            mMessageReceiver = messageReceiver;
-            mRequestId = requestId;
-        }
-
-        @Override
-        public void call({{declare_params(method.response_parameters, true)}}) {
-            {{response_struct|name}} _response = new {{response_struct|name}}();
-{%   for param in method.response_parameters %}
-            _response.{{param|name}} = {{param|name}};
-{%   endfor %}
-            org.chromium.mojo.bindings.ServiceMessage _message =
-                    _response.serializeWithHeader(
-                            mCore,
-                            new org.chromium.mojo.bindings.MessageHeader(
-                                    {{method|method_ordinal_name}},
-                                    {{flags_for_method(method, False)}},
-                                    mRequestId));
-            mMessageReceiver.accept(_message);
-        }
-    }
-{%   endif %}
-{% endfor %}
-
-}
-{% endmacro %}
diff --git a/mojo/public/tools/bindings/generators/java_templates/interface_internal.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/interface_internal.java.tmpl
deleted file mode 100644
index 50c7a7b..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/interface_internal.java.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-{% from "interface_definition.tmpl" import interface_internal_def %}
-{% include "header.java.tmpl" %}
-
-{{ interface_internal_def(interface) }}
diff --git a/mojo/public/tools/bindings/generators/java_templates/struct.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/struct.java.tmpl
deleted file mode 100644
index e28ba19..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/struct.java.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-{% from "data_types_definition.tmpl" import struct_def %}
-{% include "header.java.tmpl" %}
-
-{{ struct_def(struct) }}
diff --git a/mojo/public/tools/bindings/generators/java_templates/union.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/union.java.tmpl
deleted file mode 100644
index b8cd4aa..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/union.java.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-{% from "data_types_definition.tmpl" import union_def %}
-{% include "header.java.tmpl" %}
-
-{{ union_def(union) }}
diff --git a/mojo/public/tools/bindings/generators/js_templates/enum_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/enum_definition.tmpl
deleted file mode 100644
index 019b1b6..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/enum_definition.tmpl
+++ /dev/null
@@ -1,33 +0,0 @@
-{%- macro enum_def(enum_name, enum) -%}
-  {{enum_name}} = {};
-{%-   set prev_enum = 0 %}
-{%-   for field in enum.fields %}
-{%-     if field.value %}
-  {{enum_name}}.{{field.name}} = {{field.value|expression_to_text}};
-{%-     elif loop.first %}
-  {{enum_name}}.{{field.name}} = 0;
-{%-     else %}
-  {{enum_name}}.{{field.name}} = {{enum_name}}.{{enum.fields[loop.index0 - 1].name}} + 1;
-{%-     endif %}
-{%-   endfor %}
-
-  {{enum_name}}.isKnownEnumValue = function(value) {
-{%-   if enum.fields %}
-    switch (value) {
-{%-       for enum_field in enum.fields|groupby('numeric_value') %}
-    case {{enum_field[0]}}:
-{%-     endfor %}
-      return true;
-    }
-{%-   endif %}
-    return false;
-  };
-
-  {{enum_name}}.validate = function(enumValue) {
-    var isExtensible = {% if enum.extensible %}true{% else %}false{% endif %};
-    if (isExtensible || this.isKnownEnumValue(enumValue))
-      return validator.validationError.NONE;
-
-    return validator.validationError.UNKNOWN_ENUM_VALUE;
-  };
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/js_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/interface_definition.tmpl
deleted file mode 100644
index 11e319c..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/interface_definition.tmpl
+++ /dev/null
@@ -1,198 +0,0 @@
-{%- for method in interface.methods %}
-  var k{{interface.name}}_{{method.name}}_Name = {{method.ordinal}};
-{%- endfor %}
-
-  function {{interface.name}}Ptr(handleOrPtrInfo) {
-    this.ptr = new bindings.InterfacePtrController({{interface.name}},
-                                                   handleOrPtrInfo);
-  }
-
-  function {{interface.name}}Proxy(receiver) {
-    this.receiver_ = receiver;
-  }
-
-{%- for method in interface.methods %}
-  {{interface.name}}Ptr.prototype.{{method.name|stylize_method}} = function() {
-    return {{interface.name}}Proxy.prototype.{{method.name|stylize_method}}
-        .apply(this.ptr.getProxy(), arguments);
-  };
-
-  {{interface.name}}Proxy.prototype.{{method.name|stylize_method}} = function(
-{%- for parameter in method.parameters -%}
-{{parameter.name}}{% if not loop.last %}, {% endif %}
-{%- endfor -%}
-) {
-    var params = new {{interface.name}}_{{method.name}}_Params();
-{%- for parameter in method.parameters %}
-    params.{{parameter.name}} = {{parameter.name}};
-{%- endfor %}
-
-{%- if method.response_parameters == None %}
-    var builder = new codec.MessageBuilder(
-        k{{interface.name}}_{{method.name}}_Name,
-        codec.align({{interface.name}}_{{method.name}}_Params.encodedSize));
-    builder.encodeStruct({{interface.name}}_{{method.name}}_Params, params);
-    var message = builder.finish();
-    this.receiver_.accept(message);
-{%- else %}
-    return new Promise(function(resolve, reject) {
-      var builder = new codec.MessageWithRequestIDBuilder(
-          k{{interface.name}}_{{method.name}}_Name,
-          codec.align({{interface.name}}_{{method.name}}_Params.encodedSize),
-          codec.kMessageExpectsResponse, 0);
-      builder.encodeStruct({{interface.name}}_{{method.name}}_Params, params);
-      var message = builder.finish();
-      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
-        var reader = new codec.MessageReader(message);
-        var responseParams =
-            reader.decodeStruct({{interface.name}}_{{method.name}}_ResponseParams);
-        resolve(responseParams);
-      }).catch(function(result) {
-        reject(Error("Connection error: " + result));
-      });
-    }.bind(this));
-{%- endif %}
-  };
-{%- endfor %}
-
-  function {{interface.name}}Stub(delegate) {
-    this.delegate_ = delegate;
-  }
-
-{%- for method in interface.methods %}
-{%-   set js_method_name = method.name|stylize_method %}
-  {{interface.name}}Stub.prototype.{{js_method_name}} = function({{method.parameters|map(attribute='name')|join(', ')}}) {
-    return this.delegate_ && this.delegate_.{{js_method_name}} && this.delegate_.{{js_method_name}}({{method.parameters|map(attribute='name')|join(', ')}});
-  }
-{%- endfor %}
-
-  {{interface.name}}Stub.prototype.accept = function(message) {
-    var reader = new codec.MessageReader(message);
-    switch (reader.messageName) {
-{%- for method in interface.methods %}
-{%- if method.response_parameters == None %}
-    case k{{interface.name}}_{{method.name}}_Name:
-      var params = reader.decodeStruct({{interface.name}}_{{method.name}}_Params);
-      this.{{method.name|stylize_method}}(
-{%- for parameter in method.parameters -%}
-  params.{{parameter.name}}{% if not loop.last %}, {% endif %}
-{%- endfor %});
-      return true;
-{%- endif %}
-{%- endfor %}
-    default:
-      return false;
-    }
-  };
-
-  {{interface.name}}Stub.prototype.acceptWithResponder =
-      function(message, responder) {
-    var reader = new codec.MessageReader(message);
-    switch (reader.messageName) {
-{%- for method in interface.methods %}
-{%- if method.response_parameters != None %}
-    case k{{interface.name}}_{{method.name}}_Name:
-      var params = reader.decodeStruct({{interface.name}}_{{method.name}}_Params);
-      this.{{method.name|stylize_method}}(
-{%- for parameter in method.parameters -%}
-params.{{parameter.name}}{% if not loop.last %}, {% endif -%}
-{%- endfor %}).then(function(response) {
-        var responseParams =
-            new {{interface.name}}_{{method.name}}_ResponseParams();
-{%-     for parameter in method.response_parameters %}
-        responseParams.{{parameter.name}} = response.{{parameter.name}};
-{%-     endfor %}
-        var builder = new codec.MessageWithRequestIDBuilder(
-            k{{interface.name}}_{{method.name}}_Name,
-            codec.align({{interface.name}}_{{method.name}}_ResponseParams.encodedSize),
-            codec.kMessageIsResponse, reader.requestID);
-        builder.encodeStruct({{interface.name}}_{{method.name}}_ResponseParams,
-                             responseParams);
-        var message = builder.finish();
-        responder.accept(message);
-      });
-      return true;
-{%- endif %}
-{%- endfor %}
-    default:
-      return false;
-    }
-  };
-
-{#--- Validation #}
-
-  function validate{{interface.name}}Request(messageValidator) {
-{%- if not(interface.methods) %}
-    return validator.validationError.NONE;
-{%- else %}
-    var message = messageValidator.message;
-    var paramsClass = null;
-    switch (message.getName()) {
-{%-   for method in interface.methods %}
-      case k{{interface.name}}_{{method.name}}_Name:
-{%-     if method.response_parameters == None %}
-        if (!message.expectsResponse() && !message.isResponse())
-          paramsClass = {{interface.name}}_{{method.name}}_Params;
-{%-     else %}
-        if (message.expectsResponse())
-          paramsClass = {{interface.name}}_{{method.name}}_Params;
-{%-     endif %}
-      break;
-{%-   endfor %}
-    }
-    if (paramsClass === null)
-      return validator.validationError.NONE;
-    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
-{%- endif %}
-  }
-
-  function validate{{interface.name}}Response(messageValidator) {
-{%- if not(interface|has_callbacks) %}
-    return validator.validationError.NONE;
-{%- else %}
-   var message = messageValidator.message;
-   var paramsClass = null;
-   switch (message.getName()) {
-{%-   for method in interface.methods %}
-{%-     if method.response_parameters != None %}
-      case k{{interface.name}}_{{method.name}}_Name:
-        if (message.isResponse())
-          paramsClass = {{interface.name}}_{{method.name}}_ResponseParams;
-        break;
-{%-     endif %}
-{%-   endfor %}
-    }
-    if (paramsClass === null)
-      return validator.validationError.NONE;
-    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
-{%- endif %}
-  }
-
-  var {{interface.name}} = {
-    name: '{{namespace|replace(".","::")}}::{{interface.name}}',
-    kVersion: {{interface.version}},
-    ptrClass: {{interface.name}}Ptr,
-    proxyClass: {{interface.name}}Proxy,
-    stubClass: {{interface.name}}Stub,
-    validateRequest: validate{{interface.name}}Request,
-{%- if interface|has_callbacks %}
-    validateResponse: validate{{interface.name}}Response,
-{%- else %}
-    validateResponse: null,
-{%- endif %}
-  };
-{#--- Interface Constants #}
-{%- for constant in interface.constants %}
-  {{interface.name}}.{{constant.name}} = {{constant.value|expression_to_text}},
-{%-   endfor %}
-{#--- Interface Enums #}
-{%- from "enum_definition.tmpl" import enum_def -%}
-{%- for enum in interface.enums %}
-  {{ enum_def("%s.%s"|format(interface.name, enum.name), enum) }}
-{%-  endfor %}
-  {{interface.name}}Stub.prototype.validator = validate{{interface.name}}Request;
-{%- if interface|has_callbacks %}
-  {{interface.name}}Proxy.prototype.validator = validate{{interface.name}}Response;
-{%- else %}
-  {{interface.name}}Proxy.prototype.validator = null;
-{%- endif %}
diff --git a/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl b/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl
deleted file mode 100644
index 3637b19..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-{%- if use_new_js_bindings %}
-
-'use strict';
-
-(function() {
-  var mojomId = '{{module.path}}';
-  if (mojo.internal.isMojomLoaded(mojomId)) {
-    console.warn('The following mojom is loaded multiple times: ' + mojomId);
-    return;
-  }
-  mojo.internal.markMojomLoaded(mojomId);
-
-  // TODO(yzshen): Define these aliases to minimize the differences between the
-  // old/new modes. Remove them when the old mode goes away.
-  var bindings = mojo;
-  var codec = mojo.internal;
-  var validator = mojo.internal;
-
-{%-   for import in imports %}
-  var {{import.unique_name}} =
-      mojo.internal.exposeNamespace('{{import.module.namespace}}');
-  if (mojo.config.autoLoadMojomDeps) {
-    mojo.internal.loadMojomIfNecessary(
-        '{{import.module.path}}',
-        new URL(
-            '{{import.module|get_relative_path(module)}}.js',
-            document.currentScript.src).href);
-  }
-{%-   endfor %}
-
-{% include "module_definition.tmpl" %}
-})();
-
-{%- else %}
-
-define("{{module.path}}", [
-{%- if module.path !=
-         "mojo/public/interfaces/bindings/interface_control_messages.mojom" and
-       module.path !=
-         "mojo/public/interfaces/bindings/pipe_control_messages.mojom" %}
-    "mojo/public/js/bindings",
-{%-   endif %}
-    "mojo/public/js/codec",
-    "mojo/public/js/core",
-    "mojo/public/js/validator",
-{%-   for import in imports %}
-    "{{import.module.path}}",
-{%-   endfor %}
-], function(
-{%- if module.path !=
-         "mojo/public/interfaces/bindings/interface_control_messages.mojom" and
-       module.path !=
-         "mojo/public/interfaces/bindings/pipe_control_messages.mojom" -%}
-bindings, {% endif -%}
-codec, core, validator
-{%-   for import in imports -%}
-    , {{import.unique_name}}
-{%-   endfor -%}
-) {
-
-{%- include "module_definition.tmpl" %}
-
-  return exports;
-});
-
-{%- endif %}
diff --git a/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl
deleted file mode 100644
index a119ee9..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl
+++ /dev/null
@@ -1,49 +0,0 @@
-{#--- Constants #}
-{%- for constant in module.constants %}
-  var {{constant.name}} = {{constant.value|expression_to_text}};
-{%- endfor %}
-
-{#--- Enums #}
-{%- from "enum_definition.tmpl" import enum_def %}
-{%- for enum in enums %}
-  var {{ enum_def(enum.name, enum) }}
-{%-  endfor %}
-
-{#--- Struct definitions #}
-{%  for struct in structs %}
-{%-   include "struct_definition.tmpl" %}
-{%- endfor -%}
-
-{#--- Union definitions #}
-{%- from "union_definition.tmpl" import union_def %}
-{%- for union in unions %}
-{{union_def(union)|indent(2)}}
-{%- endfor %}
-
-{#--- Interface definitions #}
-{%- for interface in interfaces -%}
-{%-   include "interface_definition.tmpl" %}
-{%- endfor %}
-
-{%- if use_new_js_bindings %}
-  var exports = mojo.internal.exposeNamespace("{{module.namespace}}");
-{%- else %}
-  var exports = {};
-{%- endif %}
-
-{%- for constant in module.constants %}
-  exports.{{constant.name}} = {{constant.name}};
-{%- endfor %}
-{%- for enum in enums %}
-  exports.{{enum.name}} = {{enum.name}};
-{%- endfor %}
-{%- for struct in structs if struct.exported %}
-  exports.{{struct.name}} = {{struct.name}};
-{%- endfor %}
-{%- for union in unions %}
-  exports.{{union.name}} = {{union.name}};
-{%- endfor %}
-{%- for interface in interfaces %}
-  exports.{{interface.name}} = {{interface.name}};
-  exports.{{interface.name}}Ptr = {{interface.name}}Ptr;
-{%- endfor %}
diff --git a/mojo/public/tools/bindings/generators/js_templates/struct_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/struct_definition.tmpl
deleted file mode 100644
index e823e46..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/struct_definition.tmpl
+++ /dev/null
@@ -1,126 +0,0 @@
-{#--- Begin #}
-  function {{struct.name}}(values) {
-    this.initDefaults_();
-    this.initFields_(values);
-  }
-
-{#--- Enums #}
-{%- from "enum_definition.tmpl" import enum_def %}
-{%  for enum in struct.enums %}
-  {{enum_def("%s.%s"|format(struct.name, enum.name), enum)}}
-{%-  endfor %}
-
-{#--- Constants #}
-{%  for constant in struct.constants %}
-  {{struct.name}}.{{constant.name}} = {{constant.value|expression_to_text}};
-{%-  endfor %}
-
-{#--- initDefaults() #}
-  {{struct.name}}.prototype.initDefaults_ = function() {
-{%- for packed_field in struct.packed.packed_fields %}
-    this.{{packed_field.field.name}} = {{packed_field.field|default_value}};
-{%- endfor %}
-  };
-
-{#--- initFields() #}
-  {{struct.name}}.prototype.initFields_ = function(fields) {
-    for(var field in fields) {
-        if (this.hasOwnProperty(field))
-          this[field] = fields[field];
-    }
-  };
-
-{#--- Validation #}
-
-  {{struct.name}}.validate = function(messageValidator, offset) {
-    var err;
-    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
-    if (err !== validator.validationError.NONE)
-        return err;
-
-    var kVersionSizes = [
-{%- for version in struct.versions %}
-      {version: {{version.version}}, numBytes: {{version.num_bytes}}}{% if not loop.last %},
-      {%- endif -%}
-{%  endfor %}
-    ];
-    err = messageValidator.validateStructVersion(offset, kVersionSizes);
-    if (err !== validator.validationError.NONE)
-        return err;
-
-{#- Before validating fields introduced at a certain version, we need to add
-    a version check, which makes sure we skip further validation if |object|
-    is from an earlier version. |last_checked_version| records the last
-    version that we have added such version check. #}
-{%- from "validation_macros.tmpl" import validate_struct_field %}
-{%- set last_checked_version = 0 %}
-{%- for packed_field in struct.packed.packed_fields_in_ordinal_order %}
-{%-   set offset = packed_field|field_offset %}
-{%-   set field = packed_field.field %}
-{%-   set name = struct.name ~ '.' ~ field.name %}
-{%    if field|is_object_field or field|is_any_handle_or_interface_field or
-          field|is_enum_field %}
-{%      if packed_field.min_version > last_checked_version %}
-{%        set last_checked_version = packed_field.min_version %}
-    // version check {{name}}
-    if (!messageValidator.isFieldInStructVersion(offset, {{packed_field.min_version}}))
-      return validator.validationError.NONE;
-{%-     endif -%}
-{{validate_struct_field(field, offset, name)|indent(4)}}
-{%-   endif %}
-{%- endfor %}
-
-    return validator.validationError.NONE;
-  };
-
-{#--- Encoding and decoding #}
-
-  {{struct.name}}.encodedSize = codec.kStructHeaderSize + {{struct.packed|payload_size}};
-
-  {{struct.name}}.decode = function(decoder) {
-    var packed;
-    var val = new {{struct.name}}();
-    var numberOfBytes = decoder.readUint32();
-    var version = decoder.readUint32();
-{%- for byte in struct.bytes %}
-{%-   if byte.packed_fields|length >= 1 and
-         byte.packed_fields[0].field|is_bool_field %}
-    packed = decoder.readUint8();
-{%-     for packed_field in byte.packed_fields %}
-    val.{{packed_field.field.name}} = (packed >> {{packed_field.bit}}) & 1 ? true : false;
-{%-     endfor %}
-{%-   else %}
-{%-     for packed_field in byte.packed_fields %}
-    val.{{packed_field.field.name}} = decoder.{{packed_field.field.kind|decode_snippet}};
-{%-     endfor %}
-{%-   endif %}
-{%-   if byte.is_padding %}
-    decoder.skip(1);
-{%-   endif %}
-{%- endfor %}
-    return val;
-  };
-
-  {{struct.name}}.encode = function(encoder, val) {
-    var packed;
-    encoder.writeUint32({{struct.name}}.encodedSize);
-    encoder.writeUint32({{struct.versions[-1].version}});
-
-{%- for byte in struct.bytes %}
-{%-   if byte.packed_fields|length >= 1 and
-         byte.packed_fields[0].field|is_bool_field %}
-    packed = 0;
-{%-     for packed_field in byte.packed_fields %}
-    packed |= (val.{{packed_field.field.name}} & 1) << {{packed_field.bit}}
-{%-     endfor %}
-    encoder.writeUint8(packed);
-{%-   else %}
-{%-     for packed_field in byte.packed_fields %}
-    encoder.{{packed_field.field.kind|encode_snippet}}val.{{packed_field.field.name}});
-{%-     endfor %}
-{%-   endif %}
-{%-   if byte.is_padding %}
-    encoder.skip(1);
-{%-   endif %}
-{%- endfor %}
-  };
diff --git a/mojo/public/tools/bindings/generators/js_templates/union_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/union_definition.tmpl
deleted file mode 100644
index 4823feb..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/union_definition.tmpl
+++ /dev/null
@@ -1,154 +0,0 @@
-{%- macro union_def(union) %}
-function {{union.name}}(value) {
-  this.initDefault_();
-  this.initValue_(value);
-}
-
-{{tags(union)}}
-
-{{union.name}}.prototype.initDefault_ = function() {
-  this.$data = null;
-  this.$tag = undefined;
-}
-
-{{union.name}}.prototype.initValue_ = function(value) {
-  if (value == undefined) {
-    return;
-  }
-
-  var keys = Object.keys(value);
-  if (keys.length == 0) {
-    return;
-  }
-
-  if (keys.length > 1) {
-    throw new TypeError("You may set only one member on a union.");
-  }
-
-  var fields = [
-{%-   for field in union.fields %}
-      "{{field.name}}",
-{%-   endfor %}
-  ];
-
-  if (fields.indexOf(keys[0]) < 0) {
-    throw new ReferenceError(keys[0] + " is not a {{union.name}} member.");
-
-  }
-
-  this[keys[0]] = value[keys[0]];
-}
-
-{%-   for field in union.fields %}
-Object.defineProperty({{union.name}}.prototype, "{{field.name}}", {
-  get: function() {
-    if (this.$tag != {{union.name}}.Tags.{{field.name}}) {
-      throw new ReferenceError(
-          "{{union.name}}.{{field.name}} is not currently set.");
-    }
-    return this.$data;
-  },
-
-  set: function(value) {
-    this.$tag = {{union.name}}.Tags.{{field.name}};
-    this.$data = value;
-  }
-});
-{%-   endfor %}
-
-{{encode(union)|indent(2)}}
-
-{{decode(union)|indent(2)}}
-
-{{validate(union)|indent(2)}}
-
-{{union.name}}.encodedSize = 16;
-{%- endmacro %}
-
-{%- macro tags(union) %}
-{{union.name}}.Tags = {
-{%-   for field in union.fields %}
-  {{field.name}}: {{field.ordinal}},
-{%-   endfor %}
-};
-{%- endmacro %}
-
-{%- macro encode(union) %}
-{{union.name}}.encode = function(encoder, val) {
-  if (val == null) {
-    encoder.writeUint64(0);
-    encoder.writeUint64(0);
-    return;
-  }
-  if (val.$tag == undefined) {
-    throw new TypeError("Cannot encode unions with an unknown member set.");
-  }
-
-  encoder.writeUint32(16);
-  encoder.writeUint32(val.$tag);
-  switch (val.$tag) {
-{%-   for field in union.fields %}
-    case {{union.name}}.Tags.{{field.name}}:
-{%-     if field|is_bool_field %}
-      encoder.writeUint8(val.{{field.name}} ? 1 : 0);
-{%-     else %}
-      encoder.{{field.kind|union_encode_snippet}}val.{{field.name}});
-{%-     endif %}
-      break;
-{%-   endfor %}
-  }
-  encoder.align();
-};
-{%- endmacro %}
-
-{%- macro decode(union) %}
-{{union.name}}.decode = function(decoder) {
-  var size = decoder.readUint32();
-  if (size == 0) {
-    decoder.readUint32();
-    decoder.readUint64();
-    return null;
-  }
-
-  var result = new {{union.name}}();
-  var tag = decoder.readUint32();
-  switch (tag) {
-{%-   for field in union.fields %}
-    case {{union.name}}.Tags.{{field.name}}:
-{%-     if field|is_bool_field %}
-      result.{{field.name}} = decoder.readUint8() ? true : false;
-{%-     else %}
-      result.{{field.name}} = decoder.{{field.kind|union_decode_snippet}};
-{%-     endif %}
-      break;
-{%-   endfor %}
-  }
-  decoder.align();
-
-  return result;
-};
-{%- endmacro %}
-
-{%- from "validation_macros.tmpl" import validate_union_field %}
-{%- macro validate(union) %}
-{{union.name}}.validate = function(messageValidator, offset) {
-  var size = messageValidator.decodeUnionSize(offset);
-  if (size != 16) {
-    return validator.validationError.INVALID_UNION_SIZE;
-  }
-
-  var tag = messageValidator.decodeUnionTag(offset);
-  var data_offset = offset + 8;
-  var err;
-  switch (tag) {
-{%-   for field in union.fields %}
-{%-     set name = union.name ~ '.' ~ field.name %}
-    case {{union.name}}.Tags.{{field.name}}:
-      {{validate_union_field(field, "data_offset", name)}}
-      break;
-{%-   endfor %}
-  }
-
-  return validator.validationError.NONE;
-};
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/js_templates/validation_macros.tmpl b/mojo/public/tools/bindings/generators/js_templates/validation_macros.tmpl
deleted file mode 100644
index d4e15a7..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/validation_macros.tmpl
+++ /dev/null
@@ -1,60 +0,0 @@
-{% macro _check_err() -%}
-if (err !== validator.validationError.NONE)
-    return err;
-{%- endmacro %}
-
-{%- macro _validate_field(field, offset, name) %}
-{%-   if field|is_string_pointer_field %}
-// validate {{name}}
-err = messageValidator.validateStringPointer({{offset}}, {{field|validate_nullable_params}})
-{{_check_err()}}
-{%-   elif field|is_array_pointer_field %}
-// validate {{name}}
-err = messageValidator.validateArrayPointer({{offset}}, {{field|validate_array_params}});
-{{_check_err()}}
-{%-   elif field|is_struct_pointer_field %}
-// validate {{name}}
-err = messageValidator.validateStructPointer({{offset}}, {{field|validate_struct_params}});
-{{_check_err()}}
-{%-   elif field|is_map_pointer_field %}
-// validate {{name}}
-err = messageValidator.validateMapPointer({{offset}}, {{field|validate_map_params}});
-{{_check_err()}}
-{%-   elif field|is_interface_field %}
-// validate {{name}}
-err = messageValidator.validateInterface({{offset}}, {{field|validate_nullable_params}});
-{{_check_err()}}
-{%-   elif field|is_interface_request_field %}
-// validate {{name}}
-err = messageValidator.validateInterfaceRequest({{offset}}, {{field|validate_nullable_params}})
-{{_check_err()}}
-{%-   elif field|is_handle_field %}
-// validate {{name}}
-err = messageValidator.validateHandle({{offset}}, {{field|validate_nullable_params}})
-{{_check_err()}}
-{%-   elif field|is_enum_field %}
-// validate {{name}}
-err = messageValidator.validateEnum({{offset}}, {{field|validate_enum_params}});
-{{_check_err()}}
-{%-   endif %}
-{%- endmacro %}
-
-{%- macro validate_struct_field(field, offset, name) %}
-{%-   if field|is_union_field %}
-// validate {{name}}
-err = messageValidator.validateUnion({{offset}}, {{field|validate_union_params}});
-{{_check_err()}}
-{%-   else %}
-{{_validate_field(field, offset, name)}}
-{%-   endif %}
-{%- endmacro %}
-
-{%- macro validate_union_field(field, offset, name) %}
-{%-   if field|is_union_field %}
-// validate {{name}}
-err = messageValidator.validateNestedUnion({{offset}}, {{field|validate_union_params}});
-{{_check_err()}}
-{%-   else %}
-{{_validate_field(field, offset, name)}}
-{%-   endif %}
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
deleted file mode 100644
index 38d222b..0000000
--- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
+++ /dev/null
@@ -1,818 +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.
-
-"""Generates C++ source files from a mojom.Module."""
-
-import mojom.generate.generator as generator
-import mojom.generate.module as mojom
-import mojom.generate.pack as pack
-from mojom.generate.template_expander import UseJinja
-
-
-_kind_to_cpp_type = {
-  mojom.BOOL:                  "bool",
-  mojom.INT8:                  "int8_t",
-  mojom.UINT8:                 "uint8_t",
-  mojom.INT16:                 "int16_t",
-  mojom.UINT16:                "uint16_t",
-  mojom.INT32:                 "int32_t",
-  mojom.UINT32:                "uint32_t",
-  mojom.FLOAT:                 "float",
-  mojom.INT64:                 "int64_t",
-  mojom.UINT64:                "uint64_t",
-  mojom.DOUBLE:                "double",
-}
-
-_kind_to_cpp_literal_suffix = {
-  mojom.UINT8:        "U",
-  mojom.UINT16:       "U",
-  mojom.UINT32:       "U",
-  mojom.FLOAT:        "f",
-  mojom.UINT64:       "ULL",
-}
-
-# TODO(rockot): Get rid of these globals. This requires some refactoring of the
-# generator library code so that filters can use the generator as context.
-_current_typemap = {}
-_for_blink = False
-# TODO(rockot, yzshen): The variant handling is kind of a hack currently. Make
-# it right.
-_variant = None
-_export_attribute = None
-
-
-class _NameFormatter(object):
-  """A formatter for the names of kinds or values."""
-
-  def __init__(self, token, variant):
-    self._token = token
-    self._variant = variant
-
-  def Format(self, separator, prefixed=False, internal=False,
-             include_variant=False, add_same_module_namespaces=False,
-             flatten_nested_kind=False):
-    """Formats the name according to the given configuration.
-
-    Args:
-      separator: Separator between different parts of the name.
-      prefixed: Whether a leading separator should be added.
-      internal: Returns the name in the "internal" namespace.
-      include_variant: Whether to include variant as namespace. If |internal| is
-          True, then this flag is ignored and variant is not included.
-      add_same_module_namespaces: Includes all namespaces even if the token is
-          from the same module as the current mojom file.
-      flatten_nested_kind: It is allowed to define enums inside structs and
-          interfaces. If this flag is set to True, this method concatenates the
-          parent kind and the nested kind with '_', instead of treating the
-          parent kind as a scope."""
-
-    parts = []
-    if self._ShouldIncludeNamespace(add_same_module_namespaces):
-      if prefixed:
-        parts.append("")
-      parts.extend(self._GetNamespace())
-      if include_variant and self._variant and not internal:
-        parts.append(self._variant)
-    parts.extend(self._GetName(internal, flatten_nested_kind))
-    return separator.join(parts)
-
-  def FormatForCpp(self, add_same_module_namespaces=False, internal=False,
-                   flatten_nested_kind=False):
-    return self.Format(
-        "::", prefixed=True,
-        add_same_module_namespaces=add_same_module_namespaces,
-        internal=internal, include_variant=True,
-        flatten_nested_kind=flatten_nested_kind)
-
-  def FormatForMojom(self):
-    return self.Format(".", add_same_module_namespaces=True)
-
-  def _MapKindName(self, token, internal):
-    if not internal:
-      return token.name
-    if (mojom.IsStructKind(token) or mojom.IsUnionKind(token) or
-        mojom.IsEnumKind(token)):
-      return token.name + "_Data"
-    return token.name
-
-  def _GetName(self, internal, flatten_nested_kind):
-    if isinstance(self._token, mojom.EnumValue):
-      name_parts = _NameFormatter(self._token.enum, self._variant)._GetName(
-          internal, flatten_nested_kind)
-      name_parts.append(self._token.name)
-      return name_parts
-
-    name_parts = []
-    if internal:
-      name_parts.append("internal")
-
-    if (flatten_nested_kind and mojom.IsEnumKind(self._token) and
-        self._token.parent_kind):
-      name = "%s_%s" % (self._token.parent_kind.name,
-                        self._MapKindName(self._token, internal))
-      name_parts.append(name)
-      return name_parts
-
-    if self._token.parent_kind:
-      name_parts.append(self._MapKindName(self._token.parent_kind, internal))
-    name_parts.append(self._MapKindName(self._token, internal))
-    return name_parts
-
-  def _ShouldIncludeNamespace(self, add_same_module_namespaces):
-    return add_same_module_namespaces or self._token.imported_from
-
-  def _GetNamespace(self):
-    if self._token.imported_from:
-      return NamespaceToArray(self._token.imported_from["namespace"])
-    elif hasattr(self._token, "module"):
-      return NamespaceToArray(self._token.module.namespace)
-    return []
-
-
-def ConstantValue(constant):
-  return ExpressionToText(constant.value, kind=constant.kind)
-
-# TODO(yzshen): Revisit the default value feature. It was designed prior to
-# custom type mapping.
-def DefaultValue(field):
-  if field.default:
-    if mojom.IsStructKind(field.kind):
-      assert field.default == "default"
-      if not IsTypemappedKind(field.kind):
-        return "%s::New()" % GetNameForKind(field.kind)
-    return ExpressionToText(field.default, kind=field.kind)
-  return ""
-
-def NamespaceToArray(namespace):
-  return namespace.split(".") if namespace else []
-
-def GetNameForKind(kind, internal=False, flatten_nested_kind=False,
-                   add_same_module_namespaces=False):
-  return _NameFormatter(kind, _variant).FormatForCpp(
-      internal=internal, flatten_nested_kind=flatten_nested_kind,
-      add_same_module_namespaces=add_same_module_namespaces)
-
-def GetQualifiedNameForKind(kind, internal=False, flatten_nested_kind=False,
-                            include_variant=True):
-  return _NameFormatter(
-      kind, _variant if include_variant else None).FormatForCpp(
-          internal=internal, add_same_module_namespaces=True,
-          flatten_nested_kind=flatten_nested_kind)
-
-
-def GetWtfHashFnNameForEnum(enum):
-  return _NameFormatter(
-      enum, None).Format("_", internal=True, add_same_module_namespaces=True,
-                         flatten_nested_kind=True) + "HashFn"
-
-
-def GetFullMojomNameForKind(kind):
-  return _NameFormatter(kind, _variant).FormatForMojom()
-
-def IsTypemappedKind(kind):
-  return hasattr(kind, "name") and \
-      GetFullMojomNameForKind(kind) in _current_typemap
-
-def IsNativeOnlyKind(kind):
-  return (mojom.IsStructKind(kind) or mojom.IsEnumKind(kind)) and \
-      kind.native_only
-
-
-def IsHashableKind(kind):
-  """Check if the kind can be hashed.
-
-  Args:
-    kind: {Kind} The kind to check.
-
-  Returns:
-    {bool} True if a value of this kind can be hashed.
-  """
-  checked = set()
-  def Check(kind):
-    if kind.spec in checked:
-      return True
-    checked.add(kind.spec)
-    if mojom.IsNullableKind(kind):
-      return False
-    elif mojom.IsStructKind(kind):
-      if (IsTypemappedKind(kind) and
-          not _current_typemap[GetFullMojomNameForKind(kind)]["hashable"]):
-        return False
-      return all(Check(field.kind) for field in kind.fields)
-    elif mojom.IsEnumKind(kind):
-      return not IsTypemappedKind(kind) or _current_typemap[
-          GetFullMojomNameForKind(kind)]["hashable"]
-    elif mojom.IsUnionKind(kind):
-      return all(Check(field.kind) for field in kind.fields)
-    elif mojom.IsAnyHandleKind(kind):
-      return False
-    elif mojom.IsAnyInterfaceKind(kind):
-      return False
-    # TODO(tibell): Arrays and maps could be made hashable. We just don't have a
-    # use case yet.
-    elif mojom.IsArrayKind(kind):
-      return False
-    elif mojom.IsMapKind(kind):
-      return False
-    else:
-      return True
-  return Check(kind)
-
-
-def AllEnumValues(enum):
-  """Return all enum values associated with an enum.
-
-  Args:
-    enum: {mojom.Enum} The enum type.
-
-  Returns:
-   {Set[int]} The values.
-  """
-  return set(field.numeric_value for field in enum.fields)
-
-
-def GetNativeTypeName(typemapped_kind):
-  return _current_typemap[GetFullMojomNameForKind(typemapped_kind)]["typename"]
-
-def GetCppPodType(kind):
-  return _kind_to_cpp_type[kind]
-
-def FormatConstantDeclaration(constant, nested=False):
-  if mojom.IsStringKind(constant.kind):
-    if nested:
-      return "const char %s[]" % constant.name
-    return "%sextern const char %s[]" % \
-        ((_export_attribute + " ") if _export_attribute else "", constant.name)
-  return "constexpr %s %s = %s" % (GetCppPodType(constant.kind), constant.name,
-                                   ConstantValue(constant))
-
-def GetCppWrapperType(kind, add_same_module_namespaces=False):
-  def _AddOptional(type_name):
-    pattern = "WTF::Optional<%s>" if _for_blink else "base::Optional<%s>"
-    return pattern % type_name
-
-  if IsTypemappedKind(kind):
-    type_name = GetNativeTypeName(kind)
-    if (mojom.IsNullableKind(kind) and
-        not _current_typemap[GetFullMojomNameForKind(kind)][
-           "nullable_is_same_type"]):
-      type_name = _AddOptional(type_name)
-    return type_name
-  if mojom.IsEnumKind(kind):
-    return GetNameForKind(
-        kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
-    return "%sPtr" % GetNameForKind(
-        kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsArrayKind(kind):
-    pattern = "WTF::Vector<%s>" if _for_blink else "std::vector<%s>"
-    if mojom.IsNullableKind(kind):
-      pattern = _AddOptional(pattern)
-    return pattern % GetCppWrapperType(
-        kind.kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsMapKind(kind):
-    pattern = ("WTF::HashMap<%s, %s>" if _for_blink else
-               "std::unordered_map<%s, %s>")
-    if mojom.IsNullableKind(kind):
-      pattern = _AddOptional(pattern)
-    return pattern % (
-        GetCppWrapperType(
-            kind.key_kind,
-            add_same_module_namespaces=add_same_module_namespaces),
-        GetCppWrapperType(
-            kind.value_kind,
-            add_same_module_namespaces=add_same_module_namespaces))
-  if mojom.IsInterfaceKind(kind):
-    return "%sPtr" % GetNameForKind(
-        kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsInterfaceRequestKind(kind):
-    return "%sRequest" % GetNameForKind(
-        kind.kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsAssociatedInterfaceKind(kind):
-    return "%sAssociatedPtrInfo" % GetNameForKind(
-        kind.kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsAssociatedInterfaceRequestKind(kind):
-    return "%sAssociatedRequest" % GetNameForKind(
-        kind.kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsStringKind(kind):
-    if _for_blink:
-      return "WTF::String"
-    type_name = "std::string"
-    return _AddOptional(type_name) if mojom.IsNullableKind(kind) else type_name
-  if mojom.IsGenericHandleKind(kind):
-    return "mojo::ScopedHandle"
-  if mojom.IsDataPipeConsumerKind(kind):
-    return "mojo::ScopedDataPipeConsumerHandle"
-  if mojom.IsDataPipeProducerKind(kind):
-    return "mojo::ScopedDataPipeProducerHandle"
-  if mojom.IsMessagePipeKind(kind):
-    return "mojo::ScopedMessagePipeHandle"
-  if mojom.IsSharedBufferKind(kind):
-    return "mojo::ScopedSharedBufferHandle"
-  if not kind in _kind_to_cpp_type:
-    raise Exception("Unrecognized kind %s" % kind.spec)
-  return _kind_to_cpp_type[kind]
-
-def IsMoveOnlyKind(kind):
-  if IsTypemappedKind(kind):
-    if mojom.IsEnumKind(kind):
-      return False
-    return _current_typemap[GetFullMojomNameForKind(kind)]["move_only"]
-  if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
-    return True
-  if mojom.IsArrayKind(kind):
-    return IsMoveOnlyKind(kind.kind)
-  if mojom.IsMapKind(kind):
-    return IsMoveOnlyKind(kind.value_kind)
-  if mojom.IsAnyHandleOrInterfaceKind(kind):
-    return True
-  return False
-
-def IsCopyablePassByValue(kind):
-  if not IsTypemappedKind(kind):
-    return False
-  return _current_typemap[GetFullMojomNameForKind(kind)][
-      "copyable_pass_by_value"]
-
-def ShouldPassParamByValue(kind):
-  return ((not mojom.IsReferenceKind(kind)) or IsMoveOnlyKind(kind) or
-      IsCopyablePassByValue(kind))
-
-def GetCppWrapperParamType(kind):
-  cpp_wrapper_type = GetCppWrapperType(kind)
-  return (cpp_wrapper_type if ShouldPassParamByValue(kind)
-                           else "const %s&" % cpp_wrapper_type)
-
-def GetCppFieldType(kind):
-  if mojom.IsStructKind(kind):
-    return ("mojo::internal::Pointer<%s>" %
-        GetNameForKind(kind, internal=True))
-  if mojom.IsUnionKind(kind):
-    return "%s" % GetNameForKind(kind, internal=True)
-  if mojom.IsArrayKind(kind):
-    return ("mojo::internal::Pointer<mojo::internal::Array_Data<%s>>" %
-            GetCppFieldType(kind.kind))
-  if mojom.IsMapKind(kind):
-    return ("mojo::internal::Pointer<mojo::internal::Map_Data<%s, %s>>" %
-            (GetCppFieldType(kind.key_kind), GetCppFieldType(kind.value_kind)))
-  if mojom.IsInterfaceKind(kind):
-    return "mojo::internal::Interface_Data"
-  if mojom.IsInterfaceRequestKind(kind):
-    return "mojo::internal::Handle_Data"
-  if mojom.IsAssociatedInterfaceKind(kind):
-    return "mojo::internal::AssociatedInterface_Data"
-  if mojom.IsAssociatedInterfaceRequestKind(kind):
-    return "mojo::internal::AssociatedEndpointHandle_Data"
-  if mojom.IsEnumKind(kind):
-    return "int32_t"
-  if mojom.IsStringKind(kind):
-    return "mojo::internal::Pointer<mojo::internal::String_Data>"
-  if mojom.IsAnyHandleKind(kind):
-    return "mojo::internal::Handle_Data"
-  return _kind_to_cpp_type[kind]
-
-def GetCppUnionFieldType(kind):
-  if mojom.IsUnionKind(kind):
-    return ("mojo::internal::Pointer<%s>" % GetNameForKind(kind, internal=True))
-  return GetCppFieldType(kind)
-
-def GetUnionGetterReturnType(kind):
-  if mojom.IsReferenceKind(kind):
-    return "%s&" % GetCppWrapperType(kind)
-  return GetCppWrapperType(kind)
-
-def GetUnionTraitGetterReturnType(kind):
-  """Get field type used in UnionTraits template specialization.
-
-  The type may be qualified as UnionTraits specializations live outside the
-  namespace where e.g. structs are defined.
-
-  Args:
-    kind: {Kind} The type of the field.
-
-  Returns:
-    {str} The C++ type to use for the field.
-  """
-  if mojom.IsReferenceKind(kind):
-    return "%s&" % GetCppWrapperType(kind, add_same_module_namespaces=True)
-  return GetCppWrapperType(kind, add_same_module_namespaces=True)
-
-def GetCppDataViewType(kind, qualified=False):
-  def _GetName(input_kind):
-    return _NameFormatter(input_kind, None).FormatForCpp(
-        add_same_module_namespaces=qualified, flatten_nested_kind=True)
-
-  if mojom.IsEnumKind(kind):
-    return _GetName(kind)
-  if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
-    return "%sDataView" % _GetName(kind)
-  if mojom.IsArrayKind(kind):
-    return "mojo::ArrayDataView<%s>" % GetCppDataViewType(kind.kind, qualified)
-  if mojom.IsMapKind(kind):
-    return ("mojo::MapDataView<%s, %s>" % (
-        GetCppDataViewType(kind.key_kind, qualified),
-        GetCppDataViewType(kind.value_kind, qualified)))
-  if mojom.IsStringKind(kind):
-    return "mojo::StringDataView"
-  if mojom.IsInterfaceKind(kind):
-    return "%sPtrDataView" % _GetName(kind)
-  if mojom.IsInterfaceRequestKind(kind):
-    return "%sRequestDataView" % _GetName(kind.kind)
-  if mojom.IsAssociatedInterfaceKind(kind):
-    return "%sAssociatedPtrInfoDataView" % _GetName(kind.kind)
-  if mojom.IsAssociatedInterfaceRequestKind(kind):
-    return "%sAssociatedRequestDataView" % _GetName(kind.kind)
-  if mojom.IsGenericHandleKind(kind):
-    return "mojo::ScopedHandle"
-  if mojom.IsDataPipeConsumerKind(kind):
-    return "mojo::ScopedDataPipeConsumerHandle"
-  if mojom.IsDataPipeProducerKind(kind):
-    return "mojo::ScopedDataPipeProducerHandle"
-  if mojom.IsMessagePipeKind(kind):
-    return "mojo::ScopedMessagePipeHandle"
-  if mojom.IsSharedBufferKind(kind):
-    return "mojo::ScopedSharedBufferHandle"
-  return _kind_to_cpp_type[kind]
-
-def GetUnmappedTypeForSerializer(kind):
-  return GetCppDataViewType(kind, qualified=True)
-
-def TranslateConstants(token, kind):
-  if isinstance(token, mojom.NamedValue):
-    return GetNameForKind(token, flatten_nested_kind=True)
-
-  if isinstance(token, mojom.BuiltinValue):
-    if token.value == "double.INFINITY":
-      return "std::numeric_limits<double>::infinity()"
-    if token.value == "float.INFINITY":
-      return "std::numeric_limits<float>::infinity()"
-    if token.value == "double.NEGATIVE_INFINITY":
-      return "-std::numeric_limits<double>::infinity()"
-    if token.value == "float.NEGATIVE_INFINITY":
-      return "-std::numeric_limits<float>::infinity()"
-    if token.value == "double.NAN":
-      return "std::numeric_limits<double>::quiet_NaN()"
-    if token.value == "float.NAN":
-      return "std::numeric_limits<float>::quiet_NaN()"
-
-  if (kind is not None and mojom.IsFloatKind(kind)):
-      return token if token.isdigit() else token + "f";
-
-  # Per C++11, 2.14.2, the type of an integer literal is the first of the
-  # corresponding list in Table 6 in which its value can be represented. In this
-  # case, the list for decimal constants with no suffix is:
-  #   int, long int, long long int
-  # The standard considers a program ill-formed if it contains an integer
-  # literal that cannot be represented by any of the allowed types.
-  #
-  # As it turns out, MSVC doesn't bother trying to fall back to long long int,
-  # so the integral constant -2147483648 causes it grief: it decides to
-  # represent 2147483648 as an unsigned integer, and then warns that the unary
-  # minus operator doesn't make sense on unsigned types. Doh!
-  if kind == mojom.INT32 and token == "-2147483648":
-    return "(-%d - 1) /* %s */" % (
-        2**31 - 1, "Workaround for MSVC bug; see https://crbug.com/445618")
-
-  return "%s%s" % (token, _kind_to_cpp_literal_suffix.get(kind, ""))
-
-def ExpressionToText(value, kind=None):
-  return TranslateConstants(value, kind)
-
-def RequiresContextForDataView(kind):
-  for field in kind.fields:
-    if mojom.IsReferenceKind(field.kind):
-      return True
-  return False
-
-def ShouldInlineStruct(struct):
-  # TODO(darin): Base this on the size of the wrapper class.
-  if len(struct.fields) > 4:
-    return False
-  for field in struct.fields:
-    if mojom.IsReferenceKind(field.kind) and not mojom.IsStringKind(field.kind):
-      return False
-  return True
-
-def ContainsMoveOnlyMembers(struct):
-  for field in struct.fields:
-    if IsMoveOnlyKind(field.kind):
-      return True
-  return False
-
-def ShouldInlineUnion(union):
-  return not any(
-      mojom.IsReferenceKind(field.kind) and not mojom.IsStringKind(field.kind)
-           for field in union.fields)
-
-
-class StructConstructor(object):
-  """Represents a constructor for a generated struct.
-
-  Fields:
-    fields: {[Field]} All struct fields in order.
-    params: {[Field]} The fields that are passed as params.
-  """
-
-  def __init__(self, fields, params):
-    self._fields = fields
-    self._params = set(params)
-
-  @property
-  def params(self):
-    return [field for field in self._fields if field in self._params]
-
-  @property
-  def fields(self):
-    for field in self._fields:
-      yield (field, field in self._params)
-
-
-def GetStructConstructors(struct):
-  """Returns a list of constructors for a struct.
-
-  Params:
-    struct: {Struct} The struct to return constructors for.
-
-  Returns:
-    {[StructConstructor]} A list of StructConstructors that should be generated
-    for |struct|.
-  """
-  if not mojom.IsStructKind(struct):
-    raise TypeError
-  # Types that are neither copyable nor movable can't be passed to a struct
-  # constructor so only generate a default constructor.
-  if any(IsTypemappedKind(field.kind) and _current_typemap[
-      GetFullMojomNameForKind(field.kind)]["non_copyable_non_movable"]
-         for field in struct.fields):
-    return [StructConstructor(struct.fields, [])]
-
-  param_counts = [0]
-  for version in struct.versions:
-    if param_counts[-1] != version.num_fields:
-      param_counts.append(version.num_fields)
-
-  ordinal_fields = sorted(struct.fields, key=lambda field: field.ordinal)
-  return (StructConstructor(struct.fields, ordinal_fields[:param_count])
-          for param_count in param_counts)
-
-
-def GetContainerValidateParamsCtorArgs(kind):
-  if mojom.IsStringKind(kind):
-    expected_num_elements = 0
-    element_is_nullable = False
-    key_validate_params = "nullptr"
-    element_validate_params = "nullptr"
-    enum_validate_func = "nullptr"
-  elif mojom.IsMapKind(kind):
-    expected_num_elements = 0
-    element_is_nullable = False
-    key_validate_params = GetNewContainerValidateParams(mojom.Array(
-        kind=kind.key_kind))
-    element_validate_params = GetNewContainerValidateParams(mojom.Array(
-        kind=kind.value_kind))
-    enum_validate_func = "nullptr"
-  else:  # mojom.IsArrayKind(kind)
-    expected_num_elements = generator.ExpectedArraySize(kind) or 0
-    element_is_nullable = mojom.IsNullableKind(kind.kind)
-    key_validate_params = "nullptr"
-    element_validate_params = GetNewContainerValidateParams(kind.kind)
-    if mojom.IsEnumKind(kind.kind):
-      enum_validate_func = ("%s::Validate" %
-                            GetQualifiedNameForKind(kind.kind, internal=True,
-                                                    flatten_nested_kind=True))
-    else:
-      enum_validate_func = "nullptr"
-
-  if enum_validate_func == "nullptr":
-    if key_validate_params == "nullptr":
-      return "%d, %s, %s" % (expected_num_elements,
-                             "true" if element_is_nullable else "false",
-                             element_validate_params)
-    else:
-      return "%s, %s" % (key_validate_params, element_validate_params)
-  else:
-    return "%d, %s" % (expected_num_elements, enum_validate_func)
-
-def GetNewContainerValidateParams(kind):
-  if (not mojom.IsArrayKind(kind) and not mojom.IsMapKind(kind) and
-      not mojom.IsStringKind(kind)):
-    return "nullptr"
-
-  return "new mojo::internal::ContainerValidateParams(%s)" % (
-      GetContainerValidateParamsCtorArgs(kind))
-
-class Generator(generator.Generator):
-
-  cpp_filters = {
-    "all_enum_values": AllEnumValues,
-    "constant_value": ConstantValue,
-    "contains_handles_or_interfaces": mojom.ContainsHandlesOrInterfaces,
-    "contains_move_only_members": ContainsMoveOnlyMembers,
-    "cpp_wrapper_param_type": GetCppWrapperParamType,
-    "cpp_data_view_type": GetCppDataViewType,
-    "cpp_field_type": GetCppFieldType,
-    "cpp_union_field_type": GetCppUnionFieldType,
-    "cpp_pod_type": GetCppPodType,
-    "cpp_union_getter_return_type": GetUnionGetterReturnType,
-    "cpp_union_trait_getter_return_type": GetUnionTraitGetterReturnType,
-    "cpp_wrapper_type": GetCppWrapperType,
-    "default_value": DefaultValue,
-    "expression_to_text": ExpressionToText,
-    "format_constant_declaration": FormatConstantDeclaration,
-    "get_container_validate_params_ctor_args":
-        GetContainerValidateParamsCtorArgs,
-    "get_name_for_kind": GetNameForKind,
-    "get_pad": pack.GetPad,
-    "get_qualified_name_for_kind": GetQualifiedNameForKind,
-    "has_callbacks": mojom.HasCallbacks,
-    "has_sync_methods": mojom.HasSyncMethods,
-    "requires_context_for_data_view": RequiresContextForDataView,
-    "should_inline": ShouldInlineStruct,
-    "should_inline_union": ShouldInlineUnion,
-    "is_array_kind": mojom.IsArrayKind,
-    "is_enum_kind": mojom.IsEnumKind,
-    "is_integral_kind": mojom.IsIntegralKind,
-    "is_native_only_kind": IsNativeOnlyKind,
-    "is_any_handle_kind": mojom.IsAnyHandleKind,
-    "is_any_interface_kind": mojom.IsAnyInterfaceKind,
-    "is_any_handle_or_interface_kind": mojom.IsAnyHandleOrInterfaceKind,
-    "is_associated_kind": mojom.IsAssociatedKind,
-    "is_hashable": IsHashableKind,
-    "is_map_kind": mojom.IsMapKind,
-    "is_nullable_kind": mojom.IsNullableKind,
-    "is_object_kind": mojom.IsObjectKind,
-    "is_reference_kind": mojom.IsReferenceKind,
-    "is_string_kind": mojom.IsStringKind,
-    "is_struct_kind": mojom.IsStructKind,
-    "is_typemapped_kind": IsTypemappedKind,
-    "is_union_kind": mojom.IsUnionKind,
-    "passes_associated_kinds": mojom.PassesAssociatedKinds,
-    "struct_constructors": GetStructConstructors,
-    "stylize_method": generator.StudlyCapsToCamel,
-    "under_to_camel": generator.UnderToCamel,
-    "unmapped_type_for_serializer": GetUnmappedTypeForSerializer,
-    "wtf_hash_fn_name_for_enum": GetWtfHashFnNameForEnum,
-  }
-
-  def GetExtraTraitsHeaders(self):
-    extra_headers = set()
-    for typemap in self._GetAllUsedTypemaps():
-      extra_headers.update(typemap.get("traits_headers", []))
-    return sorted(extra_headers)
-
-  def _GetAllUsedTypemaps(self):
-    """Returns the typemaps for types needed for serialization in this module.
-
-    A type is needed for serialization if it is contained by a struct or union
-    defined in this module, is a parameter of a message in an interface in
-    this module or is contained within another type needed for serialization.
-    """
-    used_typemaps = []
-    seen_types = set()
-    def AddKind(kind):
-      if (mojom.IsIntegralKind(kind) or mojom.IsStringKind(kind) or
-          mojom.IsDoubleKind(kind) or mojom.IsFloatKind(kind) or
-          mojom.IsAnyHandleKind(kind) or
-          mojom.IsInterfaceKind(kind) or
-          mojom.IsInterfaceRequestKind(kind) or
-          mojom.IsAssociatedKind(kind)):
-        pass
-      elif mojom.IsArrayKind(kind):
-        AddKind(kind.kind)
-      elif mojom.IsMapKind(kind):
-        AddKind(kind.key_kind)
-        AddKind(kind.value_kind)
-      else:
-        name = GetFullMojomNameForKind(kind)
-        if name in seen_types:
-          return
-        seen_types.add(name)
-
-        typemap = _current_typemap.get(name, None)
-        if typemap:
-          used_typemaps.append(typemap)
-        if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
-          for field in kind.fields:
-            AddKind(field.kind)
-
-    for kind in self.module.structs + self.module.unions:
-      for field in kind.fields:
-        AddKind(field.kind)
-
-    for interface in self.module.interfaces:
-      for method in interface.methods:
-        for parameter in method.parameters + (method.response_parameters or []):
-          AddKind(parameter.kind)
-
-    return used_typemaps
-
-  def GetExtraPublicHeaders(self):
-    all_enums = list(self.module.enums)
-    for struct in self.module.structs:
-      all_enums.extend(struct.enums)
-    for interface in self.module.interfaces:
-      all_enums.extend(interface.enums)
-
-    types = set(GetFullMojomNameForKind(typename)
-                for typename in
-                self.module.structs + all_enums + self.module.unions)
-    headers = set()
-    for typename, typemap in self.typemap.iteritems():
-      if typename in types:
-        headers.update(typemap.get("public_headers", []))
-    return sorted(headers)
-
-  def _GetDirectlyUsedKinds(self):
-    for struct in self.module.structs + self.module.unions:
-      for field in struct.fields:
-        yield field.kind
-
-    for interface in self.module.interfaces:
-      for method in interface.methods:
-        for param in method.parameters + (method.response_parameters or []):
-          yield param.kind
-
-  def GetJinjaExports(self):
-    structs = self.GetStructs()
-    interfaces = self.GetInterfaces()
-    all_enums = list(self.module.enums)
-    for struct in structs:
-      all_enums.extend(struct.enums)
-    for interface in interfaces:
-      all_enums.extend(interface.enums)
-
-    return {
-      "module": self.module,
-      "namespace": self.module.namespace,
-      "namespaces_as_array": NamespaceToArray(self.module.namespace),
-      "imports": self.module.imports,
-      "kinds": self.module.kinds,
-      "enums": self.module.enums,
-      "all_enums": all_enums,
-      "structs": structs,
-      "unions": self.GetUnions(),
-      "interfaces": interfaces,
-      "variant": self.variant,
-      "extra_traits_headers": self.GetExtraTraitsHeaders(),
-      "extra_public_headers": self.GetExtraPublicHeaders(),
-      "for_blink": self.for_blink,
-      "use_once_callback": self.use_once_callback,
-      "export_attribute": self.export_attribute,
-      "export_header": self.export_header,
-    }
-
-  @staticmethod
-  def GetTemplatePrefix():
-    return "cpp_templates"
-
-  @classmethod
-  def GetFilters(cls):
-    return cls.cpp_filters
-
-  @UseJinja("module.h.tmpl")
-  def GenerateModuleHeader(self):
-    return self.GetJinjaExports()
-
-  @UseJinja("module.cc.tmpl")
-  def GenerateModuleSource(self):
-    return self.GetJinjaExports()
-
-  @UseJinja("module-shared.h.tmpl")
-  def GenerateModuleSharedHeader(self):
-    return self.GetJinjaExports()
-
-  @UseJinja("module-shared-internal.h.tmpl")
-  def GenerateModuleSharedInternalHeader(self):
-    return self.GetJinjaExports()
-
-  @UseJinja("module-shared.cc.tmpl")
-  def GenerateModuleSharedSource(self):
-    return self.GetJinjaExports()
-
-  def GenerateFiles(self, args):
-    if self.generate_non_variant_code:
-      self.Write(self.GenerateModuleSharedHeader(),
-                 self.MatchMojomFilePath("%s-shared.h" % self.module.name))
-      self.Write(
-          self.GenerateModuleSharedInternalHeader(),
-          self.MatchMojomFilePath("%s-shared-internal.h" % self.module.name))
-      self.Write(self.GenerateModuleSharedSource(),
-                 self.MatchMojomFilePath("%s-shared.cc" % self.module.name))
-    else:
-      global _current_typemap
-      _current_typemap = self.typemap
-      global _for_blink
-      _for_blink = self.for_blink
-      global _use_once_callback
-      _use_once_callback = self.use_once_callback
-      global _variant
-      _variant = self.variant
-      global _export_attribute
-      _export_attribute = self.export_attribute
-      suffix = "-%s" % self.variant if self.variant else ""
-      self.Write(self.GenerateModuleHeader(),
-                 self.MatchMojomFilePath("%s%s.h" % (self.module.name, suffix)))
-      self.Write(
-          self.GenerateModuleSource(),
-          self.MatchMojomFilePath("%s%s.cc" % (self.module.name, suffix)))
diff --git a/mojo/public/tools/bindings/generators/mojom_java_generator.py b/mojo/public/tools/bindings/generators/mojom_java_generator.py
deleted file mode 100644
index c7657ff..0000000
--- a/mojo/public/tools/bindings/generators/mojom_java_generator.py
+++ /dev/null
@@ -1,550 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Generates java source files from a mojom.Module."""
-
-import argparse
-import ast
-import contextlib
-import os
-import re
-import shutil
-import sys
-import tempfile
-
-from jinja2 import contextfilter
-
-import mojom.fileutil as fileutil
-import mojom.generate.generator as generator
-import mojom.generate.module as mojom
-from mojom.generate.template_expander import UseJinja
-
-sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir,
-                             os.pardir, os.pardir, os.pardir, os.pardir,
-                             'build', 'android', 'gyp'))
-from util import build_utils
-
-
-GENERATOR_PREFIX = 'java'
-
-_spec_to_java_type = {
-  mojom.BOOL.spec: 'boolean',
-  mojom.DCPIPE.spec: 'org.chromium.mojo.system.DataPipe.ConsumerHandle',
-  mojom.DOUBLE.spec: 'double',
-  mojom.DPPIPE.spec: 'org.chromium.mojo.system.DataPipe.ProducerHandle',
-  mojom.FLOAT.spec: 'float',
-  mojom.HANDLE.spec: 'org.chromium.mojo.system.UntypedHandle',
-  mojom.INT16.spec: 'short',
-  mojom.INT32.spec: 'int',
-  mojom.INT64.spec: 'long',
-  mojom.INT8.spec: 'byte',
-  mojom.MSGPIPE.spec: 'org.chromium.mojo.system.MessagePipeHandle',
-  mojom.NULLABLE_DCPIPE.spec:
-      'org.chromium.mojo.system.DataPipe.ConsumerHandle',
-  mojom.NULLABLE_DPPIPE.spec:
-      'org.chromium.mojo.system.DataPipe.ProducerHandle',
-  mojom.NULLABLE_HANDLE.spec: 'org.chromium.mojo.system.UntypedHandle',
-  mojom.NULLABLE_MSGPIPE.spec: 'org.chromium.mojo.system.MessagePipeHandle',
-  mojom.NULLABLE_SHAREDBUFFER.spec:
-      'org.chromium.mojo.system.SharedBufferHandle',
-  mojom.NULLABLE_STRING.spec: 'String',
-  mojom.SHAREDBUFFER.spec: 'org.chromium.mojo.system.SharedBufferHandle',
-  mojom.STRING.spec: 'String',
-  mojom.UINT16.spec: 'short',
-  mojom.UINT32.spec: 'int',
-  mojom.UINT64.spec: 'long',
-  mojom.UINT8.spec: 'byte',
-}
-
-_spec_to_decode_method = {
-  mojom.BOOL.spec:                  'readBoolean',
-  mojom.DCPIPE.spec:                'readConsumerHandle',
-  mojom.DOUBLE.spec:                'readDouble',
-  mojom.DPPIPE.spec:                'readProducerHandle',
-  mojom.FLOAT.spec:                 'readFloat',
-  mojom.HANDLE.spec:                'readUntypedHandle',
-  mojom.INT16.spec:                 'readShort',
-  mojom.INT32.spec:                 'readInt',
-  mojom.INT64.spec:                 'readLong',
-  mojom.INT8.spec:                  'readByte',
-  mojom.MSGPIPE.spec:               'readMessagePipeHandle',
-  mojom.NULLABLE_DCPIPE.spec:       'readConsumerHandle',
-  mojom.NULLABLE_DPPIPE.spec:       'readProducerHandle',
-  mojom.NULLABLE_HANDLE.spec:       'readUntypedHandle',
-  mojom.NULLABLE_MSGPIPE.spec:      'readMessagePipeHandle',
-  mojom.NULLABLE_SHAREDBUFFER.spec: 'readSharedBufferHandle',
-  mojom.NULLABLE_STRING.spec:       'readString',
-  mojom.SHAREDBUFFER.spec:          'readSharedBufferHandle',
-  mojom.STRING.spec:                'readString',
-  mojom.UINT16.spec:                'readShort',
-  mojom.UINT32.spec:                'readInt',
-  mojom.UINT64.spec:                'readLong',
-  mojom.UINT8.spec:                 'readByte',
-}
-
-_java_primitive_to_boxed_type = {
-  'boolean': 'Boolean',
-  'byte':    'Byte',
-  'double':  'Double',
-  'float':   'Float',
-  'int':     'Integer',
-  'long':    'Long',
-  'short':   'Short',
-}
-
-
-def NameToComponent(name):
-  # insert '_' between anything and a Title name (e.g, HTTPEntry2FooBar ->
-  # HTTP_Entry2_FooBar)
-  name = re.sub('([^_])([A-Z][^A-Z_]+)', r'\1_\2', name)
-  # insert '_' between non upper and start of upper blocks (e.g.,
-  # HTTP_Entry2_FooBar -> HTTP_Entry2_Foo_Bar)
-  name = re.sub('([^A-Z_])([A-Z])', r'\1_\2', name)
-  return [x.lower() for x in name.split('_')]
-
-def UpperCamelCase(name):
-  return ''.join([x.capitalize() for x in NameToComponent(name)])
-
-def CamelCase(name):
-  uccc = UpperCamelCase(name)
-  return uccc[0].lower() + uccc[1:]
-
-def ConstantStyle(name):
-  components = NameToComponent(name)
-  if components[0] == 'k' and len(components) > 1:
-    components = components[1:]
-  # variable cannot starts with a digit.
-  if components[0][0].isdigit():
-    components[0] = '_' + components[0]
-  return '_'.join([x.upper() for x in components])
-
-def GetNameForElement(element):
-  if (mojom.IsEnumKind(element) or mojom.IsInterfaceKind(element) or
-      mojom.IsStructKind(element) or mojom.IsUnionKind(element)):
-    return UpperCamelCase(element.name)
-  if mojom.IsInterfaceRequestKind(element) or mojom.IsAssociatedKind(element):
-    return GetNameForElement(element.kind)
-  if isinstance(element, (mojom.Method,
-                          mojom.Parameter,
-                          mojom.Field)):
-    return CamelCase(element.name)
-  if isinstance(element,  mojom.EnumValue):
-    return (GetNameForElement(element.enum) + '.' +
-            ConstantStyle(element.name))
-  if isinstance(element, (mojom.NamedValue,
-                          mojom.Constant,
-                          mojom.EnumField)):
-    return ConstantStyle(element.name)
-  raise Exception('Unexpected element: %s' % element)
-
-def GetInterfaceResponseName(method):
-  return UpperCamelCase(method.name + 'Response')
-
-def ParseStringAttribute(attribute):
-  assert isinstance(attribute, basestring)
-  return attribute
-
-def GetJavaTrueFalse(value):
-  return 'true' if value else 'false'
-
-def GetArrayNullabilityFlags(kind):
-    """Returns nullability flags for an array type, see Decoder.java.
-
-    As we have dedicated decoding functions for arrays, we have to pass
-    nullability information about both the array itself, as well as the array
-    element type there.
-    """
-    assert mojom.IsArrayKind(kind)
-    ARRAY_NULLABLE   = \
-        'org.chromium.mojo.bindings.BindingsHelper.ARRAY_NULLABLE'
-    ELEMENT_NULLABLE = \
-        'org.chromium.mojo.bindings.BindingsHelper.ELEMENT_NULLABLE'
-    NOTHING_NULLABLE = \
-        'org.chromium.mojo.bindings.BindingsHelper.NOTHING_NULLABLE'
-
-    flags_to_set = []
-    if mojom.IsNullableKind(kind):
-        flags_to_set.append(ARRAY_NULLABLE)
-    if mojom.IsNullableKind(kind.kind):
-        flags_to_set.append(ELEMENT_NULLABLE)
-
-    if not flags_to_set:
-        flags_to_set = [NOTHING_NULLABLE]
-    return ' | '.join(flags_to_set)
-
-
-def AppendEncodeDecodeParams(initial_params, context, kind, bit):
-  """ Appends standard parameters shared between encode and decode calls. """
-  params = list(initial_params)
-  if (kind == mojom.BOOL):
-    params.append(str(bit))
-  if mojom.IsReferenceKind(kind):
-    if mojom.IsArrayKind(kind):
-      params.append(GetArrayNullabilityFlags(kind))
-    else:
-      params.append(GetJavaTrueFalse(mojom.IsNullableKind(kind)))
-  if mojom.IsArrayKind(kind):
-    params.append(GetArrayExpectedLength(kind))
-  if mojom.IsInterfaceKind(kind):
-    params.append('%s.MANAGER' % GetJavaType(context, kind))
-  if mojom.IsArrayKind(kind) and mojom.IsInterfaceKind(kind.kind):
-    params.append('%s.MANAGER' % GetJavaType(context, kind.kind))
-  return params
-
-
-@contextfilter
-def DecodeMethod(context, kind, offset, bit):
-  def _DecodeMethodName(kind):
-    if mojom.IsArrayKind(kind):
-      return _DecodeMethodName(kind.kind) + 's'
-    if mojom.IsEnumKind(kind):
-      return _DecodeMethodName(mojom.INT32)
-    if mojom.IsInterfaceRequestKind(kind):
-      return 'readInterfaceRequest'
-    if mojom.IsInterfaceKind(kind):
-      return 'readServiceInterface'
-    if mojom.IsAssociatedInterfaceRequestKind(kind):
-      return 'readAssociatedInterfaceRequestNotSupported'
-    if mojom.IsAssociatedInterfaceKind(kind):
-      return 'readAssociatedServiceInterfaceNotSupported'
-    return _spec_to_decode_method[kind.spec]
-  methodName = _DecodeMethodName(kind)
-  params = AppendEncodeDecodeParams([ str(offset) ], context, kind, bit)
-  return '%s(%s)' % (methodName, ', '.join(params))
-
-@contextfilter
-def EncodeMethod(context, kind, variable, offset, bit):
-  params = AppendEncodeDecodeParams(
-      [ variable, str(offset) ], context, kind, bit)
-  return 'encode(%s)' % ', '.join(params)
-
-def GetPackage(module):
-  if module.attributes and 'JavaPackage' in module.attributes:
-    return ParseStringAttribute(module.attributes['JavaPackage'])
-  # Default package.
-  if module.namespace:
-    return 'org.chromium.' + module.namespace
-  return 'org.chromium'
-
-def GetNameForKind(context, kind):
-  def _GetNameHierachy(kind):
-    hierachy = []
-    if kind.parent_kind:
-      hierachy = _GetNameHierachy(kind.parent_kind)
-    hierachy.append(GetNameForElement(kind))
-    return hierachy
-
-  module = context.resolve('module')
-  elements = []
-  if GetPackage(module) != GetPackage(kind.module):
-    elements += [GetPackage(kind.module)]
-  elements += _GetNameHierachy(kind)
-  return '.'.join(elements)
-
-@contextfilter
-def GetJavaClassForEnum(context, kind):
-  return GetNameForKind(context, kind)
-
-def GetBoxedJavaType(context, kind, with_generics=True):
-  unboxed_type = GetJavaType(context, kind, False, with_generics)
-  if unboxed_type in _java_primitive_to_boxed_type:
-    return _java_primitive_to_boxed_type[unboxed_type]
-  return unboxed_type
-
-@contextfilter
-def GetJavaType(context, kind, boxed=False, with_generics=True):
-  if boxed:
-    return GetBoxedJavaType(context, kind)
-  if (mojom.IsStructKind(kind) or
-      mojom.IsInterfaceKind(kind) or
-      mojom.IsUnionKind(kind)):
-    return GetNameForKind(context, kind)
-  if mojom.IsInterfaceRequestKind(kind):
-    return ('org.chromium.mojo.bindings.InterfaceRequest<%s>' %
-            GetNameForKind(context, kind.kind))
-  if mojom.IsAssociatedInterfaceKind(kind):
-    return 'org.chromium.mojo.bindings.AssociatedInterfaceNotSupported'
-  if mojom.IsAssociatedInterfaceRequestKind(kind):
-    return 'org.chromium.mojo.bindings.AssociatedInterfaceRequestNotSupported'
-  if mojom.IsMapKind(kind):
-    if with_generics:
-      return 'java.util.Map<%s, %s>' % (
-          GetBoxedJavaType(context, kind.key_kind),
-          GetBoxedJavaType(context, kind.value_kind))
-    else:
-      return 'java.util.Map'
-  if mojom.IsArrayKind(kind):
-    return '%s[]' % GetJavaType(context, kind.kind, boxed, with_generics)
-  if mojom.IsEnumKind(kind):
-    return 'int'
-  return _spec_to_java_type[kind.spec]
-
-@contextfilter
-def DefaultValue(context, field):
-  assert field.default
-  if isinstance(field.kind, mojom.Struct):
-    assert field.default == 'default'
-    return 'new %s()' % GetJavaType(context, field.kind)
-  return '(%s) %s' % (
-      GetJavaType(context, field.kind),
-      ExpressionToText(context, field.default, kind_spec=field.kind.spec))
-
-@contextfilter
-def ConstantValue(context, constant):
-  return '(%s) %s' % (
-      GetJavaType(context, constant.kind),
-      ExpressionToText(context, constant.value, kind_spec=constant.kind.spec))
-
-@contextfilter
-def NewArray(context, kind, size):
-  if mojom.IsArrayKind(kind.kind):
-    return NewArray(context, kind.kind, size) + '[]'
-  return 'new %s[%s]' % (
-      GetJavaType(context, kind.kind, boxed=False, with_generics=False), size)
-
-@contextfilter
-def ExpressionToText(context, token, kind_spec=''):
-  def _TranslateNamedValue(named_value):
-    entity_name = GetNameForElement(named_value)
-    if named_value.parent_kind:
-      return GetJavaType(context, named_value.parent_kind) + '.' + entity_name
-    # Handle the case where named_value is a module level constant:
-    if not isinstance(named_value, mojom.EnumValue):
-      entity_name = (GetConstantsMainEntityName(named_value.module) + '.' +
-                      entity_name)
-    if GetPackage(named_value.module) == GetPackage(context.resolve('module')):
-      return entity_name
-    return GetPackage(named_value.module) + '.' + entity_name
-
-  if isinstance(token, mojom.NamedValue):
-    return _TranslateNamedValue(token)
-  if kind_spec.startswith('i') or kind_spec.startswith('u'):
-    # Add Long suffix to all integer literals.
-    number = ast.literal_eval(token.lstrip('+ '))
-    if not isinstance(number, (int, long)):
-      raise ValueError('got unexpected type %r for int literal %r' % (
-          type(number), token))
-    # If the literal is too large to fit a signed long, convert it to the
-    # equivalent signed long.
-    if number >= 2 ** 63:
-      number -= 2 ** 64
-    return '%dL' % number
-  if isinstance(token, mojom.BuiltinValue):
-    if token.value == 'double.INFINITY':
-      return 'java.lang.Double.POSITIVE_INFINITY'
-    if token.value == 'double.NEGATIVE_INFINITY':
-      return 'java.lang.Double.NEGATIVE_INFINITY'
-    if token.value == 'double.NAN':
-      return 'java.lang.Double.NaN'
-    if token.value == 'float.INFINITY':
-      return 'java.lang.Float.POSITIVE_INFINITY'
-    if token.value == 'float.NEGATIVE_INFINITY':
-      return 'java.lang.Float.NEGATIVE_INFINITY'
-    if token.value == 'float.NAN':
-      return 'java.lang.Float.NaN'
-  return token
-
-def GetArrayKind(kind, size = None):
-  if size is None:
-    return mojom.Array(kind)
-  else:
-    array = mojom.Array(kind, 0)
-    array.java_map_size = size
-    return array
-
-def GetArrayExpectedLength(kind):
-  if mojom.IsArrayKind(kind) and kind.length is not None:
-    return getattr(kind, 'java_map_size', str(kind.length))
-  else:
-    return 'org.chromium.mojo.bindings.BindingsHelper.UNSPECIFIED_ARRAY_LENGTH'
-
-def IsPointerArrayKind(kind):
-  if not mojom.IsArrayKind(kind):
-    return False
-  sub_kind = kind.kind
-  return mojom.IsObjectKind(sub_kind) and not mojom.IsUnionKind(sub_kind)
-
-def IsUnionArrayKind(kind):
-  if not mojom.IsArrayKind(kind):
-    return False
-  sub_kind = kind.kind
-  return mojom.IsUnionKind(sub_kind)
-
-def GetConstantsMainEntityName(module):
-  if module.attributes and 'JavaConstantsClassName' in module.attributes:
-    return ParseStringAttribute(module.attributes['JavaConstantsClassName'])
-  # This constructs the name of the embedding classes for module level constants
-  # by extracting the mojom's filename and prepending it to Constants.
-  return (UpperCamelCase(module.path.split('/')[-1].rsplit('.', 1)[0]) +
-          'Constants')
-
-def GetMethodOrdinalName(method):
-  return ConstantStyle(method.name) + '_ORDINAL'
-
-def HasMethodWithResponse(interface):
-  for method in interface.methods:
-    if method.response_parameters is not None:
-      return True
-  return False
-
-def HasMethodWithoutResponse(interface):
-  for method in interface.methods:
-    if method.response_parameters is None:
-      return True
-  return False
-
-@contextlib.contextmanager
-def TempDir():
-  dirname = tempfile.mkdtemp()
-  try:
-    yield dirname
-  finally:
-    shutil.rmtree(dirname)
-
-class Generator(generator.Generator):
-
-  java_filters = {
-    'array_expected_length': GetArrayExpectedLength,
-    'array': GetArrayKind,
-    'constant_value': ConstantValue,
-    'decode_method': DecodeMethod,
-    'default_value': DefaultValue,
-    'encode_method': EncodeMethod,
-    'expression_to_text': ExpressionToText,
-    'has_method_without_response': HasMethodWithoutResponse,
-    'has_method_with_response': HasMethodWithResponse,
-    'interface_response_name': GetInterfaceResponseName,
-    'is_array_kind': mojom.IsArrayKind,
-    'is_any_handle_kind': mojom.IsAnyHandleKind,
-    "is_enum_kind": mojom.IsEnumKind,
-    'is_interface_request_kind': mojom.IsInterfaceRequestKind,
-    'is_map_kind': mojom.IsMapKind,
-    'is_nullable_kind': mojom.IsNullableKind,
-    'is_pointer_array_kind': IsPointerArrayKind,
-    'is_reference_kind': mojom.IsReferenceKind,
-    'is_struct_kind': mojom.IsStructKind,
-    'is_union_array_kind': IsUnionArrayKind,
-    'is_union_kind': mojom.IsUnionKind,
-    'java_class_for_enum': GetJavaClassForEnum,
-    'java_true_false': GetJavaTrueFalse,
-    'java_type': GetJavaType,
-    'method_ordinal_name': GetMethodOrdinalName,
-    'name': GetNameForElement,
-    'new_array': NewArray,
-    'ucc': lambda x: UpperCamelCase(x.name),
-  }
-
-  def GetJinjaExports(self):
-    return {
-      'package': GetPackage(self.module),
-    }
-
-  @staticmethod
-  def GetTemplatePrefix():
-    return "java_templates"
-
-  @classmethod
-  def GetFilters(cls):
-    return cls.java_filters
-
-  def GetJinjaExportsForInterface(self, interface):
-    exports = self.GetJinjaExports()
-    exports.update({'interface': interface})
-    return exports
-
-  @UseJinja('enum.java.tmpl')
-  def GenerateEnumSource(self, enum):
-    exports = self.GetJinjaExports()
-    exports.update({'enum': enum})
-    return exports
-
-  @UseJinja('struct.java.tmpl')
-  def GenerateStructSource(self, struct):
-    exports = self.GetJinjaExports()
-    exports.update({'struct': struct})
-    return exports
-
-  @UseJinja('union.java.tmpl')
-  def GenerateUnionSource(self, union):
-    exports = self.GetJinjaExports()
-    exports.update({'union': union})
-    return exports
-
-  @UseJinja('interface.java.tmpl')
-  def GenerateInterfaceSource(self, interface):
-    return self.GetJinjaExportsForInterface(interface)
-
-  @UseJinja('interface_internal.java.tmpl')
-  def GenerateInterfaceInternalSource(self, interface):
-    return self.GetJinjaExportsForInterface(interface)
-
-  @UseJinja('constants.java.tmpl')
-  def GenerateConstantsSource(self, module):
-    exports = self.GetJinjaExports()
-    exports.update({'main_entity': GetConstantsMainEntityName(module),
-                    'constants': module.constants})
-    return exports
-
-  def DoGenerateFiles(self):
-    fileutil.EnsureDirectoryExists(self.output_dir)
-
-    # Keep this above the others as .GetStructs() changes the state of the
-    # module, annotating structs with required information.
-    for struct in self.GetStructs():
-      self.Write(self.GenerateStructSource(struct),
-                 '%s.java' % GetNameForElement(struct))
-
-    for union in self.module.unions:
-      self.Write(self.GenerateUnionSource(union),
-                 '%s.java' % GetNameForElement(union))
-
-    for enum in self.module.enums:
-      self.Write(self.GenerateEnumSource(enum),
-                 '%s.java' % GetNameForElement(enum))
-
-    for interface in self.GetInterfaces():
-      self.Write(self.GenerateInterfaceSource(interface),
-                 '%s.java' % GetNameForElement(interface))
-      self.Write(self.GenerateInterfaceInternalSource(interface),
-                 '%s_Internal.java' % GetNameForElement(interface))
-
-    if self.module.constants:
-      self.Write(self.GenerateConstantsSource(self.module),
-                 '%s.java' % GetConstantsMainEntityName(self.module))
-
-  def GenerateFiles(self, unparsed_args):
-    # TODO(rockot): Support variant output for Java.
-    if self.variant:
-      raise Exception("Variants not supported in Java bindings.")
-
-    parser = argparse.ArgumentParser()
-    parser.add_argument('--java_output_directory', dest='java_output_directory')
-    args = parser.parse_args(unparsed_args)
-    package_path = GetPackage(self.module).replace('.', '/')
-
-    # Generate the java files in a temporary directory and place a single
-    # srcjar in the output directory.
-    basename = self.MatchMojomFilePath("%s.srcjar" % self.module.name)
-    zip_filename = os.path.join(self.output_dir, basename)
-    with TempDir() as temp_java_root:
-      self.output_dir = os.path.join(temp_java_root, package_path)
-      self.DoGenerateFiles();
-      build_utils.ZipDir(zip_filename, temp_java_root)
-
-    if args.java_output_directory:
-      # If requested, generate the java files directly into indicated directory.
-      self.output_dir = os.path.join(args.java_output_directory, package_path)
-      self.DoGenerateFiles();
-
-  def GetJinjaParameters(self):
-    return {
-      'lstrip_blocks': True,
-      'trim_blocks': True,
-    }
-
-  def GetGlobals(self):
-    return {
-      'namespace': self.module.namespace,
-      'module': self.module,
-    }
diff --git a/mojo/public/tools/bindings/generators/mojom_js_generator.py b/mojo/public/tools/bindings/generators/mojom_js_generator.py
deleted file mode 100644
index ab9635e..0000000
--- a/mojo/public/tools/bindings/generators/mojom_js_generator.py
+++ /dev/null
@@ -1,425 +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.
-
-"""Generates JavaScript source files from a mojom.Module."""
-
-import mojom.generate.generator as generator
-import mojom.generate.module as mojom
-import mojom.generate.pack as pack
-import os
-from mojom.generate.template_expander import UseJinja
-
-_kind_to_javascript_default_value = {
-  mojom.BOOL:                  "false",
-  mojom.INT8:                  "0",
-  mojom.UINT8:                 "0",
-  mojom.INT16:                 "0",
-  mojom.UINT16:                "0",
-  mojom.INT32:                 "0",
-  mojom.UINT32:                "0",
-  mojom.FLOAT:                 "0",
-  mojom.HANDLE:                "null",
-  mojom.DCPIPE:                "null",
-  mojom.DPPIPE:                "null",
-  mojom.MSGPIPE:               "null",
-  mojom.SHAREDBUFFER:          "null",
-  mojom.NULLABLE_HANDLE:       "null",
-  mojom.NULLABLE_DCPIPE:       "null",
-  mojom.NULLABLE_DPPIPE:       "null",
-  mojom.NULLABLE_MSGPIPE:      "null",
-  mojom.NULLABLE_SHAREDBUFFER: "null",
-  mojom.INT64:                 "0",
-  mojom.UINT64:                "0",
-  mojom.DOUBLE:                "0",
-  mojom.STRING:                "null",
-  mojom.NULLABLE_STRING:       "null"
-}
-
-
-def JavaScriptType(kind):
-  name = []
-  if kind.imported_from:
-    name.append(kind.imported_from["unique_name"])
-  if kind.parent_kind:
-    name.append(kind.parent_kind.name)
-  name.append(kind.name)
-  return ".".join(name)
-
-
-def JavaScriptDefaultValue(field):
-  if field.default:
-    if mojom.IsStructKind(field.kind):
-      assert field.default == "default"
-      return "new %s()" % JavaScriptType(field.kind)
-    return ExpressionToText(field.default)
-  if field.kind in mojom.PRIMITIVES:
-    return _kind_to_javascript_default_value[field.kind]
-  if mojom.IsStructKind(field.kind):
-    return "null"
-  if mojom.IsUnionKind(field.kind):
-    return "null"
-  if mojom.IsArrayKind(field.kind):
-    return "null"
-  if mojom.IsMapKind(field.kind):
-    return "null"
-  if mojom.IsInterfaceKind(field.kind):
-    return "new %sPtr()" % JavaScriptType(field.kind)
-  if mojom.IsInterfaceRequestKind(field.kind):
-    return "new bindings.InterfaceRequest()"
-  if mojom.IsAssociatedKind(field.kind):
-    return "null"
-  if mojom.IsEnumKind(field.kind):
-    return "0"
-  raise Exception("No valid default: %s" % field)
-
-
-def JavaScriptPayloadSize(packed):
-  packed_fields = packed.packed_fields
-  if not packed_fields:
-    return 0
-  last_field = packed_fields[-1]
-  offset = last_field.offset + last_field.size
-  pad = pack.GetPad(offset, 8)
-  return offset + pad
-
-
-_kind_to_codec_type = {
-  mojom.BOOL:                  "codec.Uint8",
-  mojom.INT8:                  "codec.Int8",
-  mojom.UINT8:                 "codec.Uint8",
-  mojom.INT16:                 "codec.Int16",
-  mojom.UINT16:                "codec.Uint16",
-  mojom.INT32:                 "codec.Int32",
-  mojom.UINT32:                "codec.Uint32",
-  mojom.FLOAT:                 "codec.Float",
-  mojom.HANDLE:                "codec.Handle",
-  mojom.DCPIPE:                "codec.Handle",
-  mojom.DPPIPE:                "codec.Handle",
-  mojom.MSGPIPE:               "codec.Handle",
-  mojom.SHAREDBUFFER:          "codec.Handle",
-  mojom.NULLABLE_HANDLE:       "codec.NullableHandle",
-  mojom.NULLABLE_DCPIPE:       "codec.NullableHandle",
-  mojom.NULLABLE_DPPIPE:       "codec.NullableHandle",
-  mojom.NULLABLE_MSGPIPE:      "codec.NullableHandle",
-  mojom.NULLABLE_SHAREDBUFFER: "codec.NullableHandle",
-  mojom.INT64:                 "codec.Int64",
-  mojom.UINT64:                "codec.Uint64",
-  mojom.DOUBLE:                "codec.Double",
-  mojom.STRING:                "codec.String",
-  mojom.NULLABLE_STRING:       "codec.NullableString",
-}
-
-
-def CodecType(kind):
-  if kind in mojom.PRIMITIVES:
-    return _kind_to_codec_type[kind]
-  if mojom.IsStructKind(kind):
-    pointer_type = "NullablePointerTo" if mojom.IsNullableKind(kind) \
-        else "PointerTo"
-    return "new codec.%s(%s)" % (pointer_type, JavaScriptType(kind))
-  if mojom.IsUnionKind(kind):
-    return JavaScriptType(kind)
-  if mojom.IsArrayKind(kind):
-    array_type = "NullableArrayOf" if mojom.IsNullableKind(kind) else "ArrayOf"
-    array_length = "" if kind.length is None else ", %d" % kind.length
-    element_type = ElementCodecType(kind.kind)
-    return "new codec.%s(%s%s)" % (array_type, element_type, array_length)
-  if mojom.IsInterfaceKind(kind):
-    return "new codec.%s(%sPtr)" % (
-        "NullableInterface" if mojom.IsNullableKind(kind) else "Interface",
-        JavaScriptType(kind))
-  if mojom.IsInterfaceRequestKind(kind):
-    return "codec.%s" % (
-        "NullableInterfaceRequest" if mojom.IsNullableKind(kind)
-                                   else "InterfaceRequest")
-  if mojom.IsAssociatedInterfaceKind(kind):
-    return "codec.AssociatedInterfaceNotSupported"
-  if mojom.IsAssociatedInterfaceRequestKind(kind):
-    return "codec.AssociatedInterfaceRequestNotSupported"
-  if mojom.IsEnumKind(kind):
-    return "new codec.Enum(%s)" % JavaScriptType(kind)
-  if mojom.IsMapKind(kind):
-    map_type = "NullableMapOf" if mojom.IsNullableKind(kind) else "MapOf"
-    key_type = ElementCodecType(kind.key_kind)
-    value_type = ElementCodecType(kind.value_kind)
-    return "new codec.%s(%s, %s)" % (map_type, key_type, value_type)
-  raise Exception("No codec type for %s" % kind)
-
-
-def ElementCodecType(kind):
-  return "codec.PackedBool" if mojom.IsBoolKind(kind) else CodecType(kind)
-
-
-def JavaScriptDecodeSnippet(kind):
-  if (kind in mojom.PRIMITIVES or mojom.IsUnionKind(kind) or
-      mojom.IsAnyInterfaceKind(kind)):
-    return "decodeStruct(%s)" % CodecType(kind)
-  if mojom.IsStructKind(kind):
-    return "decodeStructPointer(%s)" % JavaScriptType(kind)
-  if mojom.IsMapKind(kind):
-    return "decodeMapPointer(%s, %s)" % \
-        (ElementCodecType(kind.key_kind), ElementCodecType(kind.value_kind))
-  if mojom.IsArrayKind(kind) and mojom.IsBoolKind(kind.kind):
-    return "decodeArrayPointer(codec.PackedBool)"
-  if mojom.IsArrayKind(kind):
-    return "decodeArrayPointer(%s)" % CodecType(kind.kind)
-  if mojom.IsUnionKind(kind):
-    return "decodeUnion(%s)" % CodecType(kind)
-  if mojom.IsEnumKind(kind):
-    return JavaScriptDecodeSnippet(mojom.INT32)
-  raise Exception("No decode snippet for %s" % kind)
-
-
-def JavaScriptEncodeSnippet(kind):
-  if (kind in mojom.PRIMITIVES or mojom.IsUnionKind(kind) or
-      mojom.IsAnyInterfaceKind(kind)):
-    return "encodeStruct(%s, " % CodecType(kind)
-  if mojom.IsUnionKind(kind):
-    return "encodeStruct(%s, " % JavaScriptType(kind)
-  if mojom.IsStructKind(kind):
-    return "encodeStructPointer(%s, " % JavaScriptType(kind)
-  if mojom.IsMapKind(kind):
-    return "encodeMapPointer(%s, %s, " % \
-        (ElementCodecType(kind.key_kind), ElementCodecType(kind.value_kind))
-  if mojom.IsArrayKind(kind) and mojom.IsBoolKind(kind.kind):
-    return "encodeArrayPointer(codec.PackedBool, ";
-  if mojom.IsArrayKind(kind):
-    return "encodeArrayPointer(%s, " % CodecType(kind.kind)
-  if mojom.IsEnumKind(kind):
-    return JavaScriptEncodeSnippet(mojom.INT32)
-  raise Exception("No encode snippet for %s" % kind)
-
-
-def JavaScriptUnionDecodeSnippet(kind):
-  if mojom.IsUnionKind(kind):
-    return "decodeStructPointer(%s)" % JavaScriptType(kind)
-  return JavaScriptDecodeSnippet(kind)
-
-
-def JavaScriptUnionEncodeSnippet(kind):
-  if mojom.IsUnionKind(kind):
-    return "encodeStructPointer(%s, " % JavaScriptType(kind)
-  return JavaScriptEncodeSnippet(kind)
-
-
-def JavaScriptFieldOffset(packed_field):
-  return "offset + codec.kStructHeaderSize + %s" % packed_field.offset
-
-
-def JavaScriptNullableParam(field):
-  return "true" if mojom.IsNullableKind(field.kind) else "false"
-
-
-def GetArrayExpectedDimensionSizes(kind):
-  expected_dimension_sizes = []
-  while mojom.IsArrayKind(kind):
-    expected_dimension_sizes.append(generator.ExpectedArraySize(kind) or 0)
-    kind = kind.kind
-  # Strings are serialized as variable-length arrays.
-  if (mojom.IsStringKind(kind)):
-    expected_dimension_sizes.append(0)
-  return expected_dimension_sizes
-
-
-def JavaScriptValidateArrayParams(field):
-  nullable = JavaScriptNullableParam(field)
-  element_kind = field.kind.kind
-  element_size = pack.PackedField.GetSizeForKind(element_kind)
-  expected_dimension_sizes = GetArrayExpectedDimensionSizes(
-      field.kind)
-  element_type = ElementCodecType(element_kind)
-  return "%s, %s, %s, %s, 0" % \
-      (element_size, element_type, nullable,
-       expected_dimension_sizes)
-
-
-def JavaScriptValidateEnumParams(field):
-  return JavaScriptType(field.kind)
-
-def JavaScriptValidateStructParams(field):
-  nullable = JavaScriptNullableParam(field)
-  struct_type = JavaScriptType(field.kind)
-  return "%s, %s" % (struct_type, nullable)
-
-def JavaScriptValidateUnionParams(field):
-  nullable = JavaScriptNullableParam(field)
-  union_type = JavaScriptType(field.kind)
-  return "%s, %s" % (union_type, nullable)
-
-def JavaScriptValidateMapParams(field):
-  nullable = JavaScriptNullableParam(field)
-  keys_type = ElementCodecType(field.kind.key_kind)
-  values_kind = field.kind.value_kind;
-  values_type = ElementCodecType(values_kind)
-  values_nullable = "true" if mojom.IsNullableKind(values_kind) else "false"
-  return "%s, %s, %s, %s" % \
-      (nullable, keys_type, values_type, values_nullable)
-
-
-def TranslateConstants(token):
-  if isinstance(token, (mojom.EnumValue, mojom.NamedValue)):
-    # Both variable and enum constants are constructed like:
-    # NamespaceUid.Struct[.Enum].CONSTANT_NAME
-    name = []
-    if token.imported_from:
-      name.append(token.imported_from["unique_name"])
-    if token.parent_kind:
-      name.append(token.parent_kind.name)
-    if isinstance(token, mojom.EnumValue):
-      name.append(token.enum.name)
-    name.append(token.name)
-    return ".".join(name)
-
-  if isinstance(token, mojom.BuiltinValue):
-    if token.value == "double.INFINITY" or token.value == "float.INFINITY":
-      return "Infinity";
-    if token.value == "double.NEGATIVE_INFINITY" or \
-       token.value == "float.NEGATIVE_INFINITY":
-      return "-Infinity";
-    if token.value == "double.NAN" or token.value == "float.NAN":
-      return "NaN";
-
-  return token
-
-
-def ExpressionToText(value):
-  return TranslateConstants(value)
-
-def IsArrayPointerField(field):
-  return mojom.IsArrayKind(field.kind)
-
-def IsEnumField(field):
-  return mojom.IsEnumKind(field.kind)
-
-def IsStringPointerField(field):
-  return mojom.IsStringKind(field.kind)
-
-def IsStructPointerField(field):
-  return mojom.IsStructKind(field.kind)
-
-def IsMapPointerField(field):
-  return mojom.IsMapKind(field.kind)
-
-def IsHandleField(field):
-  return mojom.IsAnyHandleKind(field.kind)
-
-def IsInterfaceField(field):
-  return mojom.IsInterfaceKind(field.kind)
-
-def IsInterfaceRequestField(field):
-  return mojom.IsInterfaceRequestKind(field.kind)
-
-def IsUnionField(field):
-  return mojom.IsUnionKind(field.kind)
-
-def IsBoolField(field):
-  return mojom.IsBoolKind(field.kind)
-
-def IsObjectField(field):
-  return mojom.IsObjectKind(field.kind)
-
-def IsAnyHandleOrInterfaceField(field):
-  return mojom.IsAnyHandleOrInterfaceKind(field.kind)
-
-def IsEnumField(field):
-  return mojom.IsEnumKind(field.kind)
-
-def GetRelativePath(module, base_module):
-  return os.path.relpath(module.path, os.path.dirname(base_module.path))
-
-
-class Generator(generator.Generator):
-
-  js_filters = {
-    "decode_snippet": JavaScriptDecodeSnippet,
-    "default_value": JavaScriptDefaultValue,
-    "encode_snippet": JavaScriptEncodeSnippet,
-    "expression_to_text": ExpressionToText,
-    "field_offset": JavaScriptFieldOffset,
-    "has_callbacks": mojom.HasCallbacks,
-    "is_any_handle_or_interface_field": IsAnyHandleOrInterfaceField,
-    "is_array_pointer_field": IsArrayPointerField,
-    "is_bool_field": IsBoolField,
-    "is_enum_field": IsEnumField,
-    "is_handle_field": IsHandleField,
-    "is_interface_field": IsInterfaceField,
-    "is_interface_request_field": IsInterfaceRequestField,
-    "is_map_pointer_field": IsMapPointerField,
-    "is_object_field": IsObjectField,
-    "is_string_pointer_field": IsStringPointerField,
-    "is_struct_pointer_field": IsStructPointerField,
-    "is_union_field": IsUnionField,
-    "js_type": JavaScriptType,
-    "payload_size": JavaScriptPayloadSize,
-    "get_relative_path": GetRelativePath,
-    "stylize_method": generator.StudlyCapsToCamel,
-    "union_decode_snippet": JavaScriptUnionDecodeSnippet,
-    "union_encode_snippet": JavaScriptUnionEncodeSnippet,
-    "validate_array_params": JavaScriptValidateArrayParams,
-    "validate_enum_params": JavaScriptValidateEnumParams,
-    "validate_map_params": JavaScriptValidateMapParams,
-    "validate_nullable_params": JavaScriptNullableParam,
-    "validate_struct_params": JavaScriptValidateStructParams,
-    "validate_union_params": JavaScriptValidateUnionParams,
-  }
-
-  def GetParameters(self):
-    return {
-      "namespace": self.module.namespace,
-      "imports": self.GetImports(),
-      "kinds": self.module.kinds,
-      "enums": self.module.enums,
-      "module": self.module,
-      "structs": self.GetStructs() + self.GetStructsFromMethods(),
-      "unions": self.GetUnions(),
-      "use_new_js_bindings": self.use_new_js_bindings,
-      "interfaces": self.GetInterfaces(),
-      "imported_interfaces": self.GetImportedInterfaces(),
-    }
-
-  @staticmethod
-  def GetTemplatePrefix():
-    return "js_templates"
-
-  @classmethod
-  def GetFilters(cls):
-    return cls.js_filters
-
-  @UseJinja("module.amd.tmpl")
-  def GenerateAMDModule(self):
-    return self.GetParameters()
-
-  def GenerateFiles(self, args):
-    if self.variant:
-      raise Exception("Variants not supported in JavaScript bindings.")
-
-    self.Write(self.GenerateAMDModule(),
-        self.MatchMojomFilePath("%s.js" % self.module.name))
-
-  def GetImports(self):
-    used_names = set()
-    for each_import in self.module.imports:
-      simple_name = each_import["module_name"].split(".")[0]
-
-      # Since each import is assigned a variable in JS, they need to have unique
-      # names.
-      unique_name = simple_name
-      counter = 0
-      while unique_name in used_names:
-        counter += 1
-        unique_name = simple_name + str(counter)
-
-      used_names.add(unique_name)
-      each_import["unique_name"] = unique_name + "$"
-      counter += 1
-    return self.module.imports
-
-  def GetImportedInterfaces(self):
-    interface_to_import = {};
-    for each_import in self.module.imports:
-      for each_interface in each_import["module"].interfaces:
-        name = each_interface.name
-        interface_to_import[name] = each_import["unique_name"] + "." + name
-    return interface_to_import;
-
diff --git a/mojo/public/tools/bindings/mojom.gni b/mojo/public/tools/bindings/mojom.gni
deleted file mode 100644
index 4a244fb..0000000
--- a/mojo/public/tools/bindings/mojom.gni
+++ /dev/null
@@ -1,661 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-declare_args() {
-  # Indicates whether typemapping should be supported in this build
-  # configuration. This may be disabled when building external projects which
-  # depend on //mojo but which do not need/want all of the Chromium tree
-  # dependencies that come with typemapping.
-  #
-  # Note that (perhaps obviously) a huge amount of Chromium code will not build
-  # with typemapping disabled, so it is never valid to set this to |false| in
-  # any Chromium build configuration.
-  enable_mojom_typemapping = true
-}
-
-mojom_generator_root = "//mojo/public/tools/bindings"
-mojom_generator_script = "$mojom_generator_root/mojom_bindings_generator.py"
-mojom_generator_sources = [
-  "$mojom_generator_root/generators/mojom_cpp_generator.py",
-  "$mojom_generator_root/generators/mojom_js_generator.py",
-  "$mojom_generator_root/generators/mojom_java_generator.py",
-  "$mojom_generator_root/pylib/mojom/__init__.py",
-  "$mojom_generator_root/pylib/mojom/error.py",
-  "$mojom_generator_root/pylib/mojom/generate/__init__.py",
-  "$mojom_generator_root/pylib/mojom/generate/constant_resolver.py",
-  "$mojom_generator_root/pylib/mojom/generate/generator.py",
-  "$mojom_generator_root/pylib/mojom/generate/module.py",
-  "$mojom_generator_root/pylib/mojom/generate/pack.py",
-  "$mojom_generator_root/pylib/mojom/generate/template_expander.py",
-  "$mojom_generator_root/pylib/mojom/generate/translate.py",
-  "$mojom_generator_root/pylib/mojom/parse/__init__.py",
-  "$mojom_generator_root/pylib/mojom/parse/ast.py",
-  "$mojom_generator_root/pylib/mojom/parse/lexer.py",
-  "$mojom_generator_root/pylib/mojom/parse/parser.py",
-  "$mojom_generator_script",
-]
-
-if (enable_mojom_typemapping) {
-  if (!is_ios) {
-    _bindings_configuration_files = [
-      "//mojo/public/tools/bindings/chromium_bindings_configuration.gni",
-      "//mojo/public/tools/bindings/blink_bindings_configuration.gni",
-    ]
-  } else {
-    _bindings_configuration_files =
-        [ "//mojo/public/tools/bindings/chromium_bindings_configuration.gni" ]
-  }
-  _bindings_configurations = []
-  foreach(config_file, _bindings_configuration_files) {
-    _bindings_configurations += [ read_file(config_file, "scope") ]
-  }
-  foreach(configuration, _bindings_configurations) {
-    # Check that the mojom field of each typemap refers to a mojom that exists.
-    foreach(typemap, configuration.typemaps) {
-      _typemap_config = {
-      }
-      _typemap_config = typemap.config
-      read_file(_typemap_config.mojom, "")
-    }
-    if (is_mac && defined(configuration.typemaps_mac)) {
-      foreach(typemap, configuration.typemaps_mac) {
-        _typemap_config = {
-        }
-        _typemap_config = typemap.config
-        read_file(_typemap_config.mojom, "")
-      }
-    }
-  }
-} else {
-  _bindings_configuration_files = []
-  _bindings_configurations = [
-    {
-      typemaps = []
-    },
-    {
-      variant = "blink"
-      for_blink = true
-      typemaps = []
-    },
-  ]
-}
-
-# Generates targets for building C++, JavaScript and Java bindings from mojom
-# files. The output files will go under the generated file directory tree with
-# the same path as each input file.
-#
-# Other targets should depend on one of these generated targets (where "foo"
-# is the target name):
-#
-#   foo
-#       C++ and Javascript bindings. Other mojom targets should also depend on
-#       this target.
-#
-#   foo_blink
-#       C++ bindings using Blink standard types.
-#
-#   foo_java
-#       Java bindings.
-#
-# Parameters:
-#
-#   sources (optional if one of the deps sets listed below is present)
-#       List of source .mojom files to compile.
-#
-#   deps (optional)
-#       Note: this can contain only other mojom targets.
-#
-#       DEPRECATED: This is synonymous with public_deps because all mojom
-#       dependencies must be public by design. Please use public_deps.
-#
-#   public_deps (optional)
-#       Note: this can contain only other mojom targets.
-#
-#   import_dirs (optional)
-#       List of import directories that will get added when processing sources.
-#
-#   testonly (optional)
-#
-#   visibility (optional)
-#
-#   visibility_blink (optional)
-#       The value to use for visibility for the blink variant. If unset,
-#       |visibility| is used.
-#
-#   use_once_callback (optional)
-#       If set to true, generated classes will use base::OnceCallback instead of
-#       base::RepeatingCallback.
-#       Default value is false.
-#       TODO(dcheng):
-#           - Convert everything to use OnceCallback.
-#           - Remove support for the old mode.
-#
-#   cpp_only (optional)
-#       If set to true, only the C++ bindings targets will be generated.
-#
-#   use_new_js_bindings (optional)
-#       If set to true, the generated JS code will use the new module loading
-#       approach and the core API exposed by Web IDL.
-#
-#       TODO(yzshen): Switch all existing users to use_new_js_bindings=true and
-#       remove the old mode.
-#
-# The following parameters are used to support the component build. They are
-# needed so that bindings which are linked with a component can use the same
-# export settings for classes. The first three are for the chromium variant, and
-# the last three are for the blink variant.
-#   export_class_attribute (optional)
-#       The attribute to add to the class declaration. e.g. "CONTENT_EXPORT"
-#   export_define (optional)
-#       A define to be added to the source_set which is needed by the export
-#       header. e.g. "CONTENT_IMPLEMENTATION=1"
-#   export_header (optional)
-#       A header to be added to the generated bindings to support the component
-#       build. e.g. "content/common/content_export.h"
-#   export_class_attribute_blink (optional)
-#   export_define_blink (optional)
-#   export_header_blink (optional)
-#       These three parameters are the blink variants of the previous 3.
-#
-# The following parameters are used to correct component build dependencies.
-# They are needed so mojom-mojom dependencies follow the rule that dependencies
-# on a source set in another component are replaced by a dependency on the
-# containing component. The first two are for the chromium variant; the other
-# two are for the blink variant.
-#   overridden_deps (optional)
-#       The list of mojom deps to be overridden.
-#   component_deps (optional)
-#       The list of component deps to add to replace overridden_deps.
-#   overridden_deps_blink (optional)
-#   component_deps_blink (optional)
-#       These two parameters are the blink variants of the previous two.
-template("mojom") {
-  assert(
-      defined(invoker.sources) || defined(invoker.deps) ||
-          defined(invoker.public_deps),
-      "\"sources\" or \"deps\" must be defined for the $target_name template.")
-  if (defined(invoker.export_class_attribute) ||
-      defined(invoker.export_define) || defined(invoker.export_header)) {
-    assert(defined(invoker.export_class_attribute))
-    assert(defined(invoker.export_define))
-    assert(defined(invoker.export_header))
-  }
-  if (defined(invoker.export_class_attribute_blink) ||
-      defined(invoker.export_define_blink) ||
-      defined(invoker.export_header_blink)) {
-    assert(defined(invoker.export_class_attribute_blink))
-    assert(defined(invoker.export_define_blink))
-    assert(defined(invoker.export_header_blink))
-  }
-  if (defined(invoker.overridden_deps) || defined(invoker.component_deps)) {
-    assert(defined(invoker.overridden_deps))
-    assert(defined(invoker.component_deps))
-  }
-
-  if (defined(invoker.overridden_deps_blink) ||
-      defined(invoker.component_deps_blink)) {
-    assert(defined(invoker.overridden_deps_blink))
-    assert(defined(invoker.component_deps_blink))
-  }
-
-  all_deps = []
-  if (defined(invoker.deps)) {
-    all_deps += invoker.deps
-  }
-  if (defined(invoker.public_deps)) {
-    all_deps += invoker.public_deps
-  }
-
-  group("${target_name}__is_mojom") {
-  }
-
-  # Explicitly ensure that all dependencies (invoker.deps and
-  # invoker.public_deps) are mojom targets.
-  group("${target_name}__check_deps_are_all_mojom") {
-    deps = []
-    foreach(d, all_deps) {
-      name = get_label_info(d, "label_no_toolchain")
-      toolchain = get_label_info(d, "toolchain")
-      deps += [ "${name}__is_mojom(${toolchain})" ]
-    }
-  }
-
-  # Generate code that is shared by different variants.
-  if (defined(invoker.sources)) {
-    common_generator_args = [
-      "--use_bundled_pylibs",
-      "generate",
-      "{{source}}",
-      "-d",
-      rebase_path("//", root_build_dir),
-      "-I",
-      rebase_path("//", root_build_dir),
-      "-o",
-      rebase_path(root_gen_dir),
-      "--bytecode_path",
-      rebase_path("$root_gen_dir/mojo/public/tools/bindings"),
-    ]
-
-    if (defined(invoker.import_dirs)) {
-      foreach(import_dir, invoker.import_dirs) {
-        common_generator_args += [
-          "-I",
-          rebase_path(import_dir, root_build_dir),
-        ]
-      }
-    }
-
-    generator_shared_cpp_outputs = [
-      "{{source_gen_dir}}/{{source_name_part}}.mojom-shared-internal.h",
-      "{{source_gen_dir}}/{{source_name_part}}.mojom-shared.cc",
-      "{{source_gen_dir}}/{{source_name_part}}.mojom-shared.h",
-    ]
-    generator_shared_target_name = "${target_name}_shared__generator"
-    action_foreach(generator_shared_target_name) {
-      script = mojom_generator_script
-      inputs = mojom_generator_sources
-      sources = invoker.sources
-      deps = [
-        "//mojo/public/tools/bindings:precompile_templates",
-      ]
-      outputs = generator_shared_cpp_outputs
-      args = common_generator_args
-      args += [
-        "--generate_non_variant_code",
-        "-g",
-        "c++",
-      ]
-      depfile = "{{source_gen_dir}}/${generator_shared_target_name}_{{source_name_part}}.d"
-      args += [
-        "--depfile",
-        depfile,
-        "--depfile_target",
-        "{{source_gen_dir}}/{{source_name_part}}.mojom-shared-internal.h",
-      ]
-    }
-  }
-
-  shared_cpp_sources_suffix = "shared_cpp_sources"
-  shared_cpp_sources_target_name = "${target_name}_${shared_cpp_sources_suffix}"
-  source_set(shared_cpp_sources_target_name) {
-    if (defined(invoker.testonly)) {
-      testonly = invoker.testonly
-    }
-    deps = []
-    if (defined(invoker.sources)) {
-      sources =
-          process_file_template(invoker.sources, generator_shared_cpp_outputs)
-      deps += [ ":$generator_shared_target_name" ]
-    }
-    public_deps = []
-    foreach(d, all_deps) {
-      # Resolve the name, so that a target //mojo/something becomes
-      # //mojo/something:something and we can append shared_cpp_sources_suffix
-      # to get the cpp dependency name.
-      full_name = get_label_info("$d", "label_no_toolchain")
-      public_deps += [ "${full_name}_${shared_cpp_sources_suffix}" ]
-    }
-  }
-
-  # Generate code for variants.
-  foreach(bindings_configuration, _bindings_configurations) {
-    cpp_only = false
-    if (defined(invoker.cpp_only)) {
-      cpp_only = invoker.cpp_only
-    }
-    variant_suffix = ""
-    if (defined(bindings_configuration.variant)) {
-      variant = bindings_configuration.variant
-      variant_suffix = "_${variant}"
-      cpp_only = true
-    }
-    type_mappings_target_name = "${target_name}${variant_suffix}__type_mappings"
-    type_mappings_path =
-        "$target_gen_dir/${target_name}${variant_suffix}__type_mappings"
-    active_typemaps = []
-    enabled_sources = []
-    if (defined(invoker.sources)) {
-      generator_cpp_outputs = []
-      generator_js_outputs = []
-      generator_java_outputs = []
-      variant_dash_suffix = ""
-      if (defined(variant)) {
-        variant_dash_suffix = "-${variant}"
-      }
-      generator_cpp_outputs += [
-        "{{source_gen_dir}}/{{source_name_part}}.mojom${variant_dash_suffix}.cc",
-        "{{source_gen_dir}}/{{source_name_part}}.mojom${variant_dash_suffix}.h",
-      ]
-      enabled_sources = []
-      if (defined(bindings_configuration.blacklist)) {
-        foreach(source, invoker.sources) {
-          blacklisted = false
-          foreach(blacklisted_source, bindings_configuration.blacklist) {
-            if (get_path_info(source, "abspath") == blacklisted_source) {
-              blacklisted = true
-            }
-          }
-          if (!blacklisted) {
-            enabled_sources += [ source ]
-          }
-        }
-      } else {
-        enabled_sources = invoker.sources
-      }
-      foreach(source, enabled_sources) {
-        # TODO(sammc): Use a map instead of a linear scan when GN supports maps.
-        foreach(typemap, bindings_configuration.typemaps) {
-          _typemap_config = {
-          }
-          _typemap_config = typemap.config
-          if (get_path_info(source, "abspath") == _typemap_config.mojom) {
-            active_typemaps += [ typemap ]
-          }
-        }
-        if (is_mac && defined(bindings_configuration.typemaps_mac)) {
-          foreach(typemap, bindings_configuration.typemaps_mac) {
-            _typemap_config = {
-            }
-            _typemap_config = typemap.config
-            if (get_path_info(source, "abspath") == _typemap_config.mojom) {
-              active_typemaps += [ typemap ]
-            }
-          }
-        }
-      }
-
-      if (!cpp_only) {
-        generator_js_outputs =
-            [ "{{source_gen_dir}}/{{source_name_part}}.mojom.js" ]
-        generator_java_outputs =
-            [ "{{source_gen_dir}}/{{source_name_part}}.mojom.srcjar" ]
-      }
-      generator_target_name = "${target_name}${variant_suffix}__generator"
-      action_foreach(generator_target_name) {
-        script = mojom_generator_script
-        inputs = mojom_generator_sources
-        sources = invoker.sources
-        deps = [
-          ":$type_mappings_target_name",
-          "//mojo/public/tools/bindings:precompile_templates",
-        ]
-        outputs = generator_cpp_outputs + generator_java_outputs +
-                  generator_js_outputs
-        args = common_generator_args
-
-        if (cpp_only) {
-          args += [
-            "-g",
-            "c++",
-          ]
-        } else {
-          args += [
-            "-g",
-            "c++,javascript,java",
-          ]
-        }
-
-        if (defined(bindings_configuration.variant)) {
-          args += [
-            "--variant",
-            bindings_configuration.variant,
-          ]
-        }
-        depfile =
-            "{{source_gen_dir}}/${generator_target_name}_{{source_name_part}}.d"
-        args += [
-          "--depfile",
-          depfile,
-          "--depfile_target",
-          "{{source_gen_dir}}/{{source_name_part}}.mojom${variant_dash_suffix}.cc",
-        ]
-
-        args += [
-          "--typemap",
-          rebase_path(type_mappings_path, root_build_dir),
-        ]
-
-        if (defined(bindings_configuration.for_blink) &&
-            bindings_configuration.for_blink) {
-          args += [ "--for_blink" ]
-          if (defined(invoker.export_class_attribute_blink)) {
-            args += [
-              "--export_attribute",
-              invoker.export_class_attribute_blink,
-              "--export_header",
-              invoker.export_header_blink,
-            ]
-          }
-        } else {
-          if (defined(invoker.export_class_attribute)) {
-            args += [
-              "--export_attribute",
-              invoker.export_class_attribute,
-              "--export_header",
-              invoker.export_header,
-            ]
-          }
-        }
-
-        if (defined(invoker.use_once_callback) && invoker.use_once_callback) {
-          args += [ "--use_once_callback" ]
-        }
-
-        if (defined(invoker.use_new_js_bindings) &&
-            invoker.use_new_js_bindings) {
-          args += [ "--use_new_js_bindings" ]
-        }
-      }
-    }
-
-    action(type_mappings_target_name) {
-      inputs = _bindings_configuration_files
-      outputs = [
-        type_mappings_path,
-      ]
-      script = "$mojom_generator_root/generate_type_mappings.py"
-      deps = []
-      args = [
-        "--output",
-        rebase_path(type_mappings_path, root_build_dir),
-      ]
-
-      foreach(d, all_deps) {
-        name = get_label_info(d, "label_no_toolchain")
-        toolchain = get_label_info(d, "toolchain")
-        dependency_output = "${name}${variant_suffix}__type_mappings"
-        dependency_target = "${dependency_output}(${toolchain})"
-        deps += [ dependency_target ]
-        dependency_output_dir =
-            get_label_info(dependency_output, "target_gen_dir")
-        dependency_name = get_label_info(dependency_output, "name")
-        dependency_path =
-            rebase_path("$dependency_output_dir/${dependency_name}",
-                        root_build_dir)
-        args += [
-          "--dependency",
-          dependency_path,
-        ]
-      }
-
-      if (enabled_sources != []) {
-        # TODO(sammc): Pass the typemap description in a file to avoid command
-        # line length limitations.
-        typemap_description = []
-        foreach(typemap, active_typemaps) {
-          _typemap_config = {
-          }
-          _typemap_config = typemap.config
-          typemap_description += [ "--start-typemap" ]
-          if (defined(_typemap_config.public_headers)) {
-            foreach(value, _typemap_config.public_headers) {
-              typemap_description += [ "public_headers=$value" ]
-            }
-          }
-          if (defined(_typemap_config.traits_headers)) {
-            foreach(value, _typemap_config.traits_headers) {
-              typemap_description += [ "traits_headers=$value" ]
-            }
-          }
-          foreach(value, _typemap_config.type_mappings) {
-            typemap_description += [ "type_mappings=$value" ]
-          }
-
-          # The typemap configuration files are not actually used as inputs here
-          # but this establishes a necessary build dependency to ensure that
-          # typemap changes force a rebuild of affected targets.
-          inputs += [ typemap.filename ]
-        }
-        args += typemap_description
-      }
-    }
-
-    source_set("${target_name}${variant_suffix}") {
-      if (defined(bindings_configuration.for_blink) &&
-          bindings_configuration.for_blink &&
-          defined(invoker.visibility_blink)) {
-        visibility = invoker.visibility_blink
-      } else if (defined(invoker.visibility)) {
-        visibility = invoker.visibility
-      }
-      if (defined(invoker.testonly)) {
-        testonly = invoker.testonly
-      }
-      if (defined(invoker.sources) && !defined(bindings_configuration.variant)) {
-        data = process_file_template(enabled_sources, generator_js_outputs)
-      }
-      defines = []
-      if (defined(invoker.testonly)) {
-        testonly = invoker.testonly
-      }
-      if (defined(invoker.export_define)) {
-        defines += [ invoker.export_define ]
-      }
-      if (defined(invoker.export_define_blink)) {
-        defines += [ invoker.export_define_blink ]
-      }
-      if (enabled_sources != []) {
-        sources = process_file_template(enabled_sources, generator_cpp_outputs)
-      }
-      deps = [
-        "//mojo/public/cpp/bindings:struct_traits",
-        "//mojo/public/interfaces/bindings:bindings__generator",
-        "//mojo/public/interfaces/bindings:bindings_shared__generator",
-      ]
-      public_deps = [
-        ":$shared_cpp_sources_target_name",
-        "//base",
-        "//mojo/public/cpp/bindings",
-      ]
-      if (enabled_sources != []) {
-        public_deps += [ ":$generator_target_name" ]
-      }
-      foreach(d, all_deps) {
-        # Resolve the name, so that a target //mojo/something becomes
-        # //mojo/something:something and we can append variant_suffix to
-        # get the cpp dependency name.
-        full_name = get_label_info("$d", "label_no_toolchain")
-        public_deps += [ "${full_name}${variant_suffix}" ]
-      }
-      if (defined(bindings_configuration.for_blink) &&
-          bindings_configuration.for_blink) {
-        if (defined(invoker.overridden_deps_blink)) {
-          foreach(d, invoker.overridden_deps_blink) {
-            # Resolve the name, so that a target //mojo/something becomes
-            # //mojo/something:something and we can append variant_suffix
-            # to get the cpp dependency name.
-            full_name = get_label_info("$d", "label_no_toolchain")
-            public_deps -= [ "${full_name}${variant_suffix}" ]
-          }
-          public_deps += invoker.component_deps_blink
-        }
-      } else {
-        if (defined(invoker.overridden_deps)) {
-          foreach(d, invoker.overridden_deps) {
-            # Resolve the name, so that a target //mojo/something becomes
-            # //mojo/something:something and we can append variant_suffix
-            # to get the cpp dependency name.
-            full_name = get_label_info("$d", "label_no_toolchain")
-            public_deps -= [ "${full_name}${variant_suffix}" ]
-          }
-          public_deps += invoker.component_deps
-        }
-      }
-      foreach(typemap, active_typemaps) {
-        _typemap_config = {
-        }
-        _typemap_config = typemap.config
-        if (defined(_typemap_config.public_headers)) {
-          sources += _typemap_config.public_headers
-        }
-        if (defined(_typemap_config.traits_headers)) {
-          sources += _typemap_config.traits_headers
-        }
-        if (defined(_typemap_config.sources)) {
-          sources += _typemap_config.sources
-        }
-        if (defined(_typemap_config.public_deps)) {
-          public_deps += _typemap_config.public_deps
-        }
-        if (defined(_typemap_config.deps)) {
-          deps += _typemap_config.deps
-        }
-      }
-      if (defined(bindings_configuration.for_blink) &&
-          bindings_configuration.for_blink) {
-        public_deps += [ "//mojo/public/cpp/bindings:wtf_support" ]
-      }
-    }
-
-    if (!cpp_only && is_android) {
-      import("//build/config/android/rules.gni")
-
-      java_srcjar_target_name = target_name + "_java_sources"
-      action(java_srcjar_target_name) {
-        script = "//mojo/public/tools/gn/zip.py"
-        inputs = []
-        if (enabled_sources != []) {
-          inputs =
-              process_file_template(enabled_sources, generator_java_outputs)
-        }
-        output = "$target_gen_dir/$target_name.srcjar"
-        outputs = [
-          output,
-        ]
-        rebase_inputs = rebase_path(inputs, root_build_dir)
-        rebase_output = rebase_path(output, root_build_dir)
-        args = [
-          "--zip-inputs=$rebase_inputs",
-          "--output=$rebase_output",
-        ]
-        deps = []
-        if (enabled_sources != []) {
-          deps = [
-            ":$generator_target_name",
-          ]
-        }
-      }
-
-      java_target_name = target_name + "_java"
-      android_library(java_target_name) {
-        deps = [
-          "//base:base_java",
-          "//mojo/public/java:bindings_java",
-          "//mojo/public/java:system_java",
-        ]
-
-        foreach(d, all_deps) {
-          # Resolve the name, so that a target //mojo/something becomes
-          # //mojo/something:something and we can append "_java" to get the java
-          # dependency name.
-          full_name = get_label_info(d, "label_no_toolchain")
-          deps += [ "${full_name}_java" ]
-        }
-
-        srcjar_deps = [ ":$java_srcjar_target_name" ]
-        run_findbugs_override = false
-      }
-    }
-  }
-}
diff --git a/mojo/public/tools/bindings/mojom_bindings_generator.py b/mojo/public/tools/bindings/mojom_bindings_generator.py
deleted file mode 100755
index a9650d7..0000000
--- a/mojo/public/tools/bindings/mojom_bindings_generator.py
+++ /dev/null
@@ -1,336 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""The frontend for the Mojo bindings system."""
-
-
-import argparse
-import imp
-import json
-import os
-import pprint
-import re
-import sys
-
-# Disable lint check for finding modules:
-# pylint: disable=F0401
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-# Manually check for the command-line flag. (This isn't quite right, since it
-# ignores, e.g., "--", but it's close enough.)
-if "--use_bundled_pylibs" in sys.argv[1:]:
-  sys.path.insert(0, os.path.join(_GetDirAbove("mojo"), "third_party"))
-
-sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                                "pylib"))
-
-from mojom.error import Error
-import mojom.fileutil as fileutil
-from mojom.generate import translate
-from mojom.generate import template_expander
-from mojom.parse.parser import Parse
-
-
-_BUILTIN_GENERATORS = {
-  "c++": "mojom_cpp_generator.py",
-  "javascript": "mojom_js_generator.py",
-  "java": "mojom_java_generator.py",
-}
-
-
-def LoadGenerators(generators_string):
-  if not generators_string:
-    return []  # No generators.
-
-  script_dir = os.path.dirname(os.path.abspath(__file__))
-  generators = {}
-  for generator_name in [s.strip() for s in generators_string.split(",")]:
-    language = generator_name.lower()
-    if language in _BUILTIN_GENERATORS:
-      generator_name = os.path.join(script_dir, "generators",
-                                    _BUILTIN_GENERATORS[language])
-    else:
-      print "Unknown generator name %s" % generator_name
-      sys.exit(1)
-    generator_module = imp.load_source(os.path.basename(generator_name)[:-3],
-                                       generator_name)
-    generators[language] = generator_module
-  return generators
-
-
-def MakeImportStackMessage(imported_filename_stack):
-  """Make a (human-readable) message listing a chain of imports. (Returned
-  string begins with a newline (if nonempty) and does not end with one.)"""
-  return ''.join(
-      reversed(["\n  %s was imported by %s" % (a, b) for (a, b) in \
-                    zip(imported_filename_stack[1:], imported_filename_stack)]))
-
-
-class RelativePath(object):
-  """Represents a path relative to the source tree."""
-  def __init__(self, path, source_root):
-    self.path = path
-    self.source_root = source_root
-
-  def relative_path(self):
-    return os.path.relpath(os.path.abspath(self.path),
-                           os.path.abspath(self.source_root))
-
-
-def FindImportFile(rel_dir, file_name, search_rel_dirs):
-  """Finds |file_name| in either |rel_dir| or |search_rel_dirs|. Returns a
-  RelativePath with first file found, or an arbitrary non-existent file
-  otherwise."""
-  for rel_search_dir in [rel_dir] + search_rel_dirs:
-    path = os.path.join(rel_search_dir.path, file_name)
-    if os.path.isfile(path):
-      return RelativePath(path, rel_search_dir.source_root)
-  return RelativePath(os.path.join(rel_dir.path, file_name),
-                      rel_dir.source_root)
-
-
-class MojomProcessor(object):
-  """Parses mojom files and creates ASTs for them.
-
-  Attributes:
-    _processed_files: {Dict[str, mojom.generate.module.Module]} Mapping from
-        relative mojom filename paths to the module AST for that mojom file.
-  """
-  def __init__(self, should_generate):
-    self._should_generate = should_generate
-    self._processed_files = {}
-    self._parsed_files = {}
-    self._typemap = {}
-
-  def LoadTypemaps(self, typemaps):
-    # Support some very simple single-line comments in typemap JSON.
-    comment_expr = r"^\s*//.*$"
-    def no_comments(line):
-      return not re.match(comment_expr, line)
-    for filename in typemaps:
-      with open(filename) as f:
-        typemaps = json.loads("".join(filter(no_comments, f.readlines())))
-        for language, typemap in typemaps.iteritems():
-          language_map = self._typemap.get(language, {})
-          language_map.update(typemap)
-          self._typemap[language] = language_map
-
-  def ProcessFile(self, args, remaining_args, generator_modules, filename):
-    self._ParseFileAndImports(RelativePath(filename, args.depth),
-                              args.import_directories, [])
-
-    return self._GenerateModule(args, remaining_args, generator_modules,
-        RelativePath(filename, args.depth))
-
-  def _GenerateModule(self, args, remaining_args, generator_modules,
-                      rel_filename):
-    # Return the already-generated module.
-    if rel_filename.path in self._processed_files:
-      return self._processed_files[rel_filename.path]
-    tree = self._parsed_files[rel_filename.path]
-
-    dirname, name = os.path.split(rel_filename.path)
-
-    # Process all our imports first and collect the module object for each.
-    # We use these to generate proper type info.
-    imports = {}
-    for parsed_imp in tree.import_list:
-      rel_import_file = FindImportFile(
-          RelativePath(dirname, rel_filename.source_root),
-          parsed_imp.import_filename, args.import_directories)
-      imports[parsed_imp.import_filename] = self._GenerateModule(
-          args, remaining_args, generator_modules, rel_import_file)
-
-    module = translate.OrderedModule(tree, name, imports)
-
-    # Set the path as relative to the source root.
-    module.path = rel_filename.relative_path()
-
-    # Normalize to unix-style path here to keep the generators simpler.
-    module.path = module.path.replace('\\', '/')
-
-    if self._should_generate(rel_filename.path):
-      for language, generator_module in generator_modules.iteritems():
-        generator = generator_module.Generator(
-            module, args.output_dir, typemap=self._typemap.get(language, {}),
-            variant=args.variant, bytecode_path=args.bytecode_path,
-            for_blink=args.for_blink,
-            use_once_callback=args.use_once_callback,
-            use_new_js_bindings=args.use_new_js_bindings,
-            export_attribute=args.export_attribute,
-            export_header=args.export_header,
-            generate_non_variant_code=args.generate_non_variant_code)
-        filtered_args = []
-        if hasattr(generator_module, 'GENERATOR_PREFIX'):
-          prefix = '--' + generator_module.GENERATOR_PREFIX + '_'
-          filtered_args = [arg for arg in remaining_args
-                           if arg.startswith(prefix)]
-        generator.GenerateFiles(filtered_args)
-
-    # Save result.
-    self._processed_files[rel_filename.path] = module
-    return module
-
-  def _ParseFileAndImports(self, rel_filename, import_directories,
-      imported_filename_stack):
-    # Ignore already-parsed files.
-    if rel_filename.path in self._parsed_files:
-      return
-
-    if rel_filename.path in imported_filename_stack:
-      print "%s: Error: Circular dependency" % rel_filename.path + \
-          MakeImportStackMessage(imported_filename_stack + [rel_filename.path])
-      sys.exit(1)
-
-    try:
-      with open(rel_filename.path) as f:
-        source = f.read()
-    except IOError as e:
-      print "%s: Error: %s" % (rel_filename.path, e.strerror) + \
-          MakeImportStackMessage(imported_filename_stack + [rel_filename.path])
-      sys.exit(1)
-
-    try:
-      tree = Parse(source, rel_filename.path)
-    except Error as e:
-      full_stack = imported_filename_stack + [rel_filename.path]
-      print str(e) + MakeImportStackMessage(full_stack)
-      sys.exit(1)
-
-    dirname = os.path.split(rel_filename.path)[0]
-    for imp_entry in tree.import_list:
-      import_file_entry = FindImportFile(
-          RelativePath(dirname, rel_filename.source_root),
-          imp_entry.import_filename, import_directories)
-      self._ParseFileAndImports(import_file_entry, import_directories,
-          imported_filename_stack + [rel_filename.path])
-
-    self._parsed_files[rel_filename.path] = tree
-
-
-def _Generate(args, remaining_args):
-  if args.variant == "none":
-    args.variant = None
-
-  for idx, import_dir in enumerate(args.import_directories):
-    tokens = import_dir.split(":")
-    if len(tokens) >= 2:
-      args.import_directories[idx] = RelativePath(tokens[0], tokens[1])
-    else:
-      args.import_directories[idx] = RelativePath(tokens[0], args.depth)
-  generator_modules = LoadGenerators(args.generators_string)
-
-  fileutil.EnsureDirectoryExists(args.output_dir)
-
-  processor = MojomProcessor(lambda filename: filename in args.filename)
-  processor.LoadTypemaps(set(args.typemaps))
-  for filename in args.filename:
-    processor.ProcessFile(args, remaining_args, generator_modules, filename)
-  if args.depfile:
-    assert args.depfile_target
-    with open(args.depfile, 'w') as f:
-      f.write('%s: %s' % (
-          args.depfile_target,
-          ' '.join(processor._parsed_files.keys())))
-
-  return 0
-
-
-def _Precompile(args, _):
-  generator_modules = LoadGenerators(",".join(_BUILTIN_GENERATORS.keys()))
-
-  template_expander.PrecompileTemplates(generator_modules, args.output_dir)
-  return 0
-
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description="Generate bindings from mojom files.")
-  parser.add_argument("--use_bundled_pylibs", action="store_true",
-                      help="use Python modules bundled in the SDK")
-
-  subparsers = parser.add_subparsers()
-  generate_parser = subparsers.add_parser(
-      "generate", description="Generate bindings from mojom files.")
-  generate_parser.add_argument("filename", nargs="+",
-                               help="mojom input file")
-  generate_parser.add_argument("-d", "--depth", dest="depth", default=".",
-                               help="depth from source root")
-  generate_parser.add_argument("-o", "--output_dir", dest="output_dir",
-                               default=".",
-                               help="output directory for generated files")
-  generate_parser.add_argument("-g", "--generators",
-                               dest="generators_string",
-                               metavar="GENERATORS",
-                               default="c++,javascript,java",
-                               help="comma-separated list of generators")
-  generate_parser.add_argument(
-      "-I", dest="import_directories", action="append", metavar="directory",
-      default=[],
-      help="add a directory to be searched for import files. The depth from "
-           "source root can be specified for each import by appending it after "
-           "a colon")
-  generate_parser.add_argument("--typemap", action="append", metavar="TYPEMAP",
-                               default=[], dest="typemaps",
-                               help="apply TYPEMAP to generated output")
-  generate_parser.add_argument("--variant", dest="variant", default=None,
-                               help="output a named variant of the bindings")
-  generate_parser.add_argument(
-      "--bytecode_path", type=str, required=True, help=(
-          "the path from which to load template bytecode; to generate template "
-          "bytecode, run %s precompile BYTECODE_PATH" % os.path.basename(
-              sys.argv[0])))
-  generate_parser.add_argument("--for_blink", action="store_true",
-                               help="Use WTF types as generated types for mojo "
-                               "string/array/map.")
-  generate_parser.add_argument(
-      "--use_once_callback", action="store_true",
-      help="Use base::OnceCallback instead of base::RepeatingCallback.")
-  generate_parser.add_argument(
-      "--use_new_js_bindings", action="store_true",
-      help="Use the new module loading approach and the core API exposed by "
-      "Web IDL. This option only affects the JavaScript bindings.")
-  generate_parser.add_argument(
-      "--export_attribute", type=str, default="",
-      help="Optional attribute to specify on class declaration to export it "
-      "for the component build.")
-  generate_parser.add_argument(
-      "--export_header", type=str, default="",
-      help="Optional header to include in the generated headers to support the "
-      "component build.")
-  generate_parser.add_argument(
-      "--generate_non_variant_code", action="store_true",
-      help="Generate code that is shared by different variants.")
-  generate_parser.add_argument(
-      "--depfile", type=str,
-      help="A file into which the list of input files will be written.")
-  generate_parser.add_argument(
-      "--depfile_target", type=str,
-      help="The target name to use in the depfile.")
-  generate_parser.set_defaults(func=_Generate)
-
-  precompile_parser = subparsers.add_parser("precompile",
-      description="Precompile templates for the mojom bindings generator.")
-  precompile_parser.add_argument(
-      "-o", "--output_dir", dest="output_dir", default=".",
-      help="output directory for precompiled templates")
-  precompile_parser.set_defaults(func=_Precompile)
-
-  args, remaining_args = parser.parse_known_args()
-  return args.func(args, remaining_args)
-
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/mojo/public/tools/bindings/mojom_bindings_generator_unittest.py b/mojo/public/tools/bindings/mojom_bindings_generator_unittest.py
deleted file mode 100644
index de38856..0000000
--- a/mojo/public/tools/bindings/mojom_bindings_generator_unittest.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-
-from mojom_bindings_generator import MakeImportStackMessage
-
-
-class MojoBindingsGeneratorTest(unittest.TestCase):
-  """Tests mojo_bindings_generator."""
-
-  def testMakeImportStackMessage(self):
-    """Tests MakeImportStackMessage()."""
-    self.assertEquals(MakeImportStackMessage(["x"]), "")
-    self.assertEquals(MakeImportStackMessage(["x", "y"]),
-        "\n  y was imported by x")
-    self.assertEquals(MakeImportStackMessage(["x", "y", "z"]),
-        "\n  z was imported by y\n  y was imported by x")
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/mojo/public/tools/bindings/pylib/mojom/__init__.py b/mojo/public/tools/bindings/pylib/mojom/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom/error.py b/mojo/public/tools/bindings/pylib/mojom/error.py
deleted file mode 100644
index 99522b9..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/error.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-class Error(Exception):
-  """Base class for Mojo IDL bindings parser/generator errors."""
-
-  def __init__(self, filename, message, lineno=None, addenda=None, **kwargs):
-    """|filename| is the (primary) file which caused the error, |message| is the
-    error message, |lineno| is the 1-based line number (or |None| if not
-    applicable/available), and |addenda| is a list of additional lines to append
-    to the final error message."""
-    Exception.__init__(self, **kwargs)
-    self.filename = filename
-    self.message = message
-    self.lineno = lineno
-    self.addenda = addenda
-
-  def __str__(self):
-    if self.lineno:
-      s = "%s:%d: Error: %s" % (self.filename, self.lineno, self.message)
-    else:
-      s = "%s: Error: %s" % (self.filename, self.message)
-    return "\n".join([s] + self.addenda) if self.addenda else s
-
-  def __repr__(self):
-    return str(self)
diff --git a/mojo/public/tools/bindings/pylib/mojom/fileutil.py b/mojo/public/tools/bindings/pylib/mojom/fileutil.py
deleted file mode 100644
index b321e9f..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/fileutil.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2015 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.
-
-import errno
-import os.path
-
-def EnsureDirectoryExists(path, always_try_to_create=False):
-  """A wrapper for os.makedirs that does not error if the directory already
-  exists. A different process could be racing to create this directory."""
-
-  if not os.path.exists(path) or always_try_to_create:
-    try:
-      os.makedirs(path)
-    except OSError as e:
-      # There may have been a race to create this directory.
-      if e.errno != errno.EEXIST:
-        raise
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/__init__.py b/mojo/public/tools/bindings/pylib/mojom/generate/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/constant_resolver.py b/mojo/public/tools/bindings/pylib/mojom/generate/constant_resolver.py
deleted file mode 100644
index c8b21f2..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/constant_resolver.py
+++ /dev/null
@@ -1,91 +0,0 @@
-# Copyright 2015 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.
-
-"""Resolves the values used for constants and enums."""
-
-from itertools import ifilter
-import mojom.generate.module as mojom
-
-def ResolveConstants(module, expression_to_text):
-  in_progress = set()
-  computed = set()
-
-  def GetResolvedValue(named_value):
-    assert isinstance(named_value, (mojom.EnumValue, mojom.ConstantValue))
-    if isinstance(named_value, mojom.EnumValue):
-      field = next(ifilter(lambda field: field.name == named_value.name,
-                           named_value.enum.fields), None)
-      if not field:
-        raise RuntimeError(
-            'Unable to get computed value for field %s of enum %s' %
-            (named_value.name, named_value.enum.name))
-      if field not in computed:
-        ResolveEnum(named_value.enum)
-      return field.resolved_value
-    else:
-      ResolveConstant(named_value.constant)
-      named_value.resolved_value = named_value.constant.resolved_value
-      return named_value.resolved_value
-
-  def ResolveConstant(constant):
-    if constant in computed:
-      return
-    if constant in in_progress:
-      raise RuntimeError('Circular dependency for constant: %s' % constant.name)
-    in_progress.add(constant)
-    if isinstance(constant.value, (mojom.EnumValue, mojom.ConstantValue)):
-      resolved_value = GetResolvedValue(constant.value)
-    else:
-      resolved_value = expression_to_text(constant.value)
-    constant.resolved_value = resolved_value
-    in_progress.remove(constant)
-    computed.add(constant)
-
-  def ResolveEnum(enum):
-    def ResolveEnumField(enum, field, default_value):
-      if field in computed:
-        return
-      if field in in_progress:
-        raise RuntimeError('Circular dependency for enum: %s' % enum.name)
-      in_progress.add(field)
-      if field.value:
-        if isinstance(field.value, mojom.EnumValue):
-          resolved_value = GetResolvedValue(field.value)
-        elif isinstance(field.value, str):
-          resolved_value = int(field.value, 0)
-        else:
-          raise RuntimeError('Unexpected value: %s' % field.value)
-      else:
-        resolved_value = default_value
-      field.resolved_value = resolved_value
-      in_progress.remove(field)
-      computed.add(field)
-
-    current_value = 0
-    for field in enum.fields:
-      ResolveEnumField(enum, field, current_value)
-      current_value = field.resolved_value + 1
-
-  for constant in module.constants:
-    ResolveConstant(constant)
-
-  for enum in module.enums:
-    ResolveEnum(enum)
-
-  for struct in module.structs:
-    for constant in struct.constants:
-      ResolveConstant(constant)
-    for enum in struct.enums:
-      ResolveEnum(enum)
-    for field in struct.fields:
-      if isinstance(field.default, (mojom.ConstantValue, mojom.EnumValue)):
-        field.default.resolved_value = GetResolvedValue(field.default)
-
-  for interface in module.interfaces:
-    for constant in interface.constants:
-      ResolveConstant(constant)
-    for enum in interface.enums:
-      ResolveEnum(enum)
-
-  return module
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/generator.py b/mojo/public/tools/bindings/pylib/mojom/generate/generator.py
deleted file mode 100644
index 0e64af7..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/generator.py
+++ /dev/null
@@ -1,153 +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.
-
-"""Code shared by the various language-specific code generators."""
-
-from functools import partial
-import os.path
-import re
-
-import module as mojom
-import mojom.fileutil as fileutil
-import pack
-
-def ExpectedArraySize(kind):
-  if mojom.IsArrayKind(kind):
-    return kind.length
-  return None
-
-def StudlyCapsToCamel(studly):
-  return studly[0].lower() + studly[1:]
-
-def UnderToCamel(under):
-  """Converts underscore_separated strings to CamelCase strings."""
-  return ''.join(word.capitalize() for word in under.split('_'))
-
-def WriteFile(contents, full_path):
-  # Make sure the containing directory exists.
-  full_dir = os.path.dirname(full_path)
-  fileutil.EnsureDirectoryExists(full_dir)
-
-  # Dump the data to disk.
-  with open(full_path, "w+") as f:
-    f.write(contents)
-
-class Generator(object):
-  # Pass |output_dir| to emit files to disk. Omit |output_dir| to echo all
-  # files to stdout.
-  def __init__(self, module, output_dir=None, typemap=None, variant=None,
-               bytecode_path=None, for_blink=False, use_once_callback=False,
-               use_new_js_bindings=False, export_attribute=None,
-               export_header=None, generate_non_variant_code=False):
-    self.module = module
-    self.output_dir = output_dir
-    self.typemap = typemap or {}
-    self.variant = variant
-    self.bytecode_path = bytecode_path
-    self.for_blink = for_blink
-    self.use_once_callback = use_once_callback
-    self.use_new_js_bindings = use_new_js_bindings
-    self.export_attribute = export_attribute
-    self.export_header = export_header
-    self.generate_non_variant_code = generate_non_variant_code
-
-  def GetStructsFromMethods(self):
-    result = []
-    for interface in self.module.interfaces:
-      for method in interface.methods:
-        result.append(self._GetStructFromMethod(method))
-        if method.response_parameters != None:
-          result.append(self._GetResponseStructFromMethod(method))
-    return result
-
-  def GetStructs(self):
-    return map(partial(self._AddStructComputedData, True), self.module.structs)
-
-  def GetUnions(self):
-    return map(self._AddUnionComputedData, self.module.unions)
-
-  def GetInterfaces(self):
-    return map(self._AddInterfaceComputedData, self.module.interfaces)
-
-  # Prepend the filename with a directory that matches the directory of the
-  # original .mojom file, relative to the import root.
-  def MatchMojomFilePath(self, filename):
-    return os.path.join(os.path.dirname(self.module.path), filename)
-
-  def Write(self, contents, filename):
-    if self.output_dir is None:
-      print contents
-      return
-    full_path = os.path.join(self.output_dir, filename)
-    WriteFile(contents, full_path)
-
-  def GenerateFiles(self, args):
-    raise NotImplementedError("Subclasses must override/implement this method")
-
-  def GetJinjaParameters(self):
-    """Returns default constructor parameters for the jinja environment."""
-    return {}
-
-  def GetGlobals(self):
-    """Returns global mappings for the template generation."""
-    return {}
-
-  def _AddStructComputedData(self, exported, struct):
-    """Adds computed data to the given struct. The data is computed once and
-    used repeatedly in the generation process."""
-    struct.packed = pack.PackedStruct(struct)
-    struct.bytes = pack.GetByteLayout(struct.packed)
-    struct.versions = pack.GetVersionInfo(struct.packed)
-    struct.exported = exported
-    return struct
-
-  def _AddUnionComputedData(self, union):
-    """Adds computed data to the given union. The data is computed once and
-    used repeatedly in the generation process."""
-    ordinal = 0
-    for field in union.fields:
-      if field.ordinal is not None:
-        ordinal = field.ordinal
-      field.ordinal = ordinal
-      ordinal += 1
-    return union
-
-  def _AddInterfaceComputedData(self, interface):
-    """Adds computed data to the given interface. The data is computed once and
-    used repeatedly in the generation process."""
-    interface.version = 0
-    for method in interface.methods:
-      if method.min_version is not None:
-        interface.version = max(interface.version, method.min_version)
-
-      method.param_struct = self._GetStructFromMethod(method)
-      interface.version = max(interface.version,
-                              method.param_struct.versions[-1].version)
-
-      if method.response_parameters is not None:
-        method.response_param_struct = self._GetResponseStructFromMethod(method)
-        interface.version = max(
-            interface.version,
-            method.response_param_struct.versions[-1].version)
-      else:
-        method.response_param_struct = None
-    return interface
-
-  def _GetStructFromMethod(self, method):
-    """Converts a method's parameters into the fields of a struct."""
-    params_class = "%s_%s_Params" % (method.interface.name, method.name)
-    struct = mojom.Struct(params_class, module=method.interface.module)
-    for param in method.parameters:
-      struct.AddField(param.name, param.kind, param.ordinal,
-                      attributes=param.attributes)
-    return self._AddStructComputedData(False, struct)
-
-  def _GetResponseStructFromMethod(self, method):
-    """Converts a method's response_parameters into the fields of a struct."""
-    params_class = "%s_%s_ResponseParams" % (method.interface.name, method.name)
-    struct = mojom.Struct(params_class, module=method.interface.module)
-    for param in method.response_parameters:
-      struct.AddField(param.name, param.kind, param.ordinal,
-                      attributes=param.attributes)
-    return self._AddStructComputedData(False, struct)
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/generator_unittest.py b/mojo/public/tools/bindings/pylib/mojom/generate/generator_unittest.py
deleted file mode 100644
index 9966b0b..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/generator_unittest.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2015 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.
-
-import unittest
-
-import module as mojom
-import generator
-
-class TestGenerator(unittest.TestCase):
-
-  def testGetUnionsAddsOrdinals(self):
-    module = mojom.Module()
-    union = module.AddUnion('a')
-    union.AddField('a', mojom.BOOL)
-    union.AddField('b', mojom.BOOL)
-    union.AddField('c', mojom.BOOL, ordinal=10)
-    union.AddField('d', mojom.BOOL)
-
-    gen = generator.Generator(module)
-    union = gen.GetUnions()[0]
-    ordinals = [field.ordinal for field in union.fields]
-
-    self.assertEquals([0, 1, 10, 11], ordinals)
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/module.py b/mojo/public/tools/bindings/pylib/mojom/generate/module.py
deleted file mode 100644
index 3a5f188..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/module.py
+++ /dev/null
@@ -1,891 +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 module's classes provide an interface to mojo modules. Modules are
-# collections of interfaces and structs to be used by mojo ipc clients and
-# servers.
-#
-# A simple interface would be created this way:
-# module = mojom.generate.module.Module('Foo')
-# interface = module.AddInterface('Bar')
-# method = interface.AddMethod('Tat', 0)
-# method.AddParameter('baz', 0, mojom.INT32)
-
-
-# We use our own version of __repr__ when displaying the AST, as the
-# AST currently doesn't capture which nodes are reference (e.g. to
-# types) and which nodes are definitions. This allows us to e.g. print
-# the definition of a struct when it's defined inside a module, but
-# only print its name when it's referenced in e.g. a method parameter.
-def Repr(obj, as_ref=True):
-  """A version of __repr__ that can distinguish references.
-
-  Sometimes we like to print an object's full representation
-  (e.g. with its fields) and sometimes we just want to reference an
-  object that was printed in full elsewhere. This function allows us
-  to make that distinction.
-
-  Args:
-    obj: The object whose string representation we compute.
-    as_ref: If True, use the short reference representation.
-
-  Returns:
-    A str representation of |obj|.
-  """
-  if hasattr(obj, 'Repr'):
-    return obj.Repr(as_ref=as_ref)
-  # Since we cannot implement Repr for existing container types, we
-  # handle them here.
-  elif isinstance(obj, list):
-    if not obj:
-      return '[]'
-    else:
-      return ('[\n%s\n]' % (',\n'.join('    %s' % Repr(elem, as_ref).replace(
-          '\n', '\n    ') for elem in obj)))
-  elif isinstance(obj, dict):
-    if not obj:
-      return '{}'
-    else:
-      return ('{\n%s\n}' % (',\n'.join('    %s: %s' % (
-          Repr(key, as_ref).replace('\n', '\n    '),
-          Repr(val, as_ref).replace('\n', '\n    '))
-          for key, val in obj.iteritems())))
-  else:
-    return repr(obj)
-
-
-def GenericRepr(obj, names):
-  """Compute generic Repr for |obj| based on the attributes in |names|.
-
-  Args:
-    obj: The object to compute a Repr for.
-    names: A dict from attribute names to include, to booleans
-        specifying whether those attributes should be shown as
-        references or not.
-
-  Returns:
-    A str representation of |obj|.
-  """
-  def ReprIndent(name, as_ref):
-    return '    %s=%s' % (name, Repr(getattr(obj, name), as_ref).replace(
-        '\n', '\n    '))
-
-  return '%s(\n%s\n)' % (
-      obj.__class__.__name__,
-      ',\n'.join(ReprIndent(name, as_ref)
-                 for (name, as_ref) in names.iteritems()))
-
-
-class Kind(object):
-  """Kind represents a type (e.g. int8, string).
-
-  Attributes:
-    spec: A string uniquely identifying the type. May be None.
-    parent_kind: The enclosing type. For example, a struct defined
-        inside an interface has that interface as its parent. May be None.
-  """
-  def __init__(self, spec=None):
-    self.spec = spec
-    self.parent_kind = None
-
-  def Repr(self, as_ref=True):
-    return '<%s spec=%r>' % (self.__class__.__name__, self.spec)
-
-  def __repr__(self):
-    # Gives us a decent __repr__ for all kinds.
-    return self.Repr()
-
-
-class ReferenceKind(Kind):
-  """ReferenceKind represents pointer and handle types.
-
-  A type is nullable if null (for pointer types) or invalid handle (for handle
-  types) is a legal value for the type.
-
-  Attributes:
-    is_nullable: True if the type is nullable.
-  """
-
-  def __init__(self, spec=None, is_nullable=False):
-    assert spec is None or is_nullable == spec.startswith('?')
-    Kind.__init__(self, spec)
-    self.is_nullable = is_nullable
-    self.shared_definition = {}
-
-  def Repr(self, as_ref=True):
-    return '<%s spec=%r is_nullable=%r>' % (self.__class__.__name__, self.spec,
-                                            self.is_nullable)
-
-  def MakeNullableKind(self):
-    assert not self.is_nullable
-
-    if self == STRING:
-      return NULLABLE_STRING
-    if self == HANDLE:
-      return NULLABLE_HANDLE
-    if self == DCPIPE:
-      return NULLABLE_DCPIPE
-    if self == DPPIPE:
-      return NULLABLE_DPPIPE
-    if self == MSGPIPE:
-      return NULLABLE_MSGPIPE
-    if self == SHAREDBUFFER:
-      return NULLABLE_SHAREDBUFFER
-
-    nullable_kind = type(self)()
-    nullable_kind.shared_definition = self.shared_definition
-    if self.spec is not None:
-      nullable_kind.spec = '?' + self.spec
-    nullable_kind.is_nullable = True
-
-    return nullable_kind
-
-  @classmethod
-  def AddSharedProperty(cls, name):
-    """Adds a property |name| to |cls|, which accesses the corresponding item in
-       |shared_definition|.
-
-       The reason of adding such indirection is to enable sharing definition
-       between a reference kind and its nullable variation. For example:
-         a = Struct('test_struct_1')
-         b = a.MakeNullableKind()
-         a.name = 'test_struct_2'
-         print b.name  # Outputs 'test_struct_2'.
-    """
-    def Get(self):
-      return self.shared_definition[name]
-
-    def Set(self, value):
-      self.shared_definition[name] = value
-
-    setattr(cls, name, property(Get, Set))
-
-
-# Initialize the set of primitive types. These can be accessed by clients.
-BOOL                  = Kind('b')
-INT8                  = Kind('i8')
-INT16                 = Kind('i16')
-INT32                 = Kind('i32')
-INT64                 = Kind('i64')
-UINT8                 = Kind('u8')
-UINT16                = Kind('u16')
-UINT32                = Kind('u32')
-UINT64                = Kind('u64')
-FLOAT                 = Kind('f')
-DOUBLE                = Kind('d')
-STRING                = ReferenceKind('s')
-HANDLE                = ReferenceKind('h')
-DCPIPE                = ReferenceKind('h:d:c')
-DPPIPE                = ReferenceKind('h:d:p')
-MSGPIPE               = ReferenceKind('h:m')
-SHAREDBUFFER          = ReferenceKind('h:s')
-NULLABLE_STRING       = ReferenceKind('?s', True)
-NULLABLE_HANDLE       = ReferenceKind('?h', True)
-NULLABLE_DCPIPE       = ReferenceKind('?h:d:c', True)
-NULLABLE_DPPIPE       = ReferenceKind('?h:d:p', True)
-NULLABLE_MSGPIPE      = ReferenceKind('?h:m', True)
-NULLABLE_SHAREDBUFFER = ReferenceKind('?h:s', True)
-
-
-# Collection of all Primitive types
-PRIMITIVES = (
-  BOOL,
-  INT8,
-  INT16,
-  INT32,
-  INT64,
-  UINT8,
-  UINT16,
-  UINT32,
-  UINT64,
-  FLOAT,
-  DOUBLE,
-  STRING,
-  HANDLE,
-  DCPIPE,
-  DPPIPE,
-  MSGPIPE,
-  SHAREDBUFFER,
-  NULLABLE_STRING,
-  NULLABLE_HANDLE,
-  NULLABLE_DCPIPE,
-  NULLABLE_DPPIPE,
-  NULLABLE_MSGPIPE,
-  NULLABLE_SHAREDBUFFER
-)
-
-
-ATTRIBUTE_MIN_VERSION = 'MinVersion'
-ATTRIBUTE_EXTENSIBLE = 'Extensible'
-ATTRIBUTE_SYNC = 'Sync'
-
-
-class NamedValue(object):
-  def __init__(self, module, parent_kind, name):
-    self.module = module
-    self.namespace = module.namespace
-    self.parent_kind = parent_kind
-    self.name = name
-    self.imported_from = None
-
-  def GetSpec(self):
-    return (self.namespace + '.' +
-        (self.parent_kind and (self.parent_kind.name + '.') or "") +
-        self.name)
-
-
-class BuiltinValue(object):
-  def __init__(self, value):
-    self.value = value
-
-
-class ConstantValue(NamedValue):
-  def __init__(self, module, parent_kind, constant):
-    NamedValue.__init__(self, module, parent_kind, constant.name)
-    self.constant = constant
-
-
-class EnumValue(NamedValue):
-  def __init__(self, module, enum, field):
-    NamedValue.__init__(self, module, enum.parent_kind, field.name)
-    self.enum = enum
-
-  def GetSpec(self):
-    return (self.namespace + '.' +
-        (self.parent_kind and (self.parent_kind.name + '.') or "") +
-        self.enum.name + '.' + self.name)
-
-
-class Constant(object):
-  def __init__(self, name=None, kind=None, value=None, parent_kind=None):
-    self.name = name
-    self.kind = kind
-    self.value = value
-    self.parent_kind = parent_kind
-
-
-class Field(object):
-  def __init__(self, name=None, kind=None, ordinal=None, default=None,
-               attributes=None):
-    if self.__class__.__name__ == 'Field':
-      raise Exception()
-    self.name = name
-    self.kind = kind
-    self.ordinal = ordinal
-    self.default = default
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    # Fields are only referenced by objects which define them and thus
-    # they are always displayed as non-references.
-    return GenericRepr(self, {'name': False, 'kind': True})
-
-  @property
-  def min_version(self):
-    return self.attributes.get(ATTRIBUTE_MIN_VERSION) \
-        if self.attributes else None
-
-
-class StructField(Field): pass
-
-
-class UnionField(Field): pass
-
-
-class Struct(ReferenceKind):
-  """A struct with typed fields.
-
-  Attributes:
-    name: {str} The name of the struct type.
-    native_only: {bool} Does the struct have a body (i.e. any fields) or is it
-        purely a native struct.
-    module: {Module} The defining module.
-    imported_from: {dict} Information about where this union was
-        imported from.
-    fields: {List[StructField]} The members of the struct.
-    attributes: {dict} Additional information about the struct, such as
-        if it's a native struct.
-  """
-
-  ReferenceKind.AddSharedProperty('name')
-  ReferenceKind.AddSharedProperty('native_only')
-  ReferenceKind.AddSharedProperty('module')
-  ReferenceKind.AddSharedProperty('imported_from')
-  ReferenceKind.AddSharedProperty('fields')
-  ReferenceKind.AddSharedProperty('attributes')
-
-  def __init__(self, name=None, module=None, attributes=None):
-    if name is not None:
-      spec = 'x:' + name
-    else:
-      spec = None
-    ReferenceKind.__init__(self, spec)
-    self.name = name
-    self.native_only = False
-    self.module = module
-    self.imported_from = None
-    self.fields = []
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s name=%r imported_from=%s>' % (
-          self.__class__.__name__, self.name,
-          Repr(self.imported_from, as_ref=True))
-    else:
-      return GenericRepr(self, {'name': False, 'fields': False,
-                                'imported_from': True})
-
-  def AddField(self, name, kind, ordinal=None, default=None, attributes=None):
-    field = StructField(name, kind, ordinal, default, attributes)
-    self.fields.append(field)
-    return field
-
-
-class Union(ReferenceKind):
-  """A union of several kinds.
-
-  Attributes:
-    name: {str} The name of the union type.
-    module: {Module} The defining module.
-    imported_from: {dict} Information about where this union was
-        imported from.
-    fields: {List[UnionField]} The members of the union.
-    attributes: {dict} Additional information about the union, such as
-        which Java class name to use to represent it in the generated
-        bindings.
-  """
-  ReferenceKind.AddSharedProperty('name')
-  ReferenceKind.AddSharedProperty('module')
-  ReferenceKind.AddSharedProperty('imported_from')
-  ReferenceKind.AddSharedProperty('fields')
-  ReferenceKind.AddSharedProperty('attributes')
-
-  def __init__(self, name=None, module=None, attributes=None):
-    if name is not None:
-      spec = 'x:' + name
-    else:
-      spec = None
-    ReferenceKind.__init__(self, spec)
-    self.name = name
-    self.module = module
-    self.imported_from = None
-    self.fields = []
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s spec=%r is_nullable=%r fields=%s>' % (
-          self.__class__.__name__, self.spec, self.is_nullable,
-          Repr(self.fields))
-    else:
-      return GenericRepr(self, {'fields': True, 'is_nullable': False})
-
-  def AddField(self, name, kind, ordinal=None, attributes=None):
-    field = UnionField(name, kind, ordinal, None, attributes)
-    self.fields.append(field)
-    return field
-
-
-class Array(ReferenceKind):
-  """An array.
-
-  Attributes:
-    kind: {Kind} The type of the elements. May be None.
-    length: The number of elements. None if unknown.
-  """
-
-  ReferenceKind.AddSharedProperty('kind')
-  ReferenceKind.AddSharedProperty('length')
-
-  def __init__(self, kind=None, length=None):
-    if kind is not None:
-      if length is not None:
-        spec = 'a%d:%s' % (length, kind.spec)
-      else:
-        spec = 'a:%s' % kind.spec
-
-      ReferenceKind.__init__(self, spec)
-    else:
-      ReferenceKind.__init__(self)
-    self.kind = kind
-    self.length = length
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s spec=%r is_nullable=%r kind=%s length=%r>' % (
-          self.__class__.__name__, self.spec, self.is_nullable, Repr(self.kind),
-          self.length)
-    else:
-      return GenericRepr(self, {'kind': True, 'length': False,
-                                'is_nullable': False})
-
-
-class Map(ReferenceKind):
-  """A map.
-
-  Attributes:
-    key_kind: {Kind} The type of the keys. May be None.
-    value_kind: {Kind} The type of the elements. May be None.
-  """
-  ReferenceKind.AddSharedProperty('key_kind')
-  ReferenceKind.AddSharedProperty('value_kind')
-
-  def __init__(self, key_kind=None, value_kind=None):
-    if (key_kind is not None and value_kind is not None):
-      ReferenceKind.__init__(self,
-                             'm[' + key_kind.spec + '][' + value_kind.spec +
-                             ']')
-      if IsNullableKind(key_kind):
-        raise Exception("Nullable kinds cannot be keys in maps.")
-      if IsAnyHandleKind(key_kind):
-        raise Exception("Handles cannot be keys in maps.")
-      if IsAnyInterfaceKind(key_kind):
-        raise Exception("Interfaces cannot be keys in maps.")
-      if IsArrayKind(key_kind):
-        raise Exception("Arrays cannot be keys in maps.")
-    else:
-      ReferenceKind.__init__(self)
-
-    self.key_kind = key_kind
-    self.value_kind = value_kind
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s spec=%r is_nullable=%r key_kind=%s value_kind=%s>' % (
-          self.__class__.__name__, self.spec, self.is_nullable,
-          Repr(self.key_kind), Repr(self.value_kind))
-    else:
-      return GenericRepr(self, {'key_kind': True, 'value_kind': True})
-
-
-class InterfaceRequest(ReferenceKind):
-  ReferenceKind.AddSharedProperty('kind')
-
-  def __init__(self, kind=None):
-    if kind is not None:
-      if not isinstance(kind, Interface):
-        raise Exception(
-            "Interface request requires %r to be an interface." % kind.spec)
-      ReferenceKind.__init__(self, 'r:' + kind.spec)
-    else:
-      ReferenceKind.__init__(self)
-    self.kind = kind
-
-
-class AssociatedInterfaceRequest(ReferenceKind):
-  ReferenceKind.AddSharedProperty('kind')
-
-  def __init__(self, kind=None):
-    if kind is not None:
-      if not isinstance(kind, InterfaceRequest):
-        raise Exception(
-            "Associated interface request requires %r to be an interface "
-            "request." % kind.spec)
-      assert not kind.is_nullable
-      ReferenceKind.__init__(self, 'asso:' + kind.spec)
-    else:
-      ReferenceKind.__init__(self)
-    self.kind = kind.kind if kind is not None else None
-
-
-class Parameter(object):
-  def __init__(self, name=None, kind=None, ordinal=None, default=None,
-               attributes=None):
-    self.name = name
-    self.ordinal = ordinal
-    self.kind = kind
-    self.default = default
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    return '<%s name=%r kind=%s>' % (self.__class__.__name__, self.name,
-                                     self.kind.Repr(as_ref=True))
-
-  @property
-  def min_version(self):
-    return self.attributes.get(ATTRIBUTE_MIN_VERSION) \
-        if self.attributes else None
-
-
-class Method(object):
-  def __init__(self, interface, name, ordinal=None, attributes=None):
-    self.interface = interface
-    self.name = name
-    self.ordinal = ordinal
-    self.parameters = []
-    self.response_parameters = None
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s name=%r>' % (self.__class__.__name__, self.name)
-    else:
-      return GenericRepr(self, {'name': False, 'parameters': True,
-                                'response_parameters': True})
-
-  def AddParameter(self, name, kind, ordinal=None, default=None,
-                   attributes=None):
-    parameter = Parameter(name, kind, ordinal, default, attributes)
-    self.parameters.append(parameter)
-    return parameter
-
-  def AddResponseParameter(self, name, kind, ordinal=None, default=None,
-                           attributes=None):
-    if self.response_parameters == None:
-      self.response_parameters = []
-    parameter = Parameter(name, kind, ordinal, default, attributes)
-    self.response_parameters.append(parameter)
-    return parameter
-
-  @property
-  def min_version(self):
-    return self.attributes.get(ATTRIBUTE_MIN_VERSION) \
-        if self.attributes else None
-
-  @property
-  def sync(self):
-    return self.attributes.get(ATTRIBUTE_SYNC) \
-        if self.attributes else None
-
-
-class Interface(ReferenceKind):
-  ReferenceKind.AddSharedProperty('module')
-  ReferenceKind.AddSharedProperty('name')
-  ReferenceKind.AddSharedProperty('imported_from')
-  ReferenceKind.AddSharedProperty('methods')
-  ReferenceKind.AddSharedProperty('attributes')
-
-  def __init__(self, name=None, module=None, attributes=None):
-    if name is not None:
-      spec = 'x:' + name
-    else:
-      spec = None
-    ReferenceKind.__init__(self, spec)
-    self.module = module
-    self.name = name
-    self.imported_from = None
-    self.methods = []
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s name=%r>' % (self.__class__.__name__, self.name)
-    else:
-      return GenericRepr(self, {'name': False, 'attributes': False,
-                                'methods': False})
-
-  def AddMethod(self, name, ordinal=None, attributes=None):
-    method = Method(self, name, ordinal, attributes)
-    self.methods.append(method)
-    return method
-
-  # TODO(451323): Remove when the language backends no longer rely on this.
-  @property
-  def client(self):
-    return None
-
-
-class AssociatedInterface(ReferenceKind):
-  ReferenceKind.AddSharedProperty('kind')
-
-  def __init__(self, kind=None):
-    if kind is not None:
-      if not isinstance(kind, Interface):
-        raise Exception(
-            "Associated interface requires %r to be an interface." % kind.spec)
-      assert not kind.is_nullable
-      ReferenceKind.__init__(self, 'asso:' + kind.spec)
-    else:
-      ReferenceKind.__init__(self)
-    self.kind = kind
-
-
-class EnumField(object):
-  def __init__(self, name=None, value=None, attributes=None,
-               numeric_value=None):
-    self.name = name
-    self.value = value
-    self.attributes = attributes
-    self.numeric_value = numeric_value
-
-  @property
-  def min_version(self):
-    return self.attributes.get(ATTRIBUTE_MIN_VERSION) \
-        if self.attributes else None
-
-
-class Enum(Kind):
-  def __init__(self, name=None, module=None, attributes=None):
-    self.module = module
-    self.name = name
-    self.native_only = False
-    self.imported_from = None
-    if name is not None:
-      spec = 'x:' + name
-    else:
-      spec = None
-    Kind.__init__(self, spec)
-    self.fields = []
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s name=%r>' % (self.__class__.__name__, self.name)
-    else:
-      return GenericRepr(self, {'name': False, 'fields': False})
-
-  @property
-  def extensible(self):
-    return self.attributes.get(ATTRIBUTE_EXTENSIBLE, False) \
-        if self.attributes else False
-
-
-class Module(object):
-  def __init__(self, name=None, namespace=None, attributes=None):
-    self.name = name
-    self.path = name
-    self.namespace = namespace
-    self.structs = []
-    self.unions = []
-    self.interfaces = []
-    self.kinds = {}
-    self.attributes = attributes
-
-  def __repr__(self):
-    # Gives us a decent __repr__ for modules.
-    return self.Repr()
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s name=%r namespace=%r>' % (
-          self.__class__.__name__, self.name, self.namespace)
-    else:
-      return GenericRepr(self, {'name': False, 'namespace': False,
-                                'attributes': False, 'structs': False,
-                                'interfaces': False, 'unions': False})
-
-  def AddInterface(self, name, attributes=None):
-    interface = Interface(name, self, attributes)
-    self.interfaces.append(interface)
-    return interface
-
-  def AddStruct(self, name, attributes=None):
-    struct = Struct(name, self, attributes)
-    self.structs.append(struct)
-    return struct
-
-  def AddUnion(self, name, attributes=None):
-    union = Union(name, self, attributes)
-    self.unions.append(union)
-    return union
-
-
-def IsBoolKind(kind):
-  return kind.spec == BOOL.spec
-
-
-def IsFloatKind(kind):
-  return kind.spec == FLOAT.spec
-
-
-def IsDoubleKind(kind):
-  return kind.spec == DOUBLE.spec
-
-
-def IsIntegralKind(kind):
-  return (kind.spec == BOOL.spec or
-          kind.spec == INT8.spec or
-          kind.spec == INT16.spec or
-          kind.spec == INT32.spec or
-          kind.spec == INT64.spec or
-          kind.spec == UINT8.spec or
-          kind.spec == UINT16.spec or
-          kind.spec == UINT32.spec or
-          kind.spec == UINT64.spec)
-
-
-def IsStringKind(kind):
-  return kind.spec == STRING.spec or kind.spec == NULLABLE_STRING.spec
-
-
-def IsGenericHandleKind(kind):
-  return kind.spec == HANDLE.spec or kind.spec == NULLABLE_HANDLE.spec
-
-
-def IsDataPipeConsumerKind(kind):
-  return kind.spec == DCPIPE.spec or kind.spec == NULLABLE_DCPIPE.spec
-
-
-def IsDataPipeProducerKind(kind):
-  return kind.spec == DPPIPE.spec or kind.spec == NULLABLE_DPPIPE.spec
-
-
-def IsMessagePipeKind(kind):
-  return kind.spec == MSGPIPE.spec or kind.spec == NULLABLE_MSGPIPE.spec
-
-
-def IsSharedBufferKind(kind):
-  return (kind.spec == SHAREDBUFFER.spec or
-          kind.spec == NULLABLE_SHAREDBUFFER.spec)
-
-
-def IsStructKind(kind):
-  return isinstance(kind, Struct)
-
-
-def IsUnionKind(kind):
-  return isinstance(kind, Union)
-
-
-def IsArrayKind(kind):
-  return isinstance(kind, Array)
-
-
-def IsInterfaceKind(kind):
-  return isinstance(kind, Interface)
-
-
-def IsAssociatedInterfaceKind(kind):
-  return isinstance(kind, AssociatedInterface)
-
-
-def IsInterfaceRequestKind(kind):
-  return isinstance(kind, InterfaceRequest)
-
-
-def IsAssociatedInterfaceRequestKind(kind):
-  return isinstance(kind, AssociatedInterfaceRequest)
-
-
-def IsEnumKind(kind):
-  return isinstance(kind, Enum)
-
-
-def IsReferenceKind(kind):
-  return isinstance(kind, ReferenceKind)
-
-
-def IsNullableKind(kind):
-  return IsReferenceKind(kind) and kind.is_nullable
-
-
-def IsMapKind(kind):
-  return isinstance(kind, Map)
-
-
-def IsObjectKind(kind):
-  return IsPointerKind(kind) or IsUnionKind(kind)
-
-
-def IsPointerKind(kind):
-  return (IsStructKind(kind) or IsArrayKind(kind) or IsStringKind(kind) or
-          IsMapKind(kind))
-
-
-# Please note that it doesn't include any interface kind.
-def IsAnyHandleKind(kind):
-  return (IsGenericHandleKind(kind) or
-          IsDataPipeConsumerKind(kind) or
-          IsDataPipeProducerKind(kind) or
-          IsMessagePipeKind(kind) or
-          IsSharedBufferKind(kind))
-
-
-def IsAnyInterfaceKind(kind):
-  return (IsInterfaceKind(kind) or IsInterfaceRequestKind(kind) or
-          IsAssociatedKind(kind))
-
-
-def IsAnyHandleOrInterfaceKind(kind):
-  return IsAnyHandleKind(kind) or IsAnyInterfaceKind(kind)
-
-
-def IsAssociatedKind(kind):
-  return (IsAssociatedInterfaceKind(kind) or
-          IsAssociatedInterfaceRequestKind(kind))
-
-
-def HasCallbacks(interface):
-  for method in interface.methods:
-    if method.response_parameters != None:
-      return True
-  return False
-
-
-# Finds out whether an interface passes associated interfaces and associated
-# interface requests.
-def PassesAssociatedKinds(interface):
-  def _ContainsAssociatedKinds(kind, visited_kinds):
-    if kind in visited_kinds:
-      # No need to examine the kind again.
-      return False
-    visited_kinds.add(kind)
-    if IsAssociatedKind(kind):
-      return True
-    if IsArrayKind(kind):
-      return _ContainsAssociatedKinds(kind.kind, visited_kinds)
-    if IsStructKind(kind) or IsUnionKind(kind):
-      for field in kind.fields:
-        if _ContainsAssociatedKinds(field.kind, visited_kinds):
-          return True
-    if IsMapKind(kind):
-      # No need to examine the key kind, only primitive kinds and non-nullable
-      # string are allowed to be key kinds.
-      return _ContainsAssociatedKinds(kind.value_kind, visited_kinds)
-    return False
-
-  visited_kinds = set()
-  for method in interface.methods:
-    for param in method.parameters:
-      if _ContainsAssociatedKinds(param.kind, visited_kinds):
-        return True
-    if method.response_parameters != None:
-      for param in method.response_parameters:
-        if _ContainsAssociatedKinds(param.kind, visited_kinds):
-          return True
-  return False
-
-
-def HasSyncMethods(interface):
-  for method in interface.methods:
-    if method.sync:
-      return True
-  return False
-
-
-def ContainsHandlesOrInterfaces(kind):
-  """Check if the kind contains any handles.
-
-  This check is recursive so it checks all struct fields, containers elements,
-  etc.
-
-  Args:
-    struct: {Kind} The kind to check.
-
-  Returns:
-    {bool}: True if the kind contains handles.
-  """
-  # We remember the types we already checked to avoid infinite recursion when
-  # checking recursive (or mutually recursive) types:
-  checked = set()
-  def Check(kind):
-    if kind.spec in checked:
-      return False
-    checked.add(kind.spec)
-    if IsStructKind(kind):
-      return any(Check(field.kind) for field in kind.fields)
-    elif IsUnionKind(kind):
-      return any(Check(field.kind) for field in kind.fields)
-    elif IsAnyHandleKind(kind):
-      return True
-    elif IsAnyInterfaceKind(kind):
-      return True
-    elif IsArrayKind(kind):
-      return Check(kind.kind)
-    elif IsMapKind(kind):
-      return Check(kind.key_kind) or Check(kind.value_kind)
-    else:
-      return False
-  return Check(kind)
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/module_tests.py b/mojo/public/tools/bindings/pylib/mojom/generate/module_tests.py
deleted file mode 100644
index a887686..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/module_tests.py
+++ /dev/null
@@ -1,34 +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.
-
-import sys
-
-import test_support
-
-EXPECT_EQ = test_support.EXPECT_EQ
-EXPECT_TRUE = test_support.EXPECT_TRUE
-RunTest = test_support.RunTest
-ModulesAreEqual = test_support.ModulesAreEqual
-BuildTestModule = test_support.BuildTestModule
-TestTestModule = test_support.TestTestModule
-
-
-def BuildAndTestModule():
-  return TestTestModule(BuildTestModule())
-
-
-def TestModulesEqual():
-  return EXPECT_TRUE(ModulesAreEqual(BuildTestModule(), BuildTestModule()))
-
-
-def Main(args):
-  errors = 0
-  errors += RunTest(BuildAndTestModule)
-  errors += RunTest(TestModulesEqual)
-
-  return errors
-
-
-if __name__ == '__main__':
-  sys.exit(Main(sys.argv[1:]))
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/pack.py b/mojo/public/tools/bindings/pylib/mojom/generate/pack.py
deleted file mode 100644
index 37dc8f3..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/pack.py
+++ /dev/null
@@ -1,250 +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.
-
-import module as mojom
-
-# This module provides a mechanism for determining the packed order and offsets
-# of a mojom.Struct.
-#
-# ps = pack.PackedStruct(struct)
-# ps.packed_fields will access a list of PackedField objects, each of which
-# will have an offset, a size and a bit (for mojom.BOOLs).
-
-# Size of struct header in bytes: num_bytes [4B] + version [4B].
-HEADER_SIZE = 8
-
-class PackedField(object):
-  kind_to_size = {
-    mojom.BOOL:                  1,
-    mojom.INT8:                  1,
-    mojom.UINT8:                 1,
-    mojom.INT16:                 2,
-    mojom.UINT16:                2,
-    mojom.INT32:                 4,
-    mojom.UINT32:                4,
-    mojom.FLOAT:                 4,
-    mojom.HANDLE:                4,
-    mojom.MSGPIPE:               4,
-    mojom.SHAREDBUFFER:          4,
-    mojom.DCPIPE:                4,
-    mojom.DPPIPE:                4,
-    mojom.NULLABLE_HANDLE:       4,
-    mojom.NULLABLE_MSGPIPE:      4,
-    mojom.NULLABLE_SHAREDBUFFER: 4,
-    mojom.NULLABLE_DCPIPE:       4,
-    mojom.NULLABLE_DPPIPE:       4,
-    mojom.INT64:                 8,
-    mojom.UINT64:                8,
-    mojom.DOUBLE:                8,
-    mojom.STRING:                8,
-    mojom.NULLABLE_STRING:       8
-  }
-
-  @classmethod
-  def GetSizeForKind(cls, kind):
-    if isinstance(kind, (mojom.Array, mojom.Map, mojom.Struct,
-                         mojom.Interface, mojom.AssociatedInterface)):
-      return 8
-    if isinstance(kind, mojom.Union):
-      return 16
-    if isinstance(kind, mojom.InterfaceRequest):
-      kind = mojom.MSGPIPE
-    if isinstance(kind, mojom.AssociatedInterfaceRequest):
-      return 4
-    if isinstance(kind, mojom.Enum):
-      # TODO(mpcomplete): what about big enums?
-      return cls.kind_to_size[mojom.INT32]
-    if not kind in cls.kind_to_size:
-      raise Exception("Invalid kind: %s" % kind.spec)
-    return cls.kind_to_size[kind]
-
-  @classmethod
-  def GetAlignmentForKind(cls, kind):
-    if isinstance(kind, (mojom.Interface, mojom.AssociatedInterface)):
-      return 4
-    if isinstance(kind, mojom.Union):
-      return 8
-    return cls.GetSizeForKind(kind)
-
-  def __init__(self, field, index, ordinal):
-    """
-    Args:
-      field: the original field.
-      index: the position of the original field in the struct.
-      ordinal: the ordinal of the field for serialization.
-    """
-    self.field = field
-    self.index = index
-    self.ordinal = ordinal
-    self.size = self.GetSizeForKind(field.kind)
-    self.alignment = self.GetAlignmentForKind(field.kind)
-    self.offset = None
-    self.bit = None
-    self.min_version = None
-
-
-def GetPad(offset, alignment):
-  """Returns the pad necessary to reserve space so that |offset + pad| equals to
-  some multiple of |alignment|."""
-  return (alignment - (offset % alignment)) % alignment
-
-
-def GetFieldOffset(field, last_field):
-  """Returns a 2-tuple of the field offset and bit (for BOOLs)."""
-  if (field.field.kind == mojom.BOOL and
-      last_field.field.kind == mojom.BOOL and
-      last_field.bit < 7):
-    return (last_field.offset, last_field.bit + 1)
-
-  offset = last_field.offset + last_field.size
-  pad = GetPad(offset, field.alignment)
-  return (offset + pad, 0)
-
-
-def GetPayloadSizeUpToField(field):
-  """Returns the payload size (not including struct header) if |field| is the
-  last field.
-  """
-  if not field:
-    return 0
-  offset = field.offset + field.size
-  pad = GetPad(offset, 8)
-  return offset + pad
-
-
-class PackedStruct(object):
-  def __init__(self, struct):
-    self.struct = struct
-    # |packed_fields| contains all the fields, in increasing offset order.
-    self.packed_fields = []
-    # |packed_fields_in_ordinal_order| refers to the same fields as
-    # |packed_fields|, but in ordinal order.
-    self.packed_fields_in_ordinal_order = []
-
-    # No fields.
-    if (len(struct.fields) == 0):
-      return
-
-    # Start by sorting by ordinal.
-    src_fields = self.packed_fields_in_ordinal_order
-    ordinal = 0
-    for index, field in enumerate(struct.fields):
-      if field.ordinal is not None:
-        ordinal = field.ordinal
-      src_fields.append(PackedField(field, index, ordinal))
-      ordinal += 1
-    src_fields.sort(key=lambda field: field.ordinal)
-
-    # Set |min_version| for each field.
-    next_min_version = 0
-    for packed_field in src_fields:
-      if packed_field.field.min_version is None:
-        assert next_min_version == 0
-      else:
-        assert packed_field.field.min_version >= next_min_version
-        next_min_version = packed_field.field.min_version
-      packed_field.min_version = next_min_version
-
-      if (packed_field.min_version != 0 and
-          mojom.IsReferenceKind(packed_field.field.kind) and
-          not packed_field.field.kind.is_nullable):
-        raise Exception("Non-nullable fields are only allowed in version 0 of "
-                        "a struct. %s.%s is defined with [MinVersion=%d]."
-                            % (self.struct.name, packed_field.field.name,
-                               packed_field.min_version))
-
-    src_field = src_fields[0]
-    src_field.offset = 0
-    src_field.bit = 0
-    dst_fields = self.packed_fields
-    dst_fields.append(src_field)
-
-    # Then find first slot that each field will fit.
-    for src_field in src_fields[1:]:
-      last_field = dst_fields[0]
-      for i in xrange(1, len(dst_fields)):
-        next_field = dst_fields[i]
-        offset, bit = GetFieldOffset(src_field, last_field)
-        if offset + src_field.size <= next_field.offset:
-          # Found hole.
-          src_field.offset = offset
-          src_field.bit = bit
-          dst_fields.insert(i, src_field)
-          break
-        last_field = next_field
-      if src_field.offset is None:
-        # Add to end
-        src_field.offset, src_field.bit = GetFieldOffset(src_field, last_field)
-        dst_fields.append(src_field)
-
-
-class ByteInfo(object):
-  def __init__(self):
-    self.is_padding = False
-    self.packed_fields = []
-
-
-def GetByteLayout(packed_struct):
-  total_payload_size = GetPayloadSizeUpToField(
-      packed_struct.packed_fields[-1] if packed_struct.packed_fields else None)
-  bytes = [ByteInfo() for i in xrange(total_payload_size)]
-
-  limit_of_previous_field = 0
-  for packed_field in packed_struct.packed_fields:
-    for i in xrange(limit_of_previous_field, packed_field.offset):
-      bytes[i].is_padding = True
-    bytes[packed_field.offset].packed_fields.append(packed_field)
-    limit_of_previous_field = packed_field.offset + packed_field.size
-
-  for i in xrange(limit_of_previous_field, len(bytes)):
-    bytes[i].is_padding = True
-
-  for byte in bytes:
-    # A given byte cannot both be padding and have a fields packed into it.
-    assert not (byte.is_padding and byte.packed_fields)
-
-  return bytes
-
-
-class VersionInfo(object):
-  def __init__(self, version, num_fields, num_bytes):
-    self.version = version
-    self.num_fields = num_fields
-    self.num_bytes = num_bytes
-
-
-def GetVersionInfo(packed_struct):
-  """Get version information for a struct.
-
-  Args:
-    packed_struct: A PackedStruct instance.
-
-  Returns:
-    A non-empty list of VersionInfo instances, sorted by version in increasing
-    order.
-    Note: The version numbers may not be consecutive.
-  """
-  versions = []
-  last_version = 0
-  last_num_fields = 0
-  last_payload_size = 0
-
-  for packed_field in packed_struct.packed_fields_in_ordinal_order:
-    if packed_field.min_version != last_version:
-      versions.append(
-          VersionInfo(last_version, last_num_fields,
-                      last_payload_size + HEADER_SIZE))
-      last_version = packed_field.min_version
-
-    last_num_fields += 1
-    # The fields are iterated in ordinal order here. However, the size of a
-    # version is determined by the last field of that version in pack order,
-    # instead of ordinal order. Therefore, we need to calculate the max value.
-    last_payload_size = max(GetPayloadSizeUpToField(packed_field),
-                            last_payload_size)
-
-  assert len(versions) == 0 or last_num_fields != versions[-1].num_fields
-  versions.append(VersionInfo(last_version, last_num_fields,
-                              last_payload_size + HEADER_SIZE))
-  return versions
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/pack_tests.py b/mojo/public/tools/bindings/pylib/mojom/generate/pack_tests.py
deleted file mode 100644
index 14f699d..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/pack_tests.py
+++ /dev/null
@@ -1,193 +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.
-
-import sys
-
-import module as mojom
-import pack
-import test_support
-
-
-EXPECT_EQ = test_support.EXPECT_EQ
-EXPECT_TRUE = test_support.EXPECT_TRUE
-RunTest = test_support.RunTest
-
-
-def TestOrdinalOrder():
-  errors = 0
-  struct = mojom.Struct('test')
-  struct.AddField('testfield1', mojom.INT32, 2)
-  struct.AddField('testfield2', mojom.INT32, 1)
-  ps = pack.PackedStruct(struct)
-
-  errors += EXPECT_EQ(2, len(ps.packed_fields))
-  errors += EXPECT_EQ('testfield2', ps.packed_fields[0].field.name)
-  errors += EXPECT_EQ('testfield1', ps.packed_fields[1].field.name)
-
-  return errors
-
-def TestZeroFields():
-  errors = 0
-  struct = mojom.Struct('test')
-  ps = pack.PackedStruct(struct)
-  errors += EXPECT_EQ(0, len(ps.packed_fields))
-  return errors
-
-
-def TestOneField():
-  errors = 0
-  struct = mojom.Struct('test')
-  struct.AddField('testfield1', mojom.INT8)
-  ps = pack.PackedStruct(struct)
-  errors += EXPECT_EQ(1, len(ps.packed_fields))
-  return errors
-
-# Pass three tuples.
-# |kinds| is a sequence of mojom.Kinds that specify the fields that are to
-# be created.
-# |fields| is the expected order of the resulting fields, with the integer
-# "1" first.
-# |offsets| is the expected order of offsets, with the integer "0" first.
-def TestSequence(kinds, fields, offsets):
-  errors = 0
-  struct = mojom.Struct('test')
-  index = 1
-  for kind in kinds:
-    struct.AddField("%d" % index, kind)
-    index += 1
-  ps = pack.PackedStruct(struct)
-  num_fields = len(ps.packed_fields)
-  errors += EXPECT_EQ(len(kinds), num_fields)
-  for i in xrange(num_fields):
-    EXPECT_EQ("%d" % fields[i], ps.packed_fields[i].field.name)
-    EXPECT_EQ(offsets[i], ps.packed_fields[i].offset)
-
-  return errors
-
-
-def TestPaddingPackedInOrder():
-  return TestSequence(
-      (mojom.INT8, mojom.UINT8, mojom.INT32),
-      (1, 2, 3),
-      (0, 1, 4))
-
-
-def TestPaddingPackedOutOfOrder():
-  return TestSequence(
-      (mojom.INT8, mojom.INT32, mojom.UINT8),
-      (1, 3, 2),
-      (0, 1, 4))
-
-
-def TestPaddingPackedOverflow():
-  kinds = (mojom.INT8, mojom.INT32, mojom.INT16, mojom.INT8, mojom.INT8)
-  # 2 bytes should be packed together first, followed by short, then by int.
-  fields = (1, 4, 3, 2, 5)
-  offsets = (0, 1, 2, 4, 8)
-  return TestSequence(kinds, fields, offsets)
-
-
-def TestNullableTypes():
-  kinds = (mojom.STRING.MakeNullableKind(),
-           mojom.HANDLE.MakeNullableKind(),
-           mojom.Struct('test_struct').MakeNullableKind(),
-           mojom.DCPIPE.MakeNullableKind(),
-           mojom.Array().MakeNullableKind(),
-           mojom.DPPIPE.MakeNullableKind(),
-           mojom.Array(length=5).MakeNullableKind(),
-           mojom.MSGPIPE.MakeNullableKind(),
-           mojom.Interface('test_inteface').MakeNullableKind(),
-           mojom.SHAREDBUFFER.MakeNullableKind(),
-           mojom.InterfaceRequest().MakeNullableKind())
-  fields = (1, 2, 4, 3, 5, 6, 8, 7, 9, 10, 11)
-  offsets = (0, 8, 12, 16, 24, 32, 36, 40, 48, 52, 56)
-  return TestSequence(kinds, fields, offsets)
-
-
-def TestAllTypes():
-  return TestSequence(
-      (mojom.BOOL, mojom.INT8, mojom.STRING, mojom.UINT8,
-       mojom.INT16, mojom.DOUBLE, mojom.UINT16,
-       mojom.INT32, mojom.UINT32, mojom.INT64,
-       mojom.FLOAT, mojom.STRING, mojom.HANDLE,
-       mojom.UINT64, mojom.Struct('test'), mojom.Array(),
-       mojom.STRING.MakeNullableKind()),
-      (1, 2, 4, 5, 7, 3, 6,  8,  9,  10, 11, 13, 12, 14, 15, 16, 17, 18),
-      (0, 1, 2, 4, 6, 8, 16, 24, 28, 32, 40, 44, 48, 56, 64, 72, 80, 88))
-
-
-def TestPaddingPackedOutOfOrderByOrdinal():
-  errors = 0
-  struct = mojom.Struct('test')
-  struct.AddField('testfield1', mojom.INT8)
-  struct.AddField('testfield3', mojom.UINT8, 3)
-  struct.AddField('testfield2', mojom.INT32, 2)
-  ps = pack.PackedStruct(struct)
-  errors += EXPECT_EQ(3, len(ps.packed_fields))
-
-  # Second byte should be packed in behind first, altering order.
-  errors += EXPECT_EQ('testfield1', ps.packed_fields[0].field.name)
-  errors += EXPECT_EQ('testfield3', ps.packed_fields[1].field.name)
-  errors += EXPECT_EQ('testfield2', ps.packed_fields[2].field.name)
-
-  # Second byte should be packed with first.
-  errors += EXPECT_EQ(0, ps.packed_fields[0].offset)
-  errors += EXPECT_EQ(1, ps.packed_fields[1].offset)
-  errors += EXPECT_EQ(4, ps.packed_fields[2].offset)
-
-  return errors
-
-
-def TestBools():
-  errors = 0
-  struct = mojom.Struct('test')
-  struct.AddField('bit0', mojom.BOOL)
-  struct.AddField('bit1', mojom.BOOL)
-  struct.AddField('int', mojom.INT32)
-  struct.AddField('bit2', mojom.BOOL)
-  struct.AddField('bit3', mojom.BOOL)
-  struct.AddField('bit4', mojom.BOOL)
-  struct.AddField('bit5', mojom.BOOL)
-  struct.AddField('bit6', mojom.BOOL)
-  struct.AddField('bit7', mojom.BOOL)
-  struct.AddField('bit8', mojom.BOOL)
-  ps = pack.PackedStruct(struct)
-  errors += EXPECT_EQ(10, len(ps.packed_fields))
-
-  # First 8 bits packed together.
-  for i in xrange(8):
-    pf = ps.packed_fields[i]
-    errors += EXPECT_EQ(0, pf.offset)
-    errors += EXPECT_EQ("bit%d" % i, pf.field.name)
-    errors += EXPECT_EQ(i, pf.bit)
-
-  # Ninth bit goes into second byte.
-  errors += EXPECT_EQ("bit8", ps.packed_fields[8].field.name)
-  errors += EXPECT_EQ(1, ps.packed_fields[8].offset)
-  errors += EXPECT_EQ(0, ps.packed_fields[8].bit)
-
-  # int comes last.
-  errors += EXPECT_EQ("int", ps.packed_fields[9].field.name)
-  errors += EXPECT_EQ(4, ps.packed_fields[9].offset)
-
-  return errors
-
-
-def Main(args):
-  errors = 0
-  errors += RunTest(TestZeroFields)
-  errors += RunTest(TestOneField)
-  errors += RunTest(TestPaddingPackedInOrder)
-  errors += RunTest(TestPaddingPackedOutOfOrder)
-  errors += RunTest(TestPaddingPackedOverflow)
-  errors += RunTest(TestNullableTypes)
-  errors += RunTest(TestAllTypes)
-  errors += RunTest(TestPaddingPackedOutOfOrderByOrdinal)
-  errors += RunTest(TestBools)
-
-  return errors
-
-
-if __name__ == '__main__':
-  sys.exit(Main(sys.argv[1:]))
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/run_tests.py b/mojo/public/tools/bindings/pylib/mojom/generate/run_tests.py
deleted file mode 100755
index 41f11a2..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/run_tests.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-""" Test runner for Mojom """
-
-import subprocess
-import sys
-
-def TestMojom(testname, args):
-  print '\nRunning unit tests for %s.' % testname
-  try:
-    args = [sys.executable, testname] + args
-    subprocess.check_call(args, stdout=sys.stdout)
-    print 'Succeeded'
-    return 0
-  except subprocess.CalledProcessError as err:
-    print 'Failed with %s.' % str(err)
-    return 1
-
-
-def main(args):
-  errors = 0
-  errors += TestMojom('data_tests.py', ['--test'])
-  errors += TestMojom('module_tests.py', ['--test'])
-  errors += TestMojom('pack_tests.py', ['--test'])
-
-  if errors:
-    print '\nFailed tests.'
-  return min(errors, 127)  # Make sure the return value doesn't "wrap".
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/template_expander.py b/mojo/public/tools/bindings/pylib/mojom/generate/template_expander.py
deleted file mode 100644
index 66f8954..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/template_expander.py
+++ /dev/null
@@ -1,67 +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.
-
-# Based on third_party/WebKit/Source/build/scripts/template_expander.py.
-
-import imp
-import os.path
-import sys
-
-# Disable lint check for finding modules:
-# pylint: disable=F0401
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("jinja2")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("mojo"), "third_party"))
-import jinja2
-
-
-def ApplyTemplate(mojo_generator, path_to_template, params, **kwargs):
-  loader = jinja2.ModuleLoader(os.path.join(
-      mojo_generator.bytecode_path, "%s.zip" % mojo_generator.GetTemplatePrefix(
-      )))
-  final_kwargs = dict(mojo_generator.GetJinjaParameters())
-  final_kwargs.update(kwargs)
-  jinja_env = jinja2.Environment(loader=loader,
-                                 keep_trailing_newline=True,
-                                 **final_kwargs)
-  jinja_env.globals.update(mojo_generator.GetGlobals())
-  jinja_env.filters.update(mojo_generator.GetFilters())
-  template = jinja_env.get_template(path_to_template)
-  return template.render(params)
-
-
-def UseJinja(path_to_template, **kwargs):
-  def RealDecorator(generator):
-    def GeneratorInternal(*args, **kwargs2):
-      parameters = generator(*args, **kwargs2)
-      return ApplyTemplate(args[0], path_to_template, parameters, **kwargs)
-    GeneratorInternal.func_name = generator.func_name
-    return GeneratorInternal
-  return RealDecorator
-
-
-def PrecompileTemplates(generator_modules, output_dir):
-  for module in generator_modules.values():
-    generator = module.Generator(None)
-    jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader([os.path.join(
-        os.path.dirname(module.__file__), generator.GetTemplatePrefix())]))
-    jinja_env.filters.update(generator.GetFilters())
-    jinja_env.compile_templates(
-        os.path.join(output_dir, "%s.zip" % generator.GetTemplatePrefix()),
-        extensions=["tmpl"],
-        zip="stored",
-        py_compile=True,
-        ignore_errors=False)
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/test_support.py b/mojo/public/tools/bindings/pylib/mojom/generate/test_support.py
deleted file mode 100644
index eb39461..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/test_support.py
+++ /dev/null
@@ -1,193 +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.
-
-import sys
-import traceback
-
-import module as mojom
-
-# Support for writing mojom test cases.
-# RunTest(fn) will execute fn, catching any exceptions. fn should return
-# the number of errors that are encountered.
-#
-# EXPECT_EQ(a, b) and EXPECT_TRUE(b) will print error information if the
-# expectations are not true and return a non zero value. This allows test cases
-# to be written like this
-#
-# def Foo():
-#   errors = 0
-#   errors += EXPECT_EQ('test', test())
-#   ...
-#   return errors
-#
-# RunTest(foo)
-
-def FieldsAreEqual(field1, field2):
-  if field1 == field2:
-    return True
-  return field1.name == field2.name and \
-      KindsAreEqual(field1.kind, field2.kind) and \
-      field1.ordinal == field2.ordinal and \
-      field1.default == field2.default
-
-
-def KindsAreEqual(kind1, kind2):
-  if kind1 == kind2:
-    return True
-  if kind1.__class__ != kind2.__class__ or kind1.spec != kind2.spec:
-    return False
-  if kind1.__class__ == mojom.Kind:
-    return kind1.spec == kind2.spec
-  if kind1.__class__ == mojom.Struct:
-    if kind1.name != kind2.name or \
-        kind1.spec != kind2.spec or \
-        len(kind1.fields) != len(kind2.fields):
-      return False
-    for i in range(len(kind1.fields)):
-      if not FieldsAreEqual(kind1.fields[i], kind2.fields[i]):
-        return False
-    return True
-  if kind1.__class__ == mojom.Array:
-    return KindsAreEqual(kind1.kind, kind2.kind)
-  print 'Unknown Kind class: ', kind1.__class__.__name__
-  return False
-
-
-def ParametersAreEqual(parameter1, parameter2):
-  if parameter1 == parameter2:
-    return True
-  return parameter1.name == parameter2.name and \
-     parameter1.ordinal == parameter2.ordinal and \
-     parameter1.default == parameter2.default and \
-     KindsAreEqual(parameter1.kind, parameter2.kind)
-
-
-def MethodsAreEqual(method1, method2):
-  if method1 == method2:
-    return True
-  if method1.name != method2.name or \
-      method1.ordinal != method2.ordinal or \
-      len(method1.parameters) != len(method2.parameters):
-    return False
-  for i in range(len(method1.parameters)):
-    if not ParametersAreEqual(method1.parameters[i], method2.parameters[i]):
-      return False
-  return True
-
-
-def InterfacesAreEqual(interface1, interface2):
-  if interface1 == interface2:
-    return True
-  if interface1.name != interface2.name or \
-      len(interface1.methods) != len(interface2.methods):
-    return False
-  for i in range(len(interface1.methods)):
-    if not MethodsAreEqual(interface1.methods[i], interface2.methods[i]):
-      return False
-  return True
-
-
-def ModulesAreEqual(module1, module2):
-  if module1 == module2:
-    return True
-  if module1.name != module2.name or \
-      module1.namespace != module2.namespace or \
-      len(module1.structs) != len(module2.structs) or \
-      len(module1.interfaces) != len(module2.interfaces):
-    return False
-  for i in range(len(module1.structs)):
-    if not KindsAreEqual(module1.structs[i], module2.structs[i]):
-      return False
-  for i in range(len(module1.interfaces)):
-    if not InterfacesAreEqual(module1.interfaces[i], module2.interfaces[i]):
-      return False
-  return True
-
-
-# Builds and returns a Module suitable for testing/
-def BuildTestModule():
-  module = mojom.Module('test', 'testspace')
-  struct = module.AddStruct('teststruct')
-  struct.AddField('testfield1', mojom.INT32)
-  struct.AddField('testfield2', mojom.Array(mojom.INT32), 42)
-
-  interface = module.AddInterface('Server')
-  method = interface.AddMethod('Foo', 42)
-  method.AddParameter('foo', mojom.INT32)
-  method.AddParameter('bar', mojom.Array(struct))
-
-  return module
-
-
-# Tests if |module| is as built by BuildTestModule(). Returns the number of
-# errors
-def TestTestModule(module):
-  errors = 0
-
-  errors += EXPECT_EQ('test', module.name)
-  errors += EXPECT_EQ('testspace', module.namespace)
-  errors += EXPECT_EQ(1, len(module.structs))
-  errors += EXPECT_EQ('teststruct', module.structs[0].name)
-  errors += EXPECT_EQ(2, len(module.structs[0].fields))
-  errors += EXPECT_EQ('testfield1', module.structs[0].fields[0].name)
-  errors += EXPECT_EQ(mojom.INT32, module.structs[0].fields[0].kind)
-  errors += EXPECT_EQ('testfield2', module.structs[0].fields[1].name)
-  errors += EXPECT_EQ(mojom.Array, module.structs[0].fields[1].kind.__class__)
-  errors += EXPECT_EQ(mojom.INT32, module.structs[0].fields[1].kind.kind)
-
-  errors += EXPECT_EQ(1, len(module.interfaces))
-  errors += EXPECT_EQ('Server', module.interfaces[0].name)
-  errors += EXPECT_EQ(1, len(module.interfaces[0].methods))
-  errors += EXPECT_EQ('Foo', module.interfaces[0].methods[0].name)
-  errors += EXPECT_EQ(2, len(module.interfaces[0].methods[0].parameters))
-  errors += EXPECT_EQ('foo', module.interfaces[0].methods[0].parameters[0].name)
-  errors += EXPECT_EQ(mojom.INT32,
-                      module.interfaces[0].methods[0].parameters[0].kind)
-  errors += EXPECT_EQ('bar', module.interfaces[0].methods[0].parameters[1].name)
-  errors += EXPECT_EQ(
-    mojom.Array,
-    module.interfaces[0].methods[0].parameters[1].kind.__class__)
-  errors += EXPECT_EQ(
-    module.structs[0],
-    module.interfaces[0].methods[0].parameters[1].kind.kind)
-  return errors
-
-
-def PrintFailure(string):
-  stack = traceback.extract_stack()
-  frame = stack[len(stack)-3]
-  sys.stderr.write("ERROR at %s:%d, %s\n" % (frame[0], frame[1], string))
-  print "Traceback:"
-  for line in traceback.format_list(stack[:len(stack)-2]):
-    sys.stderr.write(line)
-
-
-def EXPECT_EQ(a, b):
-  if a != b:
-    PrintFailure("%s != %s" % (a, b))
-    return 1
-  return 0
-
-
-def EXPECT_TRUE(a):
-  if not a:
-    PrintFailure('Expecting True')
-    return 1
-  return 0
-
-
-def RunTest(fn):
-  sys.stdout.write('Running %s...' % fn.__name__)
-  try:
-    errors = fn()
-  except:
-    traceback.print_exc(sys.stderr)
-    errors = 1
-  if errors == 0:
-    sys.stdout.write('OK\n')
-  elif errors == 1:
-    sys.stdout.write('1 ERROR\n')
-  else:
-    sys.stdout.write('%d ERRORS\n' % errors)
-  return errors
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/translate.py b/mojo/public/tools/bindings/pylib/mojom/generate/translate.py
deleted file mode 100644
index ffad744..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/translate.py
+++ /dev/null
@@ -1,639 +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.
-
-"""Convert parse tree to AST.
-
-This module converts the parse tree to the AST we use for code generation. The
-main entry point is OrderedModule, which gets passed the parser
-representation of a mojom file. When called it's assumed that all imports have
-already been parsed and converted to ASTs before.
-"""
-
-import copy
-import re
-
-import module as mojom
-from mojom.parse import ast
-
-def _DuplicateName(values):
-  """Returns the 'name' of the first entry in |values| whose 'name' has already
-     been encountered. If there are no duplicates, returns None."""
-  names = set()
-  for value in values:
-    if value.name in names:
-      return value.name
-    names.add(value.name)
-  return None
-
-def _ElemsOfType(elems, elem_type, scope):
-  """Find all elements of the given type.
-
-  Args:
-    elems: {Sequence[Any]} Sequence of elems.
-    elem_type: {Type[C]} Extract all elems of this type.
-    scope: {str} The name of the surrounding scope (e.g. struct
-        definition). Used in error messages.
-
-  Returns:
-    {List[C]} All elems of matching type.
-  """
-  assert isinstance(elem_type, type)
-  result = [elem for elem in elems if isinstance(elem, elem_type)]
-  duplicate_name = _DuplicateName(result)
-  if duplicate_name:
-    raise Exception('Names in mojom must be unique within a scope. The name '
-                    '"%s" is used more than once within the scope "%s".' %
-                    (duplicate_name, scope))
-  return result
-
-def _MapKind(kind):
-  map_to_kind = {'bool': 'b',
-                 'int8': 'i8',
-                 'int16': 'i16',
-                 'int32': 'i32',
-                 'int64': 'i64',
-                 'uint8': 'u8',
-                 'uint16': 'u16',
-                 'uint32': 'u32',
-                 'uint64': 'u64',
-                 'float': 'f',
-                 'double': 'd',
-                 'string': 's',
-                 'handle': 'h',
-                 'handle<data_pipe_consumer>': 'h:d:c',
-                 'handle<data_pipe_producer>': 'h:d:p',
-                 'handle<message_pipe>': 'h:m',
-                 'handle<shared_buffer>': 'h:s'}
-  if kind.endswith('?'):
-    base_kind = _MapKind(kind[0:-1])
-    # NOTE: This doesn't rule out enum types. Those will be detected later, when
-    # cross-reference is established.
-    reference_kinds = ('m', 's', 'h', 'a', 'r', 'x', 'asso')
-    if re.split('[^a-z]', base_kind, 1)[0] not in reference_kinds:
-      raise Exception(
-          'A type (spec "%s") cannot be made nullable' % base_kind)
-    return '?' + base_kind
-  if kind.endswith('}'):
-    lbracket = kind.rfind('{')
-    value = kind[0:lbracket]
-    return 'm[' + _MapKind(kind[lbracket+1:-1]) + '][' + _MapKind(value) + ']'
-  if kind.endswith(']'):
-    lbracket = kind.rfind('[')
-    typename = kind[0:lbracket]
-    return 'a' + kind[lbracket+1:-1] + ':' + _MapKind(typename)
-  if kind.endswith('&'):
-    return 'r:' + _MapKind(kind[0:-1])
-  if kind.startswith('asso<'):
-    assert kind.endswith('>')
-    return 'asso:' + _MapKind(kind[5:-1])
-  if kind in map_to_kind:
-    return map_to_kind[kind]
-  return 'x:' + kind
-
-def _AttributeListToDict(attribute_list):
-  if attribute_list is None:
-    return None
-  assert isinstance(attribute_list, ast.AttributeList)
-  # TODO(vtl): Check for duplicate keys here.
-  return dict([(attribute.key, attribute.value)
-                   for attribute in attribute_list])
-
-builtin_values = frozenset([
-    "double.INFINITY",
-    "double.NEGATIVE_INFINITY",
-    "double.NAN",
-    "float.INFINITY",
-    "float.NEGATIVE_INFINITY",
-    "float.NAN"])
-
-def _IsBuiltinValue(value):
-  return value in builtin_values
-
-def _LookupKind(kinds, spec, scope):
-  """Tries to find which Kind a spec refers to, given the scope in which its
-  referenced. Starts checking from the narrowest scope to most general. For
-  example, given a struct field like
-    Foo.Bar x;
-  Foo.Bar could refer to the type 'Bar' in the 'Foo' namespace, or an inner
-  type 'Bar' in the struct 'Foo' in the current namespace.
-
-  |scope| is a tuple that looks like (namespace, struct/interface), referring
-  to the location where the type is referenced."""
-  if spec.startswith('x:'):
-    name = spec[2:]
-    for i in xrange(len(scope), -1, -1):
-      test_spec = 'x:'
-      if i > 0:
-        test_spec += '.'.join(scope[:i]) + '.'
-      test_spec += name
-      kind = kinds.get(test_spec)
-      if kind:
-        return kind
-
-  return kinds.get(spec)
-
-def _LookupValue(values, name, scope, kind):
-  """Like LookupKind, but for constant values."""
-  # If the type is an enum, the value can be specified as a qualified name, in
-  # which case the form EnumName.ENUM_VALUE must be used. We use the presence
-  # of a '.' in the requested name to identify this. Otherwise, we prepend the
-  # enum name.
-  if isinstance(kind, mojom.Enum) and '.' not in name:
-    name = '%s.%s' % (kind.spec.split(':', 1)[1], name)
-  for i in reversed(xrange(len(scope) + 1)):
-    test_spec = '.'.join(scope[:i])
-    if test_spec:
-      test_spec += '.'
-    test_spec += name
-    value = values.get(test_spec)
-    if value:
-      return value
-
-  return values.get(name)
-
-def _FixupExpression(module, value, scope, kind):
-  """Translates an IDENTIFIER into a built-in value or structured NamedValue
-     object."""
-  if isinstance(value, tuple) and value[0] == 'IDENTIFIER':
-    # Allow user defined values to shadow builtins.
-    result = _LookupValue(module.values, value[1], scope, kind)
-    if result:
-      if isinstance(result, tuple):
-        raise Exception('Unable to resolve expression: %r' % value[1])
-      return result
-    if _IsBuiltinValue(value[1]):
-      return mojom.BuiltinValue(value[1])
-  return value
-
-def _Kind(kinds, spec, scope):
-  """Convert a type name into a mojom.Kind object.
-
-  As a side-effect this function adds the result to 'kinds'.
-
-  Args:
-    kinds: {Dict[str, mojom.Kind]} All known kinds up to this point, indexed by
-        their names.
-    spec: {str} A name uniquely identifying a type.
-    scope: {Tuple[str, str]} A tuple that looks like (namespace,
-        struct/interface), referring to the location where the type is
-        referenced.
-
-  Returns:
-    {mojom.Kind} The type corresponding to 'spec'.
-  """
-  kind = _LookupKind(kinds, spec, scope)
-  if kind:
-    return kind
-
-  if spec.startswith('?'):
-    kind = _Kind(kinds, spec[1:], scope).MakeNullableKind()
-  elif spec.startswith('a:'):
-    kind = mojom.Array(_Kind(kinds, spec[2:], scope))
-  elif spec.startswith('asso:'):
-    inner_kind = _Kind(kinds, spec[5:], scope)
-    if isinstance(inner_kind, mojom.InterfaceRequest):
-      kind = mojom.AssociatedInterfaceRequest(inner_kind)
-    else:
-      kind = mojom.AssociatedInterface(inner_kind)
-  elif spec.startswith('a'):
-    colon = spec.find(':')
-    length = int(spec[1:colon])
-    kind = mojom.Array(_Kind(kinds, spec[colon+1:], scope), length)
-  elif spec.startswith('r:'):
-    kind = mojom.InterfaceRequest(_Kind(kinds, spec[2:], scope))
-  elif spec.startswith('m['):
-    # Isolate the two types from their brackets.
-
-    # It is not allowed to use map as key, so there shouldn't be nested ']'s
-    # inside the key type spec.
-    key_end = spec.find(']')
-    assert key_end != -1 and key_end < len(spec) - 1
-    assert spec[key_end+1] == '[' and spec[-1] == ']'
-
-    first_kind = spec[2:key_end]
-    second_kind = spec[key_end+2:-1]
-
-    kind = mojom.Map(_Kind(kinds, first_kind, scope),
-                     _Kind(kinds, second_kind, scope))
-  else:
-    kind = mojom.Kind(spec)
-
-  kinds[spec] = kind
-  return kind
-
-def _KindFromImport(original_kind, imported_from):
-  """Used with 'import module' - clones the kind imported from the given
-  module's namespace. Only used with Structs, Unions, Interfaces and Enums."""
-  kind = copy.copy(original_kind)
-  # |shared_definition| is used to store various properties (see
-  # |AddSharedProperty()| in module.py), including |imported_from|. We don't
-  # want the copy to share these with the original, so copy it if necessary.
-  if hasattr(original_kind, 'shared_definition'):
-    kind.shared_definition = copy.copy(original_kind.shared_definition)
-  kind.imported_from = imported_from
-  return kind
-
-def _Import(module, import_module):
-  import_item = {}
-  import_item['module_name'] = import_module.name
-  import_item['namespace'] = import_module.namespace
-  import_item['module'] = import_module
-
-  # Copy the struct kinds from our imports into the current module.
-  importable_kinds = (mojom.Struct, mojom.Union, mojom.Enum, mojom.Interface)
-  for kind in import_module.kinds.itervalues():
-    if (isinstance(kind, importable_kinds) and
-        kind.imported_from is None):
-      kind = _KindFromImport(kind, import_item)
-      module.kinds[kind.spec] = kind
-  # Ditto for values.
-  for value in import_module.values.itervalues():
-    if value.imported_from is None:
-      # Values don't have shared definitions (since they're not nullable), so no
-      # need to do anything special.
-      value = copy.copy(value)
-      value.imported_from = import_item
-      module.values[value.GetSpec()] = value
-
-  return import_item
-
-def _Struct(module, parsed_struct):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_struct: {ast.Struct} Parsed struct.
-
-  Returns:
-    {mojom.Struct} AST struct.
-  """
-  struct = mojom.Struct(module=module)
-  struct.name = parsed_struct.name
-  struct.native_only = parsed_struct.body is None
-  struct.spec = 'x:' + module.namespace + '.' + struct.name
-  module.kinds[struct.spec] = struct
-  if struct.native_only:
-    struct.enums = []
-    struct.constants = []
-    struct.fields_data = []
-  else:
-    struct.enums = map(
-        lambda enum: _Enum(module, enum, struct),
-        _ElemsOfType(parsed_struct.body, ast.Enum, parsed_struct.name))
-    struct.constants = map(
-        lambda constant: _Constant(module, constant, struct),
-        _ElemsOfType(parsed_struct.body, ast.Const, parsed_struct.name))
-    # Stash fields parsed_struct here temporarily.
-    struct.fields_data = _ElemsOfType(
-        parsed_struct.body, ast.StructField, parsed_struct.name)
-  struct.attributes = _AttributeListToDict(parsed_struct.attribute_list)
-
-  # Enforce that a [Native] attribute is set to make native-only struct
-  # declarations more explicit.
-  if struct.native_only:
-    if not struct.attributes or not struct.attributes.get('Native', False):
-      raise Exception("Native-only struct declarations must include a " +
-                      "Native attribute.")
-
-  return struct
-
-def _Union(module, parsed_union):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_union: {ast.Union} Parsed union.
-
-  Returns:
-    {mojom.Union} AST union.
-  """
-  union = mojom.Union(module=module)
-  union.name = parsed_union.name
-  union.spec = 'x:' + module.namespace + '.' + union.name
-  module.kinds[union.spec] = union
-  # Stash fields parsed_union here temporarily.
-  union.fields_data = _ElemsOfType(
-      parsed_union.body, ast.UnionField, parsed_union.name)
-  union.attributes = _AttributeListToDict(parsed_union.attribute_list)
-  return union
-
-def _StructField(module, parsed_field, struct):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_field: {ast.StructField} Parsed struct field.
-    struct: {mojom.Struct} Struct this field belongs to.
-
-  Returns:
-    {mojom.StructField} AST struct field.
-  """
-  field = mojom.StructField()
-  field.name = parsed_field.name
-  field.kind = _Kind(
-      module.kinds, _MapKind(parsed_field.typename),
-      (module.namespace, struct.name))
-  field.ordinal = parsed_field.ordinal.value if parsed_field.ordinal else None
-  field.default = _FixupExpression(
-      module, parsed_field.default_value, (module.namespace, struct.name),
-      field.kind)
-  field.attributes = _AttributeListToDict(parsed_field.attribute_list)
-  return field
-
-def _UnionField(module, parsed_field, union):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_field: {ast.UnionField} Parsed union field.
-    union: {mojom.Union} Union this fields belong to.
-
-  Returns:
-    {mojom.UnionField} AST union.
-  """
-  field = mojom.UnionField()
-  field.name = parsed_field.name
-  field.kind = _Kind(
-      module.kinds, _MapKind(parsed_field.typename),
-      (module.namespace, union.name))
-  field.ordinal = parsed_field.ordinal.value if parsed_field.ordinal else None
-  field.default = _FixupExpression(
-      module, None, (module.namespace, union.name), field.kind)
-  field.attributes = _AttributeListToDict(parsed_field.attribute_list)
-  return field
-
-def _Parameter(module, parsed_param, interface):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_param: {ast.Parameter} Parsed parameter.
-    union: {mojom.Interface} Interface this parameter belongs to.
-
-  Returns:
-    {mojom.Parameter} AST parameter.
-  """
-  parameter = mojom.Parameter()
-  parameter.name = parsed_param.name
-  parameter.kind = _Kind(
-      module.kinds, _MapKind(parsed_param.typename),
-      (module.namespace, interface.name))
-  parameter.ordinal = (
-      parsed_param.ordinal.value if parsed_param.ordinal else None)
-  parameter.default = None  # TODO(tibell): We never have these. Remove field?
-  parameter.attributes = _AttributeListToDict(parsed_param.attribute_list)
-  return parameter
-
-def _Method(module, parsed_method, interface):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_method: {ast.Method} Parsed method.
-    interface: {mojom.Interface} Interface this method belongs to.
-
-  Returns:
-    {mojom.Method} AST method.
-  """
-  method = mojom.Method(
-      interface, parsed_method.name,
-      ordinal=parsed_method.ordinal.value if parsed_method.ordinal else None)
-  method.parameters = map(
-      lambda parameter: _Parameter(module, parameter, interface),
-      parsed_method.parameter_list)
-  if parsed_method.response_parameter_list is not None:
-    method.response_parameters = map(
-        lambda parameter: _Parameter(module, parameter, interface),
-                          parsed_method.response_parameter_list)
-  method.attributes = _AttributeListToDict(parsed_method.attribute_list)
-
-  # Enforce that only methods with response can have a [Sync] attribute.
-  if method.sync and method.response_parameters is None:
-    raise Exception("Only methods with response can include a [Sync] "
-                    "attribute. If no response parameters are needed, you "
-                    "could use an empty response parameter list, i.e., "
-                    "\"=> ()\".")
-
-  return method
-
-def _Interface(module, parsed_iface):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_iface: {ast.Interface} Parsed interface.
-
-  Returns:
-    {mojom.Interface} AST interface.
-  """
-  interface = mojom.Interface(module=module)
-  interface.name = parsed_iface.name
-  interface.spec = 'x:' + module.namespace + '.' + interface.name
-  module.kinds[interface.spec] = interface
-  interface.enums = map(
-      lambda enum: _Enum(module, enum, interface),
-      _ElemsOfType(parsed_iface.body, ast.Enum, parsed_iface.name))
-  interface.constants = map(
-      lambda constant: _Constant(module, constant, interface),
-      _ElemsOfType(parsed_iface.body, ast.Const, parsed_iface.name))
-  # Stash methods parsed_iface here temporarily.
-  interface.methods_data = _ElemsOfType(
-      parsed_iface.body, ast.Method, parsed_iface.name)
-  interface.attributes = _AttributeListToDict(parsed_iface.attribute_list)
-  return interface
-
-def _EnumField(module, enum, parsed_field, parent_kind):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    enum: {mojom.Enum} Enum this field belongs to.
-    parsed_field: {ast.EnumValue} Parsed enum value.
-    parent_kind: {mojom.Kind} The enclosing type.
-
-  Returns:
-    {mojom.EnumField} AST enum field.
-  """
-  field = mojom.EnumField()
-  field.name = parsed_field.name
-  # TODO(mpcomplete): FixupExpression should be done in the second pass,
-  # so constants and enums can refer to each other.
-  # TODO(mpcomplete): But then, what if constants are initialized to an enum? Or
-  # vice versa?
-  if parent_kind:
-    field.value = _FixupExpression(
-        module, parsed_field.value, (module.namespace, parent_kind.name), enum)
-  else:
-    field.value = _FixupExpression(
-        module, parsed_field.value, (module.namespace, ), enum)
-  field.attributes = _AttributeListToDict(parsed_field.attribute_list)
-  value = mojom.EnumValue(module, enum, field)
-  module.values[value.GetSpec()] = value
-  return field
-
-def _ResolveNumericEnumValues(enum_fields):
-  """
-  Given a reference to a list of mojom.EnumField, resolves and assigns their
-  values to EnumField.numeric_value.
-  """
-
-  # map of <name> -> integral value
-  resolved_enum_values = {}
-  prev_value = -1
-  for field in enum_fields:
-    # This enum value is +1 the previous enum value (e.g: BEGIN).
-    if field.value is None:
-      prev_value += 1
-
-    # Integral value (e.g: BEGIN = -0x1).
-    elif type(field.value) is str:
-      prev_value = int(field.value, 0)
-
-    # Reference to a previous enum value (e.g: INIT = BEGIN).
-    elif type(field.value) is mojom.EnumValue:
-      prev_value = resolved_enum_values[field.value.name]
-    else:
-      raise Exception("Unresolved enum value.")
-
-    resolved_enum_values[field.name] = prev_value
-    field.numeric_value = prev_value
-
-def _Enum(module, parsed_enum, parent_kind):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_enum: {ast.Enum} Parsed enum.
-
-  Returns:
-    {mojom.Enum} AST enum.
-  """
-  enum = mojom.Enum(module=module)
-  enum.name = parsed_enum.name
-  enum.native_only = parsed_enum.enum_value_list is None
-  name = enum.name
-  if parent_kind:
-    name = parent_kind.name + '.' + name
-  enum.spec = 'x:%s.%s' % (module.namespace, name)
-  enum.parent_kind = parent_kind
-  enum.attributes = _AttributeListToDict(parsed_enum.attribute_list)
-  if enum.native_only:
-    enum.fields = []
-  else:
-    enum.fields = map(
-        lambda field: _EnumField(module, enum, field, parent_kind),
-        parsed_enum.enum_value_list)
-    _ResolveNumericEnumValues(enum.fields)
-
-  module.kinds[enum.spec] = enum
-
-  # Enforce that a [Native] attribute is set to make native-only enum
-  # declarations more explicit.
-  if enum.native_only:
-    if not enum.attributes or not enum.attributes.get('Native', False):
-      raise Exception("Native-only enum declarations must include a " +
-                      "Native attribute.")
-
-  return enum
-
-def _Constant(module, parsed_const, parent_kind):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_const: {ast.Const} Parsed constant.
-
-  Returns:
-    {mojom.Constant} AST constant.
-  """
-  constant = mojom.Constant()
-  constant.name = parsed_const.name
-  if parent_kind:
-    scope = (module.namespace, parent_kind.name)
-  else:
-    scope = (module.namespace, )
-  # TODO(mpcomplete): maybe we should only support POD kinds.
-  constant.kind = _Kind(module.kinds, _MapKind(parsed_const.typename), scope)
-  constant.parent_kind = parent_kind
-  constant.value = _FixupExpression(module, parsed_const.value, scope, None)
-
-  value = mojom.ConstantValue(module, parent_kind, constant)
-  module.values[value.GetSpec()] = value
-  return constant
-
-def _Module(tree, name, imports):
-  """
-  Args:
-    tree: {ast.Mojom} The parse tree.
-    name: {str} The mojom filename, excluding the path.
-    imports: {Dict[str, mojom.Module]} Mapping from filenames, as they appear in
-        the import list, to already processed modules. Used to process imports.
-
-  Returns:
-    {mojom.Module} An AST for the mojom.
-  """
-  module = mojom.Module()
-  module.kinds = {}
-  for kind in mojom.PRIMITIVES:
-    module.kinds[kind.spec] = kind
-
-  module.values = {}
-
-  module.name = name
-  module.namespace = tree.module.name[1] if tree.module else ''
-  # Imports must come first, because they add to module.kinds which is used
-  # by by the others.
-  module.imports = [
-      _Import(module, imports[imp.import_filename])
-      for imp in tree.import_list]
-  if tree.module and tree.module.attribute_list:
-    assert isinstance(tree.module.attribute_list, ast.AttributeList)
-    # TODO(vtl): Check for duplicate keys here.
-    module.attributes = dict((attribute.key, attribute.value)
-                             for attribute in tree.module.attribute_list)
-
-  # First pass collects kinds.
-  module.enums = map(
-      lambda enum: _Enum(module, enum, None),
-      _ElemsOfType(tree.definition_list, ast.Enum, name))
-  module.structs = map(
-      lambda struct: _Struct(module, struct),
-      _ElemsOfType(tree.definition_list, ast.Struct, name))
-  module.unions = map(
-      lambda union: _Union(module, union),
-      _ElemsOfType(tree.definition_list, ast.Union, name))
-  module.interfaces = map(
-      lambda interface: _Interface(module, interface),
-      _ElemsOfType(tree.definition_list, ast.Interface, name))
-  module.constants = map(
-      lambda constant: _Constant(module, constant, None),
-      _ElemsOfType(tree.definition_list, ast.Const, name))
-
-  # Second pass expands fields and methods. This allows fields and parameters
-  # to refer to kinds defined anywhere in the mojom.
-  for struct in module.structs:
-    struct.fields = map(lambda field:
-        _StructField(module, field, struct), struct.fields_data)
-    del struct.fields_data
-  for union in module.unions:
-    union.fields = map(lambda field:
-        _UnionField(module, field, union), union.fields_data)
-    del union.fields_data
-  for interface in module.interfaces:
-    interface.methods = map(lambda method:
-        _Method(module, method, interface), interface.methods_data)
-    del interface.methods_data
-
-  return module
-
-def OrderedModule(tree, name, imports):
-  """Convert parse tree to AST module.
-
-  Args:
-    tree: {ast.Mojom} The parse tree.
-    name: {str} The mojom filename, excluding the path.
-    imports: {Dict[str, mojom.Module]} Mapping from filenames, as they appear in
-        the import list, to already processed modules. Used to process imports.
-
-  Returns:
-    {mojom.Module} An AST for the mojom.
-  """
-  module = _Module(tree, name, imports)
-  for interface in module.interfaces:
-    next_ordinal = 0
-    for method in interface.methods:
-      if method.ordinal is None:
-        method.ordinal = next_ordinal
-      next_ordinal = method.ordinal + 1
-  return module
diff --git a/mojo/public/tools/bindings/pylib/mojom/parse/__init__.py b/mojo/public/tools/bindings/pylib/mojom/parse/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/parse/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom/parse/ast.py b/mojo/public/tools/bindings/pylib/mojom/parse/ast.py
deleted file mode 100644
index 2c6b5fc..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/parse/ast.py
+++ /dev/null
@@ -1,410 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Node classes for the AST for a Mojo IDL file."""
-
-# Note: For convenience of testing, you probably want to define __eq__() methods
-# for all node types; it's okay to be slightly lax (e.g., not compare filename
-# and lineno). You may also define __repr__() to help with analyzing test
-# failures, especially for more complex types.
-
-
-class NodeBase(object):
-  """Base class for nodes in the AST."""
-
-  def __init__(self, filename=None, lineno=None):
-    self.filename = filename
-    self.lineno = lineno
-
-  def __eq__(self, other):
-    return type(self) == type(other)
-
-  # Make != the inverse of ==. (Subclasses shouldn't have to override this.)
-  def __ne__(self, other):
-    return not self == other
-
-
-# TODO(vtl): Some of this is complicated enough that it should be tested.
-class NodeListBase(NodeBase):
-  """Represents a list of other nodes, all having the same type. (This is meant
-  to be subclassed, with subclasses defining _list_item_type to be the class (or
-  classes, in a tuple) of the members of the list.)"""
-
-  def __init__(self, item_or_items=None, **kwargs):
-    super(NodeListBase, self).__init__(**kwargs)
-    self.items = []
-    if item_or_items is None:
-      pass
-    elif isinstance(item_or_items, list):
-      for item in item_or_items:
-        assert isinstance(item, self._list_item_type)
-        self.Append(item)
-    else:
-      assert isinstance(item_or_items, self._list_item_type)
-      self.Append(item_or_items)
-
-  # Support iteration. For everything else, users should just access |items|
-  # directly. (We intentionally do NOT supply |__len__()| or |__nonzero__()|, so
-  # |bool(NodeListBase())| is true.)
-  def __iter__(self):
-    return self.items.__iter__()
-
-  def __eq__(self, other):
-    return super(NodeListBase, self).__eq__(other) and \
-           self.items == other.items
-
-  # Implement this so that on failure, we get slightly more sensible output.
-  def __repr__(self):
-    return self.__class__.__name__ + "([" + \
-           ", ".join([repr(elem) for elem in self.items]) + "])"
-
-  def Insert(self, item):
-    """Inserts item at the front of the list."""
-
-    assert isinstance(item, self._list_item_type)
-    self.items.insert(0, item)
-    self._UpdateFilenameAndLineno()
-
-  def Append(self, item):
-    """Appends item to the end of the list."""
-
-    assert isinstance(item, self._list_item_type)
-    self.items.append(item)
-    self._UpdateFilenameAndLineno()
-
-  def _UpdateFilenameAndLineno(self):
-    if self.items:
-      self.filename = self.items[0].filename
-      self.lineno = self.items[0].lineno
-
-
-class Definition(NodeBase):
-  """Represents a definition of anything that has a global name (e.g., enums,
-  enum values, consts, structs, struct fields, interfaces). (This does not
-  include parameter definitions.) This class is meant to be subclassed."""
-
-  def __init__(self, name, **kwargs):
-    assert isinstance(name, str)
-    NodeBase.__init__(self, **kwargs)
-    self.name = name
-
-
-################################################################################
-
-
-class Attribute(NodeBase):
-  """Represents an attribute."""
-
-  def __init__(self, key, value, **kwargs):
-    assert isinstance(key, str)
-    super(Attribute, self).__init__(**kwargs)
-    self.key = key
-    self.value = value
-
-  def __eq__(self, other):
-    return super(Attribute, self).__eq__(other) and \
-           self.key == other.key and \
-           self.value == other.value
-
-
-class AttributeList(NodeListBase):
-  """Represents a list attributes."""
-
-  _list_item_type = Attribute
-
-
-class Const(Definition):
-  """Represents a const definition."""
-
-  def __init__(self, name, typename, value, **kwargs):
-    # The typename is currently passed through as a string.
-    assert isinstance(typename, str)
-    # The value is either a literal (currently passed through as a string) or a
-    # "wrapped identifier".
-    assert isinstance(value, str) or isinstance(value, tuple)
-    super(Const, self).__init__(name, **kwargs)
-    self.typename = typename
-    self.value = value
-
-  def __eq__(self, other):
-    return super(Const, self).__eq__(other) and \
-           self.typename == other.typename and \
-           self.value == other.value
-
-
-class Enum(Definition):
-  """Represents an enum definition."""
-
-  def __init__(self, name, attribute_list, enum_value_list, **kwargs):
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert enum_value_list is None or isinstance(enum_value_list, EnumValueList)
-    super(Enum, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.enum_value_list = enum_value_list
-
-  def __eq__(self, other):
-    return super(Enum, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.enum_value_list == other.enum_value_list
-
-
-class EnumValue(Definition):
-  """Represents a definition of an enum value."""
-
-  def __init__(self, name, attribute_list, value, **kwargs):
-    # The optional value is either an int (which is current a string) or a
-    # "wrapped identifier".
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert value is None or isinstance(value, (str, tuple))
-    super(EnumValue, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.value = value
-
-  def __eq__(self, other):
-    return super(EnumValue, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.value == other.value
-
-
-class EnumValueList(NodeListBase):
-  """Represents a list of enum value definitions (i.e., the "body" of an enum
-  definition)."""
-
-  _list_item_type = EnumValue
-
-
-class Import(NodeBase):
-  """Represents an import statement."""
-
-  def __init__(self, import_filename, **kwargs):
-    assert isinstance(import_filename, str)
-    super(Import, self).__init__(**kwargs)
-    self.import_filename = import_filename
-
-  def __eq__(self, other):
-    return super(Import, self).__eq__(other) and \
-           self.import_filename == other.import_filename
-
-
-class ImportList(NodeListBase):
-  """Represents a list (i.e., sequence) of import statements."""
-
-  _list_item_type = Import
-
-
-class Interface(Definition):
-  """Represents an interface definition."""
-
-  def __init__(self, name, attribute_list, body, **kwargs):
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert isinstance(body, InterfaceBody)
-    super(Interface, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.body = body
-
-  def __eq__(self, other):
-    return super(Interface, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.body == other.body
-
-
-class Method(Definition):
-  """Represents a method definition."""
-
-  def __init__(self, name, attribute_list, ordinal, parameter_list,
-               response_parameter_list, **kwargs):
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert ordinal is None or isinstance(ordinal, Ordinal)
-    assert isinstance(parameter_list, ParameterList)
-    assert response_parameter_list is None or \
-           isinstance(response_parameter_list, ParameterList)
-    super(Method, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.ordinal = ordinal
-    self.parameter_list = parameter_list
-    self.response_parameter_list = response_parameter_list
-
-  def __eq__(self, other):
-    return super(Method, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.ordinal == other.ordinal and \
-           self.parameter_list == other.parameter_list and \
-           self.response_parameter_list == other.response_parameter_list
-
-
-# This needs to be declared after |Method|.
-class InterfaceBody(NodeListBase):
-  """Represents the body of (i.e., list of definitions inside) an interface."""
-
-  _list_item_type = (Const, Enum, Method)
-
-
-class Module(NodeBase):
-  """Represents a module statement."""
-
-  def __init__(self, name, attribute_list, **kwargs):
-    # |name| is either none or a "wrapped identifier".
-    assert name is None or isinstance(name, tuple)
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    super(Module, self).__init__(**kwargs)
-    self.name = name
-    self.attribute_list = attribute_list
-
-  def __eq__(self, other):
-    return super(Module, self).__eq__(other) and \
-           self.name == other.name and \
-           self.attribute_list == other.attribute_list
-
-
-class Mojom(NodeBase):
-  """Represents an entire .mojom file. (This is the root node.)"""
-
-  def __init__(self, module, import_list, definition_list, **kwargs):
-    assert module is None or isinstance(module, Module)
-    assert isinstance(import_list, ImportList)
-    assert isinstance(definition_list, list)
-    super(Mojom, self).__init__(**kwargs)
-    self.module = module
-    self.import_list = import_list
-    self.definition_list = definition_list
-
-  def __eq__(self, other):
-    return super(Mojom, self).__eq__(other) and \
-           self.module == other.module and \
-           self.import_list == other.import_list and \
-           self.definition_list == other.definition_list
-
-  def __repr__(self):
-    return "%s(%r, %r, %r)" % (self.__class__.__name__, self.module,
-                               self.import_list, self.definition_list)
-
-
-class Ordinal(NodeBase):
-  """Represents an ordinal value labeling, e.g., a struct field."""
-
-  def __init__(self, value, **kwargs):
-    assert isinstance(value, int)
-    super(Ordinal, self).__init__(**kwargs)
-    self.value = value
-
-  def __eq__(self, other):
-    return super(Ordinal, self).__eq__(other) and \
-           self.value == other.value
-
-
-class Parameter(NodeBase):
-  """Represents a method request or response parameter."""
-
-  def __init__(self, name, attribute_list, ordinal, typename, **kwargs):
-    assert isinstance(name, str)
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert ordinal is None or isinstance(ordinal, Ordinal)
-    assert isinstance(typename, str)
-    super(Parameter, self).__init__(**kwargs)
-    self.name = name
-    self.attribute_list = attribute_list
-    self.ordinal = ordinal
-    self.typename = typename
-
-  def __eq__(self, other):
-    return super(Parameter, self).__eq__(other) and \
-           self.name == other.name and \
-           self.attribute_list == other.attribute_list and \
-           self.ordinal == other.ordinal and \
-           self.typename == other.typename
-
-
-class ParameterList(NodeListBase):
-  """Represents a list of (method request or response) parameters."""
-
-  _list_item_type = Parameter
-
-
-class Struct(Definition):
-  """Represents a struct definition."""
-
-  def __init__(self, name, attribute_list, body, **kwargs):
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert isinstance(body, StructBody) or body is None
-    super(Struct, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.body = body
-
-  def __eq__(self, other):
-    return super(Struct, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.body == other.body
-
-
-class StructField(Definition):
-  """Represents a struct field definition."""
-
-  def __init__(self, name, attribute_list, ordinal, typename, default_value,
-               **kwargs):
-    assert isinstance(name, str)
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert ordinal is None or isinstance(ordinal, Ordinal)
-    assert isinstance(typename, str)
-    # The optional default value is currently either a value as a string or a
-    # "wrapped identifier".
-    assert default_value is None or isinstance(default_value, (str, tuple))
-    super(StructField, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.ordinal = ordinal
-    self.typename = typename
-    self.default_value = default_value
-
-  def __eq__(self, other):
-    return super(StructField, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.ordinal == other.ordinal and \
-           self.typename == other.typename and \
-           self.default_value == other.default_value
-
-
-# This needs to be declared after |StructField|.
-class StructBody(NodeListBase):
-  """Represents the body of (i.e., list of definitions inside) a struct."""
-
-  _list_item_type = (Const, Enum, StructField)
-
-
-class Union(Definition):
-  """Represents a union definition."""
-
-  def __init__(self, name, attribute_list, body, **kwargs):
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert isinstance(body, UnionBody)
-    super(Union, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.body = body
-
-  def __eq__(self, other):
-    return super(Union, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.body == other.body
-
-
-class UnionField(Definition):
-
-  def __init__(self, name, attribute_list, ordinal, typename, **kwargs):
-    assert isinstance(name, str)
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert ordinal is None or isinstance(ordinal, Ordinal)
-    assert isinstance(typename, str)
-    super(UnionField, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.ordinal = ordinal
-    self.typename = typename
-
-  def __eq__(self, other):
-    return super(UnionField, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.ordinal == other.ordinal and \
-           self.typename == other.typename
-
-
-class UnionBody(NodeListBase):
-
-  _list_item_type = UnionField
diff --git a/mojo/public/tools/bindings/pylib/mojom/parse/lexer.py b/mojo/public/tools/bindings/pylib/mojom/parse/lexer.py
deleted file mode 100644
index 06354b1..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/parse/lexer.py
+++ /dev/null
@@ -1,254 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import imp
-import os.path
-import sys
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("ply")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("mojo"), "third_party"))
-from ply.lex import TOKEN
-
-from ..error import Error
-
-
-class LexError(Error):
-  """Class for errors from the lexer."""
-
-  def __init__(self, filename, message, lineno):
-    Error.__init__(self, filename, message, lineno=lineno)
-
-
-# We have methods which look like they could be functions:
-# pylint: disable=R0201
-class Lexer(object):
-
-  def __init__(self, filename):
-    self.filename = filename
-
-  ######################--   PRIVATE   --######################
-
-  ##
-  ## Internal auxiliary methods
-  ##
-  def _error(self, msg, token):
-    raise LexError(self.filename, msg, token.lineno)
-
-  ##
-  ## Reserved keywords
-  ##
-  keywords = (
-    'HANDLE',
-
-    'IMPORT',
-    'MODULE',
-    'STRUCT',
-    'UNION',
-    'INTERFACE',
-    'ENUM',
-    'CONST',
-    'TRUE',
-    'FALSE',
-    'DEFAULT',
-    'ARRAY',
-    'MAP',
-    'ASSOCIATED'
-  )
-
-  keyword_map = {}
-  for keyword in keywords:
-    keyword_map[keyword.lower()] = keyword
-
-  ##
-  ## All the tokens recognized by the lexer
-  ##
-  tokens = keywords + (
-    # Identifiers
-    'NAME',
-
-    # Constants
-    'ORDINAL',
-    'INT_CONST_DEC', 'INT_CONST_HEX',
-    'FLOAT_CONST',
-
-    # String literals
-    'STRING_LITERAL',
-
-    # Operators
-    'MINUS',
-    'PLUS',
-    'AMP',
-    'QSTN',
-
-    # Assignment
-    'EQUALS',
-
-    # Request / response
-    'RESPONSE',
-
-    # Delimiters
-    'LPAREN', 'RPAREN',         # ( )
-    'LBRACKET', 'RBRACKET',     # [ ]
-    'LBRACE', 'RBRACE',         # { }
-    'LANGLE', 'RANGLE',         # < >
-    'SEMI',                     # ;
-    'COMMA', 'DOT'              # , .
-  )
-
-  ##
-  ## Regexes for use in tokens
-  ##
-
-  # valid C identifiers (K&R2: A.2.3)
-  identifier = r'[a-zA-Z_][0-9a-zA-Z_]*'
-
-  hex_prefix = '0[xX]'
-  hex_digits = '[0-9a-fA-F]+'
-
-  # integer constants (K&R2: A.2.5.1)
-  decimal_constant = '0|([1-9][0-9]*)'
-  hex_constant = hex_prefix+hex_digits
-  # Don't allow octal constants (even invalid octal).
-  octal_constant_disallowed = '0[0-9]+'
-
-  # character constants (K&R2: A.2.5.2)
-  # Note: a-zA-Z and '.-~^_!=&;,' are allowed as escape chars to support #line
-  # directives with Windows paths as filenames (..\..\dir\file)
-  # For the same reason, decimal_escape allows all digit sequences. We want to
-  # parse all correct code, even if it means to sometimes parse incorrect
-  # code.
-  #
-  simple_escape = r"""([a-zA-Z._~!=&\^\-\\?'"])"""
-  decimal_escape = r"""(\d+)"""
-  hex_escape = r"""(x[0-9a-fA-F]+)"""
-  bad_escape = r"""([\\][^a-zA-Z._~^!=&\^\-\\?'"x0-7])"""
-
-  escape_sequence = \
-      r"""(\\("""+simple_escape+'|'+decimal_escape+'|'+hex_escape+'))'
-
-  # string literals (K&R2: A.2.6)
-  string_char = r"""([^"\\\n]|"""+escape_sequence+')'
-  string_literal = '"'+string_char+'*"'
-  bad_string_literal = '"'+string_char+'*'+bad_escape+string_char+'*"'
-
-  # floating constants (K&R2: A.2.5.3)
-  exponent_part = r"""([eE][-+]?[0-9]+)"""
-  fractional_constant = r"""([0-9]*\.[0-9]+)|([0-9]+\.)"""
-  floating_constant = \
-      '(((('+fractional_constant+')'+ \
-      exponent_part+'?)|([0-9]+'+exponent_part+')))'
-
-  # Ordinals
-  ordinal = r'@[0-9]+'
-  missing_ordinal_value = r'@'
-  # Don't allow ordinal values in octal (even invalid octal, like 09) or
-  # hexadecimal.
-  octal_or_hex_ordinal_disallowed = r'@((0[0-9]+)|('+hex_prefix+hex_digits+'))'
-
-  ##
-  ## Rules for the normal state
-  ##
-  t_ignore = ' \t\r'
-
-  # Newlines
-  def t_NEWLINE(self, t):
-    r'\n+'
-    t.lexer.lineno += len(t.value)
-
-  # Operators
-  t_MINUS             = r'-'
-  t_PLUS              = r'\+'
-  t_AMP               = r'&'
-  t_QSTN              = r'\?'
-
-  # =
-  t_EQUALS            = r'='
-
-  # =>
-  t_RESPONSE          = r'=>'
-
-  # Delimiters
-  t_LPAREN            = r'\('
-  t_RPAREN            = r'\)'
-  t_LBRACKET          = r'\['
-  t_RBRACKET          = r'\]'
-  t_LBRACE            = r'\{'
-  t_RBRACE            = r'\}'
-  t_LANGLE            = r'<'
-  t_RANGLE            = r'>'
-  t_COMMA             = r','
-  t_DOT               = r'\.'
-  t_SEMI              = r';'
-
-  t_STRING_LITERAL    = string_literal
-
-  # The following floating and integer constants are defined as
-  # functions to impose a strict order (otherwise, decimal
-  # is placed before the others because its regex is longer,
-  # and this is bad)
-  #
-  @TOKEN(floating_constant)
-  def t_FLOAT_CONST(self, t):
-    return t
-
-  @TOKEN(hex_constant)
-  def t_INT_CONST_HEX(self, t):
-    return t
-
-  @TOKEN(octal_constant_disallowed)
-  def t_OCTAL_CONSTANT_DISALLOWED(self, t):
-    msg = "Octal values not allowed"
-    self._error(msg, t)
-
-  @TOKEN(decimal_constant)
-  def t_INT_CONST_DEC(self, t):
-    return t
-
-  # unmatched string literals are caught by the preprocessor
-
-  @TOKEN(bad_string_literal)
-  def t_BAD_STRING_LITERAL(self, t):
-    msg = "String contains invalid escape code"
-    self._error(msg, t)
-
-  # Handle ordinal-related tokens in the right order:
-  @TOKEN(octal_or_hex_ordinal_disallowed)
-  def t_OCTAL_OR_HEX_ORDINAL_DISALLOWED(self, t):
-    msg = "Octal and hexadecimal ordinal values not allowed"
-    self._error(msg, t)
-
-  @TOKEN(ordinal)
-  def t_ORDINAL(self, t):
-    return t
-
-  @TOKEN(missing_ordinal_value)
-  def t_BAD_ORDINAL(self, t):
-    msg = "Missing ordinal value"
-    self._error(msg, t)
-
-  @TOKEN(identifier)
-  def t_NAME(self, t):
-    t.type = self.keyword_map.get(t.value, "NAME")
-    return t
-
-  # Ignore C and C++ style comments
-  def t_COMMENT(self, t):
-    r'(/\*(.|\n)*?\*/)|(//.*(\n[ \t]*//.*)*)'
-    t.lexer.lineno += t.value.count("\n")
-
-  def t_error(self, t):
-    msg = "Illegal character %s" % repr(t.value[0])
-    self._error(msg, t)
diff --git a/mojo/public/tools/bindings/pylib/mojom/parse/parser.py b/mojo/public/tools/bindings/pylib/mojom/parse/parser.py
deleted file mode 100644
index 868fb45..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/parse/parser.py
+++ /dev/null
@@ -1,461 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Generates a syntax tree from a Mojo IDL file."""
-
-import imp
-import os.path
-import sys
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("ply")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("mojo"), "third_party"))
-from ply import lex
-from ply import yacc
-
-from ..error import Error
-from . import ast
-from .lexer import Lexer
-
-
-_MAX_ORDINAL_VALUE = 0xffffffff
-_MAX_ARRAY_SIZE = 0xffffffff
-
-
-class ParseError(Error):
-  """Class for errors from the parser."""
-
-  def __init__(self, filename, message, lineno=None, snippet=None):
-    Error.__init__(self, filename, message, lineno=lineno,
-                   addenda=([snippet] if snippet else None))
-
-
-# We have methods which look like they could be functions:
-# pylint: disable=R0201
-class Parser(object):
-
-  def __init__(self, lexer, source, filename):
-    self.tokens = lexer.tokens
-    self.source = source
-    self.filename = filename
-
-  # Names of functions
-  #
-  # In general, we name functions after the left-hand-side of the rule(s) that
-  # they handle. E.g., |p_foo_bar| for a rule |foo_bar : ...|.
-  #
-  # There may be multiple functions handling rules for the same left-hand-side;
-  # then we name the functions |p_foo_bar_N| (for left-hand-side |foo_bar|),
-  # where N is a number (numbered starting from 1). Note that using multiple
-  # functions is actually more efficient than having single functions handle
-  # multiple rules (and, e.g., distinguishing them by examining |len(p)|).
-  #
-  # It's also possible to have a function handling multiple rules with different
-  # left-hand-sides. We do not do this.
-  #
-  # See http://www.dabeaz.com/ply/ply.html#ply_nn25 for more details.
-
-  # TODO(vtl): Get rid of the braces in the module "statement". (Consider
-  # renaming "module" -> "package".) Then we'll be able to have a single rule
-  # for root (by making module "optional").
-  def p_root_1(self, p):
-    """root : """
-    p[0] = ast.Mojom(None, ast.ImportList(), [])
-
-  def p_root_2(self, p):
-    """root : root module"""
-    if p[1].module is not None:
-      raise ParseError(self.filename,
-                       "Multiple \"module\" statements not allowed:",
-                       p[2].lineno, snippet=self._GetSnippet(p[2].lineno))
-    if p[1].import_list.items or p[1].definition_list:
-      raise ParseError(
-          self.filename,
-          "\"module\" statements must precede imports and definitions:",
-          p[2].lineno, snippet=self._GetSnippet(p[2].lineno))
-    p[0] = p[1]
-    p[0].module = p[2]
-
-  def p_root_3(self, p):
-    """root : root import"""
-    if p[1].definition_list:
-      raise ParseError(self.filename,
-                       "\"import\" statements must precede definitions:",
-                       p[2].lineno, snippet=self._GetSnippet(p[2].lineno))
-    p[0] = p[1]
-    p[0].import_list.Append(p[2])
-
-  def p_root_4(self, p):
-    """root : root definition"""
-    p[0] = p[1]
-    p[0].definition_list.append(p[2])
-
-  def p_import(self, p):
-    """import : IMPORT STRING_LITERAL SEMI"""
-    # 'eval' the literal to strip the quotes.
-    # TODO(vtl): This eval is dubious. We should unquote/unescape ourselves.
-    p[0] = ast.Import(eval(p[2]), filename=self.filename, lineno=p.lineno(2))
-
-  def p_module(self, p):
-    """module : attribute_section MODULE identifier_wrapped SEMI"""
-    p[0] = ast.Module(p[3], p[1], filename=self.filename, lineno=p.lineno(2))
-
-  def p_definition(self, p):
-    """definition : struct
-                  | union
-                  | interface
-                  | enum
-                  | const"""
-    p[0] = p[1]
-
-  def p_attribute_section_1(self, p):
-    """attribute_section : """
-    p[0] = None
-
-  def p_attribute_section_2(self, p):
-    """attribute_section : LBRACKET attribute_list RBRACKET"""
-    p[0] = p[2]
-
-  def p_attribute_list_1(self, p):
-    """attribute_list : """
-    p[0] = ast.AttributeList()
-
-  def p_attribute_list_2(self, p):
-    """attribute_list : nonempty_attribute_list"""
-    p[0] = p[1]
-
-  def p_nonempty_attribute_list_1(self, p):
-    """nonempty_attribute_list : attribute"""
-    p[0] = ast.AttributeList(p[1])
-
-  def p_nonempty_attribute_list_2(self, p):
-    """nonempty_attribute_list : nonempty_attribute_list COMMA attribute"""
-    p[0] = p[1]
-    p[0].Append(p[3])
-
-  def p_attribute_1(self, p):
-    """attribute : NAME EQUALS evaled_literal
-                 | NAME EQUALS NAME"""
-    p[0] = ast.Attribute(p[1], p[3], filename=self.filename, lineno=p.lineno(1))
-
-  def p_attribute_2(self, p):
-    """attribute : NAME"""
-    p[0] = ast.Attribute(p[1], True, filename=self.filename, lineno=p.lineno(1))
-
-  def p_evaled_literal(self, p):
-    """evaled_literal : literal"""
-    # 'eval' the literal to strip the quotes. Handle keywords "true" and "false"
-    # specially since they cannot directly be evaluated to python boolean
-    # values.
-    if p[1] == "true":
-      p[0] = True
-    elif p[1] == "false":
-      p[0] = False
-    else:
-      p[0] = eval(p[1])
-
-  def p_struct_1(self, p):
-    """struct : attribute_section STRUCT NAME LBRACE struct_body RBRACE SEMI"""
-    p[0] = ast.Struct(p[3], p[1], p[5])
-
-  def p_struct_2(self, p):
-    """struct : attribute_section STRUCT NAME SEMI"""
-    p[0] = ast.Struct(p[3], p[1], None)
-
-  def p_struct_body_1(self, p):
-    """struct_body : """
-    p[0] = ast.StructBody()
-
-  def p_struct_body_2(self, p):
-    """struct_body : struct_body const
-                   | struct_body enum
-                   | struct_body struct_field"""
-    p[0] = p[1]
-    p[0].Append(p[2])
-
-  def p_struct_field(self, p):
-    """struct_field : attribute_section typename NAME ordinal default SEMI"""
-    p[0] = ast.StructField(p[3], p[1], p[4], p[2], p[5])
-
-  def p_union(self, p):
-    """union : attribute_section UNION NAME LBRACE union_body RBRACE SEMI"""
-    p[0] = ast.Union(p[3], p[1], p[5])
-
-  def p_union_body_1(self, p):
-    """union_body : """
-    p[0] = ast.UnionBody()
-
-  def p_union_body_2(self, p):
-    """union_body : union_body union_field"""
-    p[0] = p[1]
-    p[1].Append(p[2])
-
-  def p_union_field(self, p):
-    """union_field : attribute_section typename NAME ordinal SEMI"""
-    p[0] = ast.UnionField(p[3], p[1], p[4], p[2])
-
-  def p_default_1(self, p):
-    """default : """
-    p[0] = None
-
-  def p_default_2(self, p):
-    """default : EQUALS constant"""
-    p[0] = p[2]
-
-  def p_interface(self, p):
-    """interface : attribute_section INTERFACE NAME LBRACE interface_body \
-                       RBRACE SEMI"""
-    p[0] = ast.Interface(p[3], p[1], p[5])
-
-  def p_interface_body_1(self, p):
-    """interface_body : """
-    p[0] = ast.InterfaceBody()
-
-  def p_interface_body_2(self, p):
-    """interface_body : interface_body const
-                      | interface_body enum
-                      | interface_body method"""
-    p[0] = p[1]
-    p[0].Append(p[2])
-
-  def p_response_1(self, p):
-    """response : """
-    p[0] = None
-
-  def p_response_2(self, p):
-    """response : RESPONSE LPAREN parameter_list RPAREN"""
-    p[0] = p[3]
-
-  def p_method(self, p):
-    """method : attribute_section NAME ordinal LPAREN parameter_list RPAREN \
-                    response SEMI"""
-    p[0] = ast.Method(p[2], p[1], p[3], p[5], p[7])
-
-  def p_parameter_list_1(self, p):
-    """parameter_list : """
-    p[0] = ast.ParameterList()
-
-  def p_parameter_list_2(self, p):
-    """parameter_list : nonempty_parameter_list"""
-    p[0] = p[1]
-
-  def p_nonempty_parameter_list_1(self, p):
-    """nonempty_parameter_list : parameter"""
-    p[0] = ast.ParameterList(p[1])
-
-  def p_nonempty_parameter_list_2(self, p):
-    """nonempty_parameter_list : nonempty_parameter_list COMMA parameter"""
-    p[0] = p[1]
-    p[0].Append(p[3])
-
-  def p_parameter(self, p):
-    """parameter : attribute_section typename NAME ordinal"""
-    p[0] = ast.Parameter(p[3], p[1], p[4], p[2],
-                         filename=self.filename, lineno=p.lineno(3))
-
-  def p_typename(self, p):
-    """typename : nonnullable_typename QSTN
-                | nonnullable_typename"""
-    if len(p) == 2:
-      p[0] = p[1]
-    else:
-      p[0] = p[1] + "?"
-
-  def p_nonnullable_typename(self, p):
-    """nonnullable_typename : basictypename
-                            | array
-                            | fixed_array
-                            | associative_array
-                            | interfacerequest"""
-    p[0] = p[1]
-
-  def p_basictypename(self, p):
-    """basictypename : identifier
-                     | ASSOCIATED identifier
-                     | handletype"""
-    if len(p) == 2:
-      p[0] = p[1]
-    else:
-      p[0] = "asso<" + p[2] + ">"
-
-  def p_handletype(self, p):
-    """handletype : HANDLE
-                  | HANDLE LANGLE NAME RANGLE"""
-    if len(p) == 2:
-      p[0] = p[1]
-    else:
-      if p[3] not in ('data_pipe_consumer',
-                      'data_pipe_producer',
-                      'message_pipe',
-                      'shared_buffer'):
-        # Note: We don't enable tracking of line numbers for everything, so we
-        # can't use |p.lineno(3)|.
-        raise ParseError(self.filename, "Invalid handle type %r:" % p[3],
-                         lineno=p.lineno(1),
-                         snippet=self._GetSnippet(p.lineno(1)))
-      p[0] = "handle<" + p[3] + ">"
-
-  def p_array(self, p):
-    """array : ARRAY LANGLE typename RANGLE"""
-    p[0] = p[3] + "[]"
-
-  def p_fixed_array(self, p):
-    """fixed_array : ARRAY LANGLE typename COMMA INT_CONST_DEC RANGLE"""
-    value = int(p[5])
-    if value == 0 or value > _MAX_ARRAY_SIZE:
-      raise ParseError(self.filename, "Fixed array size %d invalid:" % value,
-                       lineno=p.lineno(5),
-                       snippet=self._GetSnippet(p.lineno(5)))
-    p[0] = p[3] + "[" + p[5] + "]"
-
-  def p_associative_array(self, p):
-    """associative_array : MAP LANGLE identifier COMMA typename RANGLE"""
-    p[0] = p[5] + "{" + p[3] + "}"
-
-  def p_interfacerequest(self, p):
-    """interfacerequest : identifier AMP
-                        | ASSOCIATED identifier AMP"""
-    if len(p) == 3:
-      p[0] = p[1] + "&"
-    else:
-      p[0] = "asso<" + p[2] + "&>"
-
-  def p_ordinal_1(self, p):
-    """ordinal : """
-    p[0] = None
-
-  def p_ordinal_2(self, p):
-    """ordinal : ORDINAL"""
-    value = int(p[1][1:])
-    if value > _MAX_ORDINAL_VALUE:
-      raise ParseError(self.filename, "Ordinal value %d too large:" % value,
-                       lineno=p.lineno(1),
-                       snippet=self._GetSnippet(p.lineno(1)))
-    p[0] = ast.Ordinal(value, filename=self.filename, lineno=p.lineno(1))
-
-  def p_enum_1(self, p):
-    """enum : attribute_section ENUM NAME LBRACE enum_value_list \
-                  RBRACE SEMI
-            | attribute_section ENUM NAME LBRACE nonempty_enum_value_list \
-                  COMMA RBRACE SEMI"""
-    p[0] = ast.Enum(p[3], p[1], p[5], filename=self.filename,
-                    lineno=p.lineno(2))
-
-  def p_enum_2(self, p):
-    """enum : attribute_section ENUM NAME SEMI"""
-    p[0] = ast.Enum(p[3], p[1], None, filename=self.filename,
-                    lineno=p.lineno(2))
-
-  def p_enum_value_list_1(self, p):
-    """enum_value_list : """
-    p[0] = ast.EnumValueList()
-
-  def p_enum_value_list_2(self, p):
-    """enum_value_list : nonempty_enum_value_list"""
-    p[0] = p[1]
-
-  def p_nonempty_enum_value_list_1(self, p):
-    """nonempty_enum_value_list : enum_value"""
-    p[0] = ast.EnumValueList(p[1])
-
-  def p_nonempty_enum_value_list_2(self, p):
-    """nonempty_enum_value_list : nonempty_enum_value_list COMMA enum_value"""
-    p[0] = p[1]
-    p[0].Append(p[3])
-
-  def p_enum_value(self, p):
-    """enum_value : attribute_section NAME
-                  | attribute_section NAME EQUALS int
-                  | attribute_section NAME EQUALS identifier_wrapped"""
-    p[0] = ast.EnumValue(p[2], p[1], p[4] if len(p) == 5 else None,
-                         filename=self.filename, lineno=p.lineno(2))
-
-  def p_const(self, p):
-    """const : CONST typename NAME EQUALS constant SEMI"""
-    p[0] = ast.Const(p[3], p[2], p[5])
-
-  def p_constant(self, p):
-    """constant : literal
-                | identifier_wrapped"""
-    p[0] = p[1]
-
-  def p_identifier_wrapped(self, p):
-    """identifier_wrapped : identifier"""
-    p[0] = ('IDENTIFIER', p[1])
-
-  # TODO(vtl): Make this produce a "wrapped" identifier (probably as an
-  # |ast.Identifier|, to be added) and get rid of identifier_wrapped.
-  def p_identifier(self, p):
-    """identifier : NAME
-                  | NAME DOT identifier"""
-    p[0] = ''.join(p[1:])
-
-  def p_literal(self, p):
-    """literal : int
-               | float
-               | TRUE
-               | FALSE
-               | DEFAULT
-               | STRING_LITERAL"""
-    p[0] = p[1]
-
-  def p_int(self, p):
-    """int : int_const
-           | PLUS int_const
-           | MINUS int_const"""
-    p[0] = ''.join(p[1:])
-
-  def p_int_const(self, p):
-    """int_const : INT_CONST_DEC
-                 | INT_CONST_HEX"""
-    p[0] = p[1]
-
-  def p_float(self, p):
-    """float : FLOAT_CONST
-             | PLUS FLOAT_CONST
-             | MINUS FLOAT_CONST"""
-    p[0] = ''.join(p[1:])
-
-  def p_error(self, e):
-    if e is None:
-      # Unexpected EOF.
-      # TODO(vtl): Can we figure out what's missing?
-      raise ParseError(self.filename, "Unexpected end of file")
-
-    raise ParseError(self.filename, "Unexpected %r:" % e.value, lineno=e.lineno,
-                     snippet=self._GetSnippet(e.lineno))
-
-  def _GetSnippet(self, lineno):
-    return self.source.split('\n')[lineno - 1]
-
-
-def Parse(source, filename):
-  """Parse source file to AST.
-
-  Args:
-    source: The source text as a str.
-    filename: The filename that |source| originates from.
-
-  Returns:
-    The AST as a mojom.parse.ast.Mojom object.
-  """
-  lexer = Lexer(filename)
-  parser = Parser(lexer, source, filename)
-
-  lex.lex(object=lexer)
-  yacc.yacc(module=parser, debug=0, write_tables=0)
-
-  tree = yacc.parse(source)
-  return tree
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/__init__.py b/mojo/public/tools/bindings/pylib/mojom_tests/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/fileutil_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/fileutil_unittest.py
deleted file mode 100644
index d56faad..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/fileutil_unittest.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2015 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.
-
-import imp
-import os.path
-import shutil
-import sys
-import tempfile
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-from mojom import fileutil
-
-
-class FileUtilTest(unittest.TestCase):
-
-  def testEnsureDirectoryExists(self):
-    """Test that EnsureDirectoryExists fuctions correctly."""
-
-    temp_dir = tempfile.mkdtemp()
-    try:
-      self.assertTrue(os.path.exists(temp_dir))
-
-      # Directory does not exist, yet.
-      full = os.path.join(temp_dir, "foo", "bar")
-      self.assertFalse(os.path.exists(full))
-
-      # Create the directory.
-      fileutil.EnsureDirectoryExists(full)
-      self.assertTrue(os.path.exists(full))
-
-      # Trying to create it again does not cause an error.
-      fileutil.EnsureDirectoryExists(full)
-      self.assertTrue(os.path.exists(full))
-
-      # Bypass check for directory existence to tickle error handling that
-      # occurs in response to a race.
-      fileutil.EnsureDirectoryExists(full, always_try_to_create=True)
-      self.assertTrue(os.path.exists(full))
-    finally:
-      shutil.rmtree(temp_dir)
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/generate/__init__.py b/mojo/public/tools/bindings/pylib/mojom_tests/generate/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/generate/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/generate/data_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/generate/data_unittest.py
deleted file mode 100644
index 70c92a3..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/generate/data_unittest.py
+++ /dev/null
@@ -1,156 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-from mojom.generate import data
-from mojom.generate import module as mojom
-
-
-class DataTest(unittest.TestCase):
-
-  def testStructDataConversion(self):
-    """Tests that a struct can be converted from data."""
-    module = mojom.Module('test_module', 'test_namespace')
-    struct_data = {
-        'name': 'SomeStruct',
-        'enums': [],
-        'constants': [],
-        'fields': [
-            {'name': 'field1', 'kind': 'i32'},
-            {'name': 'field2', 'kind': 'i32', 'ordinal': 10},
-            {'name': 'field3', 'kind': 'i32', 'default': 15}]}
-
-    struct = data.StructFromData(module, struct_data)
-    struct.fields = map(lambda field:
-        data.StructFieldFromData(module, field, struct), struct.fields_data)
-    self.assertEquals(struct_data, data.StructToData(struct))
-
-  def testUnionDataConversion(self):
-    """Tests that a union can be converted from data."""
-    module = mojom.Module('test_module', 'test_namespace')
-    union_data = {
-        'name': 'SomeUnion',
-        'fields': [
-            {'name': 'field1', 'kind': 'i32'},
-            {'name': 'field2', 'kind': 'i32', 'ordinal': 10}]}
-
-    union = data.UnionFromData(module, union_data)
-    union.fields = map(lambda field:
-        data.UnionFieldFromData(module, field, union), union.fields_data)
-    self.assertEquals(union_data, data.UnionToData(union))
-
-  def testImportFromDataNoMissingImports(self):
-    """Tests that unions, structs, interfaces and enums are imported."""
-    module = mojom.Module('test_module', 'test_namespace')
-    imported_module = mojom.Module('import_module', 'import_namespace')
-    #TODO(azani): Init values in module.py.
-    #TODO(azani): Test that values are imported.
-    imported_module.values = {}
-    imported_data = {'module' : imported_module}
-
-
-    struct = mojom.Struct('TestStruct', module=module)
-    imported_module.kinds[struct.spec] = struct
-
-    union = mojom.Union('TestUnion', module=module)
-    imported_module.kinds[union.spec] = union
-
-    interface = mojom.Interface('TestInterface', module=module)
-    imported_module.kinds[interface.spec] = interface
-
-    enum = mojom.Enum('TestEnum', module=module)
-    imported_module.kinds[enum.spec] = enum
-
-    data.ImportFromData(module, imported_data)
-
-    # Test that the kind was imported.
-    self.assertIn(struct.spec, module.kinds)
-    self.assertEquals(struct.name, module.kinds[struct.spec].name)
-
-    self.assertIn(union.spec, module.kinds)
-    self.assertEquals(union.name, module.kinds[union.spec].name)
-
-    self.assertIn(interface.spec, module.kinds)
-    self.assertEquals(interface.name, module.kinds[interface.spec].name)
-
-    self.assertIn(enum.spec, module.kinds)
-    self.assertEquals(enum.name, module.kinds[enum.spec].name)
-
-    # Test that the imported kind is a copy and not the original.
-    self.assertIsNot(struct, module.kinds[struct.spec])
-    self.assertIsNot(union, module.kinds[union.spec])
-    self.assertIsNot(interface, module.kinds[interface.spec])
-    self.assertIsNot(enum, module.kinds[enum.spec])
-
-  def testImportFromDataNoExtraneousImports(self):
-    """Tests that arrays, maps and interface requests are not imported."""
-    module = mojom.Module('test_module', 'test_namespace')
-    imported_module = mojom.Module('import_module', 'import_namespace')
-    #TODO(azani): Init values in module.py.
-    imported_module.values = {}
-    imported_data = {'module' : imported_module}
-
-    array = mojom.Array(mojom.INT16, length=20)
-    imported_module.kinds[array.spec] = array
-
-    map_kind = mojom.Map(mojom.INT16, mojom.INT16)
-    imported_module.kinds[map_kind.spec] = map_kind
-
-    interface = mojom.Interface('TestInterface', module=module)
-    imported_module.kinds[interface.spec] = interface
-
-    interface_req = mojom.InterfaceRequest(interface)
-    imported_module.kinds[interface_req.spec] = interface_req
-
-    data.ImportFromData(module, imported_data)
-
-    self.assertNotIn(array.spec, module.kinds)
-    self.assertNotIn(map_kind.spec, module.kinds)
-    self.assertNotIn(interface_req.spec, module.kinds)
-
-  def testNonInterfaceAsInterfaceRequest(self):
-    """Tests that a non-interface cannot be used for interface requests."""
-    module = mojom.Module('test_module', 'test_namespace')
-    interface = mojom.Interface('TestInterface', module=module)
-    method_dict = {
-        'name': 'Foo',
-        'parameters': [{'name': 'foo', 'kind': 'r:i32'}],
-    }
-    with self.assertRaises(Exception) as e:
-      data.MethodFromData(module, method_dict, interface)
-    self.assertEquals(e.exception.__str__(),
-                      'Interface request requires \'i32\' to be an interface.')
-
-  def testNonInterfaceAsAssociatedInterface(self):
-    """Tests that a non-interface type cannot be used for associated
-    interfaces."""
-    module = mojom.Module('test_module', 'test_namespace')
-    interface = mojom.Interface('TestInterface', module=module)
-    method_dict = {
-        'name': 'Foo',
-        'parameters': [{'name': 'foo', 'kind': 'asso:i32'}],
-    }
-    with self.assertRaises(Exception) as e:
-      data.MethodFromData(module, method_dict, interface)
-    self.assertEquals(
-        e.exception.__str__(),
-        'Associated interface requires \'i32\' to be an interface.')
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/generate/generator_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/generate/generator_unittest.py
deleted file mode 100644
index a684773..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/generate/generator_unittest.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-from mojom.generate import generator
-
-
-class StringManipulationTest(unittest.TestCase):
-  """generator contains some string utilities, this tests only those."""
-
-  def testUnderToCamel(self):
-    """Tests UnderToCamel which converts underscore_separated to CamelCase."""
-    self.assertEquals("CamelCase", generator.UnderToCamel("camel_case"))
-    self.assertEquals("CamelCase", generator.UnderToCamel("CAMEL_CASE"))
-
-if __name__ == "__main__":
-  unittest.main()
-
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/generate/module_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/generate/module_unittest.py
deleted file mode 100644
index 75b7cd5..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/generate/module_unittest.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-from mojom.generate import module as mojom
-
-
-class ModuleTest(unittest.TestCase):
-
-  def testNonInterfaceAsInterfaceRequest(self):
-    """Tests that a non-interface cannot be used for interface requests."""
-    module = mojom.Module('test_module', 'test_namespace')
-    struct = mojom.Struct('TestStruct', module=module)
-    with self.assertRaises(Exception) as e:
-      mojom.InterfaceRequest(struct)
-    self.assertEquals(
-        e.exception.__str__(),
-        'Interface request requires \'x:TestStruct\' to be an interface.')
-
-  def testNonInterfaceAsAssociatedInterface(self):
-    """Tests that a non-interface type cannot be used for associated interfaces.
-    """
-    module = mojom.Module('test_module', 'test_namespace')
-    struct = mojom.Struct('TestStruct', module=module)
-    with self.assertRaises(Exception) as e:
-      mojom.AssociatedInterface(struct)
-    self.assertEquals(
-        e.exception.__str__(),
-        'Associated interface requires \'x:TestStruct\' to be an interface.')
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/generate/pack_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/generate/pack_unittest.py
deleted file mode 100644
index 75f6d51..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/generate/pack_unittest.py
+++ /dev/null
@@ -1,136 +0,0 @@
-# Copyright 2015 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.
-
-import imp
-import os.path
-import sys
-import unittest
-
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-from mojom.generate import pack
-from mojom.generate import module as mojom
-
-
-# TODO(yzshen): Move tests in pack_tests.py here.
-class PackTest(unittest.TestCase):
-  def _CheckPackSequence(self, kinds, fields, offsets):
-    """Checks the pack order and offsets of a sequence of mojom.Kinds.
-
-    Args:
-      kinds: A sequence of mojom.Kinds that specify the fields that are to be
-      created.
-      fields: The expected order of the resulting fields, with the integer "1"
-      first.
-      offsets: The expected order of offsets, with the integer "0" first.
-    """
-    struct = mojom.Struct('test')
-    index = 1
-    for kind in kinds:
-      struct.AddField('%d' % index, kind)
-      index += 1
-    ps = pack.PackedStruct(struct)
-    num_fields = len(ps.packed_fields)
-    self.assertEquals(len(kinds), num_fields)
-    for i in xrange(num_fields):
-      self.assertEquals('%d' % fields[i], ps.packed_fields[i].field.name)
-      self.assertEquals(offsets[i], ps.packed_fields[i].offset)
-
-  def testMinVersion(self):
-    """Tests that |min_version| is properly set for packed fields."""
-    struct = mojom.Struct('test')
-    struct.AddField('field_2', mojom.BOOL, 2)
-    struct.AddField('field_0', mojom.INT32, 0)
-    struct.AddField('field_1', mojom.INT64, 1)
-    ps = pack.PackedStruct(struct)
-
-    self.assertEquals('field_0', ps.packed_fields[0].field.name)
-    self.assertEquals('field_2', ps.packed_fields[1].field.name)
-    self.assertEquals('field_1', ps.packed_fields[2].field.name)
-
-    self.assertEquals(0, ps.packed_fields[0].min_version)
-    self.assertEquals(0, ps.packed_fields[1].min_version)
-    self.assertEquals(0, ps.packed_fields[2].min_version)
-
-    struct.fields[0].attributes = {'MinVersion': 1}
-    ps = pack.PackedStruct(struct)
-
-    self.assertEquals(0, ps.packed_fields[0].min_version)
-    self.assertEquals(1, ps.packed_fields[1].min_version)
-    self.assertEquals(0, ps.packed_fields[2].min_version)
-
-  def testGetVersionInfoEmptyStruct(self):
-    """Tests that pack.GetVersionInfo() never returns an empty list, even for
-    empty structs.
-    """
-    struct = mojom.Struct('test')
-    ps = pack.PackedStruct(struct)
-
-    versions = pack.GetVersionInfo(ps)
-    self.assertEquals(1, len(versions))
-    self.assertEquals(0, versions[0].version)
-    self.assertEquals(0, versions[0].num_fields)
-    self.assertEquals(8, versions[0].num_bytes)
-
-  def testGetVersionInfoComplexOrder(self):
-    """Tests pack.GetVersionInfo() using a struct whose definition order,
-    ordinal order and pack order for fields are all different.
-    """
-    struct = mojom.Struct('test')
-    struct.AddField('field_3', mojom.BOOL, ordinal=3,
-                    attributes={'MinVersion': 3})
-    struct.AddField('field_0', mojom.INT32, ordinal=0)
-    struct.AddField('field_1', mojom.INT64, ordinal=1,
-                    attributes={'MinVersion': 2})
-    struct.AddField('field_2', mojom.INT64, ordinal=2,
-                    attributes={'MinVersion': 3})
-    ps = pack.PackedStruct(struct)
-
-    versions = pack.GetVersionInfo(ps)
-    self.assertEquals(3, len(versions))
-
-    self.assertEquals(0, versions[0].version)
-    self.assertEquals(1, versions[0].num_fields)
-    self.assertEquals(16, versions[0].num_bytes)
-
-    self.assertEquals(2, versions[1].version)
-    self.assertEquals(2, versions[1].num_fields)
-    self.assertEquals(24, versions[1].num_bytes)
-
-    self.assertEquals(3, versions[2].version)
-    self.assertEquals(4, versions[2].num_fields)
-    self.assertEquals(32, versions[2].num_bytes)
-
-  def testInterfaceAlignment(self):
-    """Tests that interfaces are aligned on 4-byte boundaries, although the size
-    of an interface is 8 bytes.
-    """
-    kinds = (mojom.INT32, mojom.Interface('test_interface'))
-    fields = (1, 2)
-    offsets = (0, 4)
-    self._CheckPackSequence(kinds, fields, offsets)
-
-  def testAssociatedInterfaceAlignment(self):
-    """Tests that associated interfaces are aligned on 4-byte boundaries,
-    although the size of an associated interface is 8 bytes.
-    """
-    kinds = (mojom.INT32,
-             mojom.AssociatedInterface(mojom.Interface('test_interface')))
-    fields = (1, 2)
-    offsets = (0, 4)
-    self._CheckPackSequence(kinds, fields, offsets)
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/__init__.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/ast_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/ast_unittest.py
deleted file mode 100644
index dd28cdd..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/ast_unittest.py
+++ /dev/null
@@ -1,135 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-import mojom.parse.ast as ast
-
-
-class _TestNode(ast.NodeBase):
-  """Node type for tests."""
-
-  def __init__(self, value, **kwargs):
-    super(_TestNode, self).__init__(**kwargs)
-    self.value = value
-
-  def __eq__(self, other):
-    return super(_TestNode, self).__eq__(other) and self.value == other.value
-
-
-class _TestNodeList(ast.NodeListBase):
-  """Node list type for tests."""
-
-  _list_item_type = _TestNode
-
-
-class ASTTest(unittest.TestCase):
-  """Tests various AST classes."""
-
-  def testNodeBase(self):
-    # Test |__eq__()|; this is only used for testing, where we want to do
-    # comparison by value and ignore filenames/line numbers (for convenience).
-    node1 = ast.NodeBase(filename="hello.mojom", lineno=123)
-    node2 = ast.NodeBase()
-    self.assertEquals(node1, node2)
-    self.assertEquals(node2, node1)
-
-    # Check that |__ne__()| just defers to |__eq__()| properly.
-    self.assertFalse(node1 != node2)
-    self.assertFalse(node2 != node1)
-
-    # Check that |filename| and |lineno| are set properly (and are None by
-    # default).
-    self.assertEquals(node1.filename, "hello.mojom")
-    self.assertEquals(node1.lineno, 123)
-    self.assertIsNone(node2.filename)
-    self.assertIsNone(node2.lineno)
-
-    # |NodeBase|'s |__eq__()| should compare types (and a subclass's |__eq__()|
-    # should first defer to its superclass's).
-    node3 = _TestNode(123)
-    self.assertNotEqual(node1, node3)
-    self.assertNotEqual(node3, node1)
-    # Also test |__eq__()| directly.
-    self.assertFalse(node1 == node3)
-    self.assertFalse(node3 == node1)
-
-    node4 = _TestNode(123, filename="world.mojom", lineno=123)
-    self.assertEquals(node4, node3)
-    node5 = _TestNode(456)
-    self.assertNotEquals(node5, node4)
-
-  def testNodeListBase(self):
-    node1 = _TestNode(1, filename="foo.mojom", lineno=1)
-    # Equal to, but not the same as, |node1|:
-    node1b = _TestNode(1, filename="foo.mojom", lineno=1)
-    node2 = _TestNode(2, filename="foo.mojom", lineno=2)
-
-    nodelist1 = _TestNodeList()  # Contains: (empty).
-    self.assertEquals(nodelist1, nodelist1)
-    self.assertEquals(nodelist1.items, [])
-    self.assertIsNone(nodelist1.filename)
-    self.assertIsNone(nodelist1.lineno)
-
-    nodelist2 = _TestNodeList(node1)  # Contains: 1.
-    self.assertEquals(nodelist2, nodelist2)
-    self.assertEquals(nodelist2.items, [node1])
-    self.assertNotEqual(nodelist2, nodelist1)
-    self.assertEquals(nodelist2.filename, "foo.mojom")
-    self.assertEquals(nodelist2.lineno, 1)
-
-    nodelist3 = _TestNodeList([node2])  # Contains: 2.
-    self.assertEquals(nodelist3.items, [node2])
-    self.assertNotEqual(nodelist3, nodelist1)
-    self.assertNotEqual(nodelist3, nodelist2)
-    self.assertEquals(nodelist3.filename, "foo.mojom")
-    self.assertEquals(nodelist3.lineno, 2)
-
-    nodelist1.Append(node1b)  # Contains: 1.
-    self.assertEquals(nodelist1.items, [node1])
-    self.assertEquals(nodelist1, nodelist2)
-    self.assertNotEqual(nodelist1, nodelist3)
-    self.assertEquals(nodelist1.filename, "foo.mojom")
-    self.assertEquals(nodelist1.lineno, 1)
-
-    nodelist1.Append(node2)  # Contains: 1, 2.
-    self.assertEquals(nodelist1.items, [node1, node2])
-    self.assertNotEqual(nodelist1, nodelist2)
-    self.assertNotEqual(nodelist1, nodelist3)
-    self.assertEquals(nodelist1.lineno, 1)
-
-    nodelist2.Append(node2)  # Contains: 1, 2.
-    self.assertEquals(nodelist2.items, [node1, node2])
-    self.assertEquals(nodelist2, nodelist1)
-    self.assertNotEqual(nodelist2, nodelist3)
-    self.assertEquals(nodelist2.lineno, 1)
-
-    nodelist3.Insert(node1)  # Contains: 1, 2.
-    self.assertEquals(nodelist3.items, [node1, node2])
-    self.assertEquals(nodelist3, nodelist1)
-    self.assertEquals(nodelist3, nodelist2)
-    self.assertEquals(nodelist3.lineno, 1)
-
-    # Test iteration:
-    i = 1
-    for item in nodelist1:
-      self.assertEquals(item.value, i)
-      i += 1
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/lexer_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/lexer_unittest.py
deleted file mode 100644
index 6822cbc..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/lexer_unittest.py
+++ /dev/null
@@ -1,192 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("ply")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("mojo"), "third_party"))
-from ply import lex
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-import mojom.parse.lexer
-
-
-# This (monkey-patching LexToken to make comparison value-based) is evil, but
-# we'll do it anyway. (I'm pretty sure ply's lexer never cares about comparing
-# for object identity.)
-def _LexTokenEq(self, other):
-  return self.type == other.type and self.value == other.value and \
-         self.lineno == other.lineno and self.lexpos == other.lexpos
-setattr(lex.LexToken, '__eq__', _LexTokenEq)
-
-
-def _MakeLexToken(token_type, value, lineno=1, lexpos=0):
-  """Makes a LexToken with the given parameters. (Note that lineno is 1-based,
-  but lexpos is 0-based.)"""
-  rv = lex.LexToken()
-  rv.type, rv.value, rv.lineno, rv.lexpos = token_type, value, lineno, lexpos
-  return rv
-
-
-def _MakeLexTokenForKeyword(keyword, **kwargs):
-  """Makes a LexToken for the given keyword."""
-  return _MakeLexToken(keyword.upper(), keyword.lower(), **kwargs)
-
-
-class LexerTest(unittest.TestCase):
-  """Tests |mojom.parse.lexer.Lexer|."""
-
-  def __init__(self, *args, **kwargs):
-    unittest.TestCase.__init__(self, *args, **kwargs)
-    # Clone all lexer instances from this one, since making a lexer is slow.
-    self._zygote_lexer = lex.lex(mojom.parse.lexer.Lexer("my_file.mojom"))
-
-  def testValidKeywords(self):
-    """Tests valid keywords."""
-    self.assertEquals(self._SingleTokenForInput("handle"),
-                      _MakeLexTokenForKeyword("handle"))
-    self.assertEquals(self._SingleTokenForInput("import"),
-                      _MakeLexTokenForKeyword("import"))
-    self.assertEquals(self._SingleTokenForInput("module"),
-                      _MakeLexTokenForKeyword("module"))
-    self.assertEquals(self._SingleTokenForInput("struct"),
-                      _MakeLexTokenForKeyword("struct"))
-    self.assertEquals(self._SingleTokenForInput("union"),
-                      _MakeLexTokenForKeyword("union"))
-    self.assertEquals(self._SingleTokenForInput("interface"),
-                      _MakeLexTokenForKeyword("interface"))
-    self.assertEquals(self._SingleTokenForInput("enum"),
-                      _MakeLexTokenForKeyword("enum"))
-    self.assertEquals(self._SingleTokenForInput("const"),
-                      _MakeLexTokenForKeyword("const"))
-    self.assertEquals(self._SingleTokenForInput("true"),
-                      _MakeLexTokenForKeyword("true"))
-    self.assertEquals(self._SingleTokenForInput("false"),
-                      _MakeLexTokenForKeyword("false"))
-    self.assertEquals(self._SingleTokenForInput("default"),
-                      _MakeLexTokenForKeyword("default"))
-    self.assertEquals(self._SingleTokenForInput("array"),
-                      _MakeLexTokenForKeyword("array"))
-    self.assertEquals(self._SingleTokenForInput("map"),
-                      _MakeLexTokenForKeyword("map"))
-    self.assertEquals(self._SingleTokenForInput("associated"),
-                      _MakeLexTokenForKeyword("associated"))
-
-  def testValidIdentifiers(self):
-    """Tests identifiers."""
-    self.assertEquals(self._SingleTokenForInput("abcd"),
-                      _MakeLexToken("NAME", "abcd"))
-    self.assertEquals(self._SingleTokenForInput("AbC_d012_"),
-                      _MakeLexToken("NAME", "AbC_d012_"))
-    self.assertEquals(self._SingleTokenForInput("_0123"),
-                      _MakeLexToken("NAME", "_0123"))
-
-  def testInvalidIdentifiers(self):
-    with self.assertRaisesRegexp(
-        mojom.parse.lexer.LexError,
-        r"^my_file\.mojom:1: Error: Illegal character '\$'$"):
-      self._TokensForInput("$abc")
-    with self.assertRaisesRegexp(
-        mojom.parse.lexer.LexError,
-        r"^my_file\.mojom:1: Error: Illegal character '\$'$"):
-      self._TokensForInput("a$bc")
-
-  def testDecimalIntegerConstants(self):
-    self.assertEquals(self._SingleTokenForInput("0"),
-                      _MakeLexToken("INT_CONST_DEC", "0"))
-    self.assertEquals(self._SingleTokenForInput("1"),
-                      _MakeLexToken("INT_CONST_DEC", "1"))
-    self.assertEquals(self._SingleTokenForInput("123"),
-                      _MakeLexToken("INT_CONST_DEC", "123"))
-    self.assertEquals(self._SingleTokenForInput("10"),
-                      _MakeLexToken("INT_CONST_DEC", "10"))
-
-  def testValidTokens(self):
-    """Tests valid tokens (which aren't tested elsewhere)."""
-    # Keywords tested in |testValidKeywords|.
-    # NAME tested in |testValidIdentifiers|.
-    self.assertEquals(self._SingleTokenForInput("@123"),
-                      _MakeLexToken("ORDINAL", "@123"))
-    self.assertEquals(self._SingleTokenForInput("456"),
-                      _MakeLexToken("INT_CONST_DEC", "456"))
-    self.assertEquals(self._SingleTokenForInput("0x01aB2eF3"),
-                      _MakeLexToken("INT_CONST_HEX", "0x01aB2eF3"))
-    self.assertEquals(self._SingleTokenForInput("123.456"),
-                      _MakeLexToken("FLOAT_CONST", "123.456"))
-    self.assertEquals(self._SingleTokenForInput("\"hello\""),
-                      _MakeLexToken("STRING_LITERAL", "\"hello\""))
-    self.assertEquals(self._SingleTokenForInput("+"),
-                      _MakeLexToken("PLUS", "+"))
-    self.assertEquals(self._SingleTokenForInput("-"),
-                      _MakeLexToken("MINUS", "-"))
-    self.assertEquals(self._SingleTokenForInput("&"),
-                      _MakeLexToken("AMP", "&"))
-    self.assertEquals(self._SingleTokenForInput("?"),
-                      _MakeLexToken("QSTN", "?"))
-    self.assertEquals(self._SingleTokenForInput("="),
-                      _MakeLexToken("EQUALS", "="))
-    self.assertEquals(self._SingleTokenForInput("=>"),
-                      _MakeLexToken("RESPONSE", "=>"))
-    self.assertEquals(self._SingleTokenForInput("("),
-                      _MakeLexToken("LPAREN", "("))
-    self.assertEquals(self._SingleTokenForInput(")"),
-                      _MakeLexToken("RPAREN", ")"))
-    self.assertEquals(self._SingleTokenForInput("["),
-                      _MakeLexToken("LBRACKET", "["))
-    self.assertEquals(self._SingleTokenForInput("]"),
-                      _MakeLexToken("RBRACKET", "]"))
-    self.assertEquals(self._SingleTokenForInput("{"),
-                      _MakeLexToken("LBRACE", "{"))
-    self.assertEquals(self._SingleTokenForInput("}"),
-                      _MakeLexToken("RBRACE", "}"))
-    self.assertEquals(self._SingleTokenForInput("<"),
-                      _MakeLexToken("LANGLE", "<"))
-    self.assertEquals(self._SingleTokenForInput(">"),
-                      _MakeLexToken("RANGLE", ">"))
-    self.assertEquals(self._SingleTokenForInput(";"),
-                      _MakeLexToken("SEMI", ";"))
-    self.assertEquals(self._SingleTokenForInput(","),
-                      _MakeLexToken("COMMA", ","))
-    self.assertEquals(self._SingleTokenForInput("."),
-                      _MakeLexToken("DOT", "."))
-
-  def _TokensForInput(self, input_string):
-    """Gets a list of tokens for the given input string."""
-    lexer = self._zygote_lexer.clone()
-    lexer.input(input_string)
-    rv = []
-    while True:
-      tok = lexer.token()
-      if not tok:
-        return rv
-      rv.append(tok)
-
-  def _SingleTokenForInput(self, input_string):
-    """Gets the single token for the given input string. (Raises an exception if
-    the input string does not result in exactly one token.)"""
-    toks = self._TokensForInput(input_string)
-    assert len(toks) == 1
-    return toks[0]
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/parser_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/parser_unittest.py
deleted file mode 100644
index 3f4ca87..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/parser_unittest.py
+++ /dev/null
@@ -1,1497 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-import mojom.parse.ast as ast
-import mojom.parse.lexer as lexer
-import mojom.parse.parser as parser
-
-
-class ParserTest(unittest.TestCase):
-  """Tests |parser.Parse()|."""
-
-  def testTrivialValidSource(self):
-    """Tests a trivial, but valid, .mojom source."""
-
-    source = """\
-        // This is a comment.
-
-        module my_module;
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testSourceWithCrLfs(self):
-    """Tests a .mojom source with CR-LFs instead of LFs."""
-
-    source = "// This is a comment.\r\n\r\nmodule my_module;\r\n"
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testUnexpectedEOF(self):
-    """Tests a "truncated" .mojom source."""
-
-    source = """\
-        // This is a comment.
-
-        module my_module
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom: Error: Unexpected end of file$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testCommentLineNumbers(self):
-    """Tests that line numbers are correctly tracked when comments are
-    present."""
-
-    source1 = """\
-        // Isolated C++-style comments.
-
-        // Foo.
-        asdf1
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected 'asdf1':\n *asdf1$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        // Consecutive C++-style comments.
-        // Foo.
-        // Bar.
-
-        struct Yada {  // Baz.
-                       // Quux.
-          int32 x;
-        };
-
-        asdf2
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:10: Error: Unexpected 'asdf2':\n *asdf2$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        /* Single-line C-style comments. */
-        /* Foobar. */
-
-        /* Baz. */
-        asdf3
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:5: Error: Unexpected 'asdf3':\n *asdf3$"):
-      parser.Parse(source3, "my_file.mojom")
-
-    source4 = """\
-        /* Multi-line C-style comments.
-        */
-        /*
-        Foo.
-        Bar.
-        */
-
-        /* Baz
-           Quux. */
-        asdf4
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:10: Error: Unexpected 'asdf4':\n *asdf4$"):
-      parser.Parse(source4, "my_file.mojom")
-
-
-  def testSimpleStruct(self):
-    """Tests a simple .mojom source that just defines a struct."""
-
-    source = """\
-        module my_module;
-
-        struct MyStruct {
-          int32 a;
-          double b;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a', None, None, 'int32', None),
-                 ast.StructField('b', None, None, 'double', None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testSimpleStructWithoutModule(self):
-    """Tests a simple struct without an explict module statement."""
-
-    source = """\
-        struct MyStruct {
-          int32 a;
-          double b;
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a', None, None, 'int32', None),
-                 ast.StructField('b', None, None, 'double', None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testValidStructDefinitions(self):
-    """Tests all types of definitions that can occur in a struct."""
-
-    source = """\
-        struct MyStruct {
-          enum MyEnum { VALUE };
-          const double kMyConst = 1.23;
-          int32 a;
-          SomeOtherStruct b;  // Invalidity detected at another stage.
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.Enum('MyEnum',
-                          None,
-                          ast.EnumValueList(
-                              ast.EnumValue('VALUE', None, None))),
-                 ast.Const('kMyConst', 'double', '1.23'),
-                 ast.StructField('a', None, None, 'int32', None),
-                 ast.StructField('b', None, None, 'SomeOtherStruct', None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidStructDefinitions(self):
-    """Tests that definitions that aren't allowed in a struct are correctly
-    detected."""
-
-    source1 = """\
-        struct MyStruct {
-          MyMethod(int32 a);
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '\(':\n"
-            r" *MyMethod\(int32 a\);$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        struct MyStruct {
-          struct MyInnerStruct {
-            int32 a;
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'struct':\n"
-            r" *struct MyInnerStruct {$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        struct MyStruct {
-          interface MyInterface {
-            MyMethod(int32 a);
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'interface':\n"
-            r" *interface MyInterface {$"):
-      parser.Parse(source3, "my_file.mojom")
-
-  def testMissingModuleName(self):
-    """Tests an (invalid) .mojom with a missing module name."""
-
-    source1 = """\
-        // Missing module name.
-        module ;
-        struct MyStruct {
-          int32 a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected ';':\n *module ;$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    # Another similar case, but make sure that line-number tracking/reporting
-    # is correct.
-    source2 = """\
-        module
-        // This line intentionally left unblank.
-
-        struct MyStruct {
-          int32 a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected 'struct':\n"
-            r" *struct MyStruct {$"):
-      parser.Parse(source2, "my_file.mojom")
-
-  def testMultipleModuleStatements(self):
-    """Tests an (invalid) .mojom with multiple module statements."""
-
-    source = """\
-        module foo;
-        module bar;
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Multiple \"module\" statements not "
-            r"allowed:\n *module bar;$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testModuleStatementAfterImport(self):
-    """Tests an (invalid) .mojom with a module statement after an import."""
-
-    source = """\
-        import "foo.mojom";
-        module foo;
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: \"module\" statements must precede imports "
-            r"and definitions:\n *module foo;$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testModuleStatementAfterDefinition(self):
-    """Tests an (invalid) .mojom with a module statement after a definition."""
-
-    source = """\
-        struct MyStruct {
-          int32 a;
-        };
-        module foo;
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: \"module\" statements must precede imports "
-            r"and definitions:\n *module foo;$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testImportStatementAfterDefinition(self):
-    """Tests an (invalid) .mojom with an import statement after a definition."""
-
-    source = """\
-        struct MyStruct {
-          int32 a;
-        };
-        import "foo.mojom";
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: \"import\" statements must precede "
-            r"definitions:\n *import \"foo.mojom\";$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testEnums(self):
-    """Tests that enum statements are correctly parsed."""
-
-    source = """\
-        module my_module;
-        enum MyEnum1 { VALUE1, VALUE2 };  // No trailing comma.
-        enum MyEnum2 {
-          VALUE1 = -1,
-          VALUE2 = 0,
-          VALUE3 = + 987,  // Check that space is allowed.
-          VALUE4 = 0xAF12,
-          VALUE5 = -0x09bcd,
-          VALUE6 = VALUE5,
-          VALUE7,  // Leave trailing comma.
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Enum(
-            'MyEnum1',
-            None,
-            ast.EnumValueList([ast.EnumValue('VALUE1', None, None),
-                               ast.EnumValue('VALUE2', None, None)])),
-         ast.Enum(
-            'MyEnum2',
-            None,
-            ast.EnumValueList([ast.EnumValue('VALUE1', None, '-1'),
-                               ast.EnumValue('VALUE2', None, '0'),
-                               ast.EnumValue('VALUE3', None, '+987'),
-                               ast.EnumValue('VALUE4', None, '0xAF12'),
-                               ast.EnumValue('VALUE5', None, '-0x09bcd'),
-                               ast.EnumValue('VALUE6', None, ('IDENTIFIER',
-                                                        'VALUE5')),
-                               ast.EnumValue('VALUE7', None, None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidEnumInitializers(self):
-    """Tests that invalid enum initializers are correctly detected."""
-
-    # No values.
-    source1 = """\
-        enum MyEnum {
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '}':\n"
-            r" *};$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    # Floating point value.
-    source2 = "enum MyEnum { VALUE = 0.123 };"
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:1: Error: Unexpected '0\.123':\n"
-            r"enum MyEnum { VALUE = 0\.123 };$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    # Boolean value.
-    source2 = "enum MyEnum { VALUE = true };"
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:1: Error: Unexpected 'true':\n"
-            r"enum MyEnum { VALUE = true };$"):
-      parser.Parse(source2, "my_file.mojom")
-
-  def testConsts(self):
-    """Tests some constants and struct members initialized with them."""
-
-    source = """\
-        module my_module;
-
-        struct MyStruct {
-          const int8 kNumber = -1;
-          int8 number@0 = kNumber;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct', None,
-            ast.StructBody(
-                [ast.Const('kNumber', 'int8', '-1'),
-                 ast.StructField('number', None, ast.Ordinal(0), 'int8',
-                                 ('IDENTIFIER', 'kNumber'))]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testNoConditionals(self):
-    """Tests that ?: is not allowed."""
-
-    source = """\
-        module my_module;
-
-        enum MyEnum {
-          MY_ENUM_1 = 1 ? 2 : 3
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected '\?':\n"
-            r" *MY_ENUM_1 = 1 \? 2 : 3$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testSimpleOrdinals(self):
-    """Tests that (valid) ordinal values are scanned correctly."""
-
-    source = """\
-        module my_module;
-
-        // This isn't actually valid .mojom, but the problem (missing ordinals)
-        // should be handled at a different level.
-        struct MyStruct {
-          int32 a0@0;
-          int32 a1@1;
-          int32 a2@2;
-          int32 a9@9;
-          int32 a10 @10;
-          int32 a11 @11;
-          int32 a29 @29;
-          int32 a1234567890 @1234567890;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a0', None, ast.Ordinal(0), 'int32', None),
-                 ast.StructField('a1', None, ast.Ordinal(1), 'int32', None),
-                 ast.StructField('a2', None, ast.Ordinal(2), 'int32', None),
-                 ast.StructField('a9', None, ast.Ordinal(9), 'int32', None),
-                 ast.StructField('a10', None, ast.Ordinal(10), 'int32', None),
-                 ast.StructField('a11', None, ast.Ordinal(11), 'int32', None),
-                 ast.StructField('a29', None, ast.Ordinal(29), 'int32', None),
-                 ast.StructField('a1234567890', None, ast.Ordinal(1234567890),
-                                 'int32', None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidOrdinals(self):
-    """Tests that (lexically) invalid ordinals are correctly detected."""
-
-    source1 = """\
-        module my_module;
-
-        struct MyStruct {
-          int32 a_missing@;
-        };
-        """
-    with self.assertRaisesRegexp(
-        lexer.LexError,
-        r"^my_file\.mojom:4: Error: Missing ordinal value$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        module my_module;
-
-        struct MyStruct {
-          int32 a_octal@01;
-        };
-        """
-    with self.assertRaisesRegexp(
-        lexer.LexError,
-        r"^my_file\.mojom:4: Error: "
-            r"Octal and hexadecimal ordinal values not allowed$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        module my_module; struct MyStruct { int32 a_invalid_octal@08; };
-        """
-    with self.assertRaisesRegexp(
-        lexer.LexError,
-        r"^my_file\.mojom:1: Error: "
-            r"Octal and hexadecimal ordinal values not allowed$"):
-      parser.Parse(source3, "my_file.mojom")
-
-    source4 = "module my_module; struct MyStruct { int32 a_hex@0x1aB9; };"
-    with self.assertRaisesRegexp(
-        lexer.LexError,
-        r"^my_file\.mojom:1: Error: "
-            r"Octal and hexadecimal ordinal values not allowed$"):
-      parser.Parse(source4, "my_file.mojom")
-
-    source5 = "module my_module; struct MyStruct { int32 a_hex@0X0; };"
-    with self.assertRaisesRegexp(
-        lexer.LexError,
-        r"^my_file\.mojom:1: Error: "
-            r"Octal and hexadecimal ordinal values not allowed$"):
-      parser.Parse(source5, "my_file.mojom")
-
-    source6 = """\
-        struct MyStruct {
-          int32 a_too_big@999999999999;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: "
-            r"Ordinal value 999999999999 too large:\n"
-            r" *int32 a_too_big@999999999999;$"):
-      parser.Parse(source6, "my_file.mojom")
-
-  def testNestedNamespace(self):
-    """Tests that "nested" namespaces work."""
-
-    source = """\
-        module my.mod;
-
-        struct MyStruct {
-          int32 a;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my.mod'), None),
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(ast.StructField('a', None, None, 'int32', None)))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testValidHandleTypes(self):
-    """Tests (valid) handle types."""
-
-    source = """\
-        struct MyStruct {
-          handle a;
-          handle<data_pipe_consumer> b;
-          handle <data_pipe_producer> c;
-          handle < message_pipe > d;
-          handle
-            < shared_buffer
-            > e;
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a', None, None, 'handle', None),
-                 ast.StructField('b', None, None, 'handle<data_pipe_consumer>',
-                                 None),
-                 ast.StructField('c', None, None, 'handle<data_pipe_producer>',
-                                 None),
-                 ast.StructField('d', None, None, 'handle<message_pipe>', None),
-                 ast.StructField('e', None, None, 'handle<shared_buffer>',
-                                 None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidHandleType(self):
-    """Tests an invalid (unknown) handle type."""
-
-    source = """\
-        struct MyStruct {
-          handle<wtf_is_this> foo;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: "
-            r"Invalid handle type 'wtf_is_this':\n"
-            r" *handle<wtf_is_this> foo;$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testValidDefaultValues(self):
-    """Tests default values that are valid (to the parser)."""
-
-    source = """\
-        struct MyStruct {
-          int16 a0 = 0;
-          uint16 a1 = 0x0;
-          uint16 a2 = 0x00;
-          uint16 a3 = 0x01;
-          uint16 a4 = 0xcd;
-          int32 a5 = 12345;
-          int64 a6 = -12345;
-          int64 a7 = +12345;
-          uint32 a8 = 0x12cd3;
-          uint32 a9 = -0x12cD3;
-          uint32 a10 = +0x12CD3;
-          bool a11 = true;
-          bool a12 = false;
-          float a13 = 1.2345;
-          float a14 = -1.2345;
-          float a15 = +1.2345;
-          float a16 = 123.;
-          float a17 = .123;
-          double a18 = 1.23E10;
-          double a19 = 1.E-10;
-          double a20 = .5E+10;
-          double a21 = -1.23E10;
-          double a22 = +.123E10;
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a0', None, None, 'int16', '0'),
-                 ast.StructField('a1', None, None, 'uint16', '0x0'),
-                 ast.StructField('a2', None, None, 'uint16', '0x00'),
-                 ast.StructField('a3', None, None, 'uint16', '0x01'),
-                 ast.StructField('a4', None, None, 'uint16', '0xcd'),
-                 ast.StructField('a5' , None, None, 'int32', '12345'),
-                 ast.StructField('a6', None, None, 'int64', '-12345'),
-                 ast.StructField('a7', None, None, 'int64', '+12345'),
-                 ast.StructField('a8', None, None, 'uint32', '0x12cd3'),
-                 ast.StructField('a9', None, None, 'uint32', '-0x12cD3'),
-                 ast.StructField('a10', None, None, 'uint32', '+0x12CD3'),
-                 ast.StructField('a11', None, None, 'bool', 'true'),
-                 ast.StructField('a12', None, None, 'bool', 'false'),
-                 ast.StructField('a13', None, None, 'float', '1.2345'),
-                 ast.StructField('a14', None, None, 'float', '-1.2345'),
-                 ast.StructField('a15', None, None, 'float', '+1.2345'),
-                 ast.StructField('a16', None, None, 'float', '123.'),
-                 ast.StructField('a17', None, None, 'float', '.123'),
-                 ast.StructField('a18', None, None, 'double', '1.23E10'),
-                 ast.StructField('a19', None, None, 'double', '1.E-10'),
-                 ast.StructField('a20', None, None, 'double', '.5E+10'),
-                 ast.StructField('a21', None, None, 'double', '-1.23E10'),
-                 ast.StructField('a22', None, None, 'double', '+.123E10')]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testValidFixedSizeArray(self):
-    """Tests parsing a fixed size array."""
-
-    source = """\
-        struct MyStruct {
-          array<int32> normal_array;
-          array<int32, 1> fixed_size_array_one_entry;
-          array<int32, 10> fixed_size_array_ten_entries;
-          array<array<array<int32, 1>>, 2> nested_arrays;
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('normal_array', None, None, 'int32[]', None),
-                 ast.StructField('fixed_size_array_one_entry', None, None,
-                                 'int32[1]', None),
-                 ast.StructField('fixed_size_array_ten_entries', None, None,
-                                 'int32[10]', None),
-                 ast.StructField('nested_arrays', None, None,
-                                 'int32[1][][2]', None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testValidNestedArray(self):
-    """Tests parsing a nested array."""
-
-    source = "struct MyStruct { array<array<int32>> nested_array; };"
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                ast.StructField('nested_array', None, None, 'int32[][]',
-                                None)))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidFixedArraySize(self):
-    """Tests that invalid fixed array bounds are correctly detected."""
-
-    source1 = """\
-        struct MyStruct {
-          array<int32, 0> zero_size_array;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Fixed array size 0 invalid:\n"
-            r" *array<int32, 0> zero_size_array;$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        struct MyStruct {
-          array<int32, 999999999999> too_big_array;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Fixed array size 999999999999 invalid:\n"
-            r" *array<int32, 999999999999> too_big_array;$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        struct MyStruct {
-          array<int32, abcdefg> not_a_number;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'abcdefg':\n"
-        r" *array<int32, abcdefg> not_a_number;"):
-      parser.Parse(source3, "my_file.mojom")
-
-  def testValidAssociativeArrays(self):
-    """Tests that we can parse valid associative array structures."""
-
-    source1 = "struct MyStruct { map<string, uint8> data; };"
-    expected1 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('data', None, None, 'uint8{string}', None)]))])
-    self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1)
-
-    source2 = "interface MyInterface { MyMethod(map<string, uint8> a); };"
-    expected2 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Interface(
-            'MyInterface',
-            None,
-            ast.InterfaceBody(
-                ast.Method(
-                    'MyMethod',
-                    None,
-                    None,
-                    ast.ParameterList(
-                        ast.Parameter('a', None, None, 'uint8{string}')),
-                    None)))])
-    self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2)
-
-    source3 = "struct MyStruct { map<string, array<uint8>> data; };"
-    expected3 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('data', None, None, 'uint8[]{string}',
-                                 None)]))])
-    self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3)
-
-  def testValidMethod(self):
-    """Tests parsing method declarations."""
-
-    source1 = "interface MyInterface { MyMethod(int32 a); };"
-    expected1 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Interface(
-            'MyInterface',
-            None,
-            ast.InterfaceBody(
-                ast.Method(
-                    'MyMethod',
-                    None,
-                    None,
-                    ast.ParameterList(ast.Parameter('a', None, None, 'int32')),
-                    None)))])
-    self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1)
-
-    source2 = """\
-        interface MyInterface {
-          MyMethod1@0(int32 a@0, int64 b@1);
-          MyMethod2@1() => ();
-        };
-        """
-    expected2 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Interface(
-            'MyInterface',
-            None,
-            ast.InterfaceBody(
-                [ast.Method(
-                    'MyMethod1',
-                    None,
-                    ast.Ordinal(0),
-                    ast.ParameterList([ast.Parameter('a', None, ast.Ordinal(0),
-                                                     'int32'),
-                                       ast.Parameter('b', None, ast.Ordinal(1),
-                                                     'int64')]),
-                    None),
-                  ast.Method(
-                    'MyMethod2',
-                    None,
-                    ast.Ordinal(1),
-                    ast.ParameterList(),
-                    ast.ParameterList())]))])
-    self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2)
-
-    source3 = """\
-        interface MyInterface {
-          MyMethod(string a) => (int32 a, bool b);
-        };
-        """
-    expected3 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Interface(
-            'MyInterface',
-            None,
-            ast.InterfaceBody(
-                ast.Method(
-                    'MyMethod',
-                    None,
-                    None,
-                    ast.ParameterList(ast.Parameter('a', None, None, 'string')),
-                    ast.ParameterList([ast.Parameter('a', None, None, 'int32'),
-                                       ast.Parameter('b', None, None,
-                                                     'bool')]))))])
-    self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3)
-
-  def testInvalidMethods(self):
-    """Tests that invalid method declarations are correctly detected."""
-
-    # No trailing commas.
-    source1 = """\
-        interface MyInterface {
-          MyMethod(string a,);
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '\)':\n"
-            r" *MyMethod\(string a,\);$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    # No leading commas.
-    source2 = """\
-        interface MyInterface {
-          MyMethod(, string a);
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected ',':\n"
-            r" *MyMethod\(, string a\);$"):
-      parser.Parse(source2, "my_file.mojom")
-
-  def testValidInterfaceDefinitions(self):
-    """Tests all types of definitions that can occur in an interface."""
-
-    source = """\
-        interface MyInterface {
-          enum MyEnum { VALUE };
-          const int32 kMyConst = 123;
-          MyMethod(int32 x) => (MyEnum y);
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Interface(
-            'MyInterface',
-            None,
-            ast.InterfaceBody(
-                [ast.Enum('MyEnum',
-                          None,
-                          ast.EnumValueList(
-                              ast.EnumValue('VALUE', None, None))),
-                 ast.Const('kMyConst', 'int32', '123'),
-                 ast.Method(
-                    'MyMethod',
-                    None,
-                    None,
-                    ast.ParameterList(ast.Parameter('x', None, None, 'int32')),
-                    ast.ParameterList(ast.Parameter('y', None, None,
-                                                    'MyEnum')))]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidInterfaceDefinitions(self):
-    """Tests that definitions that aren't allowed in an interface are correctly
-    detected."""
-
-    source1 = """\
-        interface MyInterface {
-          struct MyStruct {
-            int32 a;
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'struct':\n"
-            r" *struct MyStruct {$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        interface MyInterface {
-          interface MyInnerInterface {
-            MyMethod(int32 x);
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'interface':\n"
-            r" *interface MyInnerInterface {$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        interface MyInterface {
-          int32 my_field;
-        };
-        """
-    # The parser thinks that "int32" is a plausible name for a method, so it's
-    # "my_field" that gives it away.
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'my_field':\n"
-            r" *int32 my_field;$"):
-      parser.Parse(source3, "my_file.mojom")
-
-  def testValidAttributes(self):
-    """Tests parsing attributes (and attribute lists)."""
-
-    # Note: We use structs because they have (optional) attribute lists.
-
-    # Empty attribute list.
-    source1 = "[] struct MyStruct {};"
-    expected1 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct('MyStruct', ast.AttributeList(), ast.StructBody())])
-    self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1)
-
-    # One-element attribute list, with name value.
-    source2 = "[MyAttribute=MyName] struct MyStruct {};"
-    expected2 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            ast.AttributeList(ast.Attribute("MyAttribute", "MyName")),
-            ast.StructBody())])
-    self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2)
-
-    # Two-element attribute list, with one string value and one integer value.
-    source3 = "[MyAttribute1 = \"hello\", MyAttribute2 = 5] struct MyStruct {};"
-    expected3 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            ast.AttributeList([ast.Attribute("MyAttribute1", "hello"),
-                               ast.Attribute("MyAttribute2", 5)]),
-            ast.StructBody())])
-    self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3)
-
-    # Various places that attribute list is allowed.
-    source4 = """\
-        [Attr0=0] module my_module;
-
-        [Attr1=1] struct MyStruct {
-          [Attr2=2] int32 a;
-        };
-        [Attr3=3] union MyUnion {
-          [Attr4=4] int32 a;
-        };
-        [Attr5=5] enum MyEnum {
-          [Attr6=6] a
-        };
-        [Attr7=7] interface MyInterface {
-          [Attr8=8] MyMethod([Attr9=9] int32 a) => ([Attr10=10] bool b);
-        };
-        """
-    expected4 = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'),
-                   ast.AttributeList([ast.Attribute("Attr0", 0)])),
-        ast.ImportList(),
-        [ast.Struct(
-             'MyStruct',
-             ast.AttributeList(ast.Attribute("Attr1", 1)),
-             ast.StructBody(
-                 ast.StructField(
-                     'a', ast.AttributeList([ast.Attribute("Attr2", 2)]),
-                     None, 'int32', None))),
-         ast.Union(
-             'MyUnion',
-             ast.AttributeList(ast.Attribute("Attr3", 3)),
-             ast.UnionBody(
-                 ast.UnionField(
-                     'a', ast.AttributeList([ast.Attribute("Attr4", 4)]), None,
-                     'int32'))),
-         ast.Enum(
-             'MyEnum',
-             ast.AttributeList(ast.Attribute("Attr5", 5)),
-             ast.EnumValueList(
-                 ast.EnumValue(
-                     'VALUE', ast.AttributeList([ast.Attribute("Attr6", 6)]),
-                     None))),
-         ast.Interface(
-            'MyInterface',
-            ast.AttributeList(ast.Attribute("Attr7", 7)),
-            ast.InterfaceBody(
-                ast.Method(
-                    'MyMethod',
-                    ast.AttributeList(ast.Attribute("Attr8", 8)),
-                    None,
-                    ast.ParameterList(
-                        ast.Parameter(
-                            'a', ast.AttributeList([ast.Attribute("Attr9", 9)]),
-                            None, 'int32')),
-                    ast.ParameterList(
-                        ast.Parameter(
-                            'b',
-                            ast.AttributeList([ast.Attribute("Attr10", 10)]),
-                            None, 'bool')))))])
-    self.assertEquals(parser.Parse(source4, "my_file.mojom"), expected4)
-
-    # TODO(vtl): Boolean attributes don't work yet. (In fact, we just |eval()|
-    # literal (non-name) values, which is extremely dubious.)
-
-  def testInvalidAttributes(self):
-    """Tests that invalid attributes and attribute lists are correctly
-    detected."""
-
-    # Trailing commas not allowed.
-    source1 = "[MyAttribute=MyName,] struct MyStruct {};"
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:1: Error: Unexpected '\]':\n"
-            r"\[MyAttribute=MyName,\] struct MyStruct {};$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    # Missing value.
-    source2 = "[MyAttribute=] struct MyStruct {};"
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:1: Error: Unexpected '\]':\n"
-            r"\[MyAttribute=\] struct MyStruct {};$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    # Missing key.
-    source3 = "[=MyName] struct MyStruct {};"
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:1: Error: Unexpected '=':\n"
-            r"\[=MyName\] struct MyStruct {};$"):
-      parser.Parse(source3, "my_file.mojom")
-
-  def testValidImports(self):
-    """Tests parsing import statements."""
-
-    # One import (no module statement).
-    source1 = "import \"somedir/my.mojom\";"
-    expected1 = ast.Mojom(
-        None,
-        ast.ImportList(ast.Import("somedir/my.mojom")),
-        [])
-    self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1)
-
-    # Two imports (no module statement).
-    source2 = """\
-        import "somedir/my1.mojom";
-        import "somedir/my2.mojom";
-        """
-    expected2 = ast.Mojom(
-        None,
-        ast.ImportList([ast.Import("somedir/my1.mojom"),
-                        ast.Import("somedir/my2.mojom")]),
-        [])
-    self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2)
-
-    # Imports with module statement.
-    source3 = """\
-        module my_module;
-        import "somedir/my1.mojom";
-        import "somedir/my2.mojom";
-        """
-    expected3 = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList([ast.Import("somedir/my1.mojom"),
-                        ast.Import("somedir/my2.mojom")]),
-        [])
-    self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3)
-
-  def testInvalidImports(self):
-    """Tests that invalid import statements are correctly detected."""
-
-    source1 = """\
-        // Make the error occur on line 2.
-        import invalid
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'invalid':\n"
-            r" *import invalid$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        import  // Missing string.
-        struct MyStruct {
-          int32 a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'struct':\n"
-            r" *struct MyStruct {$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        import "foo.mojom"  // Missing semicolon.
-        struct MyStruct {
-          int32 a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'struct':\n"
-            r" *struct MyStruct {$"):
-      parser.Parse(source3, "my_file.mojom")
-
-  def testValidNullableTypes(self):
-    """Tests parsing nullable types."""
-
-    source = """\
-        struct MyStruct {
-          int32? a;  // This is actually invalid, but handled at a different
-                     // level.
-          string? b;
-          array<int32> ? c;
-          array<string ? > ? d;
-          array<array<int32>?>? e;
-          array<int32, 1>? f;
-          array<string?, 1>? g;
-          some_struct? h;
-          handle? i;
-          handle<data_pipe_consumer>? j;
-          handle<data_pipe_producer>? k;
-          handle<message_pipe>? l;
-          handle<shared_buffer>? m;
-          some_interface&? n;
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a', None, None,'int32?', None),
-                 ast.StructField('b', None, None,'string?', None),
-                 ast.StructField('c', None, None,'int32[]?', None),
-                 ast.StructField('d', None, None,'string?[]?', None),
-                 ast.StructField('e', None, None,'int32[]?[]?', None),
-                 ast.StructField('f', None, None,'int32[1]?', None),
-                 ast.StructField('g', None, None,'string?[1]?', None),
-                 ast.StructField('h', None, None,'some_struct?', None),
-                 ast.StructField('i', None, None,'handle?', None),
-                 ast.StructField('j', None, None,'handle<data_pipe_consumer>?',
-                                 None),
-                 ast.StructField('k', None, None,'handle<data_pipe_producer>?',
-                                 None),
-                 ast.StructField('l', None, None,'handle<message_pipe>?', None),
-                 ast.StructField('m', None, None,'handle<shared_buffer>?',
-                                 None),
-                 ast.StructField('n', None, None,'some_interface&?', None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidNullableTypes(self):
-    """Tests that invalid nullable types are correctly detected."""
-    source1 = """\
-        struct MyStruct {
-          string?? a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '\?':\n"
-            r" *string\?\? a;$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        struct MyStruct {
-          handle?<data_pipe_consumer> a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '<':\n"
-            r" *handle\?<data_pipe_consumer> a;$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        struct MyStruct {
-          some_interface?& a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '&':\n"
-            r" *some_interface\?& a;$"):
-      parser.Parse(source3, "my_file.mojom")
-
-  def testSimpleUnion(self):
-    """Tests a simple .mojom source that just defines a union."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          int32 a;
-          double b;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Union(
-          'MyUnion',
-          None,
-          ast.UnionBody([
-            ast.UnionField('a', None, None, 'int32'),
-            ast.UnionField('b', None, None, 'double')
-            ]))])
-    actual = parser.Parse(source, "my_file.mojom")
-    self.assertEquals(actual, expected)
-
-  def testUnionWithOrdinals(self):
-    """Test that ordinals are assigned to fields."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          int32 a @10;
-          double b @30;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Union(
-          'MyUnion',
-          None,
-          ast.UnionBody([
-            ast.UnionField('a', None, ast.Ordinal(10), 'int32'),
-            ast.UnionField('b', None, ast.Ordinal(30), 'double')
-            ]))])
-    actual = parser.Parse(source, "my_file.mojom")
-    self.assertEquals(actual, expected)
-
-  def testUnionWithStructMembers(self):
-    """Test that struct members are accepted."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          SomeStruct s;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Union(
-          'MyUnion',
-          None,
-          ast.UnionBody([
-            ast.UnionField('s', None, None, 'SomeStruct')
-            ]))])
-    actual = parser.Parse(source, "my_file.mojom")
-    self.assertEquals(actual, expected)
-
-  def testUnionWithArrayMember(self):
-    """Test that array members are accepted."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          array<int32> a;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Union(
-          'MyUnion',
-          None,
-          ast.UnionBody([
-            ast.UnionField('a', None, None, 'int32[]')
-            ]))])
-    actual = parser.Parse(source, "my_file.mojom")
-    self.assertEquals(actual, expected)
-
-  def testUnionWithMapMember(self):
-    """Test that map members are accepted."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          map<int32, string> m;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Union(
-          'MyUnion',
-          None,
-          ast.UnionBody([
-            ast.UnionField('m', None, None, 'string{int32}')
-            ]))])
-    actual = parser.Parse(source, "my_file.mojom")
-    self.assertEquals(actual, expected)
-
-  def testUnionDisallowNestedStruct(self):
-    """Tests that structs cannot be nested in unions."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          struct MyStruct {
-            int32 a;
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected 'struct':\n"
-        r" *struct MyStruct {$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testUnionDisallowNestedInterfaces(self):
-    """Tests that interfaces cannot be nested in unions."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          interface MyInterface {
-            MyMethod(int32 a);
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected 'interface':\n"
-        r" *interface MyInterface {$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testUnionDisallowNestedUnion(self):
-    """Tests that unions cannot be nested in unions."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          union MyOtherUnion {
-            int32 a;
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected 'union':\n"
-        r" *union MyOtherUnion {$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testUnionDisallowNestedEnum(self):
-    """Tests that enums cannot be nested in unions."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          enum MyEnum {
-            A,
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected 'enum':\n"
-        r" *enum MyEnum {$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testValidAssociatedKinds(self):
-    """Tests parsing associated interfaces and requests."""
-    source1 = """\
-        struct MyStruct {
-          associated MyInterface a;
-          associated MyInterface& b;
-          associated MyInterface? c;
-          associated MyInterface&? d;
-        };
-        """
-    expected1 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a', None, None,'asso<MyInterface>', None),
-                 ast.StructField('b', None, None,'asso<MyInterface&>', None),
-                 ast.StructField('c', None, None,'asso<MyInterface>?', None),
-                 ast.StructField('d', None, None,'asso<MyInterface&>?',
-                                 None)]))])
-    self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1)
-
-    source2 = """\
-        interface MyInterface {
-          MyMethod(associated A a) =>(associated B& b);
-        };"""
-    expected2 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Interface(
-            'MyInterface',
-            None,
-            ast.InterfaceBody(
-                ast.Method(
-                    'MyMethod',
-                    None,
-                    None,
-                    ast.ParameterList(
-                        ast.Parameter('a', None, None, 'asso<A>')),
-                    ast.ParameterList(
-                        ast.Parameter('b', None, None, 'asso<B&>')))))])
-    self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2)
-
-  def testInvalidAssociatedKinds(self):
-    """Tests that invalid associated interfaces and requests are correctly
-    detected."""
-    source1 = """\
-        struct MyStruct {
-          associated associated SomeInterface a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'associated':\n"
-            r" *associated associated SomeInterface a;$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        struct MyStruct {
-          associated handle a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'handle':\n"
-            r" *associated handle a;$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        struct MyStruct {
-          associated? MyInterface& a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '\?':\n"
-            r" *associated\? MyInterface& a;$"):
-      parser.Parse(source3, "my_file.mojom")
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/run_parser.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/run_parser.py
deleted file mode 100755
index b160de6..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/run_parser.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Simple testing utility to just run the mojom parser."""
-
-
-import os.path
-import sys
-
-sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                                os.path.pardir, os.path.pardir))
-
-from mojom.parse.parser import Parse, ParseError
-
-
-def main(argv):
-  if len(argv) < 2:
-    print "usage: %s filename" % argv[0]
-    return 0
-
-  for filename in argv[1:]:
-    with open(filename) as f:
-      print "%s:" % filename
-      try:
-        print Parse(f.read(), filename)
-      except ParseError, e:
-        print e
-        return 1
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/run_translate.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/run_translate.py
deleted file mode 100755
index 899d40e..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/run_translate.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Simple testing utility to just run the mojom translate stage."""
-
-
-import os.path
-import sys
-
-sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                                os.path.pardir, os.path.pardir))
-
-from mojom.parse.parser import Parse
-from mojom.parse.translate import Translate
-
-
-def main(argv):
-  if len(argv) < 2:
-    print "usage: %s filename" % sys.argv[0]
-    return 1
-
-  for filename in argv[1:]:
-    with open(filename) as f:
-      print "%s:" % filename
-      print Translate(Parse(f.read(), filename),
-                      os.path.splitext(os.path.basename(filename))[0])
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/translate_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/translate_unittest.py
deleted file mode 100644
index 2520332..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/translate_unittest.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-from mojom.parse import ast
-from mojom.parse import translate
-
-
-class TranslateTest(unittest.TestCase):
-  """Tests |parser.Parse()|."""
-
-  def testSimpleArray(self):
-    """Tests a simple int32[]."""
-    # pylint: disable=W0212
-    self.assertEquals(translate._MapKind("int32[]"), "a:i32")
-
-  def testAssociativeArray(self):
-    """Tests a simple uint8{string}."""
-    # pylint: disable=W0212
-    self.assertEquals(translate._MapKind("uint8{string}"), "m[s][u8]")
-
-  def testLeftToRightAssociativeArray(self):
-    """Makes sure that parsing is done from right to left on the internal kinds
-       in the presence of an associative array."""
-    # pylint: disable=W0212
-    self.assertEquals(translate._MapKind("uint8[]{string}"), "m[s][a:u8]")
-
-  def testTranslateSimpleUnions(self):
-    """Makes sure that a simple union is translated correctly."""
-    tree = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Union("SomeUnion", None, ast.UnionBody(
-          [ast.UnionField("a", None, None, "int32"),
-           ast.UnionField("b", None, None, "string")]))])
-    expected = [{
-      "name": "SomeUnion",
-      "fields": [{"kind": "i32", "name": "a"},
-                 {"kind": "s", "name": "b"}]}]
-    actual = translate.Translate(tree, "mojom_tree")
-    self.assertEquals(actual["unions"], expected)
-
-  def testMapTreeForTypeRaisesWithDuplicate(self):
-    """Verifies _MapTreeForType() raises when passed two values with the same
-       name."""
-    methods = [ast.Method('dup', None, None, ast.ParameterList(), None),
-               ast.Method('dup', None, None, ast.ParameterList(), None)]
-    self.assertRaises(Exception, translate._MapTreeForType,
-                      (lambda x: x, methods, '', 'scope'))
-
-  def testAssociatedKinds(self):
-    """Tests type spec translation of associated interfaces and requests."""
-    # pylint: disable=W0212
-    self.assertEquals(translate._MapKind("asso<SomeInterface>?"),
-                      "?asso:x:SomeInterface")
-    self.assertEquals(translate._MapKind("asso<SomeInterface&>?"),
-                      "?asso:r:x:SomeInterface")
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/support/__init__.py b/mojo/public/tools/bindings/pylib/mojom_tests/support/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/support/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/support/find_files.py b/mojo/public/tools/bindings/pylib/mojom_tests/support/find_files.py
deleted file mode 100644
index 2a4b17b..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/support/find_files.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import fnmatch
-from os import walk
-from os.path import join
-import sys
-
-
-def FindFiles(top, pattern, **kwargs):
-  """Finds files under |top| matching the glob pattern |pattern|, returning a
-  list of paths."""
-  matches = []
-  for dirpath, _, filenames in walk(top, **kwargs):
-    for filename in fnmatch.filter(filenames, pattern):
-      matches.append(join(dirpath, filename))
-  return matches
-
-
-def main(argv):
-  if len(argv) != 3:
-    print "usage: %s path pattern" % argv[0]
-    return 1
-
-  for filename in FindFiles(argv[1], argv[2]):
-    print filename
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/support/run_bindings_generator.py b/mojo/public/tools/bindings/pylib/mojom_tests/support/run_bindings_generator.py
deleted file mode 100644
index 20ef461..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/support/run_bindings_generator.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os.path
-from subprocess import check_call
-import sys
-
-
-def RunBindingsGenerator(out_dir, root_dir, mojom_file, extra_flags=None):
-  out_dir = os.path.abspath(out_dir)
-  root_dir = os.path.abspath(root_dir)
-  mojom_file = os.path.abspath(mojom_file)
-
-  # The mojom file should be under the root directory somewhere.
-  assert mojom_file.startswith(root_dir)
-  mojom_reldir = os.path.dirname(os.path.relpath(mojom_file, root_dir))
-
-  # TODO(vtl): Abstract out the "main" functions, so that we can just import
-  # the bindings generator (which would be more portable and easier to use in
-  # tests).
-  this_dir = os.path.dirname(os.path.abspath(__file__))
-  # We're in src/mojo/public/tools/bindings/pylib/mojom_tests/support;
-  # mojom_bindings_generator.py is in .../bindings.
-  bindings_generator = os.path.join(this_dir, os.pardir, os.pardir, os.pardir,
-                                    "mojom_bindings_generator.py")
-
-  args = ["python", bindings_generator,
-          "-o", os.path.join(out_dir, mojom_reldir)]
-  if extra_flags:
-    args.extend(extra_flags)
-  args.append(mojom_file)
-
-  check_call(args)
-
-
-def main(argv):
-  if len(argv) < 4:
-    print "usage: %s out_dir root_dir mojom_file [extra_flags]" % argv[0]
-    return 1
-
-  RunBindingsGenerator(argv[1], argv[2], argv[3], extra_flags=argv[4:])
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/mojo/public/tools/chrome_ipc/generate_mojom.py b/mojo/public/tools/chrome_ipc/generate_mojom.py
deleted file mode 100755
index 04e933b..0000000
--- a/mojo/public/tools/chrome_ipc/generate_mojom.py
+++ /dev/null
@@ -1,453 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A generator of mojom interfaces and typemaps from Chrome IPC messages.
-
-For example,
-generate_mojom.py content/common/file_utilities_messages.h
-    --output_mojom=content/common/file_utilities.mojom
-    --output_typemap=content/common/file_utilities.typemap
-"""
-
-import argparse
-import logging
-import os
-import re
-import subprocess
-import sys
-
-_MESSAGE_PATTERN = re.compile(
-    r'(?:\n|^)IPC_(SYNC_)?MESSAGE_(ROUTED|CONTROL)(\d_)?(\d)')
-_VECTOR_PATTERN = re.compile(r'std::(vector|set)<(.*)>')
-_MAP_PATTERN = re.compile(r'std::map<(.*), *(.*)>')
-_NAMESPACE_PATTERN = re.compile(r'([a-z_]*?)::([A-Z].*)')
-
-_unused_arg_count = 0
-
-
-def _git_grep(pattern, paths_pattern):
-  try:
-    args = ['git', 'grep', '-l', '-e', pattern, '--'] + paths_pattern
-    result = subprocess.check_output(args).strip().splitlines()
-    logging.debug('%s => %s', ' '.join(args), result)
-    return result
-  except subprocess.CalledProcessError:
-    logging.debug('%s => []', ' '.join(args))
-    return []
-
-
-def _git_multigrep(patterns, paths):
-  """Find a list of files that match all of the provided patterns."""
-  if isinstance(paths, str):
-    paths = [paths]
-  if isinstance(patterns, str):
-    patterns = [patterns]
-  for pattern in patterns:
-    # Search only the files that matched previous patterns.
-    paths = _git_grep(pattern, paths)
-    if not paths:
-      return []
-  return paths
-
-
-class Typemap(object):
-
-  def __init__(self, typemap_files):
-    self._typemap_files = typemap_files
-    self._custom_mappings = {}
-    self._new_custom_mappings = {}
-    self._imports = set()
-    self._public_includes = set()
-    self._traits_includes = set()
-    self._enums = set()
-
-  def load_typemaps(self):
-    for typemap in self._typemap_files:
-      self.load_typemap(typemap)
-
-  def load_typemap(self, path):
-    typemap = {}
-    with open(path) as f:
-      content = f.read().replace('=\n', '=')
-    exec content in typemap
-    for mapping in typemap['type_mappings']:
-      mojom, native = mapping.split('=')
-      self._custom_mappings[native] = {'name': mojom,
-                                       'mojom': typemap['mojom'].strip('/')}
-
-  def generate_typemap(self, output_mojom, input_filename, namespace):
-    new_mappings = sorted(self._format_new_mappings(namespace))
-    if not new_mappings:
-      return
-    yield """# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-    yield 'mojom = "//%s"' % output_mojom
-    yield 'public_headers = [%s\n]' % ''.join(
-        '\n  "//%s",' % include for include in sorted(self._public_includes))
-    yield 'traits_headers = [%s\n]' % ''.join(
-        '\n  "//%s",' % include
-        for include in sorted(self._traits_includes.union([os.path.normpath(
-            input_filename)])))
-    yield 'deps = [ "//ipc" ]'
-    yield 'type_mappings = [\n  %s\n]' % '\n  '.join(new_mappings)
-
-  def _format_new_mappings(self, namespace):
-    for native, mojom in self._new_custom_mappings.iteritems():
-      yield '"%s.%s=::%s",' % (namespace, mojom, native)
-
-  def format_new_types(self):
-    for native_type, typename in self._new_custom_mappings.iteritems():
-      if native_type in self._enums:
-        yield '[Native]\nenum %s;\n' % typename
-      else:
-        yield '[Native]\nstruct %s;\n' % typename
-
-  _BUILTINS = {
-      'bool': 'bool',
-      'int': 'int32',
-      'unsigned': 'uint32',
-      'char': 'uint8',
-      'unsigned char': 'uint8',
-      'short': 'int16',
-      'unsigned short': 'uint16',
-      'int8_t': 'int8',
-      'int16_t': 'int16',
-      'int32_t': 'int32',
-      'int64_t': 'int64',
-      'uint8_t': 'uint8',
-      'uint16_t': 'uint16',
-      'uint32_t': 'uint32',
-      'uint64_t': 'uint64',
-      'float': 'float',
-      'double': 'double',
-      'std::string': 'string',
-      'base::string16': 'string',
-      'base::FilePath::StringType': 'string',
-      'base::SharedMemoryHandle': 'handle<shared_memory>',
-      'IPC::PlatformFileForTransit': 'handle',
-      'base::FileDescriptor': 'handle',
-  }
-
-  def lookup_type(self, typename):
-    try:
-      return self._BUILTINS[typename]
-    except KeyError:
-      pass
-
-    vector_match = _VECTOR_PATTERN.search(typename)
-    if vector_match:
-      return 'array<%s>' % self.lookup_type(vector_match.groups()[1].strip())
-    map_match = _MAP_PATTERN.search(typename)
-    if map_match:
-      return 'map<%s, %s>' % tuple(self.lookup_type(t.strip())
-                                   for t in map_match.groups())
-    try:
-      result = self._custom_mappings[typename]['name']
-      mojom = self._custom_mappings[typename].get('mojom', None)
-      if mojom:
-        self._imports.add(mojom)
-      return result
-    except KeyError:
-      pass
-
-    match = _NAMESPACE_PATTERN.match(typename)
-    if match:
-      namespace, name = match.groups()
-    else:
-      namespace = ''
-      name = typename
-    namespace = namespace.replace('::', '.')
-    cpp_name = name
-    name = name.replace('::', '')
-
-    if name.endswith('Params'):
-      try:
-        _, name = name.rsplit('Msg_')
-      except ValueError:
-        try:
-          _, name = name.split('_', 1)
-        except ValueError:
-          pass
-
-    if namespace.endswith('.mojom'):
-      generated_mojom_name = '%s.%s' % (namespace, name)
-    elif not namespace:
-      generated_mojom_name = 'mojom.%s' % name
-    else:
-      generated_mojom_name = '%s.mojom.%s' % (namespace, name)
-
-    self._new_custom_mappings[typename] = name
-    self._add_includes(namespace, cpp_name, typename)
-    generated_mojom_name = name
-    self._custom_mappings[typename] = {'name': generated_mojom_name}
-    return generated_mojom_name
-
-  def _add_includes(self, namespace, name, fullname):
-    name_components = name.split('::')
-    is_enum = False
-    for i in xrange(len(name_components)):
-      subname = '::'.join(name_components[i:])
-      extra_names = name_components[:i] + [subname]
-      patterns = [r'\(struct\|class\|enum\)[A-Z_ ]* %s {' % s
-                  for s in extra_names]
-      if namespace:
-        patterns.extend(r'namespace %s' % namespace_component
-                        for namespace_component in namespace.split('.'))
-      includes = _git_multigrep(patterns, '*.h')
-      if includes:
-        if _git_grep(r'enum[A-Z_ ]* %s {' % subname, includes):
-          self._enums.add(fullname)
-          is_enum = True
-        logging.info('%s => public_headers = %s', fullname, includes)
-        self._public_includes.update(includes)
-        break
-
-    if is_enum:
-      patterns = ['IPC_ENUM_TRAITS[A-Z_]*(%s' % fullname]
-    else:
-      patterns = [r'\(IPC_STRUCT_TRAITS_BEGIN(\|ParamTraits<\)%s' % fullname]
-    includes = _git_multigrep(
-        patterns,
-        ['*messages.h', '*struct_traits.h', 'ipc/ipc_message_utils.h'])
-    if includes:
-      logging.info('%s => traits_headers = %s', fullname, includes)
-      self._traits_includes.update(includes)
-
-  def format_imports(self):
-    for import_name in sorted(self._imports):
-      yield 'import "%s";' % import_name
-    if self._imports:
-      yield ''
-
-
-class Argument(object):
-
-  def __init__(self, typename, name):
-    self.typename = typename.strip()
-    self.name = name.strip().replace('\n', '').replace(' ', '_').lower()
-    if not self.name:
-      global _unused_arg_count
-      self.name = 'unnamed_arg%d' % _unused_arg_count
-      _unused_arg_count += 1
-
-  def format(self, typemaps):
-    return '%s %s' % (typemaps.lookup_type(self.typename), self.name)
-
-
-class Message(object):
-
-  def __init__(self, match, content):
-    self.sync = bool(match[0])
-    self.routed = match[1] == 'ROUTED'
-    self.args = []
-    self.response_args = []
-    if self.sync:
-      num_expected_args = int(match[2][:-1])
-      num_expected_response_args = int(match[3])
-    else:
-      num_expected_args = int(match[3])
-      num_expected_response_args = 0
-    body = content.split(',')
-    name = body[0].strip()
-    try:
-      self.group, self.name = name.split('Msg_')
-    except ValueError:
-      try:
-        self.group, self.name = name.split('_')
-      except ValueError:
-        self.group = 'UnnamedInterface'
-        self.name = name
-    self.group = '%s%s' % (self.group, match[1].title())
-    args = list(self.parse_args(','.join(body[1:])))
-    if len(args) != num_expected_args + num_expected_response_args:
-      raise Exception('Incorrect number of args parsed for %s' % (name))
-    self.args = args[:num_expected_args]
-    self.response_args = args[num_expected_args:]
-
-  def parse_args(self, args_str):
-    args_str = args_str.strip()
-    if not args_str:
-      return
-    looking_for_type = False
-    type_start = 0
-    comment_start = None
-    comment_end = None
-    type_end = None
-    angle_bracket_nesting = 0
-    i = 0
-    while i < len(args_str):
-      if args_str[i] == ',' and not angle_bracket_nesting:
-        looking_for_type = True
-        if type_end is None:
-          type_end = i
-      elif args_str[i:i + 2] == '/*':
-        if type_end is None:
-          type_end = i
-        comment_start = i + 2
-        comment_end = args_str.index('*/', i + 2)
-        i = comment_end + 1
-      elif args_str[i:i + 2] == '//':
-        if type_end is None:
-          type_end = i
-        comment_start = i + 2
-        comment_end = args_str.index('\n', i + 2)
-        i = comment_end
-      elif args_str[i] == '<':
-        angle_bracket_nesting += 1
-      elif args_str[i] == '>':
-        angle_bracket_nesting -= 1
-      elif looking_for_type and args_str[i].isalpha():
-        if comment_start is not None and comment_end is not None:
-          yield Argument(args_str[type_start:type_end],
-                         args_str[comment_start:comment_end])
-        else:
-          yield Argument(args_str[type_start:type_end], '')
-        type_start = i
-        type_end = None
-        comment_start = None
-        comment_end = None
-        looking_for_type = False
-      i += 1
-    if comment_start is not None and comment_end is not None:
-      yield Argument(args_str[type_start:type_end],
-                     args_str[comment_start:comment_end])
-    else:
-      yield Argument(args_str[type_start:type_end], '')
-
-  def format(self, typemaps):
-    result = '%s(%s)' % (self.name, ','.join('\n      %s' % arg.format(typemaps)
-                                             for arg in self.args))
-    if self.sync:
-      result += ' => (%s)' % (',\n'.join('\n      %s' % arg.format(typemaps)
-                                         for arg in self.response_args))
-      result = '[Sync]\n  %s' % result
-    return '%s;' % result
-
-
-class Generator(object):
-
-  def __init__(self, input_name, output_namespace):
-    self._input_name = input_name
-    with open(input_name) as f:
-      self._content = f.read()
-    self._namespace = output_namespace
-    self._typemaps = Typemap(self._find_typemaps())
-    self._interface_definitions = []
-
-  def _get_messages(self):
-    for m in _MESSAGE_PATTERN.finditer(self._content):
-      i = m.end() + 1
-      while i < len(self._content):
-        if self._content[i:i + 2] == '/*':
-          i = self._content.index('*/', i + 2) + 1
-        elif self._content[i] == ')':
-          yield Message(m.groups(), self._content[m.end() + 1:i])
-          break
-        i += 1
-
-  def _extract_messages(self):
-    grouped_messages = {}
-    for m in self._get_messages():
-      grouped_messages.setdefault(m.group, []).append(m)
-    self._typemaps.load_typemaps()
-    for interface, messages in grouped_messages.iteritems():
-      self._interface_definitions.append(self._format_interface(interface,
-                                                                messages))
-
-  def count(self):
-    grouped_messages = {}
-    for m in self._get_messages():
-      grouped_messages.setdefault(m.group, []).append(m)
-    return sum(len(messages) for messages in grouped_messages.values())
-
-  def generate_mojom(self):
-    self._extract_messages()
-    if not self._interface_definitions:
-      return
-    yield """// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-"""
-    yield 'module %s;\n' % self._namespace
-    for import_statement in self._typemaps.format_imports():
-      yield import_statement
-    for typemap in self._typemaps.format_new_types():
-      yield typemap
-    for interface in self._interface_definitions:
-      yield interface
-      yield ''
-
-  def generate_typemap(self, output_mojom, input_filename):
-    return '\n'.join(self._typemaps.generate_typemap(
-        output_mojom, input_filename, self._namespace)).strip()
-
-  @staticmethod
-  def _find_typemaps():
-    return subprocess.check_output(
-        ['git', 'ls-files', '*.typemap']).strip().split('\n')
-
-  def _format_interface(self, name, messages):
-    return 'interface %s {\n  %s\n};' % (name,
-                                         '\n  '.join(m.format(self._typemaps)
-                                                     for m in messages))
-
-
-def parse_args():
-  parser = argparse.ArgumentParser(description=__doc__)
-  parser.add_argument('input', help='input messages.h file')
-  parser.add_argument(
-      '--output_namespace',
-      default='mojom',
-      help='the mojom module name to use in the generated mojom file '
-      '(default: %(default)s)')
-  parser.add_argument('--output_mojom', help='output mojom path')
-  parser.add_argument('--output_typemap', help='output typemap path')
-  parser.add_argument(
-      '--count',
-      action='store_true',
-      default=False,
-      help='count the number of messages in the input instead of generating '
-      'a mojom file')
-  parser.add_argument('-v',
-                      '--verbose',
-                      action='store_true',
-                      help='enable logging')
-  parser.add_argument('-vv', action='store_true', help='enable debug logging')
-  return parser.parse_args()
-
-
-def main():
-  args = parse_args()
-  if args.vv:
-    logging.basicConfig(level=logging.DEBUG)
-  elif args.verbose:
-    logging.basicConfig(level=logging.INFO)
-  generator = Generator(args.input, args.output_namespace)
-  if args.count:
-    count = generator.count()
-    if count:
-      print '%d %s' % (generator.count(), args.input)
-    return
-  mojom = '\n'.join(generator.generate_mojom()).strip()
-  if not mojom:
-    return
-  typemap = generator.generate_typemap(args.output_mojom, args.input)
-
-  if args.output_mojom:
-    with open(args.output_mojom, 'w') as f:
-      f.write(mojom)
-  else:
-    print mojom
-  if typemap:
-    if args.output_typemap:
-      with open(args.output_typemap, 'w') as f:
-        f.write(typemap)
-    else:
-      print typemap
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/public/tools/gn/zip.py b/mojo/public/tools/gn/zip.py
deleted file mode 100755
index adc9cb1..0000000
--- a/mojo/public/tools/gn/zip.py
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-# TODO(brettw) bug 582594: merge this with build/android/gn/zip.py and update
-# callers to use the existing template rather than invoking this directly.
-
-"""Archives a set of files.
-"""
-
-import optparse
-import os
-import sys
-import zipfile
-
-sys.path.append(os.path.join(os.path.dirname(__file__),
-                             os.pardir, os.pardir, os.pardir, os.pardir,
-                             "build"))
-import gn_helpers
-
-sys.path.append(os.path.join(os.path.dirname(__file__),
-                             os.pardir, os.pardir, os.pardir, os.pardir,
-                             'build', 'android', 'gyp'))
-from util import build_utils
-
-
-def DoZip(inputs, link_inputs, zip_inputs, output, base_dir):
-  files = []
-  with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as outfile:
-    for f in inputs:
-      file_name = os.path.relpath(f, base_dir)
-      files.append(file_name)
-      build_utils.AddToZipHermetic(outfile, file_name, f)
-    for f in link_inputs:
-      realf = os.path.realpath(f)  # Resolve symlinks.
-      file_name = os.path.relpath(realf, base_dir)
-      files.append(file_name)
-      build_utils.AddToZipHermetic(outfile, file_name, realf)
-    for zf_name in zip_inputs:
-      with zipfile.ZipFile(zf_name, 'r') as zf:
-        for f in zf.namelist():
-          if f not in files:
-            files.append(f)
-            build_utils.AddToZipHermetic(outfile, f, data=zf.read(f))
-
-
-def main():
-  parser = optparse.OptionParser()
-
-  parser.add_option('--inputs',
-      help='GN format list of files to archive.')
-  parser.add_option('--link-inputs',
-      help='GN-format list of files to archive. Symbolic links are resolved.')
-  parser.add_option('--zip-inputs',
-      help='GN-format list of zip files to re-archive.')
-  parser.add_option('--output', help='Path to output archive.')
-  parser.add_option('--base-dir',
-                    help='If provided, the paths in the archive will be '
-                    'relative to this directory', default='.')
-
-  options, _ = parser.parse_args()
-
-  inputs = []
-  if (options.inputs):
-    parser = gn_helpers.GNValueParser(options.inputs)
-    inputs = parser.ParseList()
-
-  link_inputs = []
-  if options.link_inputs:
-    parser = gn_helpers.GNValueParser(options.link_inputs)
-    link_inputs = parser.ParseList()
-
-  zip_inputs = []
-  if options.zip_inputs:
-    parser = gn_helpers.GNValueParser(options.zip_inputs)
-    zip_inputs = parser.ParseList()
-
-  output = options.output
-  base_dir = options.base_dir
-
-  DoZip(inputs, link_inputs, zip_inputs, output, base_dir)
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/soong/jni_generator_helper.sh b/soong/jni_generator_helper.sh
deleted file mode 100755
index d610801..0000000
--- a/soong/jni_generator_helper.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# Generates jni.
-
-set -e
-
-args=()
-files=()
-
-jni_generator=''
-
-for arg in "$@"; do
-  case "${arg}" in
-    --jni_generator=*)
-      jni_generator=${arg#'--jni_generator='}
-      ;;
-    --*)
-      args=("${args[@]}" "${arg}")
-      ;;
-    *)
-      files=("${files[@]}" "${arg}")
-      ;;
-  esac
-done
-
-for file in "${files[@]}"; do
-  "${jni_generator}" "${args[@]}" --input_file="${file}"
-done
diff --git a/soong/mojom_source_generator.sh b/soong/mojom_source_generator.sh
deleted file mode 100755
index 118d513..0000000
--- a/soong/mojom_source_generator.sh
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# Generates mojo sources given a list of .mojom files and args.
-# Usage: $0 --mojom_bindings_generator=<abs_path> --package=<package_directory>
-#            --output_dir=<output_directory>
-#            [<extra_args_for_bindings_generator>] <list_of_mojom_files>
-
-set -e
-
-args=()
-files=()
-
-mojom_bindings_generator=""
-package=""
-output_dir=""
-generators=""
-private_mojo_root="$(pwd)/external/libmojo"
-
-# Given a path to directory or file, return the absolute path.
-get_abs_path() {
-  if [[ -d $1 ]] ; then
-    cd "$1"
-    filename=""
-  else
-    filepath=$1
-    dir="${filepath%/*}"
-    cd "${dir}"
-    filename="${filepath#${dir}/}"
-  fi
-  absdir=`pwd`
-  cd - > /dev/null
-  echo "${absdir}/${filename}"
-}
-
-for arg in "$@"; do
-  case "${arg}" in
-    --mojom_bindings_generator=*)
-      mojom_bindings_generator="${arg#'--mojom_bindings_generator='}"
-      mojom_bindings_generator="$(get_abs_path ${mojom_bindings_generator})"
-      ;;
-    --package=*)
-      package="${arg#'--package='}"
-      ;;
-    --output_dir=*)
-      output_dir="${arg#'--output_dir='}"
-      output_dir="$(get_abs_path ${output_dir})"
-      ;;
-    --typemap=*)
-      typemap="${arg#'--typemap='}"
-      typemap="$(get_abs_path ${typemap})"
-      args=("${args[@]}" "--typemap=${typemap}")
-      ;;
-    --bytecode_path=*)
-      bytecode_path="${arg#'--bytecode_path='}"
-      bytecode_path="$(get_abs_path ${bytecode_path})"
-      ;;
-    --generators=*)
-      generators="${arg#'--generators='}"
-      ;;
-    --*)
-      args=("${args[@]}" "${arg}")
-      ;;
-    *)
-      files=("${files[@]}" "$(get_abs_path ${arg})")
-      ;;
-  esac
-done
-
-cd "${package}"
-"${mojom_bindings_generator}" --use_bundled_pylibs precompile \
-    -o "${output_dir}"
-
-for file in "${files[@]}"; do
-  # Java source generations depends on zipfile that assumes the output directory
-  # already exists. So, we need to create the directory beforehand.
-  rel_path="${file#`pwd`/}"
-  rel_dir="${rel_path%/*}"
-
-  mkdir -p "${output_dir}/${rel_dir}"
-
-  # The calls to mojom_bindings_generator below uses -I option to include the
-  # libmojo root directory as part of searchable directory for imports. With
-  # this, we can have a mojo file located in some arbitrary directories that
-  # imports a mojo file under external/libmojo.
-  "${mojom_bindings_generator}" --use_bundled_pylibs generate \
-      -o "${output_dir}" "${args[@]}" \
-      --bytecode_path="${bytecode_path}" \
-      -I "${private_mojo_root}:${private_mojo_root}" \
-      --generators=${generators} "${file}"
-  if [[ "${generators}" =~ .*c\+\+.* ]] ; then
-    "${mojom_bindings_generator}" --use_bundled_pylibs generate \
-        -o "${output_dir}" \
-        --generate_non_variant_code "${args[@]}" \
-        -I "${private_mojo_root}:${private_mojo_root}" \
-        --bytecode_path="${bytecode_path}" --generators=${generators} \
-        "${file}"
-  fi
-  if [[ "${generators}" =~ .*java.* ]] ; then
-    unzip -qo -d "${output_dir}"/src "${output_dir}/${rel_path}".srcjar
-  fi
-done
diff --git a/third_party/catapult/LICENSE b/third_party/catapult/LICENSE
deleted file mode 100644
index c992fe4..0000000
--- a/third_party/catapult/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright 2015 The Chromium Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
-  list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.
-
-* Neither the name of catapult nor the names of its
-  contributors may be used to endorse or promote products derived from
-  this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
diff --git a/third_party/catapult/devil/PRESUBMIT.py b/third_party/catapult/devil/PRESUBMIT.py
deleted file mode 100644
index 289a5c6..0000000
--- a/third_party/catapult/devil/PRESUBMIT.py
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright 2015 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.
-
-"""Presubmit script for devil.
-
-See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
-details on the presubmit API built into depot_tools.
-"""
-
-
-def _RunPylint(input_api, output_api):
-  return input_api.RunTests(input_api.canned_checks.RunPylint(
-      input_api, output_api, pylintrc='pylintrc'))
-
-
-def _RunUnitTests(input_api, output_api):
-  def J(*dirs):
-    """Returns a path relative to presubmit directory."""
-    return input_api.os_path.join(
-        input_api.PresubmitLocalPath(), 'devil', *dirs)
-
-  test_env = dict(input_api.environ)
-  test_env.update({
-    'PYTHONDONTWRITEBYTECODE': '1',
-    'PYTHONPATH': ':'.join([J(), J('..')]),
-  })
-
-  message_type = (output_api.PresubmitError if input_api.is_committing
-                  else output_api.PresubmitPromptWarning)
-
-  return input_api.RunTests([
-      input_api.Command(
-          name='devil/bin/run_py_tests',
-          cmd=[
-            input_api.os_path.join(
-                input_api.PresubmitLocalPath(), 'bin', 'run_py_tests')],
-          kwargs={'env': test_env},
-          message=message_type)])
-
-
-def _EnsureNoPylibUse(input_api, output_api):
-  def other_python_files(f):
-    this_presubmit_file = input_api.os_path.join(
-        input_api.PresubmitLocalPath(), 'PRESUBMIT.py')
-    return (f.LocalPath().endswith('.py')
-            and not f.AbsoluteLocalPath() == this_presubmit_file)
-
-  changed_files = input_api.AffectedSourceFiles(other_python_files)
-  import_error_re = input_api.re.compile(
-      r'(from pylib.* import)|(import pylib)')
-
-  errors = []
-  for f in changed_files:
-    errors.extend(
-        '%s:%d' % (f.LocalPath(), line_number)
-        for line_number, line_text in f.ChangedContents()
-        if import_error_re.search(line_text))
-
-  if errors:
-    return [output_api.PresubmitError(
-        'pylib modules should not be imported from devil modules.',
-        items=errors)]
-  return []
-
-
-def CommonChecks(input_api, output_api):
-  output = []
-  output += _RunPylint(input_api, output_api)
-  output += _RunUnitTests(input_api, output_api)
-  output += _EnsureNoPylibUse(input_api, output_api)
-  return output
-
-
-def CheckChangeOnUpload(input_api, output_api):
-  return CommonChecks(input_api, output_api)
-
-
-def CheckChangeOnCommit(input_api, output_api):
-  return CommonChecks(input_api, output_api)
-
diff --git a/third_party/catapult/devil/README.md b/third_party/catapult/devil/README.md
deleted file mode 100644
index 852ac37..0000000
--- a/third_party/catapult/devil/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-<!-- Copyright 2015 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.
--->
-## devil
-
-😈
-
-devil is a library used by the Chromium developers to interact with Android
-devices. It currently supports SDK level 16 and above.
-
-## Interfaces
-
-devil provides python APIs:
-  - [`devil.android.adb_wrapper`](docs/adb_wrapper.md) provides a thin wrapper
-    around the adb binary. Most functions and methods have direct analogues on
-    the adb command-line.
-  - [`devil.android.device_utils`](docs/device_utils.md) provides higher-level
-    functionality built on top of `adb_wrapper`. **This is the primary
-    mechanism through which chromium's scripts interact with devices.**
-
-## Utilities
-
-devil also provides command-line utilities:
- - [`devil/utils/markdown.py`](docs/markdown.md) generated markdown
-   documentation for python modules.
-
-## Constraints and Caveats
-
-devil is used with python 2.7. Its compatibility with python 3 has not been
-tested, and neither achieving nor maintaining said compatibility is currently
-a priority.
-
-## Contributing
-
-Please see the [contributor's guide](https://github.com/catapult-project/catapult/blob/master/CONTRIBUTING.md).
-
diff --git a/third_party/catapult/devil/bin/generate_md_docs b/third_party/catapult/devil/bin/generate_md_docs
deleted file mode 100755
index 634e14a..0000000
--- a/third_party/catapult/devil/bin/generate_md_docs
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-_DEVIL_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..'))
-_DEVIL_URL = (
-    'https://github.com/catapult-project/catapult/blob/master/devil/')
-
-sys.path.append(_DEVIL_PATH)
-from devil.utils import cmd_helper
-
-_FILES_TO_DOC = {
-  'devil/android/sdk/adb_wrapper.py': 'docs/adb_wrapper.md',
-  'devil/android/device_utils.py': 'docs/device_utils.md',
-  'devil/utils/markdown.py': 'docs/markdown.md',
-}
-
-_MARKDOWN_SCRIPT = os.path.join(_DEVIL_PATH, 'devil', 'utils', 'markdown.py')
-
-def main():
-  failed = False
-  for k, v in _FILES_TO_DOC.iteritems():
-    module_path = os.path.join(_DEVIL_PATH, k)
-    module_link = _DEVIL_URL + k
-    doc_path = os.path.join(_DEVIL_PATH, v)
-
-    status, stdout = cmd_helper.GetCmdStatusAndOutput(
-        [sys.executable, _MARKDOWN_SCRIPT, module_path,
-         '--module-link', module_link])
-    if status:
-      logging.error('Failed to update doc for %s' % module_path)
-      failed = True
-    else:
-      with open(doc_path, 'w') as doc_file:
-        doc_file.write(stdout)
-
-  return 1 if failed else 0
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/bin/run_py_devicetests b/third_party/catapult/devil/bin/run_py_devicetests
deleted file mode 100755
index 656bedf..0000000
--- a/third_party/catapult/devil/bin/run_py_devicetests
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-_CATAPULT_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..'))
-_DEVIL_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..'))
-_TYP_PATH = os.path.abspath(os.path.join(_CATAPULT_PATH, 'third_party', 'typ'))
-
-sys.path.append(_TYP_PATH)
-import typ
-
-sys.path.append(_DEVIL_PATH)
-from devil.android import device_test_case
-
-
-def main():
-  runner = typ.Runner()
-  runner.setup_fn = device_test_case.PrepareDevices
-  return runner.main(
-      coverage_source=[_DEVIL_PATH],
-      jobs=1,
-      suffixes=['*_devicetest.py'],
-      top_level_dir=_DEVIL_PATH)
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/bin/run_py_tests b/third_party/catapult/devil/bin/run_py_tests
deleted file mode 100755
index 44ec61e..0000000
--- a/third_party/catapult/devil/bin/run_py_tests
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-_CATAPULT_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..'))
-_DEVIL_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..'))
-
-sys.path.append(_CATAPULT_PATH)
-from catapult_build import run_with_typ
-
-
-def main():
-  return run_with_typ.Run(top_level_dir=_DEVIL_PATH)
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/__init__.py b/third_party/catapult/devil/devil/__init__.py
deleted file mode 100644
index 7de59c9..0000000
--- a/third_party/catapult/devil/devil/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright 2015 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.
-
-import logging
-
-logging.getLogger('devil').addHandler(logging.NullHandler())
diff --git a/third_party/catapult/devil/devil/android/__init__.py b/third_party/catapult/devil/devil/android/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/third_party/catapult/devil/devil/android/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2015 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.
diff --git a/third_party/catapult/devil/devil/android/apk_helper.py b/third_party/catapult/devil/devil/android/apk_helper.py
deleted file mode 100644
index 1a9b8c5..0000000
--- a/third_party/catapult/devil/devil/android/apk_helper.py
+++ /dev/null
@@ -1,164 +0,0 @@
-# Copyright (c) 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.
-
-"""Module containing utilities for apk packages."""
-
-import itertools
-import re
-
-from devil import base_error
-from devil.android.sdk import aapt
-
-
-_MANIFEST_ATTRIBUTE_RE = re.compile(
-    r'\s*A: ([^\(\)= ]*)(?:\([^\(\)= ]*\))?='
-    r'(?:"(.*)" \(Raw: .*\)|\(type.*?\)(.*))$')
-_MANIFEST_ELEMENT_RE = re.compile(r'\s*(?:E|N): (\S*) .*$')
-
-
-def GetPackageName(apk_path):
-  """Returns the package name of the apk."""
-  return ApkHelper(apk_path).GetPackageName()
-
-
-# TODO(jbudorick): Deprecate and remove this function once callers have been
-# converted to ApkHelper.GetInstrumentationName
-def GetInstrumentationName(apk_path):
-  """Returns the name of the Instrumentation in the apk."""
-  return ApkHelper(apk_path).GetInstrumentationName()
-
-
-def ToHelper(path_or_helper):
-  """Creates an ApkHelper unless one is already given."""
-  if isinstance(path_or_helper, basestring):
-    return ApkHelper(path_or_helper)
-  return path_or_helper
-
-
-def _ParseManifestFromApk(apk_path):
-  aapt_output = aapt.Dump('xmltree', apk_path, 'AndroidManifest.xml')
-
-  parsed_manifest = {}
-  node_stack = [parsed_manifest]
-  indent = '  '
-
-  for line in aapt_output[1:]:
-    if len(line) == 0:
-      continue
-
-    indent_depth = 0
-    while line[(len(indent) * indent_depth):].startswith(indent):
-      indent_depth += 1
-
-    node_stack = node_stack[:indent_depth]
-    node = node_stack[-1]
-
-    m = _MANIFEST_ELEMENT_RE.match(line[len(indent) * indent_depth:])
-    if m:
-      manifest_key = m.group(1)
-      if manifest_key in node:
-        node[manifest_key] += [{}]
-      else:
-        node[manifest_key] = [{}]
-      node_stack += [node[manifest_key][-1]]
-      continue
-
-    m = _MANIFEST_ATTRIBUTE_RE.match(line[len(indent) * indent_depth:])
-    if m:
-      manifest_key = m.group(1)
-      if manifest_key in node:
-        raise base_error.BaseError(
-            "A single attribute should have one key and one value")
-      else:
-        node[manifest_key] = m.group(2) or m.group(3)
-      continue
-
-  return parsed_manifest
-
-
-class ApkHelper(object):
-
-  def __init__(self, path):
-    self._apk_path = path
-    self._manifest = None
-
-  @property
-  def path(self):
-    return self._apk_path
-
-  def GetActivityName(self):
-    """Returns the name of the Activity in the apk."""
-    manifest_info = self._GetManifest()
-    try:
-      activity = (
-          manifest_info['manifest'][0]['application'][0]['activity'][0]
-              ['android:name'])
-    except KeyError:
-      return None
-    if '.' not in activity:
-      activity = '%s.%s' % (self.GetPackageName(), activity)
-    elif activity.startswith('.'):
-      activity = '%s%s' % (self.GetPackageName(), activity)
-    return activity
-
-  def GetInstrumentationName(
-      self, default='android.test.InstrumentationTestRunner'):
-    """Returns the name of the Instrumentation in the apk."""
-    all_instrumentations = self.GetAllInstrumentations(default=default)
-    if len(all_instrumentations) != 1:
-      raise base_error.BaseError(
-          'There is more than one instrumentation. Expected one.')
-    else:
-      return all_instrumentations[0]['android:name']
-
-  def GetAllInstrumentations(
-      self, default='android.test.InstrumentationTestRunner'):
-    """Returns a list of all Instrumentations in the apk."""
-    try:
-      return self._GetManifest()['manifest'][0]['instrumentation']
-    except KeyError:
-      return [{'android:name': default}]
-
-  def GetPackageName(self):
-    """Returns the package name of the apk."""
-    manifest_info = self._GetManifest()
-    try:
-      return manifest_info['manifest'][0]['package']
-    except KeyError:
-      raise Exception('Failed to determine package name of %s' % self._apk_path)
-
-  def GetPermissions(self):
-    manifest_info = self._GetManifest()
-    try:
-      return [p['android:name'] for
-              p in manifest_info['manifest'][0]['uses-permission']]
-    except KeyError:
-      return []
-
-  def GetSplitName(self):
-    """Returns the name of the split of the apk."""
-    manifest_info = self._GetManifest()
-    try:
-      return manifest_info['manifest'][0]['split']
-    except KeyError:
-      return None
-
-  def HasIsolatedProcesses(self):
-    """Returns whether any services exist that use isolatedProcess=true."""
-    manifest_info = self._GetManifest()
-    try:
-      applications = manifest_info['manifest'][0].get('application', [])
-      services = itertools.chain(
-          *(application.get('service', []) for application in applications))
-      return any(
-          int(s.get('android:isolatedProcess', '0'), 0)
-          for s in services)
-    except KeyError:
-      return False
-
-  def _GetManifest(self):
-    if not self._manifest:
-      self._manifest = _ParseManifestFromApk(self._apk_path)
-    return self._manifest
-
diff --git a/third_party/catapult/devil/devil/android/apk_helper_test.py b/third_party/catapult/devil/devil/android/apk_helper_test.py
deleted file mode 100755
index f7d077d..0000000
--- a/third_party/catapult/devil/devil/android/apk_helper_test.py
+++ /dev/null
@@ -1,169 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from devil import base_error
-from devil import devil_env
-from devil.android import apk_helper
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.abc" (Raw: "org.chromium.abc")
-    A: split="random_split" (Raw: "random_split")
-    E: uses-permission (line=2)
-      A: android:name(0x01010003)="android.permission.INTERNET" (Raw: "android.permission.INTERNET")
-    E: uses-permission (line=3)
-      A: android:name(0x01010003)="android.permission.READ_EXTERNAL_STORAGE" (Raw: "android.permission.READ_EXTERNAL_STORAGE")
-    E: uses-permission (line=4)
-      A: android:name(0x01010003)="android.permission.ACCESS_FINE_LOCATION" (Raw: "android.permission.ACCESS_FINE_LOCATION")
-    E: application (line=5)
-      E: activity (line=6)
-        A: android:name(0x01010003)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
-        A: android:exported(0x01010010)=(type 0x12)0xffffffff
-      E: service (line=7)
-        A: android:name(0x01010001)="org.chromium.RandomService" (Raw: "org.chromium.RandomService")
-        A: android:isolatedProcess(0x01010888)=(type 0x12)0xffffffff
-    E: instrumentation (line=8)
-      A: android:label(0x01010001)="abc" (Raw: "abc")
-      A: android:name(0x01010003)="org.chromium.RandomJUnit4TestRunner" (Raw: "org.chromium.RandomJUnit4TestRunner")
-      A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-      A: junit4=(type 0x12)0xffffffff (Raw: "true")
-    E: instrumentation (line=9)
-      A: android:label(0x01010001)="abc" (Raw: "abc")
-      A: android:name(0x01010003)="org.chromium.RandomTestRunner" (Raw: "org.chromium.RandomTestRunner")
-      A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-"""
-
-_NO_ISOLATED_SERVICES = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.abc" (Raw: "org.chromium.abc")
-    E: application (line=5)
-      E: activity (line=6)
-        A: android:name(0x01010003)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
-        A: android:exported(0x01010010)=(type 0x12)0xffffffff
-      E: service (line=7)
-        A: android:name(0x01010001)="org.chromium.RandomService" (Raw: "org.chromium.RandomService")
-"""
-
-_NO_SERVICES = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.abc" (Raw: "org.chromium.abc")
-    E: application (line=5)
-      E: activity (line=6)
-        A: android:name(0x01010003)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
-        A: android:exported(0x01010010)=(type 0x12)0xffffffff
-"""
-
-_NO_APPLICATION = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.abc" (Raw: "org.chromium.abc")
-"""
-
-_SINGLE_INSTRUMENTATION_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.xyz" (Raw: "org.chromium.xyz")
-    E: instrumentation (line=8)
-      A: android:label(0x01010001)="xyz" (Raw: "xyz")
-      A: android:name(0x01010003)="org.chromium.RandomTestRunner" (Raw: "org.chromium.RandomTestRunner")
-      A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-"""
-
-_SINGLE_J4_INSTRUMENTATION_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.xyz" (Raw: "org.chromium.xyz")
-    E: instrumentation (line=8)
-      A: android:label(0x01010001)="xyz" (Raw: "xyz")
-      A: android:name(0x01010003)="org.chromium.RandomJ4TestRunner" (Raw: "org.chromium.RandomJ4TestRunner")
-      A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-      A: junit4=(type 0x12)0xffffffff (Raw: "true")
-"""
-
-
-def _MockAaptDump(manifest_dump):
-  return mock.patch(
-      'devil.android.sdk.aapt.Dump',
-      mock.Mock(side_effect=None, return_value=manifest_dump.split('\n')))
-
-class ApkHelperTest(mock_calls.TestCase):
-
-  def testGetInstrumentationName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      with self.assertRaises(base_error.BaseError):
-        helper.GetInstrumentationName()
-
-  def testGetActivityName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      self.assertEquals(
-          helper.GetActivityName(), 'org.chromium.ActivityName')
-
-  def testGetAllInstrumentations(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      all_instrumentations = helper.GetAllInstrumentations()
-      self.assertEquals(len(all_instrumentations), 2)
-      self.assertEquals(all_instrumentations[0]['android:name'],
-                        'org.chromium.RandomJUnit4TestRunner')
-      self.assertEquals(all_instrumentations[1]['android:name'],
-                        'org.chromium.RandomTestRunner')
-
-  def testGetPackageName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      self.assertEquals(helper.GetPackageName(), 'org.chromium.abc')
-
-  def testGetPermssions(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      all_permissions = helper.GetPermissions()
-      self.assertEquals(len(all_permissions), 3)
-      self.assertTrue('android.permission.INTERNET' in all_permissions)
-      self.assertTrue(
-          'android.permission.READ_EXTERNAL_STORAGE' in all_permissions)
-      self.assertTrue(
-          'android.permission.ACCESS_FINE_LOCATION' in all_permissions)
-
-  def testGetSplitName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      self.assertEquals(helper.GetSplitName(), 'random_split')
-
-  def testHasIsolatedProcesses_noApplication(self):
-    with _MockAaptDump(_NO_APPLICATION):
-      helper = apk_helper.ApkHelper("")
-      self.assertFalse(helper.HasIsolatedProcesses())
-
-  def testHasIsolatedProcesses_noServices(self):
-    with _MockAaptDump(_NO_SERVICES):
-      helper = apk_helper.ApkHelper("")
-      self.assertFalse(helper.HasIsolatedProcesses())
-
-  def testHasIsolatedProcesses_oneNotIsolatedProcess(self):
-    with _MockAaptDump(_NO_ISOLATED_SERVICES):
-      helper = apk_helper.ApkHelper("")
-      self.assertFalse(helper.HasIsolatedProcesses())
-
-  def testHasIsolatedProcesses_oneIsolatedProcess(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      self.assertTrue(helper.HasIsolatedProcesses())
-
-  def testGetSingleInstrumentationName(self):
-    with _MockAaptDump(_SINGLE_INSTRUMENTATION_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      self.assertEquals('org.chromium.RandomTestRunner',
-                        helper.GetInstrumentationName())
-
-  def testGetSingleJUnit4InstrumentationName(self):
-    with _MockAaptDump(_SINGLE_J4_INSTRUMENTATION_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      self.assertEquals('org.chromium.RandomJ4TestRunner',
-                        helper.GetInstrumentationName())
-
diff --git a/third_party/catapult/devil/devil/android/app_ui.py b/third_party/catapult/devil/devil/android/app_ui.py
deleted file mode 100644
index 2b04e8b..0000000
--- a/third_party/catapult/devil/devil/android/app_ui.py
+++ /dev/null
@@ -1,243 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Provides functionality to interact with UI elements of an Android app."""
-
-import collections
-import re
-from xml.etree import ElementTree as element_tree
-
-from devil.android import decorators
-from devil.android import device_temp_file
-from devil.utils import geometry
-from devil.utils import timeout_retry
-
-_DEFAULT_SHORT_TIMEOUT = 10
-_DEFAULT_SHORT_RETRIES = 3
-_DEFAULT_LONG_TIMEOUT = 30
-_DEFAULT_LONG_RETRIES = 0
-
-# Parse rectangle bounds given as: '[left,top][right,bottom]'.
-_RE_BOUNDS = re.compile(
-    r'\[(?P<left>\d+),(?P<top>\d+)\]\[(?P<right>\d+),(?P<bottom>\d+)\]')
-
-
-class _UiNode(object):
-
-  def __init__(self, device, xml_node, package=None):
-    """Object to interact with a UI node from an xml snapshot.
-
-    Note: there is usually no need to call this constructor directly. Instead,
-    use an AppUi object (below) to grab an xml screenshot from a device and
-    find nodes in it.
-
-    Args:
-      device: A device_utils.DeviceUtils instance.
-      xml_node: An ElementTree instance of the node to interact with.
-      package: An optional package name for the app owning this node.
-    """
-    self._device = device
-    self._xml_node = xml_node
-    self._package = package
-
-  def _GetAttribute(self, key):
-    """Get the value of an attribute of this node."""
-    return self._xml_node.attrib.get(key)
-
-  @property
-  def bounds(self):
-    """Get a rectangle with the bounds of this UI node.
-
-    Returns:
-      A geometry.Rectangle instance.
-    """
-    d = _RE_BOUNDS.match(self._GetAttribute('bounds')).groupdict()
-    return geometry.Rectangle.FromDict({k: int(v) for k, v in d.iteritems()})
-
-  def Tap(self, point=None, dp_units=False):
-    """Send a tap event to the UI node.
-
-    Args:
-      point: An optional geometry.Point instance indicating the location to
-        tap, relative to the bounds of the UI node, i.e. (0, 0) taps the
-        top-left corner. If ommited, the center of the node is tapped.
-      dp_units: If True, indicates that the coordinates of the point are given
-        in device-independent pixels; otherwise they are assumed to be "real"
-        pixels. This option has no effect when the point is ommited.
-    """
-    if point is None:
-      point = self.bounds.center
-    else:
-      if dp_units:
-        point = (float(self._device.pixel_density) / 160) * point
-      point += self.bounds.top_left
-
-    x, y = (str(int(v)) for v in point)
-    self._device.RunShellCommand(['input', 'tap', x, y], check_return=True)
-
-  def Dump(self):
-    """Get a brief summary of the child nodes that can be found on this node.
-
-    Returns:
-      A list of lines that can be logged or otherwise printed.
-    """
-    summary = collections.defaultdict(set)
-    for node in self._xml_node.iter():
-      package = node.get('package') or '(no package)'
-      label = node.get('resource-id') or '(no id)'
-      text = node.get('text')
-      if text:
-        label = '%s[%r]' % (label, text)
-      summary[package].add(label)
-    lines = []
-    for package, labels in sorted(summary.iteritems()):
-      lines.append('- %s:' % package)
-      for label in sorted(labels):
-        lines.append('  - %s' % label)
-    return lines
-
-  def __getitem__(self, key):
-    """Retrieve a child of this node by its index.
-
-    Args:
-      key: An integer with the index of the child to retrieve.
-    Returns:
-      A UI node instance of the selected child.
-    Raises:
-      IndexError if the index is out of range.
-    """
-    return type(self)(self._device, self._xml_node[key], package=self._package)
-
-  def _Find(self, **kwargs):
-    """Find the first descendant node that matches a given criteria.
-
-    Note: clients would usually call AppUi.GetUiNode or AppUi.WaitForUiNode
-    instead.
-
-    For example:
-
-      app = app_ui.AppUi(device, package='org.my.app')
-      app.GetUiNode(resource_id='some_element', text='hello')
-
-    would retrieve the first matching node with both of the xml attributes:
-
-      resource-id='org.my.app:id/some_element'
-      text='hello'
-
-    As the example shows, if given and needed, the value of the resource_id key
-    is auto-completed with the package name specified in the AppUi constructor.
-
-    Args:
-      Arguments are specified as key-value pairs, where keys correnspond to
-      attribute names in xml nodes (replacing any '-' with '_' to make them
-      valid identifiers). At least one argument must be supplied, and arguments
-      with a None value are ignored.
-    Returns:
-      A UI node instance of the first descendant node that matches ALL the
-      given key-value criteria; or None if no such node is found.
-    Raises:
-      TypeError if no search arguments are provided.
-    """
-    matches_criteria = self._NodeMatcher(kwargs)
-    for node in self._xml_node.iter():
-      if matches_criteria(node):
-        return type(self)(self._device, node, package=self._package)
-    return None
-
-  def _NodeMatcher(self, kwargs):
-    # Auto-complete resource-id's using the package name if available.
-    resource_id = kwargs.get('resource_id')
-    if (resource_id is not None
-        and self._package is not None
-        and ':id/' not in resource_id):
-      kwargs['resource_id'] = '%s:id/%s' % (self._package, resource_id)
-
-    criteria = [(k.replace('_', '-'), v)
-                for k, v in kwargs.iteritems()
-                if v is not None]
-    if not criteria:
-      raise TypeError('At least one search criteria should be specified')
-    return lambda node: all(node.get(k) == v for k, v in criteria)
-
-
-class AppUi(object):
-  # timeout and retry arguments appear unused, but are handled by decorator.
-  # pylint: disable=unused-argument
-
-  def __init__(self, device, package=None):
-    """Object to interact with the UI of an Android app.
-
-    Args:
-      device: A device_utils.DeviceUtils instance.
-      package: An optional package name for the app.
-    """
-    self._device = device
-    self._package = package
-
-  @property
-  def package(self):
-    return self._package
-
-  @decorators.WithTimeoutAndRetriesDefaults(_DEFAULT_SHORT_TIMEOUT,
-                                            _DEFAULT_SHORT_RETRIES)
-  def _GetRootUiNode(self, timeout=None, retries=None):
-    """Get a node pointing to the root of the UI nodes on screen.
-
-    Note: This is currently implemented via adb calls to uiatomator and it
-    is *slow*, ~2 secs per call. Do not rely on low-level implementation
-    details that may change in the future.
-
-    TODO(crbug.com/567217): Swap to a more efficient implementation.
-
-    Args:
-      timeout: A number of seconds to wait for the uiautomator dump.
-      retries: Number of times to retry if the adb command fails.
-    Returns:
-      A UI node instance pointing to the root of the xml screenshot.
-    """
-    with device_temp_file.DeviceTempFile(self._device.adb) as dtemp:
-      self._device.RunShellCommand(['uiautomator', 'dump', dtemp.name],
-                                  check_return=True)
-      xml_node = element_tree.fromstring(
-          self._device.ReadFile(dtemp.name, force_pull=True))
-    return _UiNode(self._device, xml_node, package=self._package)
-
-  def ScreenDump(self):
-    """Get a brief summary of the nodes that can be found on the screen.
-
-    Returns:
-      A list of lines that can be logged or otherwise printed.
-    """
-    return self._GetRootUiNode().Dump()
-
-  def GetUiNode(self, **kwargs):
-    """Get the first node found matching a specified criteria.
-
-    Args:
-      See _UiNode._Find.
-    Returns:
-      A UI node instance of the node if found, otherwise None.
-    """
-    # pylint: disable=protected-access
-    return self._GetRootUiNode()._Find(**kwargs)
-
-  @decorators.WithTimeoutAndRetriesDefaults(_DEFAULT_LONG_TIMEOUT,
-                                            _DEFAULT_LONG_RETRIES)
-  def WaitForUiNode(self, timeout=None, retries=None, **kwargs):
-    """Wait for a node matching a given criteria to appear on the screen.
-
-    Args:
-      timeout: A number of seconds to wait for the matching node to appear.
-      retries: Number of times to retry in case of adb command errors.
-      For other args, to specify the search criteria, see _UiNode._Find.
-    Returns:
-      The UI node instance found.
-    Raises:
-      device_errors.CommandTimeoutError if the node is not found before the
-      timeout.
-    """
-    def node_found():
-      return self.GetUiNode(**kwargs)
-
-    return timeout_retry.WaitFor(node_found)
diff --git a/third_party/catapult/devil/devil/android/app_ui_test.py b/third_party/catapult/devil/devil/android/app_ui_test.py
deleted file mode 100644
index 3472985..0000000
--- a/third_party/catapult/devil/devil/android/app_ui_test.py
+++ /dev/null
@@ -1,191 +0,0 @@
-# Copyright 2015 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.
-
-"""Unit tests for the app_ui module."""
-
-import unittest
-from xml.etree import ElementTree as element_tree
-
-from devil import devil_env
-from devil.android import app_ui
-from devil.android import device_errors
-from devil.utils import geometry
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-MOCK_XML_LOADING = '''
-<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
-<hierarchy rotation="0">
-  <node bounds="[0,50][1536,178]" content-desc="Loading"
-      resource-id="com.example.app:id/spinner"/>
-</hierarchy>
-'''.strip()
-
-
-MOCK_XML_LOADED = '''
-<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
-<hierarchy rotation="0">
-  <node bounds="[0,50][1536,178]" content-desc=""
-      resource-id="com.example.app:id/toolbar">
-    <node bounds="[0,58][112,170]" content-desc="Open navigation drawer"/>
-    <node bounds="[121,50][1536,178]"
-        resource-id="com.example.app:id/actionbar_custom_view">
-      <node bounds="[121,50][1424,178]"
-          resource-id="com.example.app:id/actionbar_title" text="Primary"/>
-      <node bounds="[1424,50][1536,178]" content-desc="Search"
-          resource-id="com.example.app:id/actionbar_search_button"/>
-    </node>
-  </node>
-  <node bounds="[0,178][576,1952]" resource-id="com.example.app:id/drawer">
-    <node bounds="[0,178][144,1952]"
-        resource-id="com.example.app:id/mini_drawer">
-      <node bounds="[40,254][104,318]" resource-id="com.example.app:id/avatar"/>
-      <node bounds="[16,354][128,466]" content-desc="Primary"
-          resource-id="com.example.app:id/image_view"/>
-      <node bounds="[16,466][128,578]" content-desc="Social"
-          resource-id="com.example.app:id/image_view"/>
-      <node bounds="[16,578][128,690]" content-desc="Promotions"
-          resource-id="com.example.app:id/image_view"/>
-    </node>
-  </node>
-</hierarchy>
-'''.strip()
-
-
-class UiAppTest(unittest.TestCase):
-
-  def setUp(self):
-    self.device = mock.Mock()
-    self.device.pixel_density = 320  # Each dp pixel is 2 real pixels.
-    self.app = app_ui.AppUi(self.device, package='com.example.app')
-    self._setMockXmlScreenshots([MOCK_XML_LOADED])
-
-  def _setMockXmlScreenshots(self, xml_docs):
-    """Mock self.app._GetRootUiNode to load nodes from some test xml_docs.
-
-    Each time the method is called it will return a UI node for each string
-    given in |xml_docs|, or rise a time out error when the list is exhausted.
-    """
-    # pylint: disable=protected-access
-    def get_mock_root_ui_node(value):
-      if isinstance(value, Exception):
-        raise value
-      return app_ui._UiNode(
-          self.device, element_tree.fromstring(value), self.app.package)
-
-    xml_docs.append(device_errors.CommandTimeoutError('Timed out!'))
-
-    self.app._GetRootUiNode = mock.Mock(
-        side_effect=(get_mock_root_ui_node(doc) for doc in xml_docs))
-
-  def assertNodeHasAttribs(self, node, attr):
-    # pylint: disable=protected-access
-    for key, value in attr.iteritems():
-      self.assertEquals(node._GetAttribute(key), value)
-
-  def assertTappedOnceAt(self, x, y):
-    self.device.RunShellCommand.assert_called_once_with(
-        ['input', 'tap', str(x), str(y)], check_return=True)
-
-  def testFind_byText(self):
-    node = self.app.GetUiNode(text='Primary')
-    self.assertNodeHasAttribs(node, {
-        'text': 'Primary',
-        'content-desc': None,
-        'resource-id': 'com.example.app:id/actionbar_title',
-    })
-    self.assertEquals(node.bounds, geometry.Rectangle([121, 50], [1424, 178]))
-
-  def testFind_byContentDesc(self):
-    node = self.app.GetUiNode(content_desc='Social')
-    self.assertNodeHasAttribs(node, {
-        'text': None,
-        'content-desc': 'Social',
-        'resource-id': 'com.example.app:id/image_view',
-    })
-    self.assertEquals(node.bounds, geometry.Rectangle([16, 466], [128, 578]))
-
-  def testFind_byResourceId_autocompleted(self):
-    node = self.app.GetUiNode(resource_id='image_view')
-    self.assertNodeHasAttribs(node, {
-        'content-desc': 'Primary',
-        'resource-id': 'com.example.app:id/image_view',
-    })
-
-  def testFind_byResourceId_absolute(self):
-    node = self.app.GetUiNode(resource_id='com.example.app:id/image_view')
-    self.assertNodeHasAttribs(node, {
-        'content-desc': 'Primary',
-        'resource-id': 'com.example.app:id/image_view',
-    })
-
-  def testFind_byMultiple(self):
-    node = self.app.GetUiNode(resource_id='image_view',
-                              content_desc='Promotions')
-    self.assertNodeHasAttribs(node, {
-        'content-desc': 'Promotions',
-        'resource-id': 'com.example.app:id/image_view',
-    })
-    self.assertEquals(node.bounds, geometry.Rectangle([16, 578], [128, 690]))
-
-  def testFind_notFound(self):
-    node = self.app.GetUiNode(resource_id='does_not_exist')
-    self.assertIsNone(node)
-
-  def testFind_noArgsGiven(self):
-    # Same exception given by Python for a function call with not enough args.
-    with self.assertRaises(TypeError):
-      self.app.GetUiNode()
-
-  def testGetChildren(self):
-    node = self.app.GetUiNode(resource_id='mini_drawer')
-    self.assertNodeHasAttribs(
-        node[0], {'resource-id': 'com.example.app:id/avatar'})
-    self.assertNodeHasAttribs(node[1], {'content-desc': 'Primary'})
-    self.assertNodeHasAttribs(node[2], {'content-desc': 'Social'})
-    self.assertNodeHasAttribs(node[3], {'content-desc': 'Promotions'})
-    with self.assertRaises(IndexError):
-      # pylint: disable=pointless-statement
-      node[4]
-
-  def testTap_center(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap()
-    self.assertTappedOnceAt(56, 114)
-
-  def testTap_topleft(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap(geometry.Point(0, 0))
-    self.assertTappedOnceAt(0, 58)
-
-  def testTap_withOffset(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap(geometry.Point(10, 20))
-    self.assertTappedOnceAt(10, 78)
-
-  def testTap_withOffsetInDp(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap(geometry.Point(10, 20), dp_units=True)
-    self.assertTappedOnceAt(20, 98)
-
-  def testTap_dpUnitsIgnored(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap(dp_units=True)
-    self.assertTappedOnceAt(56, 114)  # Still taps at center.
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitForUiNode_found(self):
-    self._setMockXmlScreenshots(
-        [MOCK_XML_LOADING, MOCK_XML_LOADING, MOCK_XML_LOADED])
-    node = self.app.WaitForUiNode(resource_id='actionbar_title')
-    self.assertNodeHasAttribs(node, {'text': 'Primary'})
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitForUiNode_notFound(self):
-    self._setMockXmlScreenshots(
-        [MOCK_XML_LOADING, MOCK_XML_LOADING, MOCK_XML_LOADING])
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      self.app.WaitForUiNode(resource_id='actionbar_title')
diff --git a/third_party/catapult/devil/devil/android/battery_utils.py b/third_party/catapult/devil/devil/android/battery_utils.py
deleted file mode 100644
index 3b225aa..0000000
--- a/third_party/catapult/devil/devil/android/battery_utils.py
+++ /dev/null
@@ -1,699 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Provides a variety of device interactions with power.
-"""
-# pylint: disable=unused-argument
-
-import collections
-import contextlib
-import csv
-import logging
-
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.sdk import version_codes
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-
-
-_DEVICE_PROFILES = [
-  {
-    'name': ['Nexus 4'],
-    'enable_command': (
-        'echo 0 > /sys/module/pm8921_charger/parameters/disabled && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo 1 > /sys/module/pm8921_charger/parameters/disabled && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': None,
-    'current': None,
-  },
-  {
-    'name': ['Nexus 5'],
-    # Nexus 5
-    # Setting the HIZ bit of the bq24192 causes the charger to actually ignore
-    # energy coming from USB. Setting the power_supply offline just updates the
-    # Android system to reflect that.
-    'enable_command': (
-        'echo 0x4A > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
-        'chmod 644 /sys/class/power_supply/usb/online && '
-        'echo 1 > /sys/class/power_supply/usb/online && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo 0xCA > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
-        'chmod 644 /sys/class/power_supply/usb/online && '
-        'echo 0 > /sys/class/power_supply/usb/online && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': None,
-    'current': None,
-  },
-  {
-    'name': ['Nexus 6'],
-    'enable_command': (
-        'echo 1 > /sys/class/power_supply/battery/charging_enabled && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo 0 > /sys/class/power_supply/battery/charging_enabled && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': (
-        '/sys/class/power_supply/max170xx_battery/charge_counter_ext'),
-    'voltage': '/sys/class/power_supply/max170xx_battery/voltage_now',
-    'current': '/sys/class/power_supply/max170xx_battery/current_now',
-  },
-  {
-    'name': ['Nexus 9'],
-    'enable_command': (
-        'echo Disconnected > '
-        '/sys/bus/i2c/drivers/bq2419x/0-006b/input_cable_state && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo Connected > '
-        '/sys/bus/i2c/drivers/bq2419x/0-006b/input_cable_state && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': '/sys/class/power_supply/battery/charge_counter_ext',
-    'voltage': '/sys/class/power_supply/battery/voltage_now',
-    'current': '/sys/class/power_supply/battery/current_now',
-  },
-  {
-    'name': ['Nexus 10'],
-    'enable_command': None,
-    'disable_command': None,
-    'charge_counter': None,
-    'voltage': '/sys/class/power_supply/ds2784-fuelgauge/voltage_now',
-    'current': '/sys/class/power_supply/ds2784-fuelgauge/current_now',
-
-  },
-  {
-    'name': ['Nexus 5X'],
-    'enable_command': (
-        'echo 1 > /sys/class/power_supply/battery/charging_enabled && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo 0 > /sys/class/power_supply/battery/charging_enabled && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': None,
-    'current': None,
-  },
-  { # Galaxy s5
-    'name': ['SM-G900H'],
-    'enable_command': (
-        'chmod 644 /sys/class/power_supply/battery/test_mode && '
-        'chmod 644 /sys/class/power_supply/sec-charger/current_now && '
-        'echo 0 > /sys/class/power_supply/battery/test_mode && '
-        'echo 9999 > /sys/class/power_supply/sec-charger/current_now &&'
-        'dumpsys battery reset'),
-    'disable_command': (
-        'chmod 644 /sys/class/power_supply/battery/test_mode && '
-        'chmod 644 /sys/class/power_supply/sec-charger/current_now && '
-        'echo 1 > /sys/class/power_supply/battery/test_mode && '
-        'echo 0 > /sys/class/power_supply/sec-charger/current_now && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': '/sys/class/power_supply/sec-fuelgauge/voltage_now',
-    'current': '/sys/class/power_supply/sec-charger/current_now',
-  },
-  { # Galaxy s6, Galaxy s6, Galaxy s6 edge
-    'name': ['SM-G920F', 'SM-G920V', 'SM-G925V'],
-    'enable_command': (
-        'chmod 644 /sys/class/power_supply/battery/test_mode && '
-        'chmod 644 /sys/class/power_supply/max77843-charger/current_now && '
-        'echo 0 > /sys/class/power_supply/battery/test_mode && '
-        'echo 9999 > /sys/class/power_supply/max77843-charger/current_now &&'
-        'dumpsys battery reset'),
-    'disable_command': (
-        'chmod 644 /sys/class/power_supply/battery/test_mode && '
-        'chmod 644 /sys/class/power_supply/max77843-charger/current_now && '
-        'echo 1 > /sys/class/power_supply/battery/test_mode && '
-        'echo 0 > /sys/class/power_supply/max77843-charger/current_now && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': '/sys/class/power_supply/max77843-fuelgauge/voltage_now',
-    'current': '/sys/class/power_supply/max77843-charger/current_now',
-  },
-]
-
-# The list of useful dumpsys columns.
-# Index of the column containing the format version.
-_DUMP_VERSION_INDEX = 0
-# Index of the column containing the type of the row.
-_ROW_TYPE_INDEX = 3
-# Index of the column containing the uid.
-_PACKAGE_UID_INDEX = 4
-# Index of the column containing the application package.
-_PACKAGE_NAME_INDEX = 5
-# The column containing the uid of the power data.
-_PWI_UID_INDEX = 1
-# The column containing the type of consumption. Only consumption since last
-# charge are of interest here.
-_PWI_AGGREGATION_INDEX = 2
-_PWS_AGGREGATION_INDEX = _PWI_AGGREGATION_INDEX
-# The column containing the amount of power used, in mah.
-_PWI_POWER_CONSUMPTION_INDEX = 5
-_PWS_POWER_CONSUMPTION_INDEX = _PWI_POWER_CONSUMPTION_INDEX
-
-_MAX_CHARGE_ERROR = 20
-
-
-class BatteryUtils(object):
-
-  def __init__(self, device, default_timeout=_DEFAULT_TIMEOUT,
-               default_retries=_DEFAULT_RETRIES):
-    """BatteryUtils constructor.
-
-      Args:
-        device: A DeviceUtils instance.
-        default_timeout: An integer containing the default number of seconds to
-                         wait for an operation to complete if no explicit value
-                         is provided.
-        default_retries: An integer containing the default number or times an
-                         operation should be retried on failure if no explicit
-                         value is provided.
-      Raises:
-        TypeError: If it is not passed a DeviceUtils instance.
-    """
-    if not isinstance(device, device_utils.DeviceUtils):
-      raise TypeError('Must be initialized with DeviceUtils object.')
-    self._device = device
-    self._cache = device.GetClientCache(self.__class__.__name__)
-    self._default_timeout = default_timeout
-    self._default_retries = default_retries
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SupportsFuelGauge(self, timeout=None, retries=None):
-    """Detect if fuel gauge chip is present.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if known fuel gauge files are present.
-      False otherwise.
-    """
-    self._DiscoverDeviceProfile()
-    return (self._cache['profile']['enable_command'] != None
-        and self._cache['profile']['charge_counter'] != None)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetFuelGaugeChargeCounter(self, timeout=None, retries=None):
-    """Get value of charge_counter on fuel gauge chip.
-
-    Device must have charging disabled for this, not just battery updates
-    disabled. The only device that this currently works with is the nexus 5.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      value of charge_counter for fuel gauge chip in units of nAh.
-
-    Raises:
-      device_errors.CommandFailedError: If fuel gauge chip not found.
-    """
-    if self.SupportsFuelGauge():
-      return int(self._device.ReadFile(
-          self._cache['profile']['charge_counter']))
-    raise device_errors.CommandFailedError(
-        'Unable to find fuel gauge.')
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetNetworkData(self, package, timeout=None, retries=None):
-    """Get network data for specific package.
-
-    Args:
-      package: package name you want network data for.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      Tuple of (sent_data, recieved_data)
-      None if no network data found
-    """
-    # If device_utils clears cache, cache['uids'] doesn't exist
-    if 'uids' not in self._cache:
-      self._cache['uids'] = {}
-    if package not in self._cache['uids']:
-      self.GetPowerData()
-      if package not in self._cache['uids']:
-        logger.warning('No UID found for %s. Can\'t get network data.',
-                       package)
-        return None
-
-    network_data_path = '/proc/uid_stat/%s/' % self._cache['uids'][package]
-    try:
-      send_data = int(self._device.ReadFile(network_data_path + 'tcp_snd'))
-    # If ReadFile throws exception, it means no network data usage file for
-    # package has been recorded. Return 0 sent and 0 received.
-    except device_errors.AdbShellCommandFailedError:
-      logger.warning('No sent data found for package %s', package)
-      send_data = 0
-    try:
-      recv_data = int(self._device.ReadFile(network_data_path + 'tcp_rcv'))
-    except device_errors.AdbShellCommandFailedError:
-      logger.warning('No received data found for package %s', package)
-      recv_data = 0
-    return (send_data, recv_data)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetPowerData(self, timeout=None, retries=None):
-    """Get power data for device.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      Dict containing system power, and a per-package power dict keyed on
-      package names.
-      {
-        'system_total': 23.1,
-        'per_package' : {
-          package_name: {
-            'uid': uid,
-            'data': [1,2,3]
-          },
-        }
-      }
-    """
-    if 'uids' not in self._cache:
-      self._cache['uids'] = {}
-    dumpsys_output = self._device.RunShellCommand(
-        ['dumpsys', 'batterystats', '-c'],
-        check_return=True, large_output=True)
-    csvreader = csv.reader(dumpsys_output)
-    pwi_entries = collections.defaultdict(list)
-    system_total = None
-    for entry in csvreader:
-      if entry[_DUMP_VERSION_INDEX] not in ['8', '9']:
-        # Wrong dumpsys version.
-        raise device_errors.DeviceVersionError(
-            'Dumpsys version must be 8 or 9. "%s" found.'
-            % entry[_DUMP_VERSION_INDEX])
-      if _ROW_TYPE_INDEX < len(entry) and entry[_ROW_TYPE_INDEX] == 'uid':
-        current_package = entry[_PACKAGE_NAME_INDEX]
-        if (self._cache['uids'].get(current_package)
-            and self._cache['uids'].get(current_package)
-            != entry[_PACKAGE_UID_INDEX]):
-          raise device_errors.CommandFailedError(
-              'Package %s found multiple times with different UIDs %s and %s'
-               % (current_package, self._cache['uids'][current_package],
-               entry[_PACKAGE_UID_INDEX]))
-        self._cache['uids'][current_package] = entry[_PACKAGE_UID_INDEX]
-      elif (_PWI_POWER_CONSUMPTION_INDEX < len(entry)
-          and entry[_ROW_TYPE_INDEX] == 'pwi'
-          and entry[_PWI_AGGREGATION_INDEX] == 'l'):
-        pwi_entries[entry[_PWI_UID_INDEX]].append(
-            float(entry[_PWI_POWER_CONSUMPTION_INDEX]))
-      elif (_PWS_POWER_CONSUMPTION_INDEX < len(entry)
-          and entry[_ROW_TYPE_INDEX] == 'pws'
-          and entry[_PWS_AGGREGATION_INDEX] == 'l'):
-        # This entry should only appear once.
-        assert system_total is None
-        system_total = float(entry[_PWS_POWER_CONSUMPTION_INDEX])
-
-    per_package = {p: {'uid': uid, 'data': pwi_entries[uid]}
-                   for p, uid in self._cache['uids'].iteritems()}
-    return {'system_total': system_total, 'per_package': per_package}
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetBatteryInfo(self, timeout=None, retries=None):
-    """Gets battery info for the device.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-    Returns:
-      A dict containing various battery information as reported by dumpsys
-      battery.
-    """
-    result = {}
-    # Skip the first line, which is just a header.
-    for line in self._device.RunShellCommand(
-        ['dumpsys', 'battery'], check_return=True)[1:]:
-      # If usb charging has been disabled, an extra line of header exists.
-      if 'UPDATES STOPPED' in line:
-        logger.warning('Dumpsys battery not receiving updates. '
-                       'Run dumpsys battery reset if this is in error.')
-      elif ':' not in line:
-        logger.warning('Unknown line found in dumpsys battery: "%s"', line)
-      else:
-        k, v = line.split(':', 1)
-        result[k.strip()] = v.strip()
-    return result
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetCharging(self, timeout=None, retries=None):
-    """Gets the charging state of the device.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-    Returns:
-      True if the device is charging, false otherwise.
-    """
-    battery_info = self.GetBatteryInfo()
-    for k in ('AC powered', 'USB powered', 'Wireless powered'):
-      if (k in battery_info and
-          battery_info[k].lower() in ('true', '1', 'yes')):
-        return True
-    return False
-
-  # TODO(rnephew): Make private when all use cases can use the context manager.
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def DisableBatteryUpdates(self, timeout=None, retries=None):
-    """Resets battery data and makes device appear like it is not
-    charging so that it will collect power data since last charge.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      device_errors.CommandFailedError: When resetting batterystats fails to
-        reset power values.
-      device_errors.DeviceVersionError: If device is not L or higher.
-    """
-    def battery_updates_disabled():
-      return self.GetCharging() is False
-
-    self._ClearPowerData()
-    self._device.RunShellCommand(['dumpsys', 'battery', 'set', 'ac', '0'],
-                                 check_return=True)
-    self._device.RunShellCommand(['dumpsys', 'battery', 'set', 'usb', '0'],
-                                 check_return=True)
-    timeout_retry.WaitFor(battery_updates_disabled, wait_period=1)
-
-  # TODO(rnephew): Make private when all use cases can use the context manager.
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def EnableBatteryUpdates(self, timeout=None, retries=None):
-    """Restarts device charging so that dumpsys no longer collects power data.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      device_errors.DeviceVersionError: If device is not L or higher.
-    """
-    def battery_updates_enabled():
-      return (self.GetCharging()
-              or not bool('UPDATES STOPPED' in self._device.RunShellCommand(
-                  ['dumpsys', 'battery'], check_return=True)))
-
-    self._device.RunShellCommand(['dumpsys', 'battery', 'reset'],
-                                 check_return=True)
-    timeout_retry.WaitFor(battery_updates_enabled, wait_period=1)
-
-  @contextlib.contextmanager
-  def BatteryMeasurement(self, timeout=None, retries=None):
-    """Context manager that enables battery data collection. It makes
-    the device appear to stop charging so that dumpsys will start collecting
-    power data since last charge. Once the with block is exited, charging is
-    resumed and power data since last charge is no longer collected.
-
-    Only for devices L and higher.
-
-    Example usage:
-      with BatteryMeasurement():
-        browser_actions()
-        get_power_data() # report usage within this block
-      after_measurements() # Anything that runs after power
-                           # measurements are collected
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      device_errors.DeviceVersionError: If device is not L or higher.
-    """
-    if self._device.build_version_sdk < version_codes.LOLLIPOP:
-      raise device_errors.DeviceVersionError('Device must be L or higher.')
-    try:
-      self.DisableBatteryUpdates(timeout=timeout, retries=retries)
-      yield
-    finally:
-      self.EnableBatteryUpdates(timeout=timeout, retries=retries)
-
-  def _DischargeDevice(self, percent, wait_period=120):
-    """Disables charging and waits for device to discharge given amount
-
-    Args:
-      percent: level of charge to discharge.
-
-    Raises:
-      ValueError: If percent is not between 1 and 99.
-    """
-    battery_level = int(self.GetBatteryInfo().get('level'))
-    if not 0 < percent < 100:
-      raise ValueError('Discharge amount(%s) must be between 1 and 99'
-                       % percent)
-    if battery_level is None:
-      logger.warning('Unable to find current battery level. Cannot discharge.')
-      return
-    # Do not discharge if it would make battery level too low.
-    if percent >= battery_level - 10:
-      logger.warning('Battery is too low or discharge amount requested is too '
-                     'high. Cannot discharge phone %s percent.', percent)
-      return
-
-    self._HardwareSetCharging(False)
-
-    def device_discharged():
-      self._HardwareSetCharging(True)
-      current_level = int(self.GetBatteryInfo().get('level'))
-      logger.info('current battery level: %s', current_level)
-      if battery_level - current_level >= percent:
-        return True
-      self._HardwareSetCharging(False)
-      return False
-
-    timeout_retry.WaitFor(device_discharged, wait_period=wait_period)
-
-  def ChargeDeviceToLevel(self, level, wait_period=60):
-    """Enables charging and waits for device to be charged to given level.
-
-    Args:
-      level: level of charge to wait for.
-      wait_period: time in seconds to wait between checking.
-    Raises:
-      device_errors.DeviceChargingError: If error while charging is detected.
-    """
-    self.SetCharging(True)
-    charge_status = {
-        'charge_failure_count': 0,
-        'last_charge_value': 0
-    }
-    def device_charged():
-      battery_level = self.GetBatteryInfo().get('level')
-      if battery_level is None:
-        logger.warning('Unable to find current battery level.')
-        battery_level = 100
-      else:
-        logger.info('current battery level: %s', battery_level)
-        battery_level = int(battery_level)
-
-      # Use > so that it will not reset if charge is going down.
-      if battery_level > charge_status['last_charge_value']:
-        charge_status['last_charge_value'] = battery_level
-        charge_status['charge_failure_count'] = 0
-      else:
-        charge_status['charge_failure_count'] += 1
-
-      if (not battery_level >= level
-          and charge_status['charge_failure_count'] >= _MAX_CHARGE_ERROR):
-        raise device_errors.DeviceChargingError(
-            'Device not charging properly. Current level:%s Previous level:%s'
-             % (battery_level, charge_status['last_charge_value']))
-      return battery_level >= level
-
-    timeout_retry.WaitFor(device_charged, wait_period=wait_period)
-
-  def LetBatteryCoolToTemperature(self, target_temp, wait_period=180):
-    """Lets device sit to give battery time to cool down
-    Args:
-      temp: maximum temperature to allow in tenths of degrees c.
-      wait_period: time in seconds to wait between checking.
-    """
-    def cool_device():
-      temp = self.GetBatteryInfo().get('temperature')
-      if temp is None:
-        logger.warning('Unable to find current battery temperature.')
-        temp = 0
-      else:
-        logger.info('Current battery temperature: %s', temp)
-      if int(temp) <= target_temp:
-        return True
-      else:
-        if 'Nexus 5' in self._cache['profile']['name']:
-          self._DischargeDevice(1)
-        return False
-
-    self._DiscoverDeviceProfile()
-    self.EnableBatteryUpdates()
-    logger.info('Waiting for the device to cool down to %s (0.1 C)',
-                target_temp)
-    timeout_retry.WaitFor(cool_device, wait_period=wait_period)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetCharging(self, enabled, timeout=None, retries=None):
-    """Enables or disables charging on the device.
-
-    Args:
-      enabled: A boolean indicating whether charging should be enabled or
-        disabled.
-      timeout: timeout in seconds
-      retries: number of retries
-    """
-    if self.GetCharging() == enabled:
-      logger.warning('Device charging already in expected state: %s', enabled)
-      return
-
-    self._DiscoverDeviceProfile()
-    if enabled:
-      if self._cache['profile']['enable_command']:
-        self._HardwareSetCharging(enabled)
-      else:
-        logger.info('Unable to enable charging via hardware. '
-                    'Falling back to software enabling.')
-        self.EnableBatteryUpdates()
-    else:
-      if self._cache['profile']['enable_command']:
-        self._ClearPowerData()
-        self._HardwareSetCharging(enabled)
-      else:
-        logger.info('Unable to disable charging via hardware. '
-                     'Falling back to software disabling.')
-        self.DisableBatteryUpdates()
-
-  def _HardwareSetCharging(self, enabled, timeout=None, retries=None):
-    """Enables or disables charging on the device.
-
-    Args:
-      enabled: A boolean indicating whether charging should be enabled or
-        disabled.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      device_errors.CommandFailedError: If method of disabling charging cannot
-        be determined.
-    """
-    self._DiscoverDeviceProfile()
-    if not self._cache['profile']['enable_command']:
-      raise device_errors.CommandFailedError(
-          'Unable to find charging commands.')
-
-    command = (self._cache['profile']['enable_command'] if enabled
-               else self._cache['profile']['disable_command'])
-
-    def verify_charging():
-      return self.GetCharging() == enabled
-
-    self._device.RunShellCommand(
-        command, check_return=True, as_root=True, large_output=True)
-    timeout_retry.WaitFor(verify_charging, wait_period=1)
-
-  @contextlib.contextmanager
-  def PowerMeasurement(self, timeout=None, retries=None):
-    """Context manager that enables battery power collection.
-
-    Once the with block is exited, charging is resumed. Will attempt to disable
-    charging at the hardware level, and if that fails will fall back to software
-    disabling of battery updates.
-
-    Only for devices L and higher.
-
-    Example usage:
-      with PowerMeasurement():
-        browser_actions()
-        get_power_data() # report usage within this block
-      after_measurements() # Anything that runs after power
-                           # measurements are collected
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-    """
-    try:
-      self.SetCharging(False, timeout=timeout, retries=retries)
-      yield
-    finally:
-      self.SetCharging(True, timeout=timeout, retries=retries)
-
-  def _ClearPowerData(self):
-    """Resets battery data and makes device appear like it is not
-    charging so that it will collect power data since last charge.
-
-    Returns:
-      True if power data cleared.
-      False if power data clearing is not supported (pre-L)
-
-    Raises:
-      device_errors.DeviceVersionError: If power clearing is supported,
-        but fails.
-    """
-    if self._device.build_version_sdk < version_codes.LOLLIPOP:
-      logger.warning('Dumpsys power data only available on 5.0 and above. '
-                     'Cannot clear power data.')
-      return False
-
-    self._device.RunShellCommand(
-        ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True)
-    self._device.RunShellCommand(
-        ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True)
-
-    def test_if_clear():
-      self._device.RunShellCommand(
-          ['dumpsys', 'batterystats', '--reset'], check_return=True)
-      battery_data = self._device.RunShellCommand(
-          ['dumpsys', 'batterystats', '--charged', '-c'],
-          check_return=True, large_output=True)
-      for line in battery_data:
-        l = line.split(',')
-        if (len(l) > _PWI_POWER_CONSUMPTION_INDEX
-            and l[_ROW_TYPE_INDEX] == 'pwi'
-            and float(l[_PWI_POWER_CONSUMPTION_INDEX]) != 0.0):
-          return False
-      return True
-
-    try:
-      timeout_retry.WaitFor(test_if_clear, wait_period=1)
-      return True
-    finally:
-      self._device.RunShellCommand(
-          ['dumpsys', 'battery', 'reset'], check_return=True)
-
-  def _DiscoverDeviceProfile(self):
-    """Checks and caches device information.
-
-    Returns:
-      True if profile is found, false otherwise.
-    """
-
-    if 'profile' in self._cache:
-      return True
-    for profile in _DEVICE_PROFILES:
-      if self._device.product_model in profile['name']:
-        self._cache['profile'] = profile
-        return True
-    self._cache['profile'] = {
-        'name': [],
-        'enable_command': None,
-        'disable_command': None,
-        'charge_counter': None,
-        'voltage': None,
-        'current': None,
-    }
-    return False
diff --git a/third_party/catapult/devil/devil/android/battery_utils_test.py b/third_party/catapult/devil/devil/android/battery_utils_test.py
deleted file mode 100755
index beaba3b..0000000
--- a/third_party/catapult/devil/devil/android/battery_utils_test.py
+++ /dev/null
@@ -1,694 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""
-Unit tests for the contents of battery_utils.py
-"""
-
-# pylint: disable=protected-access,unused-argument
-
-import logging
-import unittest
-
-from devil import devil_env
-from devil.android import battery_utils
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android import device_utils_test
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-_DUMPSYS_OUTPUT = [
-    '9,0,i,uid,1000,test_package1',
-    '9,0,i,uid,1001,test_package2',
-    '9,1000,l,pwi,uid,1',
-    '9,1001,l,pwi,uid,2',
-    '9,0,l,pws,1728,2000,190,207',
-]
-
-
-class BatteryUtilsTest(mock_calls.TestCase):
-
-  _NEXUS_5 = {
-    'name': 'Nexus 5',
-    'witness_file': '/sys/kernel/debug/bq24192/INPUT_SRC_CONT',
-    'enable_command': (
-        'echo 0x4A > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
-        'echo 1 > /sys/class/power_supply/usb/online'),
-    'disable_command': (
-        'echo 0xCA > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
-        'chmod 644 /sys/class/power_supply/usb/online && '
-        'echo 0 > /sys/class/power_supply/usb/online'),
-    'charge_counter': None,
-    'voltage': None,
-    'current': None,
-  }
-
-  _NEXUS_6 = {
-    'name': 'Nexus 6',
-    'witness_file': None,
-    'enable_command': None,
-    'disable_command': None,
-    'charge_counter': (
-        '/sys/class/power_supply/max170xx_battery/charge_counter_ext'),
-    'voltage': '/sys/class/power_supply/max170xx_battery/voltage_now',
-    'current': '/sys/class/power_supply/max170xx_battery/current_now',
-  }
-
-  _NEXUS_10 = {
-    'name': 'Nexus 10',
-    'witness_file': None,
-    'enable_command': None,
-    'disable_command': None,
-    'charge_counter': (
-        '/sys/class/power_supply/ds2784-fuelgauge/charge_counter_ext'),
-    'voltage': '/sys/class/power_supply/ds2784-fuelgauge/voltage_now',
-    'current': '/sys/class/power_supply/ds2784-fuelgauge/current_now',
-  }
-
-  def ShellError(self, output=None, status=1):
-    def action(cmd, *args, **kwargs):
-      raise device_errors.AdbShellCommandFailedError(
-          cmd, output, status, str(self.device))
-    if output is None:
-      output = 'Permission denied\n'
-    return action
-
-  def setUp(self):
-    self.adb = device_utils_test._AdbWrapperMock('0123456789abcdef')
-    self.device = device_utils.DeviceUtils(
-        self.adb, default_timeout=10, default_retries=0)
-    self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial'])
-    self.battery = battery_utils.BatteryUtils(
-        self.device, default_timeout=10, default_retries=0)
-
-
-class BatteryUtilsInitTest(unittest.TestCase):
-
-  def testInitWithDeviceUtil(self):
-    serial = '0fedcba987654321'
-    d = device_utils.DeviceUtils(serial)
-    b = battery_utils.BatteryUtils(d)
-    self.assertEqual(d, b._device)
-
-  def testInitWithMissing_fails(self):
-    with self.assertRaises(TypeError):
-      battery_utils.BatteryUtils(None)
-    with self.assertRaises(TypeError):
-      battery_utils.BatteryUtils('')
-
-
-class BatteryUtilsSetChargingTest(BatteryUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testHardwareSetCharging_enabled(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            mock.ANY, check_return=True, as_root=True, large_output=True), []),
-        (self.call.battery.GetCharging(), False),
-        (self.call.battery.GetCharging(), True)):
-      self.battery._HardwareSetCharging(True)
-
-  def testHardwareSetCharging_alreadyEnabled(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            mock.ANY, check_return=True, as_root=True, large_output=True), []),
-        (self.call.battery.GetCharging(), True)):
-      self.battery._HardwareSetCharging(True)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testHardwareSetCharging_disabled(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            mock.ANY, check_return=True, as_root=True, large_output=True), []),
-        (self.call.battery.GetCharging(), True),
-        (self.call.battery.GetCharging(), False)):
-      self.battery._HardwareSetCharging(False)
-
-
-class BatteryUtilsSetBatteryMeasurementTest(BatteryUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testBatteryMeasurementWifi(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=22):
-      with self.assertCalls(
-          (self.call.battery._ClearPowerData(), True),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True),
-           []),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'reset'], check_return=True), []),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery'], check_return=True), [])):
-        with self.battery.BatteryMeasurement():
-          pass
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testBatteryMeasurementUsb(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=22):
-      with self.assertCalls(
-          (self.call.battery._ClearPowerData(), True),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True),
-           []),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'reset'], check_return=True), []),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
-          (self.call.battery.GetCharging(), True)):
-        with self.battery.BatteryMeasurement():
-          pass
-
-
-class BatteryUtilsGetPowerData(BatteryUtilsTest):
-
-  def testGetPowerData(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-         _DUMPSYS_OUTPUT)):
-      data = self.battery.GetPowerData()
-      check = {
-        'system_total': 2000.0,
-        'per_package': {
-          'test_package1': {'uid': '1000', 'data': [1.0]},
-          'test_package2': {'uid': '1001', 'data': [2.0]}
-        }
-      }
-      self.assertEqual(data, check)
-
-  def testGetPowerData_packageCollisionSame(self):
-    self.battery._cache['uids'] = {'test_package1': '1000'}
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-        _DUMPSYS_OUTPUT):
-      data = self.battery.GetPowerData()
-      check = {
-        'system_total': 2000.0,
-        'per_package': {
-          'test_package1': {'uid': '1000', 'data': [1.0]},
-          'test_package2': {'uid': '1001', 'data': [2.0]}
-        }
-      }
-      self.assertEqual(data, check)
-
-  def testGetPowerData_packageCollisionDifferent(self):
-    self.battery._cache['uids'] = {'test_package1': '1'}
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-        _DUMPSYS_OUTPUT):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.battery.GetPowerData()
-
-  def testGetPowerData_cacheCleared(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-         _DUMPSYS_OUTPUT)):
-      self.battery._cache.clear()
-      data = self.battery.GetPowerData()
-      check = {
-        'system_total': 2000.0,
-        'per_package': {
-          'test_package1': {'uid': '1000', 'data': [1.0]},
-          'test_package2': {'uid': '1001', 'data': [2.0]}
-        }
-      }
-      self.assertEqual(data, check)
-
-
-class BatteryUtilsChargeDevice(BatteryUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testChargeDeviceToLevel_pass(self):
-    with self.assertCalls(
-        (self.call.battery.SetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '50'}),
-        (self.call.battery.GetBatteryInfo(), {'level': '100'})):
-      self.battery.ChargeDeviceToLevel(95)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testChargeDeviceToLevel_failureSame(self):
-    with self.assertCalls(
-        (self.call.battery.SetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '50'}),
-        (self.call.battery.GetBatteryInfo(), {'level': '50'}),
-
-        (self.call.battery.GetBatteryInfo(), {'level': '50'})):
-      with self.assertRaises(device_errors.DeviceChargingError):
-        old_max = battery_utils._MAX_CHARGE_ERROR
-        try:
-          battery_utils._MAX_CHARGE_ERROR = 2
-          self.battery.ChargeDeviceToLevel(95)
-        finally:
-          battery_utils._MAX_CHARGE_ERROR = old_max
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testChargeDeviceToLevel_failureDischarge(self):
-    with self.assertCalls(
-        (self.call.battery.SetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '50'}),
-        (self.call.battery.GetBatteryInfo(), {'level': '49'}),
-        (self.call.battery.GetBatteryInfo(), {'level': '48'})):
-      with self.assertRaises(device_errors.DeviceChargingError):
-        old_max = battery_utils._MAX_CHARGE_ERROR
-        try:
-          battery_utils._MAX_CHARGE_ERROR = 2
-          self.battery.ChargeDeviceToLevel(95)
-        finally:
-          battery_utils._MAX_CHARGE_ERROR = old_max
-
-
-class BatteryUtilsDischargeDevice(BatteryUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_exact(self):
-    with self.assertCalls(
-        (self.call.battery.GetBatteryInfo(), {'level': '100'}),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery._HardwareSetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '99'})):
-      self.battery._DischargeDevice(1)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_over(self):
-    with self.assertCalls(
-        (self.call.battery.GetBatteryInfo(), {'level': '100'}),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery._HardwareSetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '50'})):
-      self.battery._DischargeDevice(1)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_takeslong(self):
-    with self.assertCalls(
-        (self.call.battery.GetBatteryInfo(), {'level': '100'}),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery._HardwareSetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '100'}),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery._HardwareSetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '99'}),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery._HardwareSetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '98'}),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery._HardwareSetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '97'})):
-      self.battery._DischargeDevice(3)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_dischargeTooClose(self):
-    with self.assertCalls(
-        (self.call.battery.GetBatteryInfo(), {'level': '100'})):
-      self.battery._DischargeDevice(99)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_percentageOutOfBounds(self):
-    with self.assertCalls(
-        (self.call.battery.GetBatteryInfo(), {'level': '100'})):
-      with self.assertRaises(ValueError):
-        self.battery._DischargeDevice(100)
-    with self.assertCalls(
-        (self.call.battery.GetBatteryInfo(), {'level': '100'})):
-      with self.assertRaises(ValueError):
-        self.battery._DischargeDevice(0)
-
-
-class BatteryUtilsGetBatteryInfoTest(BatteryUtilsTest):
-
-  def testGetBatteryInfo_normal(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery'], check_return=True),
-        [
-          'Current Battery Service state:',
-          '  AC powered: false',
-          '  USB powered: true',
-          '  level: 100',
-          '  temperature: 321',
-        ])):
-      self.assertEquals(
-          {
-            'AC powered': 'false',
-            'USB powered': 'true',
-            'level': '100',
-            'temperature': '321',
-          },
-          self.battery.GetBatteryInfo())
-
-  def testGetBatteryInfo_nothing(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery'], check_return=True), [])):
-      self.assertEquals({}, self.battery.GetBatteryInfo())
-
-
-class BatteryUtilsGetChargingTest(BatteryUtilsTest):
-
-  def testGetCharging_usb(self):
-    with self.assertCall(
-        self.call.battery.GetBatteryInfo(), {'USB powered': 'true'}):
-      self.assertTrue(self.battery.GetCharging())
-
-  def testGetCharging_usbFalse(self):
-    with self.assertCall(
-        self.call.battery.GetBatteryInfo(), {'USB powered': 'false'}):
-      self.assertFalse(self.battery.GetCharging())
-
-  def testGetCharging_ac(self):
-    with self.assertCall(
-        self.call.battery.GetBatteryInfo(), {'AC powered': 'true'}):
-      self.assertTrue(self.battery.GetCharging())
-
-  def testGetCharging_wireless(self):
-    with self.assertCall(
-        self.call.battery.GetBatteryInfo(), {'Wireless powered': 'true'}):
-      self.assertTrue(self.battery.GetCharging())
-
-  def testGetCharging_unknown(self):
-    with self.assertCall(
-        self.call.battery.GetBatteryInfo(), {'level': '42'}):
-      self.assertFalse(self.battery.GetCharging())
-
-
-class BatteryUtilsGetNetworkDataTest(BatteryUtilsTest):
-
-  def testGetNetworkData_noDataUsage(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-         _DUMPSYS_OUTPUT),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'),
-            self.ShellError()),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'),
-            self.ShellError())):
-      self.assertEquals(self.battery.GetNetworkData('test_package1'), (0, 0))
-
-  def testGetNetworkData_badPackage(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-        _DUMPSYS_OUTPUT):
-      self.assertEqual(self.battery.GetNetworkData('asdf'), None)
-
-  def testGetNetworkData_packageNotCached(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-         _DUMPSYS_OUTPUT),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)):
-      self.assertEqual(self.battery.GetNetworkData('test_package1'), (1, 2))
-
-  def testGetNetworkData_packageCached(self):
-    self.battery._cache['uids'] = {'test_package1': '1000'}
-    with self.assertCalls(
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)):
-      self.assertEqual(self.battery.GetNetworkData('test_package1'), (1, 2))
-
-  def testGetNetworkData_clearedCache(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-         _DUMPSYS_OUTPUT),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)):
-      self.battery._cache.clear()
-      self.assertEqual(self.battery.GetNetworkData('test_package1'), (1, 2))
-
-
-class BatteryUtilsLetBatteryCoolToTemperatureTest(BatteryUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_startUnder(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.EnableBatteryUpdates(), []),
-        (self.call.battery.GetBatteryInfo(), {'temperature': '500'})):
-      self.battery.LetBatteryCoolToTemperature(600)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_startOver(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.EnableBatteryUpdates(), []),
-        (self.call.battery.GetBatteryInfo(), {'temperature': '500'}),
-        (self.call.battery.GetBatteryInfo(), {'temperature': '400'})):
-      self.battery.LetBatteryCoolToTemperature(400)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_nexus5Hot(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.battery.EnableBatteryUpdates(), []),
-        (self.call.battery.GetBatteryInfo(), {'temperature': '500'}),
-        (self.call.battery._DischargeDevice(1), []),
-        (self.call.battery.GetBatteryInfo(), {'temperature': '400'})):
-      self.battery.LetBatteryCoolToTemperature(400)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_nexus5Cool(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.battery.EnableBatteryUpdates(), []),
-        (self.call.battery.GetBatteryInfo(), {'temperature': '400'})):
-      self.battery.LetBatteryCoolToTemperature(400)
-
-
-class BatteryUtilsSupportsFuelGaugeTest(BatteryUtilsTest):
-
-  def testSupportsFuelGauge_false(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    self.assertFalse(self.battery.SupportsFuelGauge())
-
-  def testSupportsFuelGauge_trueMax(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    # TODO(rnephew): Change this to assertTrue when we have support for
-    # disabling hardware charging on nexus 6.
-    self.assertFalse(self.battery.SupportsFuelGauge())
-
-  def testSupportsFuelGauge_trueDS(self):
-    self.battery._cache['profile'] = self._NEXUS_10
-    # TODO(rnephew): Change this to assertTrue when we have support for
-    # disabling hardware charging on nexus 10.
-    self.assertFalse(self.battery.SupportsFuelGauge())
-
-
-class BatteryUtilsGetFuelGaugeChargeCounterTest(BatteryUtilsTest):
-
-  def testGetFuelGaugeChargeCounter_noFuelGauge(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertRaises(device_errors.CommandFailedError):
-      self.battery.GetFuelGaugeChargeCounter()
-
-  def testGetFuelGaugeChargeCounter_fuelGaugePresent(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.SupportsFuelGauge(), True),
-        (self.call.device.ReadFile(mock.ANY), '123')):
-      self.assertEqual(self.battery.GetFuelGaugeChargeCounter(), 123)
-
-
-class BatteryUtilsSetCharging(BatteryUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetCharging_softwareSetTrue(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), False),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'reset'], check_return=True), []),
-        (self.call.battery.GetCharging(), False),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
-        (self.call.battery.GetCharging(), True)):
-      self.battery.SetCharging(True)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetCharging_softwareSetFalse(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), True),
-        (self.call.battery._ClearPowerData(), True),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []),
-        (self.call.battery.GetCharging(), False)):
-      self.battery.SetCharging(False)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetCharging_hardwareSetTrue(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), False),
-        (self.call.battery._HardwareSetCharging(True))):
-      self.battery.SetCharging(True)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetCharging_hardwareSetFalse(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), True),
-        (self.call.battery._ClearPowerData(), True),
-        (self.call.battery._HardwareSetCharging(False))):
-      self.battery.SetCharging(False)
-
-  def testSetCharging_expectedStateAlreadyTrue(self):
-    with self.assertCalls((self.call.battery.GetCharging(), True)):
-      self.battery.SetCharging(True)
-
-  def testSetCharging_expectedStateAlreadyFalse(self):
-    with self.assertCalls((self.call.battery.GetCharging(), False)):
-      self.battery.SetCharging(False)
-
-
-class BatteryUtilsPowerMeasurement(BatteryUtilsTest):
-
-  def testPowerMeasurement_hardware(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), True),
-        (self.call.battery._ClearPowerData(), True),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery.GetCharging(), False),
-        (self.call.battery._HardwareSetCharging(True))):
-      with self.battery.PowerMeasurement():
-        pass
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testPowerMeasurement_software(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), True),
-        (self.call.battery._ClearPowerData(), True),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []),
-        (self.call.battery.GetCharging(), False),
-        (self.call.battery.GetCharging(), False),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'reset'], check_return=True), []),
-        (self.call.battery.GetCharging(), False),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
-        (self.call.battery.GetCharging(), True)):
-      with self.battery.PowerMeasurement():
-        pass
-
-
-class BatteryUtilsDiscoverDeviceProfile(BatteryUtilsTest):
-
-  def testDiscoverDeviceProfile_known(self):
-    with self.patch_call(self.call.device.product_model,
-                         return_value='Nexus 4'):
-      self.battery._DiscoverDeviceProfile()
-      self.assertListEqual(self.battery._cache['profile']['name'], ["Nexus 4"])
-
-  def testDiscoverDeviceProfile_unknown(self):
-    with self.patch_call(self.call.device.product_model,
-                         return_value='Other'):
-      self.battery._DiscoverDeviceProfile()
-      self.assertListEqual(self.battery._cache['profile']['name'], [])
-
-
-class BatteryUtilsClearPowerData(BatteryUtilsTest):
-
-  def testClearPowerData_preL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=20):
-      self.assertFalse(self.battery._ClearPowerData())
-
-  def testClearPowerData_clearedL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=22):
-      with self.assertCalls(
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True),
-           []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True, large_output=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'reset'], check_return=True), [])):
-        self.assertTrue(self.battery._ClearPowerData())
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testClearPowerData_notClearedL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=22):
-      with self.assertCalls(
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True),
-           []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True, large_output=True),
-              ['9,1000,l,pwi,uid,0.0327']),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True, large_output=True),
-              ['9,1000,l,pwi,uid,0.0327']),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True, large_output=True),
-              ['9,1000,l,pwi,uid,0.0327']),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True, large_output=True),
-              ['9,1000,l,pwi,uid,0.0']),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'reset'], check_return=True), [])):
-        self.battery._ClearPowerData()
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/android/constants/__init__.py b/third_party/catapult/devil/devil/android/constants/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/third_party/catapult/devil/devil/android/constants/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2015 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.
diff --git a/third_party/catapult/devil/devil/android/constants/chrome.py b/third_party/catapult/devil/devil/android/constants/chrome.py
deleted file mode 100644
index dca04bd..0000000
--- a/third_party/catapult/devil/devil/android/constants/chrome.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import collections
-
-PackageInfo = collections.namedtuple(
-    'PackageInfo',
-    ['package', 'activity', 'cmdline_file', 'devtools_socket'])
-
-PACKAGE_INFO = {
-    'chrome_document': PackageInfo(
-        'com.google.android.apps.chrome.document',
-        'com.google.android.apps.chrome.document.ChromeLauncherActivity',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chrome': PackageInfo(
-        'com.google.android.apps.chrome',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chrome_beta': PackageInfo(
-        'com.chrome.beta',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chrome_stable': PackageInfo(
-        'com.android.chrome',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chrome_dev': PackageInfo(
-        'com.chrome.dev',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chrome_canary': PackageInfo(
-        'com.chrome.canary',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chrome_work': PackageInfo(
-        'com.chrome.work',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chromium': PackageInfo(
-        'org.chromium.chrome',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'content_shell': PackageInfo(
-        'org.chromium.content_shell_apk',
-        '.ContentShellActivity',
-        'content-shell-command-line',
-        'content_shell_devtools_remote'),
-}
diff --git a/third_party/catapult/devil/devil/android/constants/file_system.py b/third_party/catapult/devil/devil/android/constants/file_system.py
deleted file mode 100644
index bffec61..0000000
--- a/third_party/catapult/devil/devil/android/constants/file_system.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2015 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.
-
-TEST_EXECUTABLE_DIR = '/data/local/tmp'
diff --git a/third_party/catapult/devil/devil/android/decorators.py b/third_party/catapult/devil/devil/android/decorators.py
deleted file mode 100644
index 3844b49..0000000
--- a/third_party/catapult/devil/devil/android/decorators.py
+++ /dev/null
@@ -1,176 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Function/method decorators that provide timeout and retry logic.
-"""
-
-import functools
-import itertools
-import sys
-
-from devil.android import device_errors
-from devil.utils import cmd_helper
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-
-DEFAULT_TIMEOUT_ATTR = '_default_timeout'
-DEFAULT_RETRIES_ATTR = '_default_retries'
-
-
-def _TimeoutRetryWrapper(
-    f, timeout_func, retries_func, retry_if_func=timeout_retry.AlwaysRetry,
-    pass_values=False):
-  """ Wraps a funcion with timeout and retry handling logic.
-
-  Args:
-    f: The function to wrap.
-    timeout_func: A callable that returns the timeout value.
-    retries_func: A callable that returns the retries value.
-    pass_values: If True, passes the values returned by |timeout_func| and
-                 |retries_func| to the wrapped function as 'timeout' and
-                 'retries' kwargs, respectively.
-  Returns:
-    The wrapped function.
-  """
-  @functools.wraps(f)
-  def timeout_retry_wrapper(*args, **kwargs):
-    timeout = timeout_func(*args, **kwargs)
-    retries = retries_func(*args, **kwargs)
-    if pass_values:
-      kwargs['timeout'] = timeout
-      kwargs['retries'] = retries
-
-    @functools.wraps(f)
-    def impl():
-      return f(*args, **kwargs)
-    try:
-      if timeout_retry.CurrentTimeoutThreadGroup():
-        # Don't wrap if there's already an outer timeout thread.
-        return impl()
-      else:
-        desc = '%s(%s)' % (f.__name__, ', '.join(itertools.chain(
-            (str(a) for a in args),
-            ('%s=%s' % (k, str(v)) for k, v in kwargs.iteritems()))))
-        return timeout_retry.Run(impl, timeout, retries, desc=desc,
-                                 retry_if_func=retry_if_func)
-    except reraiser_thread.TimeoutError as e:
-      raise device_errors.CommandTimeoutError(str(e)), None, (
-          sys.exc_info()[2])
-    except cmd_helper.TimeoutError as e:
-      raise device_errors.CommandTimeoutError(str(e)), None, (
-          sys.exc_info()[2])
-  return timeout_retry_wrapper
-
-
-def WithTimeoutAndRetries(f):
-  """A decorator that handles timeouts and retries.
-
-  'timeout' and 'retries' kwargs must be passed to the function.
-
-  Args:
-    f: The function to decorate.
-  Returns:
-    The decorated function.
-  """
-  get_timeout = lambda *a, **kw: kw['timeout']
-  get_retries = lambda *a, **kw: kw['retries']
-  return _TimeoutRetryWrapper(f, get_timeout, get_retries)
-
-
-def WithTimeoutAndConditionalRetries(retry_if_func):
-  """Returns a decorator that handles timeouts and, in some cases, retries.
-
-  'timeout' and 'retries' kwargs must be passed to the function.
-
-  Args:
-    retry_if_func: A unary callable that takes an exception and returns
-      whether failures should be retried.
-  Returns:
-    The actual decorator.
-  """
-  def decorator(f):
-    get_timeout = lambda *a, **kw: kw['timeout']
-    get_retries = lambda *a, **kw: kw['retries']
-    return _TimeoutRetryWrapper(
-        f, get_timeout, get_retries, retry_if_func=retry_if_func)
-  return decorator
-
-
-def WithExplicitTimeoutAndRetries(timeout, retries):
-  """Returns a decorator that handles timeouts and retries.
-
-  The provided |timeout| and |retries| values are always used.
-
-  Args:
-    timeout: The number of seconds to wait for the decorated function to
-             return. Always used.
-    retries: The number of times the decorated function should be retried on
-             failure. Always used.
-  Returns:
-    The actual decorator.
-  """
-  def decorator(f):
-    get_timeout = lambda *a, **kw: timeout
-    get_retries = lambda *a, **kw: retries
-    return _TimeoutRetryWrapper(f, get_timeout, get_retries)
-  return decorator
-
-
-def WithTimeoutAndRetriesDefaults(default_timeout, default_retries):
-  """Returns a decorator that handles timeouts and retries.
-
-  The provided |default_timeout| and |default_retries| values are used only
-  if timeout and retries values are not provided.
-
-  Args:
-    default_timeout: The number of seconds to wait for the decorated function
-                     to return. Only used if a 'timeout' kwarg is not passed
-                     to the decorated function.
-    default_retries: The number of times the decorated function should be
-                     retried on failure. Only used if a 'retries' kwarg is not
-                     passed to the decorated function.
-  Returns:
-    The actual decorator.
-  """
-  def decorator(f):
-    get_timeout = lambda *a, **kw: kw.get('timeout', default_timeout)
-    get_retries = lambda *a, **kw: kw.get('retries', default_retries)
-    return _TimeoutRetryWrapper(f, get_timeout, get_retries, pass_values=True)
-  return decorator
-
-
-def WithTimeoutAndRetriesFromInstance(
-    default_timeout_name=DEFAULT_TIMEOUT_ATTR,
-    default_retries_name=DEFAULT_RETRIES_ATTR,
-    min_default_timeout=None):
-  """Returns a decorator that handles timeouts and retries.
-
-  The provided |default_timeout_name| and |default_retries_name| are used to
-  get the default timeout value and the default retries value from the object
-  instance if timeout and retries values are not provided.
-
-  Note that this should only be used to decorate methods, not functions.
-
-  Args:
-    default_timeout_name: The name of the default timeout attribute of the
-                          instance.
-    default_retries_name: The name of the default retries attribute of the
-                          instance.
-    min_timeout: Miniumum timeout to be used when using instance timeout.
-  Returns:
-    The actual decorator.
-  """
-  def decorator(f):
-    def get_timeout(inst, *_args, **kwargs):
-      ret = getattr(inst, default_timeout_name)
-      if min_default_timeout is not None:
-        ret = max(min_default_timeout, ret)
-      return kwargs.get('timeout', ret)
-
-    def get_retries(inst, *_args, **kwargs):
-      return kwargs.get('retries', getattr(inst, default_retries_name))
-    return _TimeoutRetryWrapper(f, get_timeout, get_retries, pass_values=True)
-  return decorator
-
diff --git a/third_party/catapult/devil/devil/android/decorators_test.py b/third_party/catapult/devil/devil/android/decorators_test.py
deleted file mode 100644
index f60953e..0000000
--- a/third_party/catapult/devil/devil/android/decorators_test.py
+++ /dev/null
@@ -1,332 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Unit tests for decorators.py.
-"""
-
-# pylint: disable=W0613
-
-import time
-import traceback
-import unittest
-
-from devil.android import decorators
-from devil.android import device_errors
-from devil.utils import reraiser_thread
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-
-
-class DecoratorsTest(unittest.TestCase):
-  _decorated_function_called_count = 0
-
-  def testFunctionDecoratorDoesTimeouts(self):
-    """Tests that the base decorator handles the timeout logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithTimeoutAndRetries
-    def alwaysTimesOut(timeout=None, retries=None):
-      DecoratorsTest._decorated_function_called_count += 1
-      time.sleep(100)
-
-    start_time = time.time()
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      alwaysTimesOut(timeout=1, retries=0)
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 1)
-    self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
-
-  def testFunctionDecoratorDoesRetries(self):
-    """Tests that the base decorator handles the retries logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithTimeoutAndRetries
-    def alwaysRaisesCommandFailedError(timeout=None, retries=None):
-      DecoratorsTest._decorated_function_called_count += 1
-      raise device_errors.CommandFailedError('testCommand failed')
-
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError(timeout=30, retries=10)
-    self.assertEquals(11, DecoratorsTest._decorated_function_called_count)
-
-  def testFunctionDecoratorRequiresParams(self):
-    """Tests that the base decorator requires timeout and retries params."""
-    @decorators.WithTimeoutAndRetries
-    def requiresExplicitTimeoutAndRetries(timeout=None, retries=None):
-      return (timeout, retries)
-
-    with self.assertRaises(KeyError):
-      requiresExplicitTimeoutAndRetries()
-    with self.assertRaises(KeyError):
-      requiresExplicitTimeoutAndRetries(timeout=10)
-    with self.assertRaises(KeyError):
-      requiresExplicitTimeoutAndRetries(retries=0)
-    expected_timeout = 10
-    expected_retries = 1
-    (actual_timeout, actual_retries) = (
-        requiresExplicitTimeoutAndRetries(timeout=expected_timeout,
-                                          retries=expected_retries))
-    self.assertEquals(expected_timeout, actual_timeout)
-    self.assertEquals(expected_retries, actual_retries)
-
-  def testFunctionDecoratorTranslatesReraiserExceptions(self):
-    """Tests that the explicit decorator translates reraiser exceptions."""
-    @decorators.WithTimeoutAndRetries
-    def alwaysRaisesProvidedException(exception, timeout=None, retries=None):
-      raise exception
-
-    exception_desc = 'Reraiser thread timeout error'
-    with self.assertRaises(device_errors.CommandTimeoutError) as e:
-      alwaysRaisesProvidedException(
-          reraiser_thread.TimeoutError(exception_desc),
-          timeout=10, retries=1)
-    self.assertEquals(exception_desc, str(e.exception))
-
-  def testConditionalRetriesDecoratorRetries(self):
-    def do_not_retry_no_adb_error(exc):
-      return not isinstance(exc, device_errors.NoAdbError)
-
-    actual_tries = [0]
-
-    @decorators.WithTimeoutAndConditionalRetries(do_not_retry_no_adb_error)
-    def alwaysRaisesCommandFailedError(timeout=None, retries=None):
-      actual_tries[0] += 1
-      raise device_errors.CommandFailedError('Command failed :(')
-
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError(timeout=10, retries=10)
-    self.assertEquals(11, actual_tries[0])
-
-  def testConditionalRetriesDecoratorDoesntRetry(self):
-    def do_not_retry_no_adb_error(exc):
-      return not isinstance(exc, device_errors.NoAdbError)
-
-    actual_tries = [0]
-
-    @decorators.WithTimeoutAndConditionalRetries(do_not_retry_no_adb_error)
-    def alwaysRaisesNoAdbError(timeout=None, retries=None):
-      actual_tries[0] += 1
-      raise device_errors.NoAdbError()
-
-    with self.assertRaises(device_errors.NoAdbError):
-      alwaysRaisesNoAdbError(timeout=10, retries=10)
-    self.assertEquals(1, actual_tries[0])
-
-  def testDefaultsFunctionDecoratorDoesTimeouts(self):
-    """Tests that the defaults decorator handles timeout logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithTimeoutAndRetriesDefaults(1, 0)
-    def alwaysTimesOut(timeout=None, retries=None):
-      DecoratorsTest._decorated_function_called_count += 1
-      time.sleep(100)
-
-    start_time = time.time()
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      alwaysTimesOut()
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 1)
-    self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
-
-    DecoratorsTest._decorated_function_called_count = 0
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      alwaysTimesOut(timeout=2)
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 2)
-    self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
-
-  def testDefaultsFunctionDecoratorDoesRetries(self):
-    """Tests that the defaults decorator handles retries logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithTimeoutAndRetriesDefaults(30, 10)
-    def alwaysRaisesCommandFailedError(timeout=None, retries=None):
-      DecoratorsTest._decorated_function_called_count += 1
-      raise device_errors.CommandFailedError('testCommand failed')
-
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError()
-    self.assertEquals(11, DecoratorsTest._decorated_function_called_count)
-
-    DecoratorsTest._decorated_function_called_count = 0
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError(retries=5)
-    self.assertEquals(6, DecoratorsTest._decorated_function_called_count)
-
-  def testDefaultsFunctionDecoratorPassesValues(self):
-    """Tests that the defaults decorator passes timeout and retries kwargs."""
-    @decorators.WithTimeoutAndRetriesDefaults(30, 10)
-    def alwaysReturnsTimeouts(timeout=None, retries=None):
-      return timeout
-
-    self.assertEquals(30, alwaysReturnsTimeouts())
-    self.assertEquals(120, alwaysReturnsTimeouts(timeout=120))
-
-    @decorators.WithTimeoutAndRetriesDefaults(30, 10)
-    def alwaysReturnsRetries(timeout=None, retries=None):
-      return retries
-
-    self.assertEquals(10, alwaysReturnsRetries())
-    self.assertEquals(1, alwaysReturnsRetries(retries=1))
-
-  def testDefaultsFunctionDecoratorTranslatesReraiserExceptions(self):
-    """Tests that the explicit decorator translates reraiser exceptions."""
-    @decorators.WithTimeoutAndRetriesDefaults(30, 10)
-    def alwaysRaisesProvidedException(exception, timeout=None, retries=None):
-      raise exception
-
-    exception_desc = 'Reraiser thread timeout error'
-    with self.assertRaises(device_errors.CommandTimeoutError) as e:
-      alwaysRaisesProvidedException(
-          reraiser_thread.TimeoutError(exception_desc))
-    self.assertEquals(exception_desc, str(e.exception))
-
-  def testExplicitFunctionDecoratorDoesTimeouts(self):
-    """Tests that the explicit decorator handles timeout logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithExplicitTimeoutAndRetries(1, 0)
-    def alwaysTimesOut():
-      DecoratorsTest._decorated_function_called_count += 1
-      time.sleep(100)
-
-    start_time = time.time()
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      alwaysTimesOut()
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 1)
-    self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
-
-  def testExplicitFunctionDecoratorDoesRetries(self):
-    """Tests that the explicit decorator handles retries logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithExplicitTimeoutAndRetries(30, 10)
-    def alwaysRaisesCommandFailedError():
-      DecoratorsTest._decorated_function_called_count += 1
-      raise device_errors.CommandFailedError('testCommand failed')
-
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError()
-    self.assertEquals(11, DecoratorsTest._decorated_function_called_count)
-
-  def testExplicitDecoratorTranslatesReraiserExceptions(self):
-    """Tests that the explicit decorator translates reraiser exceptions."""
-    @decorators.WithExplicitTimeoutAndRetries(30, 10)
-    def alwaysRaisesProvidedException(exception):
-      raise exception
-
-    exception_desc = 'Reraiser thread timeout error'
-    with self.assertRaises(device_errors.CommandTimeoutError) as e:
-      alwaysRaisesProvidedException(
-          reraiser_thread.TimeoutError(exception_desc))
-    self.assertEquals(exception_desc, str(e.exception))
-
-  class _MethodDecoratorTestObject(object):
-    """An object suitable for testing the method decorator."""
-
-    def __init__(self, test_case, default_timeout=_DEFAULT_TIMEOUT,
-                 default_retries=_DEFAULT_RETRIES):
-      self._test_case = test_case
-      self.default_timeout = default_timeout
-      self.default_retries = default_retries
-      self.function_call_counters = {
-          'alwaysRaisesCommandFailedError': 0,
-          'alwaysTimesOut': 0,
-          'requiresExplicitTimeoutAndRetries': 0,
-      }
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries')
-    def alwaysTimesOut(self, timeout=None, retries=None):
-      self.function_call_counters['alwaysTimesOut'] += 1
-      time.sleep(100)
-      self._test_case.assertFalse(True, msg='Failed to time out?')
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries')
-    def alwaysRaisesCommandFailedError(self, timeout=None, retries=None):
-      self.function_call_counters['alwaysRaisesCommandFailedError'] += 1
-      raise device_errors.CommandFailedError('testCommand failed')
-
-    # pylint: disable=no-self-use
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries')
-    def alwaysReturnsTimeout(self, timeout=None, retries=None):
-      return timeout
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries', min_default_timeout=100)
-    def alwaysReturnsTimeoutWithMin(self, timeout=None, retries=None):
-      return timeout
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries')
-    def alwaysReturnsRetries(self, timeout=None, retries=None):
-      return retries
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries')
-    def alwaysRaisesProvidedException(self, exception, timeout=None,
-                                      retries=None):
-      raise exception
-
-    # pylint: enable=no-self-use
-
-  def testMethodDecoratorDoesTimeout(self):
-    """Tests that the method decorator handles timeout logic."""
-    test_obj = self._MethodDecoratorTestObject(self)
-    start_time = time.time()
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      try:
-        test_obj.alwaysTimesOut(timeout=1, retries=0)
-      except:
-        traceback.print_exc()
-        raise
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 1)
-    self.assertEquals(1, test_obj.function_call_counters['alwaysTimesOut'])
-
-  def testMethodDecoratorDoesRetries(self):
-    """Tests that the method decorator handles retries logic."""
-    test_obj = self._MethodDecoratorTestObject(self)
-    with self.assertRaises(device_errors.CommandFailedError):
-      try:
-        test_obj.alwaysRaisesCommandFailedError(retries=10)
-      except:
-        traceback.print_exc()
-        raise
-    self.assertEquals(
-        11, test_obj.function_call_counters['alwaysRaisesCommandFailedError'])
-
-  def testMethodDecoratorPassesValues(self):
-    """Tests that the method decorator passes timeout and retries kwargs."""
-    test_obj = self._MethodDecoratorTestObject(
-        self, default_timeout=42, default_retries=31)
-    self.assertEquals(42, test_obj.alwaysReturnsTimeout())
-    self.assertEquals(41, test_obj.alwaysReturnsTimeout(timeout=41))
-    self.assertEquals(31, test_obj.alwaysReturnsRetries())
-    self.assertEquals(32, test_obj.alwaysReturnsRetries(retries=32))
-
-  def testMethodDecoratorUsesMiniumumTimeout(self):
-    test_obj = self._MethodDecoratorTestObject(
-        self, default_timeout=42, default_retries=31)
-    self.assertEquals(100, test_obj.alwaysReturnsTimeoutWithMin())
-    self.assertEquals(41, test_obj.alwaysReturnsTimeoutWithMin(timeout=41))
-
-  def testMethodDecoratorTranslatesReraiserExceptions(self):
-    test_obj = self._MethodDecoratorTestObject(self)
-
-    exception_desc = 'Reraiser thread timeout error'
-    with self.assertRaises(device_errors.CommandTimeoutError) as e:
-      test_obj.alwaysRaisesProvidedException(
-          reraiser_thread.TimeoutError(exception_desc))
-    self.assertEquals(exception_desc, str(e.exception))
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
-
diff --git a/third_party/catapult/devil/devil/android/device_blacklist.py b/third_party/catapult/devil/devil/android/device_blacklist.py
deleted file mode 100644
index 010e996..0000000
--- a/third_party/catapult/devil/devil/android/device_blacklist.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import json
-import logging
-import os
-import threading
-import time
-
-logger = logging.getLogger(__name__)
-
-
-class Blacklist(object):
-
-  def __init__(self, path):
-    self._blacklist_lock = threading.RLock()
-    self._path = path
-
-  def Read(self):
-    """Reads the blacklist from the blacklist file.
-
-    Returns:
-      A dict containing bad devices.
-    """
-    with self._blacklist_lock:
-      blacklist = dict()
-      if not os.path.exists(self._path):
-        return blacklist
-
-      try:
-        with open(self._path, 'r') as f:
-          blacklist = json.load(f)
-      except (IOError, ValueError) as e:
-        logger.warning('Unable to read blacklist: %s', str(e))
-        os.remove(self._path)
-
-      if not isinstance(blacklist, dict):
-        logger.warning('Ignoring %s: %s (a dict was expected instead)',
-                        self._path, blacklist)
-        blacklist = dict()
-
-      return blacklist
-
-  def Write(self, blacklist):
-    """Writes the provided blacklist to the blacklist file.
-
-    Args:
-      blacklist: list of bad devices to write to the blacklist file.
-    """
-    with self._blacklist_lock:
-      with open(self._path, 'w') as f:
-        json.dump(blacklist, f)
-
-  def Extend(self, devices, reason='unknown'):
-    """Adds devices to blacklist file.
-
-    Args:
-      devices: list of bad devices to be added to the blacklist file.
-      reason: string specifying the reason for blacklist (eg: 'unauthorized')
-    """
-    timestamp = time.time()
-    event_info = {
-        'timestamp': timestamp,
-        'reason': reason,
-    }
-    device_dicts = {device: event_info for device in devices}
-    logger.info('Adding %s to blacklist %s for reason: %s',
-                 ','.join(devices), self._path, reason)
-    with self._blacklist_lock:
-      blacklist = self.Read()
-      blacklist.update(device_dicts)
-      self.Write(blacklist)
-
-  def Reset(self):
-    """Erases the blacklist file if it exists."""
-    logger.info('Resetting blacklist %s', self._path)
-    with self._blacklist_lock:
-      if os.path.exists(self._path):
-        os.remove(self._path)
diff --git a/third_party/catapult/devil/devil/android/device_blacklist_test.py b/third_party/catapult/devil/devil/android/device_blacklist_test.py
deleted file mode 100644
index bc44da5..0000000
--- a/third_party/catapult/devil/devil/android/device_blacklist_test.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import tempfile
-import unittest
-
-from devil.android import device_blacklist
-
-
-class DeviceBlacklistTest(unittest.TestCase):
-
-  def testBlacklistFileDoesNotExist(self):
-    with tempfile.NamedTemporaryFile() as blacklist_file:
-      # Allow the temporary file to be deleted.
-      pass
-
-    test_blacklist = device_blacklist.Blacklist(blacklist_file.name)
-    self.assertEquals({}, test_blacklist.Read())
-
-  def testBlacklistFileIsEmpty(self):
-    try:
-      with tempfile.NamedTemporaryFile(delete=False) as blacklist_file:
-        # Allow the temporary file to be closed.
-        pass
-
-      test_blacklist = device_blacklist.Blacklist(blacklist_file.name)
-      self.assertEquals({}, test_blacklist.Read())
-
-    finally:
-      if os.path.exists(blacklist_file.name):
-        os.remove(blacklist_file.name)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/android/device_errors.py b/third_party/catapult/devil/devil/android/device_errors.py
deleted file mode 100644
index 568e497..0000000
--- a/third_party/catapult/devil/devil/android/device_errors.py
+++ /dev/null
@@ -1,180 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Exception classes raised by AdbWrapper and DeviceUtils.
-"""
-
-from devil import base_error
-from devil.utils import cmd_helper
-from devil.utils import parallelizer
-
-
-class CommandFailedError(base_error.BaseError):
-  """Exception for command failures."""
-
-  def __init__(self, message, device_serial=None):
-    device_leader = '(device: %s)' % device_serial
-    if device_serial is not None and not message.startswith(device_leader):
-      message = '%s %s' % (device_leader, message)
-    self.device_serial = device_serial
-    super(CommandFailedError, self).__init__(message)
-
-  def __eq__(self, other):
-    return (super(CommandFailedError, self).__eq__(other)
-            and self.device_serial == other.device_serial)
-
-  def __ne__(self, other):
-    return not self == other
-
-
-class _BaseCommandFailedError(CommandFailedError):
-  """Base Exception for adb and fastboot command failures."""
-
-  def __init__(self, args, output, status=None, device_serial=None,
-               message=None):
-    self.args = args
-    self.output = output
-    self.status = status
-    if not message:
-      adb_cmd = ' '.join(cmd_helper.SingleQuote(arg) for arg in self.args)
-      message = ['adb %s: failed ' % adb_cmd]
-      if status:
-        message.append('with exit status %s ' % self.status)
-      if output:
-        message.append('and output:\n')
-        message.extend('- %s\n' % line for line in output.splitlines())
-      else:
-        message.append('and no output.')
-      message = ''.join(message)
-    super(_BaseCommandFailedError, self).__init__(message, device_serial)
-
-  def __eq__(self, other):
-    return (super(_BaseCommandFailedError, self).__eq__(other)
-            and self.args == other.args
-            and self.output == other.output
-            and self.status == other.status)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __reduce__(self):
-    """Support pickling."""
-    result = [None, None, None, None, None]
-    super_result = super(_BaseCommandFailedError, self).__reduce__()
-    for i in range(len(super_result)):
-      result[i] = super_result[i]
-
-    # Update the args used to reconstruct this exception.
-    result[1] = (
-        self.args, self.output, self.status, self.device_serial, self.message)
-    return tuple(result)
-
-
-class AdbCommandFailedError(_BaseCommandFailedError):
-  """Exception for adb command failures."""
-
-  def __init__(self, args, output, status=None, device_serial=None,
-               message=None):
-    super(AdbCommandFailedError, self).__init__(
-        args, output, status=status, message=message,
-        device_serial=device_serial)
-
-
-class FastbootCommandFailedError(_BaseCommandFailedError):
-  """Exception for fastboot command failures."""
-
-  def __init__(self, args, output, status=None, device_serial=None,
-               message=None):
-    super(FastbootCommandFailedError, self).__init__(
-        args, output, status=status, message=message,
-        device_serial=device_serial)
-
-
-class DeviceVersionError(CommandFailedError):
-  """Exception for device version failures."""
-
-  def __init__(self, message, device_serial=None):
-    super(DeviceVersionError, self).__init__(message, device_serial)
-
-
-class AdbShellCommandFailedError(AdbCommandFailedError):
-  """Exception for shell command failures run via adb."""
-
-  def __init__(self, command, output, status, device_serial=None):
-    self.command = command
-    message = ['shell command run via adb failed on the device:\n',
-               '  command: %s\n' % command]
-    message.append('  exit status: %s\n' % status)
-    if output:
-      message.append('  output:\n')
-      if isinstance(output, basestring):
-        output_lines = output.splitlines()
-      else:
-        output_lines = output
-      message.extend('  - %s\n' % line for line in output_lines)
-    else:
-      message.append("  output: ''\n")
-    message = ''.join(message)
-    super(AdbShellCommandFailedError, self).__init__(
-      ['shell', command], output, status, device_serial, message)
-
-  def __reduce__(self):
-    """Support pickling."""
-    result = [None, None, None, None, None]
-    super_result = super(AdbShellCommandFailedError, self).__reduce__()
-    for i in range(len(super_result)):
-      result[i] = super_result[i]
-
-    # Update the args used to reconstruct this exception.
-    result[1] = (self.command, self.output, self.status, self.device_serial)
-    return tuple(result)
-
-
-class CommandTimeoutError(base_error.BaseError):
-  """Exception for command timeouts."""
-  pass
-
-
-class DeviceUnreachableError(base_error.BaseError):
-  """Exception for device unreachable failures."""
-  pass
-
-
-class NoDevicesError(base_error.BaseError):
-  """Exception for having no devices attached."""
-
-  def __init__(self, msg=None):
-    super(NoDevicesError, self).__init__(
-        msg or 'No devices attached.', is_infra_error=True)
-
-
-class MultipleDevicesError(base_error.BaseError):
-  """Exception for having multiple attached devices without selecting one."""
-
-  def __init__(self, devices):
-    parallel_devices = parallelizer.Parallelizer(devices)
-    descriptions = parallel_devices.pMap(
-        lambda d: d.build_description).pGet(None)
-    msg = ('More than one device available. Use -d/--device to select a device '
-           'by serial.\n\nAvailable devices:\n')
-    for d, desc in zip(devices, descriptions):
-      msg += '  %s (%s)\n' % (d, desc)
-
-    super(MultipleDevicesError, self).__init__(msg, is_infra_error=True)
-
-
-class NoAdbError(base_error.BaseError):
-  """Exception for being unable to find ADB."""
-
-  def __init__(self, msg=None):
-    super(NoAdbError, self).__init__(
-        msg or 'Unable to find adb.', is_infra_error=True)
-
-
-class DeviceChargingError(CommandFailedError):
-  """Exception for device charging errors."""
-
-  def __init__(self, message, device_serial=None):
-    super(DeviceChargingError, self).__init__(message, device_serial)
diff --git a/third_party/catapult/devil/devil/android/device_errors_test.py b/third_party/catapult/devil/devil/android/device_errors_test.py
deleted file mode 100755
index 68a4f16..0000000
--- a/third_party/catapult/devil/devil/android/device_errors_test.py
+++ /dev/null
@@ -1,72 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import pickle
-import sys
-import unittest
-
-from devil.android import device_errors
-
-
-class DeviceErrorsTest(unittest.TestCase):
-
-  def assertIsPicklable(self, original):
-    pickled = pickle.dumps(original)
-    reconstructed = pickle.loads(pickled)
-    self.assertEquals(original, reconstructed)
-
-  def testPicklable_AdbCommandFailedError(self):
-    original = device_errors.AdbCommandFailedError(
-        ['these', 'are', 'adb', 'args'], 'adb failure output', status=':(',
-        device_serial='0123456789abcdef')
-    self.assertIsPicklable(original)
-
-  def testPicklable_AdbShellCommandFailedError(self):
-    original = device_errors.AdbShellCommandFailedError(
-        'foo', 'erroneous foo output', '1', device_serial='0123456789abcdef')
-    self.assertIsPicklable(original)
-
-  def testPicklable_CommandFailedError(self):
-    original = device_errors.CommandFailedError(
-        'sample command failed')
-    self.assertIsPicklable(original)
-
-  def testPicklable_CommandTimeoutError(self):
-    original = device_errors.CommandTimeoutError(
-        'My fake command timed out :(')
-    self.assertIsPicklable(original)
-
-  def testPicklable_DeviceChargingError(self):
-    original = device_errors.DeviceChargingError(
-        'Fake device failed to charge')
-    self.assertIsPicklable(original)
-
-  def testPicklable_DeviceUnreachableError(self):
-    original = device_errors.DeviceUnreachableError
-    self.assertIsPicklable(original)
-
-  def testPicklable_FastbootCommandFailedError(self):
-    original = device_errors.FastbootCommandFailedError(
-        ['these', 'are', 'fastboot', 'args'], 'fastboot failure output',
-        status=':(', device_serial='0123456789abcdef')
-    self.assertIsPicklable(original)
-
-  def testPicklable_MultipleDevicesError(self):
-    # TODO(jbudorick): Implement this after implementing a stable DeviceUtils
-    # fake. https://github.com/catapult-project/catapult/issues/3145
-    pass
-
-  def testPicklable_NoAdbError(self):
-    original = device_errors.NoAdbError()
-    self.assertIsPicklable(original)
-
-  def testPicklable_NoDevicesError(self):
-    original = device_errors.NoDevicesError()
-    self.assertIsPicklable(original)
-
-
-
-if __name__ == '__main__':
-  sys.exit(unittest.main())
diff --git a/third_party/catapult/devil/devil/android/device_list.py b/third_party/catapult/devil/devil/android/device_list.py
deleted file mode 100644
index 0fbb0f1..0000000
--- a/third_party/catapult/devil/devil/android/device_list.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""A module to keep track of devices across builds."""
-
-import json
-import logging
-import os
-
-logger = logging.getLogger(__name__)
-
-
-def GetPersistentDeviceList(file_name):
-  """Returns a list of devices.
-
-  Args:
-    file_name: the file name containing a list of devices.
-
-  Returns: List of device serial numbers that were on the bot.
-  """
-  if not os.path.isfile(file_name):
-    logger.warning("Device file %s doesn't exist.", file_name)
-    return []
-
-  try:
-    with open(file_name) as f:
-      devices = json.load(f)
-    if not isinstance(devices, list) or not all(isinstance(d, basestring)
-                                                for d in devices):
-      logger.warning('Unrecognized device file format: %s', devices)
-      return []
-    return [d for d in devices if d != '(error)']
-  except ValueError:
-    logger.exception(
-        'Error reading device file %s. Falling back to old format.', file_name)
-
-  # TODO(bpastene) Remove support for old unstructured file format.
-  with open(file_name) as f:
-    return [d for d in f.read().splitlines() if d != '(error)']
-
-
-def WritePersistentDeviceList(file_name, device_list):
-  path = os.path.dirname(file_name)
-  assert isinstance(device_list, list)
-  # If there is a problem with ADB "(error)" can be added to the device list.
-  # These should be removed before saving.
-  device_list = [d for d in device_list if d != '(error)']
-  if not os.path.exists(path):
-    os.makedirs(path)
-  with open(file_name, 'w') as f:
-    json.dump(device_list, f)
diff --git a/third_party/catapult/devil/devil/android/device_signal.py b/third_party/catapult/devil/devil/android/device_signal.py
deleted file mode 100644
index 2cec46d..0000000
--- a/third_party/catapult/devil/devil/android/device_signal.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2015 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.
-
-"""Defines constants for signals that should be supported on devices.
-
-Note: Obtained by running `kill -l` on a user device.
-"""
-
-
-SIGHUP = 1  # Hangup
-SIGINT = 2  # Interrupt
-SIGQUIT = 3  # Quit
-SIGILL = 4  # Illegal instruction
-SIGTRAP = 5  # Trap
-SIGABRT = 6  # Aborted
-SIGBUS = 7  # Bus error
-SIGFPE = 8  # Floating point exception
-SIGKILL = 9  # Killed
-SIGUSR1 = 10  # User signal 1
-SIGSEGV = 11  # Segmentation fault
-SIGUSR2 = 12  # User signal 2
-SIGPIPE = 13  # Broken pipe
-SIGALRM = 14  # Alarm clock
-SIGTERM = 15  # Terminated
-SIGSTKFLT = 16  # Stack fault
-SIGCHLD = 17  # Child exited
-SIGCONT = 18  # Continue
-SIGSTOP = 19  # Stopped (signal)
-SIGTSTP = 20  # Stopped
-SIGTTIN = 21  # Stopped (tty input)
-SIGTTOU = 22  # Stopped (tty output)
-SIGURG = 23  # Urgent I/O condition
-SIGXCPU = 24  # CPU time limit exceeded
-SIGXFSZ = 25  # File size limit exceeded
-SIGVTALRM = 26  # Virtual timer expired
-SIGPROF = 27  # Profiling timer expired
-SIGWINCH = 28  # Window size changed
-SIGIO = 29  # I/O possible
-SIGPWR = 30  # Power failure
-SIGSYS = 31  # Bad system call
diff --git a/third_party/catapult/devil/devil/android/device_temp_file.py b/third_party/catapult/devil/devil/android/device_temp_file.py
deleted file mode 100644
index 4d0c7ad..0000000
--- a/third_party/catapult/devil/devil/android/device_temp_file.py
+++ /dev/null
@@ -1,63 +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.
-
-"""A temp file that automatically gets pushed and deleted from a device."""
-
-# pylint: disable=W0622
-
-import posixpath
-import random
-import threading
-
-from devil.android import device_errors
-from devil.utils import cmd_helper
-
-
-class DeviceTempFile(object):
-
-  def __init__(self, adb, suffix='', prefix='temp_file', dir='/data/local/tmp'):
-    """Find an unused temporary file path on the device.
-
-    When this object is closed, the file will be deleted on the device.
-
-    Args:
-      adb: An instance of AdbWrapper
-      suffix: The suffix of the name of the temp file.
-      prefix: The prefix of the name of the temp file.
-      dir: The directory on the device where to place the temp file.
-    Raises:
-      ValueError if any of suffix, prefix, or dir are None.
-    """
-    if None in (dir, prefix, suffix):
-      m = 'Provided None path component. (dir: %s, prefix: %s, suffix: %s)' % (
-          dir, prefix, suffix)
-      raise ValueError(m)
-
-    self._adb = adb
-    # Python's random module use 52-bit numbers according to its docs.
-    random_hex = hex(random.randint(0, 2 ** 52))[2:]
-    self.name = posixpath.join(dir, '%s-%s%s' % (prefix, random_hex, suffix))
-    self.name_quoted = cmd_helper.SingleQuote(self.name)
-
-  def close(self):
-    """Deletes the temporary file from the device."""
-    # ignore exception if the file is already gone.
-    def delete_temporary_file():
-      try:
-        self._adb.Shell('rm -f %s' % self.name_quoted, expect_status=None)
-      except device_errors.AdbCommandFailedError:
-        # file does not exist on Android version without 'rm -f' support (ICS)
-        pass
-
-    # It shouldn't matter when the temp file gets deleted, so do so
-    # asynchronously.
-    threading.Thread(
-        target=delete_temporary_file,
-        name='delete_temporary_file(%s)' % self._adb.GetDeviceSerial()).start()
-
-  def __enter__(self):
-    return self
-
-  def __exit__(self, type, value, traceback):
-    self.close()
diff --git a/third_party/catapult/devil/devil/android/device_test_case.py b/third_party/catapult/devil/devil/android/device_test_case.py
deleted file mode 100644
index b995fa6..0000000
--- a/third_party/catapult/devil/devil/android/device_test_case.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import threading
-import unittest
-
-from devil.android import device_errors
-from devil.android import device_utils
-
-_devices_lock = threading.Lock()
-_devices_condition = threading.Condition(_devices_lock)
-_devices = set()
-
-
-def PrepareDevices(*_args):
-
-  raw_devices = device_utils.DeviceUtils.HealthyDevices()
-  live_devices = []
-  for d in raw_devices:
-    try:
-      d.WaitUntilFullyBooted(timeout=5, retries=0)
-      live_devices.append(str(d))
-    except (device_errors.CommandFailedError,
-            device_errors.CommandTimeoutError):
-      pass
-  with _devices_lock:
-    _devices.update(set(live_devices))
-
-  if not _devices:
-    raise Exception('No live devices attached.')
-
-
-class DeviceTestCase(unittest.TestCase):
-
-  def __init__(self, *args, **kwargs):
-    super(DeviceTestCase, self).__init__(*args, **kwargs)
-    self.serial = None
-
-  #override
-  def setUp(self):
-    super(DeviceTestCase, self).setUp()
-    with _devices_lock:
-      while not _devices:
-        _devices_condition.wait(5)
-      self.serial = _devices.pop()
-
-  #override
-  def tearDown(self):
-    super(DeviceTestCase, self).tearDown()
-    with _devices_lock:
-      _devices.add(self.serial)
-      _devices_condition.notify()
-
diff --git a/third_party/catapult/devil/devil/android/device_utils.py b/third_party/catapult/devil/devil/android/device_utils.py
deleted file mode 100644
index 50f362c..0000000
--- a/third_party/catapult/devil/devil/android/device_utils.py
+++ /dev/null
@@ -1,2640 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Provides a variety of device interactions based on adb.
-
-Eventually, this will be based on adb_wrapper.
-"""
-# pylint: disable=unused-argument
-
-import calendar
-import collections
-import itertools
-import json
-import logging
-import multiprocessing
-import os
-import posixpath
-import pprint
-import re
-import shutil
-import stat
-import tempfile
-import time
-import threading
-import uuid
-import zipfile
-
-from devil import base_error
-from devil import devil_env
-from devil.utils import cmd_helper
-from devil.android import apk_helper
-from devil.android import device_signal
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android import device_temp_file
-from devil.android import install_commands
-from devil.android import logcat_monitor
-from devil.android import md5sum
-from devil.android.constants import chrome
-from devil.android.sdk import adb_wrapper
-from devil.android.sdk import intent
-from devil.android.sdk import keyevent
-from devil.android.sdk import split_select
-from devil.android.sdk import version_codes
-from devil.utils import host_utils
-from devil.utils import parallelizer
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-from devil.utils import zip_utils
-
-logger = logging.getLogger(__name__)
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-
-# A sentinel object for default values
-# TODO(jbudorick,perezju): revisit how default values are handled by
-# the timeout_retry decorators.
-DEFAULT = object()
-
-_RESTART_ADBD_SCRIPT = """
-  trap '' HUP
-  trap '' TERM
-  trap '' PIPE
-  function restart() {
-    stop adbd
-    start adbd
-  }
-  restart &
-"""
-
-# Not all permissions can be set.
-_PERMISSIONS_BLACKLIST = [
-    'android.permission.ACCESS_LOCATION_EXTRA_COMMANDS',
-    'android.permission.ACCESS_MOCK_LOCATION',
-    'android.permission.ACCESS_NETWORK_STATE',
-    'android.permission.ACCESS_NOTIFICATION_POLICY',
-    'android.permission.ACCESS_WIFI_STATE',
-    'android.permission.AUTHENTICATE_ACCOUNTS',
-    'android.permission.BLUETOOTH',
-    'android.permission.BLUETOOTH_ADMIN',
-    'android.permission.BROADCAST_STICKY',
-    'android.permission.CHANGE_NETWORK_STATE',
-    'android.permission.CHANGE_WIFI_MULTICAST_STATE',
-    'android.permission.CHANGE_WIFI_STATE',
-    'android.permission.DISABLE_KEYGUARD',
-    'android.permission.DOWNLOAD_WITHOUT_NOTIFICATION',
-    'android.permission.EXPAND_STATUS_BAR',
-    'android.permission.GET_PACKAGE_SIZE',
-    'android.permission.INSTALL_SHORTCUT',
-    'android.permission.INTERNET',
-    'android.permission.KILL_BACKGROUND_PROCESSES',
-    'android.permission.MANAGE_ACCOUNTS',
-    'android.permission.MODIFY_AUDIO_SETTINGS',
-    'android.permission.NFC',
-    'android.permission.READ_SYNC_SETTINGS',
-    'android.permission.READ_SYNC_STATS',
-    'android.permission.RECEIVE_BOOT_COMPLETED',
-    'android.permission.RECORD_VIDEO',
-    'android.permission.REORDER_TASKS',
-    'android.permission.REQUEST_INSTALL_PACKAGES',
-    'android.permission.RUN_INSTRUMENTATION',
-    'android.permission.SET_ALARM',
-    'android.permission.SET_TIME_ZONE',
-    'android.permission.SET_WALLPAPER',
-    'android.permission.SET_WALLPAPER_HINTS',
-    'android.permission.TRANSMIT_IR',
-    'android.permission.USE_CREDENTIALS',
-    'android.permission.USE_FINGERPRINT',
-    'android.permission.VIBRATE',
-    'android.permission.WAKE_LOCK',
-    'android.permission.WRITE_SYNC_SETTINGS',
-    'com.android.browser.permission.READ_HISTORY_BOOKMARKS',
-    'com.android.browser.permission.WRITE_HISTORY_BOOKMARKS',
-    'com.android.launcher.permission.INSTALL_SHORTCUT',
-    'com.chrome.permission.DEVICE_EXTRAS',
-    'com.google.android.apps.now.CURRENT_ACCOUNT_ACCESS',
-    'com.google.android.c2dm.permission.RECEIVE',
-    'com.google.android.providers.gsf.permission.READ_GSERVICES',
-    'com.sec.enterprise.knox.MDM_CONTENT_PROVIDER',
-]
-for package_info in chrome.PACKAGE_INFO.itervalues():
-  _PERMISSIONS_BLACKLIST.extend([
-      '%s.permission.C2D_MESSAGE' % package_info.package,
-      '%s.permission.READ_WRITE_BOOKMARK_FOLDERS' % package_info.package,
-      '%s.TOS_ACKED' % package_info.package])
-
-_CURRENT_FOCUS_CRASH_RE = re.compile(
-    r'\s*mCurrentFocus.*Application (Error|Not Responding): (\S+)}')
-
-_GETPROP_RE = re.compile(r'\[(.*?)\]: \[(.*?)\]')
-
-# Regex to parse the long (-l) output of 'ls' command, c.f.
-# https://github.com/landley/toybox/blob/master/toys/posix/ls.c#L446
-_LONG_LS_OUTPUT_RE = re.compile(
-    r'(?P<st_mode>[\w-]{10})\s+'                  # File permissions
-    r'(?:(?P<st_nlink>\d+)\s+)?'                  # Number of links (optional)
-    r'(?P<st_owner>\w+)\s+'                       # Name of owner
-    r'(?P<st_group>\w+)\s+'                       # Group of owner
-    r'(?:'                                        # Either ...
-      r'(?P<st_rdev_major>\d+),\s+'                 # Device major, and
-      r'(?P<st_rdev_minor>\d+)\s+'                  # Device minor
-    r'|'                                          # .. or
-      r'(?P<st_size>\d+)\s+'                        # Size in bytes
-    r')?'                                         # .. or nothing
-    r'(?P<st_mtime>\d{4}-\d\d-\d\d \d\d:\d\d)\s+' # Modification date/time
-    r'(?P<filename>.+?)'                          # File name
-    r'(?: -> (?P<symbolic_link_to>.+))?'          # Symbolic link (optional)
-    r'$'                                          # End of string
-)
-_LS_DATE_FORMAT = '%Y-%m-%d %H:%M'
-_FILE_MODE_RE = re.compile(r'[dbclps-](?:[r-][w-][xSs-]){2}[r-][w-][xTt-]$')
-_FILE_MODE_KIND = {
-    'd': stat.S_IFDIR, 'b': stat.S_IFBLK, 'c': stat.S_IFCHR,
-    'l': stat.S_IFLNK, 'p': stat.S_IFIFO, 's': stat.S_IFSOCK,
-    '-': stat.S_IFREG}
-_FILE_MODE_PERMS = [
-    stat.S_IRUSR, stat.S_IWUSR, stat.S_IXUSR,
-    stat.S_IRGRP, stat.S_IWGRP, stat.S_IXGRP,
-    stat.S_IROTH, stat.S_IWOTH, stat.S_IXOTH,
-]
-_FILE_MODE_SPECIAL = [
-    ('s', stat.S_ISUID),
-    ('s', stat.S_ISGID),
-    ('t', stat.S_ISVTX),
-]
-_SELINUX_MODE = {
-    'enforcing': True,
-    'permissive': False,
-    'disabled': None
-}
-# Some devices require different logic for checking if root is necessary
-_SPECIAL_ROOT_DEVICE_LIST = [
-    'marlin',
-    'sailfish',
-]
-
-
-@decorators.WithExplicitTimeoutAndRetries(
-    _DEFAULT_TIMEOUT, _DEFAULT_RETRIES)
-def GetAVDs():
-  """Returns a list of Android Virtual Devices.
-
-  Returns:
-    A list containing the configured AVDs.
-  """
-  lines = cmd_helper.GetCmdOutput([
-      os.path.join(devil_env.config.LocalPath('android_sdk'),
-                   'tools', 'android'),
-      'list', 'avd']).splitlines()
-  avds = []
-  for line in lines:
-    if 'Name:' not in line:
-      continue
-    key, value = (s.strip() for s in line.split(':', 1))
-    if key == 'Name':
-      avds.append(value)
-  return avds
-
-
-@decorators.WithExplicitTimeoutAndRetries(
-    _DEFAULT_TIMEOUT, _DEFAULT_RETRIES)
-def RestartServer():
-  """Restarts the adb server.
-
-  Raises:
-    CommandFailedError if we fail to kill or restart the server.
-  """
-  def adb_killed():
-    return not adb_wrapper.AdbWrapper.IsServerOnline()
-
-  def adb_started():
-    return adb_wrapper.AdbWrapper.IsServerOnline()
-
-  adb_wrapper.AdbWrapper.KillServer()
-  if not timeout_retry.WaitFor(adb_killed, wait_period=1, max_tries=5):
-    # TODO(perezju): raise an exception after fixng http://crbug.com/442319
-    logger.warning('Failed to kill adb server')
-  adb_wrapper.AdbWrapper.StartServer()
-  if not timeout_retry.WaitFor(adb_started, wait_period=1, max_tries=5):
-    raise device_errors.CommandFailedError('Failed to start adb server')
-
-
-def _ParseModeString(mode_str):
-  """Parse a mode string, e.g. 'drwxrwxrwx', into a st_mode value.
-
-  Effectively the reverse of |mode_to_string| in, e.g.:
-  https://github.com/landley/toybox/blob/master/lib/lib.c#L896
-  """
-  if not _FILE_MODE_RE.match(mode_str):
-    raise ValueError('Unexpected file mode %r', mode_str)
-  mode = _FILE_MODE_KIND[mode_str[0]]
-  for c, flag in zip(mode_str[1:], _FILE_MODE_PERMS):
-    if c != '-' and c.islower():
-      mode |= flag
-  for c, (t, flag) in zip(mode_str[3::3], _FILE_MODE_SPECIAL):
-    if c.lower() == t:
-      mode |= flag
-  return mode
-
-
-def _GetTimeStamp():
-  """Return a basic ISO 8601 time stamp with the current local time."""
-  return time.strftime('%Y%m%dT%H%M%S', time.localtime())
-
-
-def _JoinLines(lines):
-  # makes sure that the last line is also terminated, and is more memory
-  # efficient than first appending an end-line to each line and then joining
-  # all of them together.
-  return ''.join(s for line in lines for s in (line, '\n'))
-
-
-def _CreateAdbWrapper(device):
-  if isinstance(device, adb_wrapper.AdbWrapper):
-    return device
-  else:
-    return adb_wrapper.AdbWrapper(device)
-
-
-def _FormatPartialOutputError(output):
-  lines = output.splitlines() if isinstance(output, basestring) else output
-  message = ['Partial output found:']
-  if len(lines) > 11:
-    message.extend('- %s' % line for line in lines[:5])
-    message.extend('<snip>')
-    message.extend('- %s' % line for line in lines[-5:])
-  else:
-    message.extend('- %s' % line for line in lines)
-  return '\n'.join(message)
-
-
-class DeviceUtils(object):
-
-  _MAX_ADB_COMMAND_LENGTH = 512
-  _MAX_ADB_OUTPUT_LENGTH = 32768
-  _LAUNCHER_FOCUSED_RE = re.compile(
-      r'\s*mCurrentFocus.*(Launcher|launcher).*')
-  _VALID_SHELL_VARIABLE = re.compile('^[a-zA-Z_][a-zA-Z0-9_]*$')
-
-  LOCAL_PROPERTIES_PATH = posixpath.join('/', 'data', 'local.prop')
-
-  # Property in /data/local.prop that controls Java assertions.
-  JAVA_ASSERT_PROPERTY = 'dalvik.vm.enableassertions'
-
-  def __init__(self, device, enable_device_files_cache=False,
-               default_timeout=_DEFAULT_TIMEOUT,
-               default_retries=_DEFAULT_RETRIES):
-    """DeviceUtils constructor.
-
-    Args:
-      device: Either a device serial, an existing AdbWrapper instance, or an
-        an existing AndroidCommands instance.
-      enable_device_files_cache: For PushChangedFiles(), cache checksums of
-        pushed files rather than recomputing them on a subsequent call.
-      default_timeout: An integer containing the default number of seconds to
-        wait for an operation to complete if no explicit value is provided.
-      default_retries: An integer containing the default number or times an
-        operation should be retried on failure if no explicit value is provided.
-    """
-    self.adb = None
-    if isinstance(device, basestring):
-      self.adb = _CreateAdbWrapper(device)
-    elif isinstance(device, adb_wrapper.AdbWrapper):
-      self.adb = device
-    else:
-      raise ValueError('Unsupported device value: %r' % device)
-    self._commands_installed = None
-    self._default_timeout = default_timeout
-    self._default_retries = default_retries
-    self._enable_device_files_cache = enable_device_files_cache
-    self._cache = {}
-    self._client_caches = {}
-    self._cache_lock = threading.RLock()
-    assert hasattr(self, decorators.DEFAULT_TIMEOUT_ATTR)
-    assert hasattr(self, decorators.DEFAULT_RETRIES_ATTR)
-
-    self._ClearCache()
-
-  @property
-  def serial(self):
-    """Returns the device serial."""
-    return self.adb.GetDeviceSerial()
-
-  def __eq__(self, other):
-    """Checks whether |other| refers to the same device as |self|.
-
-    Args:
-      other: The object to compare to. This can be a basestring, an instance
-        of adb_wrapper.AdbWrapper, or an instance of DeviceUtils.
-    Returns:
-      Whether |other| refers to the same device as |self|.
-    """
-    return self.serial == str(other)
-
-  def __lt__(self, other):
-    """Compares two instances of DeviceUtils.
-
-    This merely compares their serial numbers.
-
-    Args:
-      other: The instance of DeviceUtils to compare to.
-    Returns:
-      Whether |self| is less than |other|.
-    """
-    return self.serial < other.serial
-
-  def __str__(self):
-    """Returns the device serial."""
-    return self.serial
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def IsOnline(self, timeout=None, retries=None):
-    """Checks whether the device is online.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device is online, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    try:
-      return self.adb.GetState() == 'device'
-    except base_error.BaseError as exc:
-      logger.info('Failed to get state: %s', exc)
-      return False
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def HasRoot(self, timeout=None, retries=None):
-    """Checks whether or not adbd has root privileges.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if adbd has root privileges, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    try:
-      if self.product_name in _SPECIAL_ROOT_DEVICE_LIST:
-        return self.GetProp('service.adb.root') == '1'
-      self.RunShellCommand(['ls', '/root'], check_return=True)
-      return True
-    except device_errors.AdbCommandFailedError:
-      return False
-
-  def NeedsSU(self, timeout=DEFAULT, retries=DEFAULT):
-    """Checks whether 'su' is needed to access protected resources.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if 'su' is available on the device and is needed to to access
-        protected resources; False otherwise if either 'su' is not available
-        (e.g. because the device has a user build), or not needed (because adbd
-        already has root privileges).
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if 'needs_su' not in self._cache:
-      cmd = '%s && ! ls /root' % self._Su('ls /root')
-      if self.product_name in _SPECIAL_ROOT_DEVICE_LIST:
-        if self.HasRoot():
-          self._cache['needs_su'] = False
-          return False
-        cmd = 'which which && which su'
-      try:
-        self.RunShellCommand(cmd, shell=True, check_return=True,
-            timeout=self._default_timeout if timeout is DEFAULT else timeout,
-            retries=self._default_retries if retries is DEFAULT else retries)
-        self._cache['needs_su'] = True
-      except device_errors.AdbCommandFailedError:
-        self._cache['needs_su'] = False
-    return self._cache['needs_su']
-
-
-  def _Su(self, command):
-    if self.build_version_sdk >= version_codes.MARSHMALLOW:
-      return 'su 0 %s' % command
-    return 'su -c %s' % command
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def EnableRoot(self, timeout=None, retries=None):
-    """Restarts adbd with root privileges.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if root could not be enabled.
-      CommandTimeoutError on timeout.
-    """
-    if self.IsUserBuild():
-      raise device_errors.CommandFailedError(
-          'Cannot enable root in user builds.', str(self))
-    if 'needs_su' in self._cache:
-      del self._cache['needs_su']
-    self.adb.Root()
-    self.WaitUntilFullyBooted()
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def IsUserBuild(self, timeout=None, retries=None):
-    """Checks whether or not the device is running a user build.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device is running a user build, False otherwise (i.e. if
-        it's running a userdebug build).
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    return self.build_type == 'user'
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetExternalStoragePath(self, timeout=None, retries=None):
-    """Get the device's path to its SD card.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's path to its SD card.
-
-    Raises:
-      CommandFailedError if the external storage path could not be determined.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    self._EnsureCacheInitialized()
-    if not self._cache['external_storage']:
-      raise device_errors.CommandFailedError('$EXTERNAL_STORAGE is not set',
-                                             str(self))
-    return self._cache['external_storage']
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetApplicationPaths(self, package, timeout=None, retries=None):
-    """Get the paths of the installed apks on the device for the given package.
-
-    Args:
-      package: Name of the package.
-
-    Returns:
-      List of paths to the apks on the device for the given package.
-    """
-    return self._GetApplicationPathsInternal(package)
-
-  def _GetApplicationPathsInternal(self, package, skip_cache=False):
-    cached_result = self._cache['package_apk_paths'].get(package)
-    if cached_result is not None and not skip_cache:
-      if package in self._cache['package_apk_paths_to_verify']:
-        self._cache['package_apk_paths_to_verify'].remove(package)
-        # Don't verify an app that is not thought to be installed. We are
-        # concerned only with apps we think are installed having been
-        # uninstalled manually.
-        if cached_result and not self.PathExists(cached_result):
-          cached_result = None
-          self._cache['package_apk_checksums'].pop(package, 0)
-      if cached_result is not None:
-        return list(cached_result)
-    # 'pm path' is liable to incorrectly exit with a nonzero number starting
-    # in Lollipop.
-    # TODO(jbudorick): Check if this is fixed as new Android versions are
-    # released to put an upper bound on this.
-    should_check_return = (self.build_version_sdk < version_codes.LOLLIPOP)
-    output = self.RunShellCommand(
-        ['pm', 'path', package], check_return=should_check_return)
-    apks = []
-    for line in output:
-      if not line.startswith('package:'):
-        continue
-      apks.append(line[len('package:'):])
-    if not apks and output:
-      raise device_errors.CommandFailedError(
-          'pm path returned: %r' % '\n'.join(output), str(self))
-    self._cache['package_apk_paths'][package] = list(apks)
-    return apks
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetApplicationVersion(self, package, timeout=None, retries=None):
-    """Get the version name of a package installed on the device.
-
-    Args:
-      package: Name of the package.
-
-    Returns:
-      A string with the version name or None if the package is not found
-      on the device.
-    """
-    output = self.RunShellCommand(
-        ['dumpsys', 'package', package], check_return=True)
-    if not output:
-      return None
-    for line in output:
-      line = line.strip()
-      if line.startswith('versionName='):
-        return line[len('versionName='):]
-    raise device_errors.CommandFailedError(
-        'Version name for %s not found on dumpsys output' % package, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetApplicationDataDirectory(self, package, timeout=None, retries=None):
-    """Get the data directory on the device for the given package.
-
-    Args:
-      package: Name of the package.
-
-    Returns:
-      The package's data directory.
-    Raises:
-      CommandFailedError if the package's data directory can't be found,
-        whether because it's not installed or otherwise.
-    """
-    output = self._RunPipedShellCommand(
-        'pm dump %s | grep dataDir=' % cmd_helper.SingleQuote(package))
-    for line in output:
-      _, _, dataDir = line.partition('dataDir=')
-      if dataDir:
-        return dataDir
-    raise device_errors.CommandFailedError(
-        'Could not find data directory for %s', package)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def WaitUntilFullyBooted(self, wifi=False, timeout=None, retries=None):
-    """Wait for the device to fully boot.
-
-    This means waiting for the device to boot, the package manager to be
-    available, and the SD card to be ready. It can optionally mean waiting
-    for wifi to come up, too.
-
-    Args:
-      wifi: A boolean indicating if we should wait for wifi to come up or not.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError if one of the component waits times out.
-      DeviceUnreachableError if the device becomes unresponsive.
-    """
-    def sd_card_ready():
-      try:
-        self.RunShellCommand(['test', '-d', self.GetExternalStoragePath()],
-                             check_return=True)
-        return True
-      except device_errors.AdbCommandFailedError:
-        return False
-
-    def pm_ready():
-      try:
-        return self._GetApplicationPathsInternal('android', skip_cache=True)
-      except device_errors.CommandFailedError:
-        return False
-
-    def boot_completed():
-      try:
-        return self.GetProp('sys.boot_completed', cache=False) == '1'
-      except device_errors.CommandFailedError:
-        return False
-
-    def wifi_enabled():
-      return 'Wi-Fi is enabled' in self.RunShellCommand(['dumpsys', 'wifi'],
-                                                        check_return=False)
-
-    self.adb.WaitForDevice()
-    timeout_retry.WaitFor(sd_card_ready)
-    timeout_retry.WaitFor(pm_ready)
-    timeout_retry.WaitFor(boot_completed)
-    if wifi:
-      timeout_retry.WaitFor(wifi_enabled)
-
-  REBOOT_DEFAULT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=REBOOT_DEFAULT_TIMEOUT)
-  def Reboot(self, block=True, wifi=False, timeout=None, retries=None):
-    """Reboot the device.
-
-    Args:
-      block: A boolean indicating if we should wait for the reboot to complete.
-      wifi: A boolean indicating if we should wait for wifi to be enabled after
-        the reboot. The option has no effect unless |block| is also True.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    def device_offline():
-      return not self.IsOnline()
-
-    self.adb.Reboot()
-    self._ClearCache()
-    timeout_retry.WaitFor(device_offline, wait_period=1)
-    if block:
-      self.WaitUntilFullyBooted(wifi=wifi)
-
-  INSTALL_DEFAULT_TIMEOUT = 4 * _DEFAULT_TIMEOUT
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=INSTALL_DEFAULT_TIMEOUT)
-  def Install(self, apk, allow_downgrade=False, reinstall=False,
-              permissions=None, timeout=None, retries=None):
-    """Install an APK.
-
-    Noop if an identical APK is already installed.
-
-    Args:
-      apk: An ApkHelper instance or string containing the path to the APK.
-      allow_downgrade: A boolean indicating if we should allow downgrades.
-      reinstall: A boolean indicating if we should keep any existing app data.
-      permissions: Set of permissions to set. If not set, finds permissions with
-          apk helper. To set no permissions, pass [].
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the installation fails.
-      CommandTimeoutError if the installation times out.
-      DeviceUnreachableError on missing device.
-    """
-    self._InstallInternal(apk, None, allow_downgrade=allow_downgrade,
-                          reinstall=reinstall, permissions=permissions)
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=INSTALL_DEFAULT_TIMEOUT)
-  def InstallSplitApk(self, base_apk, split_apks, allow_downgrade=False,
-                      reinstall=False, allow_cached_props=False,
-                      permissions=None, timeout=None, retries=None):
-    """Install a split APK.
-
-    Noop if all of the APK splits are already installed.
-
-    Args:
-      base_apk: An ApkHelper instance or string containing the path to the base
-          APK.
-      split_apks: A list of strings of paths of all of the APK splits.
-      allow_downgrade: A boolean indicating if we should allow downgrades.
-      reinstall: A boolean indicating if we should keep any existing app data.
-      allow_cached_props: Whether to use cached values for device properties.
-      permissions: Set of permissions to set. If not set, finds permissions with
-          apk helper. To set no permissions, pass [].
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the installation fails.
-      CommandTimeoutError if the installation times out.
-      DeviceUnreachableError on missing device.
-      DeviceVersionError if device SDK is less than Android L.
-    """
-    self._InstallInternal(base_apk, split_apks, reinstall=reinstall,
-                          allow_cached_props=allow_cached_props,
-                          permissions=permissions,
-                          allow_downgrade=allow_downgrade)
-
-  def _InstallInternal(self, base_apk, split_apks, allow_downgrade=False,
-                       reinstall=False, allow_cached_props=False,
-                       permissions=None):
-    if split_apks:
-      self._CheckSdkLevel(version_codes.LOLLIPOP)
-
-    base_apk = apk_helper.ToHelper(base_apk)
-
-    all_apks = [base_apk.path]
-    if split_apks:
-      all_apks += split_select.SelectSplits(
-        self, base_apk.path, split_apks, allow_cached_props=allow_cached_props)
-      if len(all_apks) == 1:
-        logger.warning('split-select did not select any from %s', split_apks)
-
-    missing_apks = [apk for apk in all_apks if not os.path.exists(apk)]
-    if missing_apks:
-      raise device_errors.CommandFailedError(
-          'Attempted to install non-existent apks: %s'
-              % pprint.pformat(missing_apks))
-
-    package_name = base_apk.GetPackageName()
-    device_apk_paths = self._GetApplicationPathsInternal(package_name)
-
-    apks_to_install = None
-    host_checksums = None
-    if not device_apk_paths:
-      apks_to_install = all_apks
-    elif len(device_apk_paths) > 1 and not split_apks:
-      logger.warning(
-          'Installing non-split APK when split APK was previously installed')
-      apks_to_install = all_apks
-    elif len(device_apk_paths) == 1 and split_apks:
-      logger.warning(
-          'Installing split APK when non-split APK was previously installed')
-      apks_to_install = all_apks
-    else:
-      try:
-        apks_to_install, host_checksums = (
-            self._ComputeStaleApks(package_name, all_apks))
-      except EnvironmentError as e:
-        logger.warning('Error calculating md5: %s', e)
-        apks_to_install, host_checksums = all_apks, None
-      if apks_to_install and not reinstall:
-        self.Uninstall(package_name)
-        apks_to_install = all_apks
-
-    if apks_to_install:
-      # Assume that we won't know the resulting device state.
-      self._cache['package_apk_paths'].pop(package_name, 0)
-      self._cache['package_apk_checksums'].pop(package_name, 0)
-      if split_apks:
-        partial = package_name if len(apks_to_install) < len(all_apks) else None
-        self.adb.InstallMultiple(
-            apks_to_install, partial=partial, reinstall=reinstall,
-            allow_downgrade=allow_downgrade)
-      else:
-        self.adb.Install(
-            base_apk.path, reinstall=reinstall, allow_downgrade=allow_downgrade)
-      if (permissions is None
-          and self.build_version_sdk >= version_codes.MARSHMALLOW):
-        permissions = base_apk.GetPermissions()
-      self.GrantPermissions(package_name, permissions)
-      # Upon success, we know the device checksums, but not their paths.
-      if host_checksums is not None:
-        self._cache['package_apk_checksums'][package_name] = host_checksums
-    else:
-      # Running adb install terminates running instances of the app, so to be
-      # consistent, we explicitly terminate it when skipping the install.
-      self.ForceStop(package_name)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def Uninstall(self, package_name, keep_data=False, timeout=None,
-                retries=None):
-    """Remove the app |package_name| from the device.
-
-    This is a no-op if the app is not already installed.
-
-    Args:
-      package_name: The package to uninstall.
-      keep_data: (optional) Whether to keep the data and cache directories.
-      timeout: Timeout in seconds.
-      retries: Number of retries.
-
-    Raises:
-      CommandFailedError if the uninstallation fails.
-      CommandTimeoutError if the uninstallation times out.
-      DeviceUnreachableError on missing device.
-    """
-    installed = self._GetApplicationPathsInternal(package_name)
-    if not installed:
-      return
-    try:
-      self.adb.Uninstall(package_name, keep_data)
-      self._cache['package_apk_paths'][package_name] = []
-      self._cache['package_apk_checksums'][package_name] = set()
-    except:
-      # Clear cache since we can't be sure of the state.
-      self._cache['package_apk_paths'].pop(package_name, 0)
-      self._cache['package_apk_checksums'].pop(package_name, 0)
-      raise
-
-  def _CheckSdkLevel(self, required_sdk_level):
-    """Raises an exception if the device does not have the required SDK level.
-    """
-    if self.build_version_sdk < required_sdk_level:
-      raise device_errors.DeviceVersionError(
-          ('Requires SDK level %s, device is SDK level %s' %
-           (required_sdk_level, self.build_version_sdk)),
-           device_serial=self.serial)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def RunShellCommand(self, cmd, shell=False, check_return=False, cwd=None,
-                      env=None, run_as=None, as_root=False, single_line=False,
-                      large_output=False, raw_output=False, timeout=None,
-                      retries=None):
-    """Run an ADB shell command.
-
-    The command to run |cmd| should be a sequence of program arguments
-    (preferred) or a single string with a shell script to run.
-
-    When |cmd| is a sequence, it is assumed to contain the name of the command
-    to run followed by its arguments. In this case, arguments are passed to the
-    command exactly as given, preventing any further processing by the shell.
-    This allows callers to easily pass arguments with spaces or special
-    characters without having to worry about quoting rules. Whenever possible,
-    it is recomended to pass |cmd| as a sequence.
-
-    When |cmd| is passed as a single string, |shell| should be set to True.
-    The command will be interpreted and run by the shell on the device,
-    allowing the use of shell features such as pipes, wildcards, or variables.
-    Failing to set shell=True will issue a warning, but this will be changed
-    to a hard failure in the future (see: catapult:#3242).
-
-    This behaviour is consistent with that of command runners in cmd_helper as
-    well as Python's own subprocess.Popen.
-
-    TODO(perezju) Change the default of |check_return| to True when callers
-      have switched to the new behaviour.
-
-    Args:
-      cmd: A sequence containing the command to run and its arguments, or a
-        string with a shell script to run (should also set shell=True).
-      shell: A boolean indicating whether shell features may be used in |cmd|.
-      check_return: A boolean indicating whether or not the return code should
-        be checked.
-      cwd: The device directory in which the command should be run.
-      env: The environment variables with which the command should be run.
-      run_as: A string containing the package as which the command should be
-        run.
-      as_root: A boolean indicating whether the shell command should be run
-        with root privileges.
-      single_line: A boolean indicating if only a single line of output is
-        expected.
-      large_output: Uses a work-around for large shell command output. Without
-        this large output will be truncated.
-      raw_output: Whether to only return the raw output
-          (no splitting into lines).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      If single_line is False, the output of the command as a list of lines,
-      otherwise, a string with the unique line of output emmited by the command
-      (with the optional newline at the end stripped).
-
-    Raises:
-      AdbCommandFailedError if check_return is True and the exit code of
-        the command run on the device is non-zero.
-      CommandFailedError if single_line is True but the output contains two or
-        more lines.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    def env_quote(key, value):
-      if not DeviceUtils._VALID_SHELL_VARIABLE.match(key):
-        raise KeyError('Invalid shell variable name %r' % key)
-      # using double quotes here to allow interpolation of shell variables
-      return '%s=%s' % (key, cmd_helper.DoubleQuote(value))
-
-    def run(cmd):
-      return self.adb.Shell(cmd)
-
-    def handle_check_return(cmd):
-      try:
-        return run(cmd)
-      except device_errors.AdbCommandFailedError as exc:
-        if check_return:
-          raise
-        else:
-          return exc.output
-
-    def handle_large_command(cmd):
-      if len(cmd) < self._MAX_ADB_COMMAND_LENGTH:
-        return handle_check_return(cmd)
-      else:
-        with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script:
-          self._WriteFileWithPush(script.name, cmd)
-          logger.info('Large shell command will be run from file: %s ...',
-                      cmd[:self._MAX_ADB_COMMAND_LENGTH])
-          return handle_check_return('sh %s' % script.name_quoted)
-
-    def handle_large_output(cmd, large_output_mode):
-      if large_output_mode:
-        with device_temp_file.DeviceTempFile(self.adb) as large_output_file:
-          cmd = '( %s )>%s' % (cmd, large_output_file.name)
-          logger.debug('Large output mode enabled. Will write output to '
-                       'device and read results from file.')
-          handle_large_command(cmd)
-          return self.ReadFile(large_output_file.name, force_pull=True)
-      else:
-        try:
-          return handle_large_command(cmd)
-        except device_errors.AdbCommandFailedError as exc:
-          if exc.status is None:
-            logger.error(_FormatPartialOutputError(exc.output))
-            logger.warning('Attempting to run in large_output mode.')
-            logger.warning('Use RunShellCommand(..., large_output=True) for '
-                           'shell commands that expect a lot of output.')
-            return handle_large_output(cmd, True)
-          else:
-            raise
-
-    if isinstance(cmd, basestring):
-      if not shell:
-        logging.warning(
-            'The command to run should preferably be passed as a sequence of'
-            ' args. If shell features are needed (pipes, wildcards, variables)'
-            ' clients should explicitly set shell=True.')
-    else:
-      cmd = ' '.join(cmd_helper.SingleQuote(s) for s in cmd)
-    if env:
-      env = ' '.join(env_quote(k, v) for k, v in env.iteritems())
-      cmd = '%s %s' % (env, cmd)
-    if cwd:
-      cmd = 'cd %s && %s' % (cmd_helper.SingleQuote(cwd), cmd)
-    if run_as:
-      cmd = 'run-as %s sh -c %s' % (cmd_helper.SingleQuote(run_as),
-                                    cmd_helper.SingleQuote(cmd))
-    if as_root and self.NeedsSU():
-      # "su -c sh -c" allows using shell features in |cmd|
-      cmd = self._Su('sh -c %s' % cmd_helper.SingleQuote(cmd))
-
-    output = handle_large_output(cmd, large_output)
-
-    if raw_output:
-      return output
-
-    output = output.splitlines()
-    if single_line:
-      if not output:
-        return ''
-      elif len(output) == 1:
-        return output[0]
-      else:
-        msg = 'one line of output was expected, but got: %s'
-        raise device_errors.CommandFailedError(msg % output, str(self))
-    else:
-      return output
-
-  def _RunPipedShellCommand(self, script, **kwargs):
-    PIPESTATUS_LEADER = 'PIPESTATUS: '
-
-    script += '; echo "%s${PIPESTATUS[@]}"' % PIPESTATUS_LEADER
-    kwargs.update(shell=True, check_return=True)
-    output = self.RunShellCommand(script, **kwargs)
-    pipestatus_line = output[-1]
-
-    if not pipestatus_line.startswith(PIPESTATUS_LEADER):
-      logger.error('Pipe exit statuses of shell script missing.')
-      raise device_errors.AdbShellCommandFailedError(
-          script, output, status=None,
-          device_serial=self.serial)
-
-    output = output[:-1]
-    statuses = [
-        int(s) for s in pipestatus_line[len(PIPESTATUS_LEADER):].split()]
-    if any(statuses):
-      raise device_errors.AdbShellCommandFailedError(
-          script, output, status=statuses,
-          device_serial=self.serial)
-    return output
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def KillAll(self, process_name, exact=False, signum=device_signal.SIGKILL,
-              as_root=False, blocking=False, quiet=False,
-              timeout=None, retries=None):
-    """Kill all processes with the given name on the device.
-
-    Args:
-      process_name: A string containing the name of the process to kill.
-      exact: A boolean indicating whether to kill all processes matching
-             the string |process_name| exactly, or all of those which contain
-             |process_name| as a substring. Defaults to False.
-      signum: An integer containing the signal number to send to kill. Defaults
-              to SIGKILL (9).
-      as_root: A boolean indicating whether the kill should be executed with
-               root privileges.
-      blocking: A boolean indicating whether we should wait until all processes
-                with the given |process_name| are dead.
-      quiet: A boolean indicating whether to ignore the fact that no processes
-             to kill were found.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The number of processes attempted to kill.
-
-    Raises:
-      CommandFailedError if no process was killed and |quiet| is False.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    procs_pids = self.GetPids(process_name)
-    if exact:
-      procs_pids = {process_name: procs_pids.get(process_name, [])}
-    pids = set(itertools.chain(*procs_pids.values()))
-    if not pids:
-      if quiet:
-        return 0
-      else:
-        raise device_errors.CommandFailedError(
-            'No process "%s"' % process_name, str(self))
-
-    logger.info(
-        'KillAll(%r, ...) attempting to kill the following:', process_name)
-    for name, ids in procs_pids.iteritems():
-      for i in ids:
-        logger.info('  %05s %s', str(i), name)
-
-    cmd = ['kill', '-%d' % signum] + sorted(pids)
-    self.RunShellCommand(cmd, as_root=as_root, check_return=True)
-
-    def all_pids_killed():
-      procs_pids_remain = self.GetPids(process_name)
-      return not pids.intersection(itertools.chain(*procs_pids_remain.values()))
-
-    if blocking:
-      timeout_retry.WaitFor(all_pids_killed, wait_period=0.1)
-
-    return len(pids)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def StartActivity(self, intent_obj, blocking=False, trace_file_name=None,
-                    force_stop=False, timeout=None, retries=None):
-    """Start package's activity on the device.
-
-    Args:
-      intent_obj: An Intent object to send.
-      blocking: A boolean indicating whether we should wait for the activity to
-                finish launching.
-      trace_file_name: If present, a string that both indicates that we want to
-                       profile the activity and contains the path to which the
-                       trace should be saved.
-      force_stop: A boolean indicating whether we should stop the activity
-                  before starting it.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the activity could not be started.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    cmd = ['am', 'start']
-    if blocking:
-      cmd.append('-W')
-    if trace_file_name:
-      cmd.extend(['--start-profiler', trace_file_name])
-    if force_stop:
-      cmd.append('-S')
-    cmd.extend(intent_obj.am_args)
-    for line in self.RunShellCommand(cmd, check_return=True):
-      if line.startswith('Error:'):
-        raise device_errors.CommandFailedError(line, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def StartInstrumentation(self, component, finish=True, raw=False,
-                           extras=None, timeout=None, retries=None):
-    if extras is None:
-      extras = {}
-
-    cmd = ['am', 'instrument']
-    if finish:
-      cmd.append('-w')
-    if raw:
-      cmd.append('-r')
-    for k, v in extras.iteritems():
-      cmd.extend(['-e', str(k), str(v)])
-    cmd.append(component)
-
-    # Store the package name in a shell variable to help the command stay under
-    # the _MAX_ADB_COMMAND_LENGTH limit.
-    package = component.split('/')[0]
-    shell_snippet = 'p=%s;%s' % (package,
-                                 cmd_helper.ShrinkToSnippet(cmd, 'p', package))
-    return self.RunShellCommand(shell_snippet, shell=True, check_return=True,
-                                large_output=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def BroadcastIntent(self, intent_obj, timeout=None, retries=None):
-    """Send a broadcast intent.
-
-    Args:
-      intent: An Intent to broadcast.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    cmd = ['am', 'broadcast'] + intent_obj.am_args
-    self.RunShellCommand(cmd, check_return=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GoHome(self, timeout=None, retries=None):
-    """Return to the home screen and obtain launcher focus.
-
-    This command launches the home screen and attempts to obtain
-    launcher focus until the timeout is reached.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    def is_launcher_focused():
-      output = self.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                    check_return=True, large_output=True)
-      return any(self._LAUNCHER_FOCUSED_RE.match(l) for l in output)
-
-    def dismiss_popups():
-      # There is a dialog present; attempt to get rid of it.
-      # Not all dialogs can be dismissed with back.
-      self.SendKeyEvent(keyevent.KEYCODE_ENTER)
-      self.SendKeyEvent(keyevent.KEYCODE_BACK)
-      return is_launcher_focused()
-
-    # If Home is already focused, return early to avoid unnecessary work.
-    if is_launcher_focused():
-      return
-
-    self.StartActivity(
-        intent.Intent(action='android.intent.action.MAIN',
-                      category='android.intent.category.HOME'),
-        blocking=True)
-
-    if not is_launcher_focused():
-      timeout_retry.WaitFor(dismiss_popups, wait_period=1)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def ForceStop(self, package, timeout=None, retries=None):
-    """Close the application.
-
-    Args:
-      package: A string containing the name of the package to stop.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    cmd = 'p=%s;if [[ "$(ps)" = *$p* ]]; then am force-stop $p; fi'
-    self.RunShellCommand(cmd % package, shell=True, check_return=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def ClearApplicationState(
-      self, package, permissions=None, timeout=None, retries=None):
-    """Clear all state for the given package.
-
-    Args:
-      package: A string containing the name of the package to stop.
-      permissions: List of permissions to set after clearing data.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    # Check that the package exists before clearing it for android builds below
-    # JB MR2. Necessary because calling pm clear on a package that doesn't exist
-    # may never return.
-    if ((self.build_version_sdk >= version_codes.JELLY_BEAN_MR2)
-        or self._GetApplicationPathsInternal(package)):
-      self.RunShellCommand(['pm', 'clear', package], check_return=True)
-      self.GrantPermissions(package, permissions)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SendKeyEvent(self, keycode, timeout=None, retries=None):
-    """Sends a keycode to the device.
-
-    See the devil.android.sdk.keyevent module for suitable keycode values.
-
-    Args:
-      keycode: A integer keycode to send to the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    self.RunShellCommand(['input', 'keyevent', format(keycode, 'd')],
-                         check_return=True)
-
-  PUSH_CHANGED_FILES_DEFAULT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=PUSH_CHANGED_FILES_DEFAULT_TIMEOUT)
-  def PushChangedFiles(self, host_device_tuples, timeout=None,
-                       retries=None, delete_device_stale=False):
-    """Push files to the device, skipping files that don't need updating.
-
-    When a directory is pushed, it is traversed recursively on the host and
-    all files in it are pushed to the device as needed.
-    Additionally, if delete_device_stale option is True,
-    files that exist on the device but don't exist on the host are deleted.
-
-    Args:
-      host_device_tuples: A list of (host_path, device_path) tuples, where
-        |host_path| is an absolute path of a file or directory on the host
-        that should be minimially pushed to the device, and |device_path| is
-        an absolute path of the destination on the device.
-      timeout: timeout in seconds
-      retries: number of retries
-      delete_device_stale: option to delete stale files on device
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-
-    all_changed_files = []
-    all_stale_files = []
-    missing_dirs = []
-    cache_commit_funcs = []
-    for h, d in host_device_tuples:
-      assert os.path.isabs(h) and posixpath.isabs(d)
-      h = os.path.realpath(h)
-      changed_files, up_to_date_files, stale_files, cache_commit_func = (
-          self._GetChangedAndStaleFiles(h, d, delete_device_stale))
-      all_changed_files += changed_files
-      all_stale_files += stale_files
-      cache_commit_funcs.append(cache_commit_func)
-      if changed_files and not up_to_date_files and not stale_files:
-        if os.path.isdir(h):
-          missing_dirs.append(d)
-        else:
-          missing_dirs.append(posixpath.dirname(d))
-
-    if delete_device_stale and all_stale_files:
-      self.RunShellCommand(['rm', '-f'] + all_stale_files, check_return=True)
-
-    if all_changed_files:
-      if missing_dirs:
-        self.RunShellCommand(['mkdir', '-p'] + missing_dirs, check_return=True)
-      self._PushFilesImpl(host_device_tuples, all_changed_files)
-    for func in cache_commit_funcs:
-      func()
-
-  def _GetChangedAndStaleFiles(self, host_path, device_path, track_stale=False):
-    """Get files to push and delete
-
-    Args:
-      host_path: an absolute path of a file or directory on the host
-      device_path: an absolute path of a file or directory on the device
-      track_stale: whether to bother looking for stale files (slower)
-
-    Returns:
-      a four-element tuple
-      1st element: a list of (host_files_path, device_files_path) tuples to push
-      2nd element: a list of host_files_path that are up-to-date
-      3rd element: a list of stale files under device_path, or [] when
-        track_stale == False
-      4th element: a cache commit function.
-    """
-    try:
-      # Length calculations below assume no trailing /.
-      host_path = host_path.rstrip('/')
-      device_path = device_path.rstrip('/')
-
-      specific_device_paths = [device_path]
-      ignore_other_files = not track_stale and os.path.isdir(host_path)
-      if ignore_other_files:
-        specific_device_paths = []
-        for root, _, filenames in os.walk(host_path):
-          relative_dir = root[len(host_path) + 1:]
-          specific_device_paths.extend(
-              posixpath.join(device_path, relative_dir, f) for f in filenames)
-
-      def calculate_host_checksums():
-        return md5sum.CalculateHostMd5Sums([host_path])
-
-      def calculate_device_checksums():
-        if self._enable_device_files_cache:
-          cache_entry = self._cache['device_path_checksums'].get(device_path)
-          if cache_entry and cache_entry[0] == ignore_other_files:
-            return dict(cache_entry[1])
-
-        sums = md5sum.CalculateDeviceMd5Sums(specific_device_paths, self)
-
-        cache_entry = [ignore_other_files, sums]
-        self._cache['device_path_checksums'][device_path] = cache_entry
-        return dict(sums)
-
-      host_checksums, device_checksums = reraiser_thread.RunAsync((
-          calculate_host_checksums,
-          calculate_device_checksums))
-    except EnvironmentError as e:
-      logger.warning('Error calculating md5: %s', e)
-      return ([(host_path, device_path)], [], [], lambda: 0)
-
-    to_push = []
-    up_to_date = []
-    to_delete = []
-    if os.path.isfile(host_path):
-      host_checksum = host_checksums.get(host_path)
-      device_checksum = device_checksums.get(device_path)
-      if host_checksum == device_checksum:
-        up_to_date.append(host_path)
-      else:
-        to_push.append((host_path, device_path))
-    else:
-      for host_abs_path, host_checksum in host_checksums.iteritems():
-        device_abs_path = posixpath.join(
-            device_path, os.path.relpath(host_abs_path, host_path))
-        device_checksum = device_checksums.pop(device_abs_path, None)
-        if device_checksum == host_checksum:
-          up_to_date.append(host_abs_path)
-        else:
-          to_push.append((host_abs_path, device_abs_path))
-      to_delete = device_checksums.keys()
-
-    def cache_commit_func():
-      new_sums = {posixpath.join(device_path, path[len(host_path) + 1:]): val
-                  for path, val in host_checksums.iteritems()}
-      cache_entry = [ignore_other_files, new_sums]
-      self._cache['device_path_checksums'][device_path] = cache_entry
-
-    return (to_push, up_to_date, to_delete, cache_commit_func)
-
-  def _ComputeDeviceChecksumsForApks(self, package_name):
-    ret = self._cache['package_apk_checksums'].get(package_name)
-    if ret is None:
-      device_paths = self._GetApplicationPathsInternal(package_name)
-      file_to_checksums = md5sum.CalculateDeviceMd5Sums(device_paths, self)
-      ret = set(file_to_checksums.values())
-      self._cache['package_apk_checksums'][package_name] = ret
-    return ret
-
-  def _ComputeStaleApks(self, package_name, host_apk_paths):
-    def calculate_host_checksums():
-      return md5sum.CalculateHostMd5Sums(host_apk_paths)
-
-    def calculate_device_checksums():
-      return self._ComputeDeviceChecksumsForApks(package_name)
-
-    host_checksums, device_checksums = reraiser_thread.RunAsync((
-        calculate_host_checksums, calculate_device_checksums))
-    stale_apks = [k for (k, v) in host_checksums.iteritems()
-                  if v not in device_checksums]
-    return stale_apks, set(host_checksums.values())
-
-  def _PushFilesImpl(self, host_device_tuples, files):
-    if not files:
-      return
-
-    size = sum(host_utils.GetRecursiveDiskUsage(h) for h, _ in files)
-    file_count = len(files)
-    dir_size = sum(host_utils.GetRecursiveDiskUsage(h)
-                   for h, _ in host_device_tuples)
-    dir_file_count = 0
-    for h, _ in host_device_tuples:
-      if os.path.isdir(h):
-        dir_file_count += sum(len(f) for _r, _d, f in os.walk(h))
-      else:
-        dir_file_count += 1
-
-    push_duration = self._ApproximateDuration(
-        file_count, file_count, size, False)
-    dir_push_duration = self._ApproximateDuration(
-        len(host_device_tuples), dir_file_count, dir_size, False)
-    zip_duration = self._ApproximateDuration(1, 1, size, True)
-
-    if (dir_push_duration < push_duration and dir_push_duration < zip_duration
-        # TODO(jbudorick): Resume directory pushing once clients have switched
-        # to 1.0.36-compatible syntax.
-        and False):
-      self._PushChangedFilesIndividually(host_device_tuples)
-    elif push_duration < zip_duration:
-      self._PushChangedFilesIndividually(files)
-    elif self._commands_installed is False:
-      # Already tried and failed to install unzip command.
-      self._PushChangedFilesIndividually(files)
-    elif not self._PushChangedFilesZipped(
-        files, [d for _, d in host_device_tuples]):
-      self._PushChangedFilesIndividually(files)
-
-  def _MaybeInstallCommands(self):
-    if self._commands_installed is None:
-      try:
-        if not install_commands.Installed(self):
-          install_commands.InstallCommands(self)
-        self._commands_installed = True
-      except device_errors.CommandFailedError as e:
-        logger.warning('unzip not available: %s', str(e))
-        self._commands_installed = False
-    return self._commands_installed
-
-  @staticmethod
-  def _ApproximateDuration(adb_calls, file_count, byte_count, is_zipping):
-    # We approximate the time to push a set of files to a device as:
-    #   t = c1 * a + c2 * f + c3 + b / c4 + b / (c5 * c6), where
-    #     t: total time (sec)
-    #     c1: adb call time delay (sec)
-    #     a: number of times adb is called (unitless)
-    #     c2: push time delay (sec)
-    #     f: number of files pushed via adb (unitless)
-    #     c3: zip time delay (sec)
-    #     c4: zip rate (bytes/sec)
-    #     b: total number of bytes (bytes)
-    #     c5: transfer rate (bytes/sec)
-    #     c6: compression ratio (unitless)
-
-    # All of these are approximations.
-    ADB_CALL_PENALTY = 0.1  # seconds
-    ADB_PUSH_PENALTY = 0.01  # seconds
-    ZIP_PENALTY = 2.0  # seconds
-    ZIP_RATE = 10000000.0  # bytes / second
-    TRANSFER_RATE = 2000000.0  # bytes / second
-    COMPRESSION_RATIO = 2.0  # unitless
-
-    adb_call_time = ADB_CALL_PENALTY * adb_calls
-    adb_push_setup_time = ADB_PUSH_PENALTY * file_count
-    if is_zipping:
-      zip_time = ZIP_PENALTY + byte_count / ZIP_RATE
-      transfer_time = byte_count / (TRANSFER_RATE * COMPRESSION_RATIO)
-    else:
-      zip_time = 0
-      transfer_time = byte_count / TRANSFER_RATE
-    return adb_call_time + adb_push_setup_time + zip_time + transfer_time
-
-  def _PushChangedFilesIndividually(self, files):
-    for h, d in files:
-      self.adb.Push(h, d)
-
-  def _PushChangedFilesZipped(self, files, dirs):
-    with tempfile.NamedTemporaryFile(suffix='.zip') as zip_file:
-      zip_proc = multiprocessing.Process(
-          target=DeviceUtils._CreateDeviceZip,
-          args=(zip_file.name, files))
-      zip_proc.start()
-      try:
-        # While it's zipping, ensure the unzip command exists on the device.
-        if not self._MaybeInstallCommands():
-          zip_proc.terminate()
-          return False
-
-        # Warm up NeedsSU cache while we're still zipping.
-        self.NeedsSU()
-        with device_temp_file.DeviceTempFile(
-            self.adb, suffix='.zip') as device_temp:
-          zip_proc.join()
-          self.adb.Push(zip_file.name, device_temp.name)
-          quoted_dirs = ' '.join(cmd_helper.SingleQuote(d) for d in dirs)
-          self.RunShellCommand(
-              'unzip %s&&chmod -R 777 %s' % (device_temp.name, quoted_dirs),
-              shell=True, as_root=True,
-              env={'PATH': '%s:$PATH' % install_commands.BIN_DIR},
-              check_return=True)
-      finally:
-        if zip_proc.is_alive():
-          zip_proc.terminate()
-    return True
-
-  @staticmethod
-  def _CreateDeviceZip(zip_path, host_device_tuples):
-    with zipfile.ZipFile(zip_path, 'w') as zip_file:
-      for host_path, device_path in host_device_tuples:
-        zip_utils.WriteToZipFile(zip_file, host_path, device_path)
-
-  # TODO(nednguyen): remove this and migrate the callsite to PathExists().
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def FileExists(self, device_path, timeout=None, retries=None):
-    """Checks whether the given file exists on the device.
-
-    Arguments are the same as PathExists.
-    """
-    return self.PathExists(device_path, timeout=timeout, retries=retries)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def PathExists(self, device_paths, as_root=False, timeout=None, retries=None):
-    """Checks whether the given path(s) exists on the device.
-
-    Args:
-      device_path: A string containing the absolute path to the file on the
-                   device, or an iterable of paths to check.
-      as_root: Whether root permissions should be use to check for the existence
-               of the given path(s).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the all given paths exist on the device, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    paths = device_paths
-    if isinstance(paths, basestring):
-      paths = (paths,)
-    if not paths:
-      return True
-    cmd = ['test', '-e', paths[0]]
-    for p in paths[1:]:
-      cmd.extend(['-a', '-e', p])
-    try:
-      self.RunShellCommand(cmd, as_root=as_root, check_return=True,
-                           timeout=timeout, retries=retries)
-      return True
-    except device_errors.CommandFailedError:
-      return False
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def RemovePath(self, device_path, force=False, recursive=False,
-                 as_root=False, timeout=None, retries=None):
-    """Removes the given path(s) from the device.
-
-    Args:
-      device_path: A string containing the absolute path to the file on the
-                   device, or an iterable of paths to check.
-      force: Whether to remove the path(s) with force (-f).
-      recursive: Whether to remove any directories in the path(s) recursively.
-      as_root: Whether root permissions should be use to remove the given
-               path(s).
-      timeout: timeout in seconds
-      retries: number of retries
-    """
-    args = ['rm']
-    if force:
-      args.append('-f')
-    if recursive:
-      args.append('-r')
-    if isinstance(device_path, basestring):
-      args.append(device_path)
-    else:
-      args.extend(device_path)
-    self.RunShellCommand(args, as_root=as_root, check_return=True)
-
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def PullFile(self, device_path, host_path, timeout=None, retries=None):
-    """Pull a file from the device.
-
-    Args:
-      device_path: A string containing the absolute path of the file to pull
-                   from the device.
-      host_path: A string containing the absolute path of the destination on
-                 the host.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-    """
-    # Create the base dir if it doesn't exist already
-    dirname = os.path.dirname(host_path)
-    if dirname and not os.path.exists(dirname):
-      os.makedirs(dirname)
-    self.adb.Pull(device_path, host_path)
-
-  def _ReadFileWithPull(self, device_path):
-    try:
-      d = tempfile.mkdtemp()
-      host_temp_path = os.path.join(d, 'tmp_ReadFileWithPull')
-      self.adb.Pull(device_path, host_temp_path)
-      with open(host_temp_path, 'r') as host_temp:
-        return host_temp.read()
-    finally:
-      if os.path.exists(d):
-        shutil.rmtree(d)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def ReadFile(self, device_path, as_root=False, force_pull=False,
-               timeout=None, retries=None):
-    """Reads the contents of a file from the device.
-
-    Args:
-      device_path: A string containing the absolute path of the file to read
-                   from the device.
-      as_root: A boolean indicating whether the read should be executed with
-               root privileges.
-      force_pull: A boolean indicating whether to force the operation to be
-          performed by pulling a file from the device. The default is, when the
-          contents are short, to retrieve the contents using cat instead.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The contents of |device_path| as a string. Contents are intepreted using
-      universal newlines, so the caller will see them encoded as '\n'. Also,
-      all lines will be terminated.
-
-    Raises:
-      AdbCommandFailedError if the file can't be read.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    def get_size(path):
-      return self.FileSize(path, as_root=as_root)
-
-    if (not force_pull
-        and 0 < get_size(device_path) <= self._MAX_ADB_OUTPUT_LENGTH):
-      return _JoinLines(self.RunShellCommand(
-          ['cat', device_path], as_root=as_root, check_return=True))
-    elif as_root and self.NeedsSU():
-      with device_temp_file.DeviceTempFile(self.adb) as device_temp:
-        cmd = 'SRC=%s DEST=%s;cp "$SRC" "$DEST" && chmod 666 "$DEST"' % (
-            cmd_helper.SingleQuote(device_path),
-            cmd_helper.SingleQuote(device_temp.name))
-        self.RunShellCommand(cmd, shell=True, as_root=True, check_return=True)
-        return self._ReadFileWithPull(device_temp.name)
-    else:
-      return self._ReadFileWithPull(device_path)
-
-  def _WriteFileWithPush(self, device_path, contents):
-    with tempfile.NamedTemporaryFile() as host_temp:
-      host_temp.write(contents)
-      host_temp.flush()
-      self.adb.Push(host_temp.name, device_path)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def WriteFile(self, device_path, contents, as_root=False, force_push=False,
-                timeout=None, retries=None):
-    """Writes |contents| to a file on the device.
-
-    Args:
-      device_path: A string containing the absolute path to the file to write
-          on the device.
-      contents: A string containing the data to write to the device.
-      as_root: A boolean indicating whether the write should be executed with
-          root privileges (if available).
-      force_push: A boolean indicating whether to force the operation to be
-          performed by pushing a file to the device. The default is, when the
-          contents are short, to pass the contents using a shell script instead.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the file could not be written on the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if not force_push and len(contents) < self._MAX_ADB_COMMAND_LENGTH:
-      # If the contents are small, for efficieny we write the contents with
-      # a shell command rather than pushing a file.
-      cmd = 'echo -n %s > %s' % (cmd_helper.SingleQuote(contents),
-                                 cmd_helper.SingleQuote(device_path))
-      self.RunShellCommand(cmd, shell=True, as_root=as_root, check_return=True)
-    elif as_root and self.NeedsSU():
-      # Adb does not allow to "push with su", so we first push to a temp file
-      # on a safe location, and then copy it to the desired location with su.
-      with device_temp_file.DeviceTempFile(self.adb) as device_temp:
-        self._WriteFileWithPush(device_temp.name, contents)
-        # Here we need 'cp' rather than 'mv' because the temp and
-        # destination files might be on different file systems (e.g.
-        # on internal storage and an external sd card).
-        self.RunShellCommand(['cp', device_temp.name, device_path],
-                             as_root=True, check_return=True)
-    else:
-      # If root is not needed, we can push directly to the desired location.
-      self._WriteFileWithPush(device_path, contents)
-
-  def _ParseLongLsOutput(self, device_path, as_root=False, **kwargs):
-    """Run and scrape the output of 'ls -a -l' on a device directory."""
-    device_path = posixpath.join(device_path, '')  # Force trailing '/'.
-    output = self.RunShellCommand(
-        ['ls', '-a', '-l', device_path], as_root=as_root,
-        check_return=True, env={'TZ': 'utc'}, **kwargs)
-    if output and output[0].startswith('total '):
-      output.pop(0) # pylint: disable=maybe-no-member
-
-    entries = []
-    for line in output:
-      m = _LONG_LS_OUTPUT_RE.match(line)
-      if m:
-        if m.group('filename') not in ['.', '..']:
-          entries.append(m.groupdict())
-      else:
-        logger.info('Skipping: %s', line)
-
-    return entries
-
-  def ListDirectory(self, device_path, as_root=False, **kwargs):
-    """List all files on a device directory.
-
-    Mirroring os.listdir (and most client expectations) the resulting list
-    does not include the special entries '.' and '..' even if they are present
-    in the directory.
-
-    Args:
-      device_path: A string containing the path of the directory on the device
-                   to list.
-      as_root: A boolean indicating whether the to use root privileges to list
-               the directory contents.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of filenames for all entries contained in the directory.
-
-    Raises:
-      AdbCommandFailedError if |device_path| does not specify a valid and
-          accessible directory in the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    entries = self._ParseLongLsOutput(device_path, as_root=as_root, **kwargs)
-    return [d['filename'] for d in entries]
-
-  def StatDirectory(self, device_path, as_root=False, **kwargs):
-    """List file and stat info for all entries on a device directory.
-
-    Implementation notes: this is currently implemented by parsing the output
-    of 'ls -a -l' on the device. Whether possible and convenient, we attempt to
-    make parsing strict and return values mirroring those of the standard |os|
-    and |stat| Python modules.
-
-    Mirroring os.listdir (and most client expectations) the resulting list
-    does not include the special entries '.' and '..' even if they are present
-    in the directory.
-
-    Args:
-      device_path: A string containing the path of the directory on the device
-                   to list.
-      as_root: A boolean indicating whether the to use root privileges to list
-               the directory contents.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of dictionaries, each containing the following keys:
-        filename: A string with the file name.
-        st_mode: File permissions, use the stat module to interpret these.
-        st_nlink: Number of hard links (may be missing).
-        st_owner: A string with the user name of the owner.
-        st_group: A string with the group name of the owner.
-        st_rdev_pair: Device type as (major, minior) (only if inode device).
-        st_size: Size of file, in bytes (may be missing for non-regular files).
-        st_mtime: Time of most recent modification, in seconds since epoch
-          (although resolution is in minutes).
-        symbolic_link_to: If entry is a symbolic link, path where it points to;
-          missing otherwise.
-
-    Raises:
-      AdbCommandFailedError if |device_path| does not specify a valid and
-          accessible directory in the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    entries = self._ParseLongLsOutput(device_path, as_root=as_root, **kwargs)
-    for d in entries:
-      for key, value in d.items():
-        if value is None:
-          del d[key]  # Remove missing fields.
-      d['st_mode'] = _ParseModeString(d['st_mode'])
-      d['st_mtime'] = calendar.timegm(
-          time.strptime(d['st_mtime'], _LS_DATE_FORMAT))
-      for key in ['st_nlink', 'st_size', 'st_rdev_major', 'st_rdev_minor']:
-        if key in d:
-          d[key] = int(d[key])
-      if 'st_rdev_major' in d and 'st_rdev_minor' in d:
-        d['st_rdev_pair'] = (d.pop('st_rdev_major'), d.pop('st_rdev_minor'))
-    return entries
-
-  def StatPath(self, device_path, as_root=False, **kwargs):
-    """Get the stat attributes of a file or directory on the device.
-
-    Args:
-      device_path: A string containing the path of a file or directory from
-                   which to get attributes.
-      as_root: A boolean indicating whether the to use root privileges to
-               access the file information.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dictionary with the stat info collected; see StatDirectory for details.
-
-    Raises:
-      CommandFailedError if device_path cannot be found on the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    dirname, filename = posixpath.split(posixpath.normpath(device_path))
-    for entry in self.StatDirectory(dirname, as_root=as_root, **kwargs):
-      if entry['filename'] == filename:
-        return entry
-    raise device_errors.CommandFailedError(
-        'Cannot find file or directory: %r' % device_path, str(self))
-
-  def FileSize(self, device_path, as_root=False, **kwargs):
-    """Get the size of a file on the device.
-
-    Note: This is implemented by parsing the output of the 'ls' command on
-    the device. On some Android versions, when passing a directory or special
-    file, the size is *not* reported and this function will throw an exception.
-
-    Args:
-      device_path: A string containing the path of a file on the device.
-      as_root: A boolean indicating whether the to use root privileges to
-               access the file information.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The size of the file in bytes.
-
-    Raises:
-      CommandFailedError if device_path cannot be found on the device, or
-        its size cannot be determited for some reason.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    entry = self.StatPath(device_path, as_root=as_root, **kwargs)
-    try:
-      return entry['st_size']
-    except KeyError:
-      raise device_errors.CommandFailedError(
-          'Could not determine the size of: %s' % device_path, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetJavaAsserts(self, enabled, timeout=None, retries=None):
-    """Enables or disables Java asserts.
-
-    Args:
-      enabled: A boolean indicating whether Java asserts should be enabled
-               or disabled.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device-side property changed and a restart is required as a
-      result, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    def find_property(lines, property_name):
-      for index, line in enumerate(lines):
-        if line.strip() == '':
-          continue
-        key_value = tuple(s.strip() for s in line.split('=', 1))
-        if len(key_value) != 2:
-          continue
-        key, value = key_value
-        if key == property_name:
-          return index, value
-      return None, ''
-
-    new_value = 'all' if enabled else ''
-
-    # First ensure the desired property is persisted.
-    try:
-      properties = self.ReadFile(self.LOCAL_PROPERTIES_PATH).splitlines()
-    except device_errors.CommandFailedError:
-      properties = []
-    index, value = find_property(properties, self.JAVA_ASSERT_PROPERTY)
-    if new_value != value:
-      if new_value:
-        new_line = '%s=%s' % (self.JAVA_ASSERT_PROPERTY, new_value)
-        if index is None:
-          properties.append(new_line)
-        else:
-          properties[index] = new_line
-      else:
-        assert index is not None  # since new_value == '' and new_value != value
-        properties.pop(index)
-      self.WriteFile(self.LOCAL_PROPERTIES_PATH, _JoinLines(properties))
-
-    # Next, check the current runtime value is what we need, and
-    # if not, set it and report that a reboot is required.
-    value = self.GetProp(self.JAVA_ASSERT_PROPERTY)
-    if new_value != value:
-      self.SetProp(self.JAVA_ASSERT_PROPERTY, new_value)
-      return True
-    else:
-      return False
-
-  def GetLanguage(self, cache=False):
-    """Returns the language setting on the device.
-    Args:
-      cache: Whether to use cached properties when available.
-    """
-    return self.GetProp('persist.sys.language', cache=cache)
-
-  def GetCountry(self, cache=False):
-    """Returns the country setting on the device.
-
-    Args:
-      cache: Whether to use cached properties when available.
-    """
-    return self.GetProp('persist.sys.country', cache=cache)
-
-  @property
-  def screen_density(self):
-    """Returns the screen density of the device."""
-    DPI_TO_DENSITY = {
-      120: 'ldpi',
-      160: 'mdpi',
-      240: 'hdpi',
-      320: 'xhdpi',
-      480: 'xxhdpi',
-      640: 'xxxhdpi',
-    }
-    return DPI_TO_DENSITY.get(self.pixel_density, 'tvdpi')
-
-  @property
-  def pixel_density(self):
-    return int(self.GetProp('ro.sf.lcd_density', cache=True))
-
-  @property
-  def build_description(self):
-    """Returns the build description of the system.
-
-    For example:
-      nakasi-user 4.4.4 KTU84P 1227136 release-keys
-    """
-    return self.GetProp('ro.build.description', cache=True)
-
-  @property
-  def build_fingerprint(self):
-    """Returns the build fingerprint of the system.
-
-    For example:
-      google/nakasi/grouper:4.4.4/KTU84P/1227136:user/release-keys
-    """
-    return self.GetProp('ro.build.fingerprint', cache=True)
-
-  @property
-  def build_id(self):
-    """Returns the build ID of the system (e.g. 'KTU84P')."""
-    return self.GetProp('ro.build.id', cache=True)
-
-  @property
-  def build_product(self):
-    """Returns the build product of the system (e.g. 'grouper')."""
-    return self.GetProp('ro.build.product', cache=True)
-
-  @property
-  def build_type(self):
-    """Returns the build type of the system (e.g. 'user')."""
-    return self.GetProp('ro.build.type', cache=True)
-
-  @property
-  def build_version_sdk(self):
-    """Returns the build version sdk of the system as a number (e.g. 19).
-
-    For version code numbers see:
-    http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
-
-    For named constants see devil.android.sdk.version_codes
-
-    Raises:
-      CommandFailedError if the build version sdk is not a number.
-    """
-    value = self.GetProp('ro.build.version.sdk', cache=True)
-    try:
-      return int(value)
-    except ValueError:
-      raise device_errors.CommandFailedError(
-          'Invalid build version sdk: %r' % value)
-
-  @property
-  def product_cpu_abi(self):
-    """Returns the product cpu abi of the device (e.g. 'armeabi-v7a')."""
-    return self.GetProp('ro.product.cpu.abi', cache=True)
-
-  @property
-  def product_model(self):
-    """Returns the name of the product model (e.g. 'Nexus 7')."""
-    return self.GetProp('ro.product.model', cache=True)
-
-  @property
-  def product_name(self):
-    """Returns the product name of the device (e.g. 'nakasi')."""
-    return self.GetProp('ro.product.name', cache=True)
-
-  @property
-  def product_board(self):
-    """Returns the product board name of the device (e.g. 'shamu')."""
-    return self.GetProp('ro.product.board', cache=True)
-
-  def _EnsureCacheInitialized(self):
-    """Populates cache token, runs getprop and fetches $EXTERNAL_STORAGE."""
-    if self._cache['token']:
-      return
-    with self._cache_lock:
-      if self._cache['token']:
-        return
-      # Change the token every time to ensure that it will match only the
-      # previously dumped cache.
-      token = str(uuid.uuid1())
-      cmd = (
-          'c=/data/local/tmp/cache_token;'
-          'echo $EXTERNAL_STORAGE;'
-          'cat $c 2>/dev/null||echo;'
-          'echo "%s">$c &&' % token +
-          'getprop'
-      )
-      output = self.RunShellCommand(
-          cmd, shell=True, check_return=True, large_output=True)
-      # Error-checking for this existing is done in GetExternalStoragePath().
-      self._cache['external_storage'] = output[0]
-      self._cache['prev_token'] = output[1]
-      output = output[2:]
-
-      prop_cache = self._cache['getprop']
-      prop_cache.clear()
-      for key, value in _GETPROP_RE.findall(''.join(output)):
-        prop_cache[key] = value
-      self._cache['token'] = token
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetProp(self, property_name, cache=False, timeout=None, retries=None):
-    """Gets a property from the device.
-
-    Args:
-      property_name: A string containing the name of the property to get from
-                     the device.
-      cache: Whether to use cached properties when available.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The value of the device's |property_name| property.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    assert isinstance(property_name, basestring), (
-        "property_name is not a string: %r" % property_name)
-
-    if cache:
-      # It takes ~120ms to query a single property, and ~130ms to query all
-      # properties. So, when caching we always query all properties.
-      self._EnsureCacheInitialized()
-    else:
-      # timeout and retries are handled down at run shell, because we don't
-      # want to apply them in the other branch when reading from the cache
-      value = self.RunShellCommand(
-          ['getprop', property_name], single_line=True, check_return=True,
-          timeout=timeout, retries=retries)
-      self._cache['getprop'][property_name] = value
-    # Non-existent properties are treated as empty strings by getprop.
-    return self._cache['getprop'].get(property_name, '')
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetProp(self, property_name, value, check=False, timeout=None,
-              retries=None):
-    """Sets a property on the device.
-
-    Args:
-      property_name: A string containing the name of the property to set on
-                     the device.
-      value: A string containing the value to set to the property on the
-             device.
-      check: A boolean indicating whether to check that the property was
-             successfully set on the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if check is true and the property was not correctly
-        set on the device (e.g. because it is not rooted).
-      CommandTimeoutError on timeout.
-    """
-    assert isinstance(property_name, basestring), (
-        "property_name is not a string: %r" % property_name)
-    assert isinstance(value, basestring), "value is not a string: %r" % value
-
-    self.RunShellCommand(['setprop', property_name, value], check_return=True)
-    prop_cache = self._cache['getprop']
-    if property_name in prop_cache:
-      del prop_cache[property_name]
-    # TODO(perezju) remove the option and make the check mandatory, but using a
-    # single shell script to both set- and getprop.
-    if check and value != self.GetProp(property_name, cache=False):
-      raise device_errors.CommandFailedError(
-          'Unable to set property %r on the device to %r'
-          % (property_name, value), str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetABI(self, timeout=None, retries=None):
-    """Gets the device main ABI.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's main ABI name.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    return self.GetProp('ro.product.cpu.abi', cache=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetPids(self, process_name=None, timeout=None, retries=None):
-    """Returns the PIDs of processes containing the given name as substring.
-
-    Note that the |process_name| is often the package name.
-
-    Args:
-      process_name: A string containing the process name to get the PIDs for.
-                    If missing returns PIDs for all processes.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dict mapping process name to a list of PIDs for each process that
-      contained the provided |process_name|.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    procs_pids = collections.defaultdict(list)
-    try:
-      ps_cmd = 'ps'
-      # ps behavior was changed in Android above N, http://crbug.com/686716
-      if (self.build_version_sdk >= version_codes.NOUGAT_MR1
-          and self.build_id[0] > 'N'):
-        ps_cmd = 'ps -e'
-      if process_name:
-        ps_output = self._RunPipedShellCommand(
-            '%s | grep -F %s' % (ps_cmd, cmd_helper.SingleQuote(process_name)))
-      else:
-        ps_output = self.RunShellCommand(
-            ps_cmd.split(), check_return=True, large_output=True)
-    except device_errors.AdbShellCommandFailedError as e:
-      if e.status and isinstance(e.status, list) and not e.status[0]:
-        # If ps succeeded but grep failed, there were no processes with the
-        # given name.
-        return procs_pids
-      else:
-        raise
-
-    process_name = process_name or ''
-    for line in ps_output:
-      try:
-        ps_data = line.split()
-        pid, process = ps_data[1], ps_data[-1]
-        if process_name in process and pid != 'PID':
-          procs_pids[process].append(pid)
-      except IndexError:
-        pass
-    return procs_pids
-
-  def GetApplicationPids(self, process_name, at_most_one=False, **kwargs):
-    """Returns the PID or PIDs of a given process name.
-
-    Note that the |process_name|, often the package name, must match exactly.
-
-    Args:
-      process_name: A string containing the process name to get the PIDs for.
-      at_most_one: A boolean indicating that at most one PID is expected to
-                   be found.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of the PIDs for the named process. If at_most_one=True returns
-      the single PID found or None otherwise.
-
-    Raises:
-      CommandFailedError if at_most_one=True and more than one PID is found
-          for the named process.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    pids = self.GetPids(process_name, **kwargs).get(process_name, [])
-    if at_most_one:
-      if len(pids) > 1:
-        raise device_errors.CommandFailedError(
-            'Expected a single process but found PIDs: %s.' % ', '.join(pids),
-            device_serial=str(self))
-      return pids[0] if pids else None
-    else:
-      return pids
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetEnforce(self, timeout=None, retries=None):
-    """Get the current mode of SELinux.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True (enforcing), False (permissive), or None (disabled).
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    output = self.RunShellCommand(
-        ['getenforce'], check_return=True, single_line=True).lower()
-    if output not in _SELINUX_MODE:
-      raise device_errors.CommandFailedError(
-          'Unexpected getenforce output: %s' % output)
-    return _SELINUX_MODE[output]
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetEnforce(self, enabled, timeout=None, retries=None):
-    """Modify the mode SELinux is running in.
-
-    Args:
-      enabled: a boolean indicating whether to put SELinux in encorcing mode
-               (if True), or permissive mode (otherwise).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    self.RunShellCommand(
-        ['setenforce', '1' if int(enabled) else '0'], as_root=True,
-        check_return=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def TakeScreenshot(self, host_path=None, timeout=None, retries=None):
-    """Takes a screenshot of the device.
-
-    Args:
-      host_path: A string containing the path on the host to save the
-                 screenshot to. If None, a file name in the current
-                 directory will be generated.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The name of the file on the host to which the screenshot was saved.
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if not host_path:
-      host_path = os.path.abspath('screenshot-%s-%s.png' % (
-          self.serial, _GetTimeStamp()))
-    with device_temp_file.DeviceTempFile(self.adb, suffix='.png') as device_tmp:
-      self.RunShellCommand(['/system/bin/screencap', '-p', device_tmp.name],
-                           check_return=True)
-      self.PullFile(device_tmp.name, host_path)
-    return host_path
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetMemoryUsageForPid(self, pid, timeout=None, retries=None):
-    """Gets the memory usage for the given PID.
-
-    Args:
-      pid: PID of the process.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dict containing memory usage statistics for the PID. May include:
-        Size, Rss, Pss, Shared_Clean, Shared_Dirty, Private_Clean,
-        Private_Dirty, VmHWM
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    result = collections.defaultdict(int)
-
-    try:
-      result.update(self._GetMemoryUsageForPidFromSmaps(pid))
-    except device_errors.CommandFailedError:
-      logger.exception('Error getting memory usage from smaps')
-
-    try:
-      result.update(self._GetMemoryUsageForPidFromStatus(pid))
-    except device_errors.CommandFailedError:
-      logger.exception('Error getting memory usage from status')
-
-    return result
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def DismissCrashDialogIfNeeded(self, timeout=None, retries=None):
-    """Dismiss the error/ANR dialog if present.
-
-    Returns: Name of the crashed package if a dialog is focused,
-             None otherwise.
-    """
-    def _FindFocusedWindow():
-      match = None
-      # TODO(jbudorick): Try to grep the output on the device instead of using
-      # large_output if/when DeviceUtils exposes a public interface for piped
-      # shell command handling.
-      for line in self.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                       check_return=True, large_output=True):
-        match = re.match(_CURRENT_FOCUS_CRASH_RE, line)
-        if match:
-          break
-      return match
-
-    match = _FindFocusedWindow()
-    if not match:
-      return None
-    package = match.group(2)
-    logger.warning('Trying to dismiss %s dialog for %s', *match.groups())
-    self.SendKeyEvent(keyevent.KEYCODE_DPAD_RIGHT)
-    self.SendKeyEvent(keyevent.KEYCODE_DPAD_RIGHT)
-    self.SendKeyEvent(keyevent.KEYCODE_ENTER)
-    match = _FindFocusedWindow()
-    if match:
-      logger.error('Still showing a %s dialog for %s', *match.groups())
-    return package
-
-  def _GetMemoryUsageForPidFromSmaps(self, pid):
-    SMAPS_COLUMNS = (
-        'Size', 'Rss', 'Pss', 'Shared_Clean', 'Shared_Dirty', 'Private_Clean',
-        'Private_Dirty')
-
-    showmap_out = self._RunPipedShellCommand(
-        'showmap %d | grep TOTAL' % int(pid), as_root=True)
-
-    split_totals = showmap_out[-1].split()
-    if (not split_totals
-        or len(split_totals) != 9
-        or split_totals[-1] != 'TOTAL'):
-      raise device_errors.CommandFailedError(
-          'Invalid output from showmap: %s' % '\n'.join(showmap_out))
-
-    return dict(itertools.izip(SMAPS_COLUMNS, (int(n) for n in split_totals)))
-
-  def _GetMemoryUsageForPidFromStatus(self, pid):
-    for line in self.ReadFile(
-        '/proc/%s/status' % str(pid), as_root=True).splitlines():
-      if line.startswith('VmHWM:'):
-        return {'VmHWM': int(line.split()[1])}
-    raise device_errors.CommandFailedError(
-        'Could not find memory peak value for pid %s', str(pid))
-
-  def GetLogcatMonitor(self, *args, **kwargs):
-    """Returns a new LogcatMonitor associated with this device.
-
-    Parameters passed to this function are passed directly to
-    |logcat_monitor.LogcatMonitor| and are documented there.
-    """
-    return logcat_monitor.LogcatMonitor(self.adb, *args, **kwargs)
-
-  def GetClientCache(self, client_name):
-    """Returns client cache."""
-    if client_name not in self._client_caches:
-      self._client_caches[client_name] = {}
-    return self._client_caches[client_name]
-
-  def _ClearCache(self):
-    """Clears all caches."""
-    for client in self._client_caches:
-      self._client_caches[client].clear()
-    self._cache = {
-        # Map of packageId -> list of on-device .apk paths
-        'package_apk_paths': {},
-        # Set of packageId that were loaded from LoadCacheData and not yet
-        # verified.
-        'package_apk_paths_to_verify': set(),
-        # Map of packageId -> set of on-device .apk checksums
-        'package_apk_checksums': {},
-        # Map of property_name -> value
-        'getprop': {},
-        # Map of device_path -> [ignore_other_files, map of path->checksum]
-        'device_path_checksums': {},
-        # Location of sdcard ($EXTERNAL_STORAGE).
-        'external_storage': None,
-        # Token used to detect when LoadCacheData is stale.
-        'token': None,
-        'prev_token': None,
-    }
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def LoadCacheData(self, data, timeout=None, retries=None):
-    """Initializes the cache from data created using DumpCacheData.
-
-    The cache is used only if its token matches the one found on the device.
-    This prevents a stale cache from being used (which can happen when sharing
-    devices).
-
-    Args:
-      data: A previously serialized cache (string).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      Whether the cache was loaded.
-    """
-    obj = json.loads(data)
-    self._EnsureCacheInitialized()
-    given_token = obj.get('token')
-    if not given_token or self._cache['prev_token'] != given_token:
-      logger.warning('Stale cache detected. Not using it.')
-      return False
-
-    self._cache['package_apk_paths'] = obj.get('package_apk_paths', {})
-    # When using a cache across script invokations, verify that apps have
-    # not been uninstalled.
-    self._cache['package_apk_paths_to_verify'] = set(
-        self._cache['package_apk_paths'].iterkeys())
-
-    package_apk_checksums = obj.get('package_apk_checksums', {})
-    for k, v in package_apk_checksums.iteritems():
-      package_apk_checksums[k] = set(v)
-    self._cache['package_apk_checksums'] = package_apk_checksums
-    device_path_checksums = obj.get('device_path_checksums', {})
-    self._cache['device_path_checksums'] = device_path_checksums
-    return True
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def DumpCacheData(self, timeout=None, retries=None):
-    """Dumps the current cache state to a string.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A serialized cache as a string.
-    """
-    self._EnsureCacheInitialized()
-    obj = {}
-    obj['token'] = self._cache['token']
-    obj['package_apk_paths'] = self._cache['package_apk_paths']
-    obj['package_apk_checksums'] = self._cache['package_apk_checksums']
-    # JSON can't handle sets.
-    for k, v in obj['package_apk_checksums'].iteritems():
-      obj['package_apk_checksums'][k] = list(v)
-    obj['device_path_checksums'] = self._cache['device_path_checksums']
-    return json.dumps(obj, separators=(',', ':'))
-
-  @classmethod
-  def parallel(cls, devices, async=False):
-    """Creates a Parallelizer to operate over the provided list of devices.
-
-    Args:
-      devices: A list of either DeviceUtils instances or objects from
-               from which DeviceUtils instances can be constructed. If None,
-               all attached devices will be used.
-      async: If true, returns a Parallelizer that runs operations
-             asynchronously.
-
-    Returns:
-      A Parallelizer operating over |devices|.
-    """
-    devices = [d if isinstance(d, cls) else cls(d) for d in devices]
-    if async:
-      return parallelizer.Parallelizer(devices)
-    else:
-      return parallelizer.SyncParallelizer(devices)
-
-  @classmethod
-  def HealthyDevices(cls, blacklist=None, device_arg='default', **kwargs):
-    """Returns a list of DeviceUtils instances.
-
-    Returns a list of DeviceUtils instances that are attached, not blacklisted,
-    and optionally filtered by --device flags or ANDROID_SERIAL environment
-    variable.
-
-    Args:
-      blacklist: A DeviceBlacklist instance (optional). Device serials in this
-          blacklist will never be returned, but a warning will be logged if they
-          otherwise would have been.
-      device_arg: The value of the --device flag. This can be:
-          'default' -> Same as [], but returns an empty list rather than raise a
-              NoDevicesError.
-          [] -> Returns all devices, unless $ANDROID_SERIAL is set.
-          None -> Use $ANDROID_SERIAL if set, otherwise looks for a single
-              attached device. Raises an exception if multiple devices are
-              attached.
-          'serial' -> Returns an instance for the given serial, if not
-              blacklisted.
-          ['A', 'B', ...] -> Returns instances for the subset that is not
-              blacklisted.
-      A device serial, or a list of device serials (optional).
-
-    Returns:
-      A list of DeviceUtils instances.
-
-    Raises:
-      NoDevicesError: Raised when no non-blacklisted devices exist and
-          device_arg is passed.
-      MultipleDevicesError: Raise when multiple devices exist, but |device_arg|
-          is None.
-    """
-    allow_no_devices = False
-    if device_arg == 'default':
-      allow_no_devices = True
-      device_arg = ()
-
-    select_multiple = True
-    if not (isinstance(device_arg, tuple) or isinstance(device_arg, list)):
-      select_multiple = False
-      if device_arg:
-        device_arg = (device_arg,)
-
-    blacklisted_devices = blacklist.Read() if blacklist else []
-
-    # adb looks for ANDROID_SERIAL, so support it as well.
-    android_serial = os.environ.get('ANDROID_SERIAL')
-    if not device_arg and android_serial:
-      device_arg = (android_serial,)
-
-    def blacklisted(serial):
-      if serial in blacklisted_devices:
-        logger.warning('Device %s is blacklisted.', serial)
-        return True
-      return False
-
-    if device_arg:
-      devices = [cls(x, **kwargs) for x in device_arg if not blacklisted(x)]
-    else:
-      devices = []
-      for adb in adb_wrapper.AdbWrapper.Devices():
-        if not blacklisted(adb.GetDeviceSerial()):
-          devices.append(cls(_CreateAdbWrapper(adb), **kwargs))
-
-    if len(devices) == 0 and not allow_no_devices:
-      raise device_errors.NoDevicesError()
-    if len(devices) > 1 and not select_multiple:
-      raise device_errors.MultipleDevicesError(devices)
-    return sorted(devices)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def RestartAdbd(self, timeout=None, retries=None):
-    logger.info('Restarting adbd on device.')
-    with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script:
-      self.WriteFile(script.name, _RESTART_ADBD_SCRIPT)
-      self.RunShellCommand(
-          ['source', script.name], check_return=True, as_root=True)
-      self.adb.WaitForDevice()
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GrantPermissions(self, package, permissions, timeout=None, retries=None):
-    # Permissions only need to be set on M and above because of the changes to
-    # the permission model.
-    if not permissions or self.build_version_sdk < version_codes.MARSHMALLOW:
-      return
-    logger.info('Setting permissions for %s.', package)
-    permissions = [p for p in permissions if p not in _PERMISSIONS_BLACKLIST]
-    if ('android.permission.WRITE_EXTERNAL_STORAGE' in permissions
-        and 'android.permission.READ_EXTERNAL_STORAGE' not in permissions):
-      permissions.append('android.permission.READ_EXTERNAL_STORAGE')
-    cmd = '&&'.join('pm grant %s %s' % (package, p) for p in permissions)
-    if cmd:
-      output = self.RunShellCommand(cmd, shell=True, check_return=True)
-      if output:
-        logger.warning('Possible problem when granting permissions. Blacklist '
-                       'may need to be updated.')
-        for line in output:
-          logger.warning('  %s', line)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def IsScreenOn(self, timeout=None, retries=None):
-    """Determines if screen is on.
-
-    Dumpsys input_method exposes screen on/off state. Below is an explination of
-    the states.
-
-    Pre-L:
-      On: mScreenOn=true
-      Off: mScreenOn=false
-    L+:
-      On: mInteractive=true
-      Off: mInteractive=false
-
-    Returns:
-      True if screen is on, false if it is off.
-
-    Raises:
-      device_errors.CommandFailedError: If screen state cannot be found.
-    """
-    if self.build_version_sdk < version_codes.LOLLIPOP:
-      input_check = 'mScreenOn'
-      check_value = 'mScreenOn=true'
-    else:
-      input_check = 'mInteractive'
-      check_value = 'mInteractive=true'
-    dumpsys_out = self._RunPipedShellCommand(
-        'dumpsys input_method | grep %s' % input_check)
-    if not dumpsys_out:
-      raise device_errors.CommandFailedError(
-          'Unable to detect screen state', str(self))
-    return check_value in dumpsys_out[0]
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetScreen(self, on, timeout=None, retries=None):
-    """Turns screen on and off.
-
-    Args:
-      on: bool to decide state to switch to. True = on False = off.
-    """
-    def screen_test():
-      return self.IsScreenOn() == on
-
-    if screen_test():
-      logger.info('Screen already in expected state.')
-      return
-    self.SendKeyEvent(keyevent.KEYCODE_POWER)
-    timeout_retry.WaitFor(screen_test, wait_period=1)
diff --git a/third_party/catapult/devil/devil/android/device_utils_devicetest.py b/third_party/catapult/devil/devil/android/device_utils_devicetest.py
deleted file mode 100755
index e69cc90..0000000
--- a/third_party/catapult/devil/devil/android/device_utils_devicetest.py
+++ /dev/null
@@ -1,229 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-"""
-Unit tests for the contents of device_utils.py (mostly DeviceUtils).
-The test will invoke real devices
-"""
-
-import os
-import posixpath
-import sys
-import tempfile
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', )))
-
-from devil.android import device_test_case
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
-from devil.utils import cmd_helper
-
-_OLD_CONTENTS = "foo"
-_NEW_CONTENTS = "bar"
-_DEVICE_DIR = "/data/local/tmp/device_utils_test"
-_SUB_DIR = "sub"
-_SUB_DIR1 = "sub1"
-_SUB_DIR2 = "sub2"
-
-
-class DeviceUtilsPushDeleteFilesTest(device_test_case.DeviceTestCase):
-
-  def setUp(self):
-    super(DeviceUtilsPushDeleteFilesTest, self).setUp()
-    self.adb = adb_wrapper.AdbWrapper(self.serial)
-    self.adb.WaitForDevice()
-    self.device = device_utils.DeviceUtils(
-        self.adb, default_timeout=10, default_retries=0)
-
-  @staticmethod
-  def _MakeTempFile(contents):
-    """Make a temporary file with the given contents.
-
-    Args:
-      contents: string to write to the temporary file.
-
-    Returns:
-      the tuple contains the absolute path to the file and the file name
-    """
-    fi, path = tempfile.mkstemp(text=True)
-    with os.fdopen(fi, 'w') as f:
-      f.write(contents)
-    file_name = os.path.basename(path)
-    return (path, file_name)
-
-  @staticmethod
-  def _MakeTempFileGivenDir(directory, contents):
-    """Make a temporary file under the given directory
-    with the given contents
-
-    Args:
-      directory: the temp directory to create the file
-      contents: string to write to the temp file
-
-    Returns:
-      the list contains the absolute path to the file and the file name
-    """
-    fi, path = tempfile.mkstemp(dir=directory, text=True)
-    with os.fdopen(fi, 'w') as f:
-      f.write(contents)
-    file_name = os.path.basename(path)
-    return (path, file_name)
-
-  @staticmethod
-  def _ChangeTempFile(path, contents):
-    with os.open(path, 'w') as f:
-      f.write(contents)
-
-  @staticmethod
-  def _DeleteTempFile(path):
-    os.remove(path)
-
-  def testPushChangedFiles_noFileChange(self):
-    (host_file_path, file_name) = self._MakeTempFile(_OLD_CONTENTS)
-    device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
-    self.adb.Push(host_file_path, device_file_path)
-    self.device.PushChangedFiles([(host_file_path, device_file_path)])
-    result = self.device.RunShellCommand(
-        ['cat', device_file_path], check_return=True, single_line=True)
-    self.assertEqual(_OLD_CONTENTS, result)
-
-    cmd_helper.RunCmd(['rm', host_file_path])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testPushChangedFiles_singleFileChange(self):
-    (host_file_path, file_name) = self._MakeTempFile(_OLD_CONTENTS)
-    device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
-    self.adb.Push(host_file_path, device_file_path)
-
-    with open(host_file_path, 'w') as f:
-      f.write(_NEW_CONTENTS)
-    self.device.PushChangedFiles([(host_file_path, device_file_path)])
-    result = self.device.RunShellCommand(
-        ['cat', device_file_path], check_return=True, single_line=True)
-    self.assertEqual(_NEW_CONTENTS, result)
-
-    cmd_helper.RunCmd(['rm', host_file_path])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testDeleteFiles(self):
-    host_tmp_dir = tempfile.mkdtemp()
-    (host_file_path, file_name) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-
-    device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
-    self.adb.Push(host_file_path, device_file_path)
-
-    cmd_helper.RunCmd(['rm', host_file_path])
-    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
-                                 delete_device_stale=True)
-    filenames = self.device.ListDirectory(_DEVICE_DIR)
-    self.assertEqual([], filenames)
-
-    cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testPushAndDeleteFiles_noSubDir(self):
-    host_tmp_dir = tempfile.mkdtemp()
-    (host_file_path1, file_name1) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-    (host_file_path2, file_name2) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-
-    device_file_path1 = "%s/%s" % (_DEVICE_DIR, file_name1)
-    device_file_path2 = "%s/%s" % (_DEVICE_DIR, file_name2)
-    self.adb.Push(host_file_path1, device_file_path1)
-    self.adb.Push(host_file_path2, device_file_path2)
-
-    with open(host_file_path1, 'w') as f:
-      f.write(_NEW_CONTENTS)
-    cmd_helper.RunCmd(['rm', host_file_path2])
-
-    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
-                                   delete_device_stale=True)
-    result = self.device.RunShellCommand(
-        ['cat', device_file_path1], check_return=True, single_line=True)
-    self.assertEqual(_NEW_CONTENTS, result)
-
-    filenames = self.device.ListDirectory(_DEVICE_DIR)
-    self.assertEqual([file_name1], filenames)
-
-    cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testPushAndDeleteFiles_SubDir(self):
-    host_tmp_dir = tempfile.mkdtemp()
-    host_sub_dir1 = "%s/%s" % (host_tmp_dir, _SUB_DIR1)
-    host_sub_dir2 = "%s/%s/%s" % (host_tmp_dir, _SUB_DIR, _SUB_DIR2)
-    cmd_helper.RunCmd(['mkdir', '-p', host_sub_dir1])
-    cmd_helper.RunCmd(['mkdir', '-p', host_sub_dir2])
-
-    (host_file_path1, file_name1) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-    (host_file_path2, file_name2) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-    (host_file_path3, file_name3) = self._MakeTempFileGivenDir(
-        host_sub_dir1, _OLD_CONTENTS)
-    (host_file_path4, file_name4) = self._MakeTempFileGivenDir(
-        host_sub_dir2, _OLD_CONTENTS)
-
-    device_file_path1 = "%s/%s" % (_DEVICE_DIR, file_name1)
-    device_file_path2 = "%s/%s" % (_DEVICE_DIR, file_name2)
-    device_file_path3 = "%s/%s/%s" % (_DEVICE_DIR, _SUB_DIR1, file_name3)
-    device_file_path4 = "%s/%s/%s/%s" % (_DEVICE_DIR, _SUB_DIR,
-                                         _SUB_DIR2, file_name4)
-
-    self.adb.Push(host_file_path1, device_file_path1)
-    self.adb.Push(host_file_path2, device_file_path2)
-    self.adb.Push(host_file_path3, device_file_path3)
-    self.adb.Push(host_file_path4, device_file_path4)
-
-    with open(host_file_path1, 'w') as f:
-      f.write(_NEW_CONTENTS)
-    cmd_helper.RunCmd(['rm', host_file_path2])
-    cmd_helper.RunCmd(['rm', host_file_path4])
-
-    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
-                                   delete_device_stale=True)
-    result = self.device.RunShellCommand(
-        ['cat', device_file_path1], check_return=True, single_line=True)
-    self.assertEqual(_NEW_CONTENTS, result)
-
-    filenames = self.device.ListDirectory(_DEVICE_DIR)
-    self.assertIn(file_name1, filenames)
-    self.assertIn(_SUB_DIR1, filenames)
-    self.assertIn(_SUB_DIR, filenames)
-    self.assertEqual(3, len(filenames))
-
-    result = self.device.RunShellCommand(
-        ['cat', device_file_path3], check_return=True, single_line=True)
-    self.assertEqual(_OLD_CONTENTS, result)
-
-    filenames = self.device.ListDirectory(
-        posixpath.join(_DEVICE_DIR, _SUB_DIR, _SUB_DIR2))
-    self.assertEqual([], filenames)
-
-    cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testRestartAdbd(self):
-    def get_adbd_pid():
-      # TODO(catapult:#3215): Migrate to device.GetPids().
-      ps_output = self.device.RunShellCommand(['ps'], check_return=True)
-      for ps_line in ps_output:
-        if 'adbd' in ps_line:
-          return ps_line.split()[1]
-      self.fail('Unable to find adbd')
-
-    old_adbd_pid = get_adbd_pid()
-    self.device.RestartAdbd()
-    new_adbd_pid = get_adbd_pid()
-    self.assertNotEqual(old_adbd_pid, new_adbd_pid)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/android/device_utils_test.py b/third_party/catapult/devil/devil/android/device_utils_test.py
deleted file mode 100755
index 2490209..0000000
--- a/third_party/catapult/devil/devil/android/device_utils_test.py
+++ /dev/null
@@ -1,2900 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""
-Unit tests for the contents of device_utils.py (mostly DeviceUtils).
-"""
-
-# pylint: disable=protected-access
-# pylint: disable=unused-argument
-
-import json
-import logging
-import os
-import stat
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_signal
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
-from devil.android.sdk import intent
-from devil.android.sdk import keyevent
-from devil.android.sdk import version_codes
-from devil.utils import cmd_helper
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class AnyStringWith(object):
-  def __init__(self, value):
-    self._value = value
-
-  def __eq__(self, other):
-    return self._value in other
-
-  def __repr__(self):
-    return '<AnyStringWith: %s>' % self._value
-
-
-class _MockApkHelper(object):
-
-  def __init__(self, path, package_name, perms=None):
-    self.path = path
-    self.package_name = package_name
-    self.perms = perms
-
-  def GetPackageName(self):
-    return self.package_name
-
-  def GetPermissions(self):
-    return self.perms
-
-
-class _MockMultipleDevicesError(Exception):
-  pass
-
-
-class DeviceUtilsInitTest(unittest.TestCase):
-
-  def testInitWithStr(self):
-    serial_as_str = str('0123456789abcdef')
-    d = device_utils.DeviceUtils('0123456789abcdef')
-    self.assertEqual(serial_as_str, d.adb.GetDeviceSerial())
-
-  def testInitWithUnicode(self):
-    serial_as_unicode = unicode('fedcba9876543210')
-    d = device_utils.DeviceUtils(serial_as_unicode)
-    self.assertEqual(serial_as_unicode, d.adb.GetDeviceSerial())
-
-  def testInitWithAdbWrapper(self):
-    serial = '123456789abcdef0'
-    a = adb_wrapper.AdbWrapper(serial)
-    d = device_utils.DeviceUtils(a)
-    self.assertEqual(serial, d.adb.GetDeviceSerial())
-
-  def testInitWithMissing_fails(self):
-    with self.assertRaises(ValueError):
-      device_utils.DeviceUtils(None)
-    with self.assertRaises(ValueError):
-      device_utils.DeviceUtils('')
-
-
-class DeviceUtilsGetAVDsTest(mock_calls.TestCase):
-
-  def testGetAVDs(self):
-    mocked_attrs = {
-      'android_sdk': '/my/sdk/path'
-    }
-    with mock.patch('devil.devil_env._Environment.LocalPath',
-                    mock.Mock(side_effect=lambda a: mocked_attrs[a])):
-      with self.assertCall(
-          mock.call.devil.utils.cmd_helper.GetCmdOutput(
-              [mock.ANY, 'list', 'avd']),
-          'Available Android Virtual Devices:\n'
-          '    Name: my_android5.0\n'
-          '    Path: /some/path/to/.android/avd/my_android5.0.avd\n'
-          '  Target: Android 5.0 (API level 21)\n'
-          ' Tag/ABI: default/x86\n'
-          '    Skin: WVGA800\n'):
-        self.assertEquals(['my_android5.0'], device_utils.GetAVDs())
-
-
-class DeviceUtilsRestartServerTest(mock_calls.TestCase):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testRestartServer_succeeds(self):
-    with self.assertCalls(
-        mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.KillServer(),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput(
-            ['pgrep', 'adb']),
-         (1, '')),
-        mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.StartServer(),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput(
-            ['pgrep', 'adb']),
-         (1, '')),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput(
-            ['pgrep', 'adb']),
-         (0, '123\n'))):
-      device_utils.RestartServer()
-
-
-class MockTempFile(object):
-
-  def __init__(self, name='/tmp/some/file'):
-    self.file = mock.MagicMock(spec=file)
-    self.file.name = name
-    self.file.name_quoted = cmd_helper.SingleQuote(name)
-
-  def __enter__(self):
-    return self.file
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    pass
-
-  @property
-  def name(self):
-    return self.file.name
-
-
-class _PatchedFunction(object):
-
-  def __init__(self, patched=None, mocked=None):
-    self.patched = patched
-    self.mocked = mocked
-
-
-def _AdbWrapperMock(test_serial, is_ready=True):
-  adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
-  adb.__str__ = mock.Mock(return_value=test_serial)
-  adb.GetDeviceSerial.return_value = test_serial
-  adb.is_ready = is_ready
-  return adb
-
-
-class DeviceUtilsTest(mock_calls.TestCase):
-
-  def setUp(self):
-    self.adb = _AdbWrapperMock('0123456789abcdef')
-    self.device = device_utils.DeviceUtils(
-        self.adb, default_timeout=10, default_retries=0)
-    self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial'])
-
-  def AdbCommandError(self, args=None, output=None, status=None, msg=None):
-    if args is None:
-      args = ['[unspecified]']
-    return mock.Mock(side_effect=device_errors.AdbCommandFailedError(
-        args, output, status, msg, str(self.device)))
-
-  def CommandError(self, msg=None):
-    if msg is None:
-      msg = 'Command failed'
-    return mock.Mock(side_effect=device_errors.CommandFailedError(
-        msg, str(self.device)))
-
-  def ShellError(self, output=None, status=1):
-    def action(cmd, *args, **kwargs):
-      raise device_errors.AdbShellCommandFailedError(
-          cmd, output, status, str(self.device))
-    if output is None:
-      output = 'Permission denied\n'
-    return action
-
-  def TimeoutError(self, msg=None):
-    if msg is None:
-      msg = 'Operation timed out'
-    return mock.Mock(side_effect=device_errors.CommandTimeoutError(
-        msg, str(self.device)))
-
-  def EnsureCacheInitialized(self, props=None, sdcard='/sdcard'):
-    props = props or []
-    ret = [sdcard, 'TOKEN'] + props
-    return (self.call.device.RunShellCommand(
-        AnyStringWith('getprop'),
-        shell=True, check_return=True, large_output=True), ret)
-
-
-class DeviceUtilsEqTest(DeviceUtilsTest):
-
-  def testEq_equal_deviceUtils(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdef'))
-    self.assertTrue(self.device == other)
-    self.assertTrue(other == self.device)
-
-  def testEq_equal_adbWrapper(self):
-    other = adb_wrapper.AdbWrapper('0123456789abcdef')
-    self.assertTrue(self.device == other)
-    self.assertTrue(other == self.device)
-
-  def testEq_equal_string(self):
-    other = '0123456789abcdef'
-    self.assertTrue(self.device == other)
-    self.assertTrue(other == self.device)
-
-  def testEq_devicesNotEqual(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdee'))
-    self.assertFalse(self.device == other)
-    self.assertFalse(other == self.device)
-
-  def testEq_identity(self):
-    self.assertTrue(self.device == self.device)
-
-  def testEq_serialInList(self):
-    devices = [self.device]
-    self.assertTrue('0123456789abcdef' in devices)
-
-
-class DeviceUtilsLtTest(DeviceUtilsTest):
-
-  def testLt_lessThan(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('ffffffffffffffff'))
-    self.assertTrue(self.device < other)
-    self.assertTrue(other > self.device)
-
-  def testLt_greaterThan_lhs(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('0000000000000000'))
-    self.assertFalse(self.device < other)
-    self.assertFalse(other > self.device)
-
-  def testLt_equal(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdef'))
-    self.assertFalse(self.device < other)
-    self.assertFalse(other > self.device)
-
-  def testLt_sorted(self):
-    devices = [
-        device_utils.DeviceUtils(_AdbWrapperMock('ffffffffffffffff')),
-        device_utils.DeviceUtils(_AdbWrapperMock('0000000000000000')),
-    ]
-    sorted_devices = sorted(devices)
-    self.assertEquals('0000000000000000',
-                      sorted_devices[0].adb.GetDeviceSerial())
-    self.assertEquals('ffffffffffffffff',
-                      sorted_devices[1].adb.GetDeviceSerial())
-
-
-class DeviceUtilsStrTest(DeviceUtilsTest):
-
-  def testStr_returnsSerial(self):
-    with self.assertCalls(
-        (self.call.adb.GetDeviceSerial(), '0123456789abcdef')):
-      self.assertEqual('0123456789abcdef', str(self.device))
-
-
-class DeviceUtilsIsOnlineTest(DeviceUtilsTest):
-
-  def testIsOnline_true(self):
-    with self.assertCall(self.call.adb.GetState(), 'device'):
-      self.assertTrue(self.device.IsOnline())
-
-  def testIsOnline_false(self):
-    with self.assertCall(self.call.adb.GetState(), 'offline'):
-      self.assertFalse(self.device.IsOnline())
-
-  def testIsOnline_error(self):
-    with self.assertCall(self.call.adb.GetState(), self.CommandError()):
-      self.assertFalse(self.device.IsOnline())
-
-
-class DeviceUtilsHasRootTest(DeviceUtilsTest):
-
-  def testHasRoot_true(self):
-    with self.patch_call(self.call.device.product_name,
-                          return_value='notasailfish'), (
-        self.assertCall(self.call.adb.Shell('ls /root'), 'foo\n')):
-      self.assertTrue(self.device.HasRoot())
-
-  def testhasRootSpecial_true(self):
-    with self.patch_call(self.call.device.product_name,
-                         return_value='sailfish'), (
-        self.assertCall(self.call.adb.Shell('getprop service.adb.root'),
-                        '1\n')):
-      self.assertTrue(self.device.HasRoot())
-
-  def testHasRoot_false(self):
-    with self.patch_call(self.call.device.product_name,
-                         return_value='notasailfish'), (
-        self.assertCall(self.call.adb.Shell('ls /root'),
-                        self.ShellError())):
-      self.assertFalse(self.device.HasRoot())
-
-  def testHasRootSpecial_false(self):
-    with self.patch_call(self.call.device.product_name,
-                         return_value='sailfish'), (
-        self.assertCall(self.call.adb.Shell('getprop service.adb.root'),
-                        '\n')):
-      self.assertFalse(self.device.HasRoot())
-
-
-class DeviceUtilsEnableRootTest(DeviceUtilsTest):
-
-  def testEnableRoot_succeeds(self):
-    with self.assertCalls(
-        (self.call.device.IsUserBuild(), False),
-         self.call.adb.Root(),
-         self.call.device.WaitUntilFullyBooted()):
-      self.device.EnableRoot()
-
-  def testEnableRoot_userBuild(self):
-    with self.assertCalls(
-        (self.call.device.IsUserBuild(), True)):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.EnableRoot()
-
-  def testEnableRoot_rootFails(self):
-    with self.assertCalls(
-        (self.call.device.IsUserBuild(), False),
-        (self.call.adb.Root(), self.CommandError())):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.EnableRoot()
-
-
-class DeviceUtilsIsUserBuildTest(DeviceUtilsTest):
-
-  def testIsUserBuild_yes(self):
-    with self.assertCall(
-        self.call.device.GetProp('ro.build.type', cache=True), 'user'):
-      self.assertTrue(self.device.IsUserBuild())
-
-  def testIsUserBuild_no(self):
-    with self.assertCall(
-        self.call.device.GetProp('ro.build.type', cache=True), 'userdebug'):
-      self.assertFalse(self.device.IsUserBuild())
-
-
-class DeviceUtilsGetExternalStoragePathTest(DeviceUtilsTest):
-
-  def testGetExternalStoragePath_succeeds(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized(sdcard='/fake/storage/path')):
-      self.assertEquals('/fake/storage/path',
-                        self.device.GetExternalStoragePath())
-
-  def testGetExternalStoragePath_fails(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized(sdcard='')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetExternalStoragePath()
-
-
-class DeviceUtilsGetApplicationPathsInternalTest(DeviceUtilsTest):
-
-  def testGetApplicationPathsInternal_exists(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'path', 'android'], check_return=True),
-         ['package:/path/to/android.apk'])):
-      self.assertEquals(['/path/to/android.apk'],
-                        self.device._GetApplicationPathsInternal('android'))
-
-  def testGetApplicationPathsInternal_notExists(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'path', 'not.installed.app'], check_return=True),
-         '')):
-      self.assertEquals([],
-          self.device._GetApplicationPathsInternal('not.installed.app'))
-
-  def testGetApplicationPathsInternal_garbageFirstLine(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'path', 'android'], check_return=True),
-         ['garbage first line'])):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device._GetApplicationPathsInternal('android')
-
-  def testGetApplicationPathsInternal_fails(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'path', 'android'], check_return=True),
-         self.CommandError('ERROR. Is package manager running?\n'))):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device._GetApplicationPathsInternal('android')
-
-
-class DeviceUtils_GetApplicationVersionTest(DeviceUtilsTest):
-
-  def test_GetApplicationVersion_exists(self):
-    with self.assertCalls(
-        (self.call.adb.Shell('dumpsys package com.android.chrome'),
-         'Packages:\n'
-         '  Package [com.android.chrome] (3901ecfb):\n'
-         '    userId=1234 gids=[123, 456, 789]\n'
-         '    pkg=Package{1fecf634 com.android.chrome}\n'
-         '    versionName=45.0.1234.7\n')):
-      self.assertEquals('45.0.1234.7',
-                        self.device.GetApplicationVersion('com.android.chrome'))
-
-  def test_GetApplicationVersion_notExists(self):
-    with self.assertCalls(
-        (self.call.adb.Shell('dumpsys package com.android.chrome'), '')):
-      self.assertEquals(None,
-                        self.device.GetApplicationVersion('com.android.chrome'))
-
-  def test_GetApplicationVersion_fails(self):
-    with self.assertCalls(
-        (self.call.adb.Shell('dumpsys package com.android.chrome'),
-         'Packages:\n'
-         '  Package [com.android.chrome] (3901ecfb):\n'
-         '    userId=1234 gids=[123, 456, 789]\n'
-         '    pkg=Package{1fecf634 com.android.chrome}\n')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetApplicationVersion('com.android.chrome')
-
-
-class DeviceUtilsGetApplicationDataDirectoryTest(DeviceUtilsTest):
-
-  def testGetApplicationDataDirectory_exists(self):
-    with self.assertCall(
-        self.call.device._RunPipedShellCommand(
-            'pm dump foo.bar.baz | grep dataDir='),
-        ['dataDir=/data/data/foo.bar.baz']):
-      self.assertEquals(
-          '/data/data/foo.bar.baz',
-          self.device.GetApplicationDataDirectory('foo.bar.baz'))
-
-  def testGetApplicationDataDirectory_notExists(self):
-    with self.assertCall(
-        self.call.device._RunPipedShellCommand(
-            'pm dump foo.bar.baz | grep dataDir='),
-        self.ShellError()):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetApplicationDataDirectory('foo.bar.baz')
-
-
-@mock.patch('time.sleep', mock.Mock())
-class DeviceUtilsWaitUntilFullyBootedTest(DeviceUtilsTest):
-
-  def testWaitUntilFullyBooted_succeedsNoWifi(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1')):
-      self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_succeedsWithWifi(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1'),
-        # wifi_enabled
-        (self.call.adb.Shell('dumpsys wifi'),
-         'stuff\nWi-Fi is enabled\nmore stuff\n')):
-      self.device.WaitUntilFullyBooted(wifi=True)
-
-  def testWaitUntilFullyBooted_deviceNotInitiallyAvailable(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1')):
-      self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_deviceBrieflyOffline(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False),
-         self.AdbCommandError()),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1')):
-      self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_sdCardReadyFails_noPath(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.CommandError())):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_sdCardReadyFails_notExists(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), self.ShellError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), self.ShellError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'),
-         self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_devicePmFails(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         self.CommandError()),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         self.CommandError()),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_bootFails(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '0'),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '0'),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False),
-         self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_wifiFails(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1'),
-        # wifi_enabled
-        (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'),
-        # wifi_enabled
-        (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'),
-        # wifi_enabled
-        (self.call.adb.Shell('dumpsys wifi'), self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=True)
-
-
-@mock.patch('time.sleep', mock.Mock())
-class DeviceUtilsRebootTest(DeviceUtilsTest):
-
-  def testReboot_nonBlocking(self):
-    with self.assertCalls(
-        self.call.adb.Reboot(),
-        (self.call.device.IsOnline(), True),
-        (self.call.device.IsOnline(), False)):
-      self.device.Reboot(block=False)
-
-  def testReboot_blocking(self):
-    with self.assertCalls(
-        self.call.adb.Reboot(),
-        (self.call.device.IsOnline(), True),
-        (self.call.device.IsOnline(), False),
-        self.call.device.WaitUntilFullyBooted(wifi=False)):
-      self.device.Reboot(block=True)
-
-  def testReboot_blockUntilWifi(self):
-    with self.assertCalls(
-        self.call.adb.Reboot(),
-        (self.call.device.IsOnline(), True),
-        (self.call.device.IsOnline(), False),
-        self.call.device.WaitUntilFullyBooted(wifi=True)):
-      self.device.Reboot(block=True, wifi=True)
-
-
-class DeviceUtilsInstallTest(DeviceUtilsTest):
-
-  mock_apk = _MockApkHelper('/fake/test/app.apk', 'test.package', ['p1'])
-
-  def testInstall_noPriorInstall(self):
-    with self.patch_call(self.call.device.build_version_sdk, return_value=23):
-      with self.assertCalls(
-          (mock.call.os.path.exists('/fake/test/app.apk'), True),
-          (self.call.device._GetApplicationPathsInternal('test.package'), []),
-          self.call.adb.Install('/fake/test/app.apk', reinstall=False,
-                                allow_downgrade=False),
-          (self.call.device.GrantPermissions('test.package', ['p1']), [])):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_permissionsPreM(self):
-    with self.patch_call(self.call.device.build_version_sdk, return_value=20):
-      with self.assertCalls(
-          (mock.call.os.path.exists('/fake/test/app.apk'), True),
-          (self.call.device._GetApplicationPathsInternal('test.package'), []),
-          (self.call.adb.Install('/fake/test/app.apk', reinstall=False,
-                                 allow_downgrade=False))):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_findPermissions(self):
-    with self.patch_call(self.call.device.build_version_sdk, return_value=23):
-      with self.assertCalls(
-          (mock.call.os.path.exists('/fake/test/app.apk'), True),
-          (self.call.device._GetApplicationPathsInternal('test.package'), []),
-          (self.call.adb.Install('/fake/test/app.apk', reinstall=False,
-                                 allow_downgrade=False)),
-          (self.call.device.GrantPermissions('test.package', ['p1']), [])):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_passPermissions(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'), []),
-        (self.call.adb.Install('/fake/test/app.apk', reinstall=False,
-                               allow_downgrade=False)),
-        (self.call.device.GrantPermissions('test.package', ['p1', 'p2']), [])):
-      self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0,
-                          permissions=['p1', 'p2'])
-
-  def testInstall_differentPriorInstall(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['/fake/data/app/test.package.apk']),
-        (self.call.device._ComputeStaleApks('test.package',
-            ['/fake/test/app.apk']),
-         (['/fake/test/app.apk'], None)),
-        self.call.device.Uninstall('test.package'),
-        self.call.adb.Install('/fake/test/app.apk', reinstall=False,
-                              allow_downgrade=False)):
-      self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0,
-                          permissions=[])
-
-  def testInstall_differentPriorInstall_reinstall(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['/fake/data/app/test.package.apk']),
-        (self.call.device._ComputeStaleApks('test.package',
-            ['/fake/test/app.apk']),
-         (['/fake/test/app.apk'], None)),
-        self.call.adb.Install('/fake/test/app.apk', reinstall=True,
-                              allow_downgrade=False)):
-      self.device.Install(DeviceUtilsInstallTest.mock_apk,
-          reinstall=True, retries=0, permissions=[])
-
-  def testInstall_identicalPriorInstall_reinstall(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['/fake/data/app/test.package.apk']),
-        (self.call.device._ComputeStaleApks('test.package',
-            ['/fake/test/app.apk']),
-         ([], None)),
-        (self.call.device.ForceStop('test.package'))):
-      self.device.Install(DeviceUtilsInstallTest.mock_apk,
-          reinstall=True, retries=0, permissions=[])
-
-  def testInstall_missingApk(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), False)):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_fails(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'), []),
-        (self.call.adb.Install('/fake/test/app.apk', reinstall=False,
-                               allow_downgrade=False),
-         self.CommandError('Failure\r\n'))):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_downgrade(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['/fake/data/app/test.package.apk']),
-        (self.call.device._ComputeStaleApks('test.package',
-            ['/fake/test/app.apk']),
-         (['/fake/test/app.apk'], None)),
-        self.call.adb.Install('/fake/test/app.apk', reinstall=True,
-                              allow_downgrade=True)):
-      self.device.Install(DeviceUtilsInstallTest.mock_apk,
-          reinstall=True, retries=0, permissions=[], allow_downgrade=True)
-
-
-class DeviceUtilsInstallSplitApkTest(DeviceUtilsTest):
-
-  mock_apk = _MockApkHelper('base.apk', 'test.package', ['p1'])
-
-  def testInstallSplitApk_noPriorInstall(self):
-    with self.assertCalls(
-        (self.call.device._CheckSdkLevel(21)),
-        (mock.call.devil.android.sdk.split_select.SelectSplits(
-            self.device, 'base.apk',
-            ['split1.apk', 'split2.apk', 'split3.apk'],
-            allow_cached_props=False),
-         ['split2.apk']),
-        (mock.call.os.path.exists('base.apk'), True),
-        (mock.call.os.path.exists('split2.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'), []),
-        (self.call.adb.InstallMultiple(
-            ['base.apk', 'split2.apk'], partial=None, reinstall=False,
-            allow_downgrade=False))):
-      self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk,
-          ['split1.apk', 'split2.apk', 'split3.apk'], permissions=[], retries=0)
-
-  def testInstallSplitApk_partialInstall(self):
-    with self.assertCalls(
-        (self.call.device._CheckSdkLevel(21)),
-        (mock.call.devil.android.sdk.split_select.SelectSplits(
-            self.device, 'base.apk',
-            ['split1.apk', 'split2.apk', 'split3.apk'],
-            allow_cached_props=False),
-         ['split2.apk']),
-        (mock.call.os.path.exists('base.apk'), True),
-        (mock.call.os.path.exists('split2.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['base-on-device.apk', 'split2-on-device.apk']),
-        (self.call.device._ComputeStaleApks('test.package',
-                                            ['base.apk', 'split2.apk']),
-         (['split2.apk'], None)),
-        (self.call.adb.InstallMultiple(
-            ['split2.apk'], partial='test.package', reinstall=True,
-            allow_downgrade=False))):
-      self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk,
-                                  ['split1.apk', 'split2.apk', 'split3.apk'],
-                                  reinstall=True, permissions=[], retries=0)
-
-  def testInstallSplitApk_downgrade(self):
-    with self.assertCalls(
-        (self.call.device._CheckSdkLevel(21)),
-        (mock.call.devil.android.sdk.split_select.SelectSplits(
-            self.device, 'base.apk',
-            ['split1.apk', 'split2.apk', 'split3.apk'],
-            allow_cached_props=False),
-         ['split2.apk']),
-        (mock.call.os.path.exists('base.apk'), True),
-        (mock.call.os.path.exists('split2.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['base-on-device.apk', 'split2-on-device.apk']),
-        (self.call.device._ComputeStaleApks('test.package',
-                                            ['base.apk', 'split2.apk']),
-         (['split2.apk'], None)),
-        (self.call.adb.InstallMultiple(
-            ['split2.apk'], partial='test.package', reinstall=True,
-            allow_downgrade=True))):
-      self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk,
-                                  ['split1.apk', 'split2.apk', 'split3.apk'],
-                                  reinstall=True, permissions=[], retries=0,
-                                  allow_downgrade=True)
-
-  def testInstallSplitApk_missingSplit(self):
-    with self.assertCalls(
-        (self.call.device._CheckSdkLevel(21)),
-        (mock.call.devil.android.sdk.split_select.SelectSplits(
-            self.device, 'base.apk',
-            ['split1.apk', 'split2.apk', 'split3.apk'],
-            allow_cached_props=False),
-         ['split2.apk']),
-        (mock.call.os.path.exists('base.apk'), True),
-        (mock.call.os.path.exists('split2.apk'), False)):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk,
-            ['split1.apk', 'split2.apk', 'split3.apk'], permissions=[],
-            retries=0)
-
-
-class DeviceUtilsUninstallTest(DeviceUtilsTest):
-
-  def testUninstall_callsThrough(self):
-    with self.assertCalls(
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['/path.apk']),
-        self.call.adb.Uninstall('test.package', True)):
-      self.device.Uninstall('test.package', True)
-
-  def testUninstall_noop(self):
-    with self.assertCalls(
-        (self.call.device._GetApplicationPathsInternal('test.package'), [])):
-      self.device.Uninstall('test.package', True)
-
-
-class DeviceUtilsSuTest(DeviceUtilsTest):
-
-  def testSu_preM(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP_MR1):
-      self.assertEquals('su -c foo', self.device._Su('foo'))
-
-  def testSu_mAndAbove(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.MARSHMALLOW):
-      self.assertEquals('su 0 foo', self.device._Su('foo'))
-
-
-class DeviceUtilsRunShellCommandTest(DeviceUtilsTest):
-
-  def setUp(self):
-    super(DeviceUtilsRunShellCommandTest, self).setUp()
-    self.device.NeedsSU = mock.Mock(return_value=False)
-
-  def testRunShellCommand_commandAsList(self):
-    with self.assertCall(self.call.adb.Shell('pm list packages'), ''):
-      self.device.RunShellCommand(
-          ['pm', 'list', 'packages'], check_return=True)
-
-  def testRunShellCommand_commandAsListQuoted(self):
-    with self.assertCall(self.call.adb.Shell("echo 'hello world' '$10'"), ''):
-      self.device.RunShellCommand(
-          ['echo', 'hello world', '$10'], check_return=True)
-
-  def testRunShellCommand_commandAsString(self):
-    with self.assertCall(self.call.adb.Shell('echo "$VAR"'), ''):
-      self.device.RunShellCommand(
-          'echo "$VAR"', shell=True, check_return=True)
-
-  def testNewRunShellImpl_withEnv(self):
-    with self.assertCall(
-        self.call.adb.Shell('VAR=some_string echo "$VAR"'), ''):
-      self.device.RunShellCommand(
-          'echo "$VAR"', shell=True, check_return=True,
-          env={'VAR': 'some_string'})
-
-  def testNewRunShellImpl_withEnvQuoted(self):
-    with self.assertCall(
-        self.call.adb.Shell('PATH="$PATH:/other/path" run_this'), ''):
-      self.device.RunShellCommand(
-          ['run_this'], check_return=True, env={'PATH': '$PATH:/other/path'})
-
-  def testNewRunShellImpl_withEnv_failure(self):
-    with self.assertRaises(KeyError):
-      self.device.RunShellCommand(
-          ['some_cmd'], check_return=True, env={'INVALID NAME': 'value'})
-
-  def testNewRunShellImpl_withCwd(self):
-    with self.assertCall(self.call.adb.Shell('cd /some/test/path && ls'), ''):
-      self.device.RunShellCommand(
-          ['ls'], check_return=True, cwd='/some/test/path')
-
-  def testNewRunShellImpl_withCwdQuoted(self):
-    with self.assertCall(
-        self.call.adb.Shell("cd '/some test/path with/spaces' && ls"), ''):
-      self.device.RunShellCommand(
-          ['ls'], check_return=True, cwd='/some test/path with/spaces')
-
-  def testRunShellCommand_withHugeCmd(self):
-    payload = 'hi! ' * 1024
-    expected_cmd = "echo '%s'" % payload
-    with self.assertCalls(
-      (mock.call.devil.android.device_temp_file.DeviceTempFile(
-          self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')),
-      self.call.device._WriteFileWithPush('/sdcard/temp-123.sh', expected_cmd),
-      (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')):
-      self.assertEquals(
-          [payload],
-          self.device.RunShellCommand(['echo', payload], check_return=True))
-
-  def testRunShellCommand_withHugeCmdAndSu(self):
-    payload = 'hi! ' * 1024
-    expected_cmd_without_su = """sh -c 'echo '"'"'%s'"'"''""" % payload
-    expected_cmd = 'su -c %s' % expected_cmd_without_su
-    with self.assertCalls(
-      (self.call.device.NeedsSU(), True),
-      (self.call.device._Su(expected_cmd_without_su), expected_cmd),
-      (mock.call.devil.android.device_temp_file.DeviceTempFile(
-          self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')),
-      self.call.device._WriteFileWithPush('/sdcard/temp-123.sh', expected_cmd),
-      (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')):
-      self.assertEquals(
-          [payload],
-          self.device.RunShellCommand(
-              ['echo', payload], check_return=True, as_root=True))
-
-  def testRunShellCommand_withSu(self):
-    expected_cmd_without_su = "sh -c 'setprop service.adb.root 0'"
-    expected_cmd = 'su -c %s' % expected_cmd_without_su
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device._Su(expected_cmd_without_su), expected_cmd),
-        (self.call.adb.Shell(expected_cmd), '')):
-      self.device.RunShellCommand(
-          ['setprop', 'service.adb.root', '0'],
-          check_return=True, as_root=True)
-
-  def testRunShellCommand_withRunAs(self):
-    expected_cmd_without_run_as = "sh -c 'mkdir -p files'"
-    expected_cmd = (
-        'run-as org.devil.test_package %s' % expected_cmd_without_run_as)
-    with self.assertCall(self.call.adb.Shell(expected_cmd), ''):
-      self.device.RunShellCommand(
-          ['mkdir', '-p', 'files'],
-          check_return=True, run_as='org.devil.test_package')
-
-  def testRunShellCommand_withRunAsAndSu(self):
-    expected_cmd_with_nothing = "sh -c 'mkdir -p files'"
-    expected_cmd_with_run_as = (
-        'run-as org.devil.test_package %s' % expected_cmd_with_nothing)
-    expected_cmd_without_su = (
-        'sh -c %s' % cmd_helper.SingleQuote(expected_cmd_with_run_as))
-    expected_cmd = 'su -c %s' % expected_cmd_without_su
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device._Su(expected_cmd_without_su), expected_cmd),
-        (self.call.adb.Shell(expected_cmd), '')):
-      self.device.RunShellCommand(
-          ['mkdir', '-p', 'files'],
-          check_return=True, run_as='org.devil.test_package',
-          as_root=True)
-
-  def testRunShellCommand_manyLines(self):
-    cmd = 'ls /some/path'
-    with self.assertCall(self.call.adb.Shell(cmd), 'file1\nfile2\nfile3\n'):
-      self.assertEquals(
-          ['file1', 'file2', 'file3'],
-          self.device.RunShellCommand(cmd.split(), check_return=True))
-
-  def testRunShellCommand_manyLinesRawOutput(self):
-    cmd = 'ls /some/path'
-    with self.assertCall(self.call.adb.Shell(cmd), '\rfile1\nfile2\r\nfile3\n'):
-      self.assertEquals(
-          '\rfile1\nfile2\r\nfile3\n',
-          self.device.RunShellCommand(
-              cmd.split(), check_return=True, raw_output=True))
-
-  def testRunShellCommand_singleLine_success(self):
-    cmd = 'echo $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd), 'some value\n'):
-      self.assertEquals(
-          'some value',
-          self.device.RunShellCommand(
-              cmd, shell=True, check_return=True, single_line=True))
-
-  def testRunShellCommand_singleLine_successEmptyLine(self):
-    cmd = 'echo $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd), '\n'):
-      self.assertEquals(
-          '',
-          self.device.RunShellCommand(
-              cmd, shell=True, check_return=True, single_line=True))
-
-  def testRunShellCommand_singleLine_successWithoutEndLine(self):
-    cmd = 'echo -n $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd), 'some value'):
-      self.assertEquals(
-          'some value',
-          self.device.RunShellCommand(
-              cmd, shell=True, check_return=True, single_line=True))
-
-  def testRunShellCommand_singleLine_successNoOutput(self):
-    cmd = 'echo -n $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd), ''):
-      self.assertEquals(
-          '',
-          self.device.RunShellCommand(
-              cmd, shell=True, check_return=True, single_line=True))
-
-  def testRunShellCommand_singleLine_failTooManyLines(self):
-    cmd = 'echo $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd),
-                         'some value\nanother value\n'):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.RunShellCommand(
-            cmd, shell=True, check_return=True, single_line=True)
-
-  def testRunShellCommand_checkReturn_success(self):
-    cmd = 'echo $ANDROID_DATA'
-    output = '/data\n'
-    with self.assertCall(self.call.adb.Shell(cmd), output):
-      self.assertEquals(
-          [output.rstrip()],
-          self.device.RunShellCommand(cmd, shell=True, check_return=True))
-
-  def testRunShellCommand_checkReturn_failure(self):
-    cmd = 'ls /root'
-    output = 'opendir failed, Permission denied\n'
-    with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)):
-      with self.assertRaises(device_errors.AdbCommandFailedError):
-        self.device.RunShellCommand(cmd.split(), check_return=True)
-
-  def testRunShellCommand_checkReturn_disabled(self):
-    cmd = 'ls /root'
-    output = 'opendir failed, Permission denied\n'
-    with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)):
-      self.assertEquals(
-          [output.rstrip()],
-          self.device.RunShellCommand(cmd.split(), check_return=False))
-
-  def testRunShellCommand_largeOutput_enabled(self):
-    cmd = 'echo $VALUE'
-    temp_file = MockTempFile('/sdcard/temp-123')
-    cmd_redirect = '( %s )>%s' % (cmd, temp_file.name)
-    with self.assertCalls(
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-            temp_file),
-        (self.call.adb.Shell(cmd_redirect)),
-        (self.call.device.ReadFile(temp_file.name, force_pull=True),
-         'something')):
-      self.assertEquals(
-          ['something'],
-          self.device.RunShellCommand(
-              cmd, shell=True, large_output=True, check_return=True))
-
-  def testRunShellCommand_largeOutput_disabledNoTrigger(self):
-    cmd = 'something'
-    with self.assertCall(self.call.adb.Shell(cmd), self.ShellError('')):
-      with self.assertRaises(device_errors.AdbCommandFailedError):
-        self.device.RunShellCommand([cmd], check_return=True)
-
-  def testRunShellCommand_largeOutput_disabledTrigger(self):
-    cmd = 'echo $VALUE'
-    temp_file = MockTempFile('/sdcard/temp-123')
-    cmd_redirect = '( %s )>%s' % (cmd, temp_file.name)
-    with self.assertCalls(
-        (self.call.adb.Shell(cmd), self.ShellError('', None)),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-            temp_file),
-        (self.call.adb.Shell(cmd_redirect)),
-        (self.call.device.ReadFile(mock.ANY, force_pull=True),
-         'something')):
-      self.assertEquals(
-          ['something'],
-          self.device.RunShellCommand(cmd, shell=True, check_return=True))
-
-
-class DeviceUtilsRunPipedShellCommandTest(DeviceUtilsTest):
-
-  def testRunPipedShellCommand_success(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
-            shell=True, check_return=True),
-        ['This line contains foo', 'PIPESTATUS: 0 0']):
-      self.assertEquals(['This line contains foo'],
-                        self.device._RunPipedShellCommand('ps | grep foo'))
-
-  def testRunPipedShellCommand_firstCommandFails(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
-            shell=True, check_return=True),
-        ['PIPESTATUS: 1 0']):
-      with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec:
-        self.device._RunPipedShellCommand('ps | grep foo')
-      self.assertEquals([1, 0], ec.exception.status)
-
-  def testRunPipedShellCommand_secondCommandFails(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
-            shell=True, check_return=True),
-        ['PIPESTATUS: 0 1']):
-      with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec:
-        self.device._RunPipedShellCommand('ps | grep foo')
-      self.assertEquals([0, 1], ec.exception.status)
-
-  def testRunPipedShellCommand_outputCutOff(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
-            shell=True, check_return=True),
-        ['foo.bar'] * 256 + ['foo.ba']):
-      with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec:
-        self.device._RunPipedShellCommand('ps | grep foo')
-      self.assertIs(None, ec.exception.status)
-
-
-@mock.patch('time.sleep', mock.Mock())
-class DeviceUtilsKillAllTest(DeviceUtilsTest):
-
-  def testKillAll_noMatchingProcessesFailure(self):
-    with self.assertCall(self.call.device.GetPids('test_process'), {}):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.KillAll('test_process')
-
-  def testKillAll_noMatchingProcessesQuiet(self):
-    with self.assertCall(self.call.device.GetPids('test_process'), {}):
-      self.assertEqual(0, self.device.KillAll('test_process', quiet=True))
-
-  def testKillAll_nonblocking(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'),
-         {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
-        (self.call.adb.Shell('kill -9 1234 5678'), '')):
-      self.assertEquals(
-          2, self.device.KillAll('some.process', blocking=False))
-
-  def testKillAll_blocking(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'),
-         {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
-        (self.call.adb.Shell('kill -9 1234 5678'), ''),
-        (self.call.device.GetPids('some.process'),
-         {'some.processing.thing': ['5678']}),
-        (self.call.device.GetPids('some.process'),
-         {'some.process': ['1111']})):  # Other instance with different pid.
-      self.assertEquals(
-          2, self.device.KillAll('some.process', blocking=True))
-
-  def testKillAll_exactNonblocking(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'),
-         {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
-        (self.call.adb.Shell('kill -9 1234'), '')):
-      self.assertEquals(
-          1, self.device.KillAll('some.process', exact=True, blocking=False))
-
-  def testKillAll_exactBlocking(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'),
-         {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
-        (self.call.adb.Shell('kill -9 1234'), ''),
-        (self.call.device.GetPids('some.process'),
-         {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
-        (self.call.device.GetPids('some.process'),
-         {'some.processing.thing': ['5678']})):
-      self.assertEquals(
-          1, self.device.KillAll('some.process', exact=True, blocking=True))
-
-  def testKillAll_root(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'), {'some.process': ['1234']}),
-        (self.call.device.NeedsSU(), True),
-        (self.call.device._Su("sh -c 'kill -9 1234'"),
-         "su -c sh -c 'kill -9 1234'"),
-        (self.call.adb.Shell("su -c sh -c 'kill -9 1234'"), '')):
-      self.assertEquals(
-          1, self.device.KillAll('some.process', as_root=True))
-
-  def testKillAll_sigterm(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'),
-            {'some.process': ['1234']}),
-        (self.call.adb.Shell('kill -15 1234'), '')):
-      self.assertEquals(
-          1, self.device.KillAll('some.process', signum=device_signal.SIGTERM))
-
-  def testKillAll_multipleInstances(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'),
-            {'some.process': ['1234', '4567']}),
-        (self.call.adb.Shell('kill -15 1234 4567'), '')):
-      self.assertEquals(
-          2, self.device.KillAll('some.process', signum=device_signal.SIGTERM))
-
-
-class DeviceUtilsStartActivityTest(DeviceUtilsTest):
-
-  def testStartActivity_actionOnly(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_success(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_failure(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Error: Failed to start test activity'):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.StartActivity(test_intent)
-
-  def testStartActivity_blocking(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-W '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent, blocking=True)
-
-  def testStartActivity_withCategory(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                category='android.intent.category.HOME')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-c android.intent.category.HOME '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withMultipleCategories(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                category=['android.intent.category.HOME',
-                                          'android.intent.category.BROWSABLE'])
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-c android.intent.category.HOME '
-                            '-c android.intent.category.BROWSABLE '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withData(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                data='http://www.google.com/')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-d http://www.google.com/ '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withStringExtra(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                extras={'foo': 'test'})
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main '
-                            '--es foo test'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withBoolExtra(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                extras={'foo': True})
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main '
-                            '--ez foo True'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withIntExtra(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                extras={'foo': 123})
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main '
-                            '--ei foo 123'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withTraceFile(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '--start-profiler test_trace_file.out '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent,
-                                trace_file_name='test_trace_file.out')
-
-  def testStartActivity_withForceStop(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-S '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent, force_stop=True)
-
-  def testStartActivity_withFlags(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                flags=[
-                                  intent.FLAG_ACTIVITY_NEW_TASK,
-                                  intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
-                                ])
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main '
-                            '-f 0x10200000'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-
-class DeviceUtilsStartInstrumentationTest(DeviceUtilsTest):
-
-  def testStartInstrumentation_nothing(self):
-    with self.assertCalls(
-        self.call.device.RunShellCommand(
-            'p=test.package;am instrument "$p"/.TestInstrumentation',
-            shell=True, check_return=True, large_output=True)):
-      self.device.StartInstrumentation(
-          'test.package/.TestInstrumentation',
-          finish=False, raw=False, extras=None)
-
-  def testStartInstrumentation_finish(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            'p=test.package;am instrument -w "$p"/.TestInstrumentation',
-            shell=True, check_return=True, large_output=True),
-         ['OK (1 test)'])):
-      output = self.device.StartInstrumentation(
-          'test.package/.TestInstrumentation',
-          finish=True, raw=False, extras=None)
-      self.assertEquals(['OK (1 test)'], output)
-
-  def testStartInstrumentation_raw(self):
-    with self.assertCalls(
-        self.call.device.RunShellCommand(
-            'p=test.package;am instrument -r "$p"/.TestInstrumentation',
-            shell=True, check_return=True, large_output=True)):
-      self.device.StartInstrumentation(
-          'test.package/.TestInstrumentation',
-          finish=False, raw=True, extras=None)
-
-  def testStartInstrumentation_extras(self):
-    with self.assertCalls(
-        self.call.device.RunShellCommand(
-            'p=test.package;am instrument -e "$p".foo Foo -e bar \'Val \'"$p" '
-            '"$p"/.TestInstrumentation',
-            shell=True, check_return=True, large_output=True)):
-      self.device.StartInstrumentation(
-          'test.package/.TestInstrumentation',
-          finish=False, raw=False, extras={'test.package.foo': 'Foo',
-                                           'bar': 'Val test.package'})
-
-
-class DeviceUtilsBroadcastIntentTest(DeviceUtilsTest):
-
-  def testBroadcastIntent_noExtras(self):
-    test_intent = intent.Intent(action='test.package.with.an.INTENT')
-    with self.assertCall(
-        self.call.adb.Shell('am broadcast -a test.package.with.an.INTENT'),
-        'Broadcasting: Intent { act=test.package.with.an.INTENT } '):
-      self.device.BroadcastIntent(test_intent)
-
-  def testBroadcastIntent_withExtra(self):
-    test_intent = intent.Intent(action='test.package.with.an.INTENT',
-                                extras={'foo': 'bar value'})
-    with self.assertCall(
-        self.call.adb.Shell(
-            "am broadcast -a test.package.with.an.INTENT --es foo 'bar value'"),
-        'Broadcasting: Intent { act=test.package.with.an.INTENT } '):
-      self.device.BroadcastIntent(test_intent)
-
-  def testBroadcastIntent_withExtra_noValue(self):
-    test_intent = intent.Intent(action='test.package.with.an.INTENT',
-                                extras={'foo': None})
-    with self.assertCall(
-        self.call.adb.Shell(
-            'am broadcast -a test.package.with.an.INTENT --esn foo'),
-        'Broadcasting: Intent { act=test.package.with.an.INTENT } '):
-      self.device.BroadcastIntent(test_intent)
-
-
-class DeviceUtilsGoHomeTest(DeviceUtilsTest):
-
-  def testGoHome_popupsExist(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['am', 'start', '-W', '-a', 'android.intent.action.MAIN',
-            '-c', 'android.intent.category.HOME'], check_return=True),
-         'Starting: Intent { act=android.intent.action.MAIN }\r\n'''),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '66'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '4'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True),
-         ['mCurrentFocus Launcher'])):
-      self.device.GoHome()
-
-  def testGoHome_willRetry(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['am', 'start', '-W', '-a', 'android.intent.action.MAIN',
-            '-c', 'android.intent.category.HOME'], check_return=True),
-         'Starting: Intent { act=android.intent.action.MAIN }\r\n'''),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '66'], check_return=True,)),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '4'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '66'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '4'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True),
-         self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.GoHome()
-
-  def testGoHome_alreadyFocused(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True),
-        ['mCurrentFocus Launcher']):
-      self.device.GoHome()
-
-  def testGoHome_alreadyFocusedAlternateCase(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True),
-        [' mCurrentFocus .launcher/.']):
-      self.device.GoHome()
-
-  def testGoHome_obtainsFocusAfterGoingHome(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['am', 'start', '-W', '-a', 'android.intent.action.MAIN',
-            '-c', 'android.intent.category.HOME'], check_return=True),
-         'Starting: Intent { act=android.intent.action.MAIN }\r\n'''),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True),
-         ['mCurrentFocus Launcher'])):
-      self.device.GoHome()
-
-
-class DeviceUtilsForceStopTest(DeviceUtilsTest):
-
-  def testForceStop(self):
-    with self.assertCall(
-        self.call.adb.Shell('p=test.package;if [[ "$(ps)" = *$p* ]]; then '
-                            'am force-stop $p; fi'),
-        ''):
-      self.device.ForceStop('test.package')
-
-
-class DeviceUtilsClearApplicationStateTest(DeviceUtilsTest):
-
-  def testClearApplicationState_setPermissions(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '17'),
-        (self.call.device._GetApplicationPathsInternal('this.package.exists'),
-         ['/data/app/this.package.exists.apk']),
-        (self.call.device.RunShellCommand(
-            ['pm', 'clear', 'this.package.exists'],
-            check_return=True),
-         ['Success']),
-        (self.call.device.GrantPermissions(
-            'this.package.exists', ['p1']), [])):
-      self.device.ClearApplicationState(
-          'this.package.exists', permissions=['p1'])
-
-  def testClearApplicationState_packageDoesntExist(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '11'),
-        (self.call.device._GetApplicationPathsInternal('does.not.exist'),
-         [])):
-      self.device.ClearApplicationState('does.not.exist')
-
-  def testClearApplicationState_packageDoesntExistOnAndroidJBMR2OrAbove(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '18'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'clear', 'this.package.does.not.exist'],
-            check_return=True),
-         ['Failed'])):
-      self.device.ClearApplicationState('this.package.does.not.exist')
-
-  def testClearApplicationState_packageExists(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '17'),
-        (self.call.device._GetApplicationPathsInternal('this.package.exists'),
-         ['/data/app/this.package.exists.apk']),
-        (self.call.device.RunShellCommand(
-            ['pm', 'clear', 'this.package.exists'],
-            check_return=True),
-         ['Success'])):
-      self.device.ClearApplicationState('this.package.exists')
-
-  def testClearApplicationState_packageExistsOnAndroidJBMR2OrAbove(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '18'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'clear', 'this.package.exists'],
-            check_return=True),
-         ['Success'])):
-      self.device.ClearApplicationState('this.package.exists')
-
-
-class DeviceUtilsSendKeyEventTest(DeviceUtilsTest):
-
-  def testSendKeyEvent(self):
-    with self.assertCall(self.call.adb.Shell('input keyevent 66'), ''):
-      self.device.SendKeyEvent(66)
-
-
-class DeviceUtilsPushChangedFilesIndividuallyTest(DeviceUtilsTest):
-
-  def testPushChangedFilesIndividually_empty(self):
-    test_files = []
-    with self.assertCalls():
-      self.device._PushChangedFilesIndividually(test_files)
-
-  def testPushChangedFilesIndividually_single(self):
-    test_files = [('/test/host/path', '/test/device/path')]
-    with self.assertCalls(self.call.adb.Push(*test_files[0])):
-      self.device._PushChangedFilesIndividually(test_files)
-
-  def testPushChangedFilesIndividually_multiple(self):
-    test_files = [
-        ('/test/host/path/file1', '/test/device/path/file1'),
-        ('/test/host/path/file2', '/test/device/path/file2')]
-    with self.assertCalls(
-        self.call.adb.Push(*test_files[0]),
-        self.call.adb.Push(*test_files[1])):
-      self.device._PushChangedFilesIndividually(test_files)
-
-
-class DeviceUtilsPushChangedFilesZippedTest(DeviceUtilsTest):
-
-  def testPushChangedFilesZipped_noUnzipCommand(self):
-    test_files = [('/test/host/path/file1', '/test/device/path/file1')]
-    mock_zip_temp = mock.mock_open()
-    mock_zip_temp.return_value.name = '/test/temp/file/tmp.zip'
-    with self.assertCalls(
-        (mock.call.tempfile.NamedTemporaryFile(suffix='.zip'), mock_zip_temp),
-        (mock.call.multiprocessing.Process(
-            target=device_utils.DeviceUtils._CreateDeviceZip,
-            args=('/test/temp/file/tmp.zip', test_files)), mock.Mock()),
-        (self.call.device._MaybeInstallCommands(), False)):
-      self.assertFalse(self.device._PushChangedFilesZipped(test_files,
-                                                           ['/test/dir']))
-
-  def _testPushChangedFilesZipped_spec(self, test_files):
-    mock_zip_temp = mock.mock_open()
-    mock_zip_temp.return_value.name = '/test/temp/file/tmp.zip'
-    with self.assertCalls(
-        (mock.call.tempfile.NamedTemporaryFile(suffix='.zip'), mock_zip_temp),
-        (mock.call.multiprocessing.Process(
-            target=device_utils.DeviceUtils._CreateDeviceZip,
-            args=('/test/temp/file/tmp.zip', test_files)), mock.Mock()),
-        (self.call.device._MaybeInstallCommands(), True),
-        (self.call.device.NeedsSU(), True),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb,
-                                                                 suffix='.zip'),
-             MockTempFile('/test/sdcard/foo123.zip')),
-        self.call.adb.Push(
-            '/test/temp/file/tmp.zip', '/test/sdcard/foo123.zip'),
-        self.call.device.RunShellCommand(
-            'unzip /test/sdcard/foo123.zip&&chmod -R 777 /test/dir',
-            shell=True, as_root=True,
-            env={'PATH': '/data/local/tmp/bin:$PATH'},
-            check_return=True)):
-      self.assertTrue(self.device._PushChangedFilesZipped(test_files,
-                                                          ['/test/dir']))
-
-  def testPushChangedFilesZipped_single(self):
-    self._testPushChangedFilesZipped_spec(
-        [('/test/host/path/file1', '/test/device/path/file1')])
-
-  def testPushChangedFilesZipped_multiple(self):
-    self._testPushChangedFilesZipped_spec(
-        [('/test/host/path/file1', '/test/device/path/file1'),
-         ('/test/host/path/file2', '/test/device/path/file2')])
-
-
-class DeviceUtilsPathExistsTest(DeviceUtilsTest):
-
-  def testPathExists_pathExists(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/path/file exists'],
-            as_root=False, check_return=True, timeout=10, retries=0),
-        []):
-      self.assertTrue(self.device.PathExists('/path/file exists'))
-
-  def testPathExists_multiplePathExists(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/path 1', '-a', '-e', '/path2'],
-            as_root=False, check_return=True, timeout=10, retries=0),
-        []):
-      self.assertTrue(self.device.PathExists(('/path 1', '/path2')))
-
-  def testPathExists_pathDoesntExist(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/path/file.not.exists'],
-            as_root=False, check_return=True, timeout=10, retries=0),
-        self.ShellError()):
-      self.assertFalse(self.device.PathExists('/path/file.not.exists'))
-
-  def testPathExists_asRoot(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/root/path/exists'],
-            as_root=True, check_return=True, timeout=10, retries=0),
-        self.ShellError()):
-      self.assertFalse(
-          self.device.PathExists('/root/path/exists', as_root=True))
-
-  def testFileExists_pathDoesntExist(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/path/file.not.exists'],
-            as_root=False, check_return=True, timeout=10, retries=0),
-        self.ShellError()):
-      self.assertFalse(self.device.FileExists('/path/file.not.exists'))
-
-
-class DeviceUtilsRemovePathTest(DeviceUtilsTest):
-
-  def testRemovePath_regular(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['rm', 'some file'], as_root=False, check_return=True),
-        []):
-      self.device.RemovePath('some file')
-
-  def testRemovePath_withForce(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['rm', '-f', 'some file'], as_root=False, check_return=True),
-        []):
-      self.device.RemovePath('some file', force=True)
-
-  def testRemovePath_recursively(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['rm', '-r', '/remove/this/dir'], as_root=False, check_return=True),
-        []):
-      self.device.RemovePath('/remove/this/dir', recursive=True)
-
-  def testRemovePath_withRoot(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['rm', 'some file'], as_root=True, check_return=True),
-        []):
-      self.device.RemovePath('some file', as_root=True)
-
-  def testRemovePath_manyPaths(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['rm', 'eeny', 'meeny', 'miny', 'moe'],
-            as_root=False, check_return=True),
-        []):
-      self.device.RemovePath(['eeny', 'meeny', 'miny', 'moe'])
-
-
-class DeviceUtilsPullFileTest(DeviceUtilsTest):
-
-  def testPullFile_existsOnDevice(self):
-    with mock.patch('os.path.exists', return_value=True):
-      with self.assertCall(
-          self.call.adb.Pull('/data/app/test.file.exists',
-                             '/test/file/host/path')):
-        self.device.PullFile('/data/app/test.file.exists',
-                             '/test/file/host/path')
-
-  def testPullFile_doesntExistOnDevice(self):
-    with mock.patch('os.path.exists', return_value=True):
-      with self.assertCall(
-          self.call.adb.Pull('/data/app/test.file.does.not.exist',
-                             '/test/file/host/path'),
-          self.CommandError('remote object does not exist')):
-        with self.assertRaises(device_errors.CommandFailedError):
-          self.device.PullFile('/data/app/test.file.does.not.exist',
-                               '/test/file/host/path')
-
-
-class DeviceUtilsReadFileTest(DeviceUtilsTest):
-
-  def testReadFileWithPull_success(self):
-    tmp_host_dir = '/tmp/dir/on.host/'
-    tmp_host = MockTempFile('/tmp/dir/on.host/tmp_ReadFileWithPull')
-    tmp_host.file.read.return_value = 'some interesting contents'
-    with self.assertCalls(
-        (mock.call.tempfile.mkdtemp(), tmp_host_dir),
-        (self.call.adb.Pull('/path/to/device/file', mock.ANY)),
-        (mock.call.__builtin__.open(mock.ANY, 'r'), tmp_host),
-        (mock.call.os.path.exists(tmp_host_dir), True),
-        (mock.call.shutil.rmtree(tmp_host_dir), None)):
-      self.assertEquals('some interesting contents',
-                        self.device._ReadFileWithPull('/path/to/device/file'))
-    tmp_host.file.read.assert_called_once_with()
-
-  def testReadFileWithPull_rejected(self):
-    tmp_host_dir = '/tmp/dir/on.host/'
-    with self.assertCalls(
-        (mock.call.tempfile.mkdtemp(), tmp_host_dir),
-        (self.call.adb.Pull('/path/to/device/file', mock.ANY),
-         self.CommandError()),
-        (mock.call.os.path.exists(tmp_host_dir), True),
-        (mock.call.shutil.rmtree(tmp_host_dir), None)):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device._ReadFileWithPull('/path/to/device/file')
-
-  def testReadFile_exists(self):
-    with self.assertCalls(
-        (self.call.device.FileSize('/read/this/test/file', as_root=False), 256),
-        (self.call.device.RunShellCommand(
-            ['cat', '/read/this/test/file'],
-            as_root=False, check_return=True),
-         ['this is a test file'])):
-      self.assertEqual('this is a test file\n',
-                       self.device.ReadFile('/read/this/test/file'))
-
-  def testReadFile_exists2(self):
-    # Same as testReadFile_exists, but uses Android N ls output.
-    with self.assertCalls(
-        (self.call.device.FileSize('/read/this/test/file', as_root=False), 256),
-        (self.call.device.RunShellCommand(
-            ['cat', '/read/this/test/file'],
-            as_root=False, check_return=True),
-         ['this is a test file'])):
-      self.assertEqual('this is a test file\n',
-                       self.device.ReadFile('/read/this/test/file'))
-
-  def testReadFile_doesNotExist(self):
-    with self.assertCall(
-        self.call.device.FileSize('/this/file/does.not.exist', as_root=False),
-        self.CommandError('File does not exist')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.ReadFile('/this/file/does.not.exist')
-
-  def testReadFile_zeroSize(self):
-    with self.assertCalls(
-        (self.call.device.FileSize('/this/file/has/zero/size', as_root=False),
-         0),
-        (self.call.device._ReadFileWithPull('/this/file/has/zero/size'),
-         'but it has contents\n')):
-      self.assertEqual('but it has contents\n',
-                       self.device.ReadFile('/this/file/has/zero/size'))
-
-  def testReadFile_withSU(self):
-    with self.assertCalls(
-        (self.call.device.FileSize(
-            '/this/file/can.be.read.with.su', as_root=True), 256),
-        (self.call.device.RunShellCommand(
-            ['cat', '/this/file/can.be.read.with.su'],
-            as_root=True, check_return=True),
-         ['this is a test file', 'read with su'])):
-      self.assertEqual(
-          'this is a test file\nread with su\n',
-          self.device.ReadFile('/this/file/can.be.read.with.su',
-                               as_root=True))
-
-  def testReadFile_withPull(self):
-    contents = 'a' * 123456
-    with self.assertCalls(
-        (self.call.device.FileSize('/read/this/big/test/file', as_root=False),
-         123456),
-        (self.call.device._ReadFileWithPull('/read/this/big/test/file'),
-         contents)):
-      self.assertEqual(
-          contents, self.device.ReadFile('/read/this/big/test/file'))
-
-  def testReadFile_withPullAndSU(self):
-    contents = 'b' * 123456
-    with self.assertCalls(
-        (self.call.device.FileSize(
-            '/this/big/file/can.be.read.with.su', as_root=True), 123456),
-        (self.call.device.NeedsSU(), True),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-         MockTempFile('/sdcard/tmp/on.device')),
-        self.call.device.RunShellCommand(
-            'SRC=/this/big/file/can.be.read.with.su DEST=/sdcard/tmp/on.device;'
-            'cp "$SRC" "$DEST" && chmod 666 "$DEST"',
-            shell=True, as_root=True, check_return=True),
-        (self.call.device._ReadFileWithPull('/sdcard/tmp/on.device'),
-         contents)):
-      self.assertEqual(
-          contents,
-          self.device.ReadFile('/this/big/file/can.be.read.with.su',
-                               as_root=True))
-
-  def testReadFile_forcePull(self):
-    contents = 'a' * 123456
-    with self.assertCall(
-        self.call.device._ReadFileWithPull('/read/this/big/test/file'),
-        contents):
-      self.assertEqual(
-          contents,
-          self.device.ReadFile('/read/this/big/test/file', force_pull=True))
-
-
-class DeviceUtilsWriteFileTest(DeviceUtilsTest):
-
-  def testWriteFileWithPush_success(self):
-    tmp_host = MockTempFile('/tmp/file/on.host')
-    contents = 'some interesting contents'
-    with self.assertCalls(
-        (mock.call.tempfile.NamedTemporaryFile(), tmp_host),
-        self.call.adb.Push('/tmp/file/on.host', '/path/to/device/file')):
-      self.device._WriteFileWithPush('/path/to/device/file', contents)
-    tmp_host.file.write.assert_called_once_with(contents)
-
-  def testWriteFileWithPush_rejected(self):
-    tmp_host = MockTempFile('/tmp/file/on.host')
-    contents = 'some interesting contents'
-    with self.assertCalls(
-        (mock.call.tempfile.NamedTemporaryFile(), tmp_host),
-        (self.call.adb.Push('/tmp/file/on.host', '/path/to/device/file'),
-         self.CommandError())):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device._WriteFileWithPush('/path/to/device/file', contents)
-
-  def testWriteFile_withPush(self):
-    contents = 'some large contents ' * 26  # 20 * 26 = 520 chars
-    with self.assertCalls(
-        self.call.device._WriteFileWithPush('/path/to/device/file', contents)):
-      self.device.WriteFile('/path/to/device/file', contents)
-
-  def testWriteFile_withPushForced(self):
-    contents = 'tiny contents'
-    with self.assertCalls(
-        self.call.device._WriteFileWithPush('/path/to/device/file', contents)):
-      self.device.WriteFile('/path/to/device/file', contents, force_push=True)
-
-  def testWriteFile_withPushAndSU(self):
-    contents = 'some large contents ' * 26  # 20 * 26 = 520 chars
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-         MockTempFile('/sdcard/tmp/on.device')),
-        self.call.device._WriteFileWithPush('/sdcard/tmp/on.device', contents),
-        self.call.device.RunShellCommand(
-            ['cp', '/sdcard/tmp/on.device', '/path/to/device/file'],
-            as_root=True, check_return=True)):
-      self.device.WriteFile('/path/to/device/file', contents, as_root=True)
-
-  def testWriteFile_withEcho(self):
-    with self.assertCall(self.call.adb.Shell(
-        "echo -n the.contents > /test/file/to.write"), ''):
-      self.device.WriteFile('/test/file/to.write', 'the.contents')
-
-  def testWriteFile_withEchoAndQuotes(self):
-    with self.assertCall(self.call.adb.Shell(
-        "echo -n 'the contents' > '/test/file/to write'"), ''):
-      self.device.WriteFile('/test/file/to write', 'the contents')
-
-  def testWriteFile_withEchoAndSU(self):
-    expected_cmd_without_su = "sh -c 'echo -n contents > /test/file'"
-    expected_cmd = 'su -c %s' % expected_cmd_without_su
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device._Su(expected_cmd_without_su), expected_cmd),
-        (self.call.adb.Shell(expected_cmd),
-         '')):
-      self.device.WriteFile('/test/file', 'contents', as_root=True)
-
-
-class DeviceUtilsStatDirectoryTest(DeviceUtilsTest):
-  # Note: Also tests ListDirectory in testStatDirectory_fileList.
-
-  EXAMPLE_LS_OUTPUT = [
-    'total 12345',
-    'drwxr-xr-x  19 root   root          0 1970-04-06 18:03 .',
-    'drwxr-xr-x  19 root   root          0 1970-04-06 18:03 ..',
-    'drwxr-xr-x   6 root   root            1970-01-01 00:00 some_dir',
-    '-rw-r--r--   1 root   root        723 1971-01-01 07:04 some_file',
-    '-rw-r-----   1 root   root        327 2009-02-13 23:30 My Music File',
-    # Older Android versions do not print st_nlink
-    'lrwxrwxrwx root     root              1970-01-01 00:00 lnk -> /some/path',
-    'srwxrwx--- system   system            2016-05-31 17:25 a_socket1',
-    'drwxrwxrwt system   misc              1970-11-23 02:25 tmp',
-    'drwxr-s--- system   shell             1970-11-23 02:24 my_cmd',
-    'cr--r----- root     system    10, 183 1971-01-01 07:04 random',
-    'brw------- root     root       7,   0 1971-01-01 07:04 block_dev',
-    '-rwS------ root     shell      157404 2015-04-13 15:44 silly',
-  ]
-
-  FILENAMES = [
-    'some_dir', 'some_file', 'My Music File', 'lnk', 'a_socket1',
-    'tmp', 'my_cmd', 'random', 'block_dev', 'silly']
-
-  def getStatEntries(self, path_given='/', path_listed='/'):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['ls', '-a', '-l', path_listed],
-            check_return=True, as_root=False, env={'TZ': 'utc'}),
-        self.EXAMPLE_LS_OUTPUT):
-      entries = self.device.StatDirectory(path_given)
-    return {f['filename']: f for f in entries}
-
-  def getListEntries(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['ls', '-a', '-l', '/'],
-            check_return=True, as_root=False, env={'TZ': 'utc'}),
-        self.EXAMPLE_LS_OUTPUT):
-      return self.device.ListDirectory('/')
-
-  def testStatDirectory_forceTrailingSlash(self):
-    self.getStatEntries(path_given='/foo/bar/', path_listed='/foo/bar/')
-    self.getStatEntries(path_given='/foo/bar', path_listed='/foo/bar/')
-
-  def testStatDirectory_fileList(self):
-    self.assertItemsEqual(self.getStatEntries().keys(), self.FILENAMES)
-    self.assertItemsEqual(self.getListEntries(), self.FILENAMES)
-
-  def testStatDirectory_fileModes(self):
-    expected_modes = (
-      ('some_dir', stat.S_ISDIR),
-      ('some_file', stat.S_ISREG),
-      ('lnk', stat.S_ISLNK),
-      ('a_socket1', stat.S_ISSOCK),
-      ('block_dev', stat.S_ISBLK),
-      ('random', stat.S_ISCHR),
-    )
-    entries = self.getStatEntries()
-    for filename, check in expected_modes:
-      self.assertTrue(check(entries[filename]['st_mode']))
-
-  def testStatDirectory_filePermissions(self):
-    should_have = (
-      ('some_file', stat.S_IWUSR),  # Owner can write.
-      ('tmp', stat.S_IXOTH),  # Others can execute.
-      ('tmp', stat.S_ISVTX),  # Has sticky bit.
-      ('my_cmd', stat.S_ISGID),  # Has set-group-ID bit.
-      ('silly', stat.S_ISUID),  # Has set UID bit.
-    )
-    should_not_have = (
-      ('some_file', stat.S_IWOTH),  # Others can't write.
-      ('block_dev', stat.S_IRGRP),  # Group can't read.
-      ('silly', stat.S_IXUSR),  # Owner can't execute.
-    )
-    entries = self.getStatEntries()
-    for filename, bit in should_have:
-      self.assertTrue(entries[filename]['st_mode'] & bit)
-    for filename, bit in should_not_have:
-      self.assertFalse(entries[filename]['st_mode'] & bit)
-
-  def testStatDirectory_numHardLinks(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['some_dir']['st_nlink'], 6)
-    self.assertEqual(entries['some_file']['st_nlink'], 1)
-    self.assertFalse('st_nlink' in entries['tmp'])
-
-  def testStatDirectory_fileOwners(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['some_dir']['st_owner'], 'root')
-    self.assertEqual(entries['my_cmd']['st_owner'], 'system')
-    self.assertEqual(entries['my_cmd']['st_group'], 'shell')
-    self.assertEqual(entries['tmp']['st_group'], 'misc')
-
-  def testStatDirectory_fileSize(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['some_file']['st_size'], 723)
-    self.assertEqual(entries['My Music File']['st_size'], 327)
-    # Sizes are sometimes not reported for non-regular files, don't try to
-    # guess the size in those cases.
-    self.assertFalse('st_size' in entries['some_dir'])
-
-  def testStatDirectory_fileDateTime(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['some_dir']['st_mtime'], 0)  # Epoch!
-    self.assertEqual(entries['My Music File']['st_mtime'], 1234567800)
-
-  def testStatDirectory_deviceType(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['random']['st_rdev_pair'], (10, 183))
-    self.assertEqual(entries['block_dev']['st_rdev_pair'], (7, 0))
-
-  def testStatDirectory_symbolicLinks(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['lnk']['symbolic_link_to'], '/some/path')
-    for d in entries.itervalues():
-      self.assertEqual('symbolic_link_to' in d, stat.S_ISLNK(d['st_mode']))
-
-
-class DeviceUtilsStatPathTest(DeviceUtilsTest):
-
-  EXAMPLE_DIRECTORY = [
-    {'filename': 'foo.txt', 'st_size': 123, 'st_time': 456},
-    {'filename': 'some_dir', 'st_time': 0}
-  ]
-  INDEX = {e['filename']: e for e in EXAMPLE_DIRECTORY}
-
-  def testStatPath_file(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      self.assertEquals(self.INDEX['foo.txt'],
-                        self.device.StatPath('/data/local/tmp/foo.txt'))
-
-  def testStatPath_directory(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      self.assertEquals(self.INDEX['some_dir'],
-                        self.device.StatPath('/data/local/tmp/some_dir'))
-
-  def testStatPath_directoryWithTrailingSlash(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      self.assertEquals(self.INDEX['some_dir'],
-                        self.device.StatPath('/data/local/tmp/some_dir/'))
-
-  def testStatPath_doesNotExist(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.StatPath('/data/local/tmp/does.not.exist.txt')
-
-
-class DeviceUtilsFileSizeTest(DeviceUtilsTest):
-
-  EXAMPLE_DIRECTORY = [
-    {'filename': 'foo.txt', 'st_size': 123, 'st_mtime': 456},
-    {'filename': 'some_dir', 'st_mtime': 0}
-  ]
-
-  def testFileSize_file(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      self.assertEquals(123,
-                        self.device.FileSize('/data/local/tmp/foo.txt'))
-
-  def testFileSize_doesNotExist(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.FileSize('/data/local/tmp/does.not.exist.txt')
-
-  def testFileSize_directoryWithNoSize(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.FileSize('/data/local/tmp/some_dir')
-
-
-class DeviceUtilsSetJavaAssertsTest(DeviceUtilsTest):
-
-  def testSetJavaAsserts_enable(self):
-    with self.assertCalls(
-        (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
-         'some.example.prop=with an example value\n'
-         'some.other.prop=value_ok\n'),
-        self.call.device.WriteFile(
-            self.device.LOCAL_PROPERTIES_PATH,
-            'some.example.prop=with an example value\n'
-            'some.other.prop=value_ok\n'
-            'dalvik.vm.enableassertions=all\n'),
-        (self.call.device.GetProp('dalvik.vm.enableassertions'), ''),
-        self.call.device.SetProp('dalvik.vm.enableassertions', 'all')):
-      self.assertTrue(self.device.SetJavaAsserts(True))
-
-  def testSetJavaAsserts_disable(self):
-    with self.assertCalls(
-        (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
-         'some.example.prop=with an example value\n'
-         'dalvik.vm.enableassertions=all\n'
-         'some.other.prop=value_ok\n'),
-        self.call.device.WriteFile(
-            self.device.LOCAL_PROPERTIES_PATH,
-            'some.example.prop=with an example value\n'
-            'some.other.prop=value_ok\n'),
-        (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all'),
-        self.call.device.SetProp('dalvik.vm.enableassertions', '')):
-      self.assertTrue(self.device.SetJavaAsserts(False))
-
-  def testSetJavaAsserts_alreadyEnabled(self):
-    with self.assertCalls(
-        (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
-         'some.example.prop=with an example value\n'
-         'dalvik.vm.enableassertions=all\n'
-         'some.other.prop=value_ok\n'),
-        (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all')):
-      self.assertFalse(self.device.SetJavaAsserts(True))
-
-  def testSetJavaAsserts_malformedLocalProp(self):
-    with self.assertCalls(
-        (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
-         'some.example.prop=with an example value\n'
-         'malformed_property\n'
-         'dalvik.vm.enableassertions=all\n'
-         'some.other.prop=value_ok\n'),
-        (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all')):
-      self.assertFalse(self.device.SetJavaAsserts(True))
-
-
-class DeviceUtilsEnsureCacheInitializedTest(DeviceUtilsTest):
-
-  def testEnsureCacheInitialized_noCache_success(self):
-    self.assertIsNone(self.device._cache['token'])
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            AnyStringWith('getprop'),
-            shell=True, check_return=True, large_output=True),
-        ['/sdcard', 'TOKEN']):
-      self.device._EnsureCacheInitialized()
-    self.assertIsNotNone(self.device._cache['token'])
-
-  def testEnsureCacheInitialized_noCache_failure(self):
-    self.assertIsNone(self.device._cache['token'])
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            AnyStringWith('getprop'),
-            shell=True, check_return=True, large_output=True),
-        self.TimeoutError()):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device._EnsureCacheInitialized()
-    self.assertIsNone(self.device._cache['token'])
-
-  def testEnsureCacheInitialized_cache(self):
-    self.device._cache['token'] = 'TOKEN'
-    with self.assertCalls():
-      self.device._EnsureCacheInitialized()
-    self.assertIsNotNone(self.device._cache['token'])
-
-
-class DeviceUtilsGetPropTest(DeviceUtilsTest):
-
-  def testGetProp_exists(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['getprop', 'test.property'], check_return=True, single_line=True,
-            timeout=self.device._default_timeout,
-            retries=self.device._default_retries),
-        'property_value'):
-      self.assertEqual('property_value',
-                       self.device.GetProp('test.property'))
-
-  def testGetProp_doesNotExist(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['getprop', 'property.does.not.exist'],
-            check_return=True, single_line=True,
-            timeout=self.device._default_timeout,
-            retries=self.device._default_retries),
-        ''):
-      self.assertEqual('', self.device.GetProp('property.does.not.exist'))
-
-  def testGetProp_cachedRoProp(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized(props=['[ro.build.type]: [userdebug]'])):
-      self.assertEqual('userdebug',
-                       self.device.GetProp('ro.build.type', cache=True))
-      self.assertEqual('userdebug',
-                       self.device.GetProp('ro.build.type', cache=True))
-
-
-class DeviceUtilsSetPropTest(DeviceUtilsTest):
-
-  def testSetProp(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['setprop', 'test.property', 'test value'], check_return=True)):
-      self.device.SetProp('test.property', 'test value')
-
-  def testSetProp_check_succeeds(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['setprop', 'test.property', 'new_value'], check_return=True)),
-        (self.call.device.GetProp('test.property', cache=False), 'new_value')):
-      self.device.SetProp('test.property', 'new_value', check=True)
-
-  def testSetProp_check_fails(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['setprop', 'test.property', 'new_value'], check_return=True)),
-        (self.call.device.GetProp('test.property', cache=False), 'old_value')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.SetProp('test.property', 'new_value', check=True)
-
-
-class DeviceUtilsGetPidsTest(DeviceUtilsTest):
-  def setUp(self):
-    super(DeviceUtilsGetPidsTest, self).setUp()
-    self.sample_output = [
-        'USER  PID     PPID  VSIZE RSS   WCHAN          PC  NAME',
-        'user  1001    100   1024  1024  ffffffff 00000000 one.match',
-        'user  1002    100   1024  1024  ffffffff 00000000 two.match',
-        'user  1003    100   1024  1024  ffffffff 00000000 three.match',
-        'user  1234    100   1024  1024  ffffffff 00000000 my$process',
-        'user  1000    100   1024  1024  ffffffff 00000000 foo',
-        'user  1236    100   1024  1024  ffffffff 00000000 foo',
-    ]
-
-  def _grepOutput(self, substring):
-    return [line for line in self.sample_output if substring in line]
-
-  def testGetPids_sdkGreaterThanNougatMR1(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=(version_codes.NOUGAT_MR1 + 1)):
-      with self.patch_call(self.call.device.build_id,
-                           return_value='ZZZ99Z'):
-        with self.assertCall(
-            self.call.device._RunPipedShellCommand(
-                'ps -e | grep -F example.process'), []):
-          self.device.GetPids('example.process')
-
-  def testGetPids_noMatches(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F does.not.match'),
-          self._grepOutput('does.not.match')):
-        self.assertEqual({}, self.device.GetPids('does.not.match'))
-
-  def testGetPids_oneMatch(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F one.match'),
-          self._grepOutput('one.match')):
-        self.assertEqual(
-            {'one.match': ['1001']},
-            self.device.GetPids('one.match'))
-
-  def testGetPids_multipleMatches(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F match'),
-          self._grepOutput('match')):
-        self.assertEqual(
-            {'one.match': ['1001'],
-             'two.match': ['1002'],
-             'three.match': ['1003']},
-            self.device.GetPids('match'))
-
-  def testGetPids_quotable(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand("ps | grep -F 'my$process'"),
-          self._grepOutput('my$process')):
-        self.assertEqual(
-            {'my$process': ['1234']}, self.device.GetPids('my$process'))
-
-  def testGetPids_multipleInstances(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F foo'),
-          self._grepOutput('foo')):
-        self.assertEqual(
-            {'foo': ['1000', '1236']},
-            self.device.GetPids('foo'))
-
-  def testGetPids_allProcesses(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device.RunShellCommand(
-              ['ps'], check_return=True, large_output=True),
-          self.sample_output):
-        self.assertEqual(
-            {'one.match': ['1001'],
-             'two.match': ['1002'],
-             'three.match': ['1003'],
-             'my$process': ['1234'],
-             'foo': ['1000', '1236']},
-            self.device.GetPids())
-
-  def testGetApplicationPids_notFound(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F match'),
-          self._grepOutput('match')):
-        # No PIDs found, process name should be exact match.
-        self.assertEqual([], self.device.GetApplicationPids('match'))
-
-  def testGetApplicationPids_foundOne(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F one.match'),
-          self._grepOutput('one.match')):
-        self.assertEqual(['1001'], self.device.GetApplicationPids('one.match'))
-
-  def testGetApplicationPids_foundMany(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F foo'),
-          self._grepOutput('foo')):
-        self.assertEqual(
-            ['1000', '1236'],
-            self.device.GetApplicationPids('foo'))
-
-  def testGetApplicationPids_atMostOneNotFound(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F match'),
-          self._grepOutput('match')):
-        # No PIDs found, process name should be exact match.
-        self.assertEqual(
-            None,
-            self.device.GetApplicationPids('match', at_most_one=True))
-
-  def testGetApplicationPids_atMostOneFound(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F one.match'),
-          self._grepOutput('one.match')):
-        self.assertEqual(
-            '1001',
-            self.device.GetApplicationPids('one.match', at_most_one=True))
-
-  def testGetApplicationPids_atMostOneFoundTooMany(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertRaises(device_errors.CommandFailedError):
-        with self.assertCall(
-            self.call.device._RunPipedShellCommand('ps | grep -F foo'),
-            self._grepOutput('foo')):
-          self.device.GetApplicationPids('foo', at_most_one=True)
-
-
-class DeviceUtilsGetSetEnforce(DeviceUtilsTest):
-
-  def testGetEnforce_Enforcing(self):
-    with self.assertCall(self.call.adb.Shell('getenforce'), 'Enforcing'):
-      self.assertEqual(True, self.device.GetEnforce())
-
-  def testGetEnforce_Permissive(self):
-    with self.assertCall(self.call.adb.Shell('getenforce'), 'Permissive'):
-      self.assertEqual(False, self.device.GetEnforce())
-
-  def testGetEnforce_Disabled(self):
-    with self.assertCall(self.call.adb.Shell('getenforce'), 'Disabled'):
-      self.assertEqual(None, self.device.GetEnforce())
-
-  def testSetEnforce_Enforcing(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), False),
-        (self.call.adb.Shell('setenforce 1'), '')):
-      self.device.SetEnforce(enabled=True)
-
-  def testSetEnforce_Permissive(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), False),
-        (self.call.adb.Shell('setenforce 0'), '')):
-      self.device.SetEnforce(enabled=False)
-
-  def testSetEnforce_EnforcingWithInt(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), False),
-        (self.call.adb.Shell('setenforce 1'), '')):
-      self.device.SetEnforce(enabled=1)
-
-  def testSetEnforce_PermissiveWithInt(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), False),
-        (self.call.adb.Shell('setenforce 0'), '')):
-      self.device.SetEnforce(enabled=0)
-
-  def testSetEnforce_EnforcingWithStr(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), False),
-        (self.call.adb.Shell('setenforce 1'), '')):
-      self.device.SetEnforce(enabled='1')
-
-  def testSetEnforce_PermissiveWithStr(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), False),
-        (self.call.adb.Shell('setenforce 0'), '')):
-      self.device.SetEnforce(enabled='0')  # Not recommended but it works!
-
-
-class DeviceUtilsTakeScreenshotTest(DeviceUtilsTest):
-
-  def testTakeScreenshot_fileNameProvided(self):
-    with self.assertCalls(
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(
-            self.adb, suffix='.png'),
-         MockTempFile('/tmp/path/temp-123.png')),
-        (self.call.adb.Shell('/system/bin/screencap -p /tmp/path/temp-123.png'),
-         ''),
-        self.call.device.PullFile('/tmp/path/temp-123.png',
-                                  '/test/host/screenshot.png')):
-      self.device.TakeScreenshot('/test/host/screenshot.png')
-
-
-class DeviceUtilsGetMemoryUsageForPidTest(DeviceUtilsTest):
-
-  def setUp(self):
-    super(DeviceUtilsGetMemoryUsageForPidTest, self).setUp()
-
-  def testGetMemoryUsageForPid_validPid(self):
-    with self.assertCalls(
-        (self.call.device._RunPipedShellCommand(
-            'showmap 1234 | grep TOTAL', as_root=True),
-         ['100 101 102 103 104 105 106 107 TOTAL']),
-        (self.call.device.ReadFile('/proc/1234/status', as_root=True),
-         'VmHWM: 1024 kB\n')):
-      self.assertEqual(
-          {
-            'Size': 100,
-            'Rss': 101,
-            'Pss': 102,
-            'Shared_Clean': 103,
-            'Shared_Dirty': 104,
-            'Private_Clean': 105,
-            'Private_Dirty': 106,
-            'VmHWM': 1024
-          },
-          self.device.GetMemoryUsageForPid(1234))
-
-  def testGetMemoryUsageForPid_noSmaps(self):
-    with self.assertCalls(
-        (self.call.device._RunPipedShellCommand(
-            'showmap 4321 | grep TOTAL', as_root=True),
-         ['cannot open /proc/4321/smaps: No such file or directory']),
-        (self.call.device.ReadFile('/proc/4321/status', as_root=True),
-         'VmHWM: 1024 kb\n')):
-      self.assertEquals({'VmHWM': 1024}, self.device.GetMemoryUsageForPid(4321))
-
-  def testGetMemoryUsageForPid_noStatus(self):
-    with self.assertCalls(
-        (self.call.device._RunPipedShellCommand(
-            'showmap 4321 | grep TOTAL', as_root=True),
-         ['100 101 102 103 104 105 106 107 TOTAL']),
-        (self.call.device.ReadFile('/proc/4321/status', as_root=True),
-         self.CommandError())):
-      self.assertEquals(
-          {
-            'Size': 100,
-            'Rss': 101,
-            'Pss': 102,
-            'Shared_Clean': 103,
-            'Shared_Dirty': 104,
-            'Private_Clean': 105,
-            'Private_Dirty': 106,
-          },
-          self.device.GetMemoryUsageForPid(4321))
-
-
-class DeviceUtilsDismissCrashDialogIfNeededTest(DeviceUtilsTest):
-
-  def testDismissCrashDialogIfNeeded_crashedPageckageNotFound(self):
-    sample_dumpsys_output = '''
-WINDOW MANAGER WINDOWS (dumpsys window windows)
-  Window #11 Window{f8b647a u0 SearchPanel}:
-    mDisplayId=0 mSession=Session{8 94:122} mClient=android.os.BinderProxy@1ba5
-    mOwnerUid=100 mShowToOwnerOnly=false package=com.android.systemui appop=NONE
-    mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2024 fl=100
-    Requested w=1080 h=1920 mLayoutSeq=426
-    mBaseLayer=211000 mSubLayer=0 mAnimLayer=211000+0=211000 mLastLayer=211000
-'''
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), sample_dumpsys_output.split('\n'))):
-      package_name = self.device.DismissCrashDialogIfNeeded()
-      self.assertIsNone(package_name)
-
-  def testDismissCrashDialogIfNeeded_crashedPageckageFound(self):
-    sample_dumpsys_output = '''
-WINDOW MANAGER WINDOWS (dumpsys window windows)
-  Window #11 Window{f8b647a u0 SearchPanel}:
-    mDisplayId=0 mSession=Session{8 94:122} mClient=android.os.BinderProxy@1ba5
-    mOwnerUid=102 mShowToOwnerOnly=false package=com.android.systemui appop=NONE
-    mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2024 fl=100
-    Requested w=1080 h=1920 mLayoutSeq=426
-    mBaseLayer=211000 mSubLayer=0 mAnimLayer=211000+0=211000 mLastLayer=211000
-  mHasPermanentDpad=false
-  mCurrentFocus=Window{3a27740f u0 Application Error: com.android.chrome}
-  mFocusedApp=AppWindowToken{470af6f token=Token{272ec24e ActivityRecord{t894}}}
-'''
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), sample_dumpsys_output.split('\n')),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '22'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '22'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '66'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), [])):
-      package_name = self.device.DismissCrashDialogIfNeeded()
-      self.assertEqual(package_name, 'com.android.chrome')
-
-
-class DeviceUtilsClientCache(DeviceUtilsTest):
-
-  def testClientCache_twoCaches(self):
-    self.device._cache['test'] = 0
-    client_cache_one = self.device.GetClientCache('ClientOne')
-    client_cache_one['test'] = 1
-    client_cache_two = self.device.GetClientCache('ClientTwo')
-    client_cache_two['test'] = 2
-    self.assertEqual(self.device._cache['test'], 0)
-    self.assertEqual(client_cache_one, {'test': 1})
-    self.assertEqual(client_cache_two, {'test': 2})
-    self.device._ClearCache()
-    self.assertTrue('test' not in self.device._cache)
-    self.assertEqual(client_cache_one, {})
-    self.assertEqual(client_cache_two, {})
-
-  def testClientCache_multipleInstances(self):
-    client_cache_one = self.device.GetClientCache('ClientOne')
-    client_cache_one['test'] = 1
-    client_cache_two = self.device.GetClientCache('ClientOne')
-    self.assertEqual(client_cache_one, {'test': 1})
-    self.assertEqual(client_cache_two, {'test': 1})
-    self.device._ClearCache()
-    self.assertEqual(client_cache_one, {})
-    self.assertEqual(client_cache_two, {})
-
-
-class DeviceUtilsHealthyDevicesTest(mock_calls.TestCase):
-
-  def testHealthyDevices_emptyBlacklist_defaultDeviceArg(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      blacklist = mock.NonCallableMock(**{'Read.return_value': []})
-      devices = device_utils.DeviceUtils.HealthyDevices(blacklist)
-    for serial, device in zip(test_serials, devices):
-      self.assertTrue(isinstance(device, device_utils.DeviceUtils))
-      self.assertEquals(serial, device.adb.GetDeviceSerial())
-
-  def testHealthyDevices_blacklist_defaultDeviceArg(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      blacklist = mock.NonCallableMock(
-          **{'Read.return_value': ['fedcba9876543210']})
-      devices = device_utils.DeviceUtils.HealthyDevices(blacklist)
-    self.assertEquals(1, len(devices))
-    self.assertTrue(isinstance(devices[0], device_utils.DeviceUtils))
-    self.assertEquals('0123456789abcdef', devices[0].adb.GetDeviceSerial())
-
-  def testHealthyDevices_noneDeviceArg_multiple_attached(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials]),
-        (mock.call.devil.android.device_errors.MultipleDevicesError(mock.ANY),
-         _MockMultipleDevicesError())):
-      with self.assertRaises(_MockMultipleDevicesError):
-        device_utils.DeviceUtils.HealthyDevices(device_arg=None)
-
-  def testHealthyDevices_noneDeviceArg_one_attached(self):
-    test_serials = ['0123456789abcdef']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      devices = device_utils.DeviceUtils.HealthyDevices(device_arg=None)
-    self.assertEquals(1, len(devices))
-
-  def testHealthyDevices_noneDeviceArg_no_attached(self):
-    test_serials = []
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      with self.assertRaises(device_errors.NoDevicesError):
-        device_utils.DeviceUtils.HealthyDevices(device_arg=None)
-
-  def testHealthyDevices_noneDeviceArg_multiple_attached_ANDROID_SERIAL(self):
-    try:
-      os.environ['ANDROID_SERIAL'] = '0123456789abcdef'
-      with self.assertCalls():  # Should skip adb devices when device is known.
-        device_utils.DeviceUtils.HealthyDevices(device_arg=None)
-    finally:
-      del os.environ['ANDROID_SERIAL']
-
-  def testHealthyDevices_stringDeviceArg(self):
-    with self.assertCalls():  # Should skip adb devices when device is known.
-      devices = device_utils.DeviceUtils.HealthyDevices(
-          device_arg='0123456789abcdef')
-    self.assertEquals(1, len(devices))
-
-  def testHealthyDevices_EmptyListDeviceArg_multiple_attached(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      devices = device_utils.DeviceUtils.HealthyDevices(device_arg=())
-    self.assertEquals(2, len(devices))
-
-  def testHealthyDevices_EmptyListDeviceArg_ANDROID_SERIAL(self):
-    try:
-      os.environ['ANDROID_SERIAL'] = '0123456789abcdef'
-      with self.assertCalls():  # Should skip adb devices when device is known.
-        devices = device_utils.DeviceUtils.HealthyDevices(device_arg=())
-    finally:
-      del os.environ['ANDROID_SERIAL']
-    self.assertEquals(1, len(devices))
-
-  def testHealthyDevices_EmptyListDeviceArg_no_attached(self):
-    test_serials = []
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      with self.assertRaises(device_errors.NoDevicesError):
-        device_utils.DeviceUtils.HealthyDevices(device_arg=[])
-
-  def testHealthyDevices_ListDeviceArg(self):
-    device_arg = ['0123456789abcdef', 'fedcba9876543210']
-    try:
-      os.environ['ANDROID_SERIAL'] = 'should-not-apply'
-      with self.assertCalls():  # Should skip adb devices when device is known.
-        devices = device_utils.DeviceUtils.HealthyDevices(device_arg=device_arg)
-    finally:
-      del os.environ['ANDROID_SERIAL']
-    self.assertEquals(2, len(devices))
-
-
-class DeviceUtilsRestartAdbdTest(DeviceUtilsTest):
-
-  def testAdbdRestart(self):
-    mock_temp_file = '/sdcard/temp-123.sh'
-    with self.assertCalls(
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(
-            self.adb, suffix='.sh'), MockTempFile(mock_temp_file)),
-        self.call.device.WriteFile(mock.ANY, mock.ANY),
-        (self.call.device.RunShellCommand(
-            ['source', mock_temp_file], check_return=True, as_root=True)),
-        self.call.adb.WaitForDevice()):
-      self.device.RestartAdbd()
-
-
-class DeviceUtilsGrantPermissionsTest(DeviceUtilsTest):
-
-  def testGrantPermissions_none(self):
-    self.device.GrantPermissions('package', [])
-
-  def testGrantPermissions_underM(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      self.device.GrantPermissions('package', ['p1'])
-
-  def testGrantPermissions_one(self):
-    permissions_cmd = 'pm grant package p1'
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.MARSHMALLOW):
-      with self.assertCalls(
-          (self.call.device.RunShellCommand(
-              permissions_cmd, shell=True, check_return=True), [])):
-        self.device.GrantPermissions('package', ['p1'])
-
-  def testGrantPermissions_multiple(self):
-    permissions_cmd = 'pm grant package p1&&pm grant package p2'
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.MARSHMALLOW):
-      with self.assertCalls(
-          (self.call.device.RunShellCommand(
-              permissions_cmd, shell=True, check_return=True), [])):
-        self.device.GrantPermissions('package', ['p1', 'p2'])
-
-  def testGrantPermissions_WriteExtrnalStorage(self):
-    permissions_cmd = (
-        'pm grant package android.permission.WRITE_EXTERNAL_STORAGE&&'
-        'pm grant package android.permission.READ_EXTERNAL_STORAGE')
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.MARSHMALLOW):
-      with self.assertCalls(
-          (self.call.device.RunShellCommand(
-              permissions_cmd, shell=True, check_return=True), [])):
-        self.device.GrantPermissions(
-            'package', ['android.permission.WRITE_EXTERNAL_STORAGE'])
-
-  def testGrantPermissions_BlackList(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.MARSHMALLOW):
-      self.device.GrantPermissions(
-          'package', ['android.permission.ACCESS_MOCK_LOCATION'])
-
-
-class DeviecUtilsIsScreenOn(DeviceUtilsTest):
-
-  _L_SCREEN_ON = ['test=test mInteractive=true']
-  _K_SCREEN_ON = ['test=test mScreenOn=true']
-  _L_SCREEN_OFF = ['mInteractive=false']
-  _K_SCREEN_OFF = ['mScreenOn=false']
-
-  def testIsScreenOn_onPreL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.KITKAT):
-      with self.assertCalls(
-          (self.call.device._RunPipedShellCommand(
-              'dumpsys input_method | grep mScreenOn'), self._K_SCREEN_ON)):
-        self.assertTrue(self.device.IsScreenOn())
-
-  def testIsScreenOn_onL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCalls(
-          (self.call.device._RunPipedShellCommand(
-              'dumpsys input_method | grep mInteractive'), self._L_SCREEN_ON)):
-        self.assertTrue(self.device.IsScreenOn())
-
-  def testIsScreenOn_offPreL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.KITKAT):
-      with self.assertCalls(
-          (self.call.device._RunPipedShellCommand(
-              'dumpsys input_method | grep mScreenOn'), self._K_SCREEN_OFF)):
-        self.assertFalse(self.device.IsScreenOn())
-
-  def testIsScreenOn_offL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCalls(
-          (self.call.device._RunPipedShellCommand(
-              'dumpsys input_method | grep mInteractive'), self._L_SCREEN_OFF)):
-        self.assertFalse(self.device.IsScreenOn())
-
-  def testIsScreenOn_noOutput(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCalls(
-          (self.call.device._RunPipedShellCommand(
-              'dumpsys input_method | grep mInteractive'), [])):
-        with self.assertRaises(device_errors.CommandFailedError):
-          self.device.IsScreenOn()
-
-
-class DeviecUtilsSetScreen(DeviceUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetScren_alreadySet(self):
-    with self.assertCalls(
-        (self.call.device.IsScreenOn(), False)):
-      self.device.SetScreen(False)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetScreen_on(self):
-    with self.assertCalls(
-        (self.call.device.IsScreenOn(), False),
-        (self.call.device.SendKeyEvent(keyevent.KEYCODE_POWER), None),
-        (self.call.device.IsScreenOn(), True)):
-      self.device.SetScreen(True)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetScreen_off(self):
-    with self.assertCalls(
-        (self.call.device.IsScreenOn(), True),
-        (self.call.device.SendKeyEvent(keyevent.KEYCODE_POWER), None),
-        (self.call.device.IsScreenOn(), False)):
-      self.device.SetScreen(False)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetScreen_slow(self):
-    with self.assertCalls(
-        (self.call.device.IsScreenOn(), True),
-        (self.call.device.SendKeyEvent(keyevent.KEYCODE_POWER), None),
-        (self.call.device.IsScreenOn(), True),
-        (self.call.device.IsScreenOn(), True),
-        (self.call.device.IsScreenOn(), False)):
-      self.device.SetScreen(False)
-
-class DeviecUtilsLoadCacheData(DeviceUtilsTest):
-
-  def testTokenMissing(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized()):
-      self.assertFalse(self.device.LoadCacheData('{}'))
-
-  def testTokenStale(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized()):
-      self.assertFalse(self.device.LoadCacheData('{"token":"foo"}'))
-
-  def testTokenMatches(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized()):
-      self.assertTrue(self.device.LoadCacheData('{"token":"TOKEN"}'))
-
-  def testDumpThenLoad(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized()):
-      data = json.loads(self.device.DumpCacheData())
-      data['token'] = 'TOKEN'
-      self.assertTrue(self.device.LoadCacheData(json.dumps(data)))
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/android/fastboot_utils.py b/third_party/catapult/devil/devil/android/fastboot_utils.py
deleted file mode 100644
index 3bd3ee8..0000000
--- a/third_party/catapult/devil/devil/android/fastboot_utils.py
+++ /dev/null
@@ -1,256 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Provides a variety of device interactions based on fastboot."""
-# pylint: disable=unused-argument
-
-import collections
-import contextlib
-import fnmatch
-import logging
-import os
-import re
-
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android.sdk import fastboot
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-_FASTBOOT_REBOOT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
-_KNOWN_PARTITIONS = collections.OrderedDict([
-      ('bootloader', {'image': 'bootloader*.img', 'restart': True}),
-      ('radio', {'image': 'radio*.img', 'restart': True}),
-      ('boot', {'image': 'boot.img'}),
-      ('recovery', {'image': 'recovery.img'}),
-      ('system', {'image': 'system.img'}),
-      ('userdata', {'image': 'userdata.img', 'wipe_only': True}),
-      ('cache', {'image': 'cache.img', 'wipe_only': True}),
-      ('vendor', {'image': 'vendor*.img', 'optional': True}),
-  ])
-ALL_PARTITIONS = _KNOWN_PARTITIONS.keys()
-
-
-def _FindAndVerifyPartitionsAndImages(partitions, directory):
-  """Validate partitions and images.
-
-  Validate all partition names and partition directories. Cannot stop mid
-  flash so its important to validate everything first.
-
-  Args:
-    Partitions: partitions to be tested.
-    directory: directory containing the images.
-
-  Returns:
-    Dictionary with exact partition, image name mapping.
-  """
-
-  files = os.listdir(directory)
-  return_dict = collections.OrderedDict()
-
-  def find_file(pattern):
-    for filename in files:
-      if fnmatch.fnmatch(filename, pattern):
-        return os.path.join(directory, filename)
-    return None
-  for partition in partitions:
-    partition_info = _KNOWN_PARTITIONS[partition]
-    image_file = find_file(partition_info['image'])
-    if image_file:
-      return_dict[partition] = image_file
-    elif not partition_info.get('optional'):
-      raise device_errors.FastbootCommandFailedError(
-          'Failed to flash device. Could not find image for %s.',
-          partition_info['image'])
-  return return_dict
-
-
-class FastbootUtils(object):
-
-  _FASTBOOT_WAIT_TIME = 1
-  _BOARD_VERIFICATION_FILE = 'android-info.txt'
-
-  def __init__(self, device, fastbooter=None, default_timeout=_DEFAULT_TIMEOUT,
-               default_retries=_DEFAULT_RETRIES):
-    """FastbootUtils constructor.
-
-    Example Usage to flash a device:
-      fastboot = fastboot_utils.FastbootUtils(device)
-      fastboot.FlashDevice('/path/to/build/directory')
-
-    Args:
-      device: A DeviceUtils instance.
-      fastbooter: Optional fastboot object. If none is passed, one will
-        be created.
-      default_timeout: An integer containing the default number of seconds to
-        wait for an operation to complete if no explicit value is provided.
-      default_retries: An integer containing the default number or times an
-        operation should be retried on failure if no explicit value is provided.
-    """
-    self._device = device
-    self._board = device.product_board
-    self._serial = str(device)
-    self._default_timeout = default_timeout
-    self._default_retries = default_retries
-    if fastbooter:
-      self.fastboot = fastbooter
-    else:
-      self.fastboot = fastboot.Fastboot(self._serial)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def WaitForFastbootMode(self, timeout=None, retries=None):
-    """Wait for device to boot into fastboot mode.
-
-    This waits for the device serial to show up in fastboot devices output.
-    """
-    def fastboot_mode():
-      return self._serial in self.fastboot.Devices()
-
-    timeout_retry.WaitFor(fastboot_mode, wait_period=self._FASTBOOT_WAIT_TIME)
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT)
-  def EnableFastbootMode(self, timeout=None, retries=None):
-    """Reboots phone into fastboot mode.
-
-    Roots phone if needed, then reboots phone into fastboot mode and waits.
-    """
-    self._device.EnableRoot()
-    self._device.adb.Reboot(to_bootloader=True)
-    self.WaitForFastbootMode()
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT)
-  def Reboot(
-      self, bootloader=False, wait_for_reboot=True, timeout=None, retries=None):
-    """Reboots out of fastboot mode.
-
-    It reboots the phone either back into fastboot, or to a regular boot. It
-    then blocks until the device is ready.
-
-    Args:
-      bootloader: If set to True, reboots back into bootloader.
-    """
-    if bootloader:
-      self.fastboot.RebootBootloader()
-      self.WaitForFastbootMode()
-    else:
-      self.fastboot.Reboot()
-      if wait_for_reboot:
-        self._device.WaitUntilFullyBooted(timeout=_FASTBOOT_REBOOT_TIMEOUT)
-
-  def _VerifyBoard(self, directory):
-    """Validate as best as possible that the android build matches the device.
-
-    Goes through build files and checks if the board name is mentioned in the
-    |self._BOARD_VERIFICATION_FILE| or in the build archive.
-
-    Args:
-      directory: directory where build files are located.
-    """
-    files = os.listdir(directory)
-    board_regex = re.compile(r'require board=(\w+)')
-    if self._BOARD_VERIFICATION_FILE in files:
-      with open(os.path.join(directory, self._BOARD_VERIFICATION_FILE)) as f:
-        for line in f:
-          m = board_regex.match(line)
-          if m:
-            board_name = m.group(1)
-            if board_name == self._board:
-              return True
-            elif board_name:
-              return False
-            else:
-              logger.warning('No board type found in %s.',
-                             self._BOARD_VERIFICATION_FILE)
-    else:
-      logger.warning('%s not found. Unable to use it to verify device.',
-                     self._BOARD_VERIFICATION_FILE)
-
-    zip_regex = re.compile(r'.*%s.*\.zip' % re.escape(self._board))
-    for f in files:
-      if zip_regex.match(f):
-        return True
-
-    return False
-
-  def _FlashPartitions(self, partitions, directory, wipe=False, force=False):
-    """Flashes all given partiitons with all given images.
-
-    Args:
-      partitions: List of partitions to flash.
-      directory: Directory where all partitions can be found.
-      wipe: If set to true, will automatically detect if cache and userdata
-          partitions are sent, and if so ignore them.
-      force: boolean to decide to ignore board name safety checks.
-
-    Raises:
-      device_errors.CommandFailedError(): If image cannot be found or if bad
-          partition name is give.
-    """
-    if not self._VerifyBoard(directory):
-      if force:
-        logger.warning('Could not verify build is meant to be installed on '
-                       'the current device type, but force flag is set. '
-                       'Flashing device. Possibly dangerous operation.')
-      else:
-        raise device_errors.CommandFailedError(
-            'Could not verify build is meant to be installed on the current '
-            'device type. Run again with force=True to force flashing with an '
-            'unverified board.')
-
-    flash_image_files = _FindAndVerifyPartitionsAndImages(partitions, directory)
-    partitions = flash_image_files.keys()
-    for partition in partitions:
-      if _KNOWN_PARTITIONS[partition].get('wipe_only') and not wipe:
-        logger.info(
-            'Not flashing in wipe mode. Skipping partition %s.', partition)
-      else:
-        logger.info(
-            'Flashing %s with %s', partition, flash_image_files[partition])
-        self.fastboot.Flash(partition, flash_image_files[partition])
-        if _KNOWN_PARTITIONS[partition].get('restart', False):
-          self.Reboot(bootloader=True)
-
-  @contextlib.contextmanager
-  def FastbootMode(self, wait_for_reboot=True, timeout=None, retries=None):
-    """Context manager that enables fastboot mode, and reboots after.
-
-    Example usage:
-      with FastbootMode():
-        Flash Device
-      # Anything that runs after flashing.
-    """
-    self.EnableFastbootMode()
-    self.fastboot.SetOemOffModeCharge(False)
-    try:
-      yield self
-    finally:
-      self.fastboot.SetOemOffModeCharge(True)
-      self.Reboot(wait_for_reboot=wait_for_reboot)
-
-  def FlashDevice(self, directory, partitions=None, wipe=False):
-    """Flash device with build in |directory|.
-
-    Directory must contain bootloader, radio, boot, recovery, system, userdata,
-    and cache .img files from an android build. This is a dangerous operation so
-    use with care.
-
-    Args:
-      fastboot: A FastbootUtils instance.
-      directory: Directory with build files.
-      wipe: Wipes cache and userdata if set to true.
-      partitions: List of partitions to flash. Defaults to all.
-    """
-    if partitions is None:
-      partitions = ALL_PARTITIONS
-    # If a device is wiped, then it will no longer have adb keys so it cannot be
-    # communicated with to verify that it is rebooted. It is up to the user of
-    # this script to ensure that the adb keys are set on the device after using
-    # this to wipe a device.
-    with self.FastbootMode(wait_for_reboot=not wipe):
-      self._FlashPartitions(partitions, directory, wipe=wipe)
diff --git a/third_party/catapult/devil/devil/android/fastboot_utils_test.py b/third_party/catapult/devil/devil/android/fastboot_utils_test.py
deleted file mode 100755
index 0562974..0000000
--- a/third_party/catapult/devil/devil/android/fastboot_utils_test.py
+++ /dev/null
@@ -1,375 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-"""
-Unit tests for the contents of fastboot_utils.py
-"""
-
-# pylint: disable=protected-access,unused-argument
-
-import collections
-import io
-import logging
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android import fastboot_utils
-from devil.android.sdk import fastboot
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-_BOARD = 'board_type'
-_SERIAL = '0123456789abcdef'
-_PARTITIONS = [
-    'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata', 'cache']
-_IMAGES = collections.OrderedDict([
-    ('bootloader', 'bootloader.img'),
-    ('radio', 'radio.img'),
-    ('boot', 'boot.img'),
-    ('recovery', 'recovery.img'),
-    ('system', 'system.img'),
-    ('userdata', 'userdata.img'),
-    ('cache', 'cache.img')
-])
-_VALID_FILES = [_BOARD + '.zip', 'android-info.txt']
-_INVALID_FILES = ['test.zip', 'android-info.txt']
-
-
-class MockFile(object):
-
-  def __init__(self, name='/tmp/some/file'):
-    self.file = mock.MagicMock(spec=file)
-    self.file.name = name
-
-  def __enter__(self):
-    return self.file
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    pass
-
-  @property
-  def name(self):
-    return self.file.name
-
-
-def _FastbootWrapperMock(test_serial):
-  fastbooter = mock.Mock(spec=fastboot.Fastboot)
-  fastbooter.__str__ = mock.Mock(return_value=test_serial)
-  fastbooter.Devices.return_value = [test_serial]
-  return fastbooter
-
-
-def _DeviceUtilsMock(test_serial):
-  device = mock.Mock(spec=device_utils.DeviceUtils)
-  device.__str__ = mock.Mock(return_value=test_serial)
-  device.product_board = mock.Mock(return_value=_BOARD)
-  device.adb = mock.Mock()
-  return device
-
-
-class FastbootUtilsTest(mock_calls.TestCase):
-
-  def setUp(self):
-    self.device_utils_mock = _DeviceUtilsMock(_SERIAL)
-    self.fastboot_wrapper = _FastbootWrapperMock(_SERIAL)
-    self.fastboot = fastboot_utils.FastbootUtils(
-        self.device_utils_mock, fastbooter=self.fastboot_wrapper,
-        default_timeout=2, default_retries=0)
-    self.fastboot._board = _BOARD
-
-
-class FastbootUtilsInitTest(FastbootUtilsTest):
-
-  def testInitWithDeviceUtil(self):
-    f = fastboot_utils.FastbootUtils(self.device_utils_mock)
-    self.assertEqual(str(self.device_utils_mock), str(f._device))
-
-  def testInitWithMissing_fails(self):
-    with self.assertRaises(AttributeError):
-      fastboot_utils.FastbootUtils(None)
-    with self.assertRaises(AttributeError):
-      fastboot_utils.FastbootUtils('')
-
-  def testPartitionOrdering(self):
-    parts = ['bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-             'cache', 'vendor']
-    self.assertListEqual(fastboot_utils.ALL_PARTITIONS, parts)
-
-
-class FastbootUtilsWaitForFastbootMode(FastbootUtilsTest):
-
-  # If this test fails by timing out after 1 second.
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitForFastbootMode(self):
-    self.fastboot.WaitForFastbootMode()
-
-
-class FastbootUtilsEnableFastbootMode(FastbootUtilsTest):
-
-  def testEnableFastbootMode(self):
-    with self.assertCalls(
-        self.call.fastboot._device.EnableRoot(),
-        self.call.fastboot._device.adb.Reboot(to_bootloader=True),
-        self.call.fastboot.WaitForFastbootMode()):
-      self.fastboot.EnableFastbootMode()
-
-
-class FastbootUtilsReboot(FastbootUtilsTest):
-
-  def testReboot_bootloader(self):
-    with self.assertCalls(
-        self.call.fastboot.fastboot.RebootBootloader(),
-        self.call.fastboot.WaitForFastbootMode()):
-      self.fastboot.Reboot(bootloader=True)
-
-  def testReboot_normal(self):
-    with self.assertCalls(
-        self.call.fastboot.fastboot.Reboot(),
-        self.call.fastboot._device.WaitUntilFullyBooted(timeout=mock.ANY)):
-      self.fastboot.Reboot()
-
-
-class FastbootUtilsFlashPartitions(FastbootUtilsTest):
-
-  def testFlashPartitions_wipe(self):
-    with self.assertCalls(
-        (self.call.fastboot._VerifyBoard('test'), True),
-        (mock.call.devil.android.fastboot_utils.
-            _FindAndVerifyPartitionsAndImages(_PARTITIONS, 'test'), _IMAGES),
-        (self.call.fastboot.fastboot.Flash('bootloader', 'bootloader.img')),
-        (self.call.fastboot.Reboot(bootloader=True)),
-        (self.call.fastboot.fastboot.Flash('radio', 'radio.img')),
-        (self.call.fastboot.Reboot(bootloader=True)),
-        (self.call.fastboot.fastboot.Flash('boot', 'boot.img')),
-        (self.call.fastboot.fastboot.Flash('recovery', 'recovery.img')),
-        (self.call.fastboot.fastboot.Flash('system', 'system.img')),
-        (self.call.fastboot.fastboot.Flash('userdata', 'userdata.img')),
-        (self.call.fastboot.fastboot.Flash('cache', 'cache.img'))):
-      self.fastboot._FlashPartitions(_PARTITIONS, 'test', wipe=True)
-
-  def testFlashPartitions_noWipe(self):
-    with self.assertCalls(
-        (self.call.fastboot._VerifyBoard('test'), True),
-        (mock.call.devil.android.fastboot_utils.
-            _FindAndVerifyPartitionsAndImages(_PARTITIONS, 'test'), _IMAGES),
-        (self.call.fastboot.fastboot.Flash('bootloader', 'bootloader.img')),
-        (self.call.fastboot.Reboot(bootloader=True)),
-        (self.call.fastboot.fastboot.Flash('radio', 'radio.img')),
-        (self.call.fastboot.Reboot(bootloader=True)),
-        (self.call.fastboot.fastboot.Flash('boot', 'boot.img')),
-        (self.call.fastboot.fastboot.Flash('recovery', 'recovery.img')),
-        (self.call.fastboot.fastboot.Flash('system', 'system.img'))):
-      self.fastboot._FlashPartitions(_PARTITIONS, 'test')
-
-
-class FastbootUtilsFastbootMode(FastbootUtilsTest):
-
-  def testFastbootMode_goodWait(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=True)):
-      with self.fastboot.FastbootMode() as fbm:
-        self.assertEqual(self.fastboot, fbm)
-
-  def testFastbootMode_goodNoWait(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=False)):
-      with self.fastboot.FastbootMode(wait_for_reboot=False) as fbm:
-        self.assertEqual(self.fastboot, fbm)
-
-  def testFastbootMode_exception(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=True)):
-      with self.assertRaises(NotImplementedError):
-        with self.fastboot.FastbootMode() as fbm:
-          self.assertEqual(self.fastboot, fbm)
-          raise NotImplementedError
-
-  def testFastbootMode_exceptionInEnableFastboot(self):
-    self.fastboot.EnableFastbootMode = mock.Mock()
-    self.fastboot.EnableFastbootMode.side_effect = NotImplementedError
-    with self.assertRaises(NotImplementedError):
-      with self.fastboot.FastbootMode():
-        pass
-
-
-class FastbootUtilsVerifyBoard(FastbootUtilsTest):
-
-  def testVerifyBoard_bothValid(self):
-    mock_file = io.StringIO(u'require board=%s\n' % _BOARD)
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_VALID_FILES):
-        self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_BothNotValid(self):
-    mock_file = io.StringIO(u'abc')
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_INVALID_FILES):
-        self.assertFalse(self.assertFalse(self.fastboot._VerifyBoard('test')))
-
-  def testVerifyBoard_FileNotFoundZipValid(self):
-    with mock.patch('os.listdir', return_value=[_BOARD + '.zip']):
-      self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_ZipNotFoundFileValid(self):
-    mock_file = io.StringIO(u'require board=%s\n' % _BOARD)
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=['android-info.txt']):
-        self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_zipNotValidFileIs(self):
-    mock_file = io.StringIO(u'require board=%s\n' % _BOARD)
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_INVALID_FILES):
-        self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_fileNotValidZipIs(self):
-    mock_file = io.StringIO(u'require board=WrongBoard')
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_VALID_FILES):
-        self.assertFalse(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_noBoardInFileValidZip(self):
-    mock_file = io.StringIO(u'Regex wont match')
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_VALID_FILES):
-        self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_noBoardInFileInvalidZip(self):
-    mock_file = io.StringIO(u'Regex wont match')
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_INVALID_FILES):
-        self.assertFalse(self.fastboot._VerifyBoard('test'))
-
-
-class FastbootUtilsFindAndVerifyPartitionsAndImages(FastbootUtilsTest):
-
-  def testFindAndVerifyPartitionsAndImages_validNoVendor(self):
-    PARTITIONS = [
-        'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-        'cache', 'vendor'
-    ]
-    files = [
-        'bootloader-test-.img',
-        'radio123.img',
-        'boot.img',
-        'recovery.img',
-        'system.img',
-        'userdata.img',
-        'cache.img'
-    ]
-    img_check = collections.OrderedDict([
-      ('bootloader', 'test/bootloader-test-.img'),
-      ('radio', 'test/radio123.img'),
-      ('boot', 'test/boot.img'),
-      ('recovery', 'test/recovery.img'),
-      ('system', 'test/system.img'),
-      ('userdata', 'test/userdata.img'),
-      ('cache', 'test/cache.img'),
-    ])
-    parts_check = [
-        'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-        'cache'
-    ]
-    with mock.patch('os.listdir', return_value=files):
-      imgs = fastboot_utils._FindAndVerifyPartitionsAndImages(
-          PARTITIONS, 'test')
-      parts = imgs.keys()
-      self.assertDictEqual(imgs, img_check)
-      self.assertListEqual(parts, parts_check)
-
-  def testFindAndVerifyPartitionsAndImages_validVendor(self):
-    PARTITIONS = [
-        'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-        'cache', 'vendor'
-    ]
-    files = [
-        'bootloader-test-.img',
-        'radio123.img',
-        'boot.img',
-        'recovery.img',
-        'system.img',
-        'userdata.img',
-        'cache.img',
-        'vendor.img'
-    ]
-    img_check = {
-      'bootloader': 'test/bootloader-test-.img',
-      'radio': 'test/radio123.img',
-      'boot': 'test/boot.img',
-      'recovery': 'test/recovery.img',
-      'system': 'test/system.img',
-      'userdata': 'test/userdata.img',
-      'cache': 'test/cache.img',
-      'vendor': 'test/vendor.img',
-    }
-    parts_check = [
-        'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-        'cache', 'vendor'
-    ]
-
-    with mock.patch('os.listdir', return_value=files):
-      imgs = fastboot_utils._FindAndVerifyPartitionsAndImages(
-          PARTITIONS, 'test')
-      parts = imgs.keys()
-      self.assertDictEqual(imgs, img_check)
-      self.assertListEqual(parts, parts_check)
-
-  def testFindAndVerifyPartitionsAndImages_badPartition(self):
-    with mock.patch('os.listdir', return_value=['test']):
-      with self.assertRaises(KeyError):
-        fastboot_utils._FindAndVerifyPartitionsAndImages(['test'], 'test')
-
-  def testFindAndVerifyPartitionsAndImages_noFile(self):
-    with mock.patch('os.listdir', return_value=['test']):
-      with self.assertRaises(device_errors.FastbootCommandFailedError):
-        fastboot_utils._FindAndVerifyPartitionsAndImages(['cache'], 'test')
-
-
-class FastbootUtilsFlashDevice(FastbootUtilsTest):
-
-  def testFlashDevice_wipe(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot._FlashPartitions(mock.ANY, 'test', wipe=True),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=False)):
-      self.fastboot.FlashDevice('test', wipe=True)
-
-  def testFlashDevice_noWipe(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot._FlashPartitions(mock.ANY, 'test', wipe=False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=True)):
-      self.fastboot.FlashDevice('test', wipe=False)
-
-  def testFlashDevice_partitions(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot._FlashPartitions(['boot'], 'test', wipe=False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=True)):
-      self.fastboot.FlashDevice('test', partitions=['boot'], wipe=False)
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/android/flag_changer.py b/third_party/catapult/devil/devil/android/flag_changer.py
deleted file mode 100644
index b2ee8b1..0000000
--- a/third_party/catapult/devil/devil/android/flag_changer.py
+++ /dev/null
@@ -1,300 +0,0 @@
-# Copyright (c) 2012 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.
-
-import contextlib
-import logging
-import posixpath
-import re
-
-from devil.android.sdk import version_codes
-
-
-logger = logging.getLogger(__name__)
-
-
-_CMDLINE_DIR = '/data/local/tmp'
-_CMDLINE_DIR_LEGACY = '/data/local'
-_RE_NEEDS_QUOTING = re.compile(r'[^\w-]')  # Not in: alphanumeric or hyphens.
-_QUOTES = '"\''  # Either a single or a double quote.
-_ESCAPE = '\\'  # A backslash.
-
-
-@contextlib.contextmanager
-def CustomCommandLineFlags(device, cmdline_name, flags):
-  """Context manager to change Chrome's command line temporarily.
-
-  Example:
-
-      with flag_changer.TemporaryCommandLineFlags(device, name, flags):
-        # Launching Chrome will use the provided flags.
-
-      # Previous set of flags on the device is now restored.
-
-  Args:
-    device: A DeviceUtils instance.
-    cmdline_name: Name of the command line file where to store flags.
-    flags: A sequence of command line flags to set.
-  """
-  # On Android N and above, we need to temporarily set SELinux to permissive
-  # so that Chrome is allowed to read the command line file.
-  # TODO(crbug.com/699082): Remove when a solution to avoid this is implemented.
-  needs_permissive = (
-      device.build_version_sdk >= version_codes.NOUGAT and
-      device.GetEnforce())
-  if needs_permissive:
-    device.SetEnforce(enabled=False)
-  try:
-    changer = FlagChanger(device, cmdline_name)
-    try:
-      changer.ReplaceFlags(flags)
-      yield
-    finally:
-      changer.Restore()
-  finally:
-    if needs_permissive:
-      device.SetEnforce(enabled=True)
-
-
-class FlagChanger(object):
-  """Changes the flags Chrome runs with.
-
-    Flags can be temporarily set for a particular set of unit tests.  These
-    tests should call Restore() to revert the flags to their original state
-    once the tests have completed.
-  """
-
-  def __init__(self, device, cmdline_file):
-    """Initializes the FlagChanger and records the original arguments.
-
-    Args:
-      device: A DeviceUtils instance.
-      cmdline_file: Name of the command line file where to store flags.
-    """
-    self._device = device
-
-    if posixpath.sep in cmdline_file:
-      raise ValueError(
-          'cmdline_file should be a file name only, do not include path'
-          ' separators in: %s' % cmdline_file)
-    self._cmdline_path = posixpath.join(_CMDLINE_DIR, cmdline_file)
-
-    cmdline_path_legacy = posixpath.join(_CMDLINE_DIR_LEGACY, cmdline_file)
-    if self._device.PathExists(cmdline_path_legacy):
-      logging.warning(
-            'Removing legacy command line file %r.', cmdline_path_legacy)
-      self._device.RemovePath(cmdline_path_legacy, as_root=True)
-
-    self._state_stack = [None]  # Actual state is set by GetCurrentFlags().
-    self.GetCurrentFlags()
-
-  def GetCurrentFlags(self):
-    """Read the current flags currently stored in the device.
-
-    Also updates the internal state of the flag_changer.
-
-    Returns:
-      A list of flags.
-    """
-    if self._device.PathExists(self._cmdline_path):
-      command_line = self._device.ReadFile(self._cmdline_path).strip()
-    else:
-      command_line = ''
-    flags = _ParseFlags(command_line)
-
-    # Store the flags as a set to facilitate adding and removing flags.
-    self._state_stack[-1] = set(flags)
-    return flags
-
-  def ReplaceFlags(self, flags):
-    """Replaces the flags in the command line with the ones provided.
-       Saves the current flags state on the stack, so a call to Restore will
-       change the state back to the one preceeding the call to ReplaceFlags.
-
-    Args:
-      flags: A sequence of command line flags to set, eg. ['--single-process'].
-             Note: this should include flags only, not the name of a command
-             to run (ie. there is no need to start the sequence with 'chrome').
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    new_flags = set(flags)
-    self._state_stack.append(new_flags)
-    return self._UpdateCommandLineFile()
-
-  def AddFlags(self, flags):
-    """Appends flags to the command line if they aren't already there.
-       Saves the current flags state on the stack, so a call to Restore will
-       change the state back to the one preceeding the call to AddFlags.
-
-    Args:
-      flags: A sequence of flags to add on, eg. ['--single-process'].
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    return self.PushFlags(add=flags)
-
-  def RemoveFlags(self, flags):
-    """Removes flags from the command line, if they exist.
-       Saves the current flags state on the stack, so a call to Restore will
-       change the state back to the one preceeding the call to RemoveFlags.
-
-       Note that calling RemoveFlags after AddFlags will result in having
-       two nested states.
-
-    Args:
-      flags: A sequence of flags to remove, eg. ['--single-process'].  Note
-             that we expect a complete match when removing flags; if you want
-             to remove a switch with a value, you must use the exact string
-             used to add it in the first place.
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    return self.PushFlags(remove=flags)
-
-  def PushFlags(self, add=None, remove=None):
-    """Appends and removes flags to/from the command line if they aren't already
-       there. Saves the current flags state on the stack, so a call to Restore
-       will change the state back to the one preceeding the call to PushFlags.
-
-    Args:
-      add: A list of flags to add on, eg. ['--single-process'].
-      remove: A list of flags to remove, eg. ['--single-process'].  Note that we
-              expect a complete match when removing flags; if you want to remove
-              a switch with a value, you must use the exact string used to add
-              it in the first place.
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    new_flags = self._state_stack[-1].copy()
-    if add:
-      new_flags.update(add)
-    if remove:
-      new_flags.difference_update(remove)
-    return self.ReplaceFlags(new_flags)
-
-  def Restore(self):
-    """Restores the flags to their state prior to the last AddFlags or
-       RemoveFlags call.
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    # The initial state must always remain on the stack.
-    assert len(self._state_stack) > 1, (
-      "Mismatch between calls to Add/RemoveFlags and Restore")
-    self._state_stack.pop()
-    return self._UpdateCommandLineFile()
-
-  def _UpdateCommandLineFile(self):
-    """Writes out the command line to the file, or removes it if empty.
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    command_line = _SerializeFlags(self._state_stack[-1])
-    if command_line is not None:
-      self._device.WriteFile(self._cmdline_path, command_line)
-    else:
-      self._device.RemovePath(self._cmdline_path, force=True)
-
-    current_flags = self.GetCurrentFlags()
-    logger.info('Flags now set on the device: %s', current_flags)
-    return current_flags
-
-
-def _ParseFlags(line):
-  """Parse the string containing the command line into a list of flags.
-
-  It's a direct port of CommandLine.java::tokenizeQuotedArguments.
-
-  The first token is assumed to be the (unused) program name and stripped off
-  from the list of flags.
-
-  Args:
-    line: A string containing the entire command line.  The first token is
-          assumed to be the program name.
-
-  Returns:
-     A list of flags, with quoting removed.
-  """
-  flags = []
-  current_quote = None
-  current_flag = None
-
-  for c in line:
-    # Detect start or end of quote block.
-    if (current_quote is None and c in _QUOTES) or c == current_quote:
-      if current_flag is not None and current_flag[-1] == _ESCAPE:
-        # Last char was a backslash; pop it, and treat c as a literal.
-        current_flag = current_flag[:-1] + c
-      else:
-        current_quote = c if current_quote is None else None
-    elif current_quote is None and c.isspace():
-      if current_flag is not None:
-        flags.append(current_flag)
-        current_flag = None
-    else:
-      if current_flag is None:
-        current_flag = ''
-      current_flag += c
-
-  if current_flag is not None:
-    if current_quote is not None:
-      logger.warning('Unterminated quoted argument: ' + current_flag)
-    flags.append(current_flag)
-
-  # Return everything but the program name.
-  return flags[1:]
-
-
-def _SerializeFlags(flags):
-  """Serialize a sequence of flags into a command line string.
-
-  Args:
-    flags: A sequence of strings with individual flags.
-
-  Returns:
-    A line with the command line contents to save; or None if the sequence of
-    flags is empty.
-  """
-  if flags:
-    # The first command line argument doesn't matter as we are not actually
-    # launching the chrome executable using this command line.
-    args = ['_']
-    args.extend(_QuoteFlag(f) for f in flags)
-    return ' '.join(args)
-  else:
-    return None
-
-
-def _QuoteFlag(flag):
-  """Validate and quote a single flag.
-
-  Args:
-    A string with the flag to quote.
-
-  Returns:
-    A string with the flag quoted so that it can be parsed by the algorithm
-    in _ParseFlags; or None if the flag does not appear to be valid.
-  """
-  if '=' in flag:
-    key, value = flag.split('=', 1)
-  else:
-    key, value = flag, None
-
-  if not flag or _RE_NEEDS_QUOTING.search(key):
-    # Probably not a valid flag, but quote the whole thing so it can be
-    # parsed back correctly.
-    return '"%s"' % flag.replace('"', r'\"')
-
-  if value is None:
-    return key
-
-  if _RE_NEEDS_QUOTING.search(value):
-    value = '"%s"' % value.replace('"', r'\"')
-  return '='.join([key, value])
diff --git a/third_party/catapult/devil/devil/android/flag_changer_devicetest.py b/third_party/catapult/devil/devil/android/flag_changer_devicetest.py
deleted file mode 100644
index b75504b..0000000
--- a/third_party/catapult/devil/devil/android/flag_changer_devicetest.py
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Unit tests for the contents of flag_changer.py.
-The test will invoke real devices
-"""
-
-import os
-import posixpath
-import sys
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', )))
-
-from devil.android import device_test_case
-from devil.android import device_utils
-from devil.android import flag_changer
-from devil.android.sdk import adb_wrapper
-
-
-_CMDLINE_FILE = 'dummy-command-line'
-
-
-class FlagChangerTest(device_test_case.DeviceTestCase):
-
-  def setUp(self):
-    super(FlagChangerTest, self).setUp()
-    self.adb = adb_wrapper.AdbWrapper(self.serial)
-    self.adb.WaitForDevice()
-    self.device = device_utils.DeviceUtils(
-        self.adb, default_timeout=10, default_retries=0)
-    # pylint: disable=protected-access
-    self.cmdline_path = posixpath.join(flag_changer._CMDLINE_DIR, _CMDLINE_FILE)
-    self.cmdline_path_legacy = posixpath.join(
-        flag_changer._CMDLINE_DIR_LEGACY, _CMDLINE_FILE)
-
-  def tearDown(self):
-    super(FlagChangerTest, self).tearDown()
-    self.device.RemovePath(
-        [self.cmdline_path, self.cmdline_path_legacy], force=True, as_root=True)
-
-  def testFlagChanger_restoreFlags(self):
-    if not self.device.HasRoot():
-      self.skipTest('Test needs a rooted device')
-
-    # Write some custom chrome command line flags.
-    self.device.WriteFile(
-        self.cmdline_path, 'chrome --some --old --flags')
-
-    # Write some more flags on a command line file in the legacy location.
-    self.device.WriteFile(
-        self.cmdline_path_legacy, 'some --stray --flags', as_root=True)
-    self.assertTrue(self.device.PathExists(self.cmdline_path_legacy))
-
-    changer = flag_changer.FlagChanger(self.device, _CMDLINE_FILE)
-
-    # Legacy command line file is removed, ensuring Chrome picks up the
-    # right file.
-    self.assertFalse(self.device.PathExists(self.cmdline_path_legacy))
-
-    # Write some new files, and check they are set.
-    new_flags = ['--my', '--new', '--flags=with special value']
-    self.assertItemsEqual(
-        changer.ReplaceFlags(new_flags),
-        new_flags)
-
-    # Restore and go back to the old flags.
-    self.assertItemsEqual(
-        changer.Restore(),
-        ['--some', '--old', '--flags'])
-
-  def testFlagChanger_removeFlags(self):
-    self.device.RemovePath(self.cmdline_path, force=True)
-    self.assertFalse(self.device.PathExists(self.cmdline_path))
-
-    with flag_changer.CustomCommandLineFlags(
-        self.device, _CMDLINE_FILE, ['--some', '--flags']):
-      self.assertTrue(self.device.PathExists(self.cmdline_path))
-
-    self.assertFalse(self.device.PathExists(self.cmdline_path))
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/android/flag_changer_test.py b/third_party/catapult/devil/devil/android/flag_changer_test.py
deleted file mode 100755
index 5342cf4..0000000
--- a/third_party/catapult/devil/devil/android/flag_changer_test.py
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import posixpath
-import unittest
-
-from devil.android import flag_changer
-
-
-_CMDLINE_FILE = 'chrome-command-line'
-
-
-class _FakeDevice(object):
-  def __init__(self):
-    self.build_type = 'user'
-    self.has_root = True
-    self.file_system = {}
-
-  def HasRoot(self):
-    return self.has_root
-
-  def PathExists(self, filepath):
-    return filepath in self.file_system
-
-  def RemovePath(self, path, **_kwargs):
-    self.file_system.pop(path)
-
-  def WriteFile(self, path, contents, **_kwargs):
-    self.file_system[path] = contents
-
-  def ReadFile(self, path, **_kwargs):
-    return self.file_system[path]
-
-
-class FlagChangerTest(unittest.TestCase):
-  def setUp(self):
-    self.device = _FakeDevice()
-    # pylint: disable=protected-access
-    self.cmdline_path = posixpath.join(flag_changer._CMDLINE_DIR, _CMDLINE_FILE)
-    self.cmdline_path_legacy = posixpath.join(
-        flag_changer._CMDLINE_DIR_LEGACY, _CMDLINE_FILE)
-
-  def testFlagChanger_removeLegacyCmdLine(self):
-    self.device.WriteFile(self.cmdline_path_legacy, 'chrome --old --stuff')
-    self.assertTrue(self.device.PathExists(self.cmdline_path_legacy))
-
-    changer = flag_changer.FlagChanger(self.device, 'chrome-command-line')
-    self.assertEquals(
-        changer._cmdline_path,  # pylint: disable=protected-access
-        self.cmdline_path)
-    self.assertFalse(self.device.PathExists(self.cmdline_path_legacy))
-
-  def testFlagChanger_mustBeFileName(self):
-    with self.assertRaises(ValueError):
-      flag_changer.FlagChanger(self.device, '/data/local/chrome-command-line')
-
-
-class ParseSerializeFlagsTest(unittest.TestCase):
-  def _testQuoteFlag(self, flag, expected_quoted_flag):
-    # Start with an unquoted flag, check that it's quoted as expected.
-    # pylint: disable=protected-access
-    quoted_flag = flag_changer._QuoteFlag(flag)
-    self.assertEqual(quoted_flag, expected_quoted_flag)
-    # Check that it survives a round-trip.
-    parsed_flags = flag_changer._ParseFlags('_ %s' % quoted_flag)
-    self.assertEqual(len(parsed_flags), 1)
-    self.assertEqual(flag, parsed_flags[0])
-
-  def testQuoteFlag_simple(self):
-    self._testQuoteFlag('--simple-flag', '--simple-flag')
-
-  def testQuoteFlag_withSimpleValue(self):
-    self._testQuoteFlag('--key=value', '--key=value')
-
-  def testQuoteFlag_withQuotedValue1(self):
-    self._testQuoteFlag('--key=valueA valueB', '--key="valueA valueB"')
-
-  def testQuoteFlag_withQuotedValue2(self):
-    self._testQuoteFlag(
-        '--key=this "should" work', r'--key="this \"should\" work"')
-
-  def testQuoteFlag_withQuotedValue3(self):
-    self._testQuoteFlag(
-        "--key=this is 'fine' too", '''--key="this is 'fine' too"''')
-
-  def testQuoteFlag_withQuotedValue4(self):
-    self._testQuoteFlag(
-        "--key='I really want to keep these quotes'",
-        '''--key="'I really want to keep these quotes'"''')
-
-  def testQuoteFlag_withQuotedValue5(self):
-    self._testQuoteFlag(
-        "--this is a strange=flag", '"--this is a strange=flag"')
-
-  def testQuoteFlag_withEmptyValue(self):
-    self._testQuoteFlag('--some-flag=', '--some-flag=')
-
-  def _testParseCmdLine(self, command_line, expected_flags):
-    # Start with a command line, check that flags are parsed as expected.
-    # pylint: disable=protected-access
-    flags = flag_changer._ParseFlags(command_line)
-    self.assertItemsEqual(flags, expected_flags)
-
-    # Check that flags survive a round-trip.
-    # Note: Although new_command_line and command_line may not match, they
-    # should describe the same set of flags.
-    new_command_line = flag_changer._SerializeFlags(flags)
-    new_flags = flag_changer._ParseFlags(new_command_line)
-    self.assertItemsEqual(new_flags, expected_flags)
-
-  def testParseCmdLine_simple(self):
-    self._testParseCmdLine(
-        'chrome --foo --bar="a b" --baz=true --fine="ok"',
-        ['--foo', '--bar=a b', '--baz=true', '--fine=ok'])
-
-  def testParseCmdLine_withFancyQuotes(self):
-    self._testParseCmdLine(
-        r'''_ --foo="this 'is' ok"
-              --bar='this \'is\' too'
-              --baz="this \'is\' tricky"
-        ''',
-        ["--foo=this 'is' ok",
-         "--bar=this 'is' too",
-         r"--baz=this \'is\' tricky"])
-
-  def testParseCmdLine_withUnterminatedQuote(self):
-    self._testParseCmdLine(
-        '_ --foo --bar="I forgot something',
-        ['--foo', '--bar=I forgot something'])
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/android/forwarder.py b/third_party/catapult/devil/devil/android/forwarder.py
deleted file mode 100644
index 244f555..0000000
--- a/third_party/catapult/devil/devil/android/forwarder.py
+++ /dev/null
@@ -1,464 +0,0 @@
-# Copyright (c) 2012 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.
-
-# pylint: disable=W0212
-
-import fcntl
-import logging
-import os
-import psutil
-
-from devil import base_error
-from devil import devil_env
-from devil.android import device_errors
-from devil.android.constants import file_system
-from devil.android.sdk import adb_wrapper
-from devil.android.valgrind_tools import base_tool
-from devil.utils import cmd_helper
-
-logger = logging.getLogger(__name__)
-
-# If passed as the device port, this will tell the forwarder to allocate
-# a dynamic port on the device. The actual port can then be retrieved with
-# Forwarder.DevicePortForHostPort.
-DYNAMIC_DEVICE_PORT = 0
-
-
-def _GetProcessStartTime(pid):
-  return psutil.Process(pid).create_time
-
-
-def _LogMapFailureDiagnostics(device):
-  # The host forwarder daemon logs to /tmp/host_forwarder_log, so print the end
-  # of that.
-  try:
-    with open('/tmp/host_forwarder_log') as host_forwarder_log:
-      logger.info('Last 50 lines of the host forwarder daemon log:')
-      for line in host_forwarder_log.read().splitlines()[-50:]:
-        logger.info('    %s', line)
-  except Exception: # pylint: disable=broad-except
-    # Grabbing the host forwarder log is best-effort. Ignore all errors.
-    logger.warning('Failed to get the contents of host_forwarder_log.')
-
-  # The device forwarder daemon logs to the logcat, so print the end of that.
-  try:
-    logger.info('Last 50 lines of logcat:')
-    for logcat_line in device.adb.Logcat(dump=True)[-50:]:
-      logger.info('    %s', logcat_line)
-  except device_errors.CommandFailedError:
-    # Grabbing the device forwarder log is also best-effort. Ignore all errors.
-    logger.warning('Failed to get the contents of the logcat.')
-
-  # Log alive device forwarders.
-  try:
-    ps_out = device.RunShellCommand(['ps'], check_return=True)
-    logger.info('Currently running device_forwarders:')
-    for line in ps_out:
-      if 'device_forwarder' in line:
-        logger.info('    %s', line)
-  except device_errors.CommandFailedError:
-    logger.warning('Failed to list currently running device_forwarder '
-                   'instances.')
-
-
-class _FileLock(object):
-  """With statement-aware implementation of a file lock.
-
-  File locks are needed for cross-process synchronization when the
-  multiprocessing Python module is used.
-  """
-
-  def __init__(self, path):
-    self._fd = -1
-    self._path = path
-
-  def __enter__(self):
-    self._fd = os.open(self._path, os.O_RDONLY | os.O_CREAT)
-    if self._fd < 0:
-      raise Exception('Could not open file %s for reading' % self._path)
-    fcntl.flock(self._fd, fcntl.LOCK_EX)
-
-  def __exit__(self, _exception_type, _exception_value, traceback):
-    fcntl.flock(self._fd, fcntl.LOCK_UN)
-    os.close(self._fd)
-
-
-class HostForwarderError(base_error.BaseError):
-  """Exception for failures involving host_forwarder."""
-
-  def __init__(self, message):
-    super(HostForwarderError, self).__init__(message)
-
-
-class Forwarder(object):
-  """Thread-safe class to manage port forwards from the device to the host."""
-
-  _DEVICE_FORWARDER_FOLDER = (file_system.TEST_EXECUTABLE_DIR +
-                              '/forwarder/')
-  _DEVICE_FORWARDER_PATH = (file_system.TEST_EXECUTABLE_DIR +
-                            '/forwarder/device_forwarder')
-  _LOCK_PATH = '/tmp/chrome.forwarder.lock'
-  # Defined in host_forwarder_main.cc
-  _HOST_FORWARDER_LOG = '/tmp/host_forwarder_log'
-
-  _TIMEOUT = 60  # seconds
-
-  _instance = None
-
-  @staticmethod
-  def Map(port_pairs, device, tool=None):
-    """Runs the forwarder.
-
-    Args:
-      port_pairs: A list of tuples (device_port, host_port) to forward. Note
-                 that you can specify 0 as a device_port, in which case a
-                 port will by dynamically assigned on the device. You can
-                 get the number of the assigned port using the
-                 DevicePortForHostPort method.
-      device: A DeviceUtils instance.
-      tool: Tool class to use to get wrapper, if necessary, for executing the
-            forwarder (see valgrind_tools.py).
-
-    Raises:
-      Exception on failure to forward the port.
-    """
-    if not tool:
-      tool = base_tool.BaseTool()
-    with _FileLock(Forwarder._LOCK_PATH):
-      instance = Forwarder._GetInstanceLocked(tool)
-      instance._InitDeviceLocked(device, tool)
-
-      device_serial = str(device)
-      map_arg_lists = [
-          ['--adb=' + adb_wrapper.AdbWrapper.GetAdbPath(),
-           '--serial-id=' + device_serial,
-           '--map', str(device_port), str(host_port)]
-          for device_port, host_port in port_pairs]
-      logger.info('Forwarding using commands: %s', map_arg_lists)
-
-      for map_arg_list in map_arg_lists:
-        try:
-          map_cmd = [instance._host_forwarder_path] + map_arg_list
-          (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-              map_cmd, Forwarder._TIMEOUT)
-        except cmd_helper.TimeoutError as e:
-          raise HostForwarderError(
-              '`%s` timed out:\n%s' % (' '.join(map_cmd), e.output))
-        except OSError as e:
-          if e.errno == 2:
-            raise HostForwarderError(
-                'Unable to start host forwarder. '
-                'Make sure you have built host_forwarder.')
-          else: raise
-        if exit_code != 0:
-          try:
-            instance._KillDeviceLocked(device, tool)
-          except device_errors.CommandFailedError:
-            # We don't want the failure to kill the device forwarder to
-            # supersede the original failure to map.
-            logging.warning(
-                'Failed to kill the device forwarder after map failure: %s',
-                str(e))
-          _LogMapFailureDiagnostics(device)
-          formatted_output = ('\n'.join(output) if isinstance(output, list)
-                              else output)
-          raise HostForwarderError(
-              '`%s` exited with %d:\n%s' % (
-                  ' '.join(map_cmd),
-                  exit_code,
-                  formatted_output))
-        tokens = output.split(':')
-        if len(tokens) != 2:
-          raise HostForwarderError(
-              'Unexpected host forwarder output "%s", '
-              'expected "device_port:host_port"' % output)
-        device_port = int(tokens[0])
-        host_port = int(tokens[1])
-        serial_with_port = (device_serial, device_port)
-        instance._device_to_host_port_map[serial_with_port] = host_port
-        instance._host_to_device_port_map[host_port] = serial_with_port
-        logger.info('Forwarding device port: %d to host port: %d.',
-                    device_port, host_port)
-
-  @staticmethod
-  def UnmapDevicePort(device_port, device):
-    """Unmaps a previously forwarded device port.
-
-    Args:
-      device: A DeviceUtils instance.
-      device_port: A previously forwarded port (through Map()).
-    """
-    with _FileLock(Forwarder._LOCK_PATH):
-      Forwarder._UnmapDevicePortLocked(device_port, device)
-
-  @staticmethod
-  def UnmapAllDevicePorts(device):
-    """Unmaps all the previously forwarded ports for the provided device.
-
-    Args:
-      device: A DeviceUtils instance.
-      port_pairs: A list of tuples (device_port, host_port) to unmap.
-    """
-    with _FileLock(Forwarder._LOCK_PATH):
-      instance = Forwarder._GetInstanceLocked(None)
-      unmap_all_cmd = [
-          instance._host_forwarder_path,
-          '--adb=%s' % adb_wrapper.AdbWrapper.GetAdbPath(),
-          '--serial-id=%s' % device.serial,
-          '--unmap-all'
-      ]
-      try:
-        exit_code, output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            unmap_all_cmd, Forwarder._TIMEOUT)
-      except cmd_helper.TimeoutError as e:
-        raise HostForwarderError(
-            '`%s` timed out:\n%s' % (' '.join(unmap_all_cmd), e.output))
-      if exit_code != 0:
-        error_msg = [
-            '`%s` exited with %d' % (' '.join(unmap_all_cmd), exit_code)]
-        if isinstance(output, list):
-          error_msg += output
-        else:
-          error_msg += [output]
-        raise HostForwarderError('\n'.join(error_msg))
-
-      # Clean out any entries from the device & host map.
-      device_map = instance._device_to_host_port_map
-      host_map = instance._host_to_device_port_map
-      for device_serial_and_port, host_port in device_map.items():
-        device_serial = device_serial_and_port[0]
-        if device_serial == device.serial:
-          del device_map[device_serial_and_port]
-          del host_map[host_port]
-
-      # Kill the device forwarder.
-      tool = base_tool.BaseTool()
-      instance._KillDeviceLocked(device, tool)
-
-  @staticmethod
-  def DevicePortForHostPort(host_port):
-    """Returns the device port that corresponds to a given host port."""
-    with _FileLock(Forwarder._LOCK_PATH):
-      serial_and_port = Forwarder._GetInstanceLocked(
-          None)._host_to_device_port_map.get(host_port)
-      return serial_and_port[1] if serial_and_port else None
-
-  @staticmethod
-  def RemoveHostLog():
-    if os.path.exists(Forwarder._HOST_FORWARDER_LOG):
-      os.unlink(Forwarder._HOST_FORWARDER_LOG)
-
-  @staticmethod
-  def GetHostLog():
-    if not os.path.exists(Forwarder._HOST_FORWARDER_LOG):
-      return ''
-    with file(Forwarder._HOST_FORWARDER_LOG, 'r') as f:
-      return f.read()
-
-  @staticmethod
-  def _GetInstanceLocked(tool):
-    """Returns the singleton instance.
-
-    Note that the global lock must be acquired before calling this method.
-
-    Args:
-      tool: Tool class to use to get wrapper, if necessary, for executing the
-            forwarder (see valgrind_tools.py).
-    """
-    if not Forwarder._instance:
-      Forwarder._instance = Forwarder(tool)
-    return Forwarder._instance
-
-  def __init__(self, tool):
-    """Constructs a new instance of Forwarder.
-
-    Note that Forwarder is a singleton therefore this constructor should be
-    called only once.
-
-    Args:
-      tool: Tool class to use to get wrapper, if necessary, for executing the
-            forwarder (see valgrind_tools.py).
-    """
-    assert not Forwarder._instance
-    self._tool = tool
-    self._initialized_devices = set()
-    self._device_to_host_port_map = dict()
-    self._host_to_device_port_map = dict()
-    self._host_forwarder_path = devil_env.config.FetchPath('forwarder_host')
-    assert os.path.exists(self._host_forwarder_path), 'Please build forwarder2'
-    self._InitHostLocked()
-
-  @staticmethod
-  def _UnmapDevicePortLocked(device_port, device):
-    """Internal method used by UnmapDevicePort().
-
-    Note that the global lock must be acquired before calling this method.
-    """
-    instance = Forwarder._GetInstanceLocked(None)
-    serial = str(device)
-    serial_with_port = (serial, device_port)
-    if not serial_with_port in instance._device_to_host_port_map:
-      logger.error('Trying to unmap non-forwarded port %d', device_port)
-      return
-
-    host_port = instance._device_to_host_port_map[serial_with_port]
-    del instance._device_to_host_port_map[serial_with_port]
-    del instance._host_to_device_port_map[host_port]
-
-    unmap_cmd = [
-        instance._host_forwarder_path,
-        '--adb=%s' % adb_wrapper.AdbWrapper.GetAdbPath(),
-        '--serial-id=%s' % serial,
-        '--unmap', str(device_port)
-    ]
-    try:
-      (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          unmap_cmd, Forwarder._TIMEOUT)
-    except cmd_helper.TimeoutError as e:
-      raise HostForwarderError(
-          '`%s` timed out:\n%s' % (' '.join(unmap_cmd), e.output))
-    if exit_code != 0:
-      logger.error(
-          '`%s` exited with %d:\n%s',
-          ' '.join(unmap_cmd),
-          exit_code,
-          '\n'.join(output) if isinstance(output, list) else output)
-
-  @staticmethod
-  def _GetPidForLock():
-    """Returns the PID used for host_forwarder initialization.
-
-    The PID of the "sharder" is used to handle multiprocessing. The "sharder"
-    is the initial process that forks that is the parent process.
-    """
-    return os.getpgrp()
-
-  def _InitHostLocked(self):
-    """Initializes the host forwarder daemon.
-
-    Note that the global lock must be acquired before calling this method. This
-    method kills any existing host_forwarder process that could be stale.
-    """
-    # See if the host_forwarder daemon was already initialized by a concurrent
-    # process or thread (in case multi-process sharding is not used).
-    pid_for_lock = Forwarder._GetPidForLock()
-    fd = os.open(Forwarder._LOCK_PATH, os.O_RDWR | os.O_CREAT)
-    with os.fdopen(fd, 'r+') as pid_file:
-      pid_with_start_time = pid_file.readline()
-      if pid_with_start_time:
-        (pid, process_start_time) = pid_with_start_time.split(':')
-        if pid == str(pid_for_lock):
-          if process_start_time == str(_GetProcessStartTime(pid_for_lock)):
-            return
-      self._KillHostLocked()
-      pid_file.seek(0)
-      pid_file.write(
-          '%s:%s' % (pid_for_lock, str(_GetProcessStartTime(pid_for_lock))))
-      pid_file.truncate()
-
-  def _InitDeviceLocked(self, device, tool):
-    """Initializes the device_forwarder daemon for a specific device (once).
-
-    Note that the global lock must be acquired before calling this method. This
-    method kills any existing device_forwarder daemon on the device that could
-    be stale, pushes the latest version of the daemon (to the device) and starts
-    it.
-
-    Args:
-      device: A DeviceUtils instance.
-      tool: Tool class to use to get wrapper, if necessary, for executing the
-            forwarder (see valgrind_tools.py).
-    """
-    device_serial = str(device)
-    if device_serial in self._initialized_devices:
-      return
-    try:
-      self._KillDeviceLocked(device, tool)
-    except device_errors.CommandFailedError:
-      logger.warning('Failed to kill device forwarder. Rebooting.')
-      device.Reboot()
-    forwarder_device_path_on_host = devil_env.config.FetchPath(
-        'forwarder_device', device=device)
-    forwarder_device_path_on_device = (
-        Forwarder._DEVICE_FORWARDER_FOLDER
-        if os.path.isdir(forwarder_device_path_on_host)
-        else Forwarder._DEVICE_FORWARDER_PATH)
-    device.PushChangedFiles([(
-        forwarder_device_path_on_host,
-        forwarder_device_path_on_device)])
-
-    cmd = [Forwarder._DEVICE_FORWARDER_PATH]
-    wrapper = tool.GetUtilWrapper()
-    if wrapper:
-      cmd.insert(0, wrapper)
-    device.RunShellCommand(
-        cmd, env={'LD_LIBRARY_PATH': Forwarder._DEVICE_FORWARDER_FOLDER},
-        check_return=True)
-    self._initialized_devices.add(device_serial)
-
-  @staticmethod
-  def KillHost():
-    """Kills the forwarder process running on the host."""
-    with _FileLock(Forwarder._LOCK_PATH):
-      Forwarder._GetInstanceLocked(None)._KillHostLocked()
-
-  def _KillHostLocked(self):
-    """Kills the forwarder process running on the host.
-
-    Note that the global lock must be acquired before calling this method.
-    """
-    logger.info('Killing host_forwarder.')
-    try:
-      kill_cmd = [self._host_forwarder_path, '--kill-server']
-      (exit_code, _o) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          kill_cmd, Forwarder._TIMEOUT)
-      if exit_code != 0:
-        kill_cmd = ['pkill', '-9', 'host_forwarder']
-        (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            kill_cmd, Forwarder._TIMEOUT)
-        if exit_code != 0:
-          raise HostForwarderError(
-              '%s exited with %d:\n%s' % (
-                  self._host_forwarder_path,
-                  exit_code,
-                  '\n'.join(output) if isinstance(output, list) else output))
-    except cmd_helper.TimeoutError as e:
-      raise HostForwarderError(
-          '`%s` timed out:\n%s' % (' '.join(kill_cmd), e.output))
-
-  @staticmethod
-  def KillDevice(device, tool=None):
-    """Kills the forwarder process running on the device.
-
-    Args:
-      device: Instance of DeviceUtils for talking to the device.
-      tool: Wrapper tool (e.g. valgrind) that can be used to execute the device
-            forwarder (see valgrind_tools.py).
-    """
-    with _FileLock(Forwarder._LOCK_PATH):
-      Forwarder._GetInstanceLocked(None)._KillDeviceLocked(
-          device, tool or base_tool.BaseTool())
-
-  def _KillDeviceLocked(self, device, tool):
-    """Kills the forwarder process running on the device.
-
-    Note that the global lock must be acquired before calling this method.
-
-    Args:
-      device: Instance of DeviceUtils for talking to the device.
-      tool: Wrapper tool (e.g. valgrind) that can be used to execute the device
-            forwarder (see valgrind_tools.py).
-    """
-    logger.info('Killing device_forwarder.')
-    self._initialized_devices.discard(device.serial)
-    if not device.FileExists(Forwarder._DEVICE_FORWARDER_PATH):
-      return
-
-    cmd = [Forwarder._DEVICE_FORWARDER_PATH, '--kill-server']
-    wrapper = tool.GetUtilWrapper()
-    if wrapper:
-      cmd.insert(0, wrapper)
-    device.RunShellCommand(
-        cmd, env={'LD_LIBRARY_PATH': Forwarder._DEVICE_FORWARDER_FOLDER},
-        check_return=True)
diff --git a/third_party/catapult/devil/devil/android/install_commands.py b/third_party/catapult/devil/devil/android/install_commands.py
deleted file mode 100644
index c8da869..0000000
--- a/third_party/catapult/devil/devil/android/install_commands.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import posixpath
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android.constants import file_system
-
-BIN_DIR = '%s/bin' % file_system.TEST_EXECUTABLE_DIR
-_FRAMEWORK_DIR = '%s/framework' % file_system.TEST_EXECUTABLE_DIR
-
-_COMMANDS = {
-  'unzip': 'org.chromium.android.commands.unzip.Unzip',
-}
-
-_SHELL_COMMAND_FORMAT = (
-"""#!/system/bin/sh
-base=%s
-export CLASSPATH=$base/framework/chromium_commands.jar
-exec app_process $base/bin %s $@
-""")
-
-
-def Installed(device):
-  paths = [posixpath.join(BIN_DIR, c) for c in _COMMANDS]
-  paths.append(posixpath.join(_FRAMEWORK_DIR, 'chromium_commands.jar'))
-  return device.PathExists(paths)
-
-
-def InstallCommands(device):
-  if device.IsUserBuild():
-    raise device_errors.CommandFailedError(
-        'chromium_commands currently requires a userdebug build.',
-        device_serial=device.adb.GetDeviceSerial())
-
-  chromium_commands_jar_path = devil_env.config.FetchPath('chromium_commands')
-  if not os.path.exists(chromium_commands_jar_path):
-    raise device_errors.CommandFailedError(
-        '%s not found. Please build chromium_commands.'
-        % chromium_commands_jar_path)
-
-  device.RunShellCommand(
-      ['mkdir', '-p', BIN_DIR, _FRAMEWORK_DIR], check_return=True)
-  for command, main_class in _COMMANDS.iteritems():
-    shell_command = _SHELL_COMMAND_FORMAT % (
-        file_system.TEST_EXECUTABLE_DIR, main_class)
-    shell_file = '%s/%s' % (BIN_DIR, command)
-    device.WriteFile(shell_file, shell_command)
-    device.RunShellCommand(
-        ['chmod', '755', shell_file], check_return=True)
-
-  device.adb.Push(
-      chromium_commands_jar_path,
-      '%s/chromium_commands.jar' % _FRAMEWORK_DIR)
diff --git a/third_party/catapult/devil/devil/android/logcat_monitor.py b/third_party/catapult/devil/devil/android/logcat_monitor.py
deleted file mode 100644
index 0aece87..0000000
--- a/third_party/catapult/devil/devil/android/logcat_monitor.py
+++ /dev/null
@@ -1,255 +0,0 @@
-# Copyright 2015 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.
-
-# pylint: disable=unused-argument
-
-import errno
-import logging
-import os
-import re
-import shutil
-import tempfile
-import threading
-import time
-
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-from devil.utils import reraiser_thread
-
-logger = logging.getLogger(__name__)
-
-
-class LogcatMonitor(object):
-
-  _RECORD_ITER_TIMEOUT = 2.0
-  _RECORD_THREAD_JOIN_WAIT = 5.0
-  _WAIT_TIME = 0.2
-  _THREADTIME_RE_FORMAT = (
-      r'(?P<date>\S*) +(?P<time>\S*) +(?P<proc_id>%s) +(?P<thread_id>%s) +'
-      r'(?P<log_level>%s) +(?P<component>%s) *: +(?P<message>%s)$')
-
-  def __init__(self, adb, clear=True, filter_specs=None, output_file=None):
-    """Create a LogcatMonitor instance.
-
-    Args:
-      adb: An instance of adb_wrapper.AdbWrapper.
-      clear: If True, clear the logcat when monitoring starts.
-      filter_specs: An optional list of '<tag>[:priority]' strings.
-      output_file: File path to save recorded logcat.
-    """
-    if isinstance(adb, adb_wrapper.AdbWrapper):
-      self._adb = adb
-    else:
-      raise ValueError('Unsupported type passed for argument "device"')
-    self._clear = clear
-    self._filter_specs = filter_specs
-    self._output_file = output_file
-    self._record_file = None
-    self._record_file_lock = threading.Lock()
-    self._record_thread = None
-    self._stop_recording_event = threading.Event()
-
-  @property
-  def output_file(self):
-    return self._output_file
-
-  @decorators.WithTimeoutAndRetriesDefaults(10, 0)
-  def WaitFor(self, success_regex, failure_regex=None, timeout=None,
-              retries=None):
-    """Wait for a matching logcat line or until a timeout occurs.
-
-    This will attempt to match lines in the logcat against both |success_regex|
-    and |failure_regex| (if provided). Note that this calls re.search on each
-    logcat line, not re.match, so the provided regular expressions don't have
-    to match an entire line.
-
-    Args:
-      success_regex: The regular expression to search for.
-      failure_regex: An optional regular expression that, if hit, causes this
-        to stop looking for a match. Can be None.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A match object if |success_regex| matches a part of a logcat line, or
-      None if |failure_regex| matches a part of a logcat line.
-    Raises:
-      CommandFailedError on logcat failure (NOT on a |failure_regex| match).
-      CommandTimeoutError if no logcat line matching either |success_regex| or
-        |failure_regex| is found in |timeout| seconds.
-      DeviceUnreachableError if the device becomes unreachable.
-      LogcatMonitorCommandError when calling |WaitFor| while not recording
-        logcat.
-    """
-    if self._record_thread is None:
-      raise LogcatMonitorCommandError(
-          'Must be recording logcat when calling |WaitFor|',
-          device_serial=str(self._adb))
-    if isinstance(success_regex, basestring):
-      success_regex = re.compile(success_regex)
-    if isinstance(failure_regex, basestring):
-      failure_regex = re.compile(failure_regex)
-
-    logger.debug('Waiting %d seconds for "%s"', timeout, success_regex.pattern)
-
-    # NOTE This will continue looping until:
-    #  - success_regex matches a line, in which case the match object is
-    #    returned.
-    #  - failure_regex matches a line, in which case None is returned
-    #  - the timeout is hit, in which case a CommandTimeoutError is raised.
-    with open(self._record_file.name, 'r') as f:
-      while True:
-        line = f.readline()
-        if line:
-          m = success_regex.search(line)
-          if m:
-            return m
-          if failure_regex and failure_regex.search(line):
-            return None
-        else:
-          time.sleep(self._WAIT_TIME)
-
-  def FindAll(self, message_regex, proc_id=None, thread_id=None, log_level=None,
-              component=None):
-    """Finds all lines in the logcat that match the provided constraints.
-
-    Args:
-      message_regex: The regular expression that the <message> section must
-        match.
-      proc_id: The process ID to match. If None, matches any process ID.
-      thread_id: The thread ID to match. If None, matches any thread ID.
-      log_level: The log level to match. If None, matches any log level.
-      component: The component to match. If None, matches any component.
-
-    Raises:
-      LogcatMonitorCommandError when calling |FindAll| before recording logcat.
-
-    Yields:
-      A match object for each matching line in the logcat. The match object
-      will always contain, in addition to groups defined in |message_regex|,
-      the following named groups: 'date', 'time', 'proc_id', 'thread_id',
-      'log_level', 'component', and 'message'.
-    """
-    if self._record_file is None:
-      raise LogcatMonitorCommandError(
-          'Must have recorded or be recording a logcat to call |FindAll|',
-          device_serial=str(self._adb))
-    if proc_id is None:
-      proc_id = r'\d+'
-    if thread_id is None:
-      thread_id = r'\d+'
-    if log_level is None:
-      log_level = r'[VDIWEF]'
-    if component is None:
-      component = r'[^\s:]+'
-    # pylint: disable=protected-access
-    threadtime_re = re.compile(
-        type(self)._THREADTIME_RE_FORMAT % (
-            proc_id, thread_id, log_level, component, message_regex))
-
-    with open(self._record_file.name, 'r') as f:
-      for line in f:
-        m = re.match(threadtime_re, line)
-        if m:
-          yield m
-
-  def _StartRecording(self):
-    """Starts recording logcat to file.
-
-    Function spawns a thread that records logcat to file and will not die
-    until |StopRecording| is called.
-    """
-    def record_to_file():
-      # Write the log with line buffering so the consumer sees each individual
-      # line.
-      for data in self._adb.Logcat(filter_specs=self._filter_specs,
-                                   logcat_format='threadtime',
-                                   iter_timeout=self._RECORD_ITER_TIMEOUT):
-        if self._stop_recording_event.isSet():
-          return
-
-        if data is None:
-          # Logcat can yield None if the iter_timeout is hit.
-          continue
-
-        with self._record_file_lock:
-          if self._record_file and not self._record_file.closed:
-            self._record_file.write(data + '\n')
-
-    self._stop_recording_event.clear()
-    if not self._record_thread:
-      self._record_thread = reraiser_thread.ReraiserThread(record_to_file)
-      self._record_thread.start()
-
-  def _StopRecording(self):
-    """Finish recording logcat."""
-    if self._record_thread:
-      self._stop_recording_event.set()
-      self._record_thread.join(timeout=self._RECORD_THREAD_JOIN_WAIT)
-      self._record_thread.ReraiseIfException()
-      self._record_thread = None
-
-  def Start(self):
-    """Starts the logcat monitor.
-
-    Clears the logcat if |clear| was set in |__init__|.
-    """
-    if self._clear:
-      self._adb.Logcat(clear=True)
-    if not self._record_file:
-      self._record_file = tempfile.NamedTemporaryFile(mode='a', bufsize=1)
-    self._StartRecording()
-
-  def Stop(self):
-    """Stops the logcat monitor.
-
-    Stops recording the logcat. Copies currently recorded logcat to
-    |self._output_file|.
-    """
-    self._StopRecording()
-    with self._record_file_lock:
-      if self._record_file and self._output_file:
-        try:
-          os.makedirs(os.path.dirname(self._output_file))
-        except OSError as e:
-          if e.errno != errno.EEXIST:
-            raise
-        shutil.copy(self._record_file.name, self._output_file)
-
-  def Close(self):
-    """Closes logcat recording file.
-
-    Should be called when finished using the logcat monitor.
-    """
-    with self._record_file_lock:
-      if self._record_file:
-        self._record_file.close()
-        self._record_file = None
-
-  def __enter__(self):
-    """Starts the logcat monitor."""
-    self.Start()
-    return self
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    """Stops the logcat monitor."""
-    self.Stop()
-
-  def __del__(self):
-    """Closes logcat recording file in case |Close| was never called."""
-    with self._record_file_lock:
-      if self._record_file:
-        logger.warning(
-            'Need to call |Close| on the logcat monitor when done!')
-        self._record_file.close()
-
-  @property
-  def adb(self):
-    return self._adb
-
-
-class LogcatMonitorCommandError(device_errors.CommandFailedError):
-  """Exception for errors with logcat monitor commands."""
-  pass
diff --git a/third_party/catapult/devil/devil/android/logcat_monitor_test.py b/third_party/catapult/devil/devil/android/logcat_monitor_test.py
deleted file mode 100755
index 8fb4d74..0000000
--- a/third_party/catapult/devil/devil/android/logcat_monitor_test.py
+++ /dev/null
@@ -1,230 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-# pylint: disable=protected-access
-
-import itertools
-import threading
-import unittest
-
-from devil import devil_env
-from devil.android import logcat_monitor
-from devil.android.sdk import adb_wrapper
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-def _CreateTestLog(raw_logcat=None):
-  test_adb = adb_wrapper.AdbWrapper('0123456789abcdef')
-  test_adb.Logcat = mock.Mock(return_value=(l for l in raw_logcat))
-  test_log = logcat_monitor.LogcatMonitor(test_adb, clear=False)
-  return test_log
-
-
-class LogcatMonitorTest(unittest.TestCase):
-
-  _TEST_THREADTIME_LOGCAT_DATA = [
-      '01-01 01:02:03.456  7890  0987 V LogcatMonitorTest: '
-          'verbose logcat monitor test message 1',
-      '01-01 01:02:03.457  8901  1098 D LogcatMonitorTest: '
-          'debug logcat monitor test message 2',
-      '01-01 01:02:03.458  9012  2109 I LogcatMonitorTest: '
-          'info logcat monitor test message 3',
-      '01-01 01:02:03.459  0123  3210 W LogcatMonitorTest: '
-          'warning logcat monitor test message 4',
-      '01-01 01:02:03.460  1234  4321 E LogcatMonitorTest: '
-          'error logcat monitor test message 5',
-      '01-01 01:02:03.461  2345  5432 F LogcatMonitorTest: '
-          'fatal logcat monitor test message 6',
-      '01-01 01:02:03.462  3456  6543 D LogcatMonitorTest: '
-          'last line'
-  ]
-
-  def assertIterEqual(self, expected_iter, actual_iter):
-    for expected, actual in itertools.izip_longest(expected_iter, actual_iter):
-      self.assertIsNotNone(
-          expected,
-          msg='actual has unexpected elements starting with %s' % str(actual))
-      self.assertIsNotNone(
-          actual,
-          msg='actual is missing elements starting with %s' % str(expected))
-      self.assertEqual(actual.group('proc_id'), expected[0])
-      self.assertEqual(actual.group('thread_id'), expected[1])
-      self.assertEqual(actual.group('log_level'), expected[2])
-      self.assertEqual(actual.group('component'), expected[3])
-      self.assertEqual(actual.group('message'), expected[4])
-
-    with self.assertRaises(StopIteration):
-      next(actual_iter)
-    with self.assertRaises(StopIteration):
-      next(expected_iter)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitFor_success(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    actual_match = test_log.WaitFor(r'.*(fatal|error) logcat monitor.*', None)
-    self.assertTrue(actual_match)
-    self.assertEqual(
-        '01-01 01:02:03.460  1234  4321 E LogcatMonitorTest: '
-            'error logcat monitor test message 5',
-        actual_match.group(0))
-    self.assertEqual('error', actual_match.group(1))
-    test_log.Stop()
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitFor_failure(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    actual_match = test_log.WaitFor(
-        r'.*My Success Regex.*', r'.*(fatal|error) logcat monitor.*')
-    self.assertIsNone(actual_match)
-    test_log.Stop()
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitFor_buffering(self):
-    # Simulate an adb log stream which does not complete until the test tells it
-    # to. This checks that the log matcher can receive individual lines from the
-    # log reader thread even if adb is not producing enough output to fill an
-    # entire file io buffer.
-    finished_lock = threading.Lock()
-    finished_lock.acquire()
-
-    def LogGenerator():
-      for line in type(self)._TEST_THREADTIME_LOGCAT_DATA:
-        yield line
-      finished_lock.acquire()
-
-    test_adb = adb_wrapper.AdbWrapper('0123456789abcdef')
-    test_adb.Logcat = mock.Mock(return_value=LogGenerator())
-    test_log = logcat_monitor.LogcatMonitor(test_adb, clear=False)
-    test_log.Start()
-
-    actual_match = test_log.WaitFor(r'.*last line.*', None)
-    finished_lock.release()
-    self.assertTrue(actual_match)
-    test_log.Stop()
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_defaults(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    expected_results = [
-        ('7890', '0987', 'V', 'LogcatMonitorTest',
-         'verbose logcat monitor test message 1'),
-        ('8901', '1098', 'D', 'LogcatMonitorTest',
-         'debug logcat monitor test message 2'),
-        ('9012', '2109', 'I', 'LogcatMonitorTest',
-         'info logcat monitor test message 3'),
-        ('0123', '3210', 'W', 'LogcatMonitorTest',
-         'warning logcat monitor test message 4'),
-        ('1234', '4321', 'E', 'LogcatMonitorTest',
-         'error logcat monitor test message 5'),
-        ('2345', '5432', 'F', 'LogcatMonitorTest',
-         'fatal logcat monitor test message 6')]
-    actual_results = test_log.FindAll(r'\S* logcat monitor test message \d')
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_defaults_miss(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    expected_results = []
-    actual_results = test_log.FindAll(r'\S* nothing should match this \d')
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_filterProcId(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    actual_results = test_log.FindAll(
-        r'\S* logcat monitor test message \d', proc_id=1234)
-    expected_results = [
-        ('1234', '4321', 'E', 'LogcatMonitorTest',
-         'error logcat monitor test message 5')]
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_filterThreadId(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    actual_results = test_log.FindAll(
-        r'\S* logcat monitor test message \d', thread_id=2109)
-    expected_results = [
-        ('9012', '2109', 'I', 'LogcatMonitorTest',
-         'info logcat monitor test message 3')]
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_filterLogLevel(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    actual_results = test_log.FindAll(
-        r'\S* logcat monitor test message \d', log_level=r'[DW]')
-    expected_results = [
-        ('8901', '1098', 'D', 'LogcatMonitorTest',
-         'debug logcat monitor test message 2'),
-        ('0123', '3210', 'W', 'LogcatMonitorTest',
-         'warning logcat monitor test message 4')
-    ]
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_filterComponent(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    actual_results = test_log.FindAll(r'.*', component='LogcatMonitorTest')
-    expected_results = [
-        ('7890', '0987', 'V', 'LogcatMonitorTest',
-         'verbose logcat monitor test message 1'),
-        ('8901', '1098', 'D', 'LogcatMonitorTest',
-         'debug logcat monitor test message 2'),
-        ('9012', '2109', 'I', 'LogcatMonitorTest',
-         'info logcat monitor test message 3'),
-        ('0123', '3210', 'W', 'LogcatMonitorTest',
-         'warning logcat monitor test message 4'),
-        ('1234', '4321', 'E', 'LogcatMonitorTest',
-         'error logcat monitor test message 5'),
-        ('2345', '5432', 'F', 'LogcatMonitorTest',
-         'fatal logcat monitor test message 6'),
-        ('3456', '6543', 'D', 'LogcatMonitorTest',
-         'last line')
-    ]
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
-
diff --git a/third_party/catapult/devil/devil/android/md5sum.py b/third_party/catapult/devil/devil/android/md5sum.py
deleted file mode 100644
index 6dece9e..0000000
--- a/third_party/catapult/devil/devil/android/md5sum.py
+++ /dev/null
@@ -1,120 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import posixpath
-import re
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.utils import cmd_helper
-
-MD5SUM_DEVICE_LIB_PATH = '/data/local/tmp/md5sum'
-MD5SUM_DEVICE_BIN_PATH = MD5SUM_DEVICE_LIB_PATH + '/md5sum_bin'
-
-_STARTS_WITH_CHECKSUM_RE = re.compile(r'^\s*[0-9a-fA-F]{32}\s+')
-
-
-def CalculateHostMd5Sums(paths):
-  """Calculates the MD5 sum value for all items in |paths|.
-
-  Directories are traversed recursively and the MD5 sum of each file found is
-  reported in the result.
-
-  Args:
-    paths: A list of host paths to md5sum.
-  Returns:
-    A dict mapping file paths to their respective md5sum checksums.
-  """
-  if isinstance(paths, basestring):
-    paths = [paths]
-
-  md5sum_bin_host_path = devil_env.config.FetchPath('md5sum_host')
-  if not os.path.exists(md5sum_bin_host_path):
-    raise IOError('File not built: %s' % md5sum_bin_host_path)
-  out = cmd_helper.GetCmdOutput(
-    [md5sum_bin_host_path] + [os.path.realpath(p) for p in paths])
-
-  return _ParseMd5SumOutput(out.splitlines())
-
-
-def CalculateDeviceMd5Sums(paths, device):
-  """Calculates the MD5 sum value for all items in |paths|.
-
-  Directories are traversed recursively and the MD5 sum of each file found is
-  reported in the result.
-
-  Args:
-    paths: A list of device paths to md5sum.
-  Returns:
-    A dict mapping file paths to their respective md5sum checksums.
-  """
-  if not paths:
-    return {}
-
-  if isinstance(paths, basestring):
-    paths = [paths]
-  # Allow generators
-  paths = list(paths)
-
-  md5sum_dist_path = devil_env.config.FetchPath('md5sum_device', device=device)
-
-  if os.path.isdir(md5sum_dist_path):
-    md5sum_dist_bin_path = os.path.join(md5sum_dist_path, 'md5sum_bin')
-  else:
-    md5sum_dist_bin_path = md5sum_dist_path
-
-  if not os.path.exists(md5sum_dist_path):
-    raise IOError('File not built: %s' % md5sum_dist_path)
-  md5sum_file_size = os.path.getsize(md5sum_dist_bin_path)
-
-  # For better performance, make the script as small as possible to try and
-  # avoid needing to write to an intermediary file (which RunShellCommand will
-  # do if necessary).
-  md5sum_script = 'a=%s;' % MD5SUM_DEVICE_BIN_PATH
-  # Check if the binary is missing or has changed (using its file size as an
-  # indicator), and trigger a (re-)push via the exit code.
-  md5sum_script += '! [[ $(ls -l $a) = *%d* ]]&&exit 2;' % md5sum_file_size
-  # Make sure it can find libbase.so
-  md5sum_script += 'export LD_LIBRARY_PATH=%s;' % MD5SUM_DEVICE_LIB_PATH
-  if len(paths) > 1:
-    prefix = posixpath.commonprefix(paths)
-    if len(prefix) > 4:
-      md5sum_script += 'p="%s";' % prefix
-      paths = ['$p"%s"' % p[len(prefix):] for p in paths]
-
-  md5sum_script += ';'.join('$a %s' % p for p in paths)
-  # Don't fail the script if the last md5sum fails (due to file not found)
-  # Note: ":" is equivalent to "true".
-  md5sum_script += ';:'
-  try:
-    out = device.RunShellCommand(md5sum_script, shell=True, check_return=True)
-  except device_errors.AdbShellCommandFailedError as e:
-    # Push the binary only if it is found to not exist
-    # (faster than checking up-front).
-    if e.status == 2:
-      # If files were previously pushed as root (adbd running as root), trying
-      # to re-push as non-root causes the push command to report success, but
-      # actually fail. So, wipe the directory first.
-      device.RunShellCommand(['rm', '-rf', MD5SUM_DEVICE_LIB_PATH],
-                             as_root=True, check_return=True)
-      if os.path.isdir(md5sum_dist_path):
-        device.adb.Push(md5sum_dist_path, MD5SUM_DEVICE_LIB_PATH)
-      else:
-        mkdir_cmd = 'a=%s;[[ -e $a ]] || mkdir $a' % MD5SUM_DEVICE_LIB_PATH
-        device.RunShellCommand(mkdir_cmd, shell=True, check_return=True)
-        device.adb.Push(md5sum_dist_bin_path, MD5SUM_DEVICE_BIN_PATH)
-
-      out = device.RunShellCommand(md5sum_script, shell=True, check_return=True)
-    else:
-      raise
-
-  return _ParseMd5SumOutput(out)
-
-
-def _ParseMd5SumOutput(out):
-  hash_and_path = (l.split(None, 1) for l in out
-                   if l and _STARTS_WITH_CHECKSUM_RE.match(l))
-  return dict((p, h) for h, p in hash_and_path)
-
diff --git a/third_party/catapult/devil/devil/android/md5sum_test.py b/third_party/catapult/devil/devil/android/md5sum_test.py
deleted file mode 100755
index c9b4954..0000000
--- a/third_party/catapult/devil/devil/android/md5sum_test.py
+++ /dev/null
@@ -1,237 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import os
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import md5sum
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-TEST_OUT_DIR = os.path.join('test', 'out', 'directory')
-HOST_MD5_EXECUTABLE = os.path.join(TEST_OUT_DIR, 'md5sum_bin_host')
-MD5_DIST = os.path.join(TEST_OUT_DIR, 'md5sum_dist')
-
-
-class Md5SumTest(unittest.TestCase):
-
-  def setUp(self):
-    mocked_attrs = {
-      'md5sum_host': HOST_MD5_EXECUTABLE,
-      'md5sum_device': MD5_DIST,
-    }
-    self._patchers = [
-      mock.patch('devil.devil_env._Environment.FetchPath',
-                 mock.Mock(side_effect=lambda a, device=None: mocked_attrs[a])),
-      mock.patch('os.path.exists',
-                 new=mock.Mock(return_value=True)),
-    ]
-    for p in self._patchers:
-      p.start()
-
-  def tearDown(self):
-    for p in self._patchers:
-      p.stop()
-
-  def testCalculateHostMd5Sums_singlePath(self):
-    test_path = '/test/host/file.dat'
-    mock_get_cmd_output = mock.Mock(
-        return_value='0123456789abcdeffedcba9876543210 /test/host/file.dat')
-    with mock.patch('devil.utils.cmd_helper.GetCmdOutput',
-                    new=mock_get_cmd_output):
-      out = md5sum.CalculateHostMd5Sums(test_path)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/test/host/file.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/test/host/file.dat'])
-      mock_get_cmd_output.assert_called_once_with(
-          [HOST_MD5_EXECUTABLE, '/test/host/file.dat'])
-
-  def testCalculateHostMd5Sums_list(self):
-    test_paths = ['/test/host/file0.dat', '/test/host/file1.dat']
-    mock_get_cmd_output = mock.Mock(
-        return_value='0123456789abcdeffedcba9876543210 /test/host/file0.dat\n'
-                     '123456789abcdef00fedcba987654321 /test/host/file1.dat\n')
-    with mock.patch('devil.utils.cmd_helper.GetCmdOutput',
-                    new=mock_get_cmd_output):
-      out = md5sum.CalculateHostMd5Sums(test_paths)
-      self.assertEquals(2, len(out))
-      self.assertTrue('/test/host/file0.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/test/host/file0.dat'])
-      self.assertTrue('/test/host/file1.dat' in out)
-      self.assertEquals('123456789abcdef00fedcba987654321',
-                        out['/test/host/file1.dat'])
-      mock_get_cmd_output.assert_called_once_with(
-          [HOST_MD5_EXECUTABLE, '/test/host/file0.dat',
-           '/test/host/file1.dat'])
-
-  def testCalculateHostMd5Sums_generator(self):
-    test_paths = ('/test/host/' + p for p in ['file0.dat', 'file1.dat'])
-    mock_get_cmd_output = mock.Mock(
-        return_value='0123456789abcdeffedcba9876543210 /test/host/file0.dat\n'
-                     '123456789abcdef00fedcba987654321 /test/host/file1.dat\n')
-    with mock.patch('devil.utils.cmd_helper.GetCmdOutput',
-                    new=mock_get_cmd_output):
-      out = md5sum.CalculateHostMd5Sums(test_paths)
-      self.assertEquals(2, len(out))
-      self.assertTrue('/test/host/file0.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/test/host/file0.dat'])
-      self.assertTrue('/test/host/file1.dat' in out)
-      self.assertEquals('123456789abcdef00fedcba987654321',
-                        out['/test/host/file1.dat'])
-      mock_get_cmd_output.assert_called_once_with(
-          [HOST_MD5_EXECUTABLE, '/test/host/file0.dat', '/test/host/file1.dat'])
-
-  def testCalculateDeviceMd5Sums_noPaths(self):
-    device = mock.NonCallableMock()
-    device.RunShellCommand = mock.Mock(side_effect=Exception())
-
-    out = md5sum.CalculateDeviceMd5Sums([], device)
-    self.assertEquals(0, len(out))
-
-  def testCalculateDeviceMd5Sums_singlePath(self):
-    test_path = '/storage/emulated/legacy/test/file.dat'
-
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        '0123456789abcdeffedcba9876543210 '
-            '/storage/emulated/legacy/test/file.dat',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/storage/emulated/legacy/test/file.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_list(self):
-    test_path = ['/storage/emulated/legacy/test/file0.dat',
-                 '/storage/emulated/legacy/test/file1.dat']
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        '0123456789abcdeffedcba9876543210 '
-            '/storage/emulated/legacy/test/file0.dat',
-        '123456789abcdef00fedcba987654321 '
-            '/storage/emulated/legacy/test/file1.dat',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(2, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/storage/emulated/legacy/test/file0.dat'])
-      self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out)
-      self.assertEquals('123456789abcdef00fedcba987654321',
-                        out['/storage/emulated/legacy/test/file1.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_generator(self):
-    test_path = ('/storage/emulated/legacy/test/file%d.dat' % n
-                 for n in xrange(0, 2))
-
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        '0123456789abcdeffedcba9876543210 '
-            '/storage/emulated/legacy/test/file0.dat',
-        '123456789abcdef00fedcba987654321 '
-            '/storage/emulated/legacy/test/file1.dat',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(2, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/storage/emulated/legacy/test/file0.dat'])
-      self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out)
-      self.assertEquals('123456789abcdef00fedcba987654321',
-                        out['/storage/emulated/legacy/test/file1.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_singlePath_linkerWarning(self):
-    # See crbug/479966
-    test_path = '/storage/emulated/legacy/test/file.dat'
-
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: '
-            'unused DT entry: type 0x1d arg 0x15db',
-        'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text',
-        '0123456789abcdeffedcba9876543210 '
-            '/storage/emulated/legacy/test/file.dat',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/storage/emulated/legacy/test/file.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_list_fileMissing(self):
-    test_path = ['/storage/emulated/legacy/test/file0.dat',
-                 '/storage/emulated/legacy/test/file1.dat']
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        '0123456789abcdeffedcba9876543210 '
-            '/storage/emulated/legacy/test/file0.dat',
-        '[0819/203513:ERROR:md5sum.cc(25)] Could not open file asdf',
-        '',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/storage/emulated/legacy/test/file0.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_requiresBinary(self):
-    test_path = '/storage/emulated/legacy/test/file.dat'
-
-    device = mock.NonCallableMock()
-    device.adb = mock.NonCallableMock()
-    device.adb.Push = mock.Mock()
-    device_md5sum_output = [
-        'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: '
-            'unused DT entry: type 0x1d arg 0x15db',
-        'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text',
-        '0123456789abcdeffedcba9876543210 '
-            '/storage/emulated/legacy/test/file.dat',
-    ]
-    error = device_errors.AdbShellCommandFailedError('cmd', 'out', 2)
-    device.RunShellCommand = mock.Mock(
-        side_effect=(error, '', device_md5sum_output))
-
-    with mock.patch('os.path.isdir', return_value=True), (
-         mock.patch('os.path.getsize', return_value=1337)):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/storage/emulated/legacy/test/file.dat'])
-      self.assertEquals(3, len(device.RunShellCommand.call_args_list))
-      device.adb.Push.assert_called_once_with(
-          'test/out/directory/md5sum_dist', '/data/local/tmp/md5sum')
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
-
diff --git a/third_party/catapult/devil/devil/android/perf/__init__.py b/third_party/catapult/devil/devil/android/perf/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/third_party/catapult/devil/devil/android/perf/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2015 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.
diff --git a/third_party/catapult/devil/devil/android/perf/cache_control.py b/third_party/catapult/devil/devil/android/perf/cache_control.py
deleted file mode 100644
index 27782b5..0000000
--- a/third_party/catapult/devil/devil/android/perf/cache_control.py
+++ /dev/null
@@ -1,15 +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.
-
-
-class CacheControl(object):
-  _DROP_CACHES = '/proc/sys/vm/drop_caches'
-
-  def __init__(self, device):
-    self._device = device
-
-  def DropRamCaches(self):
-    """Drops the filesystem ram caches for performance testing."""
-    self._device.RunShellCommand(['sync'], check_return=True, as_root=True)
-    self._device.WriteFile(CacheControl._DROP_CACHES, '3', as_root=True)
diff --git a/third_party/catapult/devil/devil/android/perf/perf_control.py b/third_party/catapult/devil/devil/android/perf/perf_control.py
deleted file mode 100644
index 06a5db6..0000000
--- a/third_party/catapult/devil/devil/android/perf/perf_control.py
+++ /dev/null
@@ -1,210 +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.
-
-import atexit
-import logging
-import re
-
-from devil.android import device_errors
-
-logger = logging.getLogger(__name__)
-
-
-class PerfControl(object):
-  """Provides methods for setting the performance mode of a device."""
-
-  _AVAILABLE_GOVERNORS_REL_PATH = 'cpufreq/scaling_available_governors'
-  _CPU_FILE_PATTERN = re.compile(r'^cpu\d+$')
-  _CPU_PATH = '/sys/devices/system/cpu'
-  _KERNEL_MAX = '/sys/devices/system/cpu/kernel_max'
-
-  def __init__(self, device):
-    self._device = device
-    self._cpu_files = [
-        filename
-        for filename in self._device.ListDirectory(self._CPU_PATH, as_root=True)
-        if self._CPU_FILE_PATTERN.match(filename)]
-    assert self._cpu_files, 'Failed to detect CPUs.'
-    self._cpu_file_list = ' '.join(self._cpu_files)
-    logger.info('CPUs found: %s', self._cpu_file_list)
-
-    self._have_mpdecision = self._device.FileExists('/system/bin/mpdecision')
-
-    raw = self._ReadEachCpuFile(self._AVAILABLE_GOVERNORS_REL_PATH)
-    self._available_governors = [
-        (cpu, raw_governors.strip().split() if not exit_code else None)
-        for cpu, raw_governors, exit_code in raw]
-
-  def SetHighPerfMode(self):
-    """Sets the highest stable performance mode for the device."""
-    try:
-      self._device.EnableRoot()
-    except device_errors.CommandFailedError:
-      message = 'Need root for performance mode. Results may be NOISY!!'
-      logger.warning(message)
-      # Add an additional warning at exit, such that it's clear that any results
-      # may be different/noisy (due to the lack of intended performance mode).
-      atexit.register(logger.warning, message)
-      return
-
-    product_model = self._device.product_model
-    # TODO(epenner): Enable on all devices (http://crbug.com/383566)
-    if 'Nexus 4' == product_model:
-      self._ForceAllCpusOnline(True)
-      if not self._AllCpusAreOnline():
-        logger.warning('Failed to force CPUs online. Results may be NOISY!')
-      self.SetScalingGovernor('performance')
-    elif 'Nexus 5' == product_model:
-      self._ForceAllCpusOnline(True)
-      if not self._AllCpusAreOnline():
-        logger.warning('Failed to force CPUs online. Results may be NOISY!')
-      self.SetScalingGovernor('performance')
-      self._SetScalingMaxFreq(1190400)
-      self._SetMaxGpuClock(200000000)
-    else:
-      self.SetScalingGovernor('performance')
-
-  def SetPerfProfilingMode(self):
-    """Enables all cores for reliable perf profiling."""
-    self._ForceAllCpusOnline(True)
-    self.SetScalingGovernor('performance')
-    if not self._AllCpusAreOnline():
-      if not self._device.HasRoot():
-        raise RuntimeError('Need root to force CPUs online.')
-      raise RuntimeError('Failed to force CPUs online.')
-
-  def SetDefaultPerfMode(self):
-    """Sets the performance mode for the device to its default mode."""
-    if not self._device.HasRoot():
-      return
-    product_model = self._device.product_model
-    if 'Nexus 5' == product_model:
-      if self._AllCpusAreOnline():
-        self._SetScalingMaxFreq(2265600)
-        self._SetMaxGpuClock(450000000)
-
-    governor_mode = {
-        'GT-I9300': 'pegasusq',
-        'Galaxy Nexus': 'interactive',
-        'Nexus 4': 'ondemand',
-        'Nexus 5': 'ondemand',
-        'Nexus 7': 'interactive',
-        'Nexus 10': 'interactive'
-    }.get(product_model, 'ondemand')
-    self.SetScalingGovernor(governor_mode)
-    self._ForceAllCpusOnline(False)
-
-  def GetCpuInfo(self):
-    online = (output.rstrip() == '1' and status == 0
-              for (_, output, status) in self._ForEachCpu('cat "$CPU/online"'))
-    governor = (output.rstrip() if status == 0 else None
-                for (_, output, status)
-                in self._ForEachCpu('cat "$CPU/cpufreq/scaling_governor"'))
-    return zip(self._cpu_files, online, governor)
-
-  def _ForEachCpu(self, cmd):
-    script = '; '.join([
-        'for CPU in %s' % self._cpu_file_list,
-        'do %s' % cmd,
-        'echo -n "%~%$?%~%"',
-        'done'
-    ])
-    output = self._device.RunShellCommand(
-        script, cwd=self._CPU_PATH, check_return=True, as_root=True, shell=True)
-    output = '\n'.join(output).split('%~%')
-    return zip(self._cpu_files, output[0::2], (int(c) for c in output[1::2]))
-
-  def _WriteEachCpuFile(self, path, value):
-    self._ConditionallyWriteEachCpuFile(path, value, condition='true')
-
-  def _ConditionallyWriteEachCpuFile(self, path, value, condition):
-    template = (
-        '{condition} && test -e "$CPU/{path}" && echo {value} > "$CPU/{path}"')
-    results = self._ForEachCpu(
-        template.format(path=path, value=value, condition=condition))
-    cpus = ' '.join(cpu for (cpu, _, status) in results if status == 0)
-    if cpus:
-      logger.info('Successfully set %s to %r on: %s', path, value, cpus)
-    else:
-      logger.warning('Failed to set %s to %r on any cpus', path, value)
-
-  def _ReadEachCpuFile(self, path):
-    return self._ForEachCpu(
-        'cat "$CPU/{path}"'.format(path=path))
-
-  def SetScalingGovernor(self, value):
-    """Sets the scaling governor to the given value on all possible CPUs.
-
-    This does not attempt to set a governor to a value not reported as available
-    on the corresponding CPU.
-
-    Args:
-      value: [string] The new governor value.
-    """
-    condition = 'test -e "{path}" && grep -q {value} {path}'.format(
-        path=('${CPU}/%s' % self._AVAILABLE_GOVERNORS_REL_PATH),
-        value=value)
-    self._ConditionallyWriteEachCpuFile(
-        'cpufreq/scaling_governor', value, condition)
-
-  def GetScalingGovernor(self):
-    """Gets the currently set governor for each CPU.
-
-    Returns:
-      An iterable of 2-tuples, each containing the cpu and the current
-      governor.
-    """
-    raw = self._ReadEachCpuFile('cpufreq/scaling_governor')
-    return [
-        (cpu, raw_governor.strip() if not exit_code else None)
-        for cpu, raw_governor, exit_code in raw]
-
-  def ListAvailableGovernors(self):
-    """Returns the list of available governors for each CPU.
-
-    Returns:
-      An iterable of 2-tuples, each containing the cpu and a list of available
-      governors for that cpu.
-    """
-    return self._available_governors
-
-  def _SetScalingMaxFreq(self, value):
-    self._WriteEachCpuFile('cpufreq/scaling_max_freq', '%d' % value)
-
-  def _SetMaxGpuClock(self, value):
-    self._device.WriteFile('/sys/class/kgsl/kgsl-3d0/max_gpuclk',
-                           str(value),
-                           as_root=True)
-
-  def _AllCpusAreOnline(self):
-    results = self._ForEachCpu('cat "$CPU/online"')
-    # TODO(epenner): Investigate why file may be missing
-    # (http://crbug.com/397118)
-    return all(output.rstrip() == '1' and status == 0
-               for (cpu, output, status) in results
-               if cpu != 'cpu0')
-
-  def _ForceAllCpusOnline(self, force_online):
-    """Enable all CPUs on a device.
-
-    Some vendors (or only Qualcomm?) hot-plug their CPUs, which can add noise
-    to measurements:
-    - In perf, samples are only taken for the CPUs that are online when the
-      measurement is started.
-    - The scaling governor can't be set for an offline CPU and frequency scaling
-      on newly enabled CPUs adds noise to both perf and tracing measurements.
-
-    It appears Qualcomm is the only vendor that hot-plugs CPUs, and on Qualcomm
-    this is done by "mpdecision".
-
-    """
-    if self._have_mpdecision:
-      cmd = ['stop', 'mpdecision'] if force_online else ['start', 'mpdecision']
-      self._device.RunShellCommand(cmd, check_return=True, as_root=True)
-
-    if not self._have_mpdecision and not self._AllCpusAreOnline():
-      logger.warning('Unexpected cpu hot plugging detected.')
-
-    if force_online:
-      self._ForEachCpu('echo 1 > "$CPU/online"')
diff --git a/third_party/catapult/devil/devil/android/perf/perf_control_devicetest.py b/third_party/catapult/devil/devil/android/perf/perf_control_devicetest.py
deleted file mode 100644
index b645803..0000000
--- a/third_party/catapult/devil/devil/android/perf/perf_control_devicetest.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-# pylint: disable=W0212
-
-import os
-import sys
-import unittest
-
-sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
-
-from devil.android import device_test_case
-from devil.android import device_utils
-from devil.android.perf import perf_control
-
-
-class TestPerfControl(device_test_case.DeviceTestCase):
-
-  def setUp(self):
-    super(TestPerfControl, self).setUp()
-    if not os.getenv('BUILDTYPE'):
-      os.environ['BUILDTYPE'] = 'Debug'
-    self._device = device_utils.DeviceUtils(self.serial)
-
-  def testHighPerfMode(self):
-    perf = perf_control.PerfControl(self._device)
-    try:
-      perf.SetPerfProfilingMode()
-      cpu_info = perf.GetCpuInfo()
-      self.assertEquals(len(perf._cpu_files), len(cpu_info))
-      for _, online, governor in cpu_info:
-        self.assertTrue(online)
-        self.assertEquals('performance', governor)
-    finally:
-      perf.SetDefaultPerfMode()
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/android/perf/surface_stats_collector.py b/third_party/catapult/devil/devil/android/perf/surface_stats_collector.py
deleted file mode 100644
index 25079f3..0000000
--- a/third_party/catapult/devil/devil/android/perf/surface_stats_collector.py
+++ /dev/null
@@ -1,186 +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.
-
-import Queue
-import threading
-
-
-# Log marker containing SurfaceTexture timestamps.
-_SURFACE_TEXTURE_TIMESTAMPS_MESSAGE = 'SurfaceTexture update timestamps'
-_SURFACE_TEXTURE_TIMESTAMP_RE = r'\d+'
-
-
-class SurfaceStatsCollector(object):
-  """Collects surface stats for a SurfaceView from the output of SurfaceFlinger.
-
-  Args:
-    device: A DeviceUtils instance.
-  """
-
-  def __init__(self, device):
-    self._device = device
-    self._collector_thread = None
-    self._surface_before = None
-    self._get_data_event = None
-    self._data_queue = None
-    self._stop_event = None
-    self._warn_about_empty_data = True
-
-  def DisableWarningAboutEmptyData(self):
-    self._warn_about_empty_data = False
-
-  def Start(self):
-    assert not self._collector_thread
-
-    if self._ClearSurfaceFlingerLatencyData():
-      self._get_data_event = threading.Event()
-      self._stop_event = threading.Event()
-      self._data_queue = Queue.Queue()
-      self._collector_thread = threading.Thread(target=self._CollectorThread)
-      self._collector_thread.start()
-    else:
-      raise Exception('SurfaceFlinger not supported on this device.')
-
-  def Stop(self):
-    assert self._collector_thread
-    (refresh_period, timestamps) = self._GetDataFromThread()
-    if self._collector_thread:
-      self._stop_event.set()
-      self._collector_thread.join()
-      self._collector_thread = None
-    return (refresh_period, timestamps)
-
-  def _CollectorThread(self):
-    last_timestamp = 0
-    timestamps = []
-    retries = 0
-
-    while not self._stop_event.is_set():
-      self._get_data_event.wait(1)
-      try:
-        refresh_period, new_timestamps = self._GetSurfaceFlingerFrameData()
-        if refresh_period is None or timestamps is None:
-          retries += 1
-          if retries < 3:
-            continue
-          if last_timestamp:
-            # Some data has already been collected, but either the app
-            # was closed or there's no new data. Signal the main thread and
-            # wait.
-            self._data_queue.put((None, None))
-            self._stop_event.wait()
-            break
-          raise Exception('Unable to get surface flinger latency data')
-
-        timestamps += [timestamp for timestamp in new_timestamps
-                       if timestamp > last_timestamp]
-        if len(timestamps):
-          last_timestamp = timestamps[-1]
-
-        if self._get_data_event.is_set():
-          self._get_data_event.clear()
-          self._data_queue.put((refresh_period, timestamps))
-          timestamps = []
-      except Exception as e:
-        # On any error, before aborting, put the exception into _data_queue to
-        # prevent the main thread from waiting at _data_queue.get() infinitely.
-        self._data_queue.put(e)
-        raise
-
-  def _GetDataFromThread(self):
-    self._get_data_event.set()
-    ret = self._data_queue.get()
-    if isinstance(ret, Exception):
-      raise ret
-    return ret
-
-  def _ClearSurfaceFlingerLatencyData(self):
-    """Clears the SurfaceFlinger latency data.
-
-    Returns:
-      True if SurfaceFlinger latency is supported by the device, otherwise
-      False.
-    """
-    # The command returns nothing if it is supported, otherwise returns many
-    # lines of result just like 'dumpsys SurfaceFlinger'.
-    results = self._device.RunShellCommand(
-        ['dumpsys', 'SurfaceFlinger', '--latency-clear', 'SurfaceView'],
-        check_return=True)
-    return not len(results)
-
-  def GetSurfaceFlingerPid(self):
-    pids_dict = self._device.GetPids('surfaceflinger')
-    if not pids_dict:
-      raise Exception('Unable to get surface flinger process id')
-    # TODO(cataput:#3378): Do more strict checks in GetPids when possible.
-    # For now it just returns the first pid found of some matching process.
-    return pids_dict.popitem()[1][0]
-
-  def _GetSurfaceFlingerFrameData(self):
-    """Returns collected SurfaceFlinger frame timing data.
-
-    Returns:
-      A tuple containing:
-      - The display's nominal refresh period in milliseconds.
-      - A list of timestamps signifying frame presentation times in
-        milliseconds.
-      The return value may be (None, None) if there was no data collected (for
-      example, if the app was closed before the collector thread has finished).
-    """
-    # adb shell dumpsys SurfaceFlinger --latency <window name>
-    # prints some information about the last 128 frames displayed in
-    # that window.
-    # The data returned looks like this:
-    # 16954612
-    # 7657467895508   7657482691352   7657493499756
-    # 7657484466553   7657499645964   7657511077881
-    # 7657500793457   7657516600576   7657527404785
-    # (...)
-    #
-    # The first line is the refresh period (here 16.95 ms), it is followed
-    # by 128 lines w/ 3 timestamps in nanosecond each:
-    # A) when the app started to draw
-    # B) the vsync immediately preceding SF submitting the frame to the h/w
-    # C) timestamp immediately after SF submitted that frame to the h/w
-    #
-    # The difference between the 1st and 3rd timestamp is the frame-latency.
-    # An interesting data is when the frame latency crosses a refresh period
-    # boundary, this can be calculated this way:
-    #
-    # ceil((C - A) / refresh-period)
-    #
-    # (each time the number above changes, we have a "jank").
-    # If this happens a lot during an animation, the animation appears
-    # janky, even if it runs at 60 fps in average.
-    #
-    # We use the special "SurfaceView" window name because the statistics for
-    # the activity's main window are not updated when the main web content is
-    # composited into a SurfaceView.
-    results = self._device.RunShellCommand(
-        ['dumpsys', 'SurfaceFlinger', '--latency', 'SurfaceView'],
-        check_return=True)
-    if not len(results):
-      return (None, None)
-
-    timestamps = []
-    nanoseconds_per_millisecond = 1e6
-    refresh_period = long(results[0]) / nanoseconds_per_millisecond
-
-    # If a fence associated with a frame is still pending when we query the
-    # latency data, SurfaceFlinger gives the frame a timestamp of INT64_MAX.
-    # Since we only care about completed frames, we will ignore any timestamps
-    # with this value.
-    pending_fence_timestamp = (1 << 63) - 1
-
-    for line in results[1:]:
-      fields = line.split()
-      if len(fields) != 3:
-        continue
-      timestamp = long(fields[1])
-      if timestamp == pending_fence_timestamp:
-        continue
-      timestamp /= nanoseconds_per_millisecond
-      timestamps.append(timestamp)
-
-    return (refresh_period, timestamps)
diff --git a/third_party/catapult/devil/devil/android/perf/thermal_throttle.py b/third_party/catapult/devil/devil/android/perf/thermal_throttle.py
deleted file mode 100644
index 546a92e..0000000
--- a/third_party/catapult/devil/devil/android/perf/thermal_throttle.py
+++ /dev/null
@@ -1,135 +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.
-
-import logging
-
-logger = logging.getLogger(__name__)
-
-
-class OmapThrottlingDetector(object):
-  """Class to detect and track thermal throttling on an OMAP 4."""
-  OMAP_TEMP_FILE = ('/sys/devices/platform/omap/omap_temp_sensor.0/'
-                    'temperature')
-
-  @staticmethod
-  def IsSupported(device):
-    return device.FileExists(OmapThrottlingDetector.OMAP_TEMP_FILE)
-
-  def __init__(self, device):
-    self._device = device
-
-  @staticmethod
-  def BecameThrottled(log_line):
-    return 'omap_thermal_throttle' in log_line
-
-  @staticmethod
-  def BecameUnthrottled(log_line):
-    return 'omap_thermal_unthrottle' in log_line
-
-  @staticmethod
-  def GetThrottlingTemperature(log_line):
-    if 'throttle_delayed_work_fn' in log_line:
-      return float([s for s in log_line.split() if s.isdigit()][0]) / 1000.0
-
-  def GetCurrentTemperature(self):
-    tempdata = self._device.ReadFile(OmapThrottlingDetector.OMAP_TEMP_FILE)
-    return float(tempdata) / 1000.0
-
-
-class ExynosThrottlingDetector(object):
-  """Class to detect and track thermal throttling on an Exynos 5."""
-  @staticmethod
-  def IsSupported(device):
-    return device.FileExists('/sys/bus/exynos5-core')
-
-  def __init__(self, device):
-    pass
-
-  @staticmethod
-  def BecameThrottled(log_line):
-    return 'exynos_tmu: Throttling interrupt' in log_line
-
-  @staticmethod
-  def BecameUnthrottled(log_line):
-    return 'exynos_thermal_unthrottle: not throttling' in log_line
-
-  @staticmethod
-  def GetThrottlingTemperature(_log_line):
-    return None
-
-  @staticmethod
-  def GetCurrentTemperature():
-    return None
-
-
-class ThermalThrottle(object):
-  """Class to detect and track thermal throttling.
-
-  Usage:
-    Wait for IsThrottled() to be False before running test
-    After running test call HasBeenThrottled() to find out if the
-    test run was affected by thermal throttling.
-  """
-
-  def __init__(self, device):
-    self._device = device
-    self._throttled = False
-    self._detector = None
-    if OmapThrottlingDetector.IsSupported(device):
-      self._detector = OmapThrottlingDetector(device)
-    elif ExynosThrottlingDetector.IsSupported(device):
-      self._detector = ExynosThrottlingDetector(device)
-
-  def HasBeenThrottled(self):
-    """True if there has been any throttling since the last call to
-       HasBeenThrottled or IsThrottled.
-    """
-    return self._ReadLog()
-
-  def IsThrottled(self):
-    """True if currently throttled."""
-    self._ReadLog()
-    return self._throttled
-
-  def _ReadLog(self):
-    if not self._detector:
-      return False
-    has_been_throttled = False
-    serial_number = str(self._device)
-    log = self._device.RunShellCommand(
-        ['dmesg', '-c'], large_output=True, check_return=True)
-    degree_symbol = unichr(0x00B0)
-    for line in log:
-      if self._detector.BecameThrottled(line):
-        if not self._throttled:
-          logger.warning('>>> Device %s thermally throttled', serial_number)
-        self._throttled = True
-        has_been_throttled = True
-      elif self._detector.BecameUnthrottled(line):
-        if self._throttled:
-          logger.warning('>>> Device %s thermally unthrottled', serial_number)
-        self._throttled = False
-        has_been_throttled = True
-      temperature = self._detector.GetThrottlingTemperature(line)
-      if temperature is not None:
-        logger.info(u'Device %s thermally throttled at %3.1f%sC',
-                    serial_number, temperature, degree_symbol)
-
-    if logger.isEnabledFor(logging.DEBUG):
-      # Print current temperature of CPU SoC.
-      temperature = self._detector.GetCurrentTemperature()
-      if temperature is not None:
-        logger.debug(u'Current SoC temperature of %s = %3.1f%sC',
-                     serial_number, temperature, degree_symbol)
-
-      # Print temperature of battery, to give a system temperature
-      dumpsys_log = self._device.RunShellCommand(
-          ['dumpsys', 'battery'], check_return=True)
-      for line in dumpsys_log:
-        if 'temperature' in line:
-          btemp = float([s for s in line.split() if s.isdigit()][0]) / 10.0
-          logger.debug(u'Current battery temperature of %s = %3.1f%sC',
-                       serial_number, btemp, degree_symbol)
-
-    return has_been_throttled
diff --git a/third_party/catapult/devil/devil/android/ports.py b/third_party/catapult/devil/devil/android/ports.py
deleted file mode 100644
index 1d4e5f2..0000000
--- a/third_party/catapult/devil/devil/android/ports.py
+++ /dev/null
@@ -1,178 +0,0 @@
-# Copyright (c) 2012 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.
-
-"""Functions that deal with local and device ports."""
-
-import contextlib
-import fcntl
-import httplib
-import logging
-import os
-import socket
-import traceback
-
-logger = logging.getLogger(__name__)
-
-# The net test server is started from port 10201.
-_TEST_SERVER_PORT_FIRST = 10201
-_TEST_SERVER_PORT_LAST = 30000
-# A file to record next valid port of test server.
-_TEST_SERVER_PORT_FILE = '/tmp/test_server_port'
-_TEST_SERVER_PORT_LOCKFILE = '/tmp/test_server_port.lock'
-
-
-# The following two methods are used to allocate the port source for various
-# types of test servers. Because some net-related tests can be run on shards at
-# same time, it's important to have a mechanism to allocate the port
-# process-safe. In here, we implement the safe port allocation by leveraging
-# flock.
-def ResetTestServerPortAllocation():
-  """Resets the port allocation to start from TEST_SERVER_PORT_FIRST.
-
-  Returns:
-    Returns True if reset successes. Otherwise returns False.
-  """
-  try:
-    with open(_TEST_SERVER_PORT_FILE, 'w') as fp:
-      fp.write('%d' % _TEST_SERVER_PORT_FIRST)
-    return True
-  except Exception:  # pylint: disable=broad-except
-    logger.exception('Error while resetting port allocation')
-  return False
-
-
-def AllocateTestServerPort():
-  """Allocates a port incrementally.
-
-  Returns:
-    Returns a valid port which should be in between TEST_SERVER_PORT_FIRST and
-    TEST_SERVER_PORT_LAST. Returning 0 means no more valid port can be used.
-  """
-  port = 0
-  ports_tried = []
-  try:
-    fp_lock = open(_TEST_SERVER_PORT_LOCKFILE, 'w')
-    fcntl.flock(fp_lock, fcntl.LOCK_EX)
-    # Get current valid port and calculate next valid port.
-    if not os.path.exists(_TEST_SERVER_PORT_FILE):
-      ResetTestServerPortAllocation()
-    with open(_TEST_SERVER_PORT_FILE, 'r+') as fp:
-      port = int(fp.read())
-      ports_tried.append(port)
-      while not IsHostPortAvailable(port):
-        port += 1
-        ports_tried.append(port)
-      if (port > _TEST_SERVER_PORT_LAST or
-          port < _TEST_SERVER_PORT_FIRST):
-        port = 0
-      else:
-        fp.seek(0, os.SEEK_SET)
-        fp.write('%d' % (port + 1))
-  except Exception:  # pylint: disable=broad-except
-    logger.exception('Error while allocating port')
-  finally:
-    if fp_lock:
-      fcntl.flock(fp_lock, fcntl.LOCK_UN)
-      fp_lock.close()
-  if port:
-    logger.info('Allocate port %d for test server.', port)
-  else:
-    logger.error('Could not allocate port for test server. '
-                 'List of ports tried: %s', str(ports_tried))
-  return port
-
-
-def IsHostPortAvailable(host_port):
-  """Checks whether the specified host port is available.
-
-  Args:
-    host_port: Port on host to check.
-
-  Returns:
-    True if the port on host is available, otherwise returns False.
-  """
-  s = socket.socket()
-  try:
-    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-    s.bind(('', host_port))
-    s.close()
-    return True
-  except socket.error:
-    return False
-
-
-def IsDevicePortUsed(device, device_port, state=''):
-  """Checks whether the specified device port is used or not.
-
-  Args:
-    device: A DeviceUtils instance.
-    device_port: Port on device we want to check.
-    state: String of the specified state. Default is empty string, which
-           means any state.
-
-  Returns:
-    True if the port on device is already used, otherwise returns False.
-  """
-  base_urls = ('127.0.0.1:%d' % device_port, 'localhost:%d' % device_port)
-  netstat_results = device.RunShellCommand(
-      ['netstat', '-a'], check_return=True, large_output=True)
-  for single_connect in netstat_results:
-    # Column 3 is the local address which we want to check with.
-    connect_results = single_connect.split()
-    if connect_results[0] != 'tcp':
-      continue
-    if len(connect_results) < 6:
-      raise Exception('Unexpected format while parsing netstat line: ' +
-                      single_connect)
-    is_state_match = connect_results[5] == state if state else True
-    if connect_results[3] in base_urls and is_state_match:
-      return True
-  return False
-
-
-def IsHttpServerConnectable(host, port, tries=3, command='GET', path='/',
-                            expected_read='', timeout=2):
-  """Checks whether the specified http server is ready to serve request or not.
-
-  Args:
-    host: Host name of the HTTP server.
-    port: Port number of the HTTP server.
-    tries: How many times we want to test the connection. The default value is
-           3.
-    command: The http command we use to connect to HTTP server. The default
-             command is 'GET'.
-    path: The path we use when connecting to HTTP server. The default path is
-          '/'.
-    expected_read: The content we expect to read from the response. The default
-                   value is ''.
-    timeout: Timeout (in seconds) for each http connection. The default is 2s.
-
-  Returns:
-    Tuple of (connect status, client error). connect status is a boolean value
-    to indicate whether the server is connectable. client_error is the error
-    message the server returns when connect status is false.
-  """
-  assert tries >= 1
-  for i in xrange(0, tries):
-    client_error = None
-    try:
-      with contextlib.closing(httplib.HTTPConnection(
-          host, port, timeout=timeout)) as http:
-        # Output some debug information when we have tried more than 2 times.
-        http.set_debuglevel(i >= 2)
-        http.request(command, path)
-        r = http.getresponse()
-        content = r.read()
-        if r.status == 200 and r.reason == 'OK' and content == expected_read:
-          return (True, '')
-        client_error = ('Bad response: %s %s version %s\n  ' %
-                        (r.status, r.reason, r.version) +
-                        '\n  '.join([': '.join(h) for h in r.getheaders()]))
-    except (httplib.HTTPException, socket.error) as e:
-      # Probably too quick connecting: try again.
-      exception_error_msgs = traceback.format_exception_only(type(e), e)
-      if exception_error_msgs:
-        client_error = ''.join(exception_error_msgs)
-  # Only returns last client_error.
-  return (False, client_error or 'Timeout')
diff --git a/third_party/catapult/devil/devil/android/sdk/__init__.py b/third_party/catapult/devil/devil/android/sdk/__init__.py
deleted file mode 100644
index f95d3b2..0000000
--- a/third_party/catapult/devil/devil/android/sdk/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# Copyright 2015 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 package is intended for modules that are very tightly coupled to
-# tools or APIs from the Android SDK.
diff --git a/third_party/catapult/devil/devil/android/sdk/aapt.py b/third_party/catapult/devil/devil/android/sdk/aapt.py
deleted file mode 100644
index 7ae3a93..0000000
--- a/third_party/catapult/devil/devil/android/sdk/aapt.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2015 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 module wraps the Android Asset Packaging Tool."""
-
-from devil.android.sdk import build_tools
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-
-_aapt_path = lazy.WeakConstant(lambda: build_tools.GetPath('aapt'))
-
-
-def _RunAaptCmd(args):
-  """Runs an aapt command.
-
-  Args:
-    args: A list of arguments for aapt.
-
-  Returns:
-    The output of the command.
-  """
-  cmd = [_aapt_path.read()] + args
-  status, output = cmd_helper.GetCmdStatusAndOutput(cmd)
-  if status != 0:
-    raise Exception('Failed running aapt command: "%s" with output "%s".' %
-                    (' '.join(cmd), output))
-  return output
-
-
-def Dump(what, apk, assets=None):
-  """Returns the output of the aapt dump command.
-
-  Args:
-    what: What you want to dump.
-    apk: Path to apk you want to dump information for.
-    assets: List of assets in apk you want to dump information for.
-  """
-  assets = assets or []
-  if isinstance(assets, basestring):
-    assets = [assets]
-  return _RunAaptCmd(['dump', what, apk] + assets).splitlines()
diff --git a/third_party/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py b/third_party/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py
deleted file mode 100644
index cbe2a1b..0000000
--- a/third_party/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py
+++ /dev/null
@@ -1,230 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import os
-import posixpath
-import random
-import signal
-import sys
-import unittest
-
-_CATAPULT_BASE_DIR = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..', '..', '..'))
-
-sys.path.append(os.path.join(_CATAPULT_BASE_DIR, 'devil'))
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_test_case
-from devil.android.sdk import adb_wrapper
-from devil.utils import cmd_helper
-from devil.utils import timeout_retry
-
-
-_TEST_DATA_DIR = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), 'test', 'data'))
-
-
-def _hostAdbPids():
-  ps_status, ps_output = cmd_helper.GetCmdStatusAndOutput(
-      ['pgrep', '-l', 'adb'])
-  if ps_status != 0:
-    return []
-
-  pids_and_names = (line.split() for line in ps_output.splitlines())
-  return [int(pid) for pid, name in pids_and_names
-          if name == 'adb']
-
-
-class AdbCompatibilityTest(device_test_case.DeviceTestCase):
-
-  @classmethod
-  def setUpClass(cls):
-    custom_adb_path = os.environ.get('ADB_PATH')
-    custom_deps = {
-      'config_type': 'BaseConfig',
-      'dependencies': {},
-    }
-    if custom_adb_path:
-      custom_deps['dependencies']['adb'] = {
-        'file_info': {
-          devil_env.GetPlatform(): {
-            'local_paths': [custom_adb_path],
-          },
-        },
-      }
-    devil_env.config.Initialize(configs=[custom_deps])
-
-  def testStartServer(self):
-    # Manually kill off any instances of adb.
-    adb_pids = _hostAdbPids()
-    for p in adb_pids:
-      os.kill(p, signal.SIGKILL)
-
-    self.assertIsNotNone(
-        timeout_retry.WaitFor(
-            lambda: not _hostAdbPids(), wait_period=0.1, max_tries=10))
-
-    # start the adb server
-    start_server_status, _ = cmd_helper.GetCmdStatusAndOutput(
-        [adb_wrapper.AdbWrapper.GetAdbPath(), 'start-server'])
-
-    # verify that the server is now online
-    self.assertEquals(0, start_server_status)
-    self.assertIsNotNone(
-        timeout_retry.WaitFor(
-            lambda: bool(_hostAdbPids()), wait_period=0.1, max_tries=10))
-
-  def testKillServer(self):
-    adb_pids = _hostAdbPids()
-    if not adb_pids:
-      adb_wrapper.AdbWrapper.StartServer()
-
-    adb_pids = _hostAdbPids()
-    self.assertGreaterEqual(len(adb_pids), 1)
-
-    kill_server_status, _ = cmd_helper.GetCmdStatusAndOutput(
-        [adb_wrapper.AdbWrapper.GetAdbPath(), 'kill-server'])
-    self.assertEqual(0, kill_server_status)
-
-    adb_pids = _hostAdbPids()
-    self.assertEqual(0, len(adb_pids))
-
-  def testDevices(self):
-    devices = adb_wrapper.AdbWrapper.Devices()
-    self.assertNotEqual(0, len(devices), 'No devices found.')
-
-  def getTestInstance(self):
-    """Creates a real AdbWrapper instance for testing."""
-    return adb_wrapper.AdbWrapper(self.serial)
-
-  def testShell(self):
-    under_test = self.getTestInstance()
-    shell_ls_result = under_test.Shell('ls')
-    self.assertIsInstance(shell_ls_result, str)
-    self.assertTrue(bool(shell_ls_result))
-
-  def testShell_failed(self):
-    under_test = self.getTestInstance()
-    with self.assertRaises(device_errors.AdbShellCommandFailedError):
-      under_test.Shell('ls /foo/bar/baz')
-
-  def testShell_externalStorageDefined(self):
-    under_test = self.getTestInstance()
-    external_storage = under_test.Shell('echo $EXTERNAL_STORAGE')
-    self.assertIsInstance(external_storage, str)
-    self.assertTrue(posixpath.isabs(external_storage))
-
-  @contextlib.contextmanager
-  def getTestPushDestination(self, under_test):
-    """Creates a temporary directory suitable for pushing to."""
-    external_storage = under_test.Shell('echo $EXTERNAL_STORAGE').strip()
-    if not external_storage:
-      self.skipTest('External storage not available.')
-    while True:
-      random_hex = hex(random.randint(0, 2 ** 52))[2:]
-      name = 'tmp_push_test%s' % random_hex
-      path = posixpath.join(external_storage, name)
-      try:
-        under_test.Shell('ls %s' % path)
-      except device_errors.AdbShellCommandFailedError:
-        break
-    under_test.Shell('mkdir %s' % path)
-    try:
-      yield path
-    finally:
-      under_test.Shell('rm -rf %s' % path)
-
-  def testPush_fileToFile(self):
-    under_test = self.getTestInstance()
-    with self.getTestPushDestination(under_test) as push_target_directory:
-      src = os.path.join(_TEST_DATA_DIR, 'push_file.txt')
-      dest = posixpath.join(push_target_directory, 'push_file.txt')
-      with self.assertRaises(device_errors.AdbShellCommandFailedError):
-        under_test.Shell('ls %s' % dest)
-      under_test.Push(src, dest)
-      self.assertEquals(dest, under_test.Shell('ls %s' % dest).strip())
-
-  def testPush_fileToDirectory(self):
-    under_test = self.getTestInstance()
-    with self.getTestPushDestination(under_test) as push_target_directory:
-      src = os.path.join(_TEST_DATA_DIR, 'push_file.txt')
-      dest = push_target_directory
-      resulting_file = posixpath.join(dest, 'push_file.txt')
-      with self.assertRaises(device_errors.AdbShellCommandFailedError):
-        under_test.Shell('ls %s' % resulting_file)
-      under_test.Push(src, dest)
-      self.assertEquals(
-          resulting_file,
-          under_test.Shell('ls %s' % resulting_file).strip())
-
-  def testPush_directoryToDirectory(self):
-    under_test = self.getTestInstance()
-    with self.getTestPushDestination(under_test) as push_target_directory:
-      src = os.path.join(_TEST_DATA_DIR, 'push_directory')
-      dest = posixpath.join(push_target_directory, 'push_directory')
-      with self.assertRaises(device_errors.AdbShellCommandFailedError):
-        under_test.Shell('ls %s' % dest)
-      under_test.Push(src, dest)
-      self.assertEquals(
-          sorted(os.listdir(src)),
-          sorted(under_test.Shell('ls %s' % dest).strip().split()))
-
-  def testPush_directoryToExistingDirectory(self):
-    under_test = self.getTestInstance()
-    with self.getTestPushDestination(under_test) as push_target_directory:
-      src = os.path.join(_TEST_DATA_DIR, 'push_directory')
-      dest = push_target_directory
-      resulting_directory = posixpath.join(dest, 'push_directory')
-      with self.assertRaises(device_errors.AdbShellCommandFailedError):
-        under_test.Shell('ls %s' % resulting_directory)
-      under_test.Shell('mkdir %s' % resulting_directory)
-      under_test.Push(src, dest)
-      self.assertEquals(
-          sorted(os.listdir(src)),
-          sorted(under_test.Shell('ls %s' % resulting_directory).split()))
-
-  # TODO(jbudorick): Implement tests for the following:
-  # taskset -c
-  # devices [-l]
-  # pull
-  # shell
-  # ls
-  # logcat [-c] [-d] [-v] [-b]
-  # forward [--remove] [--list]
-  # jdwp
-  # install [-l] [-r] [-s] [-d]
-  # install-multiple [-l] [-r] [-s] [-d] [-p]
-  # uninstall [-k]
-  # backup -f [-apk] [-shared] [-nosystem] [-all]
-  # restore
-  # wait-for-device
-  # get-state (BROKEN IN THE M SDK)
-  # get-devpath
-  # remount
-  # reboot
-  # reboot-bootloader
-  # root
-  # emu
-
-  @classmethod
-  def tearDownClass(cls):
-    print
-    print
-    print 'tested %s' % adb_wrapper.AdbWrapper.GetAdbPath()
-    print '  %s' % adb_wrapper.AdbWrapper.Version()
-    print 'connected devices:'
-    try:
-      for d in adb_wrapper.AdbWrapper.Devices():
-        print '  %s' % d
-    except device_errors.AdbCommandFailedError:
-      print '  <failed to list devices>'
-      raise
-    finally:
-      print
-
-
-if __name__ == '__main__':
-  sys.exit(unittest.main())
diff --git a/third_party/catapult/devil/devil/android/sdk/adb_wrapper.py b/third_party/catapult/devil/devil/android/sdk/adb_wrapper.py
deleted file mode 100644
index 7f6b8d9..0000000
--- a/third_party/catapult/devil/devil/android/sdk/adb_wrapper.py
+++ /dev/null
@@ -1,917 +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 module wraps Android's adb tool.
-
-This is a thin wrapper around the adb interface. Any additional complexity
-should be delegated to a higher level (ex. DeviceUtils).
-"""
-
-import collections
-import distutils.version
-import errno
-import logging
-import os
-import posixpath
-import re
-import subprocess
-
-from devil import devil_env
-from devil.android import decorators
-from devil.android import device_errors
-from devil.utils import cmd_helper
-from devil.utils import lazy
-from devil.utils import timeout_retry
-
-with devil_env.SysPath(devil_env.DEPENDENCY_MANAGER_PATH):
-  import dependency_manager  # pylint: disable=import-error
-
-logger = logging.getLogger(__name__)
-
-
-ADB_KEYS_FILE = '/data/misc/adb/adb_keys'
-
-DEFAULT_TIMEOUT = 30
-DEFAULT_RETRIES = 2
-
-_ADB_VERSION_RE = re.compile(r'Android Debug Bridge version (\d+\.\d+\.\d+)')
-_EMULATOR_RE = re.compile(r'^emulator-[0-9]+$')
-_READY_STATE = 'device'
-_VERITY_DISABLE_RE = re.compile(r'Verity (already )?disabled')
-_VERITY_ENABLE_RE = re.compile(r'Verity (already )?enabled')
-
-
-def VerifyLocalFileExists(path):
-  """Verifies a local file exists.
-
-  Args:
-    path: Path to the local file.
-
-  Raises:
-    IOError: If the file doesn't exist.
-  """
-  if not os.path.exists(path):
-    raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), path)
-
-
-def _FindAdb():
-  try:
-    return devil_env.config.LocalPath('adb')
-  except dependency_manager.NoPathFoundError:
-    pass
-
-  try:
-    return os.path.join(devil_env.config.LocalPath('android_sdk'),
-                        'platform-tools', 'adb')
-  except dependency_manager.NoPathFoundError:
-    pass
-
-  try:
-    return devil_env.config.FetchPath('adb')
-  except dependency_manager.NoPathFoundError:
-    raise device_errors.NoAdbError()
-
-
-def _GetVersion():
-  # pylint: disable=protected-access
-  raw_version = AdbWrapper._RunAdbCmd(['version'], timeout=2, retries=0)
-  for l in raw_version.splitlines():
-    m = _ADB_VERSION_RE.search(l)
-    if m:
-      return m.group(1)
-  return None
-
-
-def _ShouldRetryAdbCmd(exc):
-  return not isinstance(exc, device_errors.NoAdbError)
-
-
-DeviceStat = collections.namedtuple('DeviceStat',
-                                    ['st_mode', 'st_size', 'st_time'])
-
-
-def _IsExtraneousLine(line, send_cmd):
-  """Determine if a line read from stdout in persistent shell is extraneous.
-
-  The results output to stdout by the persistent shell process
-  (in PersistentShell below) often include "extraneous" lines that are
-  not part of the output of the shell command. These "extraneous" lines
-  do not always appear and are of two forms: shell prompt lines and lines
-  that just duplicate what the input command was. This function
-  detects these extraneous lines. Since all these lines have the
-  original command in them, that is what it detects ror.
-
-  Args:
-      line: Output line to check.
-      send_cmd: Command that was sent to adb persistent shell.
-  """
-  return send_cmd.rstrip() in line
-
-
-class AdbWrapper(object):
-  """A wrapper around a local Android Debug Bridge executable."""
-
-  _adb_path = lazy.WeakConstant(_FindAdb)
-  _adb_version = lazy.WeakConstant(_GetVersion)
-
-  def __init__(self, device_serial):
-    """Initializes the AdbWrapper.
-
-    Args:
-      device_serial: The device serial number as a string.
-    """
-    if not device_serial:
-      raise ValueError('A device serial must be specified')
-    self._device_serial = str(device_serial)
-
-  class PersistentShell(object):
-    '''Class to use persistent shell for ADB.
-
-    This class allows a persistent ADB shell to be created, where multiple
-    commands can be passed into it. This avoids the overhead of starting
-    up a new ADB shell for each command.
-
-    Example of use:
-    with PersistentShell('123456789') as pshell:
-        pshell.RunCommand('which ls')
-        pshell.RunCommandAndClose('echo TEST')
-    '''
-    def __init__(self, serial):
-      """Initialization function:
-
-      Args:
-        serial: Serial number of device.
-      """
-      self._cmd = [AdbWrapper.GetAdbPath(), '-s', serial, 'shell']
-      self._process = None
-
-    def __enter__(self):
-      self.Start()
-      self.WaitForReady()
-      return self
-
-    def __exit__(self, exc_type, exc_value, tb):
-      self.Stop()
-
-    def Start(self):
-      """Start the shell."""
-      if self._process is not None:
-        raise RuntimeError('Persistent shell already running.')
-      self._process = subprocess.Popen(self._cmd,
-                                       stdin=subprocess.PIPE,
-                                       stdout=subprocess.PIPE,
-                                       shell=False)
-
-    def WaitForReady(self):
-      """Wait for the shell to be ready after starting.
-
-      Sends an echo command, then waits until it gets a response.
-      """
-      self._process.stdin.write('echo\n')
-      output_line = self._process.stdout.readline()
-      while output_line.rstrip() != '':
-        output_line = self._process.stdout.readline()
-
-    def RunCommand(self, command, close=False):
-      """Runs an ADB command and returns the output.
-
-      Note that there can be approximately 40 ms of additional latency
-      between sending the command and receiving the results if close=False
-      due to the use of Nagle's algorithm in the TCP socket between the
-      adb server and client. To avoid this extra latency, set close=True.
-
-      Args:
-        command: Command to send.
-      Returns:
-        The command output, given as a list of lines, and the exit code
-      """
-
-      if close:
-        def run_cmd(cmd):
-          send_cmd = '( %s ); echo $?; exit;\n' % cmd.rstrip()
-          (output, _) = self._process.communicate(send_cmd)
-          self._process = None
-          for x in output.splitlines():
-            yield x
-
-      else:
-        def run_cmd(cmd):
-          send_cmd = '( %s ); echo DONE:$?;\n' % cmd.rstrip()
-          self._process.stdin.write(send_cmd)
-          while True:
-            output_line = self._process.stdout.readline().rstrip()
-            if output_line[:5] == 'DONE:':
-              yield output_line[5:]
-              break
-            yield output_line
-
-      result = [line for line in run_cmd(command)
-                if not _IsExtraneousLine(line, command)]
-
-      return (result[:-1], int(result[-1]))
-
-    def Stop(self):
-      """Stops the ADB process if it is still running."""
-      if self._process is not None:
-        self._process.stdin.write('exit\n')
-        self._process = None
-
-  @classmethod
-  def GetAdbPath(cls):
-    return cls._adb_path.read()
-
-  @classmethod
-  def Version(cls):
-    return cls._adb_version.read()
-
-  @classmethod
-  def _BuildAdbCmd(cls, args, device_serial, cpu_affinity=None):
-    if cpu_affinity is not None:
-      cmd = ['taskset', '-c', str(cpu_affinity)]
-    else:
-      cmd = []
-    cmd.append(cls.GetAdbPath())
-    if device_serial is not None:
-      cmd.extend(['-s', device_serial])
-    cmd.extend(args)
-    return cmd
-
-  # pylint: disable=unused-argument
-  @classmethod
-  @decorators.WithTimeoutAndConditionalRetries(_ShouldRetryAdbCmd)
-  def _RunAdbCmd(cls, args, timeout=None, retries=None, device_serial=None,
-                 check_error=True, cpu_affinity=None):
-    # pylint: disable=no-member
-    try:
-      status, output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          cls._BuildAdbCmd(args, device_serial, cpu_affinity=cpu_affinity),
-          timeout_retry.CurrentTimeoutThreadGroup().GetRemainingTime())
-    except OSError as e:
-      if e.errno in (errno.ENOENT, errno.ENOEXEC):
-        raise device_errors.NoAdbError(msg=str(e))
-      else:
-        raise
-
-    if status != 0:
-      raise device_errors.AdbCommandFailedError(
-          args, output, status, device_serial)
-    # This catches some errors, including when the device drops offline;
-    # unfortunately adb is very inconsistent with error reporting so many
-    # command failures present differently.
-    if check_error and output.startswith('error:'):
-      raise device_errors.AdbCommandFailedError(args, output)
-    return output
-  # pylint: enable=unused-argument
-
-  def _RunDeviceAdbCmd(self, args, timeout, retries, check_error=True):
-    """Runs an adb command on the device associated with this object.
-
-    Args:
-      args: A list of arguments to adb.
-      timeout: Timeout in seconds.
-      retries: Number of retries.
-      check_error: Check that the command doesn't return an error message. This
-        does NOT check the exit status of shell commands.
-
-    Returns:
-      The output of the command.
-    """
-    return self._RunAdbCmd(args, timeout=timeout, retries=retries,
-                           device_serial=self._device_serial,
-                           check_error=check_error)
-
-  def _IterRunDeviceAdbCmd(self, args, iter_timeout, timeout):
-    """Runs an adb command and returns an iterator over its output lines.
-
-    Args:
-      args: A list of arguments to adb.
-      iter_timeout: Timeout for each iteration in seconds.
-      timeout: Timeout for the entire command in seconds.
-
-    Yields:
-      The output of the command line by line.
-    """
-    return cmd_helper.IterCmdOutputLines(
-        self._BuildAdbCmd(args, self._device_serial),
-        iter_timeout=iter_timeout,
-        timeout=timeout)
-
-  def __eq__(self, other):
-    """Consider instances equal if they refer to the same device.
-
-    Args:
-      other: The instance to compare equality with.
-
-    Returns:
-      True if the instances are considered equal, false otherwise.
-    """
-    return self._device_serial == str(other)
-
-  def __str__(self):
-    """The string representation of an instance.
-
-    Returns:
-      The device serial number as a string.
-    """
-    return self._device_serial
-
-  def __repr__(self):
-    return '%s(\'%s\')' % (self.__class__.__name__, self)
-
-  # pylint: disable=unused-argument
-  @classmethod
-  def IsServerOnline(cls):
-    status, output = cmd_helper.GetCmdStatusAndOutput(['pgrep', 'adb'])
-    output = [int(x) for x in output.split()]
-    logger.info('PIDs for adb found: %r', output)
-    return status == 0
-  # pylint: enable=unused-argument
-
-  @classmethod
-  def KillServer(cls, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    cls._RunAdbCmd(['kill-server'], timeout=timeout, retries=retries)
-
-  @classmethod
-  def StartServer(cls, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    # CPU affinity is used to reduce adb instability http://crbug.com/268450
-    cls._RunAdbCmd(['start-server'], timeout=timeout, retries=retries,
-                   cpu_affinity=0)
-
-  @classmethod
-  def GetDevices(cls, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """DEPRECATED. Refer to Devices(...) below."""
-    # TODO(jbudorick): Remove this function once no more clients are using it.
-    return cls.Devices(timeout=timeout, retries=retries)
-
-  @classmethod
-  def Devices(cls, desired_state=_READY_STATE, long_list=False,
-              timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Get the list of active attached devices.
-
-    Args:
-      desired_state: If not None, limit the devices returned to only those
-        in the given state.
-      long_list: Whether to use the long listing format.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Yields:
-      AdbWrapper instances.
-    """
-    lines = cls._RawDevices(long_list=long_list, timeout=timeout,
-                            retries=retries)
-    if long_list:
-      return [
-        [AdbWrapper(line[0])] + line[1:]
-        for line in lines
-        if (len(line) >= 2 and (not desired_state or line[1] == desired_state))
-      ]
-    else:
-      return [
-        AdbWrapper(line[0])
-        for line in lines
-        if (len(line) == 2 and (not desired_state or line[1] == desired_state))
-      ]
-
-  @classmethod
-  def _RawDevices(cls, long_list=False, timeout=DEFAULT_TIMEOUT,
-                  retries=DEFAULT_RETRIES):
-    cmd = ['devices']
-    if long_list:
-      cmd.append('-l')
-    output = cls._RunAdbCmd(cmd, timeout=timeout, retries=retries)
-    return [line.split() for line in output.splitlines()[1:]]
-
-  def GetDeviceSerial(self):
-    """Gets the device serial number associated with this object.
-
-    Returns:
-      Device serial number as a string.
-    """
-    return self._device_serial
-
-  def Push(self, local, remote, timeout=60 * 5, retries=DEFAULT_RETRIES):
-    """Pushes a file from the host to the device.
-
-    Args:
-      local: Path on the host filesystem.
-      remote: Path on the device filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    VerifyLocalFileExists(local)
-
-    if (distutils.version.LooseVersion(self.Version()) <
-        distutils.version.LooseVersion('1.0.36')):
-
-      # Different versions of adb handle pushing a directory to an existing
-      # directory differently.
-
-      # In the version packaged with the M SDK, 1.0.32, the following push:
-      #   foo/bar -> /sdcard/foo/bar
-      # where bar is an existing directory both on the host and the device
-      # results in the contents of bar/ on the host being pushed to bar/ on
-      # the device, i.e.
-      #   foo/bar/A -> /sdcard/foo/bar/A
-      #   foo/bar/B -> /sdcard/foo/bar/B
-      #   ... etc.
-
-      # In the version packaged with the N SDK, 1.0.36, the same push under
-      # the same conditions results in a second bar/ directory being created
-      # underneath the first bar/ directory on the device, i.e.
-      #   foo/bar/A -> /sdcard/foo/bar/bar/A
-      #   foo/bar/B -> /sdcard/foo/bar/bar/B
-      #   ... etc.
-
-      # In order to provide a consistent interface to clients, we check whether
-      # the target is an existing directory on the device and, if so, modifies
-      # the target passed to adb to emulate the behavior on 1.0.36 and above.
-
-      # Note that this behavior may have started before 1.0.36; that's simply
-      # the earliest version we've confirmed thus far.
-
-      try:
-        self.Shell('test -d %s' % remote, timeout=timeout, retries=retries)
-        remote = posixpath.join(remote, posixpath.basename(local))
-      except device_errors.AdbShellCommandFailedError:
-        # The target directory doesn't exist on the device, so we can use it
-        # without modification.
-        pass
-
-    self._RunDeviceAdbCmd(['push', local, remote], timeout, retries)
-
-  def Pull(self, remote, local, timeout=60 * 5, retries=DEFAULT_RETRIES):
-    """Pulls a file from the device to the host.
-
-    Args:
-      remote: Path on the device filesystem.
-      local: Path on the host filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    cmd = ['pull', remote, local]
-    self._RunDeviceAdbCmd(cmd, timeout, retries)
-    try:
-      VerifyLocalFileExists(local)
-    except IOError:
-      raise device_errors.AdbCommandFailedError(
-          cmd,
-          'File pulled from the device did not arrive on the host: %s' % local,
-          device_serial=str(self))
-
-  def Shell(self, command, expect_status=0, timeout=DEFAULT_TIMEOUT,
-            retries=DEFAULT_RETRIES):
-    """Runs a shell command on the device.
-
-    Args:
-      command: A string with the shell command to run.
-      expect_status: (optional) Check that the command's exit status matches
-        this value. Default is 0. If set to None the test is skipped.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The output of the shell command as a string.
-
-    Raises:
-      device_errors.AdbCommandFailedError: If the exit status doesn't match
-        |expect_status|.
-    """
-    if expect_status is None:
-      args = ['shell', command]
-    else:
-      args = ['shell', '( %s );echo %%$?' % command.rstrip()]
-    output = self._RunDeviceAdbCmd(args, timeout, retries, check_error=False)
-    if expect_status is not None:
-      output_end = output.rfind('%')
-      if output_end < 0:
-        # causes the status string to become empty and raise a ValueError
-        output_end = len(output)
-
-      try:
-        status = int(output[output_end + 1:])
-      except ValueError:
-        logger.warning('exit status of shell command %r missing.', command)
-        raise device_errors.AdbShellCommandFailedError(
-            command, output, status=None, device_serial=self._device_serial)
-      output = output[:output_end]
-      if status != expect_status:
-        raise device_errors.AdbShellCommandFailedError(
-            command, output, status=status, device_serial=self._device_serial)
-    return output
-
-  def IterShell(self, command, timeout):
-    """Runs a shell command and returns an iterator over its output lines.
-
-    Args:
-      command: A string with the shell command to run.
-      timeout: Timeout in seconds.
-
-    Yields:
-      The output of the command line by line.
-    """
-    args = ['shell', command]
-    return cmd_helper.IterCmdOutputLines(
-      self._BuildAdbCmd(args, self._device_serial), timeout=timeout)
-
-  def Ls(self, path, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """List the contents of a directory on the device.
-
-    Args:
-      path: Path on the device filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      A list of pairs (filename, stat) for each file found in the directory,
-      where the stat object has the properties: st_mode, st_size, and st_time.
-
-    Raises:
-      AdbCommandFailedError if |path| does not specify a valid and accessible
-          directory in the device, or the output of "adb ls" command is less
-          than four columns
-    """
-    def ParseLine(line, cmd):
-      cols = line.split(None, 3)
-      if len(cols) < 4:
-        raise device_errors.AdbCommandFailedError(
-            cmd, line, "the output should be 4 columns, but is only %d columns"
-            % len(cols), device_serial=self._device_serial)
-      filename = cols.pop()
-      stat = DeviceStat(*[int(num, base=16) for num in cols])
-      return (filename, stat)
-
-    cmd = ['ls', path]
-    lines = self._RunDeviceAdbCmd(
-        cmd, timeout=timeout, retries=retries).splitlines()
-    if lines:
-      return [ParseLine(line, cmd) for line in lines]
-    else:
-      raise device_errors.AdbCommandFailedError(
-          cmd, 'path does not specify an accessible directory in the device',
-          device_serial=self._device_serial)
-
-  def Logcat(self, clear=False, dump=False, filter_specs=None,
-             logcat_format=None, ring_buffer=None, iter_timeout=None,
-             timeout=None, retries=DEFAULT_RETRIES):
-    """Get an iterable over the logcat output.
-
-    Args:
-      clear: If true, clear the logcat.
-      dump: If true, dump the current logcat contents.
-      filter_specs: If set, a list of specs to filter the logcat.
-      logcat_format: If set, the format in which the logcat should be output.
-        Options include "brief", "process", "tag", "thread", "raw", "time",
-        "threadtime", and "long"
-      ring_buffer: If set, a list of alternate ring buffers to request.
-        Options include "main", "system", "radio", "events", "crash" or "all".
-        The default is equivalent to ["main", "system", "crash"].
-      iter_timeout: If set and neither clear nor dump is set, the number of
-        seconds to wait between iterations. If no line is found before the
-        given number of seconds elapses, the iterable will yield None.
-      timeout: (optional) If set, timeout per try in seconds. If clear or dump
-        is set, defaults to DEFAULT_TIMEOUT.
-      retries: (optional) If clear or dump is set, the number of retries to
-        attempt. Otherwise, does nothing.
-
-    Yields:
-      logcat output line by line.
-    """
-    cmd = ['logcat']
-    use_iter = True
-    if clear:
-      cmd.append('-c')
-      use_iter = False
-    if dump:
-      cmd.append('-d')
-      use_iter = False
-    if logcat_format:
-      cmd.extend(['-v', logcat_format])
-    if ring_buffer:
-      for buffer_name in ring_buffer:
-        cmd.extend(['-b', buffer_name])
-    if filter_specs:
-      cmd.extend(filter_specs)
-
-    if use_iter:
-      return self._IterRunDeviceAdbCmd(cmd, iter_timeout, timeout)
-    else:
-      timeout = timeout if timeout is not None else DEFAULT_TIMEOUT
-      return self._RunDeviceAdbCmd(cmd, timeout, retries).splitlines()
-
-  def Forward(self, local, remote, allow_rebind=False,
-              timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Forward socket connections from the local socket to the remote socket.
-
-    Sockets are specified by one of:
-      tcp:<port>
-      localabstract:<unix domain socket name>
-      localreserved:<unix domain socket name>
-      localfilesystem:<unix domain socket name>
-      dev:<character device name>
-      jdwp:<process pid> (remote only)
-
-    Args:
-      local: The host socket.
-      remote: The device socket.
-      allow_rebind: A boolean indicating whether adb may rebind a local socket;
-        otherwise, the default, an exception is raised if the local socket is
-        already being forwarded.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    cmd = ['forward']
-    if not allow_rebind:
-      cmd.append('--no-rebind')
-    cmd.extend([str(local), str(remote)])
-    self._RunDeviceAdbCmd(cmd, timeout, retries)
-
-  def ForwardRemove(self, local, timeout=DEFAULT_TIMEOUT,
-                    retries=DEFAULT_RETRIES):
-    """Remove a forward socket connection.
-
-    Args:
-      local: The host socket.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    self._RunDeviceAdbCmd(['forward', '--remove', str(local)], timeout,
-                          retries)
-
-  def ForwardList(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """List all currently forwarded socket connections.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    Returns:
-      The output of adb forward --list as a string.
-    """
-    if (distutils.version.LooseVersion(self.Version()) >=
-        distutils.version.LooseVersion('1.0.36')):
-      # Starting in 1.0.36, this can occasionally fail with a protocol fault.
-      # As this interrupts all connections with all devices, we instead just
-      # return an empty list. This may give clients an inaccurate result, but
-      # that's usually better than crashing the adb server.
-
-      # TODO(jbudorick): Determine an appropriate upper version bound for this
-      # once b/31811775 is fixed.
-      return ''
-
-    return self._RunDeviceAdbCmd(['forward', '--list'], timeout, retries)
-
-  def JDWP(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """List of PIDs of processes hosting a JDWP transport.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      A list of PIDs as strings.
-    """
-    return [a.strip() for a in
-            self._RunDeviceAdbCmd(['jdwp'], timeout, retries).split('\n')]
-
-  def Install(self, apk_path, forward_lock=False, allow_downgrade=False,
-              reinstall=False, sd_card=False, timeout=60 * 2,
-              retries=DEFAULT_RETRIES):
-    """Install an apk on the device.
-
-    Args:
-      apk_path: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      allow_downgrade: (optional) If set, allows for downgrades.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    VerifyLocalFileExists(apk_path)
-    cmd = ['install']
-    if forward_lock:
-      cmd.append('-l')
-    if reinstall:
-      cmd.append('-r')
-    if sd_card:
-      cmd.append('-s')
-    if allow_downgrade:
-      cmd.append('-d')
-    cmd.append(apk_path)
-    output = self._RunDeviceAdbCmd(cmd, timeout, retries)
-    if 'Success' not in output:
-      raise device_errors.AdbCommandFailedError(
-          cmd, output, device_serial=self._device_serial)
-
-  def InstallMultiple(self, apk_paths, forward_lock=False, reinstall=False,
-                      sd_card=False, allow_downgrade=False, partial=False,
-                      timeout=60 * 2, retries=DEFAULT_RETRIES):
-    """Install an apk with splits on the device.
-
-    Args:
-      apk_paths: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-      allow_downgrade: (optional) Allow versionCode downgrade.
-      partial: (optional) Package ID if apk_paths doesn't include all .apks.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    for path in apk_paths:
-      VerifyLocalFileExists(path)
-    cmd = ['install-multiple']
-    if forward_lock:
-      cmd.append('-l')
-    if reinstall:
-      cmd.append('-r')
-    if sd_card:
-      cmd.append('-s')
-    if allow_downgrade:
-      cmd.append('-d')
-    if partial:
-      cmd.extend(('-p', partial))
-    cmd.extend(apk_paths)
-    output = self._RunDeviceAdbCmd(cmd, timeout, retries)
-    if 'Success' not in output:
-      raise device_errors.AdbCommandFailedError(
-          cmd, output, device_serial=self._device_serial)
-
-  def Uninstall(self, package, keep_data=False, timeout=DEFAULT_TIMEOUT,
-                retries=DEFAULT_RETRIES):
-    """Remove the app |package| from the device.
-
-    Args:
-      package: The package to uninstall.
-      keep_data: (optional) If set keep the data and cache directories.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    cmd = ['uninstall']
-    if keep_data:
-      cmd.append('-k')
-    cmd.append(package)
-    output = self._RunDeviceAdbCmd(cmd, timeout, retries)
-    if 'Failure' in output or 'Exception' in output:
-      raise device_errors.AdbCommandFailedError(
-          cmd, output, device_serial=self._device_serial)
-
-  def Backup(self, path, packages=None, apk=False, shared=False,
-             nosystem=True, include_all=False, timeout=DEFAULT_TIMEOUT,
-             retries=DEFAULT_RETRIES):
-    """Write an archive of the device's data to |path|.
-
-    Args:
-      path: Local path to store the backup file.
-      packages: List of to packages to be backed up.
-      apk: (optional) If set include the .apk files in the archive.
-      shared: (optional) If set buckup the device's SD card.
-      nosystem: (optional) If set exclude system applications.
-      include_all: (optional) If set back up all installed applications and
-        |packages| is optional.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    cmd = ['backup', '-f', path]
-    if apk:
-      cmd.append('-apk')
-    if shared:
-      cmd.append('-shared')
-    if nosystem:
-      cmd.append('-nosystem')
-    if include_all:
-      cmd.append('-all')
-    if packages:
-      cmd.extend(packages)
-    assert bool(packages) ^ bool(include_all), (
-        'Provide \'packages\' or set \'include_all\' but not both.')
-    ret = self._RunDeviceAdbCmd(cmd, timeout, retries)
-    VerifyLocalFileExists(path)
-    return ret
-
-  def Restore(self, path, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Restore device contents from the backup archive.
-
-    Args:
-      path: Host path to the backup archive.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    VerifyLocalFileExists(path)
-    self._RunDeviceAdbCmd(['restore'] + [path], timeout, retries)
-
-  def WaitForDevice(self, timeout=60 * 5, retries=DEFAULT_RETRIES):
-    """Block until the device is online.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    self._RunDeviceAdbCmd(['wait-for-device'], timeout, retries)
-
-  def GetState(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Get device state.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      One of 'offline', 'bootloader', or 'device'.
-    """
-    # TODO(jbudorick): Revert to using get-state once it doesn't cause a
-    # a protocol fault.
-    # return self._RunDeviceAdbCmd(['get-state'], timeout, retries).strip()
-
-    lines = self._RawDevices(timeout=timeout, retries=retries)
-    for line in lines:
-      if len(line) >= 2 and line[0] == self._device_serial:
-        return line[1]
-    return 'offline'
-
-  def GetDevPath(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Gets the device path.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The device path (e.g. usb:3-4)
-    """
-    return self._RunDeviceAdbCmd(['get-devpath'], timeout, retries)
-
-  def Remount(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Remounts the /system partition on the device read-write."""
-    self._RunDeviceAdbCmd(['remount'], timeout, retries)
-
-  def Reboot(self, to_bootloader=False, timeout=60 * 5,
-             retries=DEFAULT_RETRIES):
-    """Reboots the device.
-
-    Args:
-      to_bootloader: (optional) If set reboots to the bootloader.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    if to_bootloader:
-      cmd = ['reboot-bootloader']
-    else:
-      cmd = ['reboot']
-    self._RunDeviceAdbCmd(cmd, timeout, retries)
-
-  def Root(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Restarts the adbd daemon with root permissions, if possible.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    output = self._RunDeviceAdbCmd(['root'], timeout, retries)
-    if 'cannot' in output:
-      raise device_errors.AdbCommandFailedError(
-          ['root'], output, device_serial=self._device_serial)
-
-  def Emu(self, cmd, timeout=DEFAULT_TIMEOUT,
-               retries=DEFAULT_RETRIES):
-    """Runs an emulator console command.
-
-    See http://developer.android.com/tools/devices/emulator.html#console
-
-    Args:
-      cmd: The command to run on the emulator console.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The output of the emulator console command.
-    """
-    if isinstance(cmd, basestring):
-      cmd = [cmd]
-    return self._RunDeviceAdbCmd(['emu'] + cmd, timeout, retries)
-
-  def DisableVerity(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Disable Marshmallow's Verity security feature"""
-    output = self._RunDeviceAdbCmd(['disable-verity'], timeout, retries)
-    if output and not _VERITY_DISABLE_RE.search(output):
-      raise device_errors.AdbCommandFailedError(
-          ['disable-verity'], output, device_serial=self._device_serial)
-
-  def EnableVerity(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Enable Marshmallow's Verity security feature"""
-    output = self._RunDeviceAdbCmd(['enable-verity'], timeout, retries)
-    if output and not _VERITY_ENABLE_RE.search(output):
-      raise device_errors.AdbCommandFailedError(
-          ['enable-verity'], output, device_serial=self._device_serial)
-
-  @property
-  def is_emulator(self):
-    return _EMULATOR_RE.match(self._device_serial)
-
-  @property
-  def is_ready(self):
-    try:
-      return self.GetState() == _READY_STATE
-    except device_errors.CommandFailedError:
-      return False
diff --git a/third_party/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py b/third_party/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py
deleted file mode 100755
index d97d56a..0000000
--- a/third_party/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/env python
-
-# 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.
-
-"""Tests for the AdbWrapper class."""
-
-import os
-import tempfile
-import time
-import unittest
-
-from devil.android import device_test_case
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-
-
-class TestAdbWrapper(device_test_case.DeviceTestCase):
-
-  def setUp(self):
-    super(TestAdbWrapper, self).setUp()
-    self._adb = adb_wrapper.AdbWrapper(self.serial)
-    self._adb.WaitForDevice()
-
-  @staticmethod
-  def _MakeTempFile(contents):
-    """Make a temporary file with the given contents.
-
-    Args:
-      contents: string to write to the temporary file.
-
-    Returns:
-      The absolute path to the file.
-    """
-    fi, path = tempfile.mkstemp()
-    with os.fdopen(fi, 'wb') as f:
-      f.write(contents)
-    return path
-
-  def testShell(self):
-    output = self._adb.Shell('echo test', expect_status=0)
-    self.assertEqual(output.strip(), 'test')
-    output = self._adb.Shell('echo test')
-    self.assertEqual(output.strip(), 'test')
-    with self.assertRaises(device_errors.AdbCommandFailedError):
-      self._adb.Shell('echo test', expect_status=1)
-
-  @unittest.skip("https://github.com/catapult-project/catapult/issues/2574")
-  def testPersistentShell(self):
-    # We need to access the device serial number here in order
-    # to create the persistent shell.
-    serial = self._adb.GetDeviceSerial() # pylint: disable=protected-access
-    with self._adb.PersistentShell(serial) as pshell:
-      (res1, code1) = pshell.RunCommand('echo TEST')
-      (res2, code2) = pshell.RunCommand('echo TEST2')
-      self.assertEqual(len(res1), 1)
-      self.assertEqual(res1[0], 'TEST')
-      self.assertEqual(res2[-1], 'TEST2')
-      self.assertEqual(code1, 0)
-      self.assertEqual(code2, 0)
-
-  def testPushLsPull(self):
-    path = self._MakeTempFile('foo')
-    device_path = '/data/local/tmp/testfile.txt'
-    local_tmpdir = os.path.dirname(path)
-    self._adb.Push(path, device_path)
-    files = dict(self._adb.Ls('/data/local/tmp'))
-    self.assertTrue('testfile.txt' in files)
-    self.assertEquals(3, files['testfile.txt'].st_size)
-    self.assertEqual(self._adb.Shell('cat %s' % device_path), 'foo')
-    self._adb.Pull(device_path, local_tmpdir)
-    with open(os.path.join(local_tmpdir, 'testfile.txt'), 'r') as f:
-      self.assertEqual(f.read(), 'foo')
-
-  def testInstall(self):
-    path = self._MakeTempFile('foo')
-    with self.assertRaises(device_errors.AdbCommandFailedError):
-      self._adb.Install(path)
-
-  def testForward(self):
-    with self.assertRaises(device_errors.AdbCommandFailedError):
-      self._adb.Forward(0, 0)
-
-  def testUninstall(self):
-    with self.assertRaises(device_errors.AdbCommandFailedError):
-      self._adb.Uninstall('some.nonexistant.package')
-
-  def testRebootWaitForDevice(self):
-    self._adb.Reboot()
-    print 'waiting for device to reboot...'
-    while self._adb.GetState() == 'device':
-      time.sleep(1)
-    self._adb.WaitForDevice()
-    self.assertEqual(self._adb.GetState(), 'device')
-    print 'waiting for package manager...'
-    while True:
-      try:
-        android_path = self._adb.Shell('pm path android')
-      except device_errors.AdbShellCommandFailedError:
-        android_path = None
-      if android_path and 'package:' in android_path:
-        break
-      time.sleep(1)
-
-  def testRootRemount(self):
-    self._adb.Root()
-    while True:
-      try:
-        self._adb.Shell('start')
-        break
-      except device_errors.AdbCommandFailedError:
-        time.sleep(1)
-    self._adb.Remount()
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/android/sdk/adb_wrapper_test.py b/third_party/catapult/devil/devil/android/sdk/adb_wrapper_test.py
deleted file mode 100755
index ef08661..0000000
--- a/third_party/catapult/devil/devil/android/sdk/adb_wrapper_test.py
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Unit tests for some APIs with conditional logic in adb_wrapper.py
-"""
-
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class AdbWrapperTest(unittest.TestCase):
-  def setUp(self):
-    self.adb = adb_wrapper.AdbWrapper('ABC12345678')
-
-  def _MockRunDeviceAdbCmd(self, return_value):
-    return mock.patch.object(
-        self.adb,
-        '_RunDeviceAdbCmd',
-        mock.Mock(side_effect=None, return_value=return_value))
-
-  def testDisableVerityWhenDisabled(self):
-    with self._MockRunDeviceAdbCmd('Verity already disabled on /system'):
-      self.adb.DisableVerity()
-
-  def testDisableVerityWhenEnabled(self):
-    with self._MockRunDeviceAdbCmd(
-        'Verity disabled on /system\nNow reboot your device for settings to '
-        'take effect'):
-      self.adb.DisableVerity()
-
-  def testEnableVerityWhenEnabled(self):
-    with self._MockRunDeviceAdbCmd('Verity already enabled on /system'):
-      self.adb.EnableVerity()
-
-  def testEnableVerityWhenDisabled(self):
-    with self._MockRunDeviceAdbCmd(
-        'Verity enabled on /system\nNow reboot your device for settings to '
-        'take effect'):
-      self.adb.EnableVerity()
-
-  def testFailEnableVerity(self):
-    with self._MockRunDeviceAdbCmd('error: closed'):
-      self.assertRaises(
-          device_errors.AdbCommandFailedError, self.adb.EnableVerity)
-
-  def testFailDisableVerity(self):
-    with self._MockRunDeviceAdbCmd('error: closed'):
-      self.assertRaises(
-          device_errors.AdbCommandFailedError, self.adb.DisableVerity)
-
diff --git a/third_party/catapult/devil/devil/android/sdk/build_tools.py b/third_party/catapult/devil/devil/android/sdk/build_tools.py
deleted file mode 100644
index 99083d9..0000000
--- a/third_party/catapult/devil/devil/android/sdk/build_tools.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 2015 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.
-
-import os
-
-from devil import devil_env
-from devil.utils import lazy
-
-with devil_env.SysPath(devil_env.DEPENDENCY_MANAGER_PATH):
-  import dependency_manager  # pylint: disable=import-error
-
-
-def GetPath(build_tool):
-  try:
-    return devil_env.config.LocalPath(build_tool)
-  except dependency_manager.NoPathFoundError:
-    pass
-
-  try:
-    return _PathInLocalSdk(build_tool)
-  except dependency_manager.NoPathFoundError:
-    pass
-
-  return devil_env.config.FetchPath(build_tool)
-
-
-def _PathInLocalSdk(build_tool):
-  build_tools_path = _build_tools_path.read()
-  return (os.path.join(build_tools_path, build_tool) if build_tools_path
-          else None)
-
-
-def _FindBuildTools():
-  android_sdk_path = devil_env.config.LocalPath('android_sdk')
-  if not android_sdk_path:
-    return None
-
-  build_tools_contents = os.listdir(
-      os.path.join(android_sdk_path, 'build-tools'))
-
-  if not build_tools_contents:
-    return None
-  else:
-    if len(build_tools_contents) > 1:
-      build_tools_contents.sort()
-    return os.path.join(android_sdk_path, 'build-tools',
-                        build_tools_contents[-1])
-
-
-_build_tools_path = lazy.WeakConstant(_FindBuildTools)
diff --git a/third_party/catapult/devil/devil/android/sdk/dexdump.py b/third_party/catapult/devil/devil/android/sdk/dexdump.py
deleted file mode 100644
index 992366e..0000000
--- a/third_party/catapult/devil/devil/android/sdk/dexdump.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2015 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.
-
-from devil.android.sdk import build_tools
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-
-_dexdump_path = lazy.WeakConstant(lambda: build_tools.GetPath('dexdump'))
-
-
-def DexDump(dexfiles, file_summary=False):
-  """A wrapper around the Android SDK's dexdump tool.
-
-  Args:
-    dexfiles: The dexfile or list of dex files to dump.
-    file_summary: Display summary information from the file header. (-f)
-
-  Returns:
-    An iterable over the output lines.
-  """
-  # TODO(jbudorick): Add support for more options as necessary.
-  if isinstance(dexfiles, basestring):
-    dexfiles = [dexfiles]
-  args = [_dexdump_path.read()] + dexfiles
-  if file_summary:
-    args.append('-f')
-
-  return cmd_helper.IterCmdOutputLines(args)
-
diff --git a/third_party/catapult/devil/devil/android/sdk/fastboot.py b/third_party/catapult/devil/devil/android/sdk/fastboot.py
deleted file mode 100644
index d7f9f62..0000000
--- a/third_party/catapult/devil/devil/android/sdk/fastboot.py
+++ /dev/null
@@ -1,98 +0,0 @@
-# Copyright 2015 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 module wraps Android's fastboot tool.
-
-This is a thin wrapper around the fastboot interface. Any additional complexity
-should be delegated to a higher level (ex. FastbootUtils).
-"""
-# pylint: disable=unused-argument
-
-from devil import devil_env
-from devil.android import decorators
-from devil.android import device_errors
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-_FLASH_TIMEOUT = _DEFAULT_TIMEOUT * 10
-
-
-class Fastboot(object):
-
-  _fastboot_path = lazy.WeakConstant(
-      lambda: devil_env.config.FetchPath('fastboot'))
-
-  def __init__(self, device_serial, default_timeout=_DEFAULT_TIMEOUT,
-               default_retries=_DEFAULT_RETRIES):
-    """Initializes the FastbootWrapper.
-
-    Args:
-      device_serial: The device serial number as a string.
-    """
-    if not device_serial:
-      raise ValueError('A device serial must be specified')
-    self._device_serial = str(device_serial)
-    self._default_timeout = default_timeout
-    self._default_retries = default_retries
-
-  def _RunFastbootCommand(self, cmd):
-    """Run a command line command using the fastboot android tool.
-
-    Args:
-      cmd: Command to run. Must be list of args, the first one being the command
-
-    Returns:
-      output of command.
-
-    Raises:
-      TypeError: If cmd is not of type list.
-    """
-    if type(cmd) == list:
-      cmd = [self._fastboot_path.read(), '-s', self._device_serial] + cmd
-    else:
-      raise TypeError(
-          'Command for _RunFastbootCommand must be a list.')
-    status, output = cmd_helper.GetCmdStatusAndOutput(cmd)
-    if int(status) != 0:
-      raise device_errors.FastbootCommandFailedError(
-          cmd, output, status, self._device_serial)
-    return output
-
-  @decorators.WithTimeoutAndRetriesDefaults(_FLASH_TIMEOUT, 0)
-  def Flash(self, partition, image, timeout=None, retries=None):
-    """Flash partition with img.
-
-    Args:
-      partition: Partition to be flashed.
-      image: location of image to flash with.
-    """
-    self._RunFastbootCommand(['flash', partition, image])
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def Devices(self, timeout=None, retries=None):
-    """Outputs list of devices in fastboot mode."""
-    output = self._RunFastbootCommand(['devices'])
-    return [line.split()[0] for line in output.splitlines()]
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def RebootBootloader(self, timeout=None, retries=None):
-    """Reboot from fastboot, into fastboot."""
-    self._RunFastbootCommand(['reboot-bootloader'])
-
-  @decorators.WithTimeoutAndRetriesDefaults(_FLASH_TIMEOUT, 0)
-  def Reboot(self, timeout=None, retries=None):
-    """Reboot from fastboot to normal usage"""
-    self._RunFastbootCommand(['reboot'])
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetOemOffModeCharge(self, value, timeout=None, retries=None):
-    """Sets off mode charging
-
-    Args:
-      value: boolean value to set off-mode-charging on or off.
-    """
-    self._RunFastbootCommand(
-        ['oem', 'off-mode-charge', str(int(value))])
diff --git a/third_party/catapult/devil/devil/android/sdk/gce_adb_wrapper.py b/third_party/catapult/devil/devil/android/sdk/gce_adb_wrapper.py
deleted file mode 100644
index 71600f4..0000000
--- a/third_party/catapult/devil/devil/android/sdk/gce_adb_wrapper.py
+++ /dev/null
@@ -1,154 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Provides a work around for various adb commands on android gce instances.
-
-Some adb commands don't work well when the device is a cloud vm, namely
-'push' and 'pull'. With gce instances, moving files through adb can be
-painfully slow and hit timeouts, so the methods here just use scp instead.
-"""
-# pylint: disable=unused-argument
-
-import logging
-import os
-import subprocess
-
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-from devil.utils import cmd_helper
-
-logger = logging.getLogger(__name__)
-
-
-class GceAdbWrapper(adb_wrapper.AdbWrapper):
-
-  def __init__(self, device_serial):
-    super(GceAdbWrapper, self).__init__(device_serial)
-    self._Connect()
-    self.Root()
-    self._instance_ip = self.Shell('getprop net.gce.ip').strip()
-
-  def _Connect(self, timeout=adb_wrapper.DEFAULT_TIMEOUT,
-               retries=adb_wrapper.DEFAULT_RETRIES):
-    """Connects ADB to the android gce instance."""
-    cmd = ['connect', self._device_serial]
-    output = self._RunAdbCmd(cmd, timeout=timeout, retries=retries)
-    if 'unable to connect' in output:
-      raise device_errors.AdbCommandFailedError(cmd, output)
-    self.WaitForDevice()
-
-  # override
-  def Root(self, **kwargs):
-    super(GceAdbWrapper, self).Root()
-    self._Connect()
-
-  # override
-  def Push(self, local, remote, **kwargs):
-    """Pushes an object from the host to the gce instance.
-
-    Args:
-      local: Path on the host filesystem.
-      remote: Path on the instance filesystem.
-    """
-    adb_wrapper.VerifyLocalFileExists(local)
-    if os.path.isdir(local):
-      self.Shell('mkdir -p %s' % cmd_helper.SingleQuote(remote))
-
-      # When the object to be pushed is a directory, adb merges the source dir
-      # with the destination dir. So if local is a dir, just scp its contents.
-      for f in os.listdir(local):
-        self._PushObject(os.path.join(local, f), os.path.join(remote, f))
-        self.Shell('chmod 777 %s' %
-                   cmd_helper.SingleQuote(os.path.join(remote, f)))
-    else:
-      parent_dir = remote[0:remote.rfind('/')]
-      if parent_dir:
-        self.Shell('mkdir -p %s' % cmd_helper.SingleQuote(parent_dir))
-      self._PushObject(local, remote)
-      self.Shell('chmod 777 %s' % cmd_helper.SingleQuote(remote))
-
-  def _PushObject(self, local, remote):
-    """Copies an object from the host to the gce instance using scp.
-
-    Args:
-      local: Path on the host filesystem.
-      remote: Path on the instance filesystem.
-    """
-    cmd = [
-        'scp',
-        '-r',
-        '-o', 'UserKnownHostsFile=/dev/null',
-        '-o', 'StrictHostKeyChecking=no',
-        local,
-        'root@%s:%s' % (self._instance_ip, remote)
-    ]
-    status, _ = cmd_helper.GetCmdStatusAndOutput(cmd)
-    if status:
-      raise device_errors.AdbCommandFailedError(
-          cmd, 'File not reachable on host: %s' % local,
-          device_serial=str(self))
-
-  # override
-  def Pull(self, remote, local, **kwargs):
-    """Pulls a file from the gce instance to the host.
-
-    Args:
-      remote: Path on the instance filesystem.
-      local: Path on the host filesystem.
-    """
-    cmd = [
-        'scp',
-        '-p',
-        '-r',
-        '-o', 'UserKnownHostsFile=/dev/null',
-        '-o', 'StrictHostKeyChecking=no',
-        'root@%s:%s' % (self._instance_ip, remote),
-        local,
-    ]
-    status, _ = cmd_helper.GetCmdStatusAndOutput(cmd)
-    if status:
-      raise device_errors.AdbCommandFailedError(
-          cmd, 'File not reachable on host: %s' % local,
-          device_serial=str(self))
-
-    try:
-      adb_wrapper.VerifyLocalFileExists(local)
-    except (subprocess.CalledProcessError, IOError):
-      logger.exception('Error when pulling files from android instance.')
-      raise device_errors.AdbCommandFailedError(
-          cmd, 'File not reachable on host: %s' % local,
-          device_serial=str(self))
-
-  # override
-  def Install(self, apk_path, forward_lock=False, reinstall=False,
-              sd_card=False, **kwargs):
-    """Installs an apk on the gce instance
-
-    Args:
-      apk_path: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-    """
-    adb_wrapper.VerifyLocalFileExists(apk_path)
-    cmd = ['install']
-    if forward_lock:
-      cmd.append('-l')
-    if reinstall:
-      cmd.append('-r')
-    if sd_card:
-      cmd.append('-s')
-    self.Push(apk_path, '/data/local/tmp/tmp.apk')
-    cmd = ['pm'] + cmd
-    cmd.append('/data/local/tmp/tmp.apk')
-    output = self.Shell(' '.join(cmd))
-    self.Shell('rm /data/local/tmp/tmp.apk')
-    if 'Success' not in output:
-      raise device_errors.AdbCommandFailedError(
-          cmd, output, device_serial=self._device_serial)
-
-  # override
-  @property
-  def is_emulator(self):
-    return True
diff --git a/third_party/catapult/devil/devil/android/sdk/intent.py b/third_party/catapult/devil/devil/android/sdk/intent.py
deleted file mode 100644
index cdefb46..0000000
--- a/third_party/catapult/devil/devil/android/sdk/intent.py
+++ /dev/null
@@ -1,129 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Manages intents and associated information.
-
-This is generally intended to be used with functions that calls Android's
-Am command.
-"""
-
-# Some common flag constants that can be used to construct intents.
-# Full list: http://developer.android.com/reference/android/content/Intent.html
-FLAG_ACTIVITY_CLEAR_TASK = 0x00008000
-FLAG_ACTIVITY_CLEAR_TOP = 0x04000000
-FLAG_ACTIVITY_NEW_TASK = 0x10000000
-FLAG_ACTIVITY_REORDER_TO_FRONT = 0x00020000
-FLAG_ACTIVITY_RESET_TASK_IF_NEEDED = 0x00200000
-
-
-def _bitwise_or(flags):
-  result = 0
-  for flag in flags:
-    result |= flag
-  return result
-
-
-class Intent(object):
-
-  def __init__(self, action='android.intent.action.VIEW', activity=None,
-               category=None, component=None, data=None, extras=None,
-               flags=None, package=None):
-    """Creates an Intent.
-
-    Args:
-      action: A string containing the action.
-      activity: A string that, with |package|, can be used to specify the
-                component.
-      category: A string or list containing any categories.
-      component: A string that specifies the component to send the intent to.
-      data: A string containing a data URI.
-      extras: A dict containing extra parameters to be passed along with the
-              intent.
-      flags: A sequence of flag constants to be passed with the intent.
-      package: A string that, with activity, can be used to specify the
-               component.
-    """
-    self._action = action
-    self._activity = activity
-    if isinstance(category, list) or category is None:
-      self._category = category
-    else:
-      self._category = [category]
-    self._component = component
-    self._data = data
-    self._extras = extras
-    self._flags = '0x%0.8x' % _bitwise_or(flags) if flags else None
-    self._package = package
-
-    if self._component and '/' in component:
-      self._package, self._activity = component.split('/', 1)
-    elif self._package and self._activity:
-      self._component = '%s/%s' % (package, activity)
-
-  @property
-  def action(self):
-    return self._action
-
-  @property
-  def activity(self):
-    return self._activity
-
-  @property
-  def category(self):
-    return self._category
-
-  @property
-  def component(self):
-    return self._component
-
-  @property
-  def data(self):
-    return self._data
-
-  @property
-  def extras(self):
-    return self._extras
-
-  @property
-  def flags(self):
-    return self._flags
-
-  @property
-  def package(self):
-    return self._package
-
-  @property
-  def am_args(self):
-    """Returns the intent as a list of arguments for the activity manager.
-
-    For details refer to the specification at:
-    - http://developer.android.com/tools/help/adb.html#IntentSpec
-    """
-    args = []
-    if self.action:
-      args.extend(['-a', self.action])
-    if self.data:
-      args.extend(['-d', self.data])
-    if self.category:
-      args.extend(arg for cat in self.category for arg in ('-c', cat))
-    if self.component:
-      args.extend(['-n', self.component])
-    if self.flags:
-      args.extend(['-f', self.flags])
-    if self.extras:
-      for key, value in self.extras.iteritems():
-        if value is None:
-          args.extend(['--esn', key])
-        elif isinstance(value, str):
-          args.extend(['--es', key, value])
-        elif isinstance(value, bool):
-          args.extend(['--ez', key, str(value)])
-        elif isinstance(value, int):
-          args.extend(['--ei', key, str(value)])
-        elif isinstance(value, float):
-          args.extend(['--ef', key, str(value)])
-        else:
-          raise NotImplementedError(
-              'Intent does not know how to pass %s extras' % type(value))
-    return args
diff --git a/third_party/catapult/devil/devil/android/sdk/keyevent.py b/third_party/catapult/devil/devil/android/sdk/keyevent.py
deleted file mode 100644
index 657dc96..0000000
--- a/third_party/catapult/devil/devil/android/sdk/keyevent.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright 2015 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.
-
-"""Android KeyEvent constants.
-
-http://developer.android.com/reference/android/view/KeyEvent.html
-"""
-
-KEYCODE_BACK = 4
-
-KEYCODE_0 = 7
-KEYCODE_1 = 8
-KEYCODE_2 = 9
-KEYCODE_3 = 10
-KEYCODE_4 = 11
-KEYCODE_5 = 12
-KEYCODE_6 = 13
-KEYCODE_7 = 14
-KEYCODE_8 = 15
-KEYCODE_9 = 16
-
-KEYCODE_DPAD_RIGHT = 22
-
-KEYCODE_POWER = 26
-
-KEYCODE_A = 29
-KEYCODE_B = 30
-KEYCODE_C = 31
-KEYCODE_D = 32
-KEYCODE_E = 33
-KEYCODE_F = 34
-KEYCODE_G = 35
-KEYCODE_H = 36
-KEYCODE_I = 37
-KEYCODE_J = 38
-KEYCODE_K = 39
-KEYCODE_L = 40
-KEYCODE_M = 41
-KEYCODE_N = 42
-KEYCODE_O = 43
-KEYCODE_P = 44
-KEYCODE_Q = 45
-KEYCODE_R = 46
-KEYCODE_S = 47
-KEYCODE_T = 48
-KEYCODE_U = 49
-KEYCODE_V = 50
-KEYCODE_W = 51
-KEYCODE_X = 52
-KEYCODE_Y = 53
-KEYCODE_Z = 54
-
-KEYCODE_PERIOD = 56
-
-KEYCODE_SPACE = 62
-
-KEYCODE_ENTER = 66
-KEYCODE_DEL = 67
-
-KEYCODE_MENU = 82
-
-KEYCODE_APP_SWITCH = 187
diff --git a/third_party/catapult/devil/devil/android/sdk/shared_prefs.py b/third_party/catapult/devil/devil/android/sdk/shared_prefs.py
deleted file mode 100644
index 2fa2e6a..0000000
--- a/third_party/catapult/devil/devil/android/sdk/shared_prefs.py
+++ /dev/null
@@ -1,420 +0,0 @@
-# Copyright 2015 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.
-
-"""Helper object to read and modify Shared Preferences from Android apps.
-
-See e.g.:
-  http://developer.android.com/reference/android/content/SharedPreferences.html
-"""
-
-import logging
-import posixpath
-
-from devil.android import device_errors
-from devil.android.sdk import version_codes
-from xml.etree import ElementTree
-
-logger = logging.getLogger(__name__)
-
-
-_XML_DECLARATION = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
-
-
-class BasePref(object):
-  """Base class for getting/setting the value of a specific preference type.
-
-  Should not be instantiated directly. The SharedPrefs collection will
-  instantiate the appropriate subclasses, which directly manipulate the
-  underlying xml document, to parse and serialize values according to their
-  type.
-
-  Args:
-    elem: An xml ElementTree object holding the preference data.
-
-  Properties:
-    tag_name: A string with the tag that must be used for this preference type.
-  """
-  tag_name = None
-
-  def __init__(self, elem):
-    if elem.tag != type(self).tag_name:
-      raise TypeError('Property %r has type %r, but trying to access as %r' %
-                      (elem.get('name'), elem.tag, type(self).tag_name))
-    self._elem = elem
-
-  def __str__(self):
-    """Get the underlying xml element as a string."""
-    return ElementTree.tostring(self._elem)
-
-  def get(self):
-    """Get the value of this preference."""
-    return self._elem.get('value')
-
-  def set(self, value):
-    """Set from a value casted as a string."""
-    self._elem.set('value', str(value))
-
-  @property
-  def has_value(self):
-    """Check whether the element has a value."""
-    return self._elem.get('value') is not None
-
-
-class BooleanPref(BasePref):
-  """Class for getting/setting a preference with a boolean value.
-
-  The underlying xml element has the form, e.g.:
-      <boolean name="featureEnabled" value="false" />
-  """
-  tag_name = 'boolean'
-  VALUES = {'true': True, 'false': False}
-
-  def get(self):
-    """Get the value as a Python bool."""
-    return type(self).VALUES[super(BooleanPref, self).get()]
-
-  def set(self, value):
-    """Set from a value casted as a bool."""
-    super(BooleanPref, self).set('true' if value else 'false')
-
-
-class FloatPref(BasePref):
-  """Class for getting/setting a preference with a float value.
-
-  The underlying xml element has the form, e.g.:
-      <float name="someMetric" value="4.7" />
-  """
-  tag_name = 'float'
-
-  def get(self):
-    """Get the value as a Python float."""
-    return float(super(FloatPref, self).get())
-
-
-class IntPref(BasePref):
-  """Class for getting/setting a preference with an int value.
-
-  The underlying xml element has the form, e.g.:
-      <int name="aCounter" value="1234" />
-  """
-  tag_name = 'int'
-
-  def get(self):
-    """Get the value as a Python int."""
-    return int(super(IntPref, self).get())
-
-
-class LongPref(IntPref):
-  """Class for getting/setting a preference with a long value.
-
-  The underlying xml element has the form, e.g.:
-      <long name="aLongCounter" value="1234" />
-
-  We use the same implementation from IntPref.
-  """
-  tag_name = 'long'
-
-
-class StringPref(BasePref):
-  """Class for getting/setting a preference with a string value.
-
-  The underlying xml element has the form, e.g.:
-      <string name="someHashValue">249b3e5af13d4db2</string>
-  """
-  tag_name = 'string'
-
-  def get(self):
-    """Get the value as a Python string."""
-    return self._elem.text
-
-  def set(self, value):
-    """Set from a value casted as a string."""
-    self._elem.text = str(value)
-
-
-class StringSetPref(StringPref):
-  """Class for getting/setting a preference with a set of string values.
-
-  The underlying xml element has the form, e.g.:
-      <set name="managed_apps">
-          <string>com.mine.app1</string>
-          <string>com.mine.app2</string>
-          <string>com.mine.app3</string>
-      </set>
-  """
-  tag_name = 'set'
-
-  def get(self):
-    """Get a list with the string values contained."""
-    value = []
-    for child in self._elem:
-      assert child.tag == 'string'
-      value.append(child.text)
-    return value
-
-  def set(self, value):
-    """Set from a sequence of values, each casted as a string."""
-    for child in list(self._elem):
-      self._elem.remove(child)
-    for item in value:
-      ElementTree.SubElement(self._elem, 'string').text = str(item)
-
-
-_PREF_TYPES = {c.tag_name: c for c in [BooleanPref, FloatPref, IntPref,
-                                       LongPref, StringPref, StringSetPref]}
-
-
-class SharedPrefs(object):
-
-  def __init__(self, device, package, filename):
-    """Helper object to read and update "Shared Prefs" of Android apps.
-
-    Such files typically look like, e.g.:
-
-        <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
-        <map>
-          <int name="databaseVersion" value="107" />
-          <boolean name="featureEnabled" value="false" />
-          <string name="someHashValue">249b3e5af13d4db2</string>
-        </map>
-
-    Example usage:
-
-        prefs = shared_prefs.SharedPrefs(device, 'com.my.app', 'my_prefs.xml')
-        prefs.Load()
-        prefs.GetString('someHashValue') # => '249b3e5af13d4db2'
-        prefs.SetInt('databaseVersion', 42)
-        prefs.Remove('featureEnabled')
-        prefs.Commit()
-
-    The object may also be used as a context manager to automatically load and
-    commit, respectively, upon entering and leaving the context.
-
-    Args:
-      device: A DeviceUtils object.
-      package: A string with the package name of the app that owns the shared
-        preferences file.
-      filename: A string with the name of the preferences file to read/write.
-    """
-    self._device = device
-    self._xml = None
-    self._package = package
-    self._filename = filename
-    self._path = '/data/data/%s/shared_prefs/%s' % (package, filename)
-    self._changed = False
-
-  def __repr__(self):
-    """Get a useful printable representation of the object."""
-    return '<{cls} file {filename} for {package} on {device}>'.format(
-      cls=type(self).__name__, filename=self.filename, package=self.package,
-      device=str(self._device))
-
-  def __str__(self):
-    """Get the underlying xml document as a string."""
-    return _XML_DECLARATION + ElementTree.tostring(self.xml)
-
-  @property
-  def package(self):
-    """Get the package name of the app that owns the shared preferences."""
-    return self._package
-
-  @property
-  def filename(self):
-    """Get the filename of the shared preferences file."""
-    return self._filename
-
-  @property
-  def path(self):
-    """Get the full path to the shared preferences file on the device."""
-    return self._path
-
-  @property
-  def changed(self):
-    """True if properties have changed and a commit would be needed."""
-    return self._changed
-
-  @property
-  def xml(self):
-    """Get the underlying xml document as an ElementTree object."""
-    if self._xml is None:
-      self._xml = ElementTree.Element('map')
-    return self._xml
-
-  def Load(self):
-    """Load the shared preferences file from the device.
-
-    A empty xml document, which may be modified and saved on |commit|, is
-    created if the file does not already exist.
-    """
-    if self._device.FileExists(self.path):
-      self._xml = ElementTree.fromstring(
-          self._device.ReadFile(self.path, as_root=True))
-      assert self._xml.tag == 'map'
-    else:
-      self._xml = None
-    self._changed = False
-
-  def Clear(self):
-    """Clear all of the preferences contained in this object."""
-    if self._xml is not None and len(self):  # only clear if not already empty
-      self._xml = None
-      self._changed = True
-
-  def Commit(self):
-    """Save the current set of preferences to the device.
-
-    Only actually saves if some preferences have been modified.
-    """
-    if not self.changed:
-      return
-    self._device.RunShellCommand(
-        ['mkdir', '-p', posixpath.dirname(self.path)],
-        as_root=True, check_return=True)
-    self._device.WriteFile(self.path, str(self), as_root=True)
-    # Creating the directory/file can cause issues with SELinux if they did
-    # not already exist. As a workaround, apply the package's security context
-    # to the shared_prefs directory, which mimics the behavior of a file
-    # created by the app itself
-    if self._device.build_version_sdk >= version_codes.MARSHMALLOW:
-      security_context = self._GetSecurityContext(self.package)
-      if security_context == None:
-        raise device_errors.CommandFailedError(
-            'Failed to get security context for %s' % self.package)
-      self._device.RunShellCommand(
-          ['chcon', '-R', security_context,
-           '/data/data/%s/shared_prefs' % self.package],
-          as_root=True, check_return=True)
-    self._device.KillAll(self.package, exact=True, as_root=True, quiet=True)
-    self._changed = False
-
-  def __len__(self):
-    """Get the number of preferences in this collection."""
-    return len(self.xml)
-
-  def PropertyType(self, key):
-    """Get the type (i.e. tag name) of a property in the collection."""
-    return self._GetChild(key).tag
-
-  def HasProperty(self, key):
-    try:
-      self._GetChild(key)
-      return True
-    except KeyError:
-      return False
-
-  def GetBoolean(self, key):
-    """Get a boolean property."""
-    return BooleanPref(self._GetChild(key)).get()
-
-  def SetBoolean(self, key, value):
-    """Set a boolean property."""
-    self._SetPrefValue(key, value, BooleanPref)
-
-  def GetFloat(self, key):
-    """Get a float property."""
-    return FloatPref(self._GetChild(key)).get()
-
-  def SetFloat(self, key, value):
-    """Set a float property."""
-    self._SetPrefValue(key, value, FloatPref)
-
-  def GetInt(self, key):
-    """Get an int property."""
-    return IntPref(self._GetChild(key)).get()
-
-  def SetInt(self, key, value):
-    """Set an int property."""
-    self._SetPrefValue(key, value, IntPref)
-
-  def GetLong(self, key):
-    """Get a long property."""
-    return LongPref(self._GetChild(key)).get()
-
-  def SetLong(self, key, value):
-    """Set a long property."""
-    self._SetPrefValue(key, value, LongPref)
-
-  def GetString(self, key):
-    """Get a string property."""
-    return StringPref(self._GetChild(key)).get()
-
-  def SetString(self, key, value):
-    """Set a string property."""
-    self._SetPrefValue(key, value, StringPref)
-
-  def GetStringSet(self, key):
-    """Get a string set property."""
-    return StringSetPref(self._GetChild(key)).get()
-
-  def SetStringSet(self, key, value):
-    """Set a string set property."""
-    self._SetPrefValue(key, value, StringSetPref)
-
-  def Remove(self, key):
-    """Remove a preference from the collection."""
-    self.xml.remove(self._GetChild(key))
-
-  def AsDict(self):
-    """Return the properties and their values as a dictionary."""
-    d = {}
-    for child in self.xml:
-      pref = _PREF_TYPES[child.tag](child)
-      d[child.get('name')] = pref.get()
-    return d
-
-  def __enter__(self):
-    """Load preferences file from the device when entering a context."""
-    self.Load()
-    return self
-
-  def __exit__(self, exc_type, _exc_value, _traceback):
-    """Save preferences file to the device when leaving a context."""
-    if not exc_type:
-      self.Commit()
-
-  def _GetChild(self, key):
-    """Get the underlying xml node that holds the property of a given key.
-
-    Raises:
-      KeyError when the key is not found in the collection.
-    """
-    for child in self.xml:
-      if child.get('name') == key:
-        return child
-    raise KeyError(key)
-
-  def _SetPrefValue(self, key, value, pref_cls):
-    """Set the value of a property.
-
-    Args:
-      key: The key of the property to set.
-      value: The new value of the property.
-      pref_cls: A subclass of BasePref used to access the property.
-
-    Raises:
-      TypeError when the key already exists but with a different type.
-    """
-    try:
-      pref = pref_cls(self._GetChild(key))
-      old_value = pref.get()
-    except KeyError:
-      pref = pref_cls(ElementTree.SubElement(
-          self.xml, pref_cls.tag_name, {'name': key}))
-      old_value = None
-    if old_value != value:
-      pref.set(value)
-      self._changed = True
-      logger.info('Setting property: %s', pref)
-
-  def _GetSecurityContext(self, package):
-    for line in self._device.RunShellCommand(['ls', '-Z', '/data/data/'],
-                                             as_root=True, check_return=True):
-      split_line = line.split()
-      # ls -Z output differs between Android versions, but the package is
-      # always last and the context always starts with "u:object"
-      if split_line[-1] == package:
-        for column in split_line:
-          if column.startswith('u:object'):
-            return column
-    return None
diff --git a/third_party/catapult/devil/devil/android/sdk/shared_prefs_test.py b/third_party/catapult/devil/devil/android/sdk/shared_prefs_test.py
deleted file mode 100755
index 4c31c56..0000000
--- a/third_party/catapult/devil/devil/android/sdk/shared_prefs_test.py
+++ /dev/null
@@ -1,171 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-"""
-Unit tests for the contents of shared_prefs.py (mostly SharedPrefs).
-"""
-
-import logging
-import unittest
-
-from devil import devil_env
-from devil.android import device_utils
-from devil.android.sdk import shared_prefs
-from devil.android.sdk import version_codes
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-def MockDeviceWithFiles(files=None):
-  if files is None:
-    files = {}
-
-  def file_exists(path):
-    return path in files
-
-  def write_file(path, contents, **_kwargs):
-    files[path] = contents
-
-  def read_file(path, **_kwargs):
-    return files[path]
-
-  device = mock.MagicMock(spec=device_utils.DeviceUtils)
-  device.FileExists = mock.Mock(side_effect=file_exists)
-  device.WriteFile = mock.Mock(side_effect=write_file)
-  device.ReadFile = mock.Mock(side_effect=read_file)
-  return device
-
-
-class SharedPrefsTest(unittest.TestCase):
-
-  def setUp(self):
-    self.device = MockDeviceWithFiles({
-      '/data/data/com.some.package/shared_prefs/prefs.xml':
-          "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
-          '<map>\n'
-          '  <int name="databaseVersion" value="107" />\n'
-          '  <boolean name="featureEnabled" value="false" />\n'
-          '  <string name="someHashValue">249b3e5af13d4db2</string>\n'
-          '</map>'})
-    self.expected_data = {'databaseVersion': 107,
-                          'featureEnabled': False,
-                          'someHashValue': '249b3e5af13d4db2'}
-
-  def testPropertyLifetime(self):
-    prefs = shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml')
-    self.assertEquals(len(prefs), 0)  # collection is empty before loading
-    prefs.SetInt('myValue', 444)
-    self.assertEquals(len(prefs), 1)
-    self.assertEquals(prefs.GetInt('myValue'), 444)
-    self.assertTrue(prefs.HasProperty('myValue'))
-    prefs.Remove('myValue')
-    self.assertEquals(len(prefs), 0)
-    self.assertFalse(prefs.HasProperty('myValue'))
-    with self.assertRaises(KeyError):
-      prefs.GetInt('myValue')
-
-  def testPropertyType(self):
-    prefs = shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml')
-    prefs.SetInt('myValue', 444)
-    self.assertEquals(prefs.PropertyType('myValue'), 'int')
-    with self.assertRaises(TypeError):
-      prefs.GetString('myValue')
-    with self.assertRaises(TypeError):
-      prefs.SetString('myValue', 'hello')
-
-  def testLoad(self):
-    prefs = shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml')
-    self.assertEquals(len(prefs), 0)  # collection is empty before loading
-    prefs.Load()
-    self.assertEquals(len(prefs), len(self.expected_data))
-    self.assertEquals(prefs.AsDict(), self.expected_data)
-    self.assertFalse(prefs.changed)
-
-  def testClear(self):
-    prefs = shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml')
-    prefs.Load()
-    self.assertEquals(prefs.AsDict(), self.expected_data)
-    self.assertFalse(prefs.changed)
-    prefs.Clear()
-    self.assertEquals(len(prefs), 0)  # collection is empty now
-    self.assertTrue(prefs.changed)
-
-  def testCommit(self):
-    type(self.device).build_version_sdk = mock.PropertyMock(
-        return_value=version_codes.LOLLIPOP_MR1)
-    prefs = shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'other_prefs.xml')
-    self.assertFalse(self.device.FileExists(prefs.path))  # file does not exist
-    prefs.Load()
-    self.assertEquals(len(prefs), 0)  # file did not exist, collection is empty
-    prefs.SetInt('magicNumber', 42)
-    prefs.SetFloat('myMetric', 3.14)
-    prefs.SetLong('bigNumner', 6000000000)
-    prefs.SetStringSet('apps', ['gmail', 'chrome', 'music'])
-    self.assertFalse(self.device.FileExists(prefs.path))  # still does not exist
-    self.assertTrue(prefs.changed)
-    prefs.Commit()
-    self.assertTrue(self.device.FileExists(prefs.path))  # should exist now
-    self.device.KillAll.assert_called_once_with(prefs.package, exact=True,
-                                                as_root=True, quiet=True)
-    self.assertFalse(prefs.changed)
-
-    prefs = shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'other_prefs.xml')
-    self.assertEquals(len(prefs), 0)  # collection is empty before loading
-    prefs.Load()
-    self.assertEquals(prefs.AsDict(), {
-        'magicNumber': 42,
-        'myMetric': 3.14,
-        'bigNumner': 6000000000,
-        'apps': ['gmail', 'chrome', 'music']})  # data survived roundtrip
-
-  def testAsContextManager_onlyReads(self):
-    with shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml') as prefs:
-      self.assertEquals(prefs.AsDict(), self.expected_data)  # loaded and ready
-    self.assertEquals(self.device.WriteFile.call_args_list, [])  # did not write
-
-  def testAsContextManager_readAndWrite(self):
-    type(self.device).build_version_sdk = mock.PropertyMock(
-        return_value=version_codes.LOLLIPOP_MR1)
-    with shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml') as prefs:
-      prefs.SetBoolean('featureEnabled', True)
-      prefs.Remove('someHashValue')
-      prefs.SetString('newString', 'hello')
-
-    self.assertTrue(self.device.WriteFile.called)  # did write
-    with shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml') as prefs:
-      # changes persisted
-      self.assertTrue(prefs.GetBoolean('featureEnabled'))
-      self.assertFalse(prefs.HasProperty('someHashValue'))
-      self.assertEquals(prefs.GetString('newString'), 'hello')
-      self.assertTrue(prefs.HasProperty('databaseVersion'))  # still there
-
-  def testAsContextManager_commitAborted(self):
-    with self.assertRaises(TypeError):
-      with shared_prefs.SharedPrefs(
-          self.device, 'com.some.package', 'prefs.xml') as prefs:
-        prefs.SetBoolean('featureEnabled', True)
-        prefs.Remove('someHashValue')
-        prefs.SetString('newString', 'hello')
-        prefs.SetInt('newString', 123)  # oops!
-
-    self.assertEquals(self.device.WriteFile.call_args_list, [])  # did not write
-    with shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml') as prefs:
-      # contents were not modified
-      self.assertEquals(prefs.AsDict(), self.expected_data)
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/android/sdk/split_select.py b/third_party/catapult/devil/devil/android/sdk/split_select.py
deleted file mode 100644
index 6c3d231..0000000
--- a/third_party/catapult/devil/devil/android/sdk/split_select.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright 2015 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 module wraps Android's split-select tool."""
-
-from devil.android.sdk import build_tools
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-
-_split_select_path = lazy.WeakConstant(
-    lambda: build_tools.GetPath('split-select'))
-
-
-def _RunSplitSelectCmd(args):
-  """Runs a split-select command.
-
-  Args:
-    args: A list of arguments for split-select.
-
-  Returns:
-    The output of the command.
-  """
-  cmd = [_split_select_path.read()] + args
-  status, output = cmd_helper.GetCmdStatusAndOutput(cmd)
-  if status != 0:
-    raise Exception('Failed running command "%s" with output "%s".' %
-                    (' '.join(cmd), output))
-  return output
-
-
-def _SplitConfig(device, allow_cached_props=False):
-  """Returns a config specifying which APK splits are required by the device.
-
-  Args:
-    device: A DeviceUtils object.
-    allow_cached_props: Whether to use cached values for device properties.
-  """
-  return ('%s-r%s-%s:%s' %
-          (device.GetLanguage(cache=allow_cached_props),
-           device.GetCountry(cache=allow_cached_props),
-           device.screen_density,
-           device.product_cpu_abi))
-
-
-def SelectSplits(device, base_apk, split_apks, allow_cached_props=False):
-  """Determines which APK splits the device requires.
-
-  Args:
-    device: A DeviceUtils object.
-    base_apk: The path of the base APK.
-    split_apks: A list of paths of APK splits.
-    allow_cached_props: Whether to use cached values for device properties.
-
-  Returns:
-    The list of APK splits that the device requires.
-  """
-  config = _SplitConfig(device, allow_cached_props=allow_cached_props)
-  args = ['--target', config, '--base', base_apk]
-  for split in split_apks:
-    args.extend(['--split', split])
-  return _RunSplitSelectCmd(args).splitlines()
diff --git a/third_party/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt b/third_party/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt
deleted file mode 100644
index 573df2e..0000000
--- a/third_party/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt
+++ /dev/null
@@ -1 +0,0 @@
-Goodnight, moon.
diff --git a/third_party/catapult/devil/devil/android/sdk/test/data/push_file.txt b/third_party/catapult/devil/devil/android/sdk/test/data/push_file.txt
deleted file mode 100644
index af5626b..0000000
--- a/third_party/catapult/devil/devil/android/sdk/test/data/push_file.txt
+++ /dev/null
@@ -1 +0,0 @@
-Hello, world!
diff --git a/third_party/catapult/devil/devil/android/sdk/version_codes.py b/third_party/catapult/devil/devil/android/sdk/version_codes.py
deleted file mode 100644
index 3f03cba..0000000
--- a/third_party/catapult/devil/devil/android/sdk/version_codes.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2015 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.
-
-"""Android SDK version codes.
-
-http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
-"""
-
-JELLY_BEAN = 16
-JELLY_BEAN_MR1 = 17
-JELLY_BEAN_MR2 = 18
-KITKAT = 19
-KITKAT_WATCH = 20
-LOLLIPOP = 21
-LOLLIPOP_MR1 = 22
-MARSHMALLOW = 23
-NOUGAT = 24
-NOUGAT_MR1 = 25
-
diff --git a/third_party/catapult/devil/devil/android/settings.py b/third_party/catapult/devil/devil/android/settings.py
deleted file mode 100644
index 886b266..0000000
--- a/third_party/catapult/devil/devil/android/settings.py
+++ /dev/null
@@ -1,273 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-
-logger = logging.getLogger(__name__)
-
-_LOCK_SCREEN_SETTINGS_PATH = '/data/system/locksettings.db'
-_ALTERNATE_LOCK_SCREEN_SETTINGS_PATH = (
-    '/data/data/com.android.providers.settings/databases/settings.db')
-PASSWORD_QUALITY_UNSPECIFIED = '0'
-_COMPATIBLE_BUILD_TYPES = ['userdebug', 'eng']
-
-
-ENABLE_LOCATION_SETTINGS = [
-  # Note that setting these in this order is required in order for all of
-  # them to take and stick through a reboot.
-  ('com.google.settings/partner', [
-    ('use_location_for_services', 1),
-  ]),
-  ('settings/secure', [
-    # Ensure Geolocation is enabled and allowed for tests.
-    ('location_providers_allowed', 'gps,network'),
-  ]),
-  ('com.google.settings/partner', [
-    ('network_location_opt_in', 1),
-  ])
-]
-
-DISABLE_LOCATION_SETTINGS = [
-  ('com.google.settings/partner', [
-    ('use_location_for_services', 0),
-  ]),
-  ('settings/secure', [
-    # Ensure Geolocation is disabled.
-    ('location_providers_allowed', ''),
-  ]),
-]
-
-ENABLE_MOCK_LOCATION_SETTINGS = [
-  ('settings/secure', [
-    ('mock_location', 1),
-  ]),
-]
-
-DISABLE_MOCK_LOCATION_SETTINGS = [
-  ('settings/secure', [
-    ('mock_location', 0),
-  ]),
-]
-
-DETERMINISTIC_DEVICE_SETTINGS = [
-  ('settings/global', [
-    ('assisted_gps_enabled', 0),
-
-    # Disable "auto time" and "auto time zone" to avoid network-provided time
-    # to overwrite the device's datetime and timezone synchronized from host
-    # when running tests later. See b/6569849.
-    ('auto_time', 0),
-    ('auto_time_zone', 0),
-
-    ('development_settings_enabled', 1),
-
-    # Flag for allowing ActivityManagerService to send ACTION_APP_ERROR intents
-    # on application crashes and ANRs. If this is disabled, the crash/ANR dialog
-    # will never display the "Report" button.
-    # Type: int ( 0 = disallow, 1 = allow )
-    ('send_action_app_error', 0),
-
-    ('stay_on_while_plugged_in', 3),
-
-    ('verifier_verify_adb_installs', 0),
-  ]),
-  ('settings/secure', [
-    ('allowed_geolocation_origins',
-        'http://www.google.co.uk http://www.google.com'),
-
-    # Ensure that we never get random dialogs like "Unfortunately the process
-    # android.process.acore has stopped", which steal the focus, and make our
-    # automation fail (because the dialog steals the focus then mistakenly
-    # receives the injected user input events).
-    ('anr_show_background', 0),
-
-    ('lockscreen.disabled', 1),
-
-    ('screensaver_enabled', 0),
-
-    ('skip_first_use_hints', 1),
-  ]),
-  ('settings/system', [
-    # Don't want devices to accidentally rotate the screen as that could
-    # affect performance measurements.
-    ('accelerometer_rotation', 0),
-
-    ('lockscreen.disabled', 1),
-
-    # Turn down brightness and disable auto-adjust so that devices run cooler.
-    ('screen_brightness', 5),
-    ('screen_brightness_mode', 0),
-
-    ('user_rotation', 0),
-  ]),
-]
-
-NETWORK_DISABLED_SETTINGS = [
-  ('settings/global', [
-    ('airplane_mode_on', 1),
-    ('wifi_on', 0),
-  ]),
-]
-
-
-class ContentSettings(dict):
-
-  """A dict interface to interact with device content settings.
-
-  System properties are key/value pairs as exposed by adb shell content.
-  """
-
-  def __init__(self, table, device):
-    super(ContentSettings, self).__init__()
-    self._table = table
-    self._device = device
-
-  @staticmethod
-  def _GetTypeBinding(value):
-    if isinstance(value, bool):
-      return 'b'
-    if isinstance(value, float):
-      return 'f'
-    if isinstance(value, int):
-      return 'i'
-    if isinstance(value, long):
-      return 'l'
-    if isinstance(value, str):
-      return 's'
-    raise ValueError('Unsupported type %s' % type(value))
-
-  def iteritems(self):
-    # Example row:
-    # 'Row: 0 _id=13, name=logging_id2, value=-1fccbaa546705b05'
-    for row in self._device.RunShellCommand(
-        ['content', 'query', '--uri', 'content://%s' % self._table],
-        check_return=True, as_root=True):
-      fields = row.split(', ')
-      key = None
-      value = None
-      for field in fields:
-        k, _, v = field.partition('=')
-        if k == 'name':
-          key = v
-        elif k == 'value':
-          value = v
-      if not key:
-        continue
-      if not value:
-        value = ''
-      yield key, value
-
-  def __getitem__(self, key):
-    return self._device.RunShellCommand(
-        ['content', 'query', '--uri', 'content://%s' % self._table,
-         '--where', "name='%s'" % key],
-        check_return=True, as_root=True).strip()
-
-  def __setitem__(self, key, value):
-    if key in self:
-      self._device.RunShellCommand(
-          ['content', 'update', '--uri', 'content://%s' % self._table,
-           '--bind', 'value:%s:%s' % (self._GetTypeBinding(value), value),
-           '--where', "name='%s'" % key],
-          check_return=True, as_root=True)
-    else:
-      self._device.RunShellCommand(
-          ['content', 'insert', '--uri', 'content://%s' % self._table,
-           '--bind', 'name:%s:%s' % (self._GetTypeBinding(key), key),
-           '--bind', 'value:%s:%s' % (self._GetTypeBinding(value), value)],
-          check_return=True, as_root=True)
-
-  def __delitem__(self, key):
-    self._device.RunShellCommand(
-        ['content', 'delete', '--uri', 'content://%s' % self._table,
-         '--bind', 'name:%s:%s' % (self._GetTypeBinding(key), key)],
-        check_return=True, as_root=True)
-
-
-def ConfigureContentSettings(device, desired_settings):
-  """Configures device content setings from a list.
-
-  Many settings are documented at:
-    http://developer.android.com/reference/android/provider/Settings.Global.html
-    http://developer.android.com/reference/android/provider/Settings.Secure.html
-    http://developer.android.com/reference/android/provider/Settings.System.html
-
-  Many others are undocumented.
-
-  Args:
-    device: A DeviceUtils instance for the device to configure.
-    desired_settings: A list of (table, [(key: value), ...]) for all
-        settings to configure.
-  """
-  for table, key_value in desired_settings:
-    settings = ContentSettings(table, device)
-    for key, value in key_value:
-      settings[key] = value
-    logger.info('\n%s %s', table, (80 - len(table)) * '-')
-    for key, value in sorted(settings.iteritems()):
-      logger.info('\t%s: %s', key, value)
-
-
-def SetLockScreenSettings(device):
-  """Sets lock screen settings on the device.
-
-  On certain device/Android configurations we need to disable the lock screen in
-  a different database. Additionally, the password type must be set to
-  DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED.
-  Lock screen settings are stored in sqlite on the device in:
-      /data/system/locksettings.db
-
-  IMPORTANT: The first column is used as a primary key so that all rows with the
-  same value for that column are removed from the table prior to inserting the
-  new values.
-
-  Args:
-    device: A DeviceUtils instance for the device to configure.
-
-  Raises:
-    Exception if the setting was not properly set.
-  """
-  if device.build_type not in _COMPATIBLE_BUILD_TYPES:
-    logger.warning('Unable to disable lockscreen on %s builds.',
-                   device.build_type)
-    return
-
-  def get_lock_settings(table):
-    return [(table, 'lockscreen.disabled', '1'),
-            (table, 'lockscreen.password_type', PASSWORD_QUALITY_UNSPECIFIED),
-            (table, 'lockscreen.password_type_alternate',
-             PASSWORD_QUALITY_UNSPECIFIED)]
-
-  if device.FileExists(_LOCK_SCREEN_SETTINGS_PATH):
-    db = _LOCK_SCREEN_SETTINGS_PATH
-    locksettings = get_lock_settings('locksettings')
-    columns = ['name', 'user', 'value']
-    generate_values = lambda k, v: [k, '0', v]
-  elif device.FileExists(_ALTERNATE_LOCK_SCREEN_SETTINGS_PATH):
-    db = _ALTERNATE_LOCK_SCREEN_SETTINGS_PATH
-    locksettings = get_lock_settings('secure') + get_lock_settings('system')
-    columns = ['name', 'value']
-    generate_values = lambda k, v: [k, v]
-  else:
-    logger.warning('Unable to find database file to set lock screen settings.')
-    return
-
-  for table, key, value in locksettings:
-    # Set the lockscreen setting for default user '0'
-    values = generate_values(key, value)
-
-    cmd = """begin transaction;
-delete from '%(table)s' where %(primary_key)s='%(primary_value)s';
-insert into '%(table)s' (%(columns)s) values (%(values)s);
-commit transaction;""" % {
-      'table': table,
-      'primary_key': columns[0],
-      'primary_value': values[0],
-      'columns': ', '.join(columns),
-      'values': ', '.join(["'%s'" % value for value in values])
-    }
-    output_msg = device.RunShellCommand(
-        ['sqlite3', db, cmd], check_return=True, as_root=True)
-    if output_msg:
-      logger.info(' '.join(output_msg))
diff --git a/third_party/catapult/devil/devil/android/tools/__init__.py b/third_party/catapult/devil/devil/android/tools/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/third_party/catapult/devil/devil/android/tools/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2015 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.
diff --git a/third_party/catapult/devil/devil/android/tools/adb_run_shell_cmd.py b/third_party/catapult/devil/devil/android/tools/adb_run_shell_cmd.py
deleted file mode 100755
index 77b67e8..0000000
--- a/third_party/catapult/devil/devil/android/tools/adb_run_shell_cmd.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-import argparse
-import json
-import os
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-
-from devil.android import device_blacklist
-from devil.android import device_utils
-from devil.utils import run_tests_helper
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      'Run an adb shell command on selected devices')
-  parser.add_argument('cmd', help='Adb shell command to run.', nargs="+")
-  parser.add_argument('-d', '--device', action='append', dest='devices',
-                      default=[],
-                      help='Device to run cmd on. Runs on all devices if not '
-                           'specified. Set multiple times for multiple devices')
-  parser.add_argument('-v', '--verbose', default=0, action='count',
-                      help='Verbose level (multiple times for more)')
-  parser.add_argument('--blacklist-file', help='Device blacklist file.')
-  parser.add_argument('--as-root', action='store_true', help='Run as root.')
-  parser.add_argument('--json-output',
-                      help='File to dump json output to.')
-  args = parser.parse_args()
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  args.blacklist_file = device_blacklist.Blacklist(
-      args.blacklist_file) if args.blacklist_file else None
-  devices = device_utils.DeviceUtils.HealthyDevices(
-      blacklist=args.blacklist_file, device_arg=args.devices)
-
-  p_out = (device_utils.DeviceUtils.parallel(devices).RunShellCommand(
-      args.cmd, large_output=True, as_root=args.as_root, check_return=True)
-      .pGet(None))
-
-  data = {}
-  for device, output in zip(devices, p_out):
-    for line in output:
-      print '%s: %s' % (device, line)
-    data[str(device)] = output
-
-  if args.json_output:
-    with open(args.json_output, 'w') as f:
-      json.dump(data, f)
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/android/tools/cpufreq.py b/third_party/catapult/devil/devil/android/tools/cpufreq.py
deleted file mode 100755
index 97deaf0..0000000
--- a/third_party/catapult/devil/devil/android/tools/cpufreq.py
+++ /dev/null
@@ -1,87 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""A script to manipulate device CPU frequency."""
-
-import argparse
-import os
-import pprint
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import device_utils
-from devil.android.perf import perf_control
-from devil.utils import run_tests_helper
-
-
-def SetScalingGovernor(device, args):
-  p = perf_control.PerfControl(device)
-  p.SetScalingGovernor(args.governor)
-
-
-def GetScalingGovernor(device, _args):
-  p = perf_control.PerfControl(device)
-  for cpu, governor in p.GetScalingGovernor():
-    print '%s %s: %s' % (str(device), cpu, governor)
-
-
-def ListAvailableGovernors(device, _args):
-  p = perf_control.PerfControl(device)
-  for cpu, governors in p.ListAvailableGovernors():
-    print '%s %s: %s' % (str(device), cpu, pprint.pformat(governors))
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser()
-  parser.add_argument(
-      '--adb-path',
-      help='ADB binary path.')
-  parser.add_argument(
-      '--device', dest='devices', action='append', default=[],
-      help='Devices for which the governor should be set. Defaults to all.')
-  parser.add_argument(
-      '-v', '--verbose', action='count',
-      help='Log more.')
-
-  subparsers = parser.add_subparsers()
-
-  set_governor = subparsers.add_parser('set-governor')
-  set_governor.add_argument(
-      'governor',
-      help='Desired CPU governor.')
-  set_governor.set_defaults(func=SetScalingGovernor)
-
-  get_governor = subparsers.add_parser('get-governor')
-  get_governor.set_defaults(func=GetScalingGovernor)
-
-  list_governors = subparsers.add_parser('list-governors')
-  list_governors.set_defaults(func=ListAvailableGovernors)
-
-  args = parser.parse_args(raw_args)
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem(
-            'adb', devil_env.GetPlatform(), args.adb_path))
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  devices = device_utils.DeviceUtils.HealthyDevices(device_arg=args.devices)
-
-  parallel_devices = device_utils.DeviceUtils.parallel(devices)
-  parallel_devices.pMap(args.func, args)
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/third_party/catapult/devil/devil/android/tools/device_monitor.py b/third_party/catapult/devil/devil/android/tools/device_monitor.py
deleted file mode 100755
index 49214a9..0000000
--- a/third_party/catapult/devil/devil/android/tools/device_monitor.py
+++ /dev/null
@@ -1,231 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-"""Launches a daemon to monitor android device temperatures & status.
-
-This script will repeatedly poll the given devices for their temperatures and
-status every 60 seconds and dump the stats to file on the host.
-"""
-
-import argparse
-import collections
-import json
-import logging
-import logging.handlers
-import os
-import re
-import socket
-import sys
-import time
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import battery_utils
-from devil.android import device_blacklist
-from devil.android import device_errors
-from devil.android import device_utils
-
-
-# Various names of sensors used to measure cpu temp
-CPU_TEMP_SENSORS = [
-  # most nexus devices
-  'tsens_tz_sensor0',
-  # android one
-  'mtktscpu',
-  # nexus 9
-  'CPU-therm',
-]
-
-DEVICE_FILE_VERSION = 1
-# TODO(bpastene): Remove the old file once sysmon has been updated to read the
-# new status file.
-DEVICE_FILES = [
-    os.path.join(os.path.expanduser('~'), 'android_device_status.json'),
-    os.path.join(
-        os.path.expanduser('~'), '.android',
-        '%s__android_device_status.json' % socket.gethostname().split('.')[0]
-    ),
-]
-
-MEM_INFO_REGEX = re.compile(r'.*?\:\s*(\d+)\s*kB') # ex: 'MemTotal:   185735 kB'
-
-
-def get_device_status(device):
-  """Polls the given device for various info.
-
-    Returns: A dict of the following format:
-    {
-      'battery': {
-        'level': 100,
-        'temperature': 123
-      },
-      'build': {
-        'build.id': 'ABC12D',
-        'product.device': 'chickenofthesea'
-      },
-      'mem': {
-        'avail': 1000000,
-        'total': 1234567,
-      },
-      'processes': 123,
-      'state': 'good',
-      'temp': {
-        'some_sensor': 30
-      },
-      'uptime': 1234.56,
-    }
-  """
-  status = collections.defaultdict(dict)
-
-  # Battery
-  battery = battery_utils.BatteryUtils(device)
-  battery_info = battery.GetBatteryInfo()
-  try:
-    level = int(battery_info.get('level'))
-  except (KeyError, TypeError, ValueError):
-    level = None
-  if level and level >= 0 and level <= 100:
-    status['battery']['level'] = level
-  try:
-    temperature = int(battery_info.get('temperature'))
-  except (KeyError, TypeError, ValueError):
-    temperature = None
-  if temperature:
-    status['battery']['temperature'] = temperature
-
-  # Build
-  status['build']['build.id'] = device.build_id
-  status['build']['product.device'] = device.build_product
-
-  # Memory
-  mem_info = ''
-  try:
-    mem_info = device.ReadFile('/proc/meminfo')
-  except device_errors.AdbShellCommandFailedError:
-    logging.exception('Unable to read /proc/meminfo')
-  for line in mem_info.splitlines():
-    match = MEM_INFO_REGEX.match(line)
-    if match:
-      try:
-        value = int(match.group(1))
-      except ValueError:
-        continue
-      key = line.split(':')[0].strip()
-      if 'MemTotal' == key:
-        status['mem']['total'] = value
-      elif 'MemFree' == key:
-        status['mem']['free'] = value
-
-  # Process
-  try:
-    # TODO(catapult:#3215): Migrate to device.GetPids()
-    lines = device.RunShellCommand(['ps'], check_return=True)
-    status['processes'] = len(lines) - 1 # Ignore the header row.
-  except device_errors.AdbShellCommandFailedError:
-    logging.exception('Unable to count process list.')
-
-  # CPU Temps
-  # Find a thermal sensor that matches one in CPU_TEMP_SENSORS and read its
-  # temperature.
-  files = []
-  try:
-    files = device.RunShellCommand(
-        'grep -lE "%s" /sys/class/thermal/thermal_zone*/type' % '|'.join(
-            CPU_TEMP_SENSORS), shell=True, check_return=True)
-  except device_errors.AdbShellCommandFailedError:
-    logging.exception('Unable to list thermal sensors.')
-  for f in files:
-    try:
-      sensor_name = device.ReadFile(f).strip()
-      temp = float(device.ReadFile(f[:-4] + 'temp').strip()) # s/type^/temp
-      status['temp'][sensor_name] = temp
-    except (device_errors.AdbShellCommandFailedError, ValueError):
-      logging.exception('Unable to read thermal sensor %s', f)
-
-  # Uptime
-  try:
-    uptimes = device.ReadFile('/proc/uptime').split()
-    status['uptime'] = float(uptimes[0]) # Take the first field (actual uptime)
-  except (device_errors.AdbShellCommandFailedError, ValueError):
-    logging.exception('Unable to read /proc/uptime')
-
-  status['state'] = 'available'
-  return status
-
-
-def get_all_status(blacklist):
-  status_dict = {
-      'version': DEVICE_FILE_VERSION,
-      'devices': {},
-  }
-
-  healthy_devices = device_utils.DeviceUtils.HealthyDevices(blacklist)
-  parallel_devices = device_utils.DeviceUtils.parallel(healthy_devices)
-  results = parallel_devices.pMap(get_device_status).pGet(None)
-
-  status_dict['devices'] = {
-      device.serial: result for device, result in zip(healthy_devices, results)
-  }
-
-  if blacklist:
-    for device, reason in blacklist.Read().iteritems():
-      status_dict['devices'][device] = {
-          'state': reason.get('reason', 'blacklisted')}
-
-  status_dict['timestamp'] = time.time()
-  return status_dict
-
-
-def main(argv):
-  """Launches the device monitor.
-
-  Polls the devices for their battery and cpu temperatures and scans the
-  blacklist file every 60 seconds and dumps the data to DEVICE_FILE.
-  """
-
-  parser = argparse.ArgumentParser(
-      description='Launches the device monitor.')
-  parser.add_argument('--adb-path', help='Path to adb binary.')
-  parser.add_argument('--blacklist-file', help='Path to device blacklist file.')
-  args = parser.parse_args(argv)
-
-  logger = logging.getLogger()
-  logger.setLevel(logging.DEBUG)
-  handler = logging.handlers.RotatingFileHandler(
-      '/tmp/device_monitor.log', maxBytes=10 * 1024 * 1024, backupCount=5)
-  fmt = logging.Formatter('%(asctime)s %(levelname)s %(message)s',
-                          datefmt='%y%m%d %H:%M:%S')
-  handler.setFormatter(fmt)
-  logger.addHandler(handler)
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem(
-            'adb', devil_env.GetPlatform(), args.adb_path))
-
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  blacklist = (device_blacklist.Blacklist(args.blacklist_file)
-               if args.blacklist_file else None)
-
-  logging.info('Device monitor running with pid %d, adb: %s, blacklist: %s',
-               os.getpid(), args.adb_path, args.blacklist_file)
-  while True:
-    start = time.time()
-    status_dict = get_all_status(blacklist)
-    for device_file in DEVICE_FILES:
-      with open(device_file, 'wb') as f:
-        json.dump(status_dict, f, indent=2, sort_keys=True)
-    logging.info('Got status of all devices in %.2fs.', time.time() - start)
-    time.sleep(60)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/third_party/catapult/devil/devil/android/tools/device_monitor_test.py b/third_party/catapult/devil/devil/android/tools/device_monitor_test.py
deleted file mode 100755
index e39e324..0000000
--- a/third_party/catapult/devil/devil/android/tools/device_monitor_test.py
+++ /dev/null
@@ -1,168 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-import os
-import sys
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-        os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                           '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.tools import device_monitor
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class DeviceMonitorTest(unittest.TestCase):
-
-  def setUp(self):
-    self.device = mock.Mock(spec=device_utils.DeviceUtils,
-        serial='device_cereal', build_id='abc123', build_product='clownfish')
-    self.file_contents = {
-        '/proc/meminfo': """
-                         MemTotal:        1234567 kB
-                         MemFree:         1000000 kB
-                         MemUsed:          234567 kB
-                         """,
-        '/sys/class/thermal/thermal_zone0/type': 'CPU-therm',
-        '/sys/class/thermal/thermal_zone0/temp': '30',
-        '/proc/uptime': '12345 99999',
-    }
-    self.device.ReadFile = mock.MagicMock(
-        side_effect=lambda file_name: self.file_contents[file_name])
-
-    self.cmd_outputs = {
-        'ps': ['headers', 'p1', 'p2', 'p3', 'p4', 'p5'],
-        'grep': ['/sys/class/thermal/thermal_zone0/type'],
-    }
-
-    def mock_run_shell(cmd, **_kwargs):
-      args = cmd.split() if isinstance(cmd, basestring) else cmd
-      try:
-        return self.cmd_outputs[args[0]]
-      except KeyError:
-        raise device_errors.AdbShellCommandFailedError(cmd, None, None)
-
-    self.device.RunShellCommand = mock.MagicMock(side_effect=mock_run_shell)
-
-    self.battery = mock.Mock()
-    self.battery.GetBatteryInfo = mock.MagicMock(
-        return_value={'level': '80', 'temperature': '123'})
-
-    self.expected_status = {
-      'device_cereal': {
-        'processes': 5,
-        'temp': {
-          'CPU-therm': 30.0
-         },
-         'battery': {
-           'temperature': 123,
-           'level': 80
-         },
-         'uptime': 12345.0,
-         'mem': {
-           'total': 1234567,
-           'free': 1000000
-         },
-         'build': {
-           'build.id': 'abc123',
-           'product.device': 'clownfish',
-         },
-         'state': 'available',
-      }
-    }
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStats(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(self.expected_status, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStatsNoBattery(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-    broken_battery_info = mock.Mock()
-    broken_battery_info.GetBatteryInfo = mock.MagicMock(
-        return_value={'level': '-1', 'temperature': 'not_a_number'})
-    get_battery.return_value = broken_battery_info
-
-    # Should be same status dict but without battery stats.
-    expected_status_no_battery = self.expected_status.copy()
-    expected_status_no_battery['device_cereal'].pop('battery')
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(expected_status_no_battery, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStatsNoPs(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-    del self.cmd_outputs['ps']  # Throw exception on run shell ps command.
-
-    # Should be same status dict but without process stats.
-    expected_status_no_ps = self.expected_status.copy()
-    expected_status_no_ps['device_cereal'].pop('processes')
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(expected_status_no_ps, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStatsNoSensors(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-    del self.cmd_outputs['grep']  # Throw exception on run shell grep command.
-
-    # Should be same status dict but without temp stats.
-    expected_status_no_temp = self.expected_status.copy()
-    expected_status_no_temp['device_cereal'].pop('temp')
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(expected_status_no_temp, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStatsWithBlacklist(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-    blacklist = mock.Mock()
-    blacklist.Read = mock.MagicMock(
-        return_value={'bad_device': {'reason': 'offline'}})
-
-    # Should be same status dict but with extra blacklisted device.
-    expected_status = self.expected_status.copy()
-    expected_status['bad_device'] = {'state': 'offline'}
-
-    status = device_monitor.get_all_status(blacklist)
-    self.assertEquals(expected_status, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_brokenTempValue(self, get_devices, get_battery):
-    self.file_contents['/sys/class/thermal/thermal_zone0/temp'] = 'n0t a numb3r'
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-
-    expected_status_no_temp = self.expected_status.copy()
-    expected_status_no_temp['device_cereal'].pop('temp')
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(self.expected_status, status['devices'])
-
-
-if __name__ == '__main__':
-  sys.exit(unittest.main())
diff --git a/third_party/catapult/devil/devil/android/tools/device_recovery.py b/third_party/catapult/devil/devil/android/tools/device_recovery.py
deleted file mode 100755
index 57857b1..0000000
--- a/third_party/catapult/devil/devil/android/tools/device_recovery.py
+++ /dev/null
@@ -1,208 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""A script to recover devices in a known bad state."""
-
-import argparse
-import logging
-import os
-import psutil
-import signal
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-from devil import devil_env
-from devil.android import device_blacklist
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.tools import device_status
-from devil.utils import lsusb
-# TODO(jbudorick): Resolve this after experimenting w/ disabling the USB reset.
-from devil.utils import reset_usb  # pylint: disable=unused-import
-from devil.utils import run_tests_helper
-
-logger = logging.getLogger(__name__)
-
-
-def KillAllAdb():
-  def get_all_adb():
-    for p in psutil.process_iter():
-      try:
-        if 'adb' in p.name:
-          yield p
-      except (psutil.NoSuchProcess, psutil.AccessDenied):
-        pass
-
-  for sig in [signal.SIGTERM, signal.SIGQUIT, signal.SIGKILL]:
-    for p in get_all_adb():
-      try:
-        logger.info('kill %d %d (%s [%s])', sig, p.pid, p.name,
-                    ' '.join(p.cmdline))
-        p.send_signal(sig)
-      except (psutil.NoSuchProcess, psutil.AccessDenied):
-        pass
-  for p in get_all_adb():
-    try:
-      logger.error('Unable to kill %d (%s [%s])', p.pid, p.name,
-                   ' '.join(p.cmdline))
-    except (psutil.NoSuchProcess, psutil.AccessDenied):
-      pass
-
-
-def RecoverDevice(device, blacklist, should_reboot=lambda device: True):
-  if device_status.IsBlacklisted(device.adb.GetDeviceSerial(),
-                                 blacklist):
-    logger.debug('%s is blacklisted, skipping recovery.', str(device))
-    return
-
-  if should_reboot(device):
-    try:
-      device.WaitUntilFullyBooted(retries=0)
-    except (device_errors.CommandTimeoutError,
-            device_errors.CommandFailedError):
-      logger.exception('Failure while waiting for %s. '
-                       'Attempting to recover.', str(device))
-    try:
-      try:
-        device.Reboot(block=False, timeout=5, retries=0)
-      except device_errors.CommandTimeoutError:
-        logger.warning('Timed out while attempting to reboot %s normally.'
-                       'Attempting alternative reboot.', str(device))
-        # The device drops offline before we can grab the exit code, so
-        # we don't check for status.
-        try:
-          device.adb.Root()
-        finally:
-          # We are already in a failure mode, attempt to reboot regardless of
-          # what device.adb.Root() returns. If the sysrq reboot fails an
-          # exception willbe thrown at that level.
-          device.adb.Shell('echo b > /proc/sysrq-trigger', expect_status=None,
-                           timeout=5, retries=0)
-    except device_errors.CommandFailedError:
-      logger.exception('Failed to reboot %s.', str(device))
-      if blacklist:
-        blacklist.Extend([device.adb.GetDeviceSerial()],
-                         reason='reboot_failure')
-    except device_errors.CommandTimeoutError:
-      logger.exception('Timed out while rebooting %s.', str(device))
-      if blacklist:
-        blacklist.Extend([device.adb.GetDeviceSerial()],
-                         reason='reboot_timeout')
-
-    try:
-      device.WaitUntilFullyBooted(
-          retries=0, timeout=device.REBOOT_DEFAULT_TIMEOUT)
-    except device_errors.CommandFailedError:
-      logger.exception('Failure while waiting for %s.', str(device))
-      if blacklist:
-        blacklist.Extend([device.adb.GetDeviceSerial()],
-                         reason='reboot_failure')
-    except device_errors.CommandTimeoutError:
-      logger.exception('Timed out while waiting for %s.', str(device))
-      if blacklist:
-        blacklist.Extend([device.adb.GetDeviceSerial()],
-                         reason='reboot_timeout')
-
-
-def RecoverDevices(devices, blacklist, enable_usb_reset=False):
-  """Attempts to recover any inoperable devices in the provided list.
-
-  Args:
-    devices: The list of devices to attempt to recover.
-    blacklist: The current device blacklist, which will be used then
-      reset.
-  """
-
-  statuses = device_status.DeviceStatus(devices, blacklist)
-
-  should_restart_usb = set(
-      status['serial'] for status in statuses
-      if (not status['usb_status']
-          or status['adb_status'] in ('offline', 'missing')))
-  should_restart_adb = should_restart_usb.union(set(
-      status['serial'] for status in statuses
-      if status['adb_status'] == 'unauthorized'))
-  should_reboot_device = should_restart_adb.union(set(
-      status['serial'] for status in statuses
-      if status['blacklisted']))
-
-  logger.debug('Should restart USB for:')
-  for d in should_restart_usb:
-    logger.debug('  %s', d)
-  logger.debug('Should restart ADB for:')
-  for d in should_restart_adb:
-    logger.debug('  %s', d)
-  logger.debug('Should reboot:')
-  for d in should_reboot_device:
-    logger.debug('  %s', d)
-
-  if blacklist:
-    blacklist.Reset()
-
-  if should_restart_adb:
-    KillAllAdb()
-  for serial in should_restart_usb:
-    try:
-      # TODO(crbug.com/642194): Resetting may be causing more harm
-      # (specifically, kernel panics) than it does good.
-      if enable_usb_reset:
-        reset_usb.reset_android_usb(serial)
-      else:
-        logger.warning('USB reset disabled for %s (crbug.com/642914)',
-                       serial)
-    except IOError:
-      logger.exception('Unable to reset USB for %s.', serial)
-      if blacklist:
-        blacklist.Extend([serial], reason='USB failure')
-    except device_errors.DeviceUnreachableError:
-      logger.exception('Unable to reset USB for %s.', serial)
-      if blacklist:
-        blacklist.Extend([serial], reason='offline')
-
-  device_utils.DeviceUtils.parallel(devices).pMap(
-      RecoverDevice, blacklist,
-      should_reboot=lambda device: device.serial in should_reboot_device)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--adb-path',
-                      help='Absolute path to the adb binary to use.')
-  parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
-  parser.add_argument('--known-devices-file', action='append', default=[],
-                      dest='known_devices_files',
-                      help='Path to known device lists.')
-  parser.add_argument('--enable-usb-reset', action='store_true',
-                      help='Reset USB if necessary.')
-  parser.add_argument('-v', '--verbose', action='count', default=1,
-                      help='Log more information.')
-
-  args = parser.parse_args()
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem(
-            'adb', devil_env.GetPlatform(), args.adb_path))
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  blacklist = (device_blacklist.Blacklist(args.blacklist_file)
-               if args.blacklist_file
-               else None)
-
-  expected_devices = device_status.GetExpectedDevices(args.known_devices_files)
-  usb_devices = set(lsusb.get_android_devices())
-  devices = [device_utils.DeviceUtils(s)
-             for s in expected_devices.union(usb_devices)]
-
-  RecoverDevices(devices, blacklist, enable_usb_reset=args.enable_usb_reset)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/android/tools/device_status.py b/third_party/catapult/devil/devil/android/tools/device_status.py
deleted file mode 100755
index 167d66c..0000000
--- a/third_party/catapult/devil/devil/android/tools/device_status.py
+++ /dev/null
@@ -1,313 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""A script to keep track of devices across builds and report state."""
-
-import argparse
-import json
-import logging
-import os
-import re
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-from devil import devil_env
-from devil.android import battery_utils
-from devil.android import device_blacklist
-from devil.android import device_errors
-from devil.android import device_list
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
-from devil.constants import exit_codes
-from devil.utils import lsusb
-from devil.utils import run_tests_helper
-
-logger = logging.getLogger(__name__)
-
-_RE_DEVICE_ID = re.compile(r'Device ID = (\d+)')
-
-
-def IsBlacklisted(serial, blacklist):
-  return blacklist and serial in blacklist.Read()
-
-
-def _BatteryStatus(device, blacklist):
-  battery_info = {}
-  try:
-    battery = battery_utils.BatteryUtils(device)
-    battery_info = battery.GetBatteryInfo(timeout=5)
-    battery_level = int(battery_info.get('level', 100))
-
-    if battery_level < 15:
-      logger.error('Critically low battery level (%d)', battery_level)
-      battery = battery_utils.BatteryUtils(device)
-      if not battery.GetCharging():
-        battery.SetCharging(True)
-      if blacklist:
-        blacklist.Extend([device.adb.GetDeviceSerial()], reason='low_battery')
-
-  except device_errors.CommandFailedError:
-    logger.exception('Failed to get battery information for %s',
-                     str(device))
-
-  return battery_info
-
-
-def _IMEISlice(device):
-  imei_slice = ''
-  try:
-    for l in device.RunShellCommand(['dumpsys', 'iphonesubinfo'],
-                                    check_return=True, timeout=5):
-      m = _RE_DEVICE_ID.match(l)
-      if m:
-        imei_slice = m.group(1)[-6:]
-  except device_errors.CommandFailedError:
-    logger.exception('Failed to get IMEI slice for %s', str(device))
-
-  return imei_slice
-
-
-def DeviceStatus(devices, blacklist):
-  """Generates status information for the given devices.
-
-  Args:
-    devices: The devices to generate status for.
-    blacklist: The current device blacklist.
-  Returns:
-    A dict of the following form:
-    {
-      '<serial>': {
-        'serial': '<serial>',
-        'adb_status': str,
-        'usb_status': bool,
-        'blacklisted': bool,
-        # only if the device is connected and not blacklisted
-        'type': ro.build.product,
-        'build': ro.build.id,
-        'build_detail': ro.build.fingerprint,
-        'battery': {
-          ...
-        },
-        'imei_slice': str,
-        'wifi_ip': str,
-      },
-      ...
-    }
-  """
-  adb_devices = {
-    a[0].GetDeviceSerial(): a
-    for a in adb_wrapper.AdbWrapper.Devices(desired_state=None, long_list=True)
-  }
-  usb_devices = set(lsusb.get_android_devices())
-
-  def blacklisting_device_status(device):
-    serial = device.adb.GetDeviceSerial()
-    adb_status = (
-        adb_devices[serial][1] if serial in adb_devices
-        else 'missing')
-    usb_status = bool(serial in usb_devices)
-
-    device_status = {
-      'serial': serial,
-      'adb_status': adb_status,
-      'usb_status': usb_status,
-    }
-
-    if not IsBlacklisted(serial, blacklist):
-      if adb_status == 'device':
-        try:
-          build_product = device.build_product
-          build_id = device.build_id
-          build_fingerprint = device.build_fingerprint
-          build_description = device.build_description
-          wifi_ip = device.GetProp('dhcp.wlan0.ipaddress')
-          battery_info = _BatteryStatus(device, blacklist)
-          imei_slice = _IMEISlice(device)
-
-          if (device.product_name == 'mantaray' and
-              battery_info.get('AC powered', None) != 'true'):
-            logger.error('Mantaray device not connected to AC power.')
-
-          device_status.update({
-            'ro.build.product': build_product,
-            'ro.build.id': build_id,
-            'ro.build.fingerprint': build_fingerprint,
-            'ro.build.description': build_description,
-            'battery': battery_info,
-            'imei_slice': imei_slice,
-            'wifi_ip': wifi_ip,
-          })
-
-        except device_errors.CommandFailedError:
-          logger.exception('Failure while getting device status for %s.',
-                           str(device))
-          if blacklist:
-            blacklist.Extend([serial], reason='status_check_failure')
-
-        except device_errors.CommandTimeoutError:
-          logger.exception('Timeout while getting device status for %s.',
-                           str(device))
-          if blacklist:
-            blacklist.Extend([serial], reason='status_check_timeout')
-
-      elif blacklist:
-        blacklist.Extend([serial],
-                         reason=adb_status if usb_status else 'offline')
-
-    device_status['blacklisted'] = IsBlacklisted(serial, blacklist)
-
-    return device_status
-
-  parallel_devices = device_utils.DeviceUtils.parallel(devices)
-  statuses = parallel_devices.pMap(blacklisting_device_status).pGet(None)
-  return statuses
-
-
-def _LogStatuses(statuses):
-  # Log the state of all devices.
-  for status in statuses:
-    logger.info(status['serial'])
-    adb_status = status.get('adb_status')
-    blacklisted = status.get('blacklisted')
-    logger.info('  USB status: %s',
-                'online' if status.get('usb_status') else 'offline')
-    logger.info('  ADB status: %s', adb_status)
-    logger.info('  Blacklisted: %s', str(blacklisted))
-    if adb_status == 'device' and not blacklisted:
-      logger.info('  Device type: %s', status.get('ro.build.product'))
-      logger.info('  OS build: %s', status.get('ro.build.id'))
-      logger.info('  OS build fingerprint: %s',
-                  status.get('ro.build.fingerprint'))
-      logger.info('  Battery state:')
-      for k, v in status.get('battery', {}).iteritems():
-        logger.info('    %s: %s', k, v)
-      logger.info('  IMEI slice: %s', status.get('imei_slice'))
-      logger.info('  WiFi IP: %s', status.get('wifi_ip'))
-
-
-def _WriteBuildbotFile(file_path, statuses):
-  buildbot_path, _ = os.path.split(file_path)
-  if os.path.exists(buildbot_path):
-    with open(file_path, 'w') as f:
-      for status in statuses:
-        try:
-          if status['adb_status'] == 'device':
-            f.write('{serial} {adb_status} {build_product} {build_id} '
-                    '{temperature:.1f}C {level}%\n'.format(
-                serial=status['serial'],
-                adb_status=status['adb_status'],
-                build_product=status['type'],
-                build_id=status['build'],
-                temperature=float(status['battery']['temperature']) / 10,
-                level=status['battery']['level']
-            ))
-          elif status.get('usb_status', False):
-            f.write('{serial} {adb_status}\n'.format(
-                serial=status['serial'],
-                adb_status=status['adb_status']
-            ))
-          else:
-            f.write('{serial} offline\n'.format(
-                serial=status['serial']
-            ))
-        except Exception: # pylint: disable=broad-except
-          pass
-
-
-def GetExpectedDevices(known_devices_files):
-  expected_devices = set()
-  try:
-    for path in known_devices_files:
-      if os.path.exists(path):
-        expected_devices.update(device_list.GetPersistentDeviceList(path))
-      else:
-        logger.warning('Could not find known devices file: %s', path)
-  except IOError:
-    logger.warning('Problem reading %s, skipping.', path)
-
-  logger.info('Expected devices:')
-  for device in expected_devices:
-    logger.info('  %s', device)
-  return expected_devices
-
-
-def AddArguments(parser):
-  parser.add_argument('--json-output',
-                      help='Output JSON information into a specified file.')
-  parser.add_argument('--adb-path',
-                      help='Absolute path to the adb binary to use.')
-  parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
-  parser.add_argument('--known-devices-file', action='append', default=[],
-                      dest='known_devices_files',
-                      help='Path to known device lists.')
-  parser.add_argument('--buildbot-path', '-b',
-                      default='/home/chrome-bot/.adb_device_info',
-                      help='Absolute path to buildbot file location')
-  parser.add_argument('-v', '--verbose', action='count', default=1,
-                      help='Log more information.')
-  parser.add_argument('-w', '--overwrite-known-devices-files',
-                      action='store_true',
-                      help='If set, overwrites known devices files wiht new '
-                           'values.')
-
-def main():
-  parser = argparse.ArgumentParser()
-  AddArguments(parser)
-  args = parser.parse_args()
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem(
-            'adb', devil_env.GetPlatform(), args.adb_path))
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  blacklist = (device_blacklist.Blacklist(args.blacklist_file)
-               if args.blacklist_file
-               else None)
-
-  expected_devices = GetExpectedDevices(args.known_devices_files)
-  usb_devices = set(lsusb.get_android_devices())
-  devices = [device_utils.DeviceUtils(s)
-             for s in expected_devices.union(usb_devices)]
-
-  statuses = DeviceStatus(devices, blacklist)
-
-  # Log the state of all devices.
-  _LogStatuses(statuses)
-
-  # Update the last devices file(s).
-  if args.overwrite_known_devices_files:
-    for path in args.known_devices_files:
-      device_list.WritePersistentDeviceList(
-          path, [status['serial'] for status in statuses])
-
-  # Write device info to file for buildbot info display.
-  _WriteBuildbotFile(args.buildbot_path, statuses)
-
-  # Dump the device statuses to JSON.
-  if args.json_output:
-    with open(args.json_output, 'wb') as f:
-      f.write(json.dumps(
-          statuses, indent=4, sort_keys=True, separators=(',', ': ')))
-
-  live_devices = [status['serial'] for status in statuses
-                  if (status['adb_status'] == 'device'
-                      and not IsBlacklisted(status['serial'], blacklist))]
-
-  # If all devices failed, or if there are no devices, it's an infra error.
-  if not live_devices:
-    logger.error('No available devices.')
-  return 0 if live_devices else exit_codes.INFRA
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/android/tools/flash_device.py b/third_party/catapult/devil/devil/android/tools/flash_device.py
deleted file mode 100755
index d13c1df..0000000
--- a/third_party/catapult/devil/devil/android/tools/flash_device.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-import argparse
-import logging
-import os
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(os.path.abspath(os.path.join(
-      os.path.dirname(__file__), '..', '..', '..')))
-from devil.android import device_blacklist
-from devil.android import device_utils
-from devil.android import fastboot_utils
-from devil.android.tools import script_common
-from devil.constants import exit_codes
-from devil.utils import run_tests_helper
-
-logger = logging.getLogger(__name__)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument('build_path', help='Path to android build.')
-  parser.add_argument('-d', '--device', dest='devices', action='append',
-                      help='Device(s) to flash.')
-  parser.add_argument('-v', '--verbose', default=0, action='count',
-                      help='Verbose level (multiple times for more)')
-  parser.add_argument('-w', '--wipe', action='store_true',
-                       help='If set, wipes user data')
-  parser.add_argument('--blacklist-file', help='Device blacklist file.')
-  args = parser.parse_args()
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  if args.blacklist_file:
-    blacklist = device_blacklist.Blacklist(args.blacklist_file).Read()
-    if blacklist:
-      logger.critical('Device(s) in blacklist, not flashing devices:')
-      for key in blacklist:
-        logger.critical('  %s', key)
-      return exit_codes.INFRA
-
-  flashed_devices = []
-  failed_devices = []
-
-  def flash(device):
-    fastboot = fastboot_utils.FastbootUtils(device)
-    try:
-      fastboot.FlashDevice(args.build_path, wipe=args.wipe)
-      flashed_devices.append(device)
-    except Exception:  # pylint: disable=broad-except
-      logger.exception('Device %s failed to flash.', str(device))
-      failed_devices.append(device)
-
-  devices = script_common.GetDevices(args.devices, args.blacklist_file)
-  device_utils.DeviceUtils.parallel(devices).pMap(flash)
-
-  if flashed_devices:
-    logger.info('The following devices were flashed:')
-    logger.info('  %s', ' '.join(str(d) for d in flashed_devices))
-  if failed_devices:
-    logger.critical('The following devices failed to flash:')
-    logger.critical('  %s', ' '.join(str(d) for d in failed_devices))
-    return exit_codes.INFRA
-  return 0
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/android/tools/keyboard.py b/third_party/catapult/devil/devil/android/tools/keyboard.py
deleted file mode 100755
index 31daf59..0000000
--- a/third_party/catapult/devil/devil/android/tools/keyboard.py
+++ /dev/null
@@ -1,129 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Use your keyboard as your phone's keyboard. Experimental."""
-
-import argparse
-import copy
-import os
-import sys
-import termios
-import tty
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-from devil import base_error
-from devil.android.sdk import keyevent
-from devil.android.tools import script_common
-from devil.utils import run_tests_helper
-
-
-_KEY_MAPPING = {
-  '\x08': keyevent.KEYCODE_DEL,
-  '\x0a': keyevent.KEYCODE_ENTER,
-  ' ': keyevent.KEYCODE_SPACE,
-  '.': keyevent.KEYCODE_PERIOD,
-  '0': keyevent.KEYCODE_0,
-  '1': keyevent.KEYCODE_1,
-  '2': keyevent.KEYCODE_2,
-  '3': keyevent.KEYCODE_3,
-  '4': keyevent.KEYCODE_4,
-  '5': keyevent.KEYCODE_5,
-  '6': keyevent.KEYCODE_6,
-  '7': keyevent.KEYCODE_7,
-  '8': keyevent.KEYCODE_8,
-  '9': keyevent.KEYCODE_9,
-  'a': keyevent.KEYCODE_A,
-  'b': keyevent.KEYCODE_B,
-  'c': keyevent.KEYCODE_C,
-  'd': keyevent.KEYCODE_D,
-  'e': keyevent.KEYCODE_E,
-  'f': keyevent.KEYCODE_F,
-  'g': keyevent.KEYCODE_G,
-  'h': keyevent.KEYCODE_H,
-  'i': keyevent.KEYCODE_I,
-  'j': keyevent.KEYCODE_J,
-  'k': keyevent.KEYCODE_K,
-  'l': keyevent.KEYCODE_L,
-  'm': keyevent.KEYCODE_M,
-  'n': keyevent.KEYCODE_N,
-  'o': keyevent.KEYCODE_O,
-  'p': keyevent.KEYCODE_P,
-  'q': keyevent.KEYCODE_Q,
-  'r': keyevent.KEYCODE_R,
-  's': keyevent.KEYCODE_S,
-  't': keyevent.KEYCODE_T,
-  'u': keyevent.KEYCODE_U,
-  'v': keyevent.KEYCODE_V,
-  'w': keyevent.KEYCODE_W,
-  'x': keyevent.KEYCODE_X,
-  'y': keyevent.KEYCODE_Y,
-  'z': keyevent.KEYCODE_Z,
-  '\x7f': keyevent.KEYCODE_DEL,
-}
-
-
-def Keyboard(device, stream_itr):
-  try:
-    for c in stream_itr:
-      k = _KEY_MAPPING.get(c)
-      if k:
-        device.SendKeyEvent(k)
-      else:
-        print
-        print '(No mapping for character 0x%x)' % ord(c)
-  except KeyboardInterrupt:
-    pass
-
-
-def AddArguments(parser):
-  parser.add_argument('-d', '--device', action='append', dest='devices',
-                      metavar='DEVICE', help='device serial')
-  parser.add_argument('-v', '--verbose', action='count', help='print more')
-
-
-class MultipleDevicesError(base_error.BaseError):
-  def __init__(self, devices):
-    super(MultipleDevicesError, self).__init__(
-        'More than one device found: %s' % ', '.join(str(d) for d in devices))
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser(
-      description="Use your keyboard as your phone's keyboard.")
-  AddArguments(parser)
-  args = parser.parse_args(raw_args)
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  devices = script_common.GetDevices(args.devices, None)
-  if len(devices) > 1:
-    raise MultipleDevicesError(devices)
-
-  def next_char():
-    while True:
-      yield sys.stdin.read(1)
-
-  try:
-    fd = sys.stdin.fileno()
-
-    # See man 3 termios for more info on what this is doing.
-    old_attrs = termios.tcgetattr(fd)
-    new_attrs = copy.deepcopy(old_attrs)
-    new_attrs[tty.LFLAG] = new_attrs[tty.LFLAG] & ~(termios.ICANON)
-    new_attrs[tty.CC][tty.VMIN] = 1
-    new_attrs[tty.CC][tty.VTIME] = 0
-    termios.tcsetattr(fd, termios.TCSAFLUSH, new_attrs)
-
-    Keyboard(devices[0], next_char())
-  finally:
-    termios.tcsetattr(fd, termios.TCSAFLUSH, old_attrs)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/third_party/catapult/devil/devil/android/tools/provision_devices.py b/third_party/catapult/devil/devil/android/tools/provision_devices.py
deleted file mode 100755
index 7374290..0000000
--- a/third_party/catapult/devil/devil/android/tools/provision_devices.py
+++ /dev/null
@@ -1,637 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (c) 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.
-
-"""Provisions Android devices with settings required for bots.
-
-Usage:
-  ./provision_devices.py [-d <device serial number>]
-"""
-
-import argparse
-import datetime
-import json
-import logging
-import os
-import posixpath
-import re
-import sys
-import time
-
-# Import _strptime before threaded code. datetime.datetime.strptime is
-# threadsafe except for the initial import of the _strptime module.
-# See crbug.com/584730 and https://bugs.python.org/issue7980.
-import _strptime  # pylint: disable=unused-import
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import battery_utils
-from devil.android import device_blacklist
-from devil.android import device_errors
-from devil.android import device_temp_file
-from devil.android import device_utils
-from devil.android import settings
-from devil.android.constants import chrome
-from devil.android.sdk import adb_wrapper
-from devil.android.sdk import intent
-from devil.android.sdk import keyevent
-from devil.android.sdk import version_codes
-from devil.android.tools import script_common
-from devil.constants import exit_codes
-from devil.utils import run_tests_helper
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-_SYSTEM_APP_DIRECTORIES = ['/system/app/', '/system/priv-app/']
-_SYSTEM_WEBVIEW_NAMES = ['webview', 'WebViewGoogle']
-_CHROME_PACKAGE_REGEX = re.compile('.*chrom.*')
-_TOMBSTONE_REGEX = re.compile('tombstone.*')
-
-
-class _DEFAULT_TIMEOUTS(object):
-  # L can take a while to reboot after a wipe.
-  LOLLIPOP = 600
-  PRE_LOLLIPOP = 180
-
-  HELP_TEXT = '{}s on L, {}s on pre-L'.format(LOLLIPOP, PRE_LOLLIPOP)
-
-
-class ProvisionStep(object):
-
-  def __init__(self, cmd, reboot=False):
-    self.cmd = cmd
-    self.reboot = reboot
-
-
-def ProvisionDevices(
-    devices,
-    blacklist_file,
-    adb_key_files=None,
-    disable_location=False,
-    disable_mock_location=False,
-    disable_network=False,
-    disable_system_chrome=False,
-    emulators=False,
-    enable_java_debug=False,
-    max_battery_temp=None,
-    min_battery_level=None,
-    output_device_blacklist=None,
-    reboot_timeout=None,
-    remove_system_webview=False,
-    system_app_remove_list=None,
-    wipe=True):
-  blacklist = (device_blacklist.Blacklist(blacklist_file)
-               if blacklist_file
-               else None)
-  system_app_remove_list = system_app_remove_list or []
-  try:
-    devices = script_common.GetDevices(devices, blacklist)
-  except device_errors.NoDevicesError:
-    logging.error('No available devices to provision.')
-    if blacklist:
-      logging.error('Local device blacklist: %s', blacklist.Read())
-    raise
-  devices = [d for d in devices
-             if not emulators or d.adb.is_emulator]
-  parallel_devices = device_utils.DeviceUtils.parallel(devices)
-
-  steps = []
-  if wipe:
-    steps += [ProvisionStep(lambda d: Wipe(d, adb_key_files), reboot=True)]
-  steps += [ProvisionStep(
-      lambda d: SetProperties(d, enable_java_debug, disable_location,
-                              disable_mock_location),
-      reboot=not emulators)]
-
-  if disable_network:
-    steps.append(ProvisionStep(DisableNetwork))
-
-  if disable_system_chrome:
-    steps.append(ProvisionStep(DisableSystemChrome))
-
-  if max_battery_temp:
-    steps.append(ProvisionStep(
-        lambda d: WaitForTemperature(d, max_battery_temp)))
-
-  if min_battery_level:
-    steps.append(ProvisionStep(
-        lambda d: WaitForCharge(d, min_battery_level)))
-
-  if remove_system_webview:
-    system_app_remove_list.extend(_SYSTEM_WEBVIEW_NAMES)
-
-  if system_app_remove_list:
-    steps.append(ProvisionStep(
-        lambda d: RemoveSystemApps(d, system_app_remove_list)))
-
-  steps.append(ProvisionStep(SetDate))
-  steps.append(ProvisionStep(CheckExternalStorage))
-
-  parallel_devices.pMap(ProvisionDevice, steps, blacklist, reboot_timeout)
-
-  blacklisted_devices = blacklist.Read() if blacklist else []
-  if output_device_blacklist:
-    with open(output_device_blacklist, 'w') as f:
-      json.dump(blacklisted_devices, f)
-  if all(d in blacklisted_devices for d in devices):
-    raise device_errors.NoDevicesError
-  return 0
-
-
-def ProvisionDevice(device, steps, blacklist, reboot_timeout=None):
-  try:
-    if not reboot_timeout:
-      if device.build_version_sdk >= version_codes.LOLLIPOP:
-        reboot_timeout = _DEFAULT_TIMEOUTS.LOLLIPOP
-      else:
-        reboot_timeout = _DEFAULT_TIMEOUTS.PRE_LOLLIPOP
-
-    for step in steps:
-      try:
-        device.WaitUntilFullyBooted(timeout=reboot_timeout, retries=0)
-      except device_errors.CommandTimeoutError:
-        logger.error('Device did not finish booting. Will try to reboot.')
-        device.Reboot(timeout=reboot_timeout)
-      step.cmd(device)
-      if step.reboot:
-        device.Reboot(False, retries=0)
-        device.adb.WaitForDevice()
-
-  except device_errors.CommandTimeoutError:
-    logger.exception('Timed out waiting for device %s. Adding to blacklist.',
-                     str(device))
-    if blacklist:
-      blacklist.Extend([str(device)], reason='provision_timeout')
-
-  except device_errors.CommandFailedError:
-    logger.exception('Failed to provision device %s. Adding to blacklist.',
-                     str(device))
-    if blacklist:
-      blacklist.Extend([str(device)], reason='provision_failure')
-
-
-def Wipe(device, adb_key_files=None):
-  if (device.IsUserBuild() or
-      device.build_version_sdk >= version_codes.MARSHMALLOW):
-    WipeChromeData(device)
-
-    package = "com.google.android.gms"
-    version_name = device.GetApplicationVersion(package)
-    logger.info("Version name for %s is %s", package, version_name)
-  else:
-    WipeDevice(device, adb_key_files)
-
-
-def WipeChromeData(device):
-  """Wipes chrome specific data from device
-
-  (1) uninstall any app whose name matches *chrom*, except
-      com.android.chrome, which is the chrome stable package. Doing so also
-      removes the corresponding dirs under /data/data/ and /data/app/
-  (2) remove any dir under /data/app-lib/ whose name matches *chrom*
-  (3) remove any files under /data/tombstones/ whose name matches "tombstone*"
-  (4) remove /data/local.prop if there is any
-  (5) remove /data/local/chrome-command-line if there is any
-  (6) remove anything under /data/local/.config/ if the dir exists
-      (this is telemetry related)
-  (7) remove anything under /data/local/tmp/
-
-  Arguments:
-    device: the device to wipe
-  """
-  try:
-    if device.IsUserBuild():
-      _UninstallIfMatch(device, _CHROME_PACKAGE_REGEX,
-                        chrome.PACKAGE_INFO['chrome_stable'].package)
-      device.RunShellCommand('rm -rf %s/*' % device.GetExternalStoragePath(),
-                             shell=True, check_return=True)
-      device.RunShellCommand('rm -rf /data/local/tmp/*',
-                             shell=True, check_return=True)
-    else:
-      device.EnableRoot()
-      _UninstallIfMatch(device, _CHROME_PACKAGE_REGEX,
-                        chrome.PACKAGE_INFO['chrome_stable'].package)
-      _WipeUnderDirIfMatch(device, '/data/app-lib/', _CHROME_PACKAGE_REGEX)
-      _WipeUnderDirIfMatch(device, '/data/tombstones/', _TOMBSTONE_REGEX)
-
-      _WipeFileOrDir(device, '/data/local.prop')
-      _WipeFileOrDir(device, '/data/local/chrome-command-line')
-      _WipeFileOrDir(device, '/data/local/.config/')
-      _WipeFileOrDir(device, '/data/local/tmp/')
-      device.RunShellCommand('rm -rf %s/*' % device.GetExternalStoragePath(),
-                             shell=True, check_return=True)
-  except device_errors.CommandFailedError:
-    logger.exception('Possible failure while wiping the device. '
-                     'Attempting to continue.')
-
-
-def _UninstallIfMatch(device, pattern, app_to_keep):
-  installed_packages = device.RunShellCommand(
-      ['pm', 'list', 'packages'], check_return=True)
-  installed_system_packages = [
-      pkg.split(':')[1] for pkg in device.RunShellCommand(
-          ['pm', 'list', 'packages', '-s'], check_return=True)]
-  for package_output in installed_packages:
-    package = package_output.split(":")[1]
-    if pattern.match(package) and not package == app_to_keep:
-      if not device.IsUserBuild() or package not in installed_system_packages:
-        device.Uninstall(package)
-
-
-def _WipeUnderDirIfMatch(device, path, pattern):
-  for filename in device.ListDirectory(path):
-    if pattern.match(filename):
-      _WipeFileOrDir(device, posixpath.join(path, filename))
-
-
-def _WipeFileOrDir(device, path):
-  if device.PathExists(path):
-    device.RunShellCommand(['rm', '-rf', path], check_return=True)
-
-
-def WipeDevice(device, adb_key_files):
-  """Wipes data from device, keeping only the adb_keys for authorization.
-
-  After wiping data on a device that has been authorized, adb can still
-  communicate with the device, but after reboot the device will need to be
-  re-authorized because the adb keys file is stored in /data/misc/adb/.
-  Thus, adb_keys file is rewritten so the device does not need to be
-  re-authorized.
-
-  Arguments:
-    device: the device to wipe
-  """
-  try:
-    device.EnableRoot()
-    device_authorized = device.FileExists(adb_wrapper.ADB_KEYS_FILE)
-    if device_authorized:
-      adb_keys = device.ReadFile(adb_wrapper.ADB_KEYS_FILE,
-                                 as_root=True).splitlines()
-    device.RunShellCommand(['wipe', 'data'],
-                           as_root=True, check_return=True)
-    device.adb.WaitForDevice()
-
-    if device_authorized:
-      adb_keys_set = set(adb_keys)
-      for adb_key_file in adb_key_files or []:
-        try:
-          with open(adb_key_file, 'r') as f:
-            adb_public_keys = f.readlines()
-          adb_keys_set.update(adb_public_keys)
-        except IOError:
-          logger.warning('Unable to find adb keys file %s.', adb_key_file)
-      _WriteAdbKeysFile(device, '\n'.join(adb_keys_set))
-  except device_errors.CommandFailedError:
-    logger.exception('Possible failure while wiping the device. '
-                     'Attempting to continue.')
-
-
-def _WriteAdbKeysFile(device, adb_keys_string):
-  dir_path = posixpath.dirname(adb_wrapper.ADB_KEYS_FILE)
-  device.RunShellCommand(['mkdir', '-p', dir_path],
-                         as_root=True, check_return=True)
-  device.RunShellCommand(['restorecon', dir_path],
-                         as_root=True, check_return=True)
-  device.WriteFile(adb_wrapper.ADB_KEYS_FILE, adb_keys_string, as_root=True)
-  device.RunShellCommand(['restorecon', adb_wrapper.ADB_KEYS_FILE],
-                         as_root=True, check_return=True)
-
-
-def SetProperties(device, enable_java_debug, disable_location,
-                  disable_mock_location):
-  try:
-    device.EnableRoot()
-  except device_errors.CommandFailedError as e:
-    logger.warning(str(e))
-
-  if not device.IsUserBuild():
-    _ConfigureLocalProperties(device, enable_java_debug)
-  else:
-    logger.warning('Cannot configure properties in user builds.')
-  settings.ConfigureContentSettings(
-      device, settings.DETERMINISTIC_DEVICE_SETTINGS)
-  if disable_location:
-    settings.ConfigureContentSettings(
-        device, settings.DISABLE_LOCATION_SETTINGS)
-  else:
-    settings.ConfigureContentSettings(
-        device, settings.ENABLE_LOCATION_SETTINGS)
-
-  if disable_mock_location:
-    settings.ConfigureContentSettings(
-        device, settings.DISABLE_MOCK_LOCATION_SETTINGS)
-  else:
-    settings.ConfigureContentSettings(
-        device, settings.ENABLE_MOCK_LOCATION_SETTINGS)
-
-  settings.SetLockScreenSettings(device)
-
-  # Some device types can momentarily disappear after setting properties.
-  device.adb.WaitForDevice()
-
-
-def DisableNetwork(device):
-  settings.ConfigureContentSettings(
-      device, settings.NETWORK_DISABLED_SETTINGS)
-  if device.build_version_sdk >= version_codes.MARSHMALLOW:
-    # Ensure that NFC is also switched off.
-    device.RunShellCommand(['svc', 'nfc', 'disable'],
-                           as_root=True, check_return=True)
-
-
-def DisableSystemChrome(device):
-  # The system chrome version on the device interferes with some tests.
-  device.RunShellCommand(['pm', 'disable', 'com.android.chrome'],
-                         check_return=True)
-
-
-def _RemoveSystemApp(device, system_app):
-  found_paths = []
-  for directory in _SYSTEM_APP_DIRECTORIES:
-    path = os.path.join(directory, system_app)
-    if device.PathExists(path):
-      found_paths.append(path)
-  if not found_paths:
-    logger.warning('Could not find install location for system app %s',
-                   system_app)
-  device.RemovePath(found_paths, force=True, recursive=True)
-
-def RemoveSystemApps(device, system_app_remove_list):
-  """Attempts to remove the provided system apps from the given device.
-
-  Arguments:
-    device: The device to remove the system apps from.
-    system_app_remove_list: A list of app names to remove, e.g.
-        ['WebViewGoogle', 'GoogleVrCore']
-  """
-  device.EnableRoot()
-  if device.HasRoot():
-    # Disable Marshmallow's Verity security feature
-    if device.build_version_sdk >= version_codes.MARSHMALLOW:
-      logger.info('Disabling Verity on %s', device.serial)
-      device.adb.DisableVerity()
-      device.Reboot()
-      device.WaitUntilFullyBooted()
-      device.EnableRoot()
-
-    device.adb.Remount()
-    device.RunShellCommand(['stop'], check_return=True)
-    for system_app in system_app_remove_list:
-      _RemoveSystemApp(device, system_app)
-    device.RunShellCommand(['start'], check_return=True)
-  else:
-    raise device_errors.CommandFailedError(
-        'Failed to remove system apps from non-rooted device', str(device))
-
-
-def _ConfigureLocalProperties(device, java_debug=True):
-  """Set standard readonly testing device properties prior to reboot."""
-  local_props = [
-      'persist.sys.usb.config=adb',
-      'ro.monkey=1',
-      'ro.test_harness=1',
-      'ro.audio.silent=1',
-      'ro.setupwizard.mode=DISABLED',
-      ]
-  if java_debug:
-    local_props.append(
-        '%s=all' % device_utils.DeviceUtils.JAVA_ASSERT_PROPERTY)
-    local_props.append('debug.checkjni=1')
-  try:
-    device.WriteFile(
-        device.LOCAL_PROPERTIES_PATH,
-        '\n'.join(local_props), as_root=True)
-    # Android will not respect the local props file if it is world writable.
-    device.RunShellCommand(
-        ['chmod', '644', device.LOCAL_PROPERTIES_PATH],
-        as_root=True, check_return=True)
-  except device_errors.CommandFailedError:
-    logger.exception('Failed to configure local properties.')
-
-
-def FinishProvisioning(device):
-  # The lockscreen can't be disabled on user builds, so send a keyevent
-  # to unlock it.
-  if device.IsUserBuild():
-    device.SendKeyEvent(keyevent.KEYCODE_MENU)
-
-
-def WaitForCharge(device, min_battery_level):
-  battery = battery_utils.BatteryUtils(device)
-  try:
-    battery.ChargeDeviceToLevel(min_battery_level)
-  except device_errors.DeviceChargingError:
-    device.Reboot()
-    battery.ChargeDeviceToLevel(min_battery_level)
-
-
-def WaitForTemperature(device, max_battery_temp):
-  try:
-    battery = battery_utils.BatteryUtils(device)
-    battery.LetBatteryCoolToTemperature(max_battery_temp)
-  except device_errors.CommandFailedError:
-    logger.exception('Unable to let battery cool to specified temperature.')
-
-
-def SetDate(device):
-  def _set_and_verify_date():
-    if device.build_version_sdk >= version_codes.MARSHMALLOW:
-      date_format = '%m%d%H%M%Y.%S'
-      set_date_command = ['date', '-u']
-      get_date_command = ['date', '-u']
-    else:
-      date_format = '%Y%m%d.%H%M%S'
-      set_date_command = ['date', '-s']
-      get_date_command = ['date']
-
-    # TODO(jbudorick): This is wrong on pre-M devices -- get/set are
-    # dealing in local time, but we're setting based on GMT.
-    strgmtime = time.strftime(date_format, time.gmtime())
-    set_date_command.append(strgmtime)
-    device.RunShellCommand(set_date_command, as_root=True, check_return=True)
-
-    get_date_command.append('+"%Y%m%d.%H%M%S"')
-    device_time = device.RunShellCommand(
-        get_date_command, check_return=True,
-        as_root=True, single_line=True).replace('"', '')
-    device_time = datetime.datetime.strptime(device_time, "%Y%m%d.%H%M%S")
-    correct_time = datetime.datetime.strptime(strgmtime, date_format)
-    tdelta = (correct_time - device_time).seconds
-    if tdelta <= 1:
-      logger.info('Date/time successfully set on %s', device)
-      return True
-    else:
-      logger.error('Date mismatch. Device: %s Correct: %s',
-                   device_time.isoformat(), correct_time.isoformat())
-      return False
-
-  # Sometimes the date is not set correctly on the devices. Retry on failure.
-  if device.IsUserBuild():
-    # TODO(bpastene): Figure out how to set the date & time on user builds.
-    pass
-  else:
-    if not timeout_retry.WaitFor(
-        _set_and_verify_date, wait_period=1, max_tries=2):
-      raise device_errors.CommandFailedError(
-          'Failed to set date & time.', device_serial=str(device))
-    device.EnableRoot()
-    device.BroadcastIntent(
-        intent.Intent(action='android.intent.action.TIME_SET'))
-
-
-def LogDeviceProperties(device):
-  props = device.RunShellCommand(['getprop'], check_return=True)
-  for prop in props:
-    logger.info('  %s', prop)
-
-
-def CheckExternalStorage(device):
-  """Checks that storage is writable and if not makes it writable.
-
-  Arguments:
-    device: The device to check.
-  """
-  try:
-    with device_temp_file.DeviceTempFile(
-        device.adb, suffix='.sh', dir=device.GetExternalStoragePath()) as f:
-      device.WriteFile(f.name, 'test')
-  except device_errors.CommandFailedError:
-    logger.info('External storage not writable. Remounting / as RW')
-    device.RunShellCommand(['mount', '-o', 'remount,rw', '/'],
-                           check_return=True, as_root=True)
-    device.EnableRoot()
-    with device_temp_file.DeviceTempFile(
-        device.adb, suffix='.sh', dir=device.GetExternalStoragePath()) as f:
-      device.WriteFile(f.name, 'test')
-
-
-def main(raw_args):
-  # Recommended options on perf bots:
-  # --disable-network
-  #     TODO(tonyg): We eventually want network on. However, currently radios
-  #     can cause perfbots to drain faster than they charge.
-  # --min-battery-level 95
-  #     Some perf bots run benchmarks with USB charging disabled which leads
-  #     to gradual draining of the battery. We must wait for a full charge
-  #     before starting a run in order to keep the devices online.
-
-  parser = argparse.ArgumentParser(
-      description='Provision Android devices with settings required for bots.')
-  parser.add_argument(
-      '--adb-key-files', type=str, nargs='+',
-      help='list of adb keys to push to device')
-  parser.add_argument(
-      '--adb-path',
-      help='Absolute path to the adb binary to use.')
-  parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
-  parser.add_argument(
-      '-d', '--device', metavar='SERIAL', action='append', dest='devices',
-      help='the serial number of the device to be provisioned '
-           '(the default is to provision all devices attached)')
-  parser.add_argument(
-      '--disable-location', action='store_true',
-      help='disable Google location services on devices')
-  parser.add_argument(
-      '--disable-mock-location', action='store_true', default=False,
-      help='Set ALLOW_MOCK_LOCATION to false')
-  parser.add_argument(
-      '--disable-network', action='store_true',
-      help='disable network access on devices')
-  parser.add_argument(
-      '--disable-java-debug', action='store_false',
-      dest='enable_java_debug', default=True,
-      help='disable Java property asserts and JNI checking')
-  parser.add_argument(
-      '--disable-system-chrome', action='store_true',
-      help='Disable the system chrome from devices.')
-  parser.add_argument(
-      '--emulators', action='store_true',
-      help='provision only emulators and ignore usb devices '
-           '(this will not wipe emulators)')
-  parser.add_argument(
-      '--max-battery-temp', type=int, metavar='NUM',
-      help='Wait for the battery to have this temp or lower.')
-  parser.add_argument(
-      '--min-battery-level', type=int, metavar='NUM',
-      help='wait for the device to reach this minimum battery'
-           ' level before trying to continue')
-  parser.add_argument(
-      '--output-device-blacklist',
-      help='Json file to output the device blacklist.')
-  parser.add_argument(
-      '--reboot-timeout', metavar='SECS', type=int,
-      help='when wiping the device, max number of seconds to'
-           ' wait after each reboot '
-           '(default: %s)' % _DEFAULT_TIMEOUTS.HELP_TEXT)
-  parser.add_argument(
-      '--remove-system-apps', nargs='*', dest='system_app_remove_list',
-      help='the names of system apps to remove')
-  parser.add_argument(
-      '--remove-system-webview', action='store_true',
-      help='Remove the system webview from devices.')
-  parser.add_argument(
-      '--skip-wipe', action='store_true', default=False,
-      help='do not wipe device data during provisioning')
-  parser.add_argument(
-      '-v', '--verbose', action='count', default=1,
-      help='Log more information.')
-
-  # No-op arguments for compatibility with build/android/provision_devices.py.
-  # TODO(jbudorick): Remove these once all callers have stopped using them.
-  parser.add_argument(
-      '--chrome-specific-wipe', action='store_true',
-      help=argparse.SUPPRESS)
-  parser.add_argument(
-      '--phase', action='append',
-      help=argparse.SUPPRESS)
-  parser.add_argument(
-      '-r', '--auto-reconnect', action='store_true',
-      help=argparse.SUPPRESS)
-  parser.add_argument(
-      '-t', '--target',
-      help=argparse.SUPPRESS)
-
-  args = parser.parse_args(raw_args)
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem(
-            'adb', devil_env.GetPlatform(), args.adb_path))
-
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  try:
-    return ProvisionDevices(
-        args.devices,
-        args.blacklist_file,
-        adb_key_files=args.adb_key_files,
-        disable_location=args.disable_location,
-        disable_mock_location=args.disable_mock_location,
-        disable_network=args.disable_network,
-        disable_system_chrome=args.disable_system_chrome,
-        emulators=args.emulators,
-        enable_java_debug=args.enable_java_debug,
-        max_battery_temp=args.max_battery_temp,
-        min_battery_level=args.min_battery_level,
-        output_device_blacklist=args.output_device_blacklist,
-        reboot_timeout=args.reboot_timeout,
-        remove_system_webview=args.remove_system_webview,
-        system_app_remove_list=args.system_app_remove_list,
-        wipe=not args.skip_wipe and not args.emulators)
-  except (device_errors.DeviceUnreachableError, device_errors.NoDevicesError):
-    logging.exception('Unable to provision local devices.')
-    return exit_codes.INFRA
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/third_party/catapult/devil/devil/android/tools/screenshot.py b/third_party/catapult/devil/devil/android/tools/screenshot.py
deleted file mode 100755
index a264c4f..0000000
--- a/third_party/catapult/devil/devil/android/tools/screenshot.py
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-"""Takes a screenshot from an Android device."""
-
-import argparse
-import logging
-import os
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(os.path.abspath(os.path.join(
-      os.path.dirname(__file__), '..', '..', '..')))
-from devil.android import device_utils
-from devil.android.tools import script_common
-
-logger = logging.getLogger(__name__)
-
-
-def main():
-  # Parse options.
-  parser = argparse.ArgumentParser(description=__doc__)
-  parser.add_argument('-d', '--device', dest='devices', action='append',
-                      help='Serial number of Android device to use.')
-  parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
-  parser.add_argument('-f', '--file', metavar='FILE',
-                      help='Save result to file instead of generating a '
-                           'timestamped file name.')
-  parser.add_argument('-v', '--verbose', action='store_true',
-                      help='Verbose logging.')
-  parser.add_argument('host_file', nargs='?',
-                      help='File to which the screenshot will be saved.')
-
-  args = parser.parse_args()
-
-  host_file = args.host_file or args.file
-
-  if args.verbose:
-    logging.getLogger().setLevel(logging.DEBUG)
-
-  devices = script_common.GetDevices(args.devices, args.blacklist_file)
-
-  def screenshot(device):
-    f = None
-    if host_file:
-      root, ext = os.path.splitext(host_file)
-      f = '%s_%s%s' % (root, str(device), ext)
-    f = device.TakeScreenshot(f)
-    print 'Screenshot for device %s written to %s' % (
-        str(device), os.path.abspath(f))
-
-  device_utils.DeviceUtils.parallel(devices).pMap(screenshot)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/android/tools/script_common.py b/third_party/catapult/devil/devil/android/tools/script_common.py
deleted file mode 100644
index f91ad5e..0000000
--- a/third_party/catapult/devil/devil/android/tools/script_common.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2015 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.
-
-from devil.android import device_blacklist
-from devil.android import device_errors
-from devil.android import device_utils
-
-
-def GetDevices(requested_devices, blacklist_file):
-  if not isinstance(blacklist_file, device_blacklist.Blacklist):
-    blacklist_file = (device_blacklist.Blacklist(blacklist_file)
-                      if blacklist_file
-                      else None)
-
-  devices = device_utils.DeviceUtils.HealthyDevices(blacklist_file)
-  if not devices:
-    raise device_errors.NoDevicesError()
-  elif requested_devices:
-    requested = set(requested_devices)
-    available = set(str(d) for d in devices)
-    missing = requested.difference(available)
-    if missing:
-      raise device_errors.DeviceUnreachableError(next(iter(missing)))
-    return sorted(device_utils.DeviceUtils(d)
-                  for d in available.intersection(requested))
-  else:
-    return devices
-
diff --git a/third_party/catapult/devil/devil/android/tools/script_common_test.py b/third_party/catapult/devil/devil/android/tools/script_common_test.py
deleted file mode 100755
index a226764..0000000
--- a/third_party/catapult/devil/devil/android/tools/script_common_test.py
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-
-import sys
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.tools import script_common
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class ScriptCommonTest(unittest.TestCase):
-
-  def testGetDevices_noSpecs(self):
-    devices = [
-        device_utils.DeviceUtils('123'),
-        device_utils.DeviceUtils('456'),
-    ]
-    with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices',
-                    return_value=devices):
-      self.assertEquals(
-          devices,
-          script_common.GetDevices(None, None))
-
-  def testGetDevices_withDevices(self):
-    devices = [
-        device_utils.DeviceUtils('123'),
-        device_utils.DeviceUtils('456'),
-    ]
-    with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices',
-                    return_value=devices):
-      self.assertEquals(
-          [device_utils.DeviceUtils('456')],
-          script_common.GetDevices(['456'], None))
-
-  def testGetDevices_missingDevice(self):
-    with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices',
-                    return_value=[device_utils.DeviceUtils('123')]):
-      with self.assertRaises(device_errors.DeviceUnreachableError):
-        script_common.GetDevices(['456'], None)
-
-  def testGetDevices_noDevices(self):
-    with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices',
-                    return_value=[]):
-      with self.assertRaises(device_errors.NoDevicesError):
-        script_common.GetDevices(None, None)
-
-
-if __name__ == '__main__':
-  sys.exit(unittest.main())
-
diff --git a/third_party/catapult/devil/devil/android/tools/video_recorder.py b/third_party/catapult/devil/devil/android/tools/video_recorder.py
deleted file mode 100755
index a91e649..0000000
--- a/third_party/catapult/devil/devil/android/tools/video_recorder.py
+++ /dev/null
@@ -1,175 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-"""Captures a video from an Android device."""
-
-import argparse
-import logging
-import os
-import threading
-import time
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(os.path.abspath(os.path.join(
-      os.path.dirname(__file__), '..', '..', '..')))
-from devil.android import device_signal
-from devil.android import device_utils
-from devil.android.tools import script_common
-from devil.utils import cmd_helper
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-
-class VideoRecorder(object):
-  """Records a screen capture video from an Android Device (KitKat or newer)."""
-
-  def __init__(self, device, megabits_per_second=4, size=None,
-               rotate=False):
-    """Creates a VideoRecorder instance.
-
-    Args:
-      device: DeviceUtils instance.
-      host_file: Path to the video file to store on the host.
-      megabits_per_second: Video bitrate in megabits per second. Allowed range
-                           from 0.1 to 100 mbps.
-      size: Video frame size tuple (width, height) or None to use the device
-            default.
-      rotate: If True, the video will be rotated 90 degrees.
-    """
-    self._bit_rate = megabits_per_second * 1000 * 1000
-    self._device = device
-    self._device_file = (
-        '%s/screen-recording.mp4' % device.GetExternalStoragePath())
-    self._recorder_thread = None
-    self._rotate = rotate
-    self._size = size
-    self._started = threading.Event()
-
-  def __enter__(self):
-    self.Start()
-
-  def Start(self, timeout=None):
-    """Start recording video."""
-    def screenrecord_started():
-      return bool(self._device.GetPids('screenrecord'))
-
-    if screenrecord_started():
-      raise Exception("Can't run multiple concurrent video captures.")
-
-    self._started.clear()
-    self._recorder_thread = reraiser_thread.ReraiserThread(self._Record)
-    self._recorder_thread.start()
-    timeout_retry.WaitFor(
-        screenrecord_started, wait_period=1, max_tries=timeout)
-    self._started.wait(timeout)
-
-  def _Record(self):
-    cmd = ['screenrecord', '--verbose', '--bit-rate', str(self._bit_rate)]
-    if self._rotate:
-      cmd += ['--rotate']
-    if self._size:
-      cmd += ['--size', '%dx%d' % self._size]
-    cmd += [self._device_file]
-    for line in self._device.adb.IterShell(
-        ' '.join(cmd_helper.SingleQuote(i) for i in cmd), None):
-      if line.startswith('Content area is '):
-        self._started.set()
-
-  def __exit__(self, _exc_type, _exc_value, _traceback):
-    self.Stop()
-
-  def Stop(self):
-    """Stop recording video."""
-    if not self._device.KillAll('screenrecord', signum=device_signal.SIGINT,
-                                quiet=True):
-      logger.warning('Nothing to kill: screenrecord was not running')
-    self._recorder_thread.join()
-
-  def Pull(self, host_file=None):
-    """Pull resulting video file from the device.
-
-    Args:
-      host_file: Path to the video file to store on the host.
-    Returns:
-      Output video file name on the host.
-    """
-    # TODO(jbudorick): Merge filename generation with the logic for doing so in
-    # DeviceUtils.
-    host_file_name = (
-        host_file
-        or 'screen-recording-%s-%s.mp4' % (
-            str(self._device),
-            time.strftime('%Y%m%dT%H%M%S', time.localtime())))
-    host_file_name = os.path.abspath(host_file_name)
-    self._device.PullFile(self._device_file, host_file_name)
-    self._device.RemovePath(self._device_file, force=True)
-    return host_file_name
-
-
-def main():
-  # Parse options.
-  parser = argparse.ArgumentParser(description=__doc__)
-  parser.add_argument('-d', '--device', dest='devices', action='append',
-                      help='Serial number of Android device to use.')
-  parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
-  parser.add_argument('-f', '--file', metavar='FILE',
-                      help='Save result to file instead of generating a '
-                           'timestamped file name.')
-  parser.add_argument('-v', '--verbose', action='store_true',
-                      help='Verbose logging.')
-  parser.add_argument('-b', '--bitrate', default=4, type=float,
-                      help='Bitrate in megabits/s, from 0.1 to 100 mbps, '
-                           '%default mbps by default.')
-  parser.add_argument('-r', '--rotate', action='store_true',
-                      help='Rotate video by 90 degrees.')
-  parser.add_argument('-s', '--size', metavar='WIDTHxHEIGHT',
-                      help='Frame size to use instead of the device '
-                           'screen size.')
-  parser.add_argument('host_file', nargs='?',
-                      help='File to which the video capture will be written.')
-
-  args = parser.parse_args()
-
-  host_file = args.host_file or args.file
-
-  if args.verbose:
-    logging.getLogger().setLevel(logging.DEBUG)
-
-  size = (tuple(int(i) for i in args.size.split('x'))
-          if args.size
-          else None)
-
-  def record_video(device, stop_recording):
-    recorder = VideoRecorder(
-        device, megabits_per_second=args.bitrate, size=size, rotate=args.rotate)
-    with recorder:
-      stop_recording.wait()
-
-    f = None
-    if host_file:
-      root, ext = os.path.splitext(host_file)
-      f = '%s_%s%s' % (root, str(device), ext)
-    f = recorder.Pull(f)
-    print 'Video written to %s' % os.path.abspath(f)
-
-  parallel_devices = device_utils.DeviceUtils.parallel(
-      script_common.GetDevices(args.devices, args.blacklist_file),
-      async=True)
-  stop_recording = threading.Event()
-  running_recording = parallel_devices.pMap(record_video, stop_recording)
-  print 'Recording. Press Enter to stop.',
-  sys.stdout.flush()
-  raw_input()
-  stop_recording.set()
-
-  running_recording.pGet(None)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/android/tools/wait_for_devices.py b/third_party/catapult/devil/devil/android/tools/wait_for_devices.py
deleted file mode 100755
index 4bde2cd..0000000
--- a/third_party/catapult/devil/devil/android/tools/wait_for_devices.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Waits for the given devices to be available."""
-
-import argparse
-import os
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import device_utils
-from devil.utils import run_tests_helper
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser()
-  parser.add_argument('-v', '--verbose', action='count', help='Log more.')
-  parser.add_argument('-t', '--timeout', default=30, type=int,
-                      help='Seconds to wait for the devices.')
-  parser.add_argument('--adb-path', help='ADB binary to use.')
-  parser.add_argument('device_serials', nargs='*', metavar='SERIAL',
-                      help='Serials of the devices to wait for.')
-
-  args = parser.parse_args(raw_args)
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem(
-            'adb', devil_env.GetPlatform(), args.adb_path))
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  devices = device_utils.DeviceUtils.HealthyDevices(
-      device_arg=args.device_serials)
-  parallel_devices = device_utils.DeviceUtils.parallel(devices)
-  parallel_devices.WaitUntilFullyBooted(timeout=args.timeout)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/third_party/catapult/devil/devil/android/valgrind_tools/__init__.py b/third_party/catapult/devil/devil/android/valgrind_tools/__init__.py
deleted file mode 100644
index 0182d4c..0000000
--- a/third_party/catapult/devil/devil/android/valgrind_tools/__init__.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright (c) 2015 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.
-"""
-Classes in this package define additional actions that need to be taken to run a
-test under some kind of runtime error detection tool.
-
-The interface is intended to be used as follows.
-
-1. For tests that simply run a native process (i.e. no activity is spawned):
-
-Call tool.CopyFiles(device).
-Prepend test command line with tool.GetTestWrapper().
-
-2. For tests that spawn an activity:
-
-Call tool.CopyFiles(device).
-Call tool.SetupEnvironment().
-Run the test as usual.
-Call tool.CleanUpEnvironment().
-"""
diff --git a/third_party/catapult/devil/devil/android/valgrind_tools/base_tool.py b/third_party/catapult/devil/devil/android/valgrind_tools/base_tool.py
deleted file mode 100644
index 2e6e9af..0000000
--- a/third_party/catapult/devil/devil/android/valgrind_tools/base_tool.py
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright (c) 2015 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.
-
-
-class BaseTool(object):
-  """A tool that does nothing."""
-  # pylint: disable=R0201
-
-  def __init__(self):
-    """Does nothing."""
-    pass
-
-  def GetTestWrapper(self):
-    """Returns a string that is to be prepended to the test command line."""
-    return ''
-
-  def GetUtilWrapper(self):
-    """Returns the wrapper name for the utilities.
-
-    Returns:
-       A string that is to be prepended to the command line of utility
-    processes (forwarder, etc.).
-    """
-    return ''
-
-  @classmethod
-  def CopyFiles(cls, device):
-    """Copies tool-specific files to the device, create directories, etc."""
-    pass
-
-  def SetupEnvironment(self):
-    """Sets up the system environment for a test.
-
-    This is a good place to set system properties.
-    """
-    pass
-
-  def CleanUpEnvironment(self):
-    """Cleans up environment."""
-    pass
-
-  def GetTimeoutScale(self):
-    """Returns a multiplier that should be applied to timeout values."""
-    return 1.0
-
-  def NeedsDebugInfo(self):
-    """Whether this tool requires debug info.
-
-    Returns:
-      True if this tool can not work with stripped binaries.
-    """
-    return False
diff --git a/third_party/catapult/devil/devil/base_error.py b/third_party/catapult/devil/devil/base_error.py
deleted file mode 100644
index 4b89661..0000000
--- a/third_party/catapult/devil/devil/base_error.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2015 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.
-
-
-class BaseError(Exception):
-  """Base error for all test runner errors."""
-
-  def __init__(self, message, is_infra_error=False):
-    super(BaseError, self).__init__(message)
-    self._is_infra_error = is_infra_error
-
-  def __eq__(self, other):
-    return (self.message == other.message
-            and self.is_infra_error == other.is_infra_error)
-
-  def __ne__(self, other):
-    return not self == other
-
-  @property
-  def is_infra_error(self):
-    """Property to indicate if error was caused by an infrastructure issue."""
-    return self._is_infra_error
-
diff --git a/third_party/catapult/devil/devil/constants/__init__.py b/third_party/catapult/devil/devil/constants/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/third_party/catapult/devil/devil/constants/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2015 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.
diff --git a/third_party/catapult/devil/devil/constants/exit_codes.py b/third_party/catapult/devil/devil/constants/exit_codes.py
deleted file mode 100644
index aaeca4a..0000000
--- a/third_party/catapult/devil/devil/constants/exit_codes.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2012 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.
-
-"""Common exit codes used by devil."""
-
-ERROR = 1
-INFRA = 87
-WARNING = 88
diff --git a/third_party/catapult/devil/devil/devil_dependencies.json b/third_party/catapult/devil/devil/devil_dependencies.json
deleted file mode 100644
index bed6fe1..0000000
--- a/third_party/catapult/devil/devil/devil_dependencies.json
+++ /dev/null
@@ -1,127 +0,0 @@
-{
-  "config_type": "BaseConfig",
-  "dependencies": {
-    "aapt": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "16ba3180141a2489d7ec99b39fd6e3434a9a373f",
-          "download_path": "../bin/deps/linux2/x86_64/bin/aapt"
-        }
-      }
-    },
-    "adb": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "8bd43e3930f6eec643d5dc64cab9e5bb4ddf4909",
-          "download_path": "../bin/deps/linux2/x86_64/bin/adb"
-        }
-      }
-    },
-    "android_build_tools_libc++": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "91cdce1e3bd81b2ac1fd380013896d0e2cdb40a0",
-          "download_path": "../bin/deps/linux2/x86_64/lib/libc++.so"
-        }
-      }
-    },
-    "chromium_commands": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "4e22f641e4757309510e8d9f933f5aa504574ab6",
-          "download_path": "../bin/deps/linux2/x86_64/lib.java/chromium_commands.dex.jar"
-        }
-      }
-    },
-    "dexdump": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "acfb10f7a868baf9bcf446a2d9f8ed6b5d52c3c6",
-          "download_path": "../bin/deps/linux2/x86_64/bin/dexdump"
-        }
-      }
-    },
-    "fastboot": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "db9728166f182800eb9d09e9f036d56e105e8235",
-          "download_path": "../bin/deps/linux2/x86_64/bin/fastboot"
-        }
-      }
-    },
-    "forwarder_device": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "android_arm64-v8a": {
-          "cloud_storage_hash": "f222268d8442979240d1b18de00911a49e548daa",
-          "download_path": "../bin/deps/android/arm64-v8a/bin/forwarder_device"
-        },
-        "android_armeabi-v7a": {
-          "cloud_storage_hash": "c15267bf01c26eb0aea4f61c780bbba460c5c981",
-          "download_path": "../bin/deps/android/armeabi-v7a/bin/forwarder_device"
-        }
-      }
-    },
-    "forwarder_host": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "8fe69994b670f028484eed475dbffc838c8a57f7",
-          "download_path": "../bin/deps/linux2/x86_64/forwarder_host"
-        }
-      }
-    },
-    "md5sum_device": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "android_arm64-v8a": {
-          "cloud_storage_hash": "4e7d2dedd9c6321fdc152b06869e09a3c5817904",
-          "download_path": "../bin/deps/android/arm64-v8a/bin/md5sum_device"
-        },
-        "android_armeabi-v7a": {
-          "cloud_storage_hash": "39fd90af0f8828202b687f7128393759181c5e2e",
-          "download_path": "../bin/deps/android/armeabi-v7a/bin/md5sum_device"
-        },
-        "android_x86": {
-          "cloud_storage_hash": "d5cf42ab5986a69c31c0177b0df499d6bf708df6",
-          "download_path": "../bin/deps/android/x86/bin/md5sum_device"
-        }
-      }
-    },
-    "md5sum_host": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "4db5bd5e9bea8880d8bf2caa59d0efb0acc19f74",
-          "download_path": "../bin/deps/linux2/x86_64/bin/md5sum_host"
-        }
-      }
-    },
-    "split-select": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "abb9753a8d3efeea4144e328933931729e01571c",
-          "download_path": "../bin/deps/linux2/x86_64/bin/split-select"
-        }
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/third_party/catapult/devil/devil/devil_env.py b/third_party/catapult/devil/devil/devil_env.py
deleted file mode 100644
index aa4fe1e..0000000
--- a/third_party/catapult/devil/devil/devil_env.py
+++ /dev/null
@@ -1,194 +0,0 @@
-# Copyright 2015 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.
-
-import contextlib
-import json
-import logging
-import os
-import platform
-import sys
-import tempfile
-import threading
-
-CATAPULT_ROOT_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..'))
-DEPENDENCY_MANAGER_PATH = os.path.join(
-    CATAPULT_ROOT_PATH, 'dependency_manager')
-PYMOCK_PATH = os.path.join(
-    CATAPULT_ROOT_PATH, 'third_party', 'mock')
-
-
-@contextlib.contextmanager
-def SysPath(path):
-  sys.path.append(path)
-  yield
-  if sys.path[-1] != path:
-    sys.path.remove(path)
-  else:
-    sys.path.pop()
-
-with SysPath(DEPENDENCY_MANAGER_PATH):
-  import dependency_manager  # pylint: disable=import-error
-
-_ANDROID_BUILD_TOOLS = {'aapt', 'dexdump', 'split-select'}
-
-_DEVIL_DEFAULT_CONFIG = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), 'devil_dependencies.json'))
-
-_LEGACY_ENVIRONMENT_VARIABLES = {
-  'ADB_PATH': {
-    'dependency_name': 'adb',
-    'platform': 'linux2_x86_64',
-  },
-  'ANDROID_SDK_ROOT': {
-    'dependency_name': 'android_sdk',
-    'platform': 'linux2_x86_64',
-  },
-}
-
-
-def EmptyConfig():
-  return {
-    'config_type': 'BaseConfig',
-    'dependencies': {}
-  }
-
-
-def LocalConfigItem(dependency_name, dependency_platform, dependency_path):
-  if isinstance(dependency_path, basestring):
-    dependency_path = [dependency_path]
-  return {
-    dependency_name: {
-      'file_info': {
-        dependency_platform: {
-          'local_paths': dependency_path
-        },
-      },
-    },
-  }
-
-
-def _GetEnvironmentVariableConfig():
-  env_config = EmptyConfig()
-  path_config = (
-      (os.environ.get(k), v)
-      for k, v in _LEGACY_ENVIRONMENT_VARIABLES.iteritems())
-  path_config = ((p, c) for p, c in path_config if p)
-  for p, c in path_config:
-    env_config['dependencies'].update(
-        LocalConfigItem(c['dependency_name'], c['platform'], p))
-  return env_config
-
-
-class _Environment(object):
-
-  def __init__(self):
-    self._dm_init_lock = threading.Lock()
-    self._dm = None
-    self._logging_init_lock = threading.Lock()
-    self._logging_initialized = False
-
-  def Initialize(self, configs=None, config_files=None):
-    """Initialize devil's environment from configuration files.
-
-    This uses all configurations provided via |configs| and |config_files|
-    to determine the locations of devil's dependencies. Configurations should
-    all take the form described by py_utils.dependency_manager.BaseConfig.
-    If no configurations are provided, a default one will be used if available.
-
-    Args:
-      configs: An optional list of dict configurations.
-      config_files: An optional list of files to load
-    """
-
-    # Make sure we only initialize self._dm once.
-    with self._dm_init_lock:
-      if self._dm is None:
-        if configs is None:
-          configs = []
-
-        env_config = _GetEnvironmentVariableConfig()
-        if env_config:
-          configs.insert(0, env_config)
-        self._InitializeRecursive(
-            configs=configs,
-            config_files=config_files)
-        assert self._dm is not None, 'Failed to create dependency manager.'
-
-  def _InitializeRecursive(self, configs=None, config_files=None):
-    # This recurses through configs to create temporary files for each and
-    # take advantage of context managers to appropriately close those files.
-    # TODO(jbudorick): Remove this recursion if/when dependency_manager
-    # supports loading configurations directly from a dict.
-    if configs:
-      with tempfile.NamedTemporaryFile(delete=False) as next_config_file:
-        try:
-          next_config_file.write(json.dumps(configs[0]))
-          next_config_file.close()
-          self._InitializeRecursive(
-              configs=configs[1:],
-              config_files=[next_config_file.name] + (config_files or []))
-        finally:
-          if os.path.exists(next_config_file.name):
-            os.remove(next_config_file.name)
-    else:
-      config_files = config_files or []
-      if 'DEVIL_ENV_CONFIG' in os.environ:
-        config_files.append(os.environ.get('DEVIL_ENV_CONFIG'))
-      config_files.append(_DEVIL_DEFAULT_CONFIG)
-
-      self._dm = dependency_manager.DependencyManager(
-          [dependency_manager.BaseConfig(c) for c in config_files])
-
-  def InitializeLogging(self, log_level, formatter=None, handler=None):
-    if self._logging_initialized:
-      return
-
-    with self._logging_init_lock:
-      if self._logging_initialized:
-        return
-
-      formatter = formatter or logging.Formatter(
-          '%(threadName)-4s  %(message)s')
-      handler = handler or logging.StreamHandler(sys.stdout)
-      handler.setFormatter(formatter)
-
-      devil_logger = logging.getLogger('devil')
-      devil_logger.setLevel(log_level)
-      devil_logger.propagate = False
-      devil_logger.addHandler(handler)
-
-      import py_utils.cloud_storage
-      lock_logger = py_utils.cloud_storage.logger
-      lock_logger.setLevel(log_level)
-      lock_logger.propagate = False
-      lock_logger.addHandler(handler)
-
-      self._logging_initialized = True
-
-  def FetchPath(self, dependency, arch=None, device=None):
-    if self._dm is None:
-      self.Initialize()
-    if dependency in _ANDROID_BUILD_TOOLS:
-      self.FetchPath('android_build_tools_libc++', arch=arch, device=device)
-    return self._dm.FetchPath(dependency, GetPlatform(arch, device))
-
-  def LocalPath(self, dependency, arch=None, device=None):
-    if self._dm is None:
-      self.Initialize()
-    return self._dm.LocalPath(dependency, GetPlatform(arch, device))
-
-  def PrefetchPaths(self, dependencies=None, arch=None, device=None):
-    return self._dm.PrefetchPaths(
-        GetPlatform(arch, device), dependencies=dependencies)
-
-
-def GetPlatform(arch=None, device=None):
-  if arch or device:
-    return 'android_%s' % (arch or device.product_cpu_abi)
-  return '%s_%s' % (sys.platform, platform.machine())
-
-
-config = _Environment()
-
diff --git a/third_party/catapult/devil/devil/devil_env_test.py b/third_party/catapult/devil/devil/devil_env_test.py
deleted file mode 100755
index e78221a..0000000
--- a/third_party/catapult/devil/devil/devil_env_test.py
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-# pylint: disable=protected-access
-
-import logging
-import sys
-import unittest
-
-from devil import devil_env
-
-_sys_path_before = list(sys.path)
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  _sys_path_with_pymock = list(sys.path)
-  import mock  # pylint: disable=import-error
-_sys_path_after = list(sys.path)
-
-
-class DevilEnvTest(unittest.TestCase):
-
-  def testSysPath(self):
-    self.assertEquals(_sys_path_before, _sys_path_after)
-    self.assertEquals(
-        _sys_path_before + [devil_env.PYMOCK_PATH],
-        _sys_path_with_pymock)
-
-  def testGetEnvironmentVariableConfig_configType(self):
-    with mock.patch('os.environ.get',
-                    mock.Mock(side_effect=lambda _env_var: None)):
-      env_config = devil_env._GetEnvironmentVariableConfig()
-    self.assertEquals('BaseConfig', env_config.get('config_type'))
-
-  def testGetEnvironmentVariableConfig_noEnv(self):
-    with mock.patch('os.environ.get',
-                    mock.Mock(side_effect=lambda _env_var: None)):
-      env_config = devil_env._GetEnvironmentVariableConfig()
-    self.assertEquals({}, env_config.get('dependencies'))
-
-  def testGetEnvironmentVariableConfig_adbPath(self):
-    def mock_environment(env_var):
-      return '/my/fake/adb/path' if env_var == 'ADB_PATH' else None
-
-    with mock.patch('os.environ.get',
-                    mock.Mock(side_effect=mock_environment)):
-      env_config = devil_env._GetEnvironmentVariableConfig()
-    self.assertEquals(
-        {
-          'adb': {
-            'file_info': {
-              'linux2_x86_64': {
-                'local_paths': ['/my/fake/adb/path'],
-              },
-            },
-          },
-        },
-        env_config.get('dependencies'))
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/utils/__init__.py b/third_party/catapult/devil/devil/utils/__init__.py
deleted file mode 100644
index ff84988..0000000
--- a/third_party/catapult/devil/devil/utils/__init__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2015 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.
-
-import os
-import sys
-
-def _JoinPath(*path_parts):
-  return os.path.abspath(os.path.join(*path_parts))
-
-
-def _AddDirToPythonPath(*path_parts):
-  path = _JoinPath(*path_parts)
-  if os.path.isdir(path) and path not in sys.path:
-    # Some call sites that use Telemetry assume that sys.path[0] is the
-    # directory containing the script, so we add these extra paths to right
-    # after sys.path[0].
-    sys.path.insert(1, path)
-
-_CATAPULT_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                             os.path.pardir, os.path.pardir, os.path.pardir)
-
-_AddDirToPythonPath(_CATAPULT_DIR, 'common', 'battor')
diff --git a/third_party/catapult/devil/devil/utils/battor_device_mapping.py b/third_party/catapult/devil/devil/utils/battor_device_mapping.py
deleted file mode 100755
index 8cabb83..0000000
--- a/third_party/catapult/devil/devil/utils/battor_device_mapping.py
+++ /dev/null
@@ -1,309 +0,0 @@
-#!/usr/bin/python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-'''
-This script provides tools to map BattOrs to phones.
-
-Phones are identified by the following string:
-
-"Phone serial number" - Serial number of the phone. This can be
-obtained via 'adb devices' or 'usb-devices', and is not expected
-to change for a given phone.
-
-BattOrs are identified by the following two strings:
-
-"BattOr serial number" - Serial number of the BattOr. This can be
-obtained via 'usb-devices', and is not expected to change for
-a given BattOr.
-
-"BattOr path" - The path of the form '/dev/ttyUSB*' that is used
-to communicate with the BattOr (the battor_agent binary takes
-this BattOr path as a parameter). The BattOr path is frequently
-reassigned by the OS, most often when the device is disconnected
-and then reconnected. Thus, the BattOr path cannot be expected
-to be stable.
-
-In a typical application, the user will require the BattOr path
-for the BattOr that is plugged into a given phone. For instance,
-the user will be running tracing on a particular phone, and will
-need to know which BattOr path to use to communicate with the BattOr
-to get the corresponding power trace.
-
-Getting this mapping requires two steps: (1) determining the
-mapping between phone serial numbers and BattOr serial numbers, and
-(2) getting the BattOr path corresponding to a given BattOr serial
-number.
-
-For step (1), we generate a JSON file giving this mapping. This
-JSON file consists of a list of items of the following form:
-[{'phone': <phone serial 1>, 'battor': <battor serial 1>},
-{'phone': <phone serial 2>, 'battor': <battor serial 2>}, ...]
-
-The default way to generate this JSON file is using the function
-GenerateSerialMapFile, which generates a mapping based on assuming
-that the system has two identical USB hubs connected to it, and
-the phone plugged into physical port number 1 on one hub corresponds
-to the BattOr plugged into physical port number 1 on the other hub,
-and similarly with physical port numbers 2, 3, etc. This generates
-the map file based on the structure at the time GenerateSerialMapFile called.
-Note that after the map file is generated, port numbers are no longer used;
-the user could move around the devices in the ports without affecting
-which phone goes with which BattOr. (Thus, if the user wanted to update the
-mapping to match the new port connections, the user would have to
-re-generate this file.)
-
-The script update_mapping.py will do this updating from the command line.
-
-If the user wanted to specify a custom mapping, the user could instead
-create the JSON file manually. (In this case, hubs would not be necessary
-and the physical ports connected would be irrelevant.)
-
-Step (2) is conducted through the function GetBattOrPathFromPhoneSerial,
-which takes a serial number mapping generated via step (1) and a phone
-serial number, then gets the corresponding BattOr serial number from the
-map and determines its BattOr path (e.g. /dev/ttyUSB0). Since BattOr paths
-can change if devices are connected and disconnected (even if connected
-or disconnected via the same port) this function should be called to
-determine the BattOr path every time before connecting to the BattOr.
-
-Note that if there is only one BattOr connected to the system, then
-GetBattOrPathFromPhoneSerial will always return that BattOr and will ignore
-the mapping file. Thus, if the user never has more than one BattOr connected
-to the system, the user will not need to generate mapping files.
-'''
-
-
-import json
-import collections
-
-from battor import battor_error
-from devil.utils import find_usb_devices
-from devil.utils import usb_hubs
-
-
-def GetBattOrList(device_tree_map):
-  return [x for x in find_usb_devices.GetTTYList()
-          if IsBattOr(x, device_tree_map)]
-
-
-def IsBattOr(tty_string, device_tree_map):
-  (bus, device) = find_usb_devices.GetBusDeviceFromTTY(tty_string)
-  node = device_tree_map[bus].FindDeviceNumber(device)
-  return '0403:6001' in node.desc
-
-
-def GetBattOrSerialNumbers(device_tree_map):
-  for x in find_usb_devices.GetTTYList():
-    if IsBattOr(x, device_tree_map):
-      (bus, device) = find_usb_devices.GetBusDeviceFromTTY(x)
-      devnode = device_tree_map[bus].FindDeviceNumber(device)
-      yield devnode.serial
-
-
-def ReadSerialMapFile(filename):
-  """Reads JSON file giving phone-to-battor serial number map.
-
-  Parses a JSON file consisting of a list of items of the following form:
-  [{'phone': <phone serial 1>, 'battor': <battor serial 1>},
-  {'phone': <phone serial 2>, 'battor': <battor serial 2>}, ...]
-
-  indicating which phone serial numbers should be matched with
-  which BattOr serial numbers. Returns dictionary of the form:
-
-  {<phone serial 1>: <BattOr serial 1>,
-   <phone serial 2>: <BattOr serial 2>}
-
-  Args:
-      filename: Name of file to read.
-  """
-  result = {}
-  with open(filename, 'r') as infile:
-    in_dict = json.load(infile)
-  for x in in_dict:
-    result[x['phone']] = x['battor']
-  return result
-
-def WriteSerialMapFile(filename, serial_map):
-  """Writes a map of phone serial numbers to BattOr serial numbers to file.
-
-  Writes a JSON file consisting of a list of items of the following form:
-  [{'phone': <phone serial 1>, 'battor': <battor serial 1>},
-  {'phone': <phone serial 2>, 'battor': <battor serial 2>}, ...]
-
-  indicating which phone serial numbers should be matched with
-  which BattOr serial numbers. Mapping is based on the physical port numbers
-  of the hubs that the BattOrs and phones are connected to.
-
-  Args:
-      filename: Name of file to write.
-      serial_map: Serial map {phone: battor}
-  """
-  result = []
-  for (phone, battor) in serial_map.iteritems():
-    result.append({'phone': phone, 'battor': battor})
-  with open(filename, 'w') as outfile:
-    json.dump(result, outfile)
-
-def GenerateSerialMap(hub_types=None):
-  """Generates a map of phone serial numbers to BattOr serial numbers.
-
-  Generates a dict of:
-  {<phone serial 1>: <battor serial 1>,
-   <phone serial 2>: <battor serial 2>}
-  indicating which phone serial numbers should be matched with
-  which BattOr serial numbers. Mapping is based on the physical port numbers
-  of the hubs that the BattOrs and phones are connected to.
-
-  Args:
-      hub_types: List of hub types to check for. If not specified, checks
-      for all defined hub types. (see usb_hubs.py for details)
-  """
-  if hub_types:
-    hub_types = [usb_hubs.GetHubType(x) for x in hub_types]
-  else:
-    hub_types = usb_hubs.ALL_HUBS
-
-  devtree = find_usb_devices.GetBusNumberToDeviceTreeMap()
-
-  # List of serial numbers in the system that represent BattOrs.
-  battor_serials = list(GetBattOrSerialNumbers(devtree))
-
-  # If there's only one BattOr in the system, then a serial number ma
-  # is not necessary.
-  if len(battor_serials) == 1:
-    return {}
-
-  # List of dictionaries, one for each hub, that maps the physical
-  # port number to the serial number of that hub. For instance, in a 2
-  # hub system, this could return [{1:'ab', 2:'cd'}, {1:'jkl', 2:'xyz'}]
-  # where 'ab' and 'cd' are the phone serial numbers and 'jkl' and 'xyz'
-  # are the BattOr serial numbers.
-  port_to_serial = find_usb_devices.GetAllPhysicalPortToSerialMaps(
-      hub_types, device_tree_map=devtree)
-
-  class serials(object):
-    def __init__(self):
-      self.phone = None
-      self.battor = None
-
-  # Map of {physical port number: [phone serial #, BattOr serial #]. This
-  # map is populated by executing the code below. For instance, in the above
-  # example, after the code below is executed, port_to_devices would equal
-  # {1: ['ab', 'jkl'], 2: ['cd', 'xyz']}
-  port_to_devices = collections.defaultdict(serials)
-  for hub in port_to_serial:
-    for (port, serial) in hub.iteritems():
-      if serial in battor_serials:
-        if port_to_devices[port].battor is not None:
-          raise battor_error.BattOrError('Multiple BattOrs on same port number')
-        else:
-          port_to_devices[port].battor = serial
-      else:
-        if port_to_devices[port].phone is not None:
-          raise battor_error.BattOrError('Multiple phones on same port number')
-        else:
-          port_to_devices[port].phone = serial
-
-  # Turn the port_to_devices map into a map of the form
-  # {phone serial number: BattOr serial number}.
-  result = {}
-  for pair in port_to_devices.values():
-    if pair.phone is None:
-      continue
-    if pair.battor is None:
-      raise battor_error.BattOrError(
-          'Phone detected with no corresponding BattOr')
-    result[pair.phone] = pair.battor
-  return result
-
-def GenerateSerialMapFile(filename, hub_types=None):
-  """Generates a serial map file and writes it."""
-  WriteSerialMapFile(filename, GenerateSerialMap(hub_types))
-
-def _PhoneToPathMap(serial, serial_map, devtree):
-  """Maps phone serial number to TTY path, assuming serial map is provided."""
-  try:
-    battor_serial = serial_map[serial]
-  except KeyError:
-    raise battor_error.BattOrError('Serial number not found in serial map.')
-  for tree in devtree.values():
-    for node in tree.AllNodes():
-      if isinstance(node, find_usb_devices.USBDeviceNode):
-        if node.serial == battor_serial:
-          bus_device_to_tty = find_usb_devices.GetBusDeviceToTTYMap()
-          bus_device = (node.bus_num, node.device_num)
-          try:
-            return bus_device_to_tty[bus_device]
-          except KeyError:
-            raise battor_error.BattOrError(
-                'Device with given serial number not a BattOr '
-                '(does not have TTY path)')
-
-
-def GetBattOrPathFromPhoneSerial(serial, serial_map=None,
-                                 serial_map_file=None):
-  """Gets the TTY path (e.g. '/dev/ttyUSB0')  to communicate with the BattOr.
-
-  (1) If serial_map is given, it is treated as a dictionary mapping
-  phone serial numbers to BattOr serial numbers. This function will get the
-  TTY path for the given BattOr serial number.
-
-  (2) If serial_map_file is given, it is treated as the name of a
-  phone-to-BattOr mapping file (generated with GenerateSerialMapFile)
-  and this will be loaded and used as the dict to map port numbers to
-  BattOr serial numbers.
-
-  You can only give one of serial_map and serial_map_file.
-
-  Args:
-    serial: Serial number of phone connected on the same physical port that
-    the BattOr is connected to.
-    serial_map: Map of phone serial numbers to BattOr serial numbers, given
-    as a dictionary.
-    serial_map_file: Map of phone serial numbers to BattOr serial numbers,
-    given as a file.
-    hub_types: List of hub types to check for. Used only if serial_map_file
-    is None.
-
-  Returns:
-    Device string used to communicate with device.
-
-  Raises:
-    ValueError: If serial number is not given.
-    BattOrError: If BattOr not found or unexpected USB topology.
-  """
-  # If there's only one BattOr connected to the system, just use that one.
-  # This allows for use on, e.g., a developer's workstation with no hubs.
-  devtree = find_usb_devices.GetBusNumberToDeviceTreeMap()
-  all_battors = GetBattOrList(devtree)
-  if len(all_battors) == 1:
-    return '/dev/' + all_battors[0]
-
-  if not serial:
-    raise battor_error.BattOrError(
-        'Two or more BattOrs connected, no serial provided')
-
-  if serial_map and serial_map_file:
-    raise ValueError('Cannot specify both serial_map and serial_map_file')
-
-  if serial_map_file:
-    serial_map = ReadSerialMapFile(serial_map_file)
-
-  tty_string = _PhoneToPathMap(serial, serial_map, devtree)
-
-  if not tty_string:
-    raise battor_error.BattOrError(
-        'No device with given serial number detected.')
-
-  if IsBattOr(tty_string, devtree):
-    return '/dev/' + tty_string
-  else:
-    raise battor_error.BattOrError(
-        'Device with given serial number is not a BattOr.')
-
-if __name__ == '__main__':
-  # Main function for testing purposes
-  print GenerateSerialMap()
diff --git a/third_party/catapult/devil/devil/utils/cmd_helper.py b/third_party/catapult/devil/devil/utils/cmd_helper.py
deleted file mode 100644
index 06c105f..0000000
--- a/third_party/catapult/devil/devil/utils/cmd_helper.py
+++ /dev/null
@@ -1,394 +0,0 @@
-# Copyright (c) 2012 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.
-
-"""A wrapper for subprocess to make calling shell commands easier."""
-
-import logging
-import os
-import pipes
-import select
-import signal
-import string
-import StringIO
-import subprocess
-import sys
-import time
-
-# fcntl is not available on Windows.
-try:
-  import fcntl
-except ImportError:
-  fcntl = None
-
-logger = logging.getLogger(__name__)
-
-_SafeShellChars = frozenset(string.ascii_letters + string.digits + '@%_-+=:,./')
-
-
-def SingleQuote(s):
-  """Return an shell-escaped version of the string using single quotes.
-
-  Reliably quote a string which may contain unsafe characters (e.g. space,
-  quote, or other special characters such as '$').
-
-  The returned value can be used in a shell command line as one token that gets
-  to be interpreted literally.
-
-  Args:
-    s: The string to quote.
-
-  Return:
-    The string quoted using single quotes.
-  """
-  return pipes.quote(s)
-
-
-def DoubleQuote(s):
-  """Return an shell-escaped version of the string using double quotes.
-
-  Reliably quote a string which may contain unsafe characters (e.g. space
-  or quote characters), while retaining some shell features such as variable
-  interpolation.
-
-  The returned value can be used in a shell command line as one token that gets
-  to be further interpreted by the shell.
-
-  The set of characters that retain their special meaning may depend on the
-  shell implementation. This set usually includes: '$', '`', '\', '!', '*',
-  and '@'.
-
-  Args:
-    s: The string to quote.
-
-  Return:
-    The string quoted using double quotes.
-  """
-  if not s:
-    return '""'
-  elif all(c in _SafeShellChars for c in s):
-    return s
-  else:
-    return '"' + s.replace('"', '\\"') + '"'
-
-
-def ShrinkToSnippet(cmd_parts, var_name, var_value):
-  """Constructs a shell snippet for a command using a variable to shrink it.
-
-  Takes into account all quoting that needs to happen.
-
-  Args:
-    cmd_parts: A list of command arguments.
-    var_name: The variable that holds var_value.
-    var_value: The string to replace in cmd_parts with $var_name
-
-  Returns:
-    A shell snippet that does not include setting the variable.
-  """
-  def shrink(value):
-    parts = (x and SingleQuote(x) for x in value.split(var_value))
-    with_substitutions = ('"$%s"' % var_name).join(parts)
-    return with_substitutions or "''"
-
-  return ' '.join(shrink(part) for part in cmd_parts)
-
-
-def Popen(args, stdout=None, stderr=None, shell=None, cwd=None, env=None):
-  # preexec_fn isn't supported on windows.
-  if sys.platform == 'win32':
-    preexec_fn = None
-  else:
-    preexec_fn = lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL)
-
-  return subprocess.Popen(
-      args=args, cwd=cwd, stdout=stdout, stderr=stderr,
-      shell=shell, close_fds=True, env=env, preexec_fn=preexec_fn)
-
-
-def Call(args, stdout=None, stderr=None, shell=None, cwd=None, env=None):
-  pipe = Popen(args, stdout=stdout, stderr=stderr, shell=shell, cwd=cwd,
-               env=env)
-  pipe.communicate()
-  return pipe.wait()
-
-
-def RunCmd(args, cwd=None):
-  """Opens a subprocess to execute a program and returns its return value.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-
-  Returns:
-    Return code from the command execution.
-  """
-  logger.info(str(args) + ' ' + (cwd or ''))
-  return Call(args, cwd=cwd)
-
-
-def GetCmdOutput(args, cwd=None, shell=False):
-  """Open a subprocess to execute a program and returns its output.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command.
-
-  Returns:
-    Captures and returns the command's stdout.
-    Prints the command's stderr to logger (which defaults to stdout).
-  """
-  (_, output) = GetCmdStatusAndOutput(args, cwd, shell)
-  return output
-
-
-def _ValidateAndLogCommand(args, cwd, shell):
-  if isinstance(args, basestring):
-    if not shell:
-      raise Exception('string args must be run with shell=True')
-  else:
-    if shell:
-      raise Exception('array args must be run with shell=False')
-    args = ' '.join(SingleQuote(c) for c in args)
-  if cwd is None:
-    cwd = ''
-  else:
-    cwd = ':' + cwd
-  logger.info('[host]%s> %s', cwd, args)
-  return args
-
-
-def GetCmdStatusAndOutput(args, cwd=None, shell=False):
-  """Executes a subprocess and returns its exit code and output.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-
-  Returns:
-    The 2-tuple (exit code, output).
-  """
-  status, stdout, stderr = GetCmdStatusOutputAndError(
-      args, cwd=cwd, shell=shell)
-
-  if stderr:
-    logger.critical('STDERR: %s', stderr)
-  logger.debug('STDOUT: %s%s', stdout[:4096].rstrip(),
-               '<truncated>' if len(stdout) > 4096 else '')
-  return (status, stdout)
-
-
-def GetCmdStatusOutputAndError(args, cwd=None, shell=False):
-  """Executes a subprocess and returns its exit code, output, and errors.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-
-  Returns:
-    The 2-tuple (exit code, output).
-  """
-  _ValidateAndLogCommand(args, cwd, shell)
-  pipe = Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
-               shell=shell, cwd=cwd)
-  stdout, stderr = pipe.communicate()
-  return (pipe.returncode, stdout, stderr)
-
-
-class TimeoutError(Exception):
-  """Module-specific timeout exception."""
-
-  def __init__(self, output=None):
-    super(TimeoutError, self).__init__()
-    self._output = output
-
-  @property
-  def output(self):
-    return self._output
-
-
-def _IterProcessStdout(process, iter_timeout=None, timeout=None,
-                       buffer_size=4096, poll_interval=1):
-  """Iterate over a process's stdout.
-
-  This is intentionally not public.
-
-  Args:
-    process: The process in question.
-    iter_timeout: An optional length of time, in seconds, to wait in
-      between each iteration. If no output is received in the given
-      time, this generator will yield None.
-    timeout: An optional length of time, in seconds, during which
-      the process must finish. If it fails to do so, a TimeoutError
-      will be raised.
-    buffer_size: The maximum number of bytes to read (and thus yield) at once.
-    poll_interval: The length of time to wait in calls to `select.select`.
-      If iter_timeout is set, the remaining length of time in the iteration
-      may take precedence.
-  Raises:
-    TimeoutError: if timeout is set and the process does not complete.
-  Yields:
-    basestrings of data or None.
-  """
-
-  assert fcntl, 'fcntl module is required'
-  try:
-    # Enable non-blocking reads from the child's stdout.
-    child_fd = process.stdout.fileno()
-    fl = fcntl.fcntl(child_fd, fcntl.F_GETFL)
-    fcntl.fcntl(child_fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
-
-    end_time = (time.time() + timeout) if timeout else None
-    iter_end_time = (time.time() + iter_timeout) if iter_timeout else None
-
-    while True:
-      if end_time and time.time() > end_time:
-        raise TimeoutError()
-      if iter_end_time and time.time() > iter_end_time:
-        yield None
-        iter_end_time = time.time() + iter_timeout
-
-      if iter_end_time:
-        iter_aware_poll_interval = min(
-            poll_interval,
-            max(0, iter_end_time - time.time()))
-      else:
-        iter_aware_poll_interval = poll_interval
-
-      read_fds, _, _ = select.select(
-          [child_fd], [], [], iter_aware_poll_interval)
-      if child_fd in read_fds:
-        data = os.read(child_fd, buffer_size)
-        if not data:
-          break
-        yield data
-      if process.poll() is not None:
-        break
-  finally:
-    try:
-      if process.returncode is None:
-        # Make sure the process doesn't stick around if we fail with an
-        # exception.
-        process.kill()
-    except OSError:
-      pass
-    process.wait()
-
-
-def GetCmdStatusAndOutputWithTimeout(args, timeout, cwd=None, shell=False,
-                                     logfile=None):
-  """Executes a subprocess with a timeout.
-
-  Args:
-    args: List of arguments to the program, the program to execute is the first
-      element.
-    timeout: the timeout in seconds or None to wait forever.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-    logfile: Optional file-like object that will receive output from the
-      command as it is running.
-
-  Returns:
-    The 2-tuple (exit code, output).
-  Raises:
-    TimeoutError on timeout.
-  """
-  _ValidateAndLogCommand(args, cwd, shell)
-  output = StringIO.StringIO()
-  process = Popen(args, cwd=cwd, shell=shell, stdout=subprocess.PIPE,
-                  stderr=subprocess.STDOUT)
-  try:
-    for data in _IterProcessStdout(process, timeout=timeout):
-      if logfile:
-        logfile.write(data)
-      output.write(data)
-  except TimeoutError:
-    raise TimeoutError(output.getvalue())
-
-  str_output = output.getvalue()
-  logger.debug('STDOUT+STDERR: %s%s', str_output[:4096].rstrip(),
-               '<truncated>' if len(str_output) > 4096 else '')
-  return process.returncode, str_output
-
-
-def IterCmdOutputLines(args, iter_timeout=None, timeout=None, cwd=None,
-                       shell=False, check_status=True):
-  """Executes a subprocess and continuously yields lines from its output.
-
-  Args:
-    args: List of arguments to the program, the program to execute is the first
-      element.
-    iter_timeout: Timeout for each iteration, in seconds.
-    timeout: Timeout for the entire command, in seconds.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-    check_status: A boolean indicating whether to check the exit status of the
-      process after all output has been read.
-  Yields:
-    The output of the subprocess, line by line.
-
-  Raises:
-    CalledProcessError if check_status is True and the process exited with a
-      non-zero exit status.
-  """
-  cmd = _ValidateAndLogCommand(args, cwd, shell)
-  process = Popen(args, cwd=cwd, shell=shell, stdout=subprocess.PIPE,
-                  stderr=subprocess.STDOUT)
-  return _IterCmdOutputLines(
-      process, cmd, iter_timeout=iter_timeout, timeout=timeout,
-      check_status=check_status)
-
-def _IterCmdOutputLines(process, cmd, iter_timeout=None, timeout=None,
-                        check_status=True):
-  buffer_output = ''
-
-  iter_end = None
-  cur_iter_timeout = None
-  if iter_timeout:
-    iter_end = time.time() + iter_timeout
-    cur_iter_timeout = iter_timeout
-
-  for data in _IterProcessStdout(process, iter_timeout=cur_iter_timeout,
-                                 timeout=timeout):
-    if iter_timeout:
-      # Check whether the current iteration has timed out.
-      cur_iter_timeout = iter_end - time.time()
-      if data is None or cur_iter_timeout < 0:
-        yield None
-        iter_end = time.time() + iter_timeout
-        continue
-    else:
-      assert data is not None, (
-          'Iteration received no data despite no iter_timeout being set. '
-          'cmd: %s' % cmd)
-
-    # Construct lines to yield from raw data.
-    buffer_output += data
-    has_incomplete_line = buffer_output[-1] not in '\r\n'
-    lines = buffer_output.splitlines()
-    buffer_output = lines.pop() if has_incomplete_line else ''
-    for line in lines:
-      yield line
-      if iter_timeout:
-        iter_end = time.time() + iter_timeout
-
-  if buffer_output:
-    yield buffer_output
-  if check_status and process.returncode:
-    raise subprocess.CalledProcessError(process.returncode, cmd)
diff --git a/third_party/catapult/devil/devil/utils/cmd_helper_test.py b/third_party/catapult/devil/devil/utils/cmd_helper_test.py
deleted file mode 100755
index 783c413..0000000
--- a/third_party/catapult/devil/devil/utils/cmd_helper_test.py
+++ /dev/null
@@ -1,262 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Tests for the cmd_helper module."""
-
-import unittest
-import subprocess
-import time
-
-from devil import devil_env
-from devil.utils import cmd_helper
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class CmdHelperSingleQuoteTest(unittest.TestCase):
-
-  def testSingleQuote_basic(self):
-    self.assertEquals('hello',
-                      cmd_helper.SingleQuote('hello'))
-
-  def testSingleQuote_withSpaces(self):
-    self.assertEquals("'hello world'",
-                      cmd_helper.SingleQuote('hello world'))
-
-  def testSingleQuote_withUnsafeChars(self):
-    self.assertEquals("""'hello'"'"'; rm -rf /'""",
-                      cmd_helper.SingleQuote("hello'; rm -rf /"))
-
-  def testSingleQuote_dontExpand(self):
-    test_string = 'hello $TEST_VAR'
-    cmd = 'TEST_VAR=world; echo %s' % cmd_helper.SingleQuote(test_string)
-    self.assertEquals(test_string,
-                      cmd_helper.GetCmdOutput(cmd, shell=True).rstrip())
-
-
-class CmdHelperDoubleQuoteTest(unittest.TestCase):
-
-  def testDoubleQuote_basic(self):
-    self.assertEquals('hello',
-                      cmd_helper.DoubleQuote('hello'))
-
-  def testDoubleQuote_withSpaces(self):
-    self.assertEquals('"hello world"',
-                      cmd_helper.DoubleQuote('hello world'))
-
-  def testDoubleQuote_withUnsafeChars(self):
-    self.assertEquals('''"hello\\"; rm -rf /"''',
-                      cmd_helper.DoubleQuote('hello"; rm -rf /'))
-
-  def testSingleQuote_doExpand(self):
-    test_string = 'hello $TEST_VAR'
-    cmd = 'TEST_VAR=world; echo %s' % cmd_helper.DoubleQuote(test_string)
-    self.assertEquals('hello world',
-                      cmd_helper.GetCmdOutput(cmd, shell=True).rstrip())
-
-
-class CmdHelperShinkToSnippetTest(unittest.TestCase):
-
-  def testShrinkToSnippet_noArgs(self):
-    self.assertEquals('foo',
-        cmd_helper.ShrinkToSnippet(['foo'], 'a', 'bar'))
-    self.assertEquals("'foo foo'",
-        cmd_helper.ShrinkToSnippet(['foo foo'], 'a', 'bar'))
-    self.assertEquals('"$a"\' bar\'',
-        cmd_helper.ShrinkToSnippet(['foo bar'], 'a', 'foo'))
-    self.assertEquals('\'foo \'"$a"',
-        cmd_helper.ShrinkToSnippet(['foo bar'], 'a', 'bar'))
-    self.assertEquals('foo"$a"',
-        cmd_helper.ShrinkToSnippet(['foobar'], 'a', 'bar'))
-
-  def testShrinkToSnippet_singleArg(self):
-    self.assertEquals("foo ''",
-        cmd_helper.ShrinkToSnippet(['foo', ''], 'a', 'bar'))
-    self.assertEquals("foo foo",
-        cmd_helper.ShrinkToSnippet(['foo', 'foo'], 'a', 'bar'))
-    self.assertEquals('"$a" "$a"',
-        cmd_helper.ShrinkToSnippet(['foo', 'foo'], 'a', 'foo'))
-    self.assertEquals('foo "$a""$a"',
-        cmd_helper.ShrinkToSnippet(['foo', 'barbar'], 'a', 'bar'))
-    self.assertEquals('foo "$a"\' \'"$a"',
-        cmd_helper.ShrinkToSnippet(['foo', 'bar bar'], 'a', 'bar'))
-    self.assertEquals('foo "$a""$a"\' \'',
-        cmd_helper.ShrinkToSnippet(['foo', 'barbar '], 'a', 'bar'))
-    self.assertEquals('foo \' \'"$a""$a"\' \'',
-        cmd_helper.ShrinkToSnippet(['foo', ' barbar '], 'a', 'bar'))
-
-
-_DEFAULT = 'DEFAULT'
-
-
-class _ProcessOutputEvent(object):
-
-  def __init__(self, select_fds=_DEFAULT, read_contents=None, ts=_DEFAULT):
-    self.select_fds = select_fds
-    self.read_contents = read_contents
-    self.ts = ts
-
-
-class _MockProcess(object):
-
-  def __init__(self, output_sequence=None, return_value=0):
-
-    # Arbitrary.
-    fake_stdout_fileno = 25
-
-    self.mock_proc = mock.MagicMock(spec=subprocess.Popen)
-    self.mock_proc.stdout = mock.MagicMock()
-    self.mock_proc.stdout.fileno = mock.MagicMock(
-        return_value=fake_stdout_fileno)
-    self.mock_proc.returncode = None
-
-    self._return_value = return_value
-
-    # This links the behavior of os.read, select.select, time.time, and
-    # <process>.poll. The output sequence can be thought of as a list of
-    # return values for select.select with corresponding return values for
-    # the other calls at any time between that select call and the following
-    # one. We iterate through the sequence only on calls to select.select.
-    #
-    # os.read is a special case, though, where we only return a given chunk
-    # of data *once* after a given call to select.
-
-    if not output_sequence:
-      output_sequence = []
-
-    # Use an leading element to make the iteration logic work.
-    initial_seq_element = _ProcessOutputEvent(
-        _DEFAULT, '',
-        output_sequence[0].ts if output_sequence else _DEFAULT)
-    output_sequence.insert(0, initial_seq_element)
-
-    for o in output_sequence:
-      if o.select_fds == _DEFAULT:
-        if o.read_contents is None:
-          o.select_fds = []
-        else:
-          o.select_fds = [fake_stdout_fileno]
-      if o.ts == _DEFAULT:
-        o.ts = time.time()
-    self._output_sequence = output_sequence
-
-    self._output_seq_index = 0
-    self._read_flags = [False] * len(output_sequence)
-
-    def read_side_effect(*_args, **_kwargs):
-      if self._read_flags[self._output_seq_index]:
-        return None
-      self._read_flags[self._output_seq_index] = True
-      return self._output_sequence[self._output_seq_index].read_contents
-
-    def select_side_effect(*_args, **_kwargs):
-      if self._output_seq_index is None:
-        self._output_seq_index = 0
-      else:
-        self._output_seq_index += 1
-      return (self._output_sequence[self._output_seq_index].select_fds,
-              None, None)
-
-    def time_side_effect(*_args, **_kwargs):
-      return self._output_sequence[self._output_seq_index].ts
-
-    def poll_side_effect(*_args, **_kwargs):
-      if self._output_seq_index >= len(self._output_sequence) - 1:
-        self.mock_proc.returncode = self._return_value
-      return self.mock_proc.returncode
-
-    mock_read = mock.MagicMock(side_effect=read_side_effect)
-    mock_select = mock.MagicMock(side_effect=select_side_effect)
-    mock_time = mock.MagicMock(side_effect=time_side_effect)
-    self.mock_proc.poll = mock.MagicMock(side_effect=poll_side_effect)
-
-    # Set up but *do not start* the mocks.
-    self._mocks = [
-      mock.patch('fcntl.fcntl'),
-      mock.patch('os.read', new=mock_read),
-      mock.patch('select.select', new=mock_select),
-      mock.patch('time.time', new=mock_time),
-    ]
-
-  def __enter__(self):
-    for m in self._mocks:
-      m.__enter__()
-    return self.mock_proc
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    for m in reversed(self._mocks):
-      m.__exit__(exc_type, exc_val, exc_tb)
-
-
-class CmdHelperIterCmdOutputLinesTest(unittest.TestCase):
-  """Test IterCmdOutputLines with some calls to the unix 'seq' command."""
-
-  # This calls _IterCmdOutputLines rather than IterCmdOutputLines s.t. it
-  # can mock the process.
-  # pylint: disable=protected-access
-
-  _SIMPLE_OUTPUT_SEQUENCE = [
-    _ProcessOutputEvent(read_contents='1\n2\n'),
-  ]
-
-  def testIterCmdOutputLines_success(self):
-    with _MockProcess(
-        output_sequence=self._SIMPLE_OUTPUT_SEQUENCE) as mock_proc:
-      for num, line in enumerate(
-          cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'), 1):
-        self.assertEquals(num, int(line))
-
-  def testIterCmdOutputLines_exitStatusFail(self):
-    with self.assertRaises(subprocess.CalledProcessError):
-      with _MockProcess(output_sequence=self._SIMPLE_OUTPUT_SEQUENCE,
-                        return_value=1) as mock_proc:
-        for num, line in enumerate(
-            cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'), 1):
-          self.assertEquals(num, int(line))
-        # after reading all the output we get an exit status of 1
-
-  def testIterCmdOutputLines_exitStatusIgnored(self):
-    with _MockProcess(output_sequence=self._SIMPLE_OUTPUT_SEQUENCE,
-                      return_value=1) as mock_proc:
-      for num, line in enumerate(
-          cmd_helper._IterCmdOutputLines(
-              mock_proc, 'mock_proc', check_status=False),
-          1):
-        self.assertEquals(num, int(line))
-
-  def testIterCmdOutputLines_exitStatusSkipped(self):
-    with _MockProcess(output_sequence=self._SIMPLE_OUTPUT_SEQUENCE,
-                      return_value=1) as mock_proc:
-      for num, line in enumerate(
-          cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'), 1):
-        self.assertEquals(num, int(line))
-        # no exception will be raised because we don't attempt to read past
-        # the end of the output and, thus, the status never gets checked
-        if num == 2:
-          break
-
-  def testIterCmdOutputLines_delay(self):
-    output_sequence = [
-      _ProcessOutputEvent(read_contents='1\n2\n', ts=1),
-      _ProcessOutputEvent(read_contents=None, ts=2),
-      _ProcessOutputEvent(read_contents='Awake', ts=10),
-    ]
-    with _MockProcess(output_sequence=output_sequence) as mock_proc:
-      for num, line in enumerate(
-          cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc',
-                                         iter_timeout=5), 1):
-        if num <= 2:
-          self.assertEquals(num, int(line))
-        elif num == 3:
-          self.assertEquals(None, line)
-        elif num == 4:
-          self.assertEquals('Awake', line)
-        else:
-          self.fail()
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/utils/file_utils.py b/third_party/catapult/devil/devil/utils/file_utils.py
deleted file mode 100644
index dc5a9ef..0000000
--- a/third_party/catapult/devil/devil/utils/file_utils.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-
-
-def MergeFiles(dest_file, source_files):
-  """Merge list of files into single destination file.
-
-  Args:
-    dest_file: File to be written to.
-    source_files: List of files to be merged. Will be merged in the order they
-        appear in the list.
-  """
-  if not os.path.exists(os.path.dirname(dest_file)):
-    os.makedirs(os.path.dirname(dest_file))
-  try:
-    with open(dest_file, 'w') as dest_f:
-      for source_file in source_files:
-        with open(source_file, 'r') as source_f:
-          dest_f.write(source_f.read())
-  except Exception as e:  # pylint: disable=broad-except
-    # Something went wrong when creating dest_file. Cleaning up.
-    try:
-      os.remove(dest_file)
-    except OSError:
-      pass
-    raise e
-
-
diff --git a/third_party/catapult/devil/devil/utils/find_usb_devices.py b/third_party/catapult/devil/devil/utils/find_usb_devices.py
deleted file mode 100755
index 0e0f4d5..0000000
--- a/third_party/catapult/devil/devil/utils/find_usb_devices.py
+++ /dev/null
@@ -1,532 +0,0 @@
-#!/usr/bin/python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import re
-import sys
-import argparse
-
-from devil.utils import cmd_helper
-from devil.utils import usb_hubs
-from devil.utils import lsusb
-
-# Note: In the documentation below, "virtual port" refers to the port number
-# as observed by the system (e.g. by usb-devices) and "physical port" refers
-# to the physical numerical label on the physical port e.g. on a USB hub.
-# The mapping between virtual and physical ports is not always the identity
-# (e.g. the port labeled "1" on a USB hub does not always show up as "port 1"
-# when you plug something into it) but, as far as we are aware, the mapping
-# between virtual and physical ports is always the same for a given
-# model of USB hub. When "port number" is referenced without specifying, it
-# means the virtual port number.
-
-
-# Wrapper functions for system commands to get output. These are in wrapper
-# functions so that they can be more easily mocked-out for tests.
-def _GetParsedLSUSBOutput():
-  return lsusb.lsusb()
-
-
-def _GetUSBDevicesOutput():
-  return cmd_helper.GetCmdOutput(['usb-devices'])
-
-
-def _GetTtyUSBInfo(tty_string):
-  cmd = ['udevadm', 'info', '--name=/dev/' + tty_string, '--attribute-walk']
-  return cmd_helper.GetCmdOutput(cmd)
-
-
-def _GetCommList():
-  return cmd_helper.GetCmdOutput('ls /dev', shell=True)
-
-
-def GetTTYList():
-  return [x for x in _GetCommList().splitlines() if 'ttyUSB' in x]
-
-
-# Class to identify nodes in the USB topology. USB topology is organized as
-# a tree.
-class USBNode(object):
-  def __init__(self):
-    self._port_to_node = {}
-
-  @property
-  def desc(self):
-    raise NotImplementedError
-
-  @property
-  def info(self):
-    raise NotImplementedError
-
-  @property
-  def device_num(self):
-    raise NotImplementedError
-
-  @property
-  def bus_num(self):
-    raise NotImplementedError
-
-  def HasPort(self, port):
-    """Determines if this device has a device connected to the given port."""
-    return port in self._port_to_node
-
-  def PortToDevice(self, port):
-    """Gets the device connected to the given port on this device."""
-    return self._port_to_node[port]
-
-  def Display(self, port_chain='', info=False):
-    """Displays information about this node and its descendants.
-
-    Output format is, e.g. 1:3:3:Device 42 (ID 1234:5678 Some Device)
-    meaning that from the bus, if you look at the device connected
-    to port 1, then the device connected to port 3 of that,
-    then the device connected to port 3 of that, you get the device
-    assigned device number 42, which is Some Device. Note that device
-    numbers will be reassigned whenever a connected device is powercycled
-    or reinserted, but port numbers stay the same as long as the device
-    is reinserted back into the same physical port.
-
-    Args:
-      port_chain: [string] Chain of ports from bus to this node (e.g. '2:4:')
-      info: [bool] Whether to display detailed info as well.
-    """
-    raise NotImplementedError
-
-  def AddChild(self, port, device):
-    """Adds child to the device tree.
-
-    Args:
-      port: [int] Port number of the device.
-      device: [USBDeviceNode] Device to add.
-
-    Raises:
-      ValueError: If device already has a child at the given port.
-    """
-    if self.HasPort(port):
-      raise ValueError('Duplicate port number')
-    else:
-      self._port_to_node[port] = device
-
-  def AllNodes(self):
-    """Generator that yields this node and all of its descendants.
-
-    Yields:
-      [USBNode] First this node, then each of its descendants (recursively)
-    """
-    yield self
-    for child_node in self._port_to_node.values():
-      for descendant_node in child_node.AllNodes():
-        yield descendant_node
-
-  def FindDeviceNumber(self, findnum):
-    """Find device with given number in tree
-
-    Searches the portion of the device tree rooted at this node for
-    a device with the given device number.
-
-    Args:
-      findnum: [int] Device number to search for.
-
-    Returns:
-      [USBDeviceNode] Node that is found.
-    """
-    for node in self.AllNodes():
-      if node.device_num == findnum:
-        return node
-    return None
-
-
-class USBDeviceNode(USBNode):
-  def __init__(self, bus_num=0, device_num=0, serial=None, info=None):
-    """Class that represents a device in USB tree.
-
-    Args:
-      bus_num: [int] Bus number that this node is attached to.
-      device_num: [int] Device number of this device (or 0, if this is a bus)
-      serial: [string] Serial number.
-      info: [dict] Map giving detailed device info.
-    """
-    super(USBDeviceNode, self).__init__()
-    self._bus_num = bus_num
-    self._device_num = device_num
-    self._serial = serial
-    self._info = {} if info is None else info
-
-  #override
-  @property
-  def desc(self):
-    return self._info.get('desc')
-
-  #override
-  @property
-  def info(self):
-    return self._info
-
-  #override
-  @property
-  def device_num(self):
-    return self._device_num
-
-  #override
-  @property
-  def bus_num(self):
-    return self._bus_num
-
-  @property
-  def serial(self):
-    return self._serial
-
-  @serial.setter
-  def serial(self, serial):
-    self._serial = serial
-
-  #override
-  def Display(self, port_chain='', info=False):
-    print '%s Device %d (%s)' % (port_chain, self.device_num, self.desc)
-    if info:
-      print self.info
-    for (port, device) in self._port_to_node.iteritems():
-      device.Display('%s%d:' % (port_chain, port), info=info)
-
-
-class USBBusNode(USBNode):
-  def __init__(self, bus_num=0):
-    """Class that represents a node (either a bus or device) in USB tree.
-
-    Args:
-      is_bus: [bool] If true, node is bus; if not, node is device.
-      bus_num: [int] Bus number that this node is attached to.
-      device_num: [int] Device number of this device (or 0, if this is a bus)
-      desc: [string] Short description of device.
-      serial: [string] Serial number.
-      info: [dict] Map giving detailed device info.
-      port_to_dev: [dict(int:USBDeviceNode)]
-          Maps port # to device connected to port.
-    """
-    super(USBBusNode, self).__init__()
-    self._bus_num = bus_num
-
-  #override
-  @property
-  def desc(self):
-    return 'BUS %d' % self._bus_num
-
-  #override
-  @property
-  def info(self):
-    return {}
-
-  #override
-  @property
-  def device_num(self):
-    return -1
-
-  #override
-  @property
-  def bus_num(self):
-    return self._bus_num
-
-  #override
-  def Display(self, port_chain='', info=False):
-    print "=== %s ===" % self.desc
-    for (port, device) in self._port_to_node.iteritems():
-      device.Display('%s%d:' % (port_chain, port), info=info)
-
-
-_T_LINE_REGEX = re.compile(r'T:  Bus=(?P<bus>\d{2}) Lev=(?P<lev>\d{2}) '
-                           r'Prnt=(?P<prnt>\d{2,3}) Port=(?P<port>\d{2}) '
-                           r'Cnt=(?P<cnt>\d{2}) Dev#=(?P<dev>.{3}) .*')
-
-_S_LINE_REGEX = re.compile(r'S:  SerialNumber=(?P<serial>.*)')
-_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}): (.*)')
-
-
-def GetBusNumberToDeviceTreeMap(fast=True):
-  """Gets devices currently attached.
-
-  Args:
-    fast [bool]: whether to do it fast (only get description, not
-    the whole dictionary, from lsusb)
-
-  Returns:
-    map of {bus number: bus object}
-    where the bus object has all the devices attached to it in a tree.
-  """
-  if fast:
-    info_map = {}
-    for line in lsusb.raw_lsusb().splitlines():
-      match = _LSUSB_BUS_DEVICE_RE.match(line)
-      if match:
-        info_map[(int(match.group(1)), int(match.group(2)))] = (
-          {'desc':match.group(3)})
-  else:
-    info_map = {((int(line['bus']), int(line['device']))): line
-                for line in _GetParsedLSUSBOutput()}
-
-
-  tree = {}
-  bus_num = -1
-  for line in _GetUSBDevicesOutput().splitlines():
-    match = _T_LINE_REGEX.match(line)
-    if match:
-      bus_num = int(match.group('bus'))
-      parent_num = int(match.group('prnt'))
-      # usb-devices starts counting ports from 0, so add 1
-      port_num = int(match.group('port')) + 1
-      device_num = int(match.group('dev'))
-
-      # create new bus if necessary
-      if bus_num not in tree:
-        tree[bus_num] = USBBusNode(bus_num=bus_num)
-
-      # create the new device
-      new_device = USBDeviceNode(bus_num=bus_num,
-                                 device_num=device_num,
-                                 info=info_map.get((bus_num, device_num),
-                                                   {'desc': 'NOT AVAILABLE'}))
-
-      # add device to bus
-      if parent_num != 0:
-        tree[bus_num].FindDeviceNumber(parent_num).AddChild(
-            port_num, new_device)
-      else:
-        tree[bus_num].AddChild(port_num, new_device)
-
-    match = _S_LINE_REGEX.match(line)
-    if match:
-      if bus_num == -1:
-        raise ValueError('S line appears before T line in input file')
-      # put the serial number in the device
-      tree[bus_num].FindDeviceNumber(device_num).serial = match.group('serial')
-
-  return tree
-
-
-def GetHubsOnBus(bus, hub_types):
-  """Scans for all hubs on a bus of given hub types.
-
-  Args:
-    bus: [USBNode] Bus object.
-    hub_types: [iterable(usb_hubs.HubType)] Possible types of hubs.
-
-  Yields:
-    Sequence of tuples representing (hub, type of hub)
-  """
-  for device in bus.AllNodes():
-    for hub_type in hub_types:
-      if hub_type.IsType(device):
-        yield (device, hub_type)
-
-
-def GetPhysicalPortToNodeMap(hub, hub_type):
-  """Gets physical-port:node mapping for a given hub.
-  Args:
-    hub: [USBNode] Hub to get map for.
-    hub_type: [usb_hubs.HubType] Which type of hub it is.
-
-  Returns:
-    Dict of {physical port: node}
-  """
-  port_device = hub_type.GetPhysicalPortToNodeTuples(hub)
-  return {port: device for (port, device) in port_device}
-
-
-def GetPhysicalPortToBusDeviceMap(hub, hub_type):
-  """Gets physical-port:(bus#, device#) mapping for a given hub.
-  Args:
-    hub: [USBNode] Hub to get map for.
-    hub_type: [usb_hubs.HubType] Which type of hub it is.
-
-  Returns:
-    Dict of {physical port: (bus number, device number)}
-  """
-  port_device = hub_type.GetPhysicalPortToNodeTuples(hub)
-  return {port: (device.bus_num, device.device_num)
-          for (port, device) in port_device}
-
-
-def GetPhysicalPortToSerialMap(hub, hub_type):
-  """Gets physical-port:serial# mapping for a given hub.
-
-  Args:
-    hub: [USBNode] Hub to get map for.
-    hub_type: [usb_hubs.HubType] Which type of hub it is.
-
-  Returns:
-    Dict of {physical port: serial number)}
-  """
-  port_device = hub_type.GetPhysicalPortToNodeTuples(hub)
-  return {port: device.serial
-          for (port, device) in port_device
-          if device.serial}
-
-
-def GetPhysicalPortToTTYMap(device, hub_type):
-  """Gets physical-port:tty-string mapping for a given hub.
-  Args:
-    hub: [USBNode] Hub to get map for.
-    hub_type: [usb_hubs.HubType] Which type of hub it is.
-
-  Returns:
-    Dict of {physical port: tty-string)}
-  """
-  port_device = hub_type.GetPhysicalPortToNodeTuples(device)
-  bus_device_to_tty = GetBusDeviceToTTYMap()
-  return {port: bus_device_to_tty[(device.bus_num, device.device_num)]
-          for (port, device) in port_device
-          if (device.bus_num, device.device_num) in bus_device_to_tty}
-
-
-def CollectHubMaps(hub_types, map_func, device_tree_map=None, fast=False):
-  """Runs a function on all hubs in the system and collects their output.
-
-  Args:
-    hub_types: [usb_hubs.HubType] List of possible hub types.
-    map_func: [string] Function to run on each hub.
-    device_tree: Previously constructed device tree map, if any.
-    fast: Whether to construct device tree fast, if not already provided
-
-  Yields:
-    Sequence of dicts of {physical port: device} where the type of
-    device depends on the ident keyword. Each dict is a separate hub.
-  """
-  if device_tree_map is None:
-    device_tree_map = GetBusNumberToDeviceTreeMap(fast=fast)
-  for bus in device_tree_map.values():
-    for (hub, hub_type) in GetHubsOnBus(bus, hub_types):
-      yield map_func(hub, hub_type)
-
-
-def GetAllPhysicalPortToNodeMaps(hub_types, **kwargs):
-  return CollectHubMaps(hub_types, GetPhysicalPortToNodeMap, **kwargs)
-
-
-def GetAllPhysicalPortToBusDeviceMaps(hub_types, **kwargs):
-  return CollectHubMaps(hub_types, GetPhysicalPortToBusDeviceMap, **kwargs)
-
-
-def GetAllPhysicalPortToSerialMaps(hub_types, **kwargs):
-  return CollectHubMaps(hub_types, GetPhysicalPortToSerialMap, **kwargs)
-
-
-def GetAllPhysicalPortToTTYMaps(hub_types, **kwargs):
-  return CollectHubMaps(hub_types, GetPhysicalPortToTTYMap, **kwargs)
-
-
-_BUS_NUM_REGEX = re.compile(r'.*ATTRS{busnum}=="(\d*)".*')
-_DEVICE_NUM_REGEX = re.compile(r'.*ATTRS{devnum}=="(\d*)".*')
-
-
-def GetBusDeviceFromTTY(tty_string):
-  """Gets bus and device number connected to a ttyUSB port.
-
-  Args:
-    tty_string: [String] Identifier for ttyUSB (e.g. 'ttyUSB0')
-
-  Returns:
-    Tuple (bus, device) giving device connected to that ttyUSB.
-
-  Raises:
-    ValueError: If bus and device information could not be found.
-  """
-  bus_num = None
-  device_num = None
-  # Expected output of GetCmdOutput should be something like:
-  # looking at device /devices/something/.../.../...
-  # KERNELS="ttyUSB0"
-  # SUBSYSTEMS=...
-  # DRIVERS=...
-  # ATTRS{foo}=...
-  # ATTRS{bar}=...
-  # ...
-  for line in _GetTtyUSBInfo(tty_string).splitlines():
-    bus_match = _BUS_NUM_REGEX.match(line)
-    device_match = _DEVICE_NUM_REGEX.match(line)
-    if bus_match and bus_num == None:
-      bus_num = int(bus_match.group(1))
-    if device_match and device_num == None:
-      device_num = int(device_match.group(1))
-  if bus_num is None or device_num is None:
-    raise ValueError('Info not found')
-  return (bus_num, device_num)
-
-
-def GetBusDeviceToTTYMap():
-  """Gets all mappings from (bus, device) to ttyUSB string.
-
-  Gets mapping from (bus, device) to ttyUSB string (e.g. 'ttyUSB0'),
-  for all ttyUSB strings currently active.
-
-  Returns:
-    [dict] Dict that maps (bus, device) to ttyUSB string
-  """
-  result = {}
-  for tty in GetTTYList():
-    result[GetBusDeviceFromTTY(tty)] = tty
-  return result
-
-
-# This dictionary described the mapping between physical and
-# virtual ports on a Plugable 7-Port Hub (model USB2-HUB7BC).
-# Keys are the virtual ports, values are the physical port.
-# The entry 4:{1:4, 2:3, 3:2, 4:1} indicates that virtual port
-# 4 connects to another 'virtual' hub that itself has the
-# virtual-to-physical port mapping {1:4, 2:3, 3:2, 4:1}.
-
-
-def TestUSBTopologyScript():
-  """Test display and hub identification."""
-  # Identification criteria for Plugable 7-Port Hub
-  print '==== USB TOPOLOGY SCRIPT TEST ===='
-
-  # Display devices
-  print '==== DEVICE DISPLAY ===='
-  device_trees = GetBusNumberToDeviceTreeMap()
-  for device_tree in device_trees.values():
-    device_tree.Display()
-  print
-
-  # Display TTY information about devices plugged into hubs.
-  print '==== TTY INFORMATION ===='
-  for port_map in GetAllPhysicalPortToTTYMaps(
-      usb_hubs.ALL_HUBS, device_tree_map=device_trees):
-    print port_map
-  print
-
-  # Display serial number information about devices plugged into hubs.
-  print '==== SERIAL NUMBER INFORMATION ===='
-  for port_map in GetAllPhysicalPortToSerialMaps(
-      usb_hubs.ALL_HUBS, device_tree_map=device_trees):
-    print port_map
-
-
-  return 0
-
-
-def parse_options(argv):
-  """Parses and checks the command-line options.
-
-  Returns:
-    A tuple containing the options structure and a list of categories to
-    be traced.
-  """
-  USAGE = '''./find_usb_devices [--help]
-    This script shows the mapping between USB devices and port numbers.
-    Clients are not intended to call this script from the command line.
-    Clients are intended to call the functions in this script directly.
-    For instance, GetAllPhysicalPortToSerialMaps(...)
-    Running this script with --help will display this message.
-    Running this script without --help will display information about
-    devices attached, TTY mapping, and serial number mapping,
-    for testing purposes. See design document for API documentation.
-  '''
-  parser = argparse.ArgumentParser(usage=USAGE)
-  return parser.parse_args(argv[1:])
-
-def main():
-  parse_options(sys.argv)
-  TestUSBTopologyScript()
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/utils/find_usb_devices_test.py b/third_party/catapult/devil/devil/utils/find_usb_devices_test.py
deleted file mode 100755
index e8b00c8..0000000
--- a/third_party/catapult/devil/devil/utils/find_usb_devices_test.py
+++ /dev/null
@@ -1,379 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# pylint: disable=protected-access
-
-"""
-Unit tests for the contents of find_usb_devices.py.
-
-Device tree for these tests is as follows:
-Bus 001:
-1: Device 011 "foo"
-2: Device 012 "bar"
-3: Device 013 "baz"
-
-Bus 002:
-1: Device 011 "quux"
-2: Device 020 "My Test HUB" #hub 1
-2:1: Device 021 "battor_p7_h1_t0" #physical port 7 on hub 1, on ttyUSB0
-2:3: Device 022 "battor_p5_h1_t1" #physical port 5 on hub 1, on ttyUSB1
-2:4: Device 023 "My Test Internal HUB" #internal section of hub 1
-2:4:2: Device 024 "battor_p3_h1_t2" #physical port 3 on hub 1, on ttyUSB2
-2:4:3: Device 026 "Not a Battery Monitor" #physical port 1 on hub 1, on ttyUSB3
-2:4:4: Device 025 "battor_p1_h1_t3" #physical port 1 on hub 1, on ttyUSB3
-3: Device 100 "My Test HUB" #hub 2
-3:4: Device 101 "My Test Internal HUB" #internal section of hub 2
-3:4:4: Device 102 "battor_p1_h2_t4" #physical port 1 on hub 2, on ttyusb4
-"""
-
-import logging
-import os
-import unittest
-
-from devil import devil_env
-from devil.utils import battor_device_mapping
-from devil.utils import find_usb_devices
-from devil.utils import lsusb
-from devil.utils import usb_hubs
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock # pylint: disable=import-error
-
-# Output of lsusb.lsusb().
-# We just test that the dictionary is working by creating an
-# "ID number" equal to (bus_num*1000)+device_num and seeing if
-# it is picked up correctly. Also we test the description
-
-DEVLIST = [(1, 11, 'foo'),
-           (1, 12, 'bar'),
-           (1, 13, 'baz'),
-           (2, 11, 'quux'),
-           (2, 20, 'My Test HUB'),
-           (2, 21, 'ID 0403:6001 battor_p7_h1_t0'),
-           (2, 22, 'ID 0403:6001 battor_p5_h1_t1'),
-           (2, 23, 'My Test Internal HUB'),
-           (2, 24, 'ID 0403:6001 battor_p3_h1_t2'),
-           (2, 25, 'ID 0403:6001 battor_p1_h1_t3'),
-           (2, 26, 'Not a Battery Monitor'),
-           (2, 100, 'My Test HUB'),
-           (2, 101, 'My Test Internal HUB'),
-           (2, 102, 'ID 0403:6001 battor_p1_h1_t4')]
-
-LSUSB_OUTPUT = [
-  {'bus': b, 'device': d, 'desc': t, 'id': (1000*b)+d}
-       for (b, d, t) in DEVLIST]
-
-
-# Note: "Lev", "Cnt", "Spd", and "MxCh" are not used by parser,
-# so we just leave them as zeros here. Also note that the port
-# numbers reported here start at 0, so they're 1 less than the
-# port numbers reported elsewhere.
-USB_DEVICES_OUTPUT = '''
-T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 11 Spd=000 MxCh=00
-S:  SerialNumber=FooSerial
-T:  Bus=01 Lev=00 Prnt=00 Port=01 Cnt=00 Dev#= 12 Spd=000 MxCh=00
-S:  SerialNumber=BarSerial
-T:  Bus=01 Lev=00 Prnt=00 Port=02 Cnt=00 Dev#= 13 Spd=000 MxCh=00
-S:  SerialNumber=BazSerial
-
-T:  Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 11 Spd=000 MxCh=00
-
-T:  Bus=02 Lev=00 Prnt=00 Port=01 Cnt=00 Dev#= 20 Spd=000 MxCh=00
-T:  Bus=02 Lev=00 Prnt=20 Port=00 Cnt=00 Dev#= 21 Spd=000 MxCh=00
-S:  SerialNumber=BattOr0
-T:  Bus=02 Lev=00 Prnt=20 Port=02 Cnt=00 Dev#= 22 Spd=000 MxCh=00
-S:  SerialNumber=BattOr1
-T:  Bus=02 Lev=00 Prnt=20 Port=03 Cnt=00 Dev#= 23 Spd=000 MxCh=00
-T:  Bus=02 Lev=00 Prnt=23 Port=01 Cnt=00 Dev#= 24 Spd=000 MxCh=00
-S:  SerialNumber=BattOr2
-T:  Bus=02 Lev=00 Prnt=23 Port=03 Cnt=00 Dev#= 25 Spd=000 MxCh=00
-S:  SerialNumber=BattOr3
-T:  Bus=02 Lev=00 Prnt=23 Port=02 Cnt=00 Dev#= 26 Spd=000 MxCh=00
-
-T:  Bus=02 Lev=00 Prnt=00 Port=02 Cnt=00 Dev#=100 Spd=000 MxCh=00
-T:  Bus=02 Lev=00 Prnt=100 Port=03 Cnt=00 Dev#=101 Spd=000 MxCh=00
-T:  Bus=02 Lev=00 Prnt=101 Port=03 Cnt=00 Dev#=102 Spd=000 MxCh=00
-'''
-
-RAW_LSUSB_OUTPUT = '''
-Bus 001 Device 011: FAST foo
-Bus 001 Device 012: FAST bar
-Bus 001 Device 013: baz
-Bus 002 Device 011: quux
-Bus 002 Device 020: My Test HUB
-Bus 002 Device 021: ID 0403:6001 battor_p7_h1_t0
-Bus 002 Device 022: ID 0403:6001 battor_p5_h1_t1
-Bus 002 Device 023: My Test Internal HUB
-Bus 002 Device 024: ID 0403:6001 battor_p3_h1_t2
-Bus 002 Device 025: ID 0403:6001 battor_p1_h1_t3
-Bus 002 Device 026: Not a Battery Monitor
-Bus 002 Device 100: My Test HUB
-Bus 002 Device 101: My Test Internal HUB
-Bus 002 Device 102: ID 0403:6001 battor_p1_h1_t4
-'''
-
-LIST_TTY_OUTPUT = '''
-ttyUSB0
-Something-else-0
-ttyUSB1
-ttyUSB2
-Something-else-1
-ttyUSB3
-ttyUSB4
-Something-else-2
-ttyUSB5
-'''
-
-# Note: The real output will have multiple lines with
-# ATTRS{busnum} and ATTRS{devnum}, but only the first
-# one counts. Thus the test output duplicates this.
-UDEVADM_USBTTY0_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="21"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY1_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="22"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY2_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="24"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY3_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="25"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY4_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="102"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY5_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="26"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_OUTPUT_DICT = {
-  'ttyUSB0': UDEVADM_USBTTY0_OUTPUT,
-  'ttyUSB1': UDEVADM_USBTTY1_OUTPUT,
-  'ttyUSB2': UDEVADM_USBTTY2_OUTPUT,
-  'ttyUSB3': UDEVADM_USBTTY3_OUTPUT,
-  'ttyUSB4': UDEVADM_USBTTY4_OUTPUT,
-  'ttyUSB5': UDEVADM_USBTTY5_OUTPUT}
-
-# Identification criteria for Plugable 7-Port Hub
-def isTestHub(node):
-  """Check if a node is a Plugable 7-Port Hub
-  (Model USB2-HUB7BC)
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 4.
-  """
-  if not isinstance(node, find_usb_devices.USBDeviceNode):
-    return False
-  if 'Test HUB' not in node.desc:
-    return False
-  if not node.HasPort(4):
-    return False
-  return 'Test Internal HUB' in node.PortToDevice(4).desc
-
-TEST_HUB = usb_hubs.HubType(isTestHub,
-                            {1:7,
-                             2:6,
-                             3:5,
-                             4:{1:4, 2:3, 3:2, 4:1}})
-
-class USBScriptTest(unittest.TestCase):
-  def setUp(self):
-    find_usb_devices._GetTtyUSBInfo = mock.Mock(
-        side_effect=lambda x: UDEVADM_OUTPUT_DICT[x])
-    find_usb_devices._GetParsedLSUSBOutput = mock.Mock(
-        return_value=LSUSB_OUTPUT)
-    find_usb_devices._GetUSBDevicesOutput = mock.Mock(
-        return_value=USB_DEVICES_OUTPUT)
-    find_usb_devices._GetCommList = mock.Mock(
-        return_value=LIST_TTY_OUTPUT)
-    lsusb.raw_lsusb = mock.Mock(
-        return_value=RAW_LSUSB_OUTPUT)
-
-  def testIsBattOr(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap()
-    self.assertTrue(battor_device_mapping.IsBattOr('ttyUSB3', bd))
-    self.assertFalse(battor_device_mapping.IsBattOr('ttyUSB5', bd))
-
-  def testGetBattOrs(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap()
-    self.assertEquals(battor_device_mapping.GetBattOrList(bd),
-                          ['ttyUSB0', 'ttyUSB1', 'ttyUSB2',
-                           'ttyUSB3', 'ttyUSB4'])
-
-  def testGetTTYDevices(self):
-    pp = find_usb_devices.GetAllPhysicalPortToTTYMaps([TEST_HUB])
-    result = list(pp)
-    self.assertEquals(result[0], {7:'ttyUSB0',
-                                  5:'ttyUSB1',
-                                  3:'ttyUSB2',
-                                  2:'ttyUSB5',
-                                  1:'ttyUSB3'})
-    self.assertEquals(result[1], {1:'ttyUSB4'})
-
-  def testGetPortDeviceMapping(self):
-    pp = find_usb_devices.GetAllPhysicalPortToBusDeviceMaps([TEST_HUB])
-    result = list(pp)
-    self.assertEquals(result[0], {7:(2, 21),
-                                  5:(2, 22),
-                                  3:(2, 24),
-                                  2:(2, 26),
-                                  1:(2, 25)})
-    self.assertEquals(result[1], {1:(2, 102)})
-
-  def testGetSerialMapping(self):
-    pp = find_usb_devices.GetAllPhysicalPortToSerialMaps([TEST_HUB])
-    result = list(pp)
-    self.assertEquals(result[0], {7:'BattOr0',
-                                  5:'BattOr1',
-                                  3:'BattOr2',
-                                  1:'BattOr3'})
-    self.assertEquals(result[1], {})
-
-  def testFastDeviceDescriptions(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap()
-    dev_foo = bd[1].FindDeviceNumber(11)
-    dev_bar = bd[1].FindDeviceNumber(12)
-    dev_battor_p7_h1_t0 = bd[2].FindDeviceNumber(21)
-    self.assertEquals(dev_foo.desc, 'FAST foo')
-    self.assertEquals(dev_bar.desc, 'FAST bar')
-    self.assertEquals(dev_battor_p7_h1_t0.desc,
-        'ID 0403:6001 battor_p7_h1_t0')
-
-  def testDeviceDescriptions(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=False)
-    dev_foo = bd[1].FindDeviceNumber(11)
-    dev_bar = bd[1].FindDeviceNumber(12)
-    dev_battor_p7_h1_t0 = bd[2].FindDeviceNumber(21)
-    self.assertEquals(dev_foo.desc, 'foo')
-    self.assertEquals(dev_bar.desc, 'bar')
-    self.assertEquals(dev_battor_p7_h1_t0.desc,
-        'ID 0403:6001 battor_p7_h1_t0')
-
-  def testDeviceInformation(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=False)
-    dev_foo = bd[1].FindDeviceNumber(11)
-    dev_bar = bd[1].FindDeviceNumber(12)
-    dev_battor_p7_h1_t0 = bd[2].FindDeviceNumber(21)
-    self.assertEquals(dev_foo.info['id'], 1011)
-    self.assertEquals(dev_bar.info['id'], 1012)
-    self.assertEquals(dev_battor_p7_h1_t0.info['id'], 2021)
-
-  def testSerialNumber(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=False)
-    dev_foo = bd[1].FindDeviceNumber(11)
-    dev_bar = bd[1].FindDeviceNumber(12)
-    dev_battor_p7_h1_t0 = bd[2].FindDeviceNumber(21)
-    self.assertEquals(dev_foo.serial, 'FooSerial')
-    self.assertEquals(dev_bar.serial, 'BarSerial')
-    self.assertEquals(dev_battor_p7_h1_t0.serial, 'BattOr0')
-
-  def testBattOrDictMapping(self):
-    map_dict = {'Phone1':'BattOr1', 'Phone2':'BattOr2', 'Phone3':'BattOr3'}
-    a1 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
-             'Phone1', serial_map=map_dict)
-    a2 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
-             'Phone2', serial_map=map_dict)
-    a3 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
-             'Phone3', serial_map=map_dict)
-    self.assertEquals(a1, '/dev/ttyUSB1')
-    self.assertEquals(a2, '/dev/ttyUSB2')
-    self.assertEquals(a3, '/dev/ttyUSB3')
-
-  def testBattOrDictFromFileMapping(self):
-    try:
-      map_dict = {'Phone1':'BattOr1', 'Phone2':'BattOr2', 'Phone3':'BattOr3'}
-      curr_dir = os.path.dirname(os.path.realpath(__file__))
-      filename = os.path.join(curr_dir, 'test', 'data', 'test_write_map.json')
-      battor_device_mapping.WriteSerialMapFile(filename, map_dict)
-      a1 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
-               'Phone1', serial_map_file=filename)
-      a2 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
-               'Phone2', serial_map_file=filename)
-      a3 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
-               'Phone3', serial_map_file=filename)
-    finally:
-      os.remove(filename)
-    self.assertEquals(a1, '/dev/ttyUSB1')
-    self.assertEquals(a2, '/dev/ttyUSB2')
-    self.assertEquals(a3, '/dev/ttyUSB3')
-
-  def testReadSerialMapFile(self):
-    curr_dir = os.path.dirname(os.path.realpath(__file__))
-    map_dict = battor_device_mapping.ReadSerialMapFile(
-        os.path.join(curr_dir, 'test', 'data', 'test_serial_map.json'))
-    self.assertEquals(len(map_dict.keys()), 3)
-    self.assertEquals(map_dict['Phone1'], 'BattOr1')
-    self.assertEquals(map_dict['Phone2'], 'BattOr2')
-    self.assertEquals(map_dict['Phone3'], 'BattOr3')
-
-original_PPTSM = find_usb_devices.GetAllPhysicalPortToSerialMaps
-original_PPTTM = find_usb_devices.GetAllPhysicalPortToTTYMaps
-original_GBL = battor_device_mapping.GetBattOrList
-original_GBNDM = find_usb_devices.GetBusNumberToDeviceTreeMap
-original_IB = battor_device_mapping.IsBattOr
-original_GBSM = battor_device_mapping.GetBattOrSerialNumbers
-
-def setup_battor_test(serial, tty, battor, bser=None):
-  serial_mapper = mock.Mock(return_value=serial)
-  tty_mapper = mock.Mock(return_value=tty)
-  battor_lister = mock.Mock(return_value=battor)
-  devtree = mock.Mock(return_value=None)
-  is_battor = mock.Mock(side_effect=lambda x, y: x in battor)
-  battor_serials = mock.Mock(return_value=bser)
-  find_usb_devices.GetAllPhysicalPortToSerialMaps = serial_mapper
-  find_usb_devices.GetAllPhysicalPortToTTYMaps = tty_mapper
-  battor_device_mapping.GetBattOrList = battor_lister
-  find_usb_devices.GetBusNumberToDeviceTreeMap = devtree
-  battor_device_mapping.IsBattOr = is_battor
-  battor_device_mapping.GetBattOrSerialNumbers = battor_serials
-
-class BattOrMappingTest(unittest.TestCase):
-  def tearDown(self):
-    find_usb_devices.GetAllPhysicalPortToSerialMaps = original_PPTSM
-    find_usb_devices.GetAllPhysicalPortToTTYMaps = original_PPTTM
-    battor_device_mapping.GetBattOrList = original_GBL
-    find_usb_devices.GetBusNumberToDeviceTreeMap = original_GBNDM
-    battor_device_mapping.IsBattOr = original_IB
-    battor_device_mapping.GetBattOrSerialNumbers = original_GBSM
-
-  def test_generate_serial_map(self):
-    setup_battor_test([{1:'Phn1', 2:'Phn2', 3:'Phn3'},
-                       {1:'Bat1', 2:'Bat2', 3:'Bat3'}],
-                      [{},
-                       {1:'ttyUSB0', 2:'ttyUSB1', 3:'ttyUSB2'}],
-                      ['ttyUSB0', 'ttyUSB1', 'ttyUSB2'],
-                      ['Bat1', 'Bat2', 'Bat3'])
-    result = battor_device_mapping.GenerateSerialMap()
-    self.assertEqual(len(result), 3)
-    self.assertEqual(result['Phn1'], 'Bat1')
-    self.assertEqual(result['Phn2'], 'Bat2')
-    self.assertEqual(result['Phn3'], 'Bat3')
-
-
-if __name__ == "__main__":
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/utils/geometry.py b/third_party/catapult/devil/devil/utils/geometry.py
deleted file mode 100644
index da21770..0000000
--- a/third_party/catapult/devil/devil/utils/geometry.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright 2015 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.
-
-"""Objects for convenient manipulation of points and other surface areas."""
-
-import collections
-
-
-class Point(collections.namedtuple('Point', ['x', 'y'])):
-  """Object to represent an (x, y) point on a surface.
-
-  Args:
-    x, y: Two numeric coordinates that define the point.
-  """
-  __slots__ = ()
-
-  def __str__(self):
-    """Get a useful string representation of the object."""
-    return '(%s, %s)' % (self.x, self.y)
-
-  def __add__(self, other):
-    """Sum of two points, e.g. p + q."""
-    if isinstance(other, Point):
-      return Point(self.x + other.x, self.y + other.y)
-    else:
-      return NotImplemented
-
-  def __mul__(self, factor):
-    """Multiplication on the right is not implemented."""
-    # This overrides the default behaviour of a tuple multiplied by a constant
-    # on the right, which does not make sense for a Point.
-    return NotImplemented
-
-  def __rmul__(self, factor):
-    """Multiply a point by a scalar factor on the left, e.g. 2 * p."""
-    return Point(factor * self.x, factor * self.y)
-
-
-class Rectangle(
-    collections.namedtuple('Rectangle', ['top_left', 'bottom_right'])):
-  """Object to represent a rectangle on a surface.
-
-  Args:
-    top_left: A pair of (left, top) coordinates. Might be given as a Point
-      or as a two-element sequence (list, tuple, etc.).
-    bottom_right: A pair (right, bottom) coordinates.
-  """
-  __slots__ = ()
-
-  def __new__(cls, top_left, bottom_right):
-    if not isinstance(top_left, Point):
-      top_left = Point(*top_left)
-    if not isinstance(bottom_right, Point):
-      bottom_right = Point(*bottom_right)
-    return super(Rectangle, cls).__new__(cls, top_left, bottom_right)
-
-  def __str__(self):
-    """Get a useful string representation of the object."""
-    return '[%s, %s]' % (self.top_left, self.bottom_right)
-
-  @property
-  def center(self):
-    """Get the point at the center of the rectangle."""
-    return 0.5 * (self.top_left + self.bottom_right)
-
-  @classmethod
-  def FromDict(cls, d):
-    """Create a rectangle object from a dictionary.
-
-    Args:
-      d: A dictionary (or mapping) of the form, e.g., {'top': 0, 'left': 0,
-         'bottom': 1, 'right': 1}.
-    """
-    return cls(Point(d['left'], d['top']), Point(d['right'], d['bottom']))
diff --git a/third_party/catapult/devil/devil/utils/geometry_test.py b/third_party/catapult/devil/devil/utils/geometry_test.py
deleted file mode 100644
index af69442..0000000
--- a/third_party/catapult/devil/devil/utils/geometry_test.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright 2015 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.
-
-"""Tests for the geometry module."""
-
-import unittest
-
-from devil.utils import geometry as g
-
-
-class PointTest(unittest.TestCase):
-
-  def testStr(self):
-    p = g.Point(1, 2)
-    self.assertEquals(str(p), '(1, 2)')
-
-  def testAdd(self):
-    p = g.Point(1, 2)
-    q = g.Point(3, 4)
-    r = g.Point(4, 6)
-    self.assertEquals(p + q, r)
-
-  def testAdd_TypeErrorWithInvalidOperands(self):
-    # pylint: disable=pointless-statement
-    p = g.Point(1, 2)
-    with self.assertRaises(TypeError):
-      p + 4  # Can't add point and scalar.
-    with self.assertRaises(TypeError):
-      4 + p  # Can't add scalar and point.
-
-  def testMult(self):
-    p = g.Point(1, 2)
-    r = g.Point(2, 4)
-    self.assertEquals(2 * p, r)  # Multiply by scalar on the left.
-
-  def testMult_TypeErrorWithInvalidOperands(self):
-    # pylint: disable=pointless-statement
-    p = g.Point(1, 2)
-    q = g.Point(2, 4)
-    with self.assertRaises(TypeError):
-      p * q  # Can't multiply points.
-    with self.assertRaises(TypeError):
-      p * 4  # Can't multiply by a scalar on the right.
-
-
-class RectangleTest(unittest.TestCase):
-
-  def testStr(self):
-    r = g.Rectangle(g.Point(0, 1), g.Point(2, 3))
-    self.assertEquals(str(r), '[(0, 1), (2, 3)]')
-
-  def testCenter(self):
-    r = g.Rectangle(g.Point(0, 1), g.Point(2, 3))
-    c = g.Point(1, 2)
-    self.assertEquals(r.center, c)
-
-  def testFromJson(self):
-    r1 = g.Rectangle(g.Point(0, 1), g.Point(2, 3))
-    r2 = g.Rectangle.FromDict({'top': 1, 'left': 0, 'bottom': 3, 'right': 2})
-    self.assertEquals(r1, r2)
diff --git a/third_party/catapult/devil/devil/utils/host_utils.py b/third_party/catapult/devil/devil/utils/host_utils.py
deleted file mode 100644
index 580721f..0000000
--- a/third_party/catapult/devil/devil/utils/host_utils.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-
-
-def GetRecursiveDiskUsage(path):
-  """Returns the disk usage in bytes of |path|. Similar to `du -sb |path|`."""
-  running_size = os.path.getsize(path)
-  if os.path.isdir(path):
-    for root, dirs, files in os.walk(path):
-      running_size += sum([os.path.getsize(os.path.join(root, f))
-                           for f in files + dirs])
-  return running_size
-
diff --git a/third_party/catapult/devil/devil/utils/lazy/__init__.py b/third_party/catapult/devil/devil/utils/lazy/__init__.py
deleted file mode 100644
index 3cc56c0..0000000
--- a/third_party/catapult/devil/devil/utils/lazy/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2015 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.
-
-from devil.utils.lazy.weak_constant import WeakConstant
diff --git a/third_party/catapult/devil/devil/utils/lazy/weak_constant.py b/third_party/catapult/devil/devil/utils/lazy/weak_constant.py
deleted file mode 100644
index 3558f29..0000000
--- a/third_party/catapult/devil/devil/utils/lazy/weak_constant.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2015 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.
-
-import threading
-
-
-class WeakConstant(object):
-  """A thread-safe, lazily initialized object.
-
-  This does not support modification after initialization. The intended
-  constant nature of the object is not enforced, though, hence the "weak".
-  """
-
-  def __init__(self, initializer):
-    self._initialized = False
-    self._initializer = initializer
-    self._lock = threading.Lock()
-    self._val = None
-
-  def read(self):
-    """Get the object, creating it if necessary."""
-    if self._initialized:
-      return self._val
-    with self._lock:
-      if not self._initialized:
-        self._val = self._initializer()
-        self._initialized = True
-    return self._val
diff --git a/third_party/catapult/devil/devil/utils/lsusb.py b/third_party/catapult/devil/devil/utils/lsusb.py
deleted file mode 100644
index 6cbf256..0000000
--- a/third_party/catapult/devil/devil/utils/lsusb.py
+++ /dev/null
@@ -1,174 +0,0 @@
-# Copyright 2015 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.
-
-import logging
-import re
-
-from devil.utils import cmd_helper
-
-logger = logging.getLogger(__name__)
-
-_COULDNT_OPEN_ERROR_RE = re.compile(r'Couldn\'t open device.*')
-_INDENTATION_RE = re.compile(r'^( *)')
-_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}): (.*)')
-_LSUSB_ENTRY_RE = re.compile(r'^ *([^ ]+) +([^ ]+) *([^ ].*)?$')
-_LSUSB_GROUP_RE = re.compile(r'^ *([^ ]+.*):$')
-
-
-def _lsusbv_on_device(bus_id, dev_id):
-  """Calls lsusb -v on device."""
-  _, raw_output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-      ['lsusb', '-v', '-s', '%s:%s' % (bus_id, dev_id)], timeout=10)
-
-  device = {'bus': bus_id, 'device': dev_id}
-  depth_stack = [device]
-
-  # This builds a nested dict -- a tree, basically -- that corresponds
-  # to the lsusb output. It looks first for a line containing
-  #
-  #   "Bus <bus number> Device <device number>: ..."
-  #
-  # and uses that to create the root node. It then parses all remaining
-  # lines as a tree, with the indentation level determining the
-  # depth of the new node.
-  #
-  # This expects two kinds of lines:
-  #   - "groups", which take the form
-  #       "<Group name>:"
-  #     and typically have children, and
-  #   - "entries", which take the form
-  #       "<entry name>   <entry value>  <possible entry description>"
-  #     and typically do not have children (but can).
-  #
-  # This maintains a stack containing all current ancestor nodes in
-  # order to add new nodes to the proper place in the tree.
-  # The stack is added to when a new node is parsed. Nodes are removed
-  # from the stack when they are either at the same indentation level as
-  # or a deeper indentation level than the current line.
-  #
-  # e.g. the following lsusb output:
-  #
-  # Bus 123 Device 456: School bus
-  # Device Descriptor:
-  #   bDeviceClass 5 Actual School Bus
-  #   Configuration Descriptor:
-  #     bLength 20 Rows
-  #
-  # would produce the following dict:
-  #
-  # {
-  #   'bus': 123,
-  #   'device': 456,
-  #   'desc': 'School bus',
-  #   'Device Descriptor': {
-  #     'bDeviceClass': {
-  #       '_value': '5',
-  #       '_desc': 'Actual School Bus',
-  #     },
-  #     'Configuration Descriptor': {
-  #       'bLength': {
-  #         '_value': '20',
-  #         '_desc': 'Rows',
-  #       },
-  #     },
-  #   }
-  # }
-  for line in raw_output.splitlines():
-    # Ignore blank lines.
-    if not line:
-      continue
-    # Filter out error mesage about opening device.
-    if _COULDNT_OPEN_ERROR_RE.match(line):
-      continue
-    # Find start of device information.
-    m = _LSUSB_BUS_DEVICE_RE.match(line)
-    if m:
-      if m.group(1) != bus_id:
-        logger.warning(
-            'Expected bus_id value: %r, seen %r', bus_id, m.group(1))
-      if m.group(2) != dev_id:
-        logger.warning(
-            'Expected dev_id value: %r, seen %r', dev_id, m.group(2))
-      device['desc'] = m.group(3)
-      continue
-
-    # Skip any lines that aren't indented, as they're not part of the
-    # device descriptor.
-    indent_match = _INDENTATION_RE.match(line)
-    if not indent_match:
-      continue
-
-    # Determine the indentation depth.
-    depth = 1 + len(indent_match.group(1)) / 2
-    if depth > len(depth_stack):
-      logger.error(
-          'lsusb parsing error: unexpected indentation: "%s"', line)
-      continue
-
-    # Pop everything off the depth stack that isn't a parent of
-    # this element.
-    while depth < len(depth_stack):
-      depth_stack.pop()
-
-    cur = depth_stack[-1]
-
-    m = _LSUSB_GROUP_RE.match(line)
-    if m:
-      new_group = {}
-      cur[m.group(1)] = new_group
-      depth_stack.append(new_group)
-      continue
-
-    m = _LSUSB_ENTRY_RE.match(line)
-    if m:
-      new_entry = {
-        '_value': m.group(2),
-        '_desc': m.group(3),
-      }
-      cur[m.group(1)] = new_entry
-      depth_stack.append(new_entry)
-      continue
-
-    logger.error('lsusb parsing error: unrecognized line: "%s"', line)
-
-  return device
-
-def lsusb():
-  """Call lsusb and return the parsed output."""
-  _, lsusb_list_output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-      ['lsusb'], timeout=10)
-  devices = []
-  for line in lsusb_list_output.splitlines():
-    m = _LSUSB_BUS_DEVICE_RE.match(line)
-    if m:
-      bus_num = m.group(1)
-      dev_num = m.group(2)
-      try:
-        devices.append(_lsusbv_on_device(bus_num, dev_num))
-      except cmd_helper.TimeoutError:
-        # Will be blacklisted if it is in expected device file, but times out.
-        logger.info('lsusb -v %s:%s timed out.', bus_num, dev_num)
-  return devices
-
-def raw_lsusb():
-  return cmd_helper.GetCmdOutput(['lsusb'])
-
-def get_lsusb_serial(device):
-  try:
-    return device['Device Descriptor']['iSerial']['_desc']
-  except KeyError:
-    return None
-
-def _is_android_device(device):
-  try:
-    # Hubs are not android devices.
-    if device['Device Descriptor']['bDeviceClass']['_value'] == '9':
-      return False
-  except KeyError:
-    pass
-  return get_lsusb_serial(device) is not None
-
-def get_android_devices():
-  android_devices = (d for d in lsusb() if _is_android_device(d))
-  return [get_lsusb_serial(d) for d in android_devices]
diff --git a/third_party/catapult/devil/devil/utils/lsusb_test.py b/third_party/catapult/devil/devil/utils/lsusb_test.py
deleted file mode 100755
index f381e72..0000000
--- a/third_party/catapult/devil/devil/utils/lsusb_test.py
+++ /dev/null
@@ -1,250 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Tests for the cmd_helper module."""
-
-import unittest
-
-from devil import devil_env
-from devil.utils import lsusb
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock # pylint: disable=import-error
-
-RAW_OUTPUT = """
-Bus 003 Device 007: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)
-Device Descriptor:
-  bLength                18
-  bDescriptorType         1
-  bcdUSB               2.00
-  bDeviceClass            0 (Defined at Interface level)
-  bDeviceSubClass         0
-  bDeviceProtocol         0
-  bMaxPacketSize0        64
-  idVendor           0x18d1 Google Inc.
-  idProduct          0x4ee2 Nexus 4 (debug)
-  bcdDevice            2.28
-  iManufacturer           1 LGE
-  iProduct                2 Nexus 4
-  iSerial                 3 01d2450ea194a93b
-  bNumConfigurations      1
-  Configuration Descriptor:
-    bLength                 9
-    bDescriptorType         2
-    wTotalLength           62
-    bNumInterfaces          2
-    bConfigurationValue     1
-    iConfiguration          0
-    bmAttributes         0x80
-      (Bus Powered)
-    MaxPower              500mA
-    Interface Descriptor:
-      bLength                 9
-      bDescriptorType         4
-      bInterfaceNumber        0
-      bAlternateSetting       0
-      bNumEndpoints           3
-      bInterfaceClass       255 Vendor Specific Class
-      bInterfaceSubClass    255 Vendor Specific Subclass
-      bInterfaceProtocol      0
-      iInterface              4 MTP
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x81  EP 1 IN
-        bmAttributes            2
-          Transfer Type            Bulk
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x0040  1x 64 bytes
-        bInterval               0
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x01  EP 1 OUT
-        bmAttributes            2
-          Transfer Type            Bulk
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x0040  1x 64 bytes
-        bInterval               0
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x82  EP 2 IN
-        bmAttributes            3
-          Transfer Type            Interrupt
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x001c  1x 28 bytes
-        bInterval               6
-    Interface Descriptor:
-      bLength                 9
-      bDescriptorType         4
-      bInterfaceNumber        1
-      bAlternateSetting       0
-      bNumEndpoints           2
-      bInterfaceClass       255 Vendor Specific Class
-      bInterfaceSubClass     66
-      bInterfaceProtocol      1
-      iInterface              0
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x83  EP 3 IN
-        bmAttributes            2
-          Transfer Type            Bulk
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x0040  1x 64 bytes
-        bInterval               0
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x02  EP 2 OUT
-        bmAttributes            2
-          Transfer Type            Bulk
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x0040  1x 64 bytes
-        bInterval               0
-Device Qualifier (for other device speed):
-  bLength                10
-  bDescriptorType         6
-  bcdUSB               2.00
-  bDeviceClass            0 (Defined at Interface level)
-  bDeviceSubClass         0
-  bDeviceProtocol         0
-  bMaxPacketSize0        64
-  bNumConfigurations      1
-Device Status:     0x0000
-  (Bus Powered)
-"""
-DEVICE_LIST = 'Bus 003 Device 007: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)'
-
-EXPECTED_RESULT = {
-    'device': '007',
-    'bus': '003',
-    'desc': 'ID 18d1:4ee2 Google Inc. Nexus 4 (debug)',
-    'Device': {
-        '_value': 'Status:',
-        '_desc': '0x0000',
-        '(Bus': {
-            '_value': 'Powered)',
-            '_desc': None
-        }
-    },
-    'Device Descriptor': {
-        'bLength': {'_value': '18', '_desc': None},
-        'bcdDevice': {'_value': '2.28', '_desc': None},
-        'bDeviceSubClass': {'_value': '0', '_desc': None},
-        'idVendor': {'_value': '0x18d1', '_desc': 'Google Inc.'},
-        'bcdUSB': {'_value': '2.00', '_desc': None},
-        'bDeviceProtocol': {'_value': '0', '_desc': None},
-        'bDescriptorType': {'_value': '1', '_desc': None},
-        'Configuration Descriptor': {
-            'bLength': {'_value': '9', '_desc': None},
-            'wTotalLength': {'_value': '62', '_desc': None},
-            'bConfigurationValue': {'_value': '1', '_desc': None},
-            'Interface Descriptor': {
-                'bLength': {'_value': '9', '_desc': None},
-                'bAlternateSetting': {'_value': '0', '_desc': None},
-                'bInterfaceNumber': {'_value': '1', '_desc': None},
-                'bNumEndpoints': {'_value': '2', '_desc': None},
-                'bDescriptorType': {'_value': '4', '_desc': None},
-                'bInterfaceSubClass': {'_value': '66', '_desc': None},
-                'bInterfaceClass': {
-                    '_value': '255',
-                    '_desc': 'Vendor Specific Class'
-                },
-                'bInterfaceProtocol': {'_value': '1', '_desc': None},
-                'Endpoint Descriptor': {
-                    'bLength': {'_value': '7', '_desc': None},
-                    'bEndpointAddress': {'_value': '0x02', '_desc': 'EP 2 OUT'},
-                    'bInterval': {'_value': '0', '_desc': None},
-                    'bDescriptorType': {'_value': '5', '_desc': None},
-                    'bmAttributes': {
-                        '_value': '2',
-                        'Transfer': {'_value': 'Type', '_desc': 'Bulk'},
-                        'Usage': {'_value': 'Type', '_desc': 'Data'},
-                        '_desc': None,
-                        'Synch': {'_value': 'Type', '_desc': 'None'}
-                    },
-                    'wMaxPacketSize': {
-                        '_value': '0x0040',
-                        '_desc': '1x 64 bytes'
-                    }
-                },
-                'iInterface': {'_value': '0', '_desc': None}
-            },
-            'bDescriptorType': {'_value': '2', '_desc': None},
-            'iConfiguration': {'_value': '0', '_desc': None},
-            'bmAttributes': {
-                '_value': '0x80',
-                '_desc': None,
-                '(Bus': {'_value': 'Powered)', '_desc': None}
-            },
-            'bNumInterfaces': {'_value': '2', '_desc': None},
-            'MaxPower': {'_value': '500mA', '_desc': None}
-        },
-        'iSerial': {'_value': '3', '_desc': '01d2450ea194a93b'},
-        'idProduct': {'_value': '0x4ee2', '_desc': 'Nexus 4 (debug)'},
-        'iManufacturer': {'_value': '1', '_desc': 'LGE'},
-        'bDeviceClass': {
-            '_value': '0',
-            '_desc': '(Defined at Interface level)'
-        },
-        'iProduct': {'_value': '2', '_desc': 'Nexus 4'},
-        'bMaxPacketSize0': {'_value': '64', '_desc': None},
-        'bNumConfigurations': {'_value': '1', '_desc': None}
-    },
-    'Device Qualifier (for other device speed)': {
-        'bLength': {'_value': '10', '_desc': None},
-        'bNumConfigurations': {'_value': '1', '_desc': None},
-        'bDeviceSubClass': {'_value': '0', '_desc': None},
-        'bcdUSB': {'_value': '2.00', '_desc': None},
-        'bDeviceProtocol': {'_value': '0', '_desc': None},
-        'bDescriptorType': {'_value': '6', '_desc': None},
-        'bDeviceClass': {
-            '_value': '0',
-            '_desc': '(Defined at Interface level)'
-        },
-        'bMaxPacketSize0': {'_value': '64', '_desc': None}
-    }
-}
-
-
-class LsusbTest(mock_calls.TestCase):
-  """Test Lsusb parsing."""
-
-  def testLsusb(self):
-    with self.assertCalls(
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['lsusb'], timeout=10), (None, DEVICE_LIST)),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
-      self.assertDictEqual(lsusb.lsusb().pop(), EXPECTED_RESULT)
-
-  def testGetSerial(self):
-    with self.assertCalls(
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['lsusb'], timeout=10), (None, DEVICE_LIST)),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
-      self.assertEqual(lsusb.get_android_devices(), ['01d2450ea194a93b'])
-
-  def testGetLsusbSerial(self):
-    with self.assertCalls(
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['lsusb'], timeout=10), (None, DEVICE_LIST)),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
-      out = lsusb.lsusb().pop()
-      self.assertEqual(lsusb.get_lsusb_serial(out), '01d2450ea194a93b')
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/utils/markdown.py b/third_party/catapult/devil/devil/utils/markdown.py
deleted file mode 100755
index 54e7ed5..0000000
--- a/third_party/catapult/devil/devil/utils/markdown.py
+++ /dev/null
@@ -1,320 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import imp
-import os
-import re
-import sys
-import textwrap
-import types
-
-# A markdown code block template: https://goo.gl/9EsyRi
-_CODE_BLOCK_FORMAT = '''```{language}
-{code}
-```
-'''
-
-_DEVIL_ROOT = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..'))
-
-
-def md_bold(raw_text):
-  """Returns markdown-formatted bold text."""
-  return '**%s**' % md_escape(raw_text, characters='*')
-
-
-def md_code(raw_text, language):
-  """Returns a markdown-formatted code block in the given language."""
-  return _CODE_BLOCK_FORMAT.format(
-      language=language or '',
-      code=md_escape(raw_text, characters='`'))
-
-
-def md_escape(raw_text, characters='*_'):
-  """Escapes * and _."""
-  def escape_char(m):
-    return '\\%s' % m.group(0)
-  pattern = '[%s]' % re.escape(characters)
-  return re.sub(pattern, escape_char, raw_text)
-
-
-def md_heading(raw_text, level):
-  """Returns markdown-formatted heading."""
-  adjusted_level = min(max(level, 0), 6)
-  return '%s%s%s' % (
-      '#' * adjusted_level, ' ' if adjusted_level > 0 else '', raw_text)
-
-
-def md_inline_code(raw_text):
-  """Returns markdown-formatted inline code."""
-  return '`%s`' % md_escape(raw_text, characters='`')
-
-
-def md_italic(raw_text):
-  """Returns markdown-formatted italic text."""
-  return '*%s*' % md_escape(raw_text, characters='*')
-
-
-def md_link(link_text, link_target):
-  """returns a markdown-formatted link."""
-  return '[%s](%s)' % (
-      md_escape(link_text, characters=']'),
-      md_escape(link_target, characters=')'))
-
-
-class MarkdownHelpFormatter(argparse.HelpFormatter):
-  """A really bare-bones argparse help formatter that generates valid markdown.
-
-  This will generate something like:
-
-  usage
-
-  # **section heading**:
-
-  ## **--argument-one**
-
-  ```
-  argument-one help text
-  ```
-
-  """
-
-  #override
-  def _format_usage(self, usage, actions, groups, prefix):
-    usage_text = super(MarkdownHelpFormatter, self)._format_usage(
-        usage, actions, groups, prefix)
-    return md_code(usage_text, language=None)
-
-  #override
-  def format_help(self):
-    self._root_section.heading = md_heading(self._prog, level=1)
-    return super(MarkdownHelpFormatter, self).format_help()
-
-  #override
-  def start_section(self, heading):
-    super(MarkdownHelpFormatter, self).start_section(
-        md_heading(heading, level=2))
-
-  #override
-  def _format_action(self, action):
-    lines = []
-    action_header = self._format_action_invocation(action)
-    lines.append(md_heading(action_header, level=3))
-    if action.help:
-      lines.append(md_code(self._expand_help(action), language=None))
-    lines.extend(['', ''])
-    return '\n'.join(lines)
-
-
-class MarkdownHelpAction(argparse.Action):
-  def __init__(self, option_strings,
-               dest=argparse.SUPPRESS, default=argparse.SUPPRESS,
-               **kwargs):
-    super(MarkdownHelpAction, self).__init__(
-        option_strings=option_strings,
-        dest=dest,
-        default=default,
-        nargs=0,
-        **kwargs)
-
-  def __call__(self, parser, namespace, values, option_string=None):
-    parser.formatter_class = MarkdownHelpFormatter
-    parser.print_help()
-    parser.exit()
-
-
-def add_md_help_argument(parser):
-  """Adds --md-help to the given argparse.ArgumentParser.
-
-  Running a script with --md-help will print the help text for that script
-  as valid markdown.
-
-  Args:
-    parser: The ArgumentParser to which --md-help should be added.
-  """
-  parser.add_argument('--md-help', action=MarkdownHelpAction,
-                      help='print Markdown-formatted help text and exit.')
-
-
-def load_module_from_path(module_path):
-  """Load a module given only the path name.
-
-  Also loads package modules as necessary.
-
-  Args:
-    module_path: An absolute path to a python module.
-  Returns:
-    The module object for the given path.
-  """
-  module_names = [os.path.splitext(os.path.basename(module_path))[0]]
-  d = os.path.dirname(module_path)
-
-  while os.path.exists(os.path.join(d, '__init__.py')):
-    module_names.append(os.path.basename(d))
-    d = os.path.dirname(d)
-
-  d = [d]
-
-  module = None
-  full_module_name = ''
-  for package_name in reversed(module_names):
-    if module:
-      d = module.__path__
-      full_module_name += '.'
-    r = imp.find_module(package_name, d)
-    full_module_name += package_name
-    module = imp.load_module(full_module_name, *r)
-  return module
-
-
-def md_module(module_obj, module_path=None, module_link=None):
-  """Write markdown documentation for a class.
-
-  Documents public classes and functions.
-
-  Args:
-    class_obj: a types.TypeType object for the class that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-  """
-  def should_doc(name):
-    return (type(module_obj.__dict__[name]) != types.ModuleType
-            and not name.startswith('_'))
-
-  stuff_to_doc = sorted(
-    obj for name, obj in module_obj.__dict__.iteritems()
-    if should_doc(name))
-
-  classes_to_doc = []
-  functions_to_doc = []
-
-  for s in stuff_to_doc:
-    if type(s) == types.TypeType:
-      classes_to_doc.append(s)
-    elif type(s) == types.FunctionType:
-      functions_to_doc.append(s)
-
-  command = ['devil/utils/markdown.py']
-  if module_link:
-    command.extend(['--module-link', module_link])
-  if module_path:
-    command.append(os.path.relpath(module_path, _DEVIL_ROOT))
-
-  heading_text = module_obj.__name__
-  if module_link:
-    heading_text = md_link(heading_text, module_link)
-
-  content = [
-      md_heading(heading_text, level=1),
-      '',
-      md_italic('This page was autogenerated by %s'
-          % md_inline_code(' '.join(command))),
-      '',
-  ]
-
-  for c in classes_to_doc:
-    content += md_class(c)
-  for f in functions_to_doc:
-    content += md_function(f)
-
-  print '\n'.join(content)
-
-  return 0
-
-
-def md_class(class_obj):
-  """Write markdown documentation for a class.
-
-  Documents public methods. Does not currently document subclasses.
-
-  Args:
-    class_obj: a types.TypeType object for the class that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-  """
-  content = [md_heading(md_escape(class_obj.__name__), level=2)]
-  content.append('')
-  if class_obj.__doc__:
-    content.extend(md_docstring(class_obj.__doc__))
-
-  def should_doc(name, obj):
-    return (type(obj) == types.FunctionType
-            and (name.startswith('__') or not name.startswith('_')))
-
-  methods_to_doc = sorted(
-      obj for name, obj in class_obj.__dict__.iteritems()
-      if should_doc(name, obj))
-
-  for m in methods_to_doc:
-    content.extend(md_function(m, class_obj=class_obj))
-
-  return content
-
-
-def md_docstring(docstring):
-  """Write a markdown-formatted docstring.
-
-  Returns:
-    A list of markdown-formatted lines.
-  """
-  content = []
-  lines = textwrap.dedent(docstring).splitlines()
-  content.append(md_escape(lines[0]))
-  lines = lines[1:]
-  while lines and (not lines[0] or lines[0].isspace()):
-    lines = lines[1:]
-
-  if not all(l.isspace() for l in lines):
-    content.append(md_code('\n'.join(lines), language=None))
-    content.append('')
-  return content
-
-
-def md_function(func_obj, class_obj=None):
-  """Write markdown documentation for a function.
-
-  Args:
-    func_obj: a types.FunctionType object for the function that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-  """
-  if class_obj:
-    heading_text = '%s.%s' % (class_obj.__name__, func_obj.__name__)
-  else:
-    heading_text = func_obj.__name__
-  content = [md_heading(md_escape(heading_text), level=3)]
-  content.append('')
-
-  if func_obj.__doc__:
-    content.extend(md_docstring(func_obj.__doc__))
-
-  return content
-
-
-def main(raw_args):
-  """Write markdown documentation for the module at the provided path.
-
-  Args:
-    raw_args: the raw command-line args. Usually sys.argv[1:].
-  Returns:
-    An integer exit code. 0 for success, non-zero for failure.
-  """
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--module-link')
-  parser.add_argument('module_path', type=os.path.realpath)
-  args = parser.parse_args(raw_args)
-
-  return md_module(
-      load_module_from_path(args.module_path),
-      module_link=args.module_link)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
-
diff --git a/third_party/catapult/devil/devil/utils/markdown_test.py b/third_party/catapult/devil/devil/utils/markdown_test.py
deleted file mode 100755
index 323776c..0000000
--- a/third_party/catapult/devil/devil/utils/markdown_test.py
+++ /dev/null
@@ -1,121 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-import textwrap
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
-
-from devil.utils import markdown
-
-
-class MarkdownTest(unittest.TestCase):
-
-  def testBold(self):
-    raw = 'foo'
-    self.assertEquals('**foo**', markdown.md_bold(raw))
-
-  def testBoldContainsStars(self):
-    raw = '*foo*'
-    self.assertEquals('**\\*foo\\***', markdown.md_bold(raw))
-
-  def testCode(self):
-    raw = textwrap.dedent("""\
-        class MarkdownTest(unittest.TestCase):
-          def testCode(self):
-            pass""")
-
-    expected = textwrap.dedent("""\
-        ```python
-        class MarkdownTest(unittest.TestCase):
-          def testCode(self):
-            pass
-        ```
-        """)
-    actual = markdown.md_code(raw, language='python')
-    self.assertEquals(expected, actual)
-
-  def testCodeContainsTicks(self):
-    raw = textwrap.dedent("""\
-        This is sample markdown.
-        ```c
-        // This is a sample code block.
-        int main(int argc, char** argv) {
-          return 0;
-        }
-        ```""")
-
-    expected = textwrap.dedent("""\
-        ```
-        This is sample markdown.
-        \\`\\`\\`c
-        // This is a sample code block.
-        int main(int argc, char** argv) {
-          return 0;
-        }
-        \\`\\`\\`
-        ```
-        """)
-    actual = markdown.md_code(raw, language=None)
-    self.assertEquals(expected, actual)
-
-  def testEscape(self):
-    raw = 'text_with_underscores *and stars*'
-    expected = 'text\\_with\\_underscores \\*and stars\\*'
-    actual = markdown.md_escape(raw)
-    self.assertEquals(expected, actual)
-
-  def testHeading1(self):
-    raw = 'Heading 1'
-    self.assertEquals('# Heading 1', markdown.md_heading(raw, level=1))
-
-  def testHeading5(self):
-    raw = 'Heading 5'
-    self.assertEquals('##### Heading 5', markdown.md_heading(raw, level=5))
-
-  def testHeading10(self):
-    raw = 'Heading 10'
-    self.assertEquals('###### Heading 10', markdown.md_heading(raw, level=10))
-
-  def testInlineCode(self):
-    raw = 'devil.utils.markdown_test'
-    self.assertEquals(
-        '`devil.utils.markdown_test`', markdown.md_inline_code(raw))
-
-  def testInlineCodeContainsTicks(self):
-    raw = 'this contains `backticks`'
-    self.assertEquals(
-        '`this contains \\`backticks\\``', markdown.md_inline_code(raw))
-
-  def testItalic(self):
-    raw = 'bar'
-    self.assertEquals('*bar*', markdown.md_italic(raw))
-
-  def testItalicContainsStars(self):
-    raw = '*bar*'
-    self.assertEquals('*\\*bar\\**', markdown.md_italic(raw))
-
-  def testLink(self):
-    link_text = 'Devil home'
-    link_target = (
-        'https://github.com/catapult-project/catapult/tree/master/devil')
-    expected = (
-        '[Devil home]'
-        '(https://github.com/catapult-project/catapult/tree/master/devil)')
-    self.assertEquals(expected, markdown.md_link(link_text, link_target))
-
-  def testLinkTextContainsBracket(self):
-    link_text = 'foo [] bar'
-    link_target = 'https://www.google.com'
-    expected = '[foo [\\] bar](https://www.google.com)'
-    self.assertEquals(expected, markdown.md_link(link_text, link_target))
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/utils/mock_calls.py b/third_party/catapult/devil/devil/utils/mock_calls.py
deleted file mode 100644
index 5ae951e..0000000
--- a/third_party/catapult/devil/devil/utils/mock_calls.py
+++ /dev/null
@@ -1,180 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-A test facility to assert call sequences while mocking their behavior.
-"""
-
-import unittest
-
-from devil import devil_env
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class TestCase(unittest.TestCase):
-  """Adds assertCalls to TestCase objects."""
-  class _AssertCalls(object):
-
-    def __init__(self, test_case, expected_calls, watched):
-      def call_action(pair):
-        if isinstance(pair, type(mock.call)):
-          return (pair, None)
-        else:
-          return pair
-
-      def do_check(call):
-        def side_effect(*args, **kwargs):
-          received_call = call(*args, **kwargs)
-          self._test_case.assertTrue(
-              self._expected_calls,
-              msg=('Unexpected call: %s' % str(received_call)))
-          expected_call, action = self._expected_calls.pop(0)
-          self._test_case.assertTrue(
-              received_call == expected_call,
-              msg=('Expected call mismatch:\n'
-                   '  expected: %s\n'
-                   '  received: %s\n'
-                   % (str(expected_call), str(received_call))))
-          if callable(action):
-            return action(*args, **kwargs)
-          else:
-            return action
-        return side_effect
-
-      self._test_case = test_case
-      self._expected_calls = [call_action(pair) for pair in expected_calls]
-      watched = watched.copy()  # do not pollute the caller's dict
-      watched.update((call.parent.name, call.parent)
-                     for call, _ in self._expected_calls)
-      self._patched = [test_case.patch_call(call, side_effect=do_check(call))
-                       for call in watched.itervalues()]
-
-    def __enter__(self):
-      for patch in self._patched:
-        patch.__enter__()
-      return self
-
-    def __exit__(self, exc_type, exc_val, exc_tb):
-      for patch in self._patched:
-        patch.__exit__(exc_type, exc_val, exc_tb)
-      if exc_type is None:
-        missing = ''.join('  expected: %s\n' % str(call)
-                          for call, _ in self._expected_calls)
-        self._test_case.assertFalse(
-            missing,
-            msg='Expected calls not found:\n' + missing)
-
-  def __init__(self, *args, **kwargs):
-    super(TestCase, self).__init__(*args, **kwargs)
-    self.call = mock.call.self
-    self._watched = {}
-
-  def call_target(self, call):
-    """Resolve a self.call instance to the target it represents.
-
-    Args:
-      call: a self.call instance, e.g. self.call.adb.Shell
-
-    Returns:
-      The target object represented by the call, e.g. self.adb.Shell
-
-    Raises:
-      ValueError if the path of the call does not start with "self", i.e. the
-          target of the call is external to the self object.
-      AttributeError if the path of the call does not specify a valid
-          chain of attributes (without any calls) starting from "self".
-    """
-    path = call.name.split('.')
-    if path.pop(0) != 'self':
-      raise ValueError("Target %r outside of 'self' object" % call.name)
-    target = self
-    for attr in path:
-      target = getattr(target, attr)
-    return target
-
-  def patch_call(self, call, **kwargs):
-    """Patch the target of a mock.call instance.
-
-    Args:
-      call: a mock.call instance identifying a target to patch
-      Extra keyword arguments are processed by mock.patch
-
-    Returns:
-      A context manager to mock/unmock the target of the call
-    """
-    if call.name.startswith('self.'):
-      target = self.call_target(call.parent)
-      _, attribute = call.name.rsplit('.', 1)
-      if (hasattr(type(target), attribute)
-          and isinstance(getattr(type(target), attribute), property)):
-        return mock.patch.object(
-            type(target), attribute, new_callable=mock.PropertyMock, **kwargs)
-      else:
-        return mock.patch.object(target, attribute, **kwargs)
-    else:
-      return mock.patch(call.name, **kwargs)
-
-  def watchCalls(self, calls):
-    """Add calls to the set of watched calls.
-
-    Args:
-      calls: a sequence of mock.call instances identifying targets to watch
-    """
-    self._watched.update((call.name, call) for call in calls)
-
-  def watchMethodCalls(self, call, ignore=None):
-    """Watch all public methods of the target identified by a self.call.
-
-    Args:
-      call: a self.call instance indetifying an object
-      ignore: a list of public methods to ignore when watching for calls
-    """
-    target = self.call_target(call)
-    if ignore is None:
-      ignore = []
-    self.watchCalls(getattr(call, method)
-                    for method in dir(target.__class__)
-                    if not method.startswith('_') and not method in ignore)
-
-  def clearWatched(self):
-    """Clear the set of watched calls."""
-    self._watched = {}
-
-  def assertCalls(self, *calls):
-    """A context manager to assert that a sequence of calls is made.
-
-    During the assertion, a number of functions and methods will be "watched",
-    and any calls made to them is expected to appear---in the exact same order,
-    and with the exact same arguments---as specified by the argument |calls|.
-
-    By default, the targets of all expected calls are watched. Further targets
-    to watch may be added using watchCalls and watchMethodCalls.
-
-    Optionaly, each call may be accompanied by an action. If the action is a
-    (non-callable) value, this value will be used as the return value given to
-    the caller when the matching call is found. Alternatively, if the action is
-    a callable, the action will be then called with the same arguments as the
-    intercepted call, so that it can provide a return value or perform other
-    side effects. If the action is missing, a return value of None is assumed.
-
-    Note that mock.Mock objects are often convenient to use as a callable
-    action, e.g. to raise exceptions or return other objects which are
-    themselves callable.
-
-    Args:
-      calls: each argument is either a pair (expected_call, action) or just an
-          expected_call, where expected_call is a mock.call instance.
-
-    Raises:
-      AssertionError if the watched targets do not receive the exact sequence
-          of calls specified. Missing calls, extra calls, and calls with
-          mismatching arguments, all cause the assertion to fail.
-    """
-    return self._AssertCalls(self, calls, self._watched)
-
-  def assertCall(self, call, action=None):
-    return self.assertCalls((call, action))
-
diff --git a/third_party/catapult/devil/devil/utils/mock_calls_test.py b/third_party/catapult/devil/devil/utils/mock_calls_test.py
deleted file mode 100755
index 8eb4fc9..0000000
--- a/third_party/catapult/devil/devil/utils/mock_calls_test.py
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""
-Unit tests for the contents of mock_calls.py.
-"""
-
-import logging
-import os
-import unittest
-
-from devil import devil_env
-from devil.android.sdk import version_codes
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class _DummyAdb(object):
-
-  def __str__(self):
-    return '0123456789abcdef'
-
-  def Push(self, host_path, device_path):
-    logging.debug('(device %s) pushing %r to %r', self, host_path, device_path)
-
-  def IsOnline(self):
-    logging.debug('(device %s) checking device online', self)
-    return True
-
-  def Shell(self, cmd):
-    logging.debug('(device %s) running command %r', self, cmd)
-    return "nice output\n"
-
-  def Reboot(self):
-    logging.debug('(device %s) rebooted!', self)
-
-  @property
-  def build_version_sdk(self):
-    logging.debug('(device %s) getting build_version_sdk', self)
-    return version_codes.LOLLIPOP
-
-
-class TestCaseWithAssertCallsTest(mock_calls.TestCase):
-
-  def setUp(self):
-    self.adb = _DummyAdb()
-
-  def ShellError(self):
-    def action(cmd):
-      raise ValueError('(device %s) command %r is not nice' % (self.adb, cmd))
-    return action
-
-  def get_answer(self):
-    logging.debug("called 'get_answer' of %r object", self)
-    return 42
-
-  def echo(self, thing):
-    logging.debug("called 'echo' of %r object", self)
-    return thing
-
-  def testCallTarget_succeds(self):
-    self.assertEquals(self.adb.Shell,
-                      self.call_target(self.call.adb.Shell))
-
-  def testCallTarget_failsExternal(self):
-    with self.assertRaises(ValueError):
-      self.call_target(mock.call.sys.getcwd)
-
-  def testCallTarget_failsUnknownAttribute(self):
-    with self.assertRaises(AttributeError):
-      self.call_target(self.call.adb.Run)
-
-  def testCallTarget_failsIntermediateCalls(self):
-    with self.assertRaises(AttributeError):
-      self.call_target(self.call.adb.RunShell('cmd').append)
-
-  def testPatchCall_method(self):
-    self.assertEquals(42, self.get_answer())
-    with self.patch_call(self.call.get_answer, return_value=123):
-      self.assertEquals(123, self.get_answer())
-    self.assertEquals(42, self.get_answer())
-
-  def testPatchCall_attribute_method(self):
-    with self.patch_call(self.call.adb.Shell, return_value='hello'):
-      self.assertEquals('hello', self.adb.Shell('echo hello'))
-
-  def testPatchCall_global(self):
-    with self.patch_call(mock.call.os.getcwd, return_value='/some/path'):
-      self.assertEquals('/some/path', os.getcwd())
-
-  def testPatchCall_withSideEffect(self):
-    with self.patch_call(self.call.adb.Shell, side_effect=ValueError):
-      with self.assertRaises(ValueError):
-        self.adb.Shell('echo hello')
-
-  def testPatchCall_property(self):
-    self.assertEquals(version_codes.LOLLIPOP, self.adb.build_version_sdk)
-    with self.patch_call(
-        self.call.adb.build_version_sdk,
-        return_value=version_codes.KITKAT):
-      self.assertEquals(version_codes.KITKAT, self.adb.build_version_sdk)
-    self.assertEquals(version_codes.LOLLIPOP, self.adb.build_version_sdk)
-
-  def testAssertCalls_succeeds_simple(self):
-    self.assertEquals(42, self.get_answer())
-    with self.assertCall(self.call.get_answer(), 123):
-      self.assertEquals(123, self.get_answer())
-    self.assertEquals(42, self.get_answer())
-
-  def testAssertCalls_succeeds_multiple(self):
-    with self.assertCalls(
-        (mock.call.os.getcwd(), '/some/path'),
-        (self.call.echo('hello'), 'hello'),
-        (self.call.get_answer(), 11),
-        self.call.adb.Push('this_file', 'that_file'),
-        (self.call.get_answer(), 12)):
-      self.assertEquals(os.getcwd(), '/some/path')
-      self.assertEquals('hello', self.echo('hello'))
-      self.assertEquals(11, self.get_answer())
-      self.adb.Push('this_file', 'that_file')
-      self.assertEquals(12, self.get_answer())
-
-  def testAsserCalls_succeeds_withAction(self):
-    with self.assertCall(
-        self.call.adb.Shell('echo hello'), self.ShellError()):
-      with self.assertRaises(ValueError):
-        self.adb.Shell('echo hello')
-
-  def testAssertCalls_fails_tooManyCalls(self):
-    with self.assertRaises(AssertionError):
-      with self.assertCalls(self.call.adb.IsOnline()):
-        self.adb.IsOnline()
-        self.adb.IsOnline()
-
-  def testAssertCalls_fails_tooFewCalls(self):
-    with self.assertRaises(AssertionError):
-      with self.assertCalls(self.call.adb.IsOnline()):
-        pass
-
-  def testAssertCalls_succeeds_extraCalls(self):
-    # we are not watching Reboot, so the assertion succeeds
-    with self.assertCalls(self.call.adb.IsOnline()):
-      self.adb.IsOnline()
-      self.adb.Reboot()
-
-  def testAssertCalls_fails_extraCalls(self):
-    self.watchCalls([self.call.adb.Reboot])
-    # this time we are also watching Reboot, so the assertion fails
-    with self.assertRaises(AssertionError):
-      with self.assertCalls(self.call.adb.IsOnline()):
-        self.adb.IsOnline()
-        self.adb.Reboot()
-
-  def testAssertCalls_succeeds_NoCalls(self):
-    self.watchMethodCalls(self.call.adb)  # we are watching all adb methods
-    with self.assertCalls():
-      pass
-
-  def testAssertCalls_fails_NoCalls(self):
-    self.watchMethodCalls(self.call.adb)
-    with self.assertRaises(AssertionError):
-      with self.assertCalls():
-        self.adb.IsOnline()
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
-
diff --git a/third_party/catapult/devil/devil/utils/parallelizer.py b/third_party/catapult/devil/devil/utils/parallelizer.py
deleted file mode 100644
index 3599525..0000000
--- a/third_party/catapult/devil/devil/utils/parallelizer.py
+++ /dev/null
@@ -1,238 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-""" Wrapper that allows method execution in parallel.
-
-This class wraps a list of objects of the same type, emulates their
-interface, and executes any functions called on the objects in parallel
-in ReraiserThreads.
-
-This means that, given a list of objects:
-
-  class Foo:
-    def __init__(self):
-      self.baz = Baz()
-
-    def bar(self, my_param):
-      // do something
-
-  list_of_foos = [Foo(1), Foo(2), Foo(3)]
-
-we can take a sequential operation on that list of objects:
-
-  for f in list_of_foos:
-    f.bar('Hello')
-
-and run it in parallel across all of the objects:
-
-  Parallelizer(list_of_foos).bar('Hello')
-
-It can also handle (non-method) attributes of objects, so that this:
-
-  for f in list_of_foos:
-    f.baz.myBazMethod()
-
-can be run in parallel with:
-
-  Parallelizer(list_of_foos).baz.myBazMethod()
-
-Because it emulates the interface of the wrapped objects, a Parallelizer
-can be passed to a method or function that takes objects of that type:
-
-  def DoesSomethingWithFoo(the_foo):
-    the_foo.bar('Hello')
-    the_foo.bar('world')
-    the_foo.baz.myBazMethod
-
-  DoesSomethingWithFoo(Parallelizer(list_of_foos))
-
-Note that this class spins up a thread for each object. Using this class
-to parallelize operations that are already fast will incur a net performance
-penalty.
-
-"""
-# pylint: disable=protected-access
-
-from devil.utils import reraiser_thread
-from devil.utils import watchdog_timer
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-
-
-class Parallelizer(object):
-  """Allows parallel execution of method calls across a group of objects."""
-
-  def __init__(self, objs):
-    self._orig_objs = objs
-    self._objs = objs
-
-  def __getattr__(self, name):
-    """Emulate getting the |name| attribute of |self|.
-
-    Args:
-      name: The name of the attribute to retrieve.
-    Returns:
-      A Parallelizer emulating the |name| attribute of |self|.
-    """
-    self.pGet(None)
-
-    r = type(self)(self._orig_objs)
-    r._objs = [getattr(o, name) for o in self._objs]
-    return r
-
-  def __getitem__(self, index):
-    """Emulate getting the value of |self| at |index|.
-
-    Returns:
-      A Parallelizer emulating the value of |self| at |index|.
-    """
-    self.pGet(None)
-
-    r = type(self)(self._orig_objs)
-    r._objs = [o[index] for o in self._objs]
-    return r
-
-  def __call__(self, *args, **kwargs):
-    """Emulate calling |self| with |args| and |kwargs|.
-
-    Note that this call is asynchronous. Call pFinish on the return value to
-    block until the call finishes.
-
-    Returns:
-      A Parallelizer wrapping the ReraiserThreadGroup running the call in
-      parallel.
-    Raises:
-      AttributeError if the wrapped objects aren't callable.
-    """
-    self.pGet(None)
-
-    for o in self._objs:
-      if not callable(o):
-        raise AttributeError("'%s' is not callable" % o.__name__)
-
-    r = type(self)(self._orig_objs)
-    r._objs = reraiser_thread.ReraiserThreadGroup(
-        [reraiser_thread.ReraiserThread(
-            o, args=args, kwargs=kwargs,
-            name='%s.%s' % (str(d), o.__name__))
-         for d, o in zip(self._orig_objs, self._objs)])
-    r._objs.StartAll()  # pylint: disable=W0212
-    return r
-
-  def pFinish(self, timeout):
-    """Finish any outstanding asynchronous operations.
-
-    Args:
-      timeout: The maximum number of seconds to wait for an individual
-               result to return, or None to wait forever.
-    Returns:
-      self, now emulating the return values.
-    """
-    self._assertNoShadow('pFinish')
-    if isinstance(self._objs, reraiser_thread.ReraiserThreadGroup):
-      self._objs.JoinAll()
-      self._objs = self._objs.GetAllReturnValues(
-          watchdog_timer.WatchdogTimer(timeout))
-    return self
-
-  def pGet(self, timeout):
-    """Get the current wrapped objects.
-
-    Args:
-      timeout: Same as |pFinish|.
-    Returns:
-      A list of the results, in order of the provided devices.
-    Raises:
-      Any exception raised by any of the called functions.
-    """
-    self._assertNoShadow('pGet')
-    self.pFinish(timeout)
-    return self._objs
-
-  def pMap(self, f, *args, **kwargs):
-    """Map a function across the current wrapped objects in parallel.
-
-    This calls f(o, *args, **kwargs) for each o in the set of wrapped objects.
-
-    Note that this call is asynchronous. Call pFinish on the return value to
-    block until the call finishes.
-
-    Args:
-      f: The function to call.
-      args: The positional args to pass to f.
-      kwargs: The keyword args to pass to f.
-    Returns:
-      A Parallelizer wrapping the ReraiserThreadGroup running the map in
-      parallel.
-    """
-    self._assertNoShadow('pMap')
-    r = type(self)(self._orig_objs)
-    r._objs = reraiser_thread.ReraiserThreadGroup(
-        [reraiser_thread.ReraiserThread(
-            f, args=tuple([o] + list(args)), kwargs=kwargs,
-            name='%s(%s)' % (f.__name__, d))
-         for d, o in zip(self._orig_objs, self._objs)])
-    r._objs.StartAll()  # pylint: disable=W0212
-    return r
-
-  def _assertNoShadow(self, attr_name):
-    """Ensures that |attr_name| isn't shadowing part of the wrapped obejcts.
-
-    If the wrapped objects _do_ have an |attr_name| attribute, it will be
-    inaccessible to clients.
-
-    Args:
-      attr_name: The attribute to check.
-    Raises:
-      AssertionError if the wrapped objects have an attribute named 'attr_name'
-      or '_assertNoShadow'.
-    """
-    if isinstance(self._objs, reraiser_thread.ReraiserThreadGroup):
-      assert not hasattr(self._objs, '_assertNoShadow')
-      assert not hasattr(self._objs, attr_name)
-    else:
-      assert not any(hasattr(o, '_assertNoShadow') for o in self._objs)
-      assert not any(hasattr(o, attr_name) for o in self._objs)
-
-
-class SyncParallelizer(Parallelizer):
-  """A Parallelizer that blocks on function calls."""
-
-  # override
-  def __call__(self, *args, **kwargs):
-    """Emulate calling |self| with |args| and |kwargs|.
-
-    Note that this call is synchronous.
-
-    Returns:
-      A Parallelizer emulating the value returned from calling |self| with
-      |args| and |kwargs|.
-    Raises:
-      AttributeError if the wrapped objects aren't callable.
-    """
-    r = super(SyncParallelizer, self).__call__(*args, **kwargs)
-    r.pFinish(None)
-    return r
-
-  # override
-  def pMap(self, f, *args, **kwargs):
-    """Map a function across the current wrapped objects in parallel.
-
-    This calls f(o, *args, **kwargs) for each o in the set of wrapped objects.
-
-    Note that this call is synchronous.
-
-    Args:
-      f: The function to call.
-      args: The positional args to pass to f.
-      kwargs: The keyword args to pass to f.
-    Returns:
-      A Parallelizer wrapping the ReraiserThreadGroup running the map in
-      parallel.
-    """
-    r = super(SyncParallelizer, self).pMap(f, *args, **kwargs)
-    r.pFinish(None)
-    return r
-
diff --git a/third_party/catapult/devil/devil/utils/parallelizer_test.py b/third_party/catapult/devil/devil/utils/parallelizer_test.py
deleted file mode 100644
index 32ff7ec..0000000
--- a/third_party/catapult/devil/devil/utils/parallelizer_test.py
+++ /dev/null
@@ -1,162 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Unit tests for the contents of parallelizer.py."""
-
-# pylint: disable=W0212
-# pylint: disable=W0613
-
-import os
-import tempfile
-import time
-import unittest
-
-from devil.utils import parallelizer
-
-
-class ParallelizerTestObject(object):
-  """Class used to test parallelizer.Parallelizer."""
-
-  parallel = parallelizer.Parallelizer
-
-  def __init__(self, thing, completion_file_name=None):
-    self._thing = thing
-    self._completion_file_name = completion_file_name
-    self.helper = ParallelizerTestObjectHelper(thing)
-
-  @staticmethod
-  def doReturn(what):
-    return what
-
-  @classmethod
-  def doRaise(cls, what):
-    raise what
-
-  def doSetTheThing(self, new_thing):
-    self._thing = new_thing
-
-  def doReturnTheThing(self):
-    return self._thing
-
-  def doRaiseTheThing(self):
-    raise self._thing
-
-  def doRaiseIfExceptionElseSleepFor(self, sleep_duration):
-    if isinstance(self._thing, Exception):
-      raise self._thing
-    time.sleep(sleep_duration)
-    self._write_completion_file()
-    return self._thing
-
-  def _write_completion_file(self):
-    if self._completion_file_name and len(self._completion_file_name):
-      with open(self._completion_file_name, 'w+b') as completion_file:
-        completion_file.write('complete')
-
-  def __getitem__(self, index):
-    return self._thing[index]
-
-  def __str__(self):
-    return type(self).__name__
-
-
-class ParallelizerTestObjectHelper(object):
-
-  def __init__(self, thing):
-    self._thing = thing
-
-  def doReturnStringThing(self):
-    return str(self._thing)
-
-
-class ParallelizerTest(unittest.TestCase):
-
-  def testInitEmptyList(self):
-    r = parallelizer.Parallelizer([]).replace('a', 'b').pGet(0.1)
-    self.assertEquals([], r)
-
-  def testMethodCall(self):
-    test_data = ['abc_foo', 'def_foo', 'ghi_foo']
-    expected = ['abc_bar', 'def_bar', 'ghi_bar']
-    r = parallelizer.Parallelizer(test_data).replace('_foo', '_bar').pGet(0.1)
-    self.assertEquals(expected, r)
-
-  def testMutate(self):
-    devices = [ParallelizerTestObject(True) for _ in xrange(0, 10)]
-    self.assertTrue(all(d.doReturnTheThing() for d in devices))
-    ParallelizerTestObject.parallel(devices).doSetTheThing(False).pFinish(1)
-    self.assertTrue(not any(d.doReturnTheThing() for d in devices))
-
-  def testAllReturn(self):
-    devices = [ParallelizerTestObject(True) for _ in xrange(0, 10)]
-    results = ParallelizerTestObject.parallel(
-        devices).doReturnTheThing().pGet(1)
-    self.assertTrue(isinstance(results, list))
-    self.assertEquals(10, len(results))
-    self.assertTrue(all(results))
-
-  def testAllRaise(self):
-    devices = [ParallelizerTestObject(Exception('thing %d' % i))
-               for i in xrange(0, 10)]
-    p = ParallelizerTestObject.parallel(devices).doRaiseTheThing()
-    with self.assertRaises(Exception):
-      p.pGet(1)
-
-  def testOneFailOthersComplete(self):
-    parallel_device_count = 10
-    exception_index = 7
-    exception_msg = 'thing %d' % exception_index
-
-    try:
-      completion_files = [tempfile.NamedTemporaryFile(delete=False)
-                          for _ in xrange(0, parallel_device_count)]
-      devices = [
-          ParallelizerTestObject(
-              i if i != exception_index else Exception(exception_msg),
-              completion_files[i].name)
-          for i in xrange(0, parallel_device_count)]
-      for f in completion_files:
-        f.close()
-      p = ParallelizerTestObject.parallel(devices)
-      with self.assertRaises(Exception) as e:
-        p.doRaiseIfExceptionElseSleepFor(2).pGet(3)
-      self.assertTrue(exception_msg in str(e.exception))
-      for i in xrange(0, parallel_device_count):
-        with open(completion_files[i].name) as f:
-          if i == exception_index:
-            self.assertEquals('', f.read())
-          else:
-            self.assertEquals('complete', f.read())
-    finally:
-      for f in completion_files:
-        os.remove(f.name)
-
-  def testReusable(self):
-    devices = [ParallelizerTestObject(True) for _ in xrange(0, 10)]
-    p = ParallelizerTestObject.parallel(devices)
-    results = p.doReturn(True).pGet(1)
-    self.assertTrue(all(results))
-    results = p.doReturn(True).pGet(1)
-    self.assertTrue(all(results))
-    with self.assertRaises(Exception):
-      results = p.doRaise(Exception('reusableTest')).pGet(1)
-
-  def testContained(self):
-    devices = [ParallelizerTestObject(i) for i in xrange(0, 10)]
-    results = (ParallelizerTestObject.parallel(devices).helper
-        .doReturnStringThing().pGet(1))
-    self.assertTrue(isinstance(results, list))
-    self.assertEquals(10, len(results))
-    for i in xrange(0, 10):
-      self.assertEquals(str(i), results[i])
-
-  def testGetItem(self):
-    devices = [ParallelizerTestObject(range(i, i + 10)) for i in xrange(0, 10)]
-    results = ParallelizerTestObject.parallel(devices)[9].pGet(1)
-    self.assertEquals(range(9, 19), results)
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
-
diff --git a/third_party/catapult/devil/devil/utils/reraiser_thread.py b/third_party/catapult/devil/devil/utils/reraiser_thread.py
deleted file mode 100644
index 56d95f3..0000000
--- a/third_party/catapult/devil/devil/utils/reraiser_thread.py
+++ /dev/null
@@ -1,228 +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.
-
-"""Thread and ThreadGroup that reraise exceptions on the main thread."""
-# pylint: disable=W0212
-
-import logging
-import sys
-import threading
-import time
-import traceback
-
-from devil.utils import watchdog_timer
-
-
-class TimeoutError(Exception):
-  """Module-specific timeout exception."""
-  pass
-
-
-def LogThreadStack(thread, error_log_func=logging.critical):
-  """Log the stack for the given thread.
-
-  Args:
-    thread: a threading.Thread instance.
-    error_log_func: Logging function when logging errors.
-  """
-  stack = sys._current_frames()[thread.ident]
-  error_log_func('*' * 80)
-  error_log_func('Stack dump for thread %r', thread.name)
-  error_log_func('*' * 80)
-  for filename, lineno, name, line in traceback.extract_stack(stack):
-    error_log_func('File: "%s", line %d, in %s', filename, lineno, name)
-    if line:
-      error_log_func('  %s', line.strip())
-  error_log_func('*' * 80)
-
-
-class ReraiserThread(threading.Thread):
-  """Thread class that can reraise exceptions."""
-
-  def __init__(self, func, args=None, kwargs=None, name=None):
-    """Initialize thread.
-
-    Args:
-      func: callable to call on a new thread.
-      args: list of positional arguments for callable, defaults to empty.
-      kwargs: dictionary of keyword arguments for callable, defaults to empty.
-      name: thread name, defaults to Thread-N.
-    """
-    if not name and func.__name__ != '<lambda>':
-      name = func.__name__
-    super(ReraiserThread, self).__init__(name=name)
-    if not args:
-      args = []
-    if not kwargs:
-      kwargs = {}
-    self.daemon = True
-    self._func = func
-    self._args = args
-    self._kwargs = kwargs
-    self._ret = None
-    self._exc_info = None
-    self._thread_group = None
-
-  def ReraiseIfException(self):
-    """Reraise exception if an exception was raised in the thread."""
-    if self._exc_info:
-      raise self._exc_info[0], self._exc_info[1], self._exc_info[2]
-
-  def GetReturnValue(self):
-    """Reraise exception if present, otherwise get the return value."""
-    self.ReraiseIfException()
-    return self._ret
-
-  # override
-  def run(self):
-    """Overrides Thread.run() to add support for reraising exceptions."""
-    try:
-      self._ret = self._func(*self._args, **self._kwargs)
-    except:  # pylint: disable=W0702
-      self._exc_info = sys.exc_info()
-
-
-class ReraiserThreadGroup(object):
-  """A group of ReraiserThread objects."""
-
-  def __init__(self, threads=None):
-    """Initialize thread group.
-
-    Args:
-      threads: a list of ReraiserThread objects; defaults to empty.
-    """
-    self._threads = []
-    # Set when a thread from one group has called JoinAll on another. It is used
-    # to detect when a there is a TimeoutRetryThread active that links to the
-    # current thread.
-    self.blocked_parent_thread_group = None
-    if threads:
-      for thread in threads:
-        self.Add(thread)
-
-  def Add(self, thread):
-    """Add a thread to the group.
-
-    Args:
-      thread: a ReraiserThread object.
-    """
-    assert thread._thread_group is None
-    thread._thread_group = self
-    self._threads.append(thread)
-
-  def StartAll(self, will_block=False):
-    """Start all threads.
-
-    Args:
-      will_block: Whether the calling thread will subsequently block on this
-        thread group. Causes the active ReraiserThreadGroup (if there is one)
-        to be marked as blocking on this thread group.
-    """
-    if will_block:
-      # Multiple threads blocking on the same outer thread should not happen in
-      # practice.
-      assert not self.blocked_parent_thread_group
-      self.blocked_parent_thread_group = CurrentThreadGroup()
-    for thread in self._threads:
-      thread.start()
-
-  def _JoinAll(self, watcher=None, timeout=None):
-    """Join all threads without stack dumps.
-
-    Reraises exceptions raised by the child threads and supports breaking
-    immediately on exceptions raised on the main thread.
-
-    Args:
-      watcher: Watchdog object providing the thread timeout. If none is
-          provided, the thread will never be timed out.
-      timeout: An optional number of seconds to wait before timing out the join
-          operation. This will not time out the threads.
-    """
-    if watcher is None:
-      watcher = watchdog_timer.WatchdogTimer(None)
-    alive_threads = self._threads[:]
-    end_time = (time.time() + timeout) if timeout else None
-    try:
-      while alive_threads and (end_time is None or end_time > time.time()):
-        for thread in alive_threads[:]:
-          if watcher.IsTimedOut():
-            raise TimeoutError('Timed out waiting for %d of %d threads.' %
-                               (len(alive_threads), len(self._threads)))
-          # Allow the main thread to periodically check for interrupts.
-          thread.join(0.1)
-          if not thread.isAlive():
-            alive_threads.remove(thread)
-      # All threads are allowed to complete before reraising exceptions.
-      for thread in self._threads:
-        thread.ReraiseIfException()
-    finally:
-      self.blocked_parent_thread_group = None
-
-  def IsAlive(self):
-    """Check whether any of the threads are still alive.
-
-    Returns:
-      Whether any of the threads are still alive.
-    """
-    return any(t.isAlive() for t in self._threads)
-
-  def JoinAll(self, watcher=None, timeout=None,
-              error_log_func=logging.critical):
-    """Join all threads.
-
-    Reraises exceptions raised by the child threads and supports breaking
-    immediately on exceptions raised on the main thread. Unfinished threads'
-    stacks will be logged on watchdog timeout.
-
-    Args:
-      watcher: Watchdog object providing the thread timeout. If none is
-          provided, the thread will never be timed out.
-      timeout: An optional number of seconds to wait before timing out the join
-          operation. This will not time out the threads.
-      error_log_func: Logging function when logging errors.
-    """
-    try:
-      self._JoinAll(watcher, timeout)
-    except TimeoutError:
-      error_log_func('Timed out. Dumping threads.')
-      for thread in (t for t in self._threads if t.isAlive()):
-        LogThreadStack(thread, error_log_func=error_log_func)
-      raise
-
-  def GetAllReturnValues(self, watcher=None):
-    """Get all return values, joining all threads if necessary.
-
-    Args:
-      watcher: same as in |JoinAll|. Only used if threads are alive.
-    """
-    if any([t.isAlive() for t in self._threads]):
-      self.JoinAll(watcher)
-    return [t.GetReturnValue() for t in self._threads]
-
-
-def CurrentThreadGroup():
-  """Returns the ReraiserThreadGroup that owns the running thread.
-
-  Returns:
-    The current thread group, otherwise None.
-  """
-  current_thread = threading.current_thread()
-  if isinstance(current_thread, ReraiserThread):
-    return current_thread._thread_group  # pylint: disable=no-member
-  return None
-
-
-def RunAsync(funcs, watcher=None):
-  """Executes the given functions in parallel and returns their results.
-
-  Args:
-    funcs: List of functions to perform on their own threads.
-    watcher: Watchdog object providing timeout, by default waits forever.
-
-  Returns:
-    A list of return values in the order of the given functions.
-  """
-  thread_group = ReraiserThreadGroup(ReraiserThread(f) for f in funcs)
-  thread_group.StartAll(will_block=True)
-  return thread_group.GetAllReturnValues(watcher=watcher)
diff --git a/third_party/catapult/devil/devil/utils/reraiser_thread_unittest.py b/third_party/catapult/devil/devil/utils/reraiser_thread_unittest.py
deleted file mode 100644
index e3c4e6b..0000000
--- a/third_party/catapult/devil/devil/utils/reraiser_thread_unittest.py
+++ /dev/null
@@ -1,117 +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.
-
-"""Unittests for reraiser_thread.py."""
-
-import threading
-import unittest
-
-from devil.utils import reraiser_thread
-from devil.utils import watchdog_timer
-
-
-class TestException(Exception):
-  pass
-
-
-class TestReraiserThread(unittest.TestCase):
-  """Tests for reraiser_thread.ReraiserThread."""
-
-  def testNominal(self):
-    result = [None, None]
-
-    def f(a, b=None):
-      result[0] = a
-      result[1] = b
-
-    thread = reraiser_thread.ReraiserThread(f, [1], {'b': 2})
-    thread.start()
-    thread.join()
-    self.assertEqual(result[0], 1)
-    self.assertEqual(result[1], 2)
-
-  def testRaise(self):
-    def f():
-      raise TestException
-
-    thread = reraiser_thread.ReraiserThread(f)
-    thread.start()
-    thread.join()
-    with self.assertRaises(TestException):
-      thread.ReraiseIfException()
-
-
-class TestReraiserThreadGroup(unittest.TestCase):
-  """Tests for reraiser_thread.ReraiserThreadGroup."""
-
-  def testInit(self):
-    ran = [False] * 5
-
-    def f(i):
-      ran[i] = True
-
-    group = reraiser_thread.ReraiserThreadGroup(
-      [reraiser_thread.ReraiserThread(f, args=[i]) for i in range(5)])
-    group.StartAll()
-    group.JoinAll()
-    for v in ran:
-      self.assertTrue(v)
-
-  def testAdd(self):
-    ran = [False] * 5
-
-    def f(i):
-      ran[i] = True
-
-    group = reraiser_thread.ReraiserThreadGroup()
-    for i in xrange(5):
-      group.Add(reraiser_thread.ReraiserThread(f, args=[i]))
-    group.StartAll()
-    group.JoinAll()
-    for v in ran:
-      self.assertTrue(v)
-
-  def testJoinRaise(self):
-    def f():
-      raise TestException
-    group = reraiser_thread.ReraiserThreadGroup(
-      [reraiser_thread.ReraiserThread(f) for _ in xrange(5)])
-    group.StartAll()
-    with self.assertRaises(TestException):
-      group.JoinAll()
-
-  def testJoinTimeout(self):
-    def f():
-      pass
-    event = threading.Event()
-
-    def g():
-      event.wait()
-    group = reraiser_thread.ReraiserThreadGroup(
-        [reraiser_thread.ReraiserThread(g),
-         reraiser_thread.ReraiserThread(f)])
-    group.StartAll()
-    with self.assertRaises(reraiser_thread.TimeoutError):
-      group.JoinAll(watchdog_timer.WatchdogTimer(0.01))
-    event.set()
-
-
-class TestRunAsync(unittest.TestCase):
-  """Tests for reraiser_thread.RunAsync."""
-
-  def testNoArgs(self):
-    results = reraiser_thread.RunAsync([])
-    self.assertEqual([], results)
-
-  def testOneArg(self):
-    results = reraiser_thread.RunAsync([lambda: 1])
-    self.assertEqual([1], results)
-
-  def testTwoArgs(self):
-    a, b = reraiser_thread.RunAsync((lambda: 1, lambda: 2))
-    self.assertEqual(1, a)
-    self.assertEqual(2, b)
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/utils/reset_usb.py b/third_party/catapult/devil/devil/utils/reset_usb.py
deleted file mode 100755
index 0335227..0000000
--- a/third_party/catapult/devil/devil/utils/reset_usb.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-import argparse
-import fcntl
-import logging
-import os
-import re
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..')))
-
-from devil.android import device_errors
-from devil.utils import lsusb
-from devil.utils import run_tests_helper
-
-logger = logging.getLogger(__name__)
-
-_INDENTATION_RE = re.compile(r'^( *)')
-_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}):')
-_LSUSB_ENTRY_RE = re.compile(r'^ *([^ ]+) +([^ ]+) *([^ ].*)?$')
-_LSUSB_GROUP_RE = re.compile(r'^ *([^ ]+.*):$')
-
-_USBDEVFS_RESET = ord('U') << 8 | 20
-
-
-def reset_usb(bus, device):
-  """Reset the USB device with the given bus and device."""
-  usb_file_path = '/dev/bus/usb/%03d/%03d' % (bus, device)
-  with open(usb_file_path, 'w') as usb_file:
-    logger.debug('fcntl.ioctl(%s, %d)', usb_file_path, _USBDEVFS_RESET)
-    fcntl.ioctl(usb_file, _USBDEVFS_RESET)
-
-
-def reset_android_usb(serial):
-  """Reset the USB device for the given Android device."""
-  lsusb_info = lsusb.lsusb()
-
-  bus = None
-  device = None
-  for device_info in lsusb_info:
-    device_serial = lsusb.get_lsusb_serial(device_info)
-    if device_serial == serial:
-      bus = int(device_info.get('bus'))
-      device = int(device_info.get('device'))
-
-  if bus and device:
-    reset_usb(bus, device)
-  else:
-    raise device_errors.DeviceUnreachableError(
-        'Unable to determine bus(%s) or device(%s) for device %s'
-         % (bus, device, serial))
-
-
-def reset_all_android_devices():
-  """Reset all USB devices that look like an Android device."""
-  _reset_all_matching(lambda i: bool(lsusb.get_lsusb_serial(i)))
-
-
-def _reset_all_matching(condition):
-  lsusb_info = lsusb.lsusb()
-  for device_info in lsusb_info:
-    if int(device_info.get('device')) != 1 and condition(device_info):
-      bus = int(device_info.get('bus'))
-      device = int(device_info.get('device'))
-      try:
-        reset_usb(bus, device)
-        serial = lsusb.get_lsusb_serial(device_info)
-        if serial:
-          logger.info(
-              'Reset USB device (bus: %03d, device: %03d, serial: %s)',
-              bus, device, serial)
-        else:
-          logger.info(
-              'Reset USB device (bus: %03d, device: %03d)',
-              bus, device)
-      except IOError:
-        logger.error(
-            'Failed to reset USB device (bus: %03d, device: %03d)',
-            bus, device)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument('-v', '--verbose', action='count')
-  parser.add_argument('-s', '--serial')
-  parser.add_argument('--bus', type=int)
-  parser.add_argument('--device', type=int)
-  args = parser.parse_args()
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  if args.serial:
-    reset_android_usb(args.serial)
-  elif args.bus and args.device:
-    reset_usb(args.bus, args.device)
-  else:
-    parser.error('Unable to determine target. '
-                 'Specify --serial or BOTH --bus and --device.')
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
-
diff --git a/third_party/catapult/devil/devil/utils/run_tests_helper.py b/third_party/catapult/devil/devil/utils/run_tests_helper.py
deleted file mode 100644
index 7df2da6..0000000
--- a/third_party/catapult/devil/devil/utils/run_tests_helper.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright (c) 2012 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.
-
-"""Helper functions common to native, java and host-driven test runners."""
-
-import logging
-import sys
-import time
-
-
-class CustomFormatter(logging.Formatter):
-  """Custom log formatter."""
-
-  # override
-  def __init__(self, fmt='%(threadName)-4s  %(message)s'):
-    # Can't use super() because in older Python versions logging.Formatter does
-    # not inherit from object.
-    logging.Formatter.__init__(self, fmt=fmt)
-    self._creation_time = time.time()
-
-  # override
-  def format(self, record):
-    # Can't use super() because in older Python versions logging.Formatter does
-    # not inherit from object.
-    msg = logging.Formatter.format(self, record)
-    if 'MainThread' in msg[:19]:
-      msg = msg.replace('MainThread', 'Main', 1)
-    timediff = time.time() - self._creation_time
-    return '%s %8.3fs %s' % (record.levelname[0], timediff, msg)
-
-
-def SetLogLevel(verbose_count):
-  """Sets log level as |verbose_count|."""
-  log_level = logging.WARNING  # Default.
-  if verbose_count == 1:
-    log_level = logging.INFO
-  elif verbose_count >= 2:
-    log_level = logging.DEBUG
-  logger = logging.getLogger()
-  logger.setLevel(log_level)
-  custom_handler = logging.StreamHandler(sys.stdout)
-  custom_handler.setFormatter(CustomFormatter())
-  logging.getLogger().addHandler(custom_handler)
diff --git a/third_party/catapult/devil/devil/utils/signal_handler.py b/third_party/catapult/devil/devil/utils/signal_handler.py
deleted file mode 100644
index 1230f8d..0000000
--- a/third_party/catapult/devil/devil/utils/signal_handler.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import signal
-
-
-@contextlib.contextmanager
-def SignalHandler(signalnum, handler):
-  """Sets the signal handler for the given signal in the wrapped context.
-
-  Args:
-    signum: The signal for which a handler should be added.
-    additional_handler: The handler to add.
-  """
-  existing_handler = signal.getsignal(signalnum)
-
-  try:
-    signal.signal(signalnum, handler)
-    yield
-  finally:
-    signal.signal(signalnum, existing_handler)
-
-
-@contextlib.contextmanager
-def AddSignalHandler(signalnum, additional_handler):
-  """Adds a signal handler for the given signal in the wrapped context.
-
-  This runs the new handler after any existing handler rather than
-  replacing the existing handler.
-
-  Args:
-    signum: The signal for which a handler should be added.
-    additional_handler: The handler to add.
-  """
-  existing_handler = signal.getsignal(signalnum)
-
-  def handler(signum, frame):
-    if callable(existing_handler):
-      existing_handler(signum, frame)
-    additional_handler(signum, frame)
-
-  try:
-    signal.signal(signalnum, handler)
-    yield
-  finally:
-    signal.signal(signalnum, existing_handler)
diff --git a/third_party/catapult/devil/devil/utils/test/data/test_serial_map.json b/third_party/catapult/devil/devil/utils/test/data/test_serial_map.json
deleted file mode 100644
index f068281..0000000
--- a/third_party/catapult/devil/devil/utils/test/data/test_serial_map.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"phone": "Phone1", "battor": "BattOr1"}, {"phone": "Phone2", "battor": "BattOr2"}, {"phone": "Phone3", "battor": "BattOr3"}]
diff --git a/third_party/catapult/devil/devil/utils/timeout_retry.py b/third_party/catapult/devil/devil/utils/timeout_retry.py
deleted file mode 100644
index d230462..0000000
--- a/third_party/catapult/devil/devil/utils/timeout_retry.py
+++ /dev/null
@@ -1,175 +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.
-
-"""A utility to run functions with timeouts and retries."""
-# pylint: disable=W0702
-
-import logging
-import threading
-import time
-
-from devil.utils import reraiser_thread
-from devil.utils import watchdog_timer
-
-logger = logging.getLogger(__name__)
-
-
-class TimeoutRetryThreadGroup(reraiser_thread.ReraiserThreadGroup):
-
-  def __init__(self, timeout, threads=None):
-    super(TimeoutRetryThreadGroup, self).__init__(threads)
-    self._watcher = watchdog_timer.WatchdogTimer(timeout)
-
-  def GetWatcher(self):
-    """Returns the watchdog keeping track of this thread's time."""
-    return self._watcher
-
-  def GetElapsedTime(self):
-    return self._watcher.GetElapsed()
-
-  def GetRemainingTime(self, required=0, msg=None):
-    """Get the remaining time before the thread times out.
-
-    Useful to send as the |timeout| parameter of async IO operations.
-
-    Args:
-      required: minimum amount of time that will be required to complete, e.g.,
-        some sleep or IO operation.
-      msg: error message to show if timing out.
-
-    Returns:
-      The number of seconds remaining before the thread times out, or None
-      if the thread never times out.
-
-    Raises:
-      reraiser_thread.TimeoutError if the remaining time is less than the
-        required time.
-    """
-    remaining = self._watcher.GetRemaining()
-    if remaining is not None and remaining < required:
-      if msg is None:
-        msg = 'Timeout expired'
-      if remaining > 0:
-        msg += (', wait of %.1f secs required but only %.1f secs left'
-                % (required, remaining))
-      raise reraiser_thread.TimeoutError(msg)
-    return remaining
-
-
-def CurrentTimeoutThreadGroup():
-  """Returns the thread group that owns or is blocked on the active thread.
-
-  Returns:
-    Returns None if no TimeoutRetryThreadGroup is tracking the current thread.
-  """
-  thread_group = reraiser_thread.CurrentThreadGroup()
-  while thread_group:
-    if isinstance(thread_group, TimeoutRetryThreadGroup):
-      return thread_group
-    thread_group = thread_group.blocked_parent_thread_group
-  return None
-
-
-def WaitFor(condition, wait_period=5, max_tries=None):
-  """Wait for a condition to become true.
-
-  Repeatedly call the function condition(), with no arguments, until it returns
-  a true value.
-
-  If called within a TimeoutRetryThreadGroup, it cooperates nicely with it.
-
-  Args:
-    condition: function with the condition to check
-    wait_period: number of seconds to wait before retrying to check the
-      condition
-    max_tries: maximum number of checks to make, the default tries forever
-      or until the TimeoutRetryThreadGroup expires.
-
-  Returns:
-    The true value returned by the condition, or None if the condition was
-    not met after max_tries.
-
-  Raises:
-    reraiser_thread.TimeoutError: if the current thread is a
-      TimeoutRetryThreadGroup and the timeout expires.
-  """
-  condition_name = condition.__name__
-  timeout_thread_group = CurrentTimeoutThreadGroup()
-  while max_tries is None or max_tries > 0:
-    result = condition()
-    if max_tries is not None:
-      max_tries -= 1
-    msg = ['condition', repr(condition_name), 'met' if result else 'not met']
-    if timeout_thread_group:
-      # pylint: disable=no-member
-      msg.append('(%.1fs)' % timeout_thread_group.GetElapsedTime())
-    logger.info(' '.join(msg))
-    if result:
-      return result
-    if timeout_thread_group:
-      # pylint: disable=no-member
-      timeout_thread_group.GetRemainingTime(wait_period,
-          msg='Timed out waiting for %r' % condition_name)
-    time.sleep(wait_period)
-  return None
-
-
-def AlwaysRetry(_exception):
-  return True
-
-
-def Run(func, timeout, retries, args=None, kwargs=None, desc=None,
-        error_log_func=logging.critical, retry_if_func=AlwaysRetry):
-  """Runs the passed function in a separate thread with timeouts and retries.
-
-  Args:
-    func: the function to be wrapped.
-    timeout: the timeout in seconds for each try.
-    retries: the number of retries.
-    args: list of positional args to pass to |func|.
-    kwargs: dictionary of keyword args to pass to |func|.
-    desc: An optional description of |func| used in logging. If omitted,
-      |func.__name__| will be used.
-    error_log_func: Logging function when logging errors.
-    retry_if_func: Unary callable that takes an exception and returns
-      whether |func| should be retried. Defaults to always retrying.
-
-  Returns:
-    The return value of func(*args, **kwargs).
-  """
-  if not args:
-    args = []
-  if not kwargs:
-    kwargs = {}
-  if not desc:
-    desc = func.__name__
-
-  num_try = 1
-  while True:
-    thread_name = 'TimeoutThread-%d-for-%s' % (num_try,
-                                               threading.current_thread().name)
-    child_thread = reraiser_thread.ReraiserThread(lambda: func(*args, **kwargs),
-                                                  name=thread_name)
-    try:
-      thread_group = TimeoutRetryThreadGroup(timeout, threads=[child_thread])
-      thread_group.StartAll(will_block=True)
-      while True:
-        thread_group.JoinAll(watcher=thread_group.GetWatcher(), timeout=60,
-                             error_log_func=error_log_func)
-        if thread_group.IsAlive():
-          logger.info('Still working on %s', desc)
-        else:
-          return thread_group.GetAllReturnValues()[0]
-    except reraiser_thread.TimeoutError as e:
-      # Timeouts already get their stacks logged.
-      if num_try > retries or not retry_if_func(e):
-        raise
-      # Do not catch KeyboardInterrupt.
-    except Exception as e:  # pylint: disable=broad-except
-      if num_try > retries or not retry_if_func(e):
-        raise
-      error_log_func(
-          '(%s) Exception on %s, attempt %d of %d: %r',
-          thread_name, desc, num_try, retries + 1, e)
-    num_try += 1
diff --git a/third_party/catapult/devil/devil/utils/timeout_retry_unittest.py b/third_party/catapult/devil/devil/utils/timeout_retry_unittest.py
deleted file mode 100755
index 0eeb31a..0000000
--- a/third_party/catapult/devil/devil/utils/timeout_retry_unittest.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/python
-# 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.
-
-"""Unittests for timeout_and_retry.py."""
-
-import logging
-import time
-import unittest
-
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-
-
-_DEFAULT_TIMEOUT = .1
-
-
-class TestException(Exception):
-  pass
-
-
-def _CountTries(tries):
-  tries[0] += 1
-  raise TestException
-
-
-class TestRun(unittest.TestCase):
-  """Tests for timeout_retry.Run."""
-
-  def testRun(self):
-    self.assertTrue(timeout_retry.Run(
-        lambda x: x, 30, 3, [True], {}))
-
-  def testTimeout(self):
-    tries = [0]
-
-    def _sleep():
-      tries[0] += 1
-      time.sleep(1)
-
-    self.assertRaises(
-        reraiser_thread.TimeoutError, timeout_retry.Run, _sleep, .01, 1,
-        error_log_func=logging.debug)
-    self.assertEqual(tries[0], 2)
-
-  def testRetries(self):
-    tries = [0]
-    self.assertRaises(
-        TestException, timeout_retry.Run, lambda: _CountTries(tries),
-        _DEFAULT_TIMEOUT, 3, error_log_func=logging.debug)
-    self.assertEqual(tries[0], 4)
-
-  def testNoRetries(self):
-    tries = [0]
-    self.assertRaises(
-        TestException, timeout_retry.Run, lambda: _CountTries(tries),
-        _DEFAULT_TIMEOUT, 0, error_log_func=logging.debug)
-    self.assertEqual(tries[0], 1)
-
-  def testReturnValue(self):
-    self.assertTrue(timeout_retry.Run(lambda: True, _DEFAULT_TIMEOUT, 3))
-
-  def testCurrentTimeoutThreadGroup(self):
-    def InnerFunc():
-      current_thread_group = timeout_retry.CurrentTimeoutThreadGroup()
-      self.assertIsNotNone(current_thread_group)
-
-      def InnerInnerFunc():
-        self.assertEqual(current_thread_group,
-                         timeout_retry.CurrentTimeoutThreadGroup())
-        return True
-      return reraiser_thread.RunAsync((InnerInnerFunc,))[0]
-
-    self.assertTrue(timeout_retry.Run(InnerFunc, _DEFAULT_TIMEOUT, 3))
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/utils/update_mapping.py b/third_party/catapult/devil/devil/utils/update_mapping.py
deleted file mode 100755
index 6666b9b..0000000
--- a/third_party/catapult/devil/devil/utils/update_mapping.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import sys
-
-from devil.utils import battor_device_mapping
-
-def parse_options():
-  """Parses and checks the command-line options.
-
-  Returns:
-    A tuple containing the options structure.
-  """
-  usage = 'Usage: ./update_mapping.py [options]'
-  desc = ('Example: ./update_mapping.py -o mapping.json.\n'
-  'This script generates and stores a file that gives the\n'
-  'mapping between phone serial numbers and BattOr serial numbers\n'
-  'Mapping is based on which physical ports on the USB hubs the\n'
-  'devices are plugged in to. For instance, if there are two hubs,\n'
-  'the phone connected to port N on the first hub is mapped to the\n'
-  'BattOr connected to port N on the second hub, for each N.')
-  parser = argparse.ArgumentParser(usage=usage, description=desc)
-  parser.add_argument('-o', '--output', dest='out_file',
-                      default='mapping.json', type=str,
-                      action='store', help='mapping file name')
-  parser.add_argument('-u', '--hub', dest='hub_types',
-                      action='append', choices=['plugable_7port',
-                                                'plugable_7port_usb3_part2',
-                                                'plugable_7port_usb3_part3'],
-                      help='USB hub types.')
-  options = parser.parse_args()
-  if not options.hub_types:
-    options.hub_types = ['plugable_7port', 'plugable_7port_usb3_part2',
-                         'plugable_7port_usb3_part3']
-  return options
-
-def main():
-  options = parse_options()
-  battor_device_mapping.GenerateSerialMapFile(options.out_file,
-                                              options.hub_types)
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/utils/usb_hubs.py b/third_party/catapult/devil/devil/utils/usb_hubs.py
deleted file mode 100644
index 1b9566a..0000000
--- a/third_party/catapult/devil/devil/utils/usb_hubs.py
+++ /dev/null
@@ -1,165 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-PLUGABLE_7PORT_LAYOUT = {1:7,
-                         2:6,
-                         3:5,
-                         4:{1:4, 2:3, 3:2, 4:1}}
-
-PLUGABLE_7PORT_USB3_LAYOUT = {1:{1:1, 2:2, 3:3, 4:4},
-                              2:5,
-                              3:6,
-                              4:7}
-
-KEEDOX_LAYOUT = {1:1,
-                 2:2,
-                 3:3,
-                 4:{1:4, 2:5, 3:6, 4:7}}
-
-class HubType(object):
-  def __init__(self, id_func, port_mapping):
-    """Defines a type of hub.
-
-    Args:
-      id_func: [USBNode -> bool] is a function that can be run on a node
-        to determine if the node represents this type of hub.
-      port_mapping: [dict(int:(int|dict))] maps virtual to physical port
-        numbers. For instance, {3:1, 1:2, 2:3} means that virtual port 3
-        corresponds to physical port 1, virtual port 1 corresponds to physical
-        port 2, and virtual port 2 corresponds to physical port 3. In the
-        case of hubs with "internal" topology, this is represented by nested
-        maps. For instance, {1:{1:1,2:2},2:{1:3,2:4}} means, e.g. that the
-        device plugged into physical port 3 will show up as being connected
-        to port 1, on a device which is connected to port 2 on the hub.
-    """
-    self._id_func = id_func
-    # v2p = "virtual to physical" ports
-    self._v2p_port = port_mapping
-
-  def IsType(self, node):
-    """Determines if the given Node is a hub of this type.
-
-    Args:
-      node: [USBNode] Node to check.
-    """
-    return self._id_func(node)
-
-  def GetPhysicalPortToNodeTuples(self, node):
-    """Gets devices connected to the physical ports on a hub of this type.
-
-    Args:
-      node: [USBNode] Node representing a hub of this type.
-
-    Yields:
-      A series of (int, USBNode) tuples giving a physical port
-      and the USBNode connected to it.
-
-    Raises:
-      ValueError: If the given node isn't a hub of this type.
-    """
-    if self.IsType(node):
-      for res in self._GppHelper(node, self._v2p_port):
-        yield res
-    else:
-      raise ValueError('Node must be a hub of this type')
-
-  def _GppHelper(self, node, mapping):
-    """Helper function for GetPhysicalPortToNodeMap.
-
-    Gets devices connected to physical ports, based on device tree
-    rooted at the given node and the mapping between virtual and physical
-    ports.
-
-    Args:
-      node: [USBNode] Root of tree to search for devices.
-      mapping: [dict] Mapping between virtual and physical ports.
-
-    Yields:
-      A series of (int, USBNode) tuples giving a physical port
-      and the Node connected to it.
-    """
-    for (virtual, physical) in mapping.iteritems():
-      if node.HasPort(virtual):
-        if isinstance(physical, dict):
-          for res in self._GppHelper(node.PortToDevice(virtual), physical):
-            yield res
-        else:
-          yield (physical, node.PortToDevice(virtual))
-
-def _is_plugable_7port_hub(node):
-  """Check if a node is a Plugable 7-Port Hub
-  (Model USB2-HUB7BC)
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 4.
-  """
-  if '1a40:0101' not in node.desc:
-    return False
-  if not node.HasPort(4):
-    return False
-  return '1a40:0101' in node.PortToDevice(4).desc
-
-# Plugable 7-Port USB-3 Hubs show up twice in the USB devices list; they have
-# two different "branches", one which has USB2 devices and one which has
-# USB3 devices. The "part2" is the "USB-2" branch of the hub, the
-# "part3" is the "USB-3" branch of the hub.
-
-def _is_plugable_7port_usb3_part2_hub(node):
-  """Check if a node is the "USB2 branch" of
-  a Plugable 7-Port USB-3 Hub (Model USB3-HUB7BC)
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 1.
-  """
-  if '2109:2811' not in node.desc:
-    return False
-  if not node.HasPort(1):
-    return False
-  return '2109:2811' in node.PortToDevice(1).desc
-
-def _is_plugable_7port_usb3_part3_hub(node):
-  """Check if a node is the "USB3 branch" of
-  a Plugable 7-Port USB-3 Hub (Model USB3-HUB7BC)
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 1.
-  """
-  if '2109:8110' not in node.desc:
-    return False
-  if not node.HasPort(1):
-    return False
-  return '2109:8110' in node.PortToDevice(1).desc
-
-def _is_keedox_hub(node):
-  """Check if a node is a Keedox hub.
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 4.
-  """
-  if '0bda:5411' not in node.desc:
-    return False
-  if not node.HasPort(4):
-    return False
-  return '0bda:5411' in node.PortToDevice(4).desc
-
-
-PLUGABLE_7PORT = HubType(_is_plugable_7port_hub, PLUGABLE_7PORT_LAYOUT)
-PLUGABLE_7PORT_USB3_PART2 = HubType(_is_plugable_7port_usb3_part2_hub,
-                                    PLUGABLE_7PORT_USB3_LAYOUT)
-PLUGABLE_7PORT_USB3_PART3 = HubType(_is_plugable_7port_usb3_part3_hub,
-                                    PLUGABLE_7PORT_USB3_LAYOUT)
-KEEDOX = HubType(_is_keedox_hub, KEEDOX_LAYOUT)
-
-ALL_HUBS = [PLUGABLE_7PORT,
-            PLUGABLE_7PORT_USB3_PART2,
-            PLUGABLE_7PORT_USB3_PART3,
-            KEEDOX]
-
-def GetHubType(type_name):
-  if type_name == 'plugable_7port':
-    return PLUGABLE_7PORT
-  if type_name == 'plugable_7port_usb3_part2':
-    return PLUGABLE_7PORT_USB3_PART2
-  if type_name == 'plugable_7port_usb3_part3':
-    return PLUGABLE_7PORT_USB3_PART3
-  if type_name == 'keedox':
-    return KEEDOX
-  else:
-    raise ValueError('Invalid hub type')
diff --git a/third_party/catapult/devil/devil/utils/watchdog_timer.py b/third_party/catapult/devil/devil/utils/watchdog_timer.py
deleted file mode 100644
index 2f4c464..0000000
--- a/third_party/catapult/devil/devil/utils/watchdog_timer.py
+++ /dev/null
@@ -1,47 +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.
-
-"""WatchdogTimer timeout objects."""
-
-import time
-
-
-class WatchdogTimer(object):
-  """A resetable timeout-based watchdog.
-
-  This object is threadsafe.
-  """
-
-  def __init__(self, timeout):
-    """Initializes the watchdog.
-
-    Args:
-      timeout: The timeout in seconds. If timeout is None it will never timeout.
-    """
-    self._start_time = time.time()
-    self._timeout = timeout
-
-  def Reset(self):
-    """Resets the timeout countdown."""
-    self._start_time = time.time()
-
-  def GetElapsed(self):
-    """Returns the elapsed time of the watchdog."""
-    return time.time() - self._start_time
-
-  def GetRemaining(self):
-    """Returns the remaining time of the watchdog."""
-    if self._timeout:
-      return self._timeout - self.GetElapsed()
-    else:
-      return None
-
-  def IsTimedOut(self):
-    """Whether the watchdog has timed out.
-
-    Returns:
-      True if the watchdog has timed out, False otherwise.
-    """
-    remaining = self.GetRemaining()
-    return remaining is not None and remaining < 0
diff --git a/third_party/catapult/devil/devil/utils/zip_utils.py b/third_party/catapult/devil/devil/utils/zip_utils.py
deleted file mode 100644
index eaa6a2d..0000000
--- a/third_party/catapult/devil/devil/utils/zip_utils.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2015 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.
-
-import logging
-import os
-import zipfile
-
-logger = logging.getLogger(__name__)
-
-
-def WriteToZipFile(zip_file, path, arc_path):
-  """Recursively write |path| to |zip_file| as |arc_path|.
-
-  zip_file: An open instance of zipfile.ZipFile.
-  path: An absolute path to the file or directory to be zipped.
-  arc_path: A relative path within the zip file to which the file or directory
-    located at |path| should be written.
-  """
-  if os.path.isdir(path):
-    for dir_path, _, file_names in os.walk(path):
-      dir_arc_path = os.path.join(arc_path, os.path.relpath(dir_path, path))
-      logger.debug('dir:  %s -> %s', dir_path, dir_arc_path)
-      zip_file.write(dir_path, dir_arc_path, zipfile.ZIP_STORED)
-      for f in file_names:
-        file_path = os.path.join(dir_path, f)
-        file_arc_path = os.path.join(dir_arc_path, f)
-        logger.debug('file: %s -> %s', file_path, file_arc_path)
-        zip_file.write(file_path, file_arc_path, zipfile.ZIP_DEFLATED)
-  else:
-    logger.debug('file: %s -> %s', path, arc_path)
-    zip_file.write(path, arc_path, zipfile.ZIP_DEFLATED)
-
diff --git a/third_party/catapult/devil/docs/adb_wrapper.md b/third_party/catapult/devil/docs/adb_wrapper.md
deleted file mode 100644
index a8dc3b0..0000000
--- a/third_party/catapult/devil/docs/adb_wrapper.md
+++ /dev/null
@@ -1,388 +0,0 @@
-# [devil.android.sdk.adb_wrapper](https://github.com/catapult-project/catapult/blob/master/devil/devil/android/sdk/adb_wrapper.py)
-
-*This page was autogenerated by `devil/utils/markdown.py --module-link https://github.com/catapult-project/catapult/blob/master/devil/devil/android/sdk/adb_wrapper.py`*
-
-## DeviceStat
-
-DeviceStat(st\_mode, st\_size, st\_time)
-### DeviceStat.\_\_repr\_\_
-
-Return a nicely formatted representation string
-### DeviceStat.\_\_getnewargs\_\_
-
-Return self as a plain tuple.  Used by copy and pickle.
-### DeviceStat.\_\_getstate\_\_
-
-Exclude the OrderedDict from pickling
-## AdbWrapper
-
-A wrapper around a local Android Debug Bridge executable.
-### AdbWrapper.GetDeviceSerial
-
-Gets the device serial number associated with this object.
-```
-    Returns:
-      Device serial number as a string.
-```
-
-
-### AdbWrapper.Push
-
-Pushes a file from the host to the device.
-```
-    Args:
-      local: Path on the host filesystem.
-      remote: Path on the device filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Pull
-
-Pulls a file from the device to the host.
-```
-    Args:
-      remote: Path on the device filesystem.
-      local: Path on the host filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Shell
-
-Runs a shell command on the device.
-```
-    Args:
-      command: A string with the shell command to run.
-      expect_status: (optional) Check that the command's exit status matches
-        this value. Default is 0. If set to None the test is skipped.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The output of the shell command as a string.
-
-    Raises:
-      device_errors.AdbCommandFailedError: If the exit status doesn't match
-        |expect_status|.
-```
-
-
-### AdbWrapper.IterShell
-
-Runs a shell command and returns an iterator over its output lines.
-```
-    Args:
-      command: A string with the shell command to run.
-      timeout: Timeout in seconds.
-
-    Yields:
-      The output of the command line by line.
-```
-
-
-### AdbWrapper.Ls
-
-List the contents of a directory on the device.
-```
-    Args:
-      path: Path on the device filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      A list of pairs (filename, stat) for each file found in the directory,
-      where the stat object has the properties: st_mode, st_size, and st_time.
-
-    Raises:
-      AdbCommandFailedError if |path| does not specify a valid and accessible
-          directory in the device, or the output of "adb ls" command is less
-          than four columns
-```
-
-
-### AdbWrapper.Logcat
-
-Get an iterable over the logcat output.
-```
-    Args:
-      clear: If true, clear the logcat.
-      dump: If true, dump the current logcat contents.
-      filter_specs: If set, a list of specs to filter the logcat.
-      logcat_format: If set, the format in which the logcat should be output.
-        Options include "brief", "process", "tag", "thread", "raw", "time",
-        "threadtime", and "long"
-      ring_buffer: If set, a list of alternate ring buffers to request.
-        Options include "main", "system", "radio", "events", "crash" or "all".
-        The default is equivalent to ["main", "system", "crash"].
-      iter_timeout: If set and neither clear nor dump is set, the number of
-        seconds to wait between iterations. If no line is found before the
-        given number of seconds elapses, the iterable will yield None.
-      timeout: (optional) If set, timeout per try in seconds. If clear or dump
-        is set, defaults to DEFAULT_TIMEOUT.
-      retries: (optional) If clear or dump is set, the number of retries to
-        attempt. Otherwise, does nothing.
-
-    Yields:
-      logcat output line by line.
-```
-
-
-### AdbWrapper.Forward
-
-Forward socket connections from the local socket to the remote socket.
-```
-    Sockets are specified by one of:
-      tcp:<port>
-      localabstract:<unix domain socket name>
-      localreserved:<unix domain socket name>
-      localfilesystem:<unix domain socket name>
-      dev:<character device name>
-      jdwp:<process pid> (remote only)
-
-    Args:
-      local: The host socket.
-      remote: The device socket.
-      allow_rebind: A boolean indicating whether adb may rebind a local socket;
-        otherwise, the default, an exception is raised if the local socket is
-        already being forwarded.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.ForwardRemove
-
-Remove a forward socket connection.
-```
-    Args:
-      local: The host socket.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.ForwardList
-
-List all currently forwarded socket connections.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    Returns:
-      The output of adb forward --list as a string.
-```
-
-
-### AdbWrapper.JDWP
-
-List of PIDs of processes hosting a JDWP transport.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      A list of PIDs as strings.
-```
-
-
-### AdbWrapper.Install
-
-Install an apk on the device.
-```
-    Args:
-      apk_path: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      allow_downgrade: (optional) If set, allows for downgrades.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.InstallMultiple
-
-Install an apk with splits on the device.
-```
-    Args:
-      apk_paths: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-      allow_downgrade: (optional) Allow versionCode downgrade.
-      partial: (optional) Package ID if apk_paths doesn't include all .apks.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Uninstall
-
-Remove the app |package| from the device.
-```
-    Args:
-      package: The package to uninstall.
-      keep_data: (optional) If set keep the data and cache directories.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Backup
-
-Write an archive of the device's data to |path|.
-```
-    Args:
-      path: Local path to store the backup file.
-      packages: List of to packages to be backed up.
-      apk: (optional) If set include the .apk files in the archive.
-      shared: (optional) If set buckup the device's SD card.
-      nosystem: (optional) If set exclude system applications.
-      include_all: (optional) If set back up all installed applications and
-        |packages| is optional.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Restore
-
-Restore device contents from the backup archive.
-```
-    Args:
-      path: Host path to the backup archive.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.WaitForDevice
-
-Block until the device is online.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.GetState
-
-Get device state.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      One of 'offline', 'bootloader', or 'device'.
-```
-
-
-### AdbWrapper.GetDevPath
-
-Gets the device path.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The device path (e.g. usb:3-4)
-```
-
-
-### AdbWrapper.Remount
-
-Remounts the /system partition on the device read-write.
-### AdbWrapper.Reboot
-
-Reboots the device.
-```
-    Args:
-      to_bootloader: (optional) If set reboots to the bootloader.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Root
-
-Restarts the adbd daemon with root permissions, if possible.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Emu
-
-Runs an emulator console command.
-```
-    See http://developer.android.com/tools/devices/emulator.html#console
-
-    Args:
-      cmd: The command to run on the emulator console.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The output of the emulator console command.
-```
-
-
-### AdbWrapper.DisableVerity
-
-Disable Marshmallow's Verity security feature
-### AdbWrapper.EnableVerity
-
-Enable Marshmallow's Verity security feature
-### AdbWrapper.\_\_init\_\_
-
-Initializes the AdbWrapper.
-```
-    Args:
-      device_serial: The device serial number as a string.
-```
-
-
-### AdbWrapper.\_\_eq\_\_
-
-Consider instances equal if they refer to the same device.
-```
-    Args:
-      other: The instance to compare equality with.
-
-    Returns:
-      True if the instances are considered equal, false otherwise.
-```
-
-
-### AdbWrapper.\_\_str\_\_
-
-The string representation of an instance.
-```
-    Returns:
-      The device serial number as a string.
-```
-
-
-### AdbWrapper.\_\_repr\_\_
-
-### VerifyLocalFileExists
-
-Verifies a local file exists.
-```
-  Args:
-    path: Path to the local file.
-
-  Raises:
-    IOError: If the file doesn't exist.
-```
-
-
diff --git a/third_party/catapult/devil/docs/device_blacklist.md b/third_party/catapult/devil/docs/device_blacklist.md
deleted file mode 100644
index c6eed51..0000000
--- a/third_party/catapult/devil/docs/device_blacklist.md
+++ /dev/null
@@ -1,59 +0,0 @@
-<!-- Copyright 2016 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
--->
-
-# Devil: Device Blacklist
-
-## What is it?
-
-The device blacklist is a per-run list of devices detected to be in a known bad
-state along with the reason they are suspected of being in a bad state (offline,
-not responding, etc). It is stored as a json file. This gets reset every run
-during the device recovery step (currently part of `bb_device_status_check`).
-
-## Bots
-
-On bots, this is normally found at `//out/bad_devices.json`. If you are having
-problems with blacklisted devices locally even though a device is in a good
-state, you can safely delete this file.
-
-# Tools for interacting with device black list.
-
-You can interact with the device blacklist via [devil.android.device\_blacklist](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/device_blacklist.py).
-This allows for any interaction you would need with a device blacklist:
-
-  - Reading
-  - Writing
-  - Extending
-  - Resetting
-
-An example usecase of this is:
-```python
-from devil.android import device_blacklist
-
-blacklist = device_blacklist.Blacklist(blacklist_path)
-blacklisted_devices = blacklist.Read()
-for device in blacklisted_devices:
-  print 'Device %s is blacklisted' % device
-blacklist.Reset()
-new_blacklist = {'device_id1': {'timestamp': ts, 'reason': reason}}
-blacklist.Write(new_blacklist)
-blacklist.Extend([device_2, device_3], reason='Reason for blacklisting')
-```
-
-
-## Where it is used.
-
-The blacklist file path is passed directly to the following scripts in chromium:
-
-  - [test\_runner.py](https://cs.chromium.org/chromium/src/build/android/test_runner.py)
-  - [provision\_devices.py](https://cs.chromium.org/chromium/src/build/android/provision_devices.py)
-  - [bb\_device\_status\_check.py](https://cs.chromium.org/chromium/src/build/android/buildbot/bb_device_status_check.py)
-
-The blacklist is also used in the following scripts:
-
-  - [device\_status.py](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/tools/device_status.py)
-  - [device\_recovery.py](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/tools/device_recovery.py)
-
-
diff --git a/third_party/catapult/devil/docs/device_utils.md b/third_party/catapult/devil/docs/device_utils.md
deleted file mode 100644
index b281b26..0000000
--- a/third_party/catapult/devil/docs/device_utils.md
+++ /dev/null
@@ -1,1041 +0,0 @@
-# [devil.android.device_utils](https://github.com/catapult-project/catapult/blob/master/devil/devil/android/device_utils.py)
-
-*This page was autogenerated by `devil/utils/markdown.py --module-link https://github.com/catapult-project/catapult/blob/master/devil/devil/android/device_utils.py`*
-
-## DeviceUtils
-
-### DeviceUtils.\_\_init\_\_
-
-DeviceUtils constructor.
-```
-    Args:
-      device: Either a device serial, an existing AdbWrapper instance, or an
-        an existing AndroidCommands instance.
-      enable_device_files_cache: For PushChangedFiles(), cache checksums of
-        pushed files rather than recomputing them on a subsequent call.
-      default_timeout: An integer containing the default number of seconds to
-        wait for an operation to complete if no explicit value is provided.
-      default_retries: An integer containing the default number or times an
-        operation should be retried on failure if no explicit value is provided.
-```
-
-
-### DeviceUtils.\_\_eq\_\_
-
-Checks whether |other| refers to the same device as |self|.
-```
-    Args:
-      other: The object to compare to. This can be a basestring, an instance
-        of adb_wrapper.AdbWrapper, or an instance of DeviceUtils.
-    Returns:
-      Whether |other| refers to the same device as |self|.
-```
-
-
-### DeviceUtils.\_\_lt\_\_
-
-Compares two instances of DeviceUtils.
-```
-    This merely compares their serial numbers.
-
-    Args:
-      other: The instance of DeviceUtils to compare to.
-    Returns:
-      Whether |self| is less than |other|.
-```
-
-
-### DeviceUtils.\_\_str\_\_
-
-Returns the device serial.
-### DeviceUtils.NeedsSU
-
-Checks whether 'su' is needed to access protected resources.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if 'su' is available on the device and is needed to to access
-        protected resources; False otherwise if either 'su' is not available
-        (e.g. because the device has a user build), or not needed (because adbd
-        already has root privileges).
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.IsOnline
-
-Checks whether the device is online.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device is online, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.HasRoot
-
-Checks whether or not adbd has root privileges.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if adbd has root privileges, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.EnableRoot
-
-Restarts adbd with root privileges.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if root could not be enabled.
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.IsUserBuild
-
-Checks whether or not the device is running a user build.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device is running a user build, False otherwise (i.e. if
-        it's running a userdebug build).
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetExternalStoragePath
-
-Get the device's path to its SD card.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's path to its SD card.
-
-    Raises:
-      CommandFailedError if the external storage path could not be determined.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetApplicationPaths
-
-Get the paths of the installed apks on the device for the given package.
-```
-    Args:
-      package: Name of the package.
-
-    Returns:
-      List of paths to the apks on the device for the given package.
-```
-
-
-### DeviceUtils.GetApplicationVersion
-
-Get the version name of a package installed on the device.
-```
-    Args:
-      package: Name of the package.
-
-    Returns:
-      A string with the version name or None if the package is not found
-      on the device.
-```
-
-
-### DeviceUtils.GetApplicationDataDirectory
-
-Get the data directory on the device for the given package.
-```
-    Args:
-      package: Name of the package.
-
-    Returns:
-      The package's data directory.
-    Raises:
-      CommandFailedError if the package's data directory can't be found,
-        whether because it's not installed or otherwise.
-```
-
-
-### DeviceUtils.WaitUntilFullyBooted
-
-Wait for the device to fully boot.
-```
-    This means waiting for the device to boot, the package manager to be
-    available, and the SD card to be ready. It can optionally mean waiting
-    for wifi to come up, too.
-
-    Args:
-      wifi: A boolean indicating if we should wait for wifi to come up or not.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError if one of the component waits times out.
-      DeviceUnreachableError if the device becomes unresponsive.
-```
-
-
-### DeviceUtils.Reboot
-
-Reboot the device.
-```
-    Args:
-      block: A boolean indicating if we should wait for the reboot to complete.
-      wifi: A boolean indicating if we should wait for wifi to be enabled after
-        the reboot. The option has no effect unless |block| is also True.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.Install
-
-Install an APK.
-```
-    Noop if an identical APK is already installed.
-
-    Args:
-      apk: An ApkHelper instance or string containing the path to the APK.
-      allow_downgrade: A boolean indicating if we should allow downgrades.
-      reinstall: A boolean indicating if we should keep any existing app data.
-      permissions: Set of permissions to set. If not set, finds permissions with
-          apk helper. To set no permissions, pass [].
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the installation fails.
-      CommandTimeoutError if the installation times out.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.InstallSplitApk
-
-Install a split APK.
-```
-    Noop if all of the APK splits are already installed.
-
-    Args:
-      base_apk: An ApkHelper instance or string containing the path to the base
-          APK.
-      split_apks: A list of strings of paths of all of the APK splits.
-      allow_downgrade: A boolean indicating if we should allow downgrades.
-      reinstall: A boolean indicating if we should keep any existing app data.
-      allow_cached_props: Whether to use cached values for device properties.
-      permissions: Set of permissions to set. If not set, finds permissions with
-          apk helper. To set no permissions, pass [].
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the installation fails.
-      CommandTimeoutError if the installation times out.
-      DeviceUnreachableError on missing device.
-      DeviceVersionError if device SDK is less than Android L.
-```
-
-
-### DeviceUtils.Uninstall
-
-Remove the app |package\_name| from the device.
-```
-    This is a no-op if the app is not already installed.
-
-    Args:
-      package_name: The package to uninstall.
-      keep_data: (optional) Whether to keep the data and cache directories.
-      timeout: Timeout in seconds.
-      retries: Number of retries.
-
-    Raises:
-      CommandFailedError if the uninstallation fails.
-      CommandTimeoutError if the uninstallation times out.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.RunShellCommand
-
-Run an ADB shell command.
-```
-    The command to run |cmd| should be a sequence of program arguments or else
-    a single string.
-
-    When |cmd| is a sequence, it is assumed to contain the name of the command
-    to run followed by its arguments. In this case, arguments are passed to the
-    command exactly as given, without any further processing by the shell. This
-    allows to easily pass arguments containing spaces or special characters
-    without having to worry about getting quoting right. Whenever possible, it
-    is recomended to pass |cmd| as a sequence.
-
-    When |cmd| is given as a string, it will be interpreted and run by the
-    shell on the device.
-
-    This behaviour is consistent with that of command runners in cmd_helper as
-    well as Python's own subprocess.Popen.
-
-    TODO(perezju) Change the default of |check_return| to True when callers
-      have switched to the new behaviour.
-
-    Args:
-      cmd: A string with the full command to run on the device, or a sequence
-        containing the command and its arguments.
-      check_return: A boolean indicating whether or not the return code should
-        be checked.
-      cwd: The device directory in which the command should be run.
-      env: The environment variables with which the command should be run.
-      run_as: A string containing the package as which the command should be
-        run.
-      as_root: A boolean indicating whether the shell command should be run
-        with root privileges.
-      single_line: A boolean indicating if only a single line of output is
-        expected.
-      large_output: Uses a work-around for large shell command output. Without
-        this large output will be truncated.
-      raw_output: Whether to only return the raw output
-          (no splitting into lines).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      If single_line is False, the output of the command as a list of lines,
-      otherwise, a string with the unique line of output emmited by the command
-      (with the optional newline at the end stripped).
-
-    Raises:
-      AdbCommandFailedError if check_return is True and the exit code of
-        the command run on the device is non-zero.
-      CommandFailedError if single_line is True but the output contains two or
-        more lines.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.KillAll
-
-Kill all processes with the given name on the device.
-```
-    Args:
-      process_name: A string containing the name of the process to kill.
-      exact: A boolean indicating whether to kill all processes matching
-             the string |process_name| exactly, or all of those which contain
-             |process_name| as a substring. Defaults to False.
-      signum: An integer containing the signal number to send to kill. Defaults
-              to SIGKILL (9).
-      as_root: A boolean indicating whether the kill should be executed with
-               root privileges.
-      blocking: A boolean indicating whether we should wait until all processes
-                with the given |process_name| are dead.
-      quiet: A boolean indicating whether to ignore the fact that no processes
-             to kill were found.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The number of processes attempted to kill.
-
-    Raises:
-      CommandFailedError if no process was killed and |quiet| is False.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.StartActivity
-
-Start package's activity on the device.
-```
-    Args:
-      intent_obj: An Intent object to send.
-      blocking: A boolean indicating whether we should wait for the activity to
-                finish launching.
-      trace_file_name: If present, a string that both indicates that we want to
-                       profile the activity and contains the path to which the
-                       trace should be saved.
-      force_stop: A boolean indicating whether we should stop the activity
-                  before starting it.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the activity could not be started.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.StartInstrumentation
-
-### DeviceUtils.BroadcastIntent
-
-Send a broadcast intent.
-```
-    Args:
-      intent: An Intent to broadcast.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GoHome
-
-Return to the home screen and obtain launcher focus.
-```
-    This command launches the home screen and attempts to obtain
-    launcher focus until the timeout is reached.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.ForceStop
-
-Close the application.
-```
-    Args:
-      package: A string containing the name of the package to stop.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.ClearApplicationState
-
-Clear all state for the given package.
-```
-    Args:
-      package: A string containing the name of the package to stop.
-      permissions: List of permissions to set after clearing data.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.SendKeyEvent
-
-Sends a keycode to the device.
-```
-    See the devil.android.sdk.keyevent module for suitable keycode values.
-
-    Args:
-      keycode: A integer keycode to send to the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.PushChangedFiles
-
-Push files to the device, skipping files that don't need updating.
-```
-    When a directory is pushed, it is traversed recursively on the host and
-    all files in it are pushed to the device as needed.
-    Additionally, if delete_device_stale option is True,
-    files that exist on the device but don't exist on the host are deleted.
-
-    Args:
-      host_device_tuples: A list of (host_path, device_path) tuples, where
-        |host_path| is an absolute path of a file or directory on the host
-        that should be minimially pushed to the device, and |device_path| is
-        an absolute path of the destination on the device.
-      timeout: timeout in seconds
-      retries: number of retries
-      delete_device_stale: option to delete stale files on device
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.FileExists
-
-Checks whether the given file exists on the device.
-```
-    Arguments are the same as PathExists.
-```
-
-
-### DeviceUtils.PathExists
-
-Checks whether the given path(s) exists on the device.
-```
-    Args:
-      device_path: A string containing the absolute path to the file on the
-                   device, or an iterable of paths to check.
-      as_root: Whether root permissions should be use to check for the existence
-               of the given path(s).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the all given paths exist on the device, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.RemovePath
-
-Removes the given path(s) from the device.
-```
-    Args:
-      device_path: A string containing the absolute path to the file on the
-                   device, or an iterable of paths to check.
-      force: Whether to remove the path(s) with force (-f).
-      recursive: Whether to remove any directories in the path(s) recursively.
-      as_root: Whether root permissions should be use to remove the given
-               path(s).
-      timeout: timeout in seconds
-      retries: number of retries
-```
-
-
-### DeviceUtils.PullFile
-
-Pull a file from the device.
-```
-    Args:
-      device_path: A string containing the absolute path of the file to pull
-                   from the device.
-      host_path: A string containing the absolute path of the destination on
-                 the host.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.ReadFile
-
-Reads the contents of a file from the device.
-```
-    Args:
-      device_path: A string containing the absolute path of the file to read
-                   from the device.
-      as_root: A boolean indicating whether the read should be executed with
-               root privileges.
-      force_pull: A boolean indicating whether to force the operation to be
-          performed by pulling a file from the device. The default is, when the
-          contents are short, to retrieve the contents using cat instead.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The contents of |device_path| as a string. Contents are intepreted using
-      universal newlines, so the caller will see them encoded as '
-'. Also,
-      all lines will be terminated.
-
-    Raises:
-      AdbCommandFailedError if the file can't be read.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.WriteFile
-
-Writes |contents| to a file on the device.
-```
-    Args:
-      device_path: A string containing the absolute path to the file to write
-          on the device.
-      contents: A string containing the data to write to the device.
-      as_root: A boolean indicating whether the write should be executed with
-          root privileges (if available).
-      force_push: A boolean indicating whether to force the operation to be
-          performed by pushing a file to the device. The default is, when the
-          contents are short, to pass the contents using a shell script instead.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the file could not be written on the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.ListDirectory
-
-List all files on a device directory.
-```
-    Mirroring os.listdir (and most client expectations) the resulting list
-    does not include the special entries '.' and '..' even if they are present
-    in the directory.
-
-    Args:
-      device_path: A string containing the path of the directory on the device
-                   to list.
-      as_root: A boolean indicating whether the to use root privileges to list
-               the directory contents.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of filenames for all entries contained in the directory.
-
-    Raises:
-      AdbCommandFailedError if |device_path| does not specify a valid and
-          accessible directory in the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.StatDirectory
-
-List file and stat info for all entries on a device directory.
-```
-    Implementation notes: this is currently implemented by parsing the output
-    of 'ls -a -l' on the device. Whether possible and convenient, we attempt to
-    make parsing strict and return values mirroring those of the standard |os|
-    and |stat| Python modules.
-
-    Mirroring os.listdir (and most client expectations) the resulting list
-    does not include the special entries '.' and '..' even if they are present
-    in the directory.
-
-    Args:
-      device_path: A string containing the path of the directory on the device
-                   to list.
-      as_root: A boolean indicating whether the to use root privileges to list
-               the directory contents.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of dictionaries, each containing the following keys:
-        filename: A string with the file name.
-        st_mode: File permissions, use the stat module to interpret these.
-        st_nlink: Number of hard links (may be missing).
-        st_owner: A string with the user name of the owner.
-        st_group: A string with the group name of the owner.
-        st_rdev_pair: Device type as (major, minior) (only if inode device).
-        st_size: Size of file, in bytes (may be missing for non-regular files).
-        st_mtime: Time of most recent modification, in seconds since epoch
-          (although resolution is in minutes).
-        symbolic_link_to: If entry is a symbolic link, path where it points to;
-          missing otherwise.
-
-    Raises:
-      AdbCommandFailedError if |device_path| does not specify a valid and
-          accessible directory in the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.StatPath
-
-Get the stat attributes of a file or directory on the device.
-```
-    Args:
-      device_path: A string containing the path of a file or directory from
-                   which to get attributes.
-      as_root: A boolean indicating whether the to use root privileges to
-               access the file information.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dictionary with the stat info collected; see StatDirectory for details.
-
-    Raises:
-      CommandFailedError if device_path cannot be found on the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.FileSize
-
-Get the size of a file on the device.
-```
-    Note: This is implemented by parsing the output of the 'ls' command on
-    the device. On some Android versions, when passing a directory or special
-    file, the size is *not* reported and this function will throw an exception.
-
-    Args:
-      device_path: A string containing the path of a file on the device.
-      as_root: A boolean indicating whether the to use root privileges to
-               access the file information.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The size of the file in bytes.
-
-    Raises:
-      CommandFailedError if device_path cannot be found on the device, or
-        its size cannot be determited for some reason.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetLanguage
-
-Returns the language setting on the device.
-```
-    Args:
-      cache: Whether to use cached properties when available.
-```
-
-
-### DeviceUtils.SetJavaAsserts
-
-Enables or disables Java asserts.
-```
-    Args:
-      enabled: A boolean indicating whether Java asserts should be enabled
-               or disabled.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device-side property changed and a restart is required as a
-      result, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.GetCountry
-
-Returns the country setting on the device.
-```
-    Args:
-      cache: Whether to use cached properties when available.
-```
-
-
-### DeviceUtils.GetProp
-
-Gets a property from the device.
-```
-    Args:
-      property_name: A string containing the name of the property to get from
-                     the device.
-      cache: Whether to use cached properties when available.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The value of the device's |property_name| property.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.SetProp
-
-Sets a property on the device.
-```
-    Args:
-      property_name: A string containing the name of the property to set on
-                     the device.
-      value: A string containing the value to set to the property on the
-             device.
-      check: A boolean indicating whether to check that the property was
-             successfully set on the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if check is true and the property was not correctly
-        set on the device (e.g. because it is not rooted).
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.GetABI
-
-Gets the device main ABI.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's main ABI name.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.GetPids
-
-Returns the PIDs of processes with the given name.
-```
-    Note that the |process_name| is often the package name.
-
-    Args:
-      process_name: A string containing the process name to get the PIDs for.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dict mapping process name to a list of PIDs for each process that
-      contained the provided |process_name|.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetEnforce
-
-Get the current mode of SELinux.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True (enforcing), False (permissive), or None (disabled).
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.SetEnforce
-
-Modify the mode SELinux is running in.
-```
-    Args:
-      enabled: a boolean indicating whether to put SELinux in encorcing mode
-               (if True), or permissive mode (otherwise).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.TakeScreenshot
-
-Takes a screenshot of the device.
-```
-    Args:
-      host_path: A string containing the path on the host to save the
-                 screenshot to. If None, a file name in the current
-                 directory will be generated.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The name of the file on the host to which the screenshot was saved.
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetMemoryUsageForPid
-
-Gets the memory usage for the given PID.
-```
-    Args:
-      pid: PID of the process.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dict containing memory usage statistics for the PID. May include:
-        Size, Rss, Pss, Shared_Clean, Shared_Dirty, Private_Clean,
-        Private_Dirty, VmHWM
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.DismissCrashDialogIfNeeded
-
-Dismiss the error/ANR dialog if present.
-```
-    Returns: Name of the crashed package if a dialog is focused,
-             None otherwise.
-```
-
-
-### DeviceUtils.GetLogcatMonitor
-
-Returns a new LogcatMonitor associated with this device.
-```
-    Parameters passed to this function are passed directly to
-    |logcat_monitor.LogcatMonitor| and are documented there.
-```
-
-
-### DeviceUtils.GetClientCache
-
-Returns client cache.
-### DeviceUtils.LoadCacheData
-
-Initializes the cache from data created using DumpCacheData.
-```
-    The cache is used only if its token matches the one found on the device.
-    This prevents a stale cache from being used (which can happen when sharing
-    devices).
-
-    Args:
-      data: A previously serialized cache (string).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      Whether the cache was loaded.
-```
-
-
-### DeviceUtils.DumpCacheData
-
-Dumps the current cache state to a string.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A serialized cache as a string.
-```
-
-
-### DeviceUtils.RestartAdbd
-
-### DeviceUtils.GrantPermissions
-
-### DeviceUtils.IsScreenOn
-
-Determines if screen is on.
-```
-    Dumpsys input_method exposes screen on/off state. Below is an explination of
-    the states.
-
-    Pre-L:
-      On: mScreenOn=true
-      Off: mScreenOn=false
-    L+:
-      On: mInteractive=true
-      Off: mInteractive=false
-
-    Returns:
-      True if screen is on, false if it is off.
-
-    Raises:
-      device_errors.CommandFailedError: If screen state cannot be found.
-```
-
-
-### DeviceUtils.SetScreen
-
-Turns screen on and off.
-```
-    Args:
-      on: bool to decide state to switch to. True = on False = off.
-```
-
-
-### GetAVDs
-
-Returns a list of Android Virtual Devices.
-```
-  Returns:
-    A list containing the configured AVDs.
-```
-
-
-### RestartServer
-
-Restarts the adb server.
-```
-  Raises:
-    CommandFailedError if we fail to kill or restart the server.
-```
-
-
diff --git a/third_party/catapult/devil/docs/markdown.md b/third_party/catapult/devil/docs/markdown.md
deleted file mode 100644
index 957dba7..0000000
--- a/third_party/catapult/devil/docs/markdown.md
+++ /dev/null
@@ -1,139 +0,0 @@
-# [devil.utils.markdown](https://github.com/catapult-project/catapult/blob/master/devil/devil/utils/markdown.py)
-
-*This page was autogenerated by `devil/utils/markdown.py --module-link https://github.com/catapult-project/catapult/blob/master/devil/devil/utils/markdown.py`*
-
-## MarkdownHelpAction
-
-### MarkdownHelpAction.\_\_init\_\_
-
-### MarkdownHelpAction.\_\_call\_\_
-
-## MarkdownHelpFormatter
-
-A really bare-bones argparse help formatter that generates valid markdown.
-```
-  This will generate something like:
-
-  usage
-
-  # **section heading**:
-
-  ## **--argument-one**
-
-  \`\`\`
-  argument-one help text
-  \`\`\`
-
-```
-
-
-### MarkdownHelpFormatter.format\_help
-
-### MarkdownHelpFormatter.start\_section
-
-### md\_bold
-
-Returns markdown-formatted bold text.
-### md\_code
-
-Returns a markdown-formatted code block in the given language.
-### md\_escape
-
-Escapes \* and \_.
-### md\_heading
-
-Returns markdown-formatted heading.
-### md\_inline\_code
-
-Returns markdown-formatted inline code.
-### md\_italic
-
-Returns markdown-formatted italic text.
-### md\_link
-
-returns a markdown-formatted link.
-### add\_md\_help\_argument
-
-Adds --md-help to the given argparse.ArgumentParser.
-```
-  Running a script with --md-help will print the help text for that script
-  as valid markdown.
-
-  Args:
-    parser: The ArgumentParser to which --md-help should be added.
-```
-
-
-### load\_module\_from\_path
-
-Load a module given only the path name.
-```
-  Also loads package modules as necessary.
-
-  Args:
-    module_path: An absolute path to a python module.
-  Returns:
-    The module object for the given path.
-```
-
-
-### md\_module
-
-Write markdown documentation for a class.
-```
-  Documents public classes and functions.
-
-  Args:
-    class_obj: a types.TypeType object for the class that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-```
-
-
-### md\_class
-
-Write markdown documentation for a class.
-```
-  Documents public methods. Does not currently document subclasses.
-
-  Args:
-    class_obj: a types.TypeType object for the class that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-```
-
-
-### md\_docstring
-
-Write a markdown-formatted docstring.
-```
-  Returns:
-    A list of markdown-formatted lines.
-```
-
-
-### md\_function
-
-Write markdown documentation for a function.
-```
-  Args:
-    func_obj: a types.FunctionType object for the function that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-```
-
-
-### main
-
-Write markdown documentation for the module at the provided path.
-```
-  Args:
-    raw_args: the raw command-line args. Usually sys.argv[1:].
-  Returns:
-    An integer exit code. 0 for success, non-zero for failure.
-```
-
-
diff --git a/third_party/catapult/devil/docs/persistent_device_list.md b/third_party/catapult/devil/docs/persistent_device_list.md
deleted file mode 100644
index d08d9a9..0000000
--- a/third_party/catapult/devil/docs/persistent_device_list.md
+++ /dev/null
@@ -1,41 +0,0 @@
-<!-- Copyright 2016 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
--->
-
-# Devil: Persistent Device List
-
-## What is it?
-
-A persistent device list that stores all expected devices between builds. It
-is used by the perf test runner in order to properly shard tests by device
-affinity. This is important because the same performance test can yield
-meaningfully different results when run on different devices.
-
-## Bots
-
-The list is usually located at one of these locations:
-
-  - `/b/build/site_config/.known_devices`.
-  - `~/.android`.
-
-Look at recipes listed below in order to find more up to date location.
-
-## Local Runs
-
-The persistent device list is unnecessary for local runs. It is only used on the
-bots that upload data to the perf dashboard.
-
-## Where it is used
-
-The persistent device list is used in performance test recipes via
-[api.chromium\_tests.steps.DynamicPerfTests](https://cs.chromium.org/chromium/build/scripts/slave/recipe_modules/chromium_tests/steps.py?q=DynamicPerfTests).
-For example, the [android/perf](https://cs.chromium.org/chromium/build/scripts/slave/recipes/android/perf.py) recipe uses it like this:
-
-```python
-dynamic_perf_tests = api.chromium_tests.steps.DynamicPerfTests(
-    builder['perf_id'], 'android', None,
-    known_devices_file=builder.get('known_devices_file', None))
-dynamic_perf_tests.run(api, None)
-```
-
diff --git a/third_party/catapult/devil/pylintrc b/third_party/catapult/devil/pylintrc
deleted file mode 100644
index 7e024a2..0000000
--- a/third_party/catapult/devil/pylintrc
+++ /dev/null
@@ -1,68 +0,0 @@
-[MESSAGES CONTROL]
-
-# Disable the message, report, category or checker with the given id(s).
-# TODO: Shrink this list to as small as possible.
-disable=
-  design,
-  similarities,
-
-  bad-continuation,
-  fixme,
-  import-error,
-  invalid-name,
-  locally-disabled,
-  locally-enabled,
-  missing-docstring,
-  star-args,
-
-
-[REPORTS]
-
-# Don't write out full reports, just messages.
-reports=no
-
-
-[BASIC]
-
-# Regular expression which should only match correct function names.
-function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*))$
-
-# Regular expression which should only match correct method names.
-method-rgx=^(?:(?P<exempt>_[a-z0-9_]+__|get|post|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass)|(?P<camel_case>(_{0,2}|test|assert)[A-Z][a-zA-Z0-9_]*))$
-
-# Regular expression which should only match correct argument names.
-argument-rgx=^[a-z][a-z0-9_]*$
-
-# Regular expression which should only match correct variable names.
-variable-rgx=^[a-z][a-z0-9_]*$
-
-# Good variable names which should always be accepted, separated by a comma.
-good-names=main,_
-
-# List of builtins function names that should not be used, separated by a comma.
-bad-functions=apply,input,reduce
-
-
-[VARIABLES]
-
-# Tells wether we should check for unused import in __init__ files.
-init-import=no
-
-# A regular expression matching names used for dummy variables (i.e. not used).
-dummy-variables-rgx=^_.*$|dummy
-
-
-[TYPECHECK]
-
-# Tells wether missing members accessed in mixin class should be ignored. A
-# mixin class is detected if its name ends with "mixin" (case insensitive).
-ignore-mixin-members=yes
-
-
-[FORMAT]
-
-# Maximum number of lines in a module.
-max-module-lines=10000
-
-# We use two spaces for indents, instead of the usual four spaces or tab.
-indent-string='  '
diff --git a/third_party/jinja2/AUTHORS b/third_party/jinja2/AUTHORS
deleted file mode 100644
index 943f625..0000000
--- a/third_party/jinja2/AUTHORS
+++ /dev/null
@@ -1,33 +0,0 @@
-Jinja is written and maintained by the Jinja Team and various
-contributors:
-
-Lead Developer:
-
-- Armin Ronacher <armin.ronacher@active-4.com>
-
-Developers:
-
-- Christoph Hack
-- Georg Brandl
-
-Contributors:
-
-- Bryan McLemore
-- Mickaël Guérin <kael@crocobox.org>
-- Cameron Knight
-- Lawrence Journal-World.
-- David Cramer
-
-Patches and suggestions:
-
-- Ronny Pfannschmidt
-- Axel Böhm
-- Alexey Melchakov
-- Bryan McLemore
-- Clovis Fabricio (nosklo)
-- Cameron Knight
-- Peter van Dijk (Habbie)
-- Stefan Ebner
-- Rene Leonhardt
-- Thomas Waldmann
-- Cory Benfield (Lukasa)
diff --git a/third_party/jinja2/Jinja2-2.8.tar.gz.md5 b/third_party/jinja2/Jinja2-2.8.tar.gz.md5
deleted file mode 100644
index a0eb1b2..0000000
--- a/third_party/jinja2/Jinja2-2.8.tar.gz.md5
+++ /dev/null
@@ -1 +0,0 @@
-edb51693fe22c53cee5403775c71a99e  Jinja2-2.8.tar.gz
diff --git a/third_party/jinja2/Jinja2-2.8.tar.gz.sha512 b/third_party/jinja2/Jinja2-2.8.tar.gz.sha512
deleted file mode 100644
index 88e4ea6..0000000
--- a/third_party/jinja2/Jinja2-2.8.tar.gz.sha512
+++ /dev/null
@@ -1 +0,0 @@
-2e80d6d9ad10dafcce1e6dd24493f5dffc43a17f71a30a650415638e12d3a3891738ebacc569701129214026d062d91a2b10e4f7a2c7b85d801dde26ded1bebb  Jinja2-2.8.tar.gz
diff --git a/third_party/jinja2/LICENSE b/third_party/jinja2/LICENSE
deleted file mode 100644
index 31bf900..0000000
--- a/third_party/jinja2/LICENSE
+++ /dev/null
@@ -1,31 +0,0 @@
-Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details.
-
-Some rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-
-    * The names of the contributors may not be used to endorse or
-      promote products derived from this software without specific
-      prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/third_party/jinja2/README.chromium b/third_party/jinja2/README.chromium
deleted file mode 100644
index 684ff8e..0000000
--- a/third_party/jinja2/README.chromium
+++ /dev/null
@@ -1,25 +0,0 @@
-Name: Jinja2 Python Template Engine
-Short Name: jinja2
-URL: http://jinja.pocoo.org/
-Version: 2.8
-License: BSD 3-clause License
-License File: NOT_SHIPPED
-Security Critical: no
-
-Description:
-Template engine for code generation in Blink.
-
-Source: https://pypi.python.org/packages/f2/2f/0b98b06a345a761bec91a079ccae392d282690c2d8272e708f4d10829e22/Jinja2-2.8.tar.gz
-MD5: edb51693fe22c53cee5403775c71a99e
-SHA-1: 4a33c1a0fd585eba2507e8c274a9cd113b1d13ab
-
-Local Modifications:
-This only includes the jinja2 directory from the tarball and the LICENSE and
-AUTHORS files. Unit tests (testsuite directory) have been removed.
-Additional chromium-specific files are:
-* README.chromium (this file)
-* OWNERS
-* install script (get_jinja2.sh)
-* files of hashes (MD5 is also posted on website, SHA-512 computed locally).
-Script checks hash then unpacks archive and installs desired files.
-Retrieve or update by executing jinja2/get_jinja2.sh from third_party.
diff --git a/third_party/jinja2/__init__.py b/third_party/jinja2/__init__.py
deleted file mode 100644
index 029fb2e..0000000
--- a/third_party/jinja2/__init__.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2
-    ~~~~~~
-
-    Jinja2 is a template engine written in pure Python.  It provides a
-    Django inspired non-XML syntax but supports inline expressions and
-    an optional sandboxed environment.
-
-    Nutshell
-    --------
-
-    Here a small example of a Jinja2 template::
-
-        {% extends 'base.html' %}
-        {% block title %}Memberlist{% endblock %}
-        {% block content %}
-          <ul>
-          {% for user in users %}
-            <li><a href="{{ user.url }}">{{ user.username }}</a></li>
-          {% endfor %}
-          </ul>
-        {% endblock %}
-
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-__docformat__ = 'restructuredtext en'
-__version__ = '2.8'
-
-# high level interface
-from jinja2.environment import Environment, Template
-
-# loaders
-from jinja2.loaders import BaseLoader, FileSystemLoader, PackageLoader, \
-     DictLoader, FunctionLoader, PrefixLoader, ChoiceLoader, \
-     ModuleLoader
-
-# bytecode caches
-from jinja2.bccache import BytecodeCache, FileSystemBytecodeCache, \
-     MemcachedBytecodeCache
-
-# undefined types
-from jinja2.runtime import Undefined, DebugUndefined, StrictUndefined, \
-     make_logging_undefined
-
-# exceptions
-from jinja2.exceptions import TemplateError, UndefinedError, \
-     TemplateNotFound, TemplatesNotFound, TemplateSyntaxError, \
-     TemplateAssertionError
-
-# decorators and public utilities
-from jinja2.filters import environmentfilter, contextfilter, \
-     evalcontextfilter
-from jinja2.utils import Markup, escape, clear_caches, \
-     environmentfunction, evalcontextfunction, contextfunction, \
-     is_undefined
-
-__all__ = [
-    'Environment', 'Template', 'BaseLoader', 'FileSystemLoader',
-    'PackageLoader', 'DictLoader', 'FunctionLoader', 'PrefixLoader',
-    'ChoiceLoader', 'BytecodeCache', 'FileSystemBytecodeCache',
-    'MemcachedBytecodeCache', 'Undefined', 'DebugUndefined',
-    'StrictUndefined', 'TemplateError', 'UndefinedError', 'TemplateNotFound',
-    'TemplatesNotFound', 'TemplateSyntaxError', 'TemplateAssertionError',
-    'ModuleLoader', 'environmentfilter', 'contextfilter', 'Markup', 'escape',
-    'environmentfunction', 'contextfunction', 'clear_caches', 'is_undefined',
-    'evalcontextfilter', 'evalcontextfunction', 'make_logging_undefined',
-]
diff --git a/third_party/jinja2/_compat.py b/third_party/jinja2/_compat.py
deleted file mode 100644
index 143962f..0000000
--- a/third_party/jinja2/_compat.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2._compat
-    ~~~~~~~~~~~~~~
-
-    Some py2/py3 compatibility support based on a stripped down
-    version of six so we don't have to depend on a specific version
-    of it.
-
-    :copyright: Copyright 2013 by the Jinja team, see AUTHORS.
-    :license: BSD, see LICENSE for details.
-"""
-import sys
-
-PY2 = sys.version_info[0] == 2
-PYPY = hasattr(sys, 'pypy_translation_info')
-_identity = lambda x: x
-
-
-if not PY2:
-    unichr = chr
-    range_type = range
-    text_type = str
-    string_types = (str,)
-    integer_types = (int,)
-
-    iterkeys = lambda d: iter(d.keys())
-    itervalues = lambda d: iter(d.values())
-    iteritems = lambda d: iter(d.items())
-
-    import pickle
-    from io import BytesIO, StringIO
-    NativeStringIO = StringIO
-
-    def reraise(tp, value, tb=None):
-        if value.__traceback__ is not tb:
-            raise value.with_traceback(tb)
-        raise value
-
-    ifilter = filter
-    imap = map
-    izip = zip
-    intern = sys.intern
-
-    implements_iterator = _identity
-    implements_to_string = _identity
-    encode_filename = _identity
-    get_next = lambda x: x.__next__
-
-else:
-    unichr = unichr
-    text_type = unicode
-    range_type = xrange
-    string_types = (str, unicode)
-    integer_types = (int, long)
-
-    iterkeys = lambda d: d.iterkeys()
-    itervalues = lambda d: d.itervalues()
-    iteritems = lambda d: d.iteritems()
-
-    import cPickle as pickle
-    from cStringIO import StringIO as BytesIO, StringIO
-    NativeStringIO = BytesIO
-
-    exec('def reraise(tp, value, tb=None):\n raise tp, value, tb')
-
-    from itertools import imap, izip, ifilter
-    intern = intern
-
-    def implements_iterator(cls):
-        cls.next = cls.__next__
-        del cls.__next__
-        return cls
-
-    def implements_to_string(cls):
-        cls.__unicode__ = cls.__str__
-        cls.__str__ = lambda x: x.__unicode__().encode('utf-8')
-        return cls
-
-    get_next = lambda x: x.next
-
-    def encode_filename(filename):
-        if isinstance(filename, unicode):
-            return filename.encode('utf-8')
-        return filename
-
-
-def with_metaclass(meta, *bases):
-    # This requires a bit of explanation: the basic idea is to make a
-    # dummy metaclass for one level of class instanciation that replaces
-    # itself with the actual metaclass.  Because of internal type checks
-    # we also need to make sure that we downgrade the custom metaclass
-    # for one level to something closer to type (that's why __call__ and
-    # __init__ comes back from type etc.).
-    #
-    # This has the advantage over six.with_metaclass in that it does not
-    # introduce dummy classes into the final MRO.
-    class metaclass(meta):
-        __call__ = type.__call__
-        __init__ = type.__init__
-        def __new__(cls, name, this_bases, d):
-            if this_bases is None:
-                return type.__new__(cls, name, (), d)
-            return meta(name, bases, d)
-    return metaclass('temporary_class', None, {})
-
-
-try:
-    from urllib.parse import quote_from_bytes as url_quote
-except ImportError:
-    from urllib import quote as url_quote
diff --git a/third_party/jinja2/_stringdefs.py b/third_party/jinja2/_stringdefs.py
deleted file mode 100644
index da5830e..0000000
--- a/third_party/jinja2/_stringdefs.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2._stringdefs
-    ~~~~~~~~~~~~~~~~~~
-
-    Strings of all Unicode characters of a certain category.
-    Used for matching in Unicode-aware languages. Run to regenerate.
-
-    Inspired by chartypes_create.py from the MoinMoin project, original
-    implementation from Pygments.
-
-    :copyright: Copyright 2006-2009 by the Jinja team, see AUTHORS.
-    :license: BSD, see LICENSE for details.
-"""
-
-from jinja2._compat import unichr
-
-Cc = u'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f'
-
-Cf = u'\xad\u0600\u0601\u0602\u0603\u06dd\u070f\u17b4\u17b5\u200b\u200c\u200d\u200e\u200f\u202a\u202b\u202c\u202d\u202e\u2060\u2061\u2062\u2063\u206a\u206b\u206c\u206d\u206e\u206f\ufeff\ufff9\ufffa\ufffb'
-
-Cn = u'\u0242\u0243\u0244\u0245\u0246\u0247\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u0370\u0371\u0372\u0373\u0376\u0377\u0378\u0379\u037b\u037c\u037d\u037f\u0380\u0381\u0382\u0383\u038b\u038d\u03a2\u03cf\u0487\u04cf\u04fa\u04fb\u04fc\u04fd\u04fe\u04ff\u0510\u0511\u0512\u0513\u0514\u0515\u0516\u0517\u0518\u0519\u051a\u051b\u051c\u051d\u051e\u051f\u0520\u0521\u0522\u0523\u0524\u0525\u0526\u0527\u0528\u0529\u052a\u052b\u052c\u052d\u052e\u052f\u0530\u0557\u0558\u0560\u0588\u058b\u058c\u058d\u058e\u058f\u0590\u05ba\u05c8\u05c9\u05ca\u05cb\u05cc\u05cd\u05ce\u05cf\u05eb\u05ec\u05ed\u05ee\u05ef\u05f5\u05f6\u05f7\u05f8\u05f9\u05fa\u05fb\u05fc\u05fd\u05fe\u05ff\u0604\u0605\u0606\u0607\u0608\u0609\u060a\u0616\u0617\u0618\u0619\u061a\u061c\u061d\u0620\u063b\u063c\u063d\u063e\u063f\u065f\u070e\u074b\u074c\u076e\u076f\u0770\u0771\u0772\u0773\u0774\u0775\u0776\u0777\u0778\u0779\u077a\u077b\u077c\u077d\u077e\u077f\u07b2\u07b3\u07b4\u07b5\u07b6\u07b7\u07b8\u07b9\u07ba\u07bb\u07bc\u07bd\u07be\u07bf\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u07c7\u07c8\u07c9\u07ca\u07cb\u07cc\u07cd\u07ce\u07cf\u07d0\u07d1\u07d2\u07d3\u07d4\u07d5\u07d6\u07d7\u07d8\u07d9\u07da\u07db\u07dc\u07dd\u07de\u07df\u07e0\u07e1\u07e2\u07e3\u07e4\u07e5\u07e6\u07e7\u07e8\u07e9\u07ea\u07eb\u07ec\u07ed\u07ee\u07ef\u07f0\u07f1\u07f2\u07f3\u07f4\u07f5\u07f6\u07f7\u07f8\u07f9\u07fa\u07fb\u07fc\u07fd\u07fe\u07ff\u0800\u0801\u0802\u0803\u0804\u0805\u0806\u0807\u0808\u0809\u080a\u080b\u080c\u080d\u080e\u080f\u0810\u0811\u0812\u0813\u0814\u0815\u0816\u0817\u0818\u0819\u081a\u081b\u081c\u081d\u081e\u081f\u0820\u0821\u0822\u0823\u0824\u0825\u0826\u0827\u0828\u0829\u082a\u082b\u082c\u082d\u082e\u082f\u0830\u0831\u0832\u0833\u0834\u0835\u0836\u0837\u0838\u0839\u083a\u083b\u083c\u083d\u083e\u083f\u0840\u0841\u0842\u0843\u0844\u0845\u0846\u0847\u0848\u0849\u084a\u084b\u084c\u084d\u084e\u084f\u0850\u0851\u0852\u0853\u0854\u0855\u0856\u0857\u0858\u0859\u085a\u085b\u085c\u085d\u085e\u085f\u0860\u0861\u0862\u0863\u0864\u0865\u0866\u0867\u0868\u0869\u086a\u086b\u086c\u086d\u086e\u086f\u0870\u0871\u0872\u0873\u0874\u0875\u0876\u0877\u0878\u0879\u087a\u087b\u087c\u087d\u087e\u087f\u0880\u0881\u0882\u0883\u0884\u0885\u0886\u0887\u0888\u0889\u088a\u088b\u088c\u088d\u088e\u088f\u0890\u0891\u0892\u0893\u0894\u0895\u0896\u0897\u0898\u0899\u089a\u089b\u089c\u089d\u089e\u089f\u08a0\u08a1\u08a2\u08a3\u08a4\u08a5\u08a6\u08a7\u08a8\u08a9\u08aa\u08ab\u08ac\u08ad\u08ae\u08af\u08b0\u08b1\u08b2\u08b3\u08b4\u08b5\u08b6\u08b7\u08b8\u08b9\u08ba\u08bb\u08bc\u08bd\u08be\u08bf\u08c0\u08c1\u08c2\u08c3\u08c4\u08c5\u08c6\u08c7\u08c8\u08c9\u08ca\u08cb\u08cc\u08cd\u08ce\u08cf\u08d0\u08d1\u08d2\u08d3\u08d4\u08d5\u08d6\u08d7\u08d8\u08d9\u08da\u08db\u08dc\u08dd\u08de\u08df\u08e0\u08e1\u08e2\u08e3\u08e4\u08e5\u08e6\u08e7\u08e8\u08e9\u08ea\u08eb\u08ec\u08ed\u08ee\u08ef\u08f0\u08f1\u08f2\u08f3\u08f4\u08f5\u08f6\u08f7\u08f8\u08f9\u08fa\u08fb\u08fc\u08fd\u08fe\u08ff\u0900\u093a\u093b\u094e\u094f\u0955\u0956\u0957\u0971\u0972\u0973\u0974\u0975\u0976\u0977\u0978\u0979\u097a\u097b\u097c\u097e\u097f\u0980\u0984\u098d\u098e\u0991\u0992\u09a9\u09b1\u09b3\u09b4\u09b5\u09ba\u09bb\u09c5\u09c6\u09c9\u09ca\u09cf\u09d0\u09d1\u09d2\u09d3\u09d4\u09d5\u09d6\u09d8\u09d9\u09da\u09db\u09de\u09e4\u09e5\u09fb\u09fc\u09fd\u09fe\u09ff\u0a00\u0a04\u0a0b\u0a0c\u0a0d\u0a0e\u0a11\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a\u0a3b\u0a3d\u0a43\u0a44\u0a45\u0a46\u0a49\u0a4a\u0a4e\u0a4f\u0a50\u0a51\u0a52\u0a53\u0a54\u0a55\u0a56\u0a57\u0a58\u0a5d\u0a5f\u0a60\u0a61\u0a62\u0a63\u0a64\u0a65\u0a75\u0a76\u0a77\u0a78\u0a79\u0a7a\u0a7b\u0a7c\u0a7d\u0a7e\u0a7f\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba\u0abb\u0ac6\u0aca\u0ace\u0acf\u0ad1\u0ad2\u0ad3\u0ad4\u0ad5\u0ad6\u0ad7\u0ad8\u0ad9\u0ada\u0adb\u0adc\u0add\u0ade\u0adf\u0ae4\u0ae5\u0af0\u0af2\u0af3\u0af4\u0af5\u0af6\u0af7\u0af8\u0af9\u0afa\u0afb\u0afc\u0afd\u0afe\u0aff\u0b00\u0b04\u0b0d\u0b0e\u0b11\u0b12\u0b29\u0b31\u0b34\u0b3a\u0b3b\u0b44\u0b45\u0b46\u0b49\u0b4a\u0b4e\u0b4f\u0b50\u0b51\u0b52\u0b53\u0b54\u0b55\u0b58\u0b59\u0b5a\u0b5b\u0b5e\u0b62\u0b63\u0b64\u0b65\u0b72\u0b73\u0b74\u0b75\u0b76\u0b77\u0b78\u0b79\u0b7a\u0b7b\u0b7c\u0b7d\u0b7e\u0b7f\u0b80\u0b81\u0b84\u0b8b\u0b8c\u0b8d\u0b91\u0b96\u0b97\u0b98\u0b9b\u0b9d\u0ba0\u0ba1\u0ba2\u0ba5\u0ba6\u0ba7\u0bab\u0bac\u0bad\u0bba\u0bbb\u0bbc\u0bbd\u0bc3\u0bc4\u0bc5\u0bc9\u0bce\u0bcf\u0bd0\u0bd1\u0bd2\u0bd3\u0bd4\u0bd5\u0bd6\u0bd8\u0bd9\u0bda\u0bdb\u0bdc\u0bdd\u0bde\u0bdf\u0be0\u0be1\u0be2\u0be3\u0be4\u0be5\u0bfb\u0bfc\u0bfd\u0bfe\u0bff\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a\u0c3b\u0c3c\u0c3d\u0c45\u0c49\u0c4e\u0c4f\u0c50\u0c51\u0c52\u0c53\u0c54\u0c57\u0c58\u0c59\u0c5a\u0c5b\u0c5c\u0c5d\u0c5e\u0c5f\u0c62\u0c63\u0c64\u0c65\u0c70\u0c71\u0c72\u0c73\u0c74\u0c75\u0c76\u0c77\u0c78\u0c79\u0c7a\u0c7b\u0c7c\u0c7d\u0c7e\u0c7f\u0c80\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba\u0cbb\u0cc5\u0cc9\u0cce\u0ccf\u0cd0\u0cd1\u0cd2\u0cd3\u0cd4\u0cd7\u0cd8\u0cd9\u0cda\u0cdb\u0cdc\u0cdd\u0cdf\u0ce2\u0ce3\u0ce4\u0ce5\u0cf0\u0cf1\u0cf2\u0cf3\u0cf4\u0cf5\u0cf6\u0cf7\u0cf8\u0cf9\u0cfa\u0cfb\u0cfc\u0cfd\u0cfe\u0cff\u0d00\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a\u0d3b\u0d3c\u0d3d\u0d44\u0d45\u0d49\u0d4e\u0d4f\u0d50\u0d51\u0d52\u0d53\u0d54\u0d55\u0d56\u0d58\u0d59\u0d5a\u0d5b\u0d5c\u0d5d\u0d5e\u0d5f\u0d62\u0d63\u0d64\u0d65\u0d70\u0d71\u0d72\u0d73\u0d74\u0d75\u0d76\u0d77\u0d78\u0d79\u0d7a\u0d7b\u0d7c\u0d7d\u0d7e\u0d7f\u0d80\u0d81\u0d84\u0d97\u0d98\u0d99\u0db2\u0dbc\u0dbe\u0dbf\u0dc7\u0dc8\u0dc9\u0dcb\u0dcc\u0dcd\u0dce\u0dd5\u0dd7\u0de0\u0de1\u0de2\u0de3\u0de4\u0de5\u0de6\u0de7\u0de8\u0de9\u0dea\u0deb\u0dec\u0ded\u0dee\u0def\u0df0\u0df1\u0df5\u0df6\u0df7\u0df8\u0df9\u0dfa\u0dfb\u0dfc\u0dfd\u0dfe\u0dff\u0e00\u0e3b\u0e3c\u0e3d\u0e3e\u0e5c\u0e5d\u0e5e\u0e5f\u0e60\u0e61\u0e62\u0e63\u0e64\u0e65\u0e66\u0e67\u0e68\u0e69\u0e6a\u0e6b\u0e6c\u0e6d\u0e6e\u0e6f\u0e70\u0e71\u0e72\u0e73\u0e74\u0e75\u0e76\u0e77\u0e78\u0e79\u0e7a\u0e7b\u0e7c\u0e7d\u0e7e\u0e7f\u0e80\u0e83\u0e85\u0e86\u0e89\u0e8b\u0e8c\u0e8e\u0e8f\u0e90\u0e91\u0e92\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8\u0ea9\u0eac\u0eba\u0ebe\u0ebf\u0ec5\u0ec7\u0ece\u0ecf\u0eda\u0edb\u0ede\u0edf\u0ee0\u0ee1\u0ee2\u0ee3\u0ee4\u0ee5\u0ee6\u0ee7\u0ee8\u0ee9\u0eea\u0eeb\u0eec\u0eed\u0eee\u0eef\u0ef0\u0ef1\u0ef2\u0ef3\u0ef4\u0ef5\u0ef6\u0ef7\u0ef8\u0ef9\u0efa\u0efb\u0efc\u0efd\u0efe\u0eff\u0f48\u0f6b\u0f6c\u0f6d\u0f6e\u0f6f\u0f70\u0f8c\u0f8d\u0f8e\u0f8f\u0f98\u0fbd\u0fcd\u0fce\u0fd2\u0fd3\u0fd4\u0fd5\u0fd6\u0fd7\u0fd8\u0fd9\u0fda\u0fdb\u0fdc\u0fdd\u0fde\u0fdf\u0fe0\u0fe1\u0fe2\u0fe3\u0fe4\u0fe5\u0fe6\u0fe7\u0fe8\u0fe9\u0fea\u0feb\u0fec\u0fed\u0fee\u0fef\u0ff0\u0ff1\u0ff2\u0ff3\u0ff4\u0ff5\u0ff6\u0ff7\u0ff8\u0ff9\u0ffa\u0ffb\u0ffc\u0ffd\u0ffe\u0fff\u1022\u1028\u102b\u1033\u1034\u1035\u103a\u103b\u103c\u103d\u103e\u103f\u105a\u105b\u105c\u105d\u105e\u105f\u1060\u1061\u1062\u1063\u1064\u1065\u1066\u1067\u1068\u1069\u106a\u106b\u106c\u106d\u106e\u106f\u1070\u1071\u1072\u1073\u1074\u1075\u1076\u1077\u1078\u1079\u107a\u107b\u107c\u107d\u107e\u107f\u1080\u1081\u1082\u1083\u1084\u1085\u1086\u1087\u1088\u1089\u108a\u108b\u108c\u108d\u108e\u108f\u1090\u1091\u1092\u1093\u1094\u1095\u1096\u1097\u1098\u1099\u109a\u109b\u109c\u109d\u109e\u109f\u10c6\u10c7\u10c8\u10c9\u10ca\u10cb\u10cc\u10cd\u10ce\u10cf\u10fd\u10fe\u10ff\u115a\u115b\u115c\u115d\u115e\u11a3\u11a4\u11a5\u11a6\u11a7\u11fa\u11fb\u11fc\u11fd\u11fe\u11ff\u1249\u124e\u124f\u1257\u1259\u125e\u125f\u1289\u128e\u128f\u12b1\u12b6\u12b7\u12bf\u12c1\u12c6\u12c7\u12d7\u1311\u1316\u1317\u135b\u135c\u135d\u135e\u137d\u137e\u137f\u139a\u139b\u139c\u139d\u139e\u139f\u13f5\u13f6\u13f7\u13f8\u13f9\u13fa\u13fb\u13fc\u13fd\u13fe\u13ff\u1400\u1677\u1678\u1679\u167a\u167b\u167c\u167d\u167e\u167f\u169d\u169e\u169f\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u16f9\u16fa\u16fb\u16fc\u16fd\u16fe\u16ff\u170d\u1715\u1716\u1717\u1718\u1719\u171a\u171b\u171c\u171d\u171e\u171f\u1737\u1738\u1739\u173a\u173b\u173c\u173d\u173e\u173f\u1754\u1755\u1756\u1757\u1758\u1759\u175a\u175b\u175c\u175d\u175e\u175f\u176d\u1771\u1774\u1775\u1776\u1777\u1778\u1779\u177a\u177b\u177c\u177d\u177e\u177f\u17de\u17df\u17ea\u17eb\u17ec\u17ed\u17ee\u17ef\u17fa\u17fb\u17fc\u17fd\u17fe\u17ff\u180f\u181a\u181b\u181c\u181d\u181e\u181f\u1878\u1879\u187a\u187b\u187c\u187d\u187e\u187f\u18aa\u18ab\u18ac\u18ad\u18ae\u18af\u18b0\u18b1\u18b2\u18b3\u18b4\u18b5\u18b6\u18b7\u18b8\u18b9\u18ba\u18bb\u18bc\u18bd\u18be\u18bf\u18c0\u18c1\u18c2\u18c3\u18c4\u18c5\u18c6\u18c7\u18c8\u18c9\u18ca\u18cb\u18cc\u18cd\u18ce\u18cf\u18d0\u18d1\u18d2\u18d3\u18d4\u18d5\u18d6\u18d7\u18d8\u18d9\u18da\u18db\u18dc\u18dd\u18de\u18df\u18e0\u18e1\u18e2\u18e3\u18e4\u18e5\u18e6\u18e7\u18e8\u18e9\u18ea\u18eb\u18ec\u18ed\u18ee\u18ef\u18f0\u18f1\u18f2\u18f3\u18f4\u18f5\u18f6\u18f7\u18f8\u18f9\u18fa\u18fb\u18fc\u18fd\u18fe\u18ff\u191d\u191e\u191f\u192c\u192d\u192e\u192f\u193c\u193d\u193e\u193f\u1941\u1942\u1943\u196e\u196f\u1975\u1976\u1977\u1978\u1979\u197a\u197b\u197c\u197d\u197e\u197f\u19aa\u19ab\u19ac\u19ad\u19ae\u19af\u19ca\u19cb\u19cc\u19cd\u19ce\u19cf\u19da\u19db\u19dc\u19dd\u1a1c\u1a1d\u1a20\u1a21\u1a22\u1a23\u1a24\u1a25\u1a26\u1a27\u1a28\u1a29\u1a2a\u1a2b\u1a2c\u1a2d\u1a2e\u1a2f\u1a30\u1a31\u1a32\u1a33\u1a34\u1a35\u1a36\u1a37\u1a38\u1a39\u1a3a\u1a3b\u1a3c\u1a3d\u1a3e\u1a3f\u1a40\u1a41\u1a42\u1a43\u1a44\u1a45\u1a46\u1a47\u1a48\u1a49\u1a4a\u1a4b\u1a4c\u1a4d\u1a4e\u1a4f\u1a50\u1a51\u1a52\u1a53\u1a54\u1a55\u1a56\u1a57\u1a58\u1a59\u1a5a\u1a5b\u1a5c\u1a5d\u1a5e\u1a5f\u1a60\u1a61\u1a62\u1a63\u1a64\u1a65\u1a66\u1a67\u1a68\u1a69\u1a6a\u1a6b\u1a6c\u1a6d\u1a6e\u1a6f\u1a70\u1a71\u1a72\u1a73\u1a74\u1a75\u1a76\u1a77\u1a78\u1a79\u1a7a\u1a7b\u1a7c\u1a7d\u1a7e\u1a7f\u1a80\u1a81\u1a82\u1a83\u1a84\u1a85\u1a86\u1a87\u1a88\u1a89\u1a8a\u1a8b\u1a8c\u1a8d\u1a8e\u1a8f\u1a90\u1a91\u1a92\u1a93\u1a94\u1a95\u1a96\u1a97\u1a98\u1a99\u1a9a\u1a9b\u1a9c\u1a9d\u1a9e\u1a9f\u1aa0\u1aa1\u1aa2\u1aa3\u1aa4\u1aa5\u1aa6\u1aa7\u1aa8\u1aa9\u1aaa\u1aab\u1aac\u1aad\u1aae\u1aaf\u1ab0\u1ab1\u1ab2\u1ab3\u1ab4\u1ab5\u1ab6\u1ab7\u1ab8\u1ab9\u1aba\u1abb\u1abc\u1abd\u1abe\u1abf\u1ac0\u1ac1\u1ac2\u1ac3\u1ac4\u1ac5\u1ac6\u1ac7\u1ac8\u1ac9\u1aca\u1acb\u1acc\u1acd\u1ace\u1acf\u1ad0\u1ad1\u1ad2\u1ad3\u1ad4\u1ad5\u1ad6\u1ad7\u1ad8\u1ad9\u1ada\u1adb\u1adc\u1add\u1ade\u1adf\u1ae0\u1ae1\u1ae2\u1ae3\u1ae4\u1ae5\u1ae6\u1ae7\u1ae8\u1ae9\u1aea\u1aeb\u1aec\u1aed\u1aee\u1aef\u1af0\u1af1\u1af2\u1af3\u1af4\u1af5\u1af6\u1af7\u1af8\u1af9\u1afa\u1afb\u1afc\u1afd\u1afe\u1aff\u1b00\u1b01\u1b02\u1b03\u1b04\u1b05\u1b06\u1b07\u1b08\u1b09\u1b0a\u1b0b\u1b0c\u1b0d\u1b0e\u1b0f\u1b10\u1b11\u1b12\u1b13\u1b14\u1b15\u1b16\u1b17\u1b18\u1b19\u1b1a\u1b1b\u1b1c\u1b1d\u1b1e\u1b1f\u1b20\u1b21\u1b22\u1b23\u1b24\u1b25\u1b26\u1b27\u1b28\u1b29\u1b2a\u1b2b\u1b2c\u1b2d\u1b2e\u1b2f\u1b30\u1b31\u1b32\u1b33\u1b34\u1b35\u1b36\u1b37\u1b38\u1b39\u1b3a\u1b3b\u1b3c\u1b3d\u1b3e\u1b3f\u1b40\u1b41\u1b42\u1b43\u1b44\u1b45\u1b46\u1b47\u1b48\u1b49\u1b4a\u1b4b\u1b4c\u1b4d\u1b4e\u1b4f\u1b50\u1b51\u1b52\u1b53\u1b54\u1b55\u1b56\u1b57\u1b58\u1b59\u1b5a\u1b5b\u1b5c\u1b5d\u1b5e\u1b5f\u1b60\u1b61\u1b62\u1b63\u1b64\u1b65\u1b66\u1b67\u1b68\u1b69\u1b6a\u1b6b\u1b6c\u1b6d\u1b6e\u1b6f\u1b70\u1b71\u1b72\u1b73\u1b74\u1b75\u1b76\u1b77\u1b78\u1b79\u1b7a\u1b7b\u1b7c\u1b7d\u1b7e\u1b7f\u1b80\u1b81\u1b82\u1b83\u1b84\u1b85\u1b86\u1b87\u1b88\u1b89\u1b8a\u1b8b\u1b8c\u1b8d\u1b8e\u1b8f\u1b90\u1b91\u1b92\u1b93\u1b94\u1b95\u1b96\u1b97\u1b98\u1b99\u1b9a\u1b9b\u1b9c\u1b9d\u1b9e\u1b9f\u1ba0\u1ba1\u1ba2\u1ba3\u1ba4\u1ba5\u1ba6\u1ba7\u1ba8\u1ba9\u1baa\u1bab\u1bac\u1bad\u1bae\u1baf\u1bb0\u1bb1\u1bb2\u1bb3\u1bb4\u1bb5\u1bb6\u1bb7\u1bb8\u1bb9\u1bba\u1bbb\u1bbc\u1bbd\u1bbe\u1bbf\u1bc0\u1bc1\u1bc2\u1bc3\u1bc4\u1bc5\u1bc6\u1bc7\u1bc8\u1bc9\u1bca\u1bcb\u1bcc\u1bcd\u1bce\u1bcf\u1bd0\u1bd1\u1bd2\u1bd3\u1bd4\u1bd5\u1bd6\u1bd7\u1bd8\u1bd9\u1bda\u1bdb\u1bdc\u1bdd\u1bde\u1bdf\u1be0\u1be1\u1be2\u1be3\u1be4\u1be5\u1be6\u1be7\u1be8\u1be9\u1bea\u1beb\u1bec\u1bed\u1bee\u1bef\u1bf0\u1bf1\u1bf2\u1bf3\u1bf4\u1bf5\u1bf6\u1bf7\u1bf8\u1bf9\u1bfa\u1bfb\u1bfc\u1bfd\u1bfe\u1bff\u1c00\u1c01\u1c02\u1c03\u1c04\u1c05\u1c06\u1c07\u1c08\u1c09\u1c0a\u1c0b\u1c0c\u1c0d\u1c0e\u1c0f\u1c10\u1c11\u1c12\u1c13\u1c14\u1c15\u1c16\u1c17\u1c18\u1c19\u1c1a\u1c1b\u1c1c\u1c1d\u1c1e\u1c1f\u1c20\u1c21\u1c22\u1c23\u1c24\u1c25\u1c26\u1c27\u1c28\u1c29\u1c2a\u1c2b\u1c2c\u1c2d\u1c2e\u1c2f\u1c30\u1c31\u1c32\u1c33\u1c34\u1c35\u1c36\u1c37\u1c38\u1c39\u1c3a\u1c3b\u1c3c\u1c3d\u1c3e\u1c3f\u1c40\u1c41\u1c42\u1c43\u1c44\u1c45\u1c46\u1c47\u1c48\u1c49\u1c4a\u1c4b\u1c4c\u1c4d\u1c4e\u1c4f\u1c50\u1c51\u1c52\u1c53\u1c54\u1c55\u1c56\u1c57\u1c58\u1c59\u1c5a\u1c5b\u1c5c\u1c5d\u1c5e\u1c5f\u1c60\u1c61\u1c62\u1c63\u1c64\u1c65\u1c66\u1c67\u1c68\u1c69\u1c6a\u1c6b\u1c6c\u1c6d\u1c6e\u1c6f\u1c70\u1c71\u1c72\u1c73\u1c74\u1c75\u1c76\u1c77\u1c78\u1c79\u1c7a\u1c7b\u1c7c\u1c7d\u1c7e\u1c7f\u1c80\u1c81\u1c82\u1c83\u1c84\u1c85\u1c86\u1c87\u1c88\u1c89\u1c8a\u1c8b\u1c8c\u1c8d\u1c8e\u1c8f\u1c90\u1c91\u1c92\u1c93\u1c94\u1c95\u1c96\u1c97\u1c98\u1c99\u1c9a\u1c9b\u1c9c\u1c9d\u1c9e\u1c9f\u1ca0\u1ca1\u1ca2\u1ca3\u1ca4\u1ca5\u1ca6\u1ca7\u1ca8\u1ca9\u1caa\u1cab\u1cac\u1cad\u1cae\u1caf\u1cb0\u1cb1\u1cb2\u1cb3\u1cb4\u1cb5\u1cb6\u1cb7\u1cb8\u1cb9\u1cba\u1cbb\u1cbc\u1cbd\u1cbe\u1cbf\u1cc0\u1cc1\u1cc2\u1cc3\u1cc4\u1cc5\u1cc6\u1cc7\u1cc8\u1cc9\u1cca\u1ccb\u1ccc\u1ccd\u1cce\u1ccf\u1cd0\u1cd1\u1cd2\u1cd3\u1cd4\u1cd5\u1cd6\u1cd7\u1cd8\u1cd9\u1cda\u1cdb\u1cdc\u1cdd\u1cde\u1cdf\u1ce0\u1ce1\u1ce2\u1ce3\u1ce4\u1ce5\u1ce6\u1ce7\u1ce8\u1ce9\u1cea\u1ceb\u1cec\u1ced\u1cee\u1cef\u1cf0\u1cf1\u1cf2\u1cf3\u1cf4\u1cf5\u1cf6\u1cf7\u1cf8\u1cf9\u1cfa\u1cfb\u1cfc\u1cfd\u1cfe\u1cff\u1dc4\u1dc5\u1dc6\u1dc7\u1dc8\u1dc9\u1dca\u1dcb\u1dcc\u1dcd\u1dce\u1dcf\u1dd0\u1dd1\u1dd2\u1dd3\u1dd4\u1dd5\u1dd6\u1dd7\u1dd8\u1dd9\u1dda\u1ddb\u1ddc\u1ddd\u1dde\u1ddf\u1de0\u1de1\u1de2\u1de3\u1de4\u1de5\u1de6\u1de7\u1de8\u1de9\u1dea\u1deb\u1dec\u1ded\u1dee\u1def\u1df0\u1df1\u1df2\u1df3\u1df4\u1df5\u1df6\u1df7\u1df8\u1df9\u1dfa\u1dfb\u1dfc\u1dfd\u1dfe\u1dff\u1e9c\u1e9d\u1e9e\u1e9f\u1efa\u1efb\u1efc\u1efd\u1efe\u1eff\u1f16\u1f17\u1f1e\u1f1f\u1f46\u1f47\u1f4e\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e\u1f7f\u1fb5\u1fc5\u1fd4\u1fd5\u1fdc\u1ff0\u1ff1\u1ff5\u1fff\u2064\u2065\u2066\u2067\u2068\u2069\u2072\u2073\u208f\u2095\u2096\u2097\u2098\u2099\u209a\u209b\u209c\u209d\u209e\u209f\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb\u20bc\u20bd\u20be\u20bf\u20c0\u20c1\u20c2\u20c3\u20c4\u20c5\u20c6\u20c7\u20c8\u20c9\u20ca\u20cb\u20cc\u20cd\u20ce\u20cf\u20ec\u20ed\u20ee\u20ef\u20f0\u20f1\u20f2\u20f3\u20f4\u20f5\u20f6\u20f7\u20f8\u20f9\u20fa\u20fb\u20fc\u20fd\u20fe\u20ff\u214d\u214e\u214f\u2150\u2151\u2152\u2184\u2185\u2186\u2187\u2188\u2189\u218a\u218b\u218c\u218d\u218e\u218f\u23dc\u23dd\u23de\u23df\u23e0\u23e1\u23e2\u23e3\u23e4\u23e5\u23e6\u23e7\u23e8\u23e9\u23ea\u23eb\u23ec\u23ed\u23ee\u23ef\u23f0\u23f1\u23f2\u23f3\u23f4\u23f5\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u23fe\u23ff\u2427\u2428\u2429\u242a\u242b\u242c\u242d\u242e\u242f\u2430\u2431\u2432\u2433\u2434\u2435\u2436\u2437\u2438\u2439\u243a\u243b\u243c\u243d\u243e\u243f\u244b\u244c\u244d\u244e\u244f\u2450\u2451\u2452\u2453\u2454\u2455\u2456\u2457\u2458\u2459\u245a\u245b\u245c\u245d\u245e\u245f\u269d\u269e\u269f\u26b2\u26b3\u26b4\u26b5\u26b6\u26b7\u26b8\u26b9\u26ba\u26bb\u26bc\u26bd\u26be\u26bf\u26c0\u26c1\u26c2\u26c3\u26c4\u26c5\u26c6\u26c7\u26c8\u26c9\u26ca\u26cb\u26cc\u26cd\u26ce\u26cf\u26d0\u26d1\u26d2\u26d3\u26d4\u26d5\u26d6\u26d7\u26d8\u26d9\u26da\u26db\u26dc\u26dd\u26de\u26df\u26e0\u26e1\u26e2\u26e3\u26e4\u26e5\u26e6\u26e7\u26e8\u26e9\u26ea\u26eb\u26ec\u26ed\u26ee\u26ef\u26f0\u26f1\u26f2\u26f3\u26f4\u26f5\u26f6\u26f7\u26f8\u26f9\u26fa\u26fb\u26fc\u26fd\u26fe\u26ff\u2700\u2705\u270a\u270b\u2728\u274c\u274e\u2753\u2754\u2755\u2757\u275f\u2760\u2795\u2796\u2797\u27b0\u27bf\u27c7\u27c8\u27c9\u27ca\u27cb\u27cc\u27cd\u27ce\u27cf\u27ec\u27ed\u27ee\u27ef\u2b14\u2b15\u2b16\u2b17\u2b18\u2b19\u2b1a\u2b1b\u2b1c\u2b1d\u2b1e\u2b1f\u2b20\u2b21\u2b22\u2b23\u2b24\u2b25\u2b26\u2b27\u2b28\u2b29\u2b2a\u2b2b\u2b2c\u2b2d\u2b2e\u2b2f\u2b30\u2b31\u2b32\u2b33\u2b34\u2b35\u2b36\u2b37\u2b38\u2b39\u2b3a\u2b3b\u2b3c\u2b3d\u2b3e\u2b3f\u2b40\u2b41\u2b42\u2b43\u2b44\u2b45\u2b46\u2b47\u2b48\u2b49\u2b4a\u2b4b\u2b4c\u2b4d\u2b4e\u2b4f\u2b50\u2b51\u2b52\u2b53\u2b54\u2b55\u2b56\u2b57\u2b58\u2b59\u2b5a\u2b5b\u2b5c\u2b5d\u2b5e\u2b5f\u2b60\u2b61\u2b62\u2b63\u2b64\u2b65\u2b66\u2b67\u2b68\u2b69\u2b6a\u2b6b\u2b6c\u2b6d\u2b6e\u2b6f\u2b70\u2b71\u2b72\u2b73\u2b74\u2b75\u2b76\u2b77\u2b78\u2b79\u2b7a\u2b7b\u2b7c\u2b7d\u2b7e\u2b7f\u2b80\u2b81\u2b82\u2b83\u2b84\u2b85\u2b86\u2b87\u2b88\u2b89\u2b8a\u2b8b\u2b8c\u2b8d\u2b8e\u2b8f\u2b90\u2b91\u2b92\u2b93\u2b94\u2b95\u2b96\u2b97\u2b98\u2b99\u2b9a\u2b9b\u2b9c\u2b9d\u2b9e\u2b9f\u2ba0\u2ba1\u2ba2\u2ba3\u2ba4\u2ba5\u2ba6\u2ba7\u2ba8\u2ba9\u2baa\u2bab\u2bac\u2bad\u2bae\u2baf\u2bb0\u2bb1\u2bb2\u2bb3\u2bb4\u2bb5\u2bb6\u2bb7\u2bb8\u2bb9\u2bba\u2bbb\u2bbc\u2bbd\u2bbe\u2bbf\u2bc0\u2bc1\u2bc2\u2bc3\u2bc4\u2bc5\u2bc6\u2bc7\u2bc8\u2bc9\u2bca\u2bcb\u2bcc\u2bcd\u2bce\u2bcf\u2bd0\u2bd1\u2bd2\u2bd3\u2bd4\u2bd5\u2bd6\u2bd7\u2bd8\u2bd9\u2bda\u2bdb\u2bdc\u2bdd\u2bde\u2bdf\u2be0\u2be1\u2be2\u2be3\u2be4\u2be5\u2be6\u2be7\u2be8\u2be9\u2bea\u2beb\u2bec\u2bed\u2bee\u2bef\u2bf0\u2bf1\u2bf2\u2bf3\u2bf4\u2bf5\u2bf6\u2bf7\u2bf8\u2bf9\u2bfa\u2bfb\u2bfc\u2bfd\u2bfe\u2bff\u2c2f\u2c5f\u2c60\u2c61\u2c62\u2c63\u2c64\u2c65\u2c66\u2c67\u2c68\u2c69\u2c6a\u2c6b\u2c6c\u2c6d\u2c6e\u2c6f\u2c70\u2c71\u2c72\u2c73\u2c74\u2c75\u2c76\u2c77\u2c78\u2c79\u2c7a\u2c7b\u2c7c\u2c7d\u2c7e\u2c7f\u2ceb\u2cec\u2ced\u2cee\u2cef\u2cf0\u2cf1\u2cf2\u2cf3\u2cf4\u2cf5\u2cf6\u2cf7\u2cf8\u2d26\u2d27\u2d28\u2d29\u2d2a\u2d2b\u2d2c\u2d2d\u2d2e\u2d2f\u2d66\u2d67\u2d68\u2d69\u2d6a\u2d6b\u2d6c\u2d6d\u2d6e\u2d70\u2d71\u2d72\u2d73\u2d74\u2d75\u2d76\u2d77\u2d78\u2d79\u2d7a\u2d7b\u2d7c\u2d7d\u2d7e\u2d7f\u2d97\u2d98\u2d99\u2d9a\u2d9b\u2d9c\u2d9d\u2d9e\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2de0\u2de1\u2de2\u2de3\u2de4\u2de5\u2de6\u2de7\u2de8\u2de9\u2dea\u2deb\u2dec\u2ded\u2dee\u2def\u2df0\u2df1\u2df2\u2df3\u2df4\u2df5\u2df6\u2df7\u2df8\u2df9\u2dfa\u2dfb\u2dfc\u2dfd\u2dfe\u2dff\u2e18\u2e19\u2e1a\u2e1b\u2e1e\u2e1f\u2e20\u2e21\u2e22\u2e23\u2e24\u2e25\u2e26\u2e27\u2e28\u2e29\u2e2a\u2e2b\u2e2c\u2e2d\u2e2e\u2e2f\u2e30\u2e31\u2e32\u2e33\u2e34\u2e35\u2e36\u2e37\u2e38\u2e39\u2e3a\u2e3b\u2e3c\u2e3d\u2e3e\u2e3f\u2e40\u2e41\u2e42\u2e43\u2e44\u2e45\u2e46\u2e47\u2e48\u2e49\u2e4a\u2e4b\u2e4c\u2e4d\u2e4e\u2e4f\u2e50\u2e51\u2e52\u2e53\u2e54\u2e55\u2e56\u2e57\u2e58\u2e59\u2e5a\u2e5b\u2e5c\u2e5d\u2e5e\u2e5f\u2e60\u2e61\u2e62\u2e63\u2e64\u2e65\u2e66\u2e67\u2e68\u2e69\u2e6a\u2e6b\u2e6c\u2e6d\u2e6e\u2e6f\u2e70\u2e71\u2e72\u2e73\u2e74\u2e75\u2e76\u2e77\u2e78\u2e79\u2e7a\u2e7b\u2e7c\u2e7d\u2e7e\u2e7f\u2e9a\u2ef4\u2ef5\u2ef6\u2ef7\u2ef8\u2ef9\u2efa\u2efb\u2efc\u2efd\u2efe\u2eff\u2fd6\u2fd7\u2fd8\u2fd9\u2fda\u2fdb\u2fdc\u2fdd\u2fde\u2fdf\u2fe0\u2fe1\u2fe2\u2fe3\u2fe4\u2fe5\u2fe6\u2fe7\u2fe8\u2fe9\u2fea\u2feb\u2fec\u2fed\u2fee\u2fef\u2ffc\u2ffd\u2ffe\u2fff\u3040\u3097\u3098\u3100\u3101\u3102\u3103\u3104\u312d\u312e\u312f\u3130\u318f\u31b8\u31b9\u31ba\u31bb\u31bc\u31bd\u31be\u31bf\u31d0\u31d1\u31d2\u31d3\u31d4\u31d5\u31d6\u31d7\u31d8\u31d9\u31da\u31db\u31dc\u31dd\u31de\u31df\u31e0\u31e1\u31e2\u31e3\u31e4\u31e5\u31e6\u31e7\u31e8\u31e9\u31ea\u31eb\u31ec\u31ed\u31ee\u31ef\u321f\u3244\u3245\u3246\u3247\u3248\u3249\u324a\u324b\u324c\u324d\u324e\u324f\u32ff\u4db6\u4db7\u4db8\u4db9\u4dba\u4dbb\u4dbc\u4dbd\u4dbe\u4dbf\u9fbc\u9fbd\u9fbe\u9fbf\u9fc0\u9fc1\u9fc2\u9fc3\u9fc4\u9fc5\u9fc6\u9fc7\u9fc8\u9fc9\u9fca\u9fcb\u9fcc\u9fcd\u9fce\u9fcf\u9fd0\u9fd1\u9fd2\u9fd3\u9fd4\u9fd5\u9fd6\u9fd7\u9fd8\u9fd9\u9fda\u9fdb\u9fdc\u9fdd\u9fde\u9fdf\u9fe0\u9fe1\u9fe2\u9fe3\u9fe4\u9fe5\u9fe6\u9fe7\u9fe8\u9fe9\u9fea\u9feb\u9fec\u9fed\u9fee\u9fef\u9ff0\u9ff1\u9ff2\u9ff3\u9ff4\u9ff5\u9ff6\u9ff7\u9ff8\u9ff9\u9ffa\u9ffb\u9ffc\u9ffd\u9ffe\u9fff\ua48d\ua48e\ua48f\ua4c7\ua4c8\ua4c9\ua4ca\ua4cb\ua4cc\ua4cd\ua4ce\ua4cf\ua4d0\ua4d1\ua4d2\ua4d3\ua4d4\ua4d5\ua4d6\ua4d7\ua4d8\ua4d9\ua4da\ua4db\ua4dc\ua4dd\ua4de\ua4df\ua4e0\ua4e1\ua4e2\ua4e3\ua4e4\ua4e5\ua4e6\ua4e7\ua4e8\ua4e9\ua4ea\ua4eb\ua4ec\ua4ed\ua4ee\ua4ef\ua4f0\ua4f1\ua4f2\ua4f3\ua4f4\ua4f5\ua4f6\ua4f7\ua4f8\ua4f9\ua4fa\ua4fb\ua4fc\ua4fd\ua4fe\ua4ff\ua500\ua501\ua502\ua503\ua504\ua505\ua506\ua507\ua508\ua509\ua50a\ua50b\ua50c\ua50d\ua50e\ua50f\ua510\ua511\ua512\ua513\ua514\ua515\ua516\ua517\ua518\ua519\ua51a\ua51b\ua51c\ua51d\ua51e\ua51f\ua520\ua521\ua522\ua523\ua524\ua525\ua526\ua527\ua528\ua529\ua52a\ua52b\ua52c\ua52d\ua52e\ua52f\ua530\ua531\ua532\ua533\ua534\ua535\ua536\ua537\ua538\ua539\ua53a\ua53b\ua53c\ua53d\ua53e\ua53f\ua540\ua541\ua542\ua543\ua544\ua545\ua546\ua547\ua548\ua549\ua54a\ua54b\ua54c\ua54d\ua54e\ua54f\ua550\ua551\ua552\ua553\ua554\ua555\ua556\ua557\ua558\ua559\ua55a\ua55b\ua55c\ua55d\ua55e\ua55f\ua560\ua561\ua562\ua563\ua564\ua565\ua566\ua567\ua568\ua569\ua56a\ua56b\ua56c\ua56d\ua56e\ua56f\ua570\ua571\ua572\ua573\ua574\ua575\ua576\ua577\ua578\ua579\ua57a\ua57b\ua57c\ua57d\ua57e\ua57f\ua580\ua581\ua582\ua583\ua584\ua585\ua586\ua587\ua588\ua589\ua58a\ua58b\ua58c\ua58d\ua58e\ua58f\ua590\ua591\ua592\ua593\ua594\ua595\ua596\ua597\ua598\ua599\ua59a\ua59b\ua59c\ua59d\ua59e\ua59f\ua5a0\ua5a1\ua5a2\ua5a3\ua5a4\ua5a5\ua5a6\ua5a7\ua5a8\ua5a9\ua5aa\ua5ab\ua5ac\ua5ad\ua5ae\ua5af\ua5b0\ua5b1\ua5b2\ua5b3\ua5b4\ua5b5\ua5b6\ua5b7\ua5b8\ua5b9\ua5ba\ua5bb\ua5bc\ua5bd\ua5be\ua5bf\ua5c0\ua5c1\ua5c2\ua5c3\ua5c4\ua5c5\ua5c6\ua5c7\ua5c8\ua5c9\ua5ca\ua5cb\ua5cc\ua5cd\ua5ce\ua5cf\ua5d0\ua5d1\ua5d2\ua5d3\ua5d4\ua5d5\ua5d6\ua5d7\ua5d8\ua5d9\ua5da\ua5db\ua5dc\ua5dd\ua5de\ua5df\ua5e0\ua5e1\ua5e2\ua5e3\ua5e4\ua5e5\ua5e6\ua5e7\ua5e8\ua5e9\ua5ea\ua5eb\ua5ec\ua5ed\ua5ee\ua5ef\ua5f0\ua5f1\ua5f2\ua5f3\ua5f4\ua5f5\ua5f6\ua5f7\ua5f8\ua5f9\ua5fa\ua5fb\ua5fc\ua5fd\ua5fe\ua5ff\ua600\ua601\ua602\ua603\ua604\ua605\ua606\ua607\ua608\ua609\ua60a\ua60b\ua60c\ua60d\ua60e\ua60f\ua610\ua611\ua612\ua613\ua614\ua615\ua616\ua617\ua618\ua619\ua61a\ua61b\ua61c\ua61d\ua61e\ua61f\ua620\ua621\ua622\ua623\ua624\ua625\ua626\ua627\ua628\ua629\ua62a\ua62b\ua62c\ua62d\ua62e\ua62f\ua630\ua631\ua632\ua633\ua634\ua635\ua636\ua637\ua638\ua639\ua63a\ua63b\ua63c\ua63d\ua63e\ua63f\ua640\ua641\ua642\ua643\ua644\ua645\ua646\ua647\ua648\ua649\ua64a\ua64b\ua64c\ua64d\ua64e\ua64f\ua650\ua651\ua652\ua653\ua654\ua655\ua656\ua657\ua658\ua659\ua65a\ua65b\ua65c\ua65d\ua65e\ua65f\ua660\ua661\ua662\ua663\ua664\ua665\ua666\ua667\ua668\ua669\ua66a\ua66b\ua66c\ua66d\ua66e\ua66f\ua670\ua671\ua672\ua673\ua674\ua675\ua676\ua677\ua678\ua679\ua67a\ua67b\ua67c\ua67d\ua67e\ua67f\ua680\ua681\ua682\ua683\ua684\ua685\ua686\ua687\ua688\ua689\ua68a\ua68b\ua68c\ua68d\ua68e\ua68f\ua690\ua691\ua692\ua693\ua694\ua695\ua696\ua697\ua698\ua699\ua69a\ua69b\ua69c\ua69d\ua69e\ua69f\ua6a0\ua6a1\ua6a2\ua6a3\ua6a4\ua6a5\ua6a6\ua6a7\ua6a8\ua6a9\ua6aa\ua6ab\ua6ac\ua6ad\ua6ae\ua6af\ua6b0\ua6b1\ua6b2\ua6b3\ua6b4\ua6b5\ua6b6\ua6b7\ua6b8\ua6b9\ua6ba\ua6bb\ua6bc\ua6bd\ua6be\ua6bf\ua6c0\ua6c1\ua6c2\ua6c3\ua6c4\ua6c5\ua6c6\ua6c7\ua6c8\ua6c9\ua6ca\ua6cb\ua6cc\ua6cd\ua6ce\ua6cf\ua6d0\ua6d1\ua6d2\ua6d3\ua6d4\ua6d5\ua6d6\ua6d7\ua6d8\ua6d9\ua6da\ua6db\ua6dc\ua6dd\ua6de\ua6df\ua6e0\ua6e1\ua6e2\ua6e3\ua6e4\ua6e5\ua6e6\ua6e7\ua6e8\ua6e9\ua6ea\ua6eb\ua6ec\ua6ed\ua6ee\ua6ef\ua6f0\ua6f1\ua6f2\ua6f3\ua6f4\ua6f5\ua6f6\ua6f7\ua6f8\ua6f9\ua6fa\ua6fb\ua6fc\ua6fd\ua6fe\ua6ff\ua717\ua718\ua719\ua71a\ua71b\ua71c\ua71d\ua71e\ua71f\ua720\ua721\ua722\ua723\ua724\ua725\ua726\ua727\ua728\ua729\ua72a\ua72b\ua72c\ua72d\ua72e\ua72f\ua730\ua731\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua739\ua73a\ua73b\ua73c\ua73d\ua73e\ua73f\ua740\ua741\ua742\ua743\ua744\ua745\ua746\ua747\ua748\ua749\ua74a\ua74b\ua74c\ua74d\ua74e\ua74f\ua750\ua751\ua752\ua753\ua754\ua755\ua756\ua757\ua758\ua759\ua75a\ua75b\ua75c\ua75d\ua75e\ua75f\ua760\ua761\ua762\ua763\ua764\ua765\ua766\ua767\ua768\ua769\ua76a\ua76b\ua76c\ua76d\ua76e\ua76f\ua770\ua771\ua772\ua773\ua774\ua775\ua776\ua777\ua778\ua779\ua77a\ua77b\ua77c\ua77d\ua77e\ua77f\ua780\ua781\ua782\ua783\ua784\ua785\ua786\ua787\ua788\ua789\ua78a\ua78b\ua78c\ua78d\ua78e\ua78f\ua790\ua791\ua792\ua793\ua794\ua795\ua796\ua797\ua798\ua799\ua79a\ua79b\ua79c\ua79d\ua79e\ua79f\ua7a0\ua7a1\ua7a2\ua7a3\ua7a4\ua7a5\ua7a6\ua7a7\ua7a8\ua7a9\ua7aa\ua7ab\ua7ac\ua7ad\ua7ae\ua7af\ua7b0\ua7b1\ua7b2\ua7b3\ua7b4\ua7b5\ua7b6\ua7b7\ua7b8\ua7b9\ua7ba\ua7bb\ua7bc\ua7bd\ua7be\ua7bf\ua7c0\ua7c1\ua7c2\ua7c3\ua7c4\ua7c5\ua7c6\ua7c7\ua7c8\ua7c9\ua7ca\ua7cb\ua7cc\ua7cd\ua7ce\ua7cf\ua7d0\ua7d1\ua7d2\ua7d3\ua7d4\ua7d5\ua7d6\ua7d7\ua7d8\ua7d9\ua7da\ua7db\ua7dc\ua7dd\ua7de\ua7df\ua7e0\ua7e1\ua7e2\ua7e3\ua7e4\ua7e5\ua7e6\ua7e7\ua7e8\ua7e9\ua7ea\ua7eb\ua7ec\ua7ed\ua7ee\ua7ef\ua7f0\ua7f1\ua7f2\ua7f3\ua7f4\ua7f5\ua7f6\ua7f7\ua7f8\ua7f9\ua7fa\ua7fb\ua7fc\ua7fd\ua7fe\ua7ff\ua82c\ua82d\ua82e\ua82f\ua830\ua831\ua832\ua833\ua834\ua835\ua836\ua837\ua838\ua839\ua83a\ua83b\ua83c\ua83d\ua83e\ua83f\ua840\ua841\ua842\ua843\ua844\ua845\ua846\ua847\ua848\ua849\ua84a\ua84b\ua84c\ua84d\ua84e\ua84f\ua850\ua851\ua852\ua853\ua854\ua855\ua856\ua857\ua858\ua859\ua85a\ua85b\ua85c\ua85d\ua85e\ua85f\ua860\ua861\ua862\ua863\ua864\ua865\ua866\ua867\ua868\ua869\ua86a\ua86b\ua86c\ua86d\ua86e\ua86f\ua870\ua871\ua872\ua873\ua874\ua875\ua876\ua877\ua878\ua879\ua87a\ua87b\ua87c\ua87d\ua87e\ua87f\ua880\ua881\ua882\ua883\ua884\ua885\ua886\ua887\ua888\ua889\ua88a\ua88b\ua88c\ua88d\ua88e\ua88f\ua890\ua891\ua892\ua893\ua894\ua895\ua896\ua897\ua898\ua899\ua89a\ua89b\ua89c\ua89d\ua89e\ua89f\ua8a0\ua8a1\ua8a2\ua8a3\ua8a4\ua8a5\ua8a6\ua8a7\ua8a8\ua8a9\ua8aa\ua8ab\ua8ac\ua8ad\ua8ae\ua8af\ua8b0\ua8b1\ua8b2\ua8b3\ua8b4\ua8b5\ua8b6\ua8b7\ua8b8\ua8b9\ua8ba\ua8bb\ua8bc\ua8bd\ua8be\ua8bf\ua8c0\ua8c1\ua8c2\ua8c3\ua8c4\ua8c5\ua8c6\ua8c7\ua8c8\ua8c9\ua8ca\ua8cb\ua8cc\ua8cd\ua8ce\ua8cf\ua8d0\ua8d1\ua8d2\ua8d3\ua8d4\ua8d5\ua8d6\ua8d7\ua8d8\ua8d9\ua8da\ua8db\ua8dc\ua8dd\ua8de\ua8df\ua8e0\ua8e1\ua8e2\ua8e3\ua8e4\ua8e5\ua8e6\ua8e7\ua8e8\ua8e9\ua8ea\ua8eb\ua8ec\ua8ed\ua8ee\ua8ef\ua8f0\ua8f1\ua8f2\ua8f3\ua8f4\ua8f5\ua8f6\ua8f7\ua8f8\ua8f9\ua8fa\ua8fb\ua8fc\ua8fd\ua8fe\ua8ff\ua900\ua901\ua902\ua903\ua904\ua905\ua906\ua907\ua908\ua909\ua90a\ua90b\ua90c\ua90d\ua90e\ua90f\ua910\ua911\ua912\ua913\ua914\ua915\ua916\ua917\ua918\ua919\ua91a\ua91b\ua91c\ua91d\ua91e\ua91f\ua920\ua921\ua922\ua923\ua924\ua925\ua926\ua927\ua928\ua929\ua92a\ua92b\ua92c\ua92d\ua92e\ua92f\ua930\ua931\ua932\ua933\ua934\ua935\ua936\ua937\ua938\ua939\ua93a\ua93b\ua93c\ua93d\ua93e\ua93f\ua940\ua941\ua942\ua943\ua944\ua945\ua946\ua947\ua948\ua949\ua94a\ua94b\ua94c\ua94d\ua94e\ua94f\ua950\ua951\ua952\ua953\ua954\ua955\ua956\ua957\ua958\ua959\ua95a\ua95b\ua95c\ua95d\ua95e\ua95f\ua960\ua961\ua962\ua963\ua964\ua965\ua966\ua967\ua968\ua969\ua96a\ua96b\ua96c\ua96d\ua96e\ua96f\ua970\ua971\ua972\ua973\ua974\ua975\ua976\ua977\ua978\ua979\ua97a\ua97b\ua97c\ua97d\ua97e\ua97f\ua980\ua981\ua982\ua983\ua984\ua985\ua986\ua987\ua988\ua989\ua98a\ua98b\ua98c\ua98d\ua98e\ua98f\ua990\ua991\ua992\ua993\ua994\ua995\ua996\ua997\ua998\ua999\ua99a\ua99b\ua99c\ua99d\ua99e\ua99f\ua9a0\ua9a1\ua9a2\ua9a3\ua9a4\ua9a5\ua9a6\ua9a7\ua9a8\ua9a9\ua9aa\ua9ab\ua9ac\ua9ad\ua9ae\ua9af\ua9b0\ua9b1\ua9b2\ua9b3\ua9b4\ua9b5\ua9b6\ua9b7\ua9b8\ua9b9\ua9ba\ua9bb\ua9bc\ua9bd\ua9be\ua9bf\ua9c0\ua9c1\ua9c2\ua9c3\ua9c4\ua9c5\ua9c6\ua9c7\ua9c8\ua9c9\ua9ca\ua9cb\ua9cc\ua9cd\ua9ce\ua9cf\ua9d0\ua9d1\ua9d2\ua9d3\ua9d4\ua9d5\ua9d6\ua9d7\ua9d8\ua9d9\ua9da\ua9db\ua9dc\ua9dd\ua9de\ua9df\ua9e0\ua9e1\ua9e2\ua9e3\ua9e4\ua9e5\ua9e6\ua9e7\ua9e8\ua9e9\ua9ea\ua9eb\ua9ec\ua9ed\ua9ee\ua9ef\ua9f0\ua9f1\ua9f2\ua9f3\ua9f4\ua9f5\ua9f6\ua9f7\ua9f8\ua9f9\ua9fa\ua9fb\ua9fc\ua9fd\ua9fe\ua9ff\uaa00\uaa01\uaa02\uaa03\uaa04\uaa05\uaa06\uaa07\uaa08\uaa09\uaa0a\uaa0b\uaa0c\uaa0d\uaa0e\uaa0f\uaa10\uaa11\uaa12\uaa13\uaa14\uaa15\uaa16\uaa17\uaa18\uaa19\uaa1a\uaa1b\uaa1c\uaa1d\uaa1e\uaa1f\uaa20\uaa21\uaa22\uaa23\uaa24\uaa25\uaa26\uaa27\uaa28\uaa29\uaa2a\uaa2b\uaa2c\uaa2d\uaa2e\uaa2f\uaa30\uaa31\uaa32\uaa33\uaa34\uaa35\uaa36\uaa37\uaa38\uaa39\uaa3a\uaa3b\uaa3c\uaa3d\uaa3e\uaa3f\uaa40\uaa41\uaa42\uaa43\uaa44\uaa45\uaa46\uaa47\uaa48\uaa49\uaa4a\uaa4b\uaa4c\uaa4d\uaa4e\uaa4f\uaa50\uaa51\uaa52\uaa53\uaa54\uaa55\uaa56\uaa57\uaa58\uaa59\uaa5a\uaa5b\uaa5c\uaa5d\uaa5e\uaa5f\uaa60\uaa61\uaa62\uaa63\uaa64\uaa65\uaa66\uaa67\uaa68\uaa69\uaa6a\uaa6b\uaa6c\uaa6d\uaa6e\uaa6f\uaa70\uaa71\uaa72\uaa73\uaa74\uaa75\uaa76\uaa77\uaa78\uaa79\uaa7a\uaa7b\uaa7c\uaa7d\uaa7e\uaa7f\uaa80\uaa81\uaa82\uaa83\uaa84\uaa85\uaa86\uaa87\uaa88\uaa89\uaa8a\uaa8b\uaa8c\uaa8d\uaa8e\uaa8f\uaa90\uaa91\uaa92\uaa93\uaa94\uaa95\uaa96\uaa97\uaa98\uaa99\uaa9a\uaa9b\uaa9c\uaa9d\uaa9e\uaa9f\uaaa0\uaaa1\uaaa2\uaaa3\uaaa4\uaaa5\uaaa6\uaaa7\uaaa8\uaaa9\uaaaa\uaaab\uaaac\uaaad\uaaae\uaaaf\uaab0\uaab1\uaab2\uaab3\uaab4\uaab5\uaab6\uaab7\uaab8\uaab9\uaaba\uaabb\uaabc\uaabd\uaabe\uaabf\uaac0\uaac1\uaac2\uaac3\uaac4\uaac5\uaac6\uaac7\uaac8\uaac9\uaaca\uaacb\uaacc\uaacd\uaace\uaacf\uaad0\uaad1\uaad2\uaad3\uaad4\uaad5\uaad6\uaad7\uaad8\uaad9\uaada\uaadb\uaadc\uaadd\uaade\uaadf\uaae0\uaae1\uaae2\uaae3\uaae4\uaae5\uaae6\uaae7\uaae8\uaae9\uaaea\uaaeb\uaaec\uaaed\uaaee\uaaef\uaaf0\uaaf1\uaaf2\uaaf3\uaaf4\uaaf5\uaaf6\uaaf7\uaaf8\uaaf9\uaafa\uaafb\uaafc\uaafd\uaafe\uaaff\uab00\uab01\uab02\uab03\uab04\uab05\uab06\uab07\uab08\uab09\uab0a\uab0b\uab0c\uab0d\uab0e\uab0f\uab10\uab11\uab12\uab13\uab14\uab15\uab16\uab17\uab18\uab19\uab1a\uab1b\uab1c\uab1d\uab1e\uab1f\uab20\uab21\uab22\uab23\uab24\uab25\uab26\uab27\uab28\uab29\uab2a\uab2b\uab2c\uab2d\uab2e\uab2f\uab30\uab31\uab32\uab33\uab34\uab35\uab36\uab37\uab38\uab39\uab3a\uab3b\uab3c\uab3d\uab3e\uab3f\uab40\uab41\uab42\uab43\uab44\uab45\uab46\uab47\uab48\uab49\uab4a\uab4b\uab4c\uab4d\uab4e\uab4f\uab50\uab51\uab52\uab53\uab54\uab55\uab56\uab57\uab58\uab59\uab5a\uab5b\uab5c\uab5d\uab5e\uab5f\uab60\uab61\uab62\uab63\uab64\uab65\uab66\uab67\uab68\uab69\uab6a\uab6b\uab6c\uab6d\uab6e\uab6f\uab70\uab71\uab72\uab73\uab74\uab75\uab76\uab77\uab78\uab79\uab7a\uab7b\uab7c\uab7d\uab7e\uab7f\uab80\uab81\uab82\uab83\uab84\uab85\uab86\uab87\uab88\uab89\uab8a\uab8b\uab8c\uab8d\uab8e\uab8f\uab90\uab91\uab92\uab93\uab94\uab95\uab96\uab97\uab98\uab99\uab9a\uab9b\uab9c\uab9d\uab9e\uab9f\uaba0\uaba1\uaba2\uaba3\uaba4\uaba5\uaba6\uaba7\uaba8\uaba9\uabaa\uabab\uabac\uabad\uabae\uabaf\uabb0\uabb1\uabb2\uabb3\uabb4\uabb5\uabb6\uabb7\uabb8\uabb9\uabba\uabbb\uabbc\uabbd\uabbe\uabbf\uabc0\uabc1\uabc2\uabc3\uabc4\uabc5\uabc6\uabc7\uabc8\uabc9\uabca\uabcb\uabcc\uabcd\uabce\uabcf\uabd0\uabd1\uabd2\uabd3\uabd4\uabd5\uabd6\uabd7\uabd8\uabd9\uabda\uabdb\uabdc\uabdd\uabde\uabdf\uabe0\uabe1\uabe2\uabe3\uabe4\uabe5\uabe6\uabe7\uabe8\uabe9\uabea\uabeb\uabec\uabed\uabee\uabef\uabf0\uabf1\uabf2\uabf3\uabf4\uabf5\uabf6\uabf7\uabf8\uabf9\uabfa\uabfb\uabfc\uabfd\uabfe\uabff\ud7a4\ud7a5\ud7a6\ud7a7\ud7a8\ud7a9\ud7aa\ud7ab\ud7ac\ud7ad\ud7ae\ud7af\ud7b0\ud7b1\ud7b2\ud7b3\ud7b4\ud7b5\ud7b6\ud7b7\ud7b8\ud7b9\ud7ba\ud7bb\ud7bc\ud7bd\ud7be\ud7bf\ud7c0\ud7c1\ud7c2\ud7c3\ud7c4\ud7c5\ud7c6\ud7c7\ud7c8\ud7c9\ud7ca\ud7cb\ud7cc\ud7cd\ud7ce\ud7cf\ud7d0\ud7d1\ud7d2\ud7d3\ud7d4\ud7d5\ud7d6\ud7d7\ud7d8\ud7d9\ud7da\ud7db\ud7dc\ud7dd\ud7de\ud7df\ud7e0\ud7e1\ud7e2\ud7e3\ud7e4\ud7e5\ud7e6\ud7e7\ud7e8\ud7e9\ud7ea\ud7eb\ud7ec\ud7ed\ud7ee\ud7ef\ud7f0\ud7f1\ud7f2\ud7f3\ud7f4\ud7f5\ud7f6\ud7f7\ud7f8\ud7f9\ud7fa\ud7fb\ud7fc\ud7fd\ud7fe\ud7ff\ufa2e\ufa2f\ufa6b\ufa6c\ufa6d\ufa6e\ufa6f\ufada\ufadb\ufadc\ufadd\ufade\ufadf\ufae0\ufae1\ufae2\ufae3\ufae4\ufae5\ufae6\ufae7\ufae8\ufae9\ufaea\ufaeb\ufaec\ufaed\ufaee\ufaef\ufaf0\ufaf1\ufaf2\ufaf3\ufaf4\ufaf5\ufaf6\ufaf7\ufaf8\ufaf9\ufafa\ufafb\ufafc\ufafd\ufafe\ufaff\ufb07\ufb08\ufb09\ufb0a\ufb0b\ufb0c\ufb0d\ufb0e\ufb0f\ufb10\ufb11\ufb12\ufb18\ufb19\ufb1a\ufb1b\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbb2\ufbb3\ufbb4\ufbb5\ufbb6\ufbb7\ufbb8\ufbb9\ufbba\ufbbb\ufbbc\ufbbd\ufbbe\ufbbf\ufbc0\ufbc1\ufbc2\ufbc3\ufbc4\ufbc5\ufbc6\ufbc7\ufbc8\ufbc9\ufbca\ufbcb\ufbcc\ufbcd\ufbce\ufbcf\ufbd0\ufbd1\ufbd2\ufd40\ufd41\ufd42\ufd43\ufd44\ufd45\ufd46\ufd47\ufd48\ufd49\ufd4a\ufd4b\ufd4c\ufd4d\ufd4e\ufd4f\ufd90\ufd91\ufdc8\ufdc9\ufdca\ufdcb\ufdcc\ufdcd\ufdce\ufdcf\ufdd0\ufdd1\ufdd2\ufdd3\ufdd4\ufdd5\ufdd6\ufdd7\ufdd8\ufdd9\ufdda\ufddb\ufddc\ufddd\ufdde\ufddf\ufde0\ufde1\ufde2\ufde3\ufde4\ufde5\ufde6\ufde7\ufde8\ufde9\ufdea\ufdeb\ufdec\ufded\ufdee\ufdef\ufdfe\ufdff\ufe1a\ufe1b\ufe1c\ufe1d\ufe1e\ufe1f\ufe24\ufe25\ufe26\ufe27\ufe28\ufe29\ufe2a\ufe2b\ufe2c\ufe2d\ufe2e\ufe2f\ufe53\ufe67\ufe6c\ufe6d\ufe6e\ufe6f\ufe75\ufefd\ufefe\uff00\uffbf\uffc0\uffc1\uffc8\uffc9\uffd0\uffd1\uffd8\uffd9\uffdd\uffde\uffdf\uffe7\uffef\ufff0\ufff1\ufff2\ufff3\ufff4\ufff5\ufff6\ufff7\ufff8\ufffe'
-
-Co = u'\ue000\ue001\ue002\ue003\ue004\ue005\ue006\ue007\ue008\ue009\ue00a\ue00b\ue00c\ue00d\ue00e\ue00f\ue010\ue011\ue012\ue013\ue014\ue015\ue016\ue017\ue018\ue019\ue01a\ue01b\ue01c\ue01d\ue01e\ue01f\ue020\ue021\ue022\ue023\ue024\ue025\ue026\ue027\ue028\ue029\ue02a\ue02b\ue02c\ue02d\ue02e\ue02f\ue030\ue031\ue032\ue033\ue034\ue035\ue036\ue037\ue038\ue039\ue03a\ue03b\ue03c\ue03d\ue03e\ue03f\ue040\ue041\ue042\ue043\ue044\ue045\ue046\ue047\ue048\ue049\ue04a\ue04b\ue04c\ue04d\ue04e\ue04f\ue050\ue051\ue052\ue053\ue054\ue055\ue056\ue057\ue058\ue059\ue05a\ue05b\ue05c\ue05d\ue05e\ue05f\ue060\ue061\ue062\ue063\ue064\ue065\ue066\ue067\ue068\ue069\ue06a\ue06b\ue06c\ue06d\ue06e\ue06f\ue070\ue071\ue072\ue073\ue074\ue075\ue076\ue077\ue078\ue079\ue07a\ue07b\ue07c\ue07d\ue07e\ue07f\ue080\ue081\ue082\ue083\ue084\ue085\ue086\ue087\ue088\ue089\ue08a\ue08b\ue08c\ue08d\ue08e\ue08f\ue090\ue091\ue092\ue093\ue094\ue095\ue096\ue097\ue098\ue099\ue09a\ue09b\ue09c\ue09d\ue09e\ue09f\ue0a0\ue0a1\ue0a2\ue0a3\ue0a4\ue0a5\ue0a6\ue0a7\ue0a8\ue0a9\ue0aa\ue0ab\ue0ac\ue0ad\ue0ae\ue0af\ue0b0\ue0b1\ue0b2\ue0b3\ue0b4\ue0b5\ue0b6\ue0b7\ue0b8\ue0b9\ue0ba\ue0bb\ue0bc\ue0bd\ue0be\ue0bf\ue0c0\ue0c1\ue0c2\ue0c3\ue0c4\ue0c5\ue0c6\ue0c7\ue0c8\ue0c9\ue0ca\ue0cb\ue0cc\ue0cd\ue0ce\ue0cf\ue0d0\ue0d1\ue0d2\ue0d3\ue0d4\ue0d5\ue0d6\ue0d7\ue0d8\ue0d9\ue0da\ue0db\ue0dc\ue0dd\ue0de\ue0df\ue0e0\ue0e1\ue0e2\ue0e3\ue0e4\ue0e5\ue0e6\ue0e7\ue0e8\ue0e9\ue0ea\ue0eb\ue0ec\ue0ed\ue0ee\ue0ef\ue0f0\ue0f1\ue0f2\ue0f3\ue0f4\ue0f5\ue0f6\ue0f7\ue0f8\ue0f9\ue0fa\ue0fb\ue0fc\ue0fd\ue0fe\ue0ff\ue100\ue101\ue102\ue103\ue104\ue105\ue106\ue107\ue108\ue109\ue10a\ue10b\ue10c\ue10d\ue10e\ue10f\ue110\ue111\ue112\ue113\ue114\ue115\ue116\ue117\ue118\ue119\ue11a\ue11b\ue11c\ue11d\ue11e\ue11f\ue120\ue121\ue122\ue123\ue124\ue125\ue126\ue127\ue128\ue129\ue12a\ue12b\ue12c\ue12d\ue12e\ue12f\ue130\ue131\ue132\ue133\ue134\ue135\ue136\ue137\ue138\ue139\ue13a\ue13b\ue13c\ue13d\ue13e\ue13f\ue140\ue141\ue142\ue143\ue144\ue145\ue146\ue147\ue148\ue149\ue14a\ue14b\ue14c\ue14d\ue14e\ue14f\ue150\ue151\ue152\ue153\ue154\ue155\ue156\ue157\ue158\ue159\ue15a\ue15b\ue15c\ue15d\ue15e\ue15f\ue160\ue161\ue162\ue163\ue164\ue165\ue166\ue167\ue168\ue169\ue16a\ue16b\ue16c\ue16d\ue16e\ue16f\ue170\ue171\ue172\ue173\ue174\ue175\ue176\ue177\ue178\ue179\ue17a\ue17b\ue17c\ue17d\ue17e\ue17f\ue180\ue181\ue182\ue183\ue184\ue185\ue186\ue187\ue188\ue189\ue18a\ue18b\ue18c\ue18d\ue18e\ue18f\ue190\ue191\ue192\ue193\ue194\ue195\ue196\ue197\ue198\ue199\ue19a\ue19b\ue19c\ue19d\ue19e\ue19f\ue1a0\ue1a1\ue1a2\ue1a3\ue1a4\ue1a5\ue1a6\ue1a7\ue1a8\ue1a9\ue1aa\ue1ab\ue1ac\ue1ad\ue1ae\ue1af\ue1b0\ue1b1\ue1b2\ue1b3\ue1b4\ue1b5\ue1b6\ue1b7\ue1b8\ue1b9\ue1ba\ue1bb\ue1bc\ue1bd\ue1be\ue1bf\ue1c0\ue1c1\ue1c2\ue1c3\ue1c4\ue1c5\ue1c6\ue1c7\ue1c8\ue1c9\ue1ca\ue1cb\ue1cc\ue1cd\ue1ce\ue1cf\ue1d0\ue1d1\ue1d2\ue1d3\ue1d4\ue1d5\ue1d6\ue1d7\ue1d8\ue1d9\ue1da\ue1db\ue1dc\ue1dd\ue1de\ue1df\ue1e0\ue1e1\ue1e2\ue1e3\ue1e4\ue1e5\ue1e6\ue1e7\ue1e8\ue1e9\ue1ea\ue1eb\ue1ec\ue1ed\ue1ee\ue1ef\ue1f0\ue1f1\ue1f2\ue1f3\ue1f4\ue1f5\ue1f6\ue1f7\ue1f8\ue1f9\ue1fa\ue1fb\ue1fc\ue1fd\ue1fe\ue1ff\ue200\ue201\ue202\ue203\ue204\ue205\ue206\ue207\ue208\ue209\ue20a\ue20b\ue20c\ue20d\ue20e\ue20f\ue210\ue211\ue212\ue213\ue214\ue215\ue216\ue217\ue218\ue219\ue21a\ue21b\ue21c\ue21d\ue21e\ue21f\ue220\ue221\ue222\ue223\ue224\ue225\ue226\ue227\ue228\ue229\ue22a\ue22b\ue22c\ue22d\ue22e\ue22f\ue230\ue231\ue232\ue233\ue234\ue235\ue236\ue237\ue238\ue239\ue23a\ue23b\ue23c\ue23d\ue23e\ue23f\ue240\ue241\ue242\ue243\ue244\ue245\ue246\ue247\ue248\ue249\ue24a\ue24b\ue24c\ue24d\ue24e\ue24f\ue250\ue251\ue252\ue253\ue254\ue255\ue256\ue257\ue258\ue259\ue25a\ue25b\ue25c\ue25d\ue25e\ue25f\ue260\ue261\ue262\ue263\ue264\ue265\ue266\ue267\ue268\ue269\ue26a\ue26b\ue26c\ue26d\ue26e\ue26f\ue270\ue271\ue272\ue273\ue274\ue275\ue276\ue277\ue278\ue279\ue27a\ue27b\ue27c\ue27d\ue27e\ue27f\ue280\ue281\ue282\ue283\ue284\ue285\ue286\ue287\ue288\ue289\ue28a\ue28b\ue28c\ue28d\ue28e\ue28f\ue290\ue291\ue292\ue293\ue294\ue295\ue296\ue297\ue298\ue299\ue29a\ue29b\ue29c\ue29d\ue29e\ue29f\ue2a0\ue2a1\ue2a2\ue2a3\ue2a4\ue2a5\ue2a6\ue2a7\ue2a8\ue2a9\ue2aa\ue2ab\ue2ac\ue2ad\ue2ae\ue2af\ue2b0\ue2b1\ue2b2\ue2b3\ue2b4\ue2b5\ue2b6\ue2b7\ue2b8\ue2b9\ue2ba\ue2bb\ue2bc\ue2bd\ue2be\ue2bf\ue2c0\ue2c1\ue2c2\ue2c3\ue2c4\ue2c5\ue2c6\ue2c7\ue2c8\ue2c9\ue2ca\ue2cb\ue2cc\ue2cd\ue2ce\ue2cf\ue2d0\ue2d1\ue2d2\ue2d3\ue2d4\ue2d5\ue2d6\ue2d7\ue2d8\ue2d9\ue2da\ue2db\ue2dc\ue2dd\ue2de\ue2df\ue2e0\ue2e1\ue2e2\ue2e3\ue2e4\ue2e5\ue2e6\ue2e7\ue2e8\ue2e9\ue2ea\ue2eb\ue2ec\ue2ed\ue2ee\ue2ef\ue2f0\ue2f1\ue2f2\ue2f3\ue2f4\ue2f5\ue2f6\ue2f7\ue2f8\ue2f9\ue2fa\ue2fb\ue2fc\ue2fd\ue2fe\ue2ff\ue300\ue301\ue302\ue303\ue304\ue305\ue306\ue307\ue308\ue309\ue30a\ue30b\ue30c\ue30d\ue30e\ue30f\ue310\ue311\ue312\ue313\ue314\ue315\ue316\ue317\ue318\ue319\ue31a\ue31b\ue31c\ue31d\ue31e\ue31f\ue320\ue321\ue322\ue323\ue324\ue325\ue326\ue327\ue328\ue329\ue32a\ue32b\ue32c\ue32d\ue32e\ue32f\ue330\ue331\ue332\ue333\ue334\ue335\ue336\ue337\ue338\ue339\ue33a\ue33b\ue33c\ue33d\ue33e\ue33f\ue340\ue341\ue342\ue343\ue344\ue345\ue346\ue347\ue348\ue349\ue34a\ue34b\ue34c\ue34d\ue34e\ue34f\ue350\ue351\ue352\ue353\ue354\ue355\ue356\ue357\ue358\ue359\ue35a\ue35b\ue35c\ue35d\ue35e\ue35f\ue360\ue361\ue362\ue363\ue364\ue365\ue366\ue367\ue368\ue369\ue36a\ue36b\ue36c\ue36d\ue36e\ue36f\ue370\ue371\ue372\ue373\ue374\ue375\ue376\ue377\ue378\ue379\ue37a\ue37b\ue37c\ue37d\ue37e\ue37f\ue380\ue381\ue382\ue383\ue384\ue385\ue386\ue387\ue388\ue389\ue38a\ue38b\ue38c\ue38d\ue38e\ue38f\ue390\ue391\ue392\ue393\ue394\ue395\ue396\ue397\ue398\ue399\ue39a\ue39b\ue39c\ue39d\ue39e\ue39f\ue3a0\ue3a1\ue3a2\ue3a3\ue3a4\ue3a5\ue3a6\ue3a7\ue3a8\ue3a9\ue3aa\ue3ab\ue3ac\ue3ad\ue3ae\ue3af\ue3b0\ue3b1\ue3b2\ue3b3\ue3b4\ue3b5\ue3b6\ue3b7\ue3b8\ue3b9\ue3ba\ue3bb\ue3bc\ue3bd\ue3be\ue3bf\ue3c0\ue3c1\ue3c2\ue3c3\ue3c4\ue3c5\ue3c6\ue3c7\ue3c8\ue3c9\ue3ca\ue3cb\ue3cc\ue3cd\ue3ce\ue3cf\ue3d0\ue3d1\ue3d2\ue3d3\ue3d4\ue3d5\ue3d6\ue3d7\ue3d8\ue3d9\ue3da\ue3db\ue3dc\ue3dd\ue3de\ue3df\ue3e0\ue3e1\ue3e2\ue3e3\ue3e4\ue3e5\ue3e6\ue3e7\ue3e8\ue3e9\ue3ea\ue3eb\ue3ec\ue3ed\ue3ee\ue3ef\ue3f0\ue3f1\ue3f2\ue3f3\ue3f4\ue3f5\ue3f6\ue3f7\ue3f8\ue3f9\ue3fa\ue3fb\ue3fc\ue3fd\ue3fe\ue3ff\ue400\ue401\ue402\ue403\ue404\ue405\ue406\ue407\ue408\ue409\ue40a\ue40b\ue40c\ue40d\ue40e\ue40f\ue410\ue411\ue412\ue413\ue414\ue415\ue416\ue417\ue418\ue419\ue41a\ue41b\ue41c\ue41d\ue41e\ue41f\ue420\ue421\ue422\ue423\ue424\ue425\ue426\ue427\ue428\ue429\ue42a\ue42b\ue42c\ue42d\ue42e\ue42f\ue430\ue431\ue432\ue433\ue434\ue435\ue436\ue437\ue438\ue439\ue43a\ue43b\ue43c\ue43d\ue43e\ue43f\ue440\ue441\ue442\ue443\ue444\ue445\ue446\ue447\ue448\ue449\ue44a\ue44b\ue44c\ue44d\ue44e\ue44f\ue450\ue451\ue452\ue453\ue454\ue455\ue456\ue457\ue458\ue459\ue45a\ue45b\ue45c\ue45d\ue45e\ue45f\ue460\ue461\ue462\ue463\ue464\ue465\ue466\ue467\ue468\ue469\ue46a\ue46b\ue46c\ue46d\ue46e\ue46f\ue470\ue471\ue472\ue473\ue474\ue475\ue476\ue477\ue478\ue479\ue47a\ue47b\ue47c\ue47d\ue47e\ue47f\ue480\ue481\ue482\ue483\ue484\ue485\ue486\ue487\ue488\ue489\ue48a\ue48b\ue48c\ue48d\ue48e\ue48f\ue490\ue491\ue492\ue493\ue494\ue495\ue496\ue497\ue498\ue499\ue49a\ue49b\ue49c\ue49d\ue49e\ue49f\ue4a0\ue4a1\ue4a2\ue4a3\ue4a4\ue4a5\ue4a6\ue4a7\ue4a8\ue4a9\ue4aa\ue4ab\ue4ac\ue4ad\ue4ae\ue4af\ue4b0\ue4b1\ue4b2\ue4b3\ue4b4\ue4b5\ue4b6\ue4b7\ue4b8\ue4b9\ue4ba\ue4bb\ue4bc\ue4bd\ue4be\ue4bf\ue4c0\ue4c1\ue4c2\ue4c3\ue4c4\ue4c5\ue4c6\ue4c7\ue4c8\ue4c9\ue4ca\ue4cb\ue4cc\ue4cd\ue4ce\ue4cf\ue4d0\ue4d1\ue4d2\ue4d3\ue4d4\ue4d5\ue4d6\ue4d7\ue4d8\ue4d9\ue4da\ue4db\ue4dc\ue4dd\ue4de\ue4df\ue4e0\ue4e1\ue4e2\ue4e3\ue4e4\ue4e5\ue4e6\ue4e7\ue4e8\ue4e9\ue4ea\ue4eb\ue4ec\ue4ed\ue4ee\ue4ef\ue4f0\ue4f1\ue4f2\ue4f3\ue4f4\ue4f5\ue4f6\ue4f7\ue4f8\ue4f9\ue4fa\ue4fb\ue4fc\ue4fd\ue4fe\ue4ff\ue500\ue501\ue502\ue503\ue504\ue505\ue506\ue507\ue508\ue509\ue50a\ue50b\ue50c\ue50d\ue50e\ue50f\ue510\ue511\ue512\ue513\ue514\ue515\ue516\ue517\ue518\ue519\ue51a\ue51b\ue51c\ue51d\ue51e\ue51f\ue520\ue521\ue522\ue523\ue524\ue525\ue526\ue527\ue528\ue529\ue52a\ue52b\ue52c\ue52d\ue52e\ue52f\ue530\ue531\ue532\ue533\ue534\ue535\ue536\ue537\ue538\ue539\ue53a\ue53b\ue53c\ue53d\ue53e\ue53f\ue540\ue541\ue542\ue543\ue544\ue545\ue546\ue547\ue548\ue549\ue54a\ue54b\ue54c\ue54d\ue54e\ue54f\ue550\ue551\ue552\ue553\ue554\ue555\ue556\ue557\ue558\ue559\ue55a\ue55b\ue55c\ue55d\ue55e\ue55f\ue560\ue561\ue562\ue563\ue564\ue565\ue566\ue567\ue568\ue569\ue56a\ue56b\ue56c\ue56d\ue56e\ue56f\ue570\ue571\ue572\ue573\ue574\ue575\ue576\ue577\ue578\ue579\ue57a\ue57b\ue57c\ue57d\ue57e\ue57f\ue580\ue581\ue582\ue583\ue584\ue585\ue586\ue587\ue588\ue589\ue58a\ue58b\ue58c\ue58d\ue58e\ue58f\ue590\ue591\ue592\ue593\ue594\ue595\ue596\ue597\ue598\ue599\ue59a\ue59b\ue59c\ue59d\ue59e\ue59f\ue5a0\ue5a1\ue5a2\ue5a3\ue5a4\ue5a5\ue5a6\ue5a7\ue5a8\ue5a9\ue5aa\ue5ab\ue5ac\ue5ad\ue5ae\ue5af\ue5b0\ue5b1\ue5b2\ue5b3\ue5b4\ue5b5\ue5b6\ue5b7\ue5b8\ue5b9\ue5ba\ue5bb\ue5bc\ue5bd\ue5be\ue5bf\ue5c0\ue5c1\ue5c2\ue5c3\ue5c4\ue5c5\ue5c6\ue5c7\ue5c8\ue5c9\ue5ca\ue5cb\ue5cc\ue5cd\ue5ce\ue5cf\ue5d0\ue5d1\ue5d2\ue5d3\ue5d4\ue5d5\ue5d6\ue5d7\ue5d8\ue5d9\ue5da\ue5db\ue5dc\ue5dd\ue5de\ue5df\ue5e0\ue5e1\ue5e2\ue5e3\ue5e4\ue5e5\ue5e6\ue5e7\ue5e8\ue5e9\ue5ea\ue5eb\ue5ec\ue5ed\ue5ee\ue5ef\ue5f0\ue5f1\ue5f2\ue5f3\ue5f4\ue5f5\ue5f6\ue5f7\ue5f8\ue5f9\ue5fa\ue5fb\ue5fc\ue5fd\ue5fe\ue5ff\ue600\ue601\ue602\ue603\ue604\ue605\ue606\ue607\ue608\ue609\ue60a\ue60b\ue60c\ue60d\ue60e\ue60f\ue610\ue611\ue612\ue613\ue614\ue615\ue616\ue617\ue618\ue619\ue61a\ue61b\ue61c\ue61d\ue61e\ue61f\ue620\ue621\ue622\ue623\ue624\ue625\ue626\ue627\ue628\ue629\ue62a\ue62b\ue62c\ue62d\ue62e\ue62f\ue630\ue631\ue632\ue633\ue634\ue635\ue636\ue637\ue638\ue639\ue63a\ue63b\ue63c\ue63d\ue63e\ue63f\ue640\ue641\ue642\ue643\ue644\ue645\ue646\ue647\ue648\ue649\ue64a\ue64b\ue64c\ue64d\ue64e\ue64f\ue650\ue651\ue652\ue653\ue654\ue655\ue656\ue657\ue658\ue659\ue65a\ue65b\ue65c\ue65d\ue65e\ue65f\ue660\ue661\ue662\ue663\ue664\ue665\ue666\ue667\ue668\ue669\ue66a\ue66b\ue66c\ue66d\ue66e\ue66f\ue670\ue671\ue672\ue673\ue674\ue675\ue676\ue677\ue678\ue679\ue67a\ue67b\ue67c\ue67d\ue67e\ue67f\ue680\ue681\ue682\ue683\ue684\ue685\ue686\ue687\ue688\ue689\ue68a\ue68b\ue68c\ue68d\ue68e\ue68f\ue690\ue691\ue692\ue693\ue694\ue695\ue696\ue697\ue698\ue699\ue69a\ue69b\ue69c\ue69d\ue69e\ue69f\ue6a0\ue6a1\ue6a2\ue6a3\ue6a4\ue6a5\ue6a6\ue6a7\ue6a8\ue6a9\ue6aa\ue6ab\ue6ac\ue6ad\ue6ae\ue6af\ue6b0\ue6b1\ue6b2\ue6b3\ue6b4\ue6b5\ue6b6\ue6b7\ue6b8\ue6b9\ue6ba\ue6bb\ue6bc\ue6bd\ue6be\ue6bf\ue6c0\ue6c1\ue6c2\ue6c3\ue6c4\ue6c5\ue6c6\ue6c7\ue6c8\ue6c9\ue6ca\ue6cb\ue6cc\ue6cd\ue6ce\ue6cf\ue6d0\ue6d1\ue6d2\ue6d3\ue6d4\ue6d5\ue6d6\ue6d7\ue6d8\ue6d9\ue6da\ue6db\ue6dc\ue6dd\ue6de\ue6df\ue6e0\ue6e1\ue6e2\ue6e3\ue6e4\ue6e5\ue6e6\ue6e7\ue6e8\ue6e9\ue6ea\ue6eb\ue6ec\ue6ed\ue6ee\ue6ef\ue6f0\ue6f1\ue6f2\ue6f3\ue6f4\ue6f5\ue6f6\ue6f7\ue6f8\ue6f9\ue6fa\ue6fb\ue6fc\ue6fd\ue6fe\ue6ff\ue700\ue701\ue702\ue703\ue704\ue705\ue706\ue707\ue708\ue709\ue70a\ue70b\ue70c\ue70d\ue70e\ue70f\ue710\ue711\ue712\ue713\ue714\ue715\ue716\ue717\ue718\ue719\ue71a\ue71b\ue71c\ue71d\ue71e\ue71f\ue720\ue721\ue722\ue723\ue724\ue725\ue726\ue727\ue728\ue729\ue72a\ue72b\ue72c\ue72d\ue72e\ue72f\ue730\ue731\ue732\ue733\ue734\ue735\ue736\ue737\ue738\ue739\ue73a\ue73b\ue73c\ue73d\ue73e\ue73f\ue740\ue741\ue742\ue743\ue744\ue745\ue746\ue747\ue748\ue749\ue74a\ue74b\ue74c\ue74d\ue74e\ue74f\ue750\ue751\ue752\ue753\ue754\ue755\ue756\ue757\ue758\ue759\ue75a\ue75b\ue75c\ue75d\ue75e\ue75f\ue760\ue761\ue762\ue763\ue764\ue765\ue766\ue767\ue768\ue769\ue76a\ue76b\ue76c\ue76d\ue76e\ue76f\ue770\ue771\ue772\ue773\ue774\ue775\ue776\ue777\ue778\ue779\ue77a\ue77b\ue77c\ue77d\ue77e\ue77f\ue780\ue781\ue782\ue783\ue784\ue785\ue786\ue787\ue788\ue789\ue78a\ue78b\ue78c\ue78d\ue78e\ue78f\ue790\ue791\ue792\ue793\ue794\ue795\ue796\ue797\ue798\ue799\ue79a\ue79b\ue79c\ue79d\ue79e\ue79f\ue7a0\ue7a1\ue7a2\ue7a3\ue7a4\ue7a5\ue7a6\ue7a7\ue7a8\ue7a9\ue7aa\ue7ab\ue7ac\ue7ad\ue7ae\ue7af\ue7b0\ue7b1\ue7b2\ue7b3\ue7b4\ue7b5\ue7b6\ue7b7\ue7b8\ue7b9\ue7ba\ue7bb\ue7bc\ue7bd\ue7be\ue7bf\ue7c0\ue7c1\ue7c2\ue7c3\ue7c4\ue7c5\ue7c6\ue7c7\ue7c8\ue7c9\ue7ca\ue7cb\ue7cc\ue7cd\ue7ce\ue7cf\ue7d0\ue7d1\ue7d2\ue7d3\ue7d4\ue7d5\ue7d6\ue7d7\ue7d8\ue7d9\ue7da\ue7db\ue7dc\ue7dd\ue7de\ue7df\ue7e0\ue7e1\ue7e2\ue7e3\ue7e4\ue7e5\ue7e6\ue7e7\ue7e8\ue7e9\ue7ea\ue7eb\ue7ec\ue7ed\ue7ee\ue7ef\ue7f0\ue7f1\ue7f2\ue7f3\ue7f4\ue7f5\ue7f6\ue7f7\ue7f8\ue7f9\ue7fa\ue7fb\ue7fc\ue7fd\ue7fe\ue7ff\ue800\ue801\ue802\ue803\ue804\ue805\ue806\ue807\ue808\ue809\ue80a\ue80b\ue80c\ue80d\ue80e\ue80f\ue810\ue811\ue812\ue813\ue814\ue815\ue816\ue817\ue818\ue819\ue81a\ue81b\ue81c\ue81d\ue81e\ue81f\ue820\ue821\ue822\ue823\ue824\ue825\ue826\ue827\ue828\ue829\ue82a\ue82b\ue82c\ue82d\ue82e\ue82f\ue830\ue831\ue832\ue833\ue834\ue835\ue836\ue837\ue838\ue839\ue83a\ue83b\ue83c\ue83d\ue83e\ue83f\ue840\ue841\ue842\ue843\ue844\ue845\ue846\ue847\ue848\ue849\ue84a\ue84b\ue84c\ue84d\ue84e\ue84f\ue850\ue851\ue852\ue853\ue854\ue855\ue856\ue857\ue858\ue859\ue85a\ue85b\ue85c\ue85d\ue85e\ue85f\ue860\ue861\ue862\ue863\ue864\ue865\ue866\ue867\ue868\ue869\ue86a\ue86b\ue86c\ue86d\ue86e\ue86f\ue870\ue871\ue872\ue873\ue874\ue875\ue876\ue877\ue878\ue879\ue87a\ue87b\ue87c\ue87d\ue87e\ue87f\ue880\ue881\ue882\ue883\ue884\ue885\ue886\ue887\ue888\ue889\ue88a\ue88b\ue88c\ue88d\ue88e\ue88f\ue890\ue891\ue892\ue893\ue894\ue895\ue896\ue897\ue898\ue899\ue89a\ue89b\ue89c\ue89d\ue89e\ue89f\ue8a0\ue8a1\ue8a2\ue8a3\ue8a4\ue8a5\ue8a6\ue8a7\ue8a8\ue8a9\ue8aa\ue8ab\ue8ac\ue8ad\ue8ae\ue8af\ue8b0\ue8b1\ue8b2\ue8b3\ue8b4\ue8b5\ue8b6\ue8b7\ue8b8\ue8b9\ue8ba\ue8bb\ue8bc\ue8bd\ue8be\ue8bf\ue8c0\ue8c1\ue8c2\ue8c3\ue8c4\ue8c5\ue8c6\ue8c7\ue8c8\ue8c9\ue8ca\ue8cb\ue8cc\ue8cd\ue8ce\ue8cf\ue8d0\ue8d1\ue8d2\ue8d3\ue8d4\ue8d5\ue8d6\ue8d7\ue8d8\ue8d9\ue8da\ue8db\ue8dc\ue8dd\ue8de\ue8df\ue8e0\ue8e1\ue8e2\ue8e3\ue8e4\ue8e5\ue8e6\ue8e7\ue8e8\ue8e9\ue8ea\ue8eb\ue8ec\ue8ed\ue8ee\ue8ef\ue8f0\ue8f1\ue8f2\ue8f3\ue8f4\ue8f5\ue8f6\ue8f7\ue8f8\ue8f9\ue8fa\ue8fb\ue8fc\ue8fd\ue8fe\ue8ff\ue900\ue901\ue902\ue903\ue904\ue905\ue906\ue907\ue908\ue909\ue90a\ue90b\ue90c\ue90d\ue90e\ue90f\ue910\ue911\ue912\ue913\ue914\ue915\ue916\ue917\ue918\ue919\ue91a\ue91b\ue91c\ue91d\ue91e\ue91f\ue920\ue921\ue922\ue923\ue924\ue925\ue926\ue927\ue928\ue929\ue92a\ue92b\ue92c\ue92d\ue92e\ue92f\ue930\ue931\ue932\ue933\ue934\ue935\ue936\ue937\ue938\ue939\ue93a\ue93b\ue93c\ue93d\ue93e\ue93f\ue940\ue941\ue942\ue943\ue944\ue945\ue946\ue947\ue948\ue949\ue94a\ue94b\ue94c\ue94d\ue94e\ue94f\ue950\ue951\ue952\ue953\ue954\ue955\ue956\ue957\ue958\ue959\ue95a\ue95b\ue95c\ue95d\ue95e\ue95f\ue960\ue961\ue962\ue963\ue964\ue965\ue966\ue967\ue968\ue969\ue96a\ue96b\ue96c\ue96d\ue96e\ue96f\ue970\ue971\ue972\ue973\ue974\ue975\ue976\ue977\ue978\ue979\ue97a\ue97b\ue97c\ue97d\ue97e\ue97f\ue980\ue981\ue982\ue983\ue984\ue985\ue986\ue987\ue988\ue989\ue98a\ue98b\ue98c\ue98d\ue98e\ue98f\ue990\ue991\ue992\ue993\ue994\ue995\ue996\ue997\ue998\ue999\ue99a\ue99b\ue99c\ue99d\ue99e\ue99f\ue9a0\ue9a1\ue9a2\ue9a3\ue9a4\ue9a5\ue9a6\ue9a7\ue9a8\ue9a9\ue9aa\ue9ab\ue9ac\ue9ad\ue9ae\ue9af\ue9b0\ue9b1\ue9b2\ue9b3\ue9b4\ue9b5\ue9b6\ue9b7\ue9b8\ue9b9\ue9ba\ue9bb\ue9bc\ue9bd\ue9be\ue9bf\ue9c0\ue9c1\ue9c2\ue9c3\ue9c4\ue9c5\ue9c6\ue9c7\ue9c8\ue9c9\ue9ca\ue9cb\ue9cc\ue9cd\ue9ce\ue9cf\ue9d0\ue9d1\ue9d2\ue9d3\ue9d4\ue9d5\ue9d6\ue9d7\ue9d8\ue9d9\ue9da\ue9db\ue9dc\ue9dd\ue9de\ue9df\ue9e0\ue9e1\ue9e2\ue9e3\ue9e4\ue9e5\ue9e6\ue9e7\ue9e8\ue9e9\ue9ea\ue9eb\ue9ec\ue9ed\ue9ee\ue9ef\ue9f0\ue9f1\ue9f2\ue9f3\ue9f4\ue9f5\ue9f6\ue9f7\ue9f8\ue9f9\ue9fa\ue9fb\ue9fc\ue9fd\ue9fe\ue9ff\uea00\uea01\uea02\uea03\uea04\uea05\uea06\uea07\uea08\uea09\uea0a\uea0b\uea0c\uea0d\uea0e\uea0f\uea10\uea11\uea12\uea13\uea14\uea15\uea16\uea17\uea18\uea19\uea1a\uea1b\uea1c\uea1d\uea1e\uea1f\uea20\uea21\uea22\uea23\uea24\uea25\uea26\uea27\uea28\uea29\uea2a\uea2b\uea2c\uea2d\uea2e\uea2f\uea30\uea31\uea32\uea33\uea34\uea35\uea36\uea37\uea38\uea39\uea3a\uea3b\uea3c\uea3d\uea3e\uea3f\uea40\uea41\uea42\uea43\uea44\uea45\uea46\uea47\uea48\uea49\uea4a\uea4b\uea4c\uea4d\uea4e\uea4f\uea50\uea51\uea52\uea53\uea54\uea55\uea56\uea57\uea58\uea59\uea5a\uea5b\uea5c\uea5d\uea5e\uea5f\uea60\uea61\uea62\uea63\uea64\uea65\uea66\uea67\uea68\uea69\uea6a\uea6b\uea6c\uea6d\uea6e\uea6f\uea70\uea71\uea72\uea73\uea74\uea75\uea76\uea77\uea78\uea79\uea7a\uea7b\uea7c\uea7d\uea7e\uea7f\uea80\uea81\uea82\uea83\uea84\uea85\uea86\uea87\uea88\uea89\uea8a\uea8b\uea8c\uea8d\uea8e\uea8f\uea90\uea91\uea92\uea93\uea94\uea95\uea96\uea97\uea98\uea99\uea9a\uea9b\uea9c\uea9d\uea9e\uea9f\ueaa0\ueaa1\ueaa2\ueaa3\ueaa4\ueaa5\ueaa6\ueaa7\ueaa8\ueaa9\ueaaa\ueaab\ueaac\ueaad\ueaae\ueaaf\ueab0\ueab1\ueab2\ueab3\ueab4\ueab5\ueab6\ueab7\ueab8\ueab9\ueaba\ueabb\ueabc\ueabd\ueabe\ueabf\ueac0\ueac1\ueac2\ueac3\ueac4\ueac5\ueac6\ueac7\ueac8\ueac9\ueaca\ueacb\ueacc\ueacd\ueace\ueacf\uead0\uead1\uead2\uead3\uead4\uead5\uead6\uead7\uead8\uead9\ueada\ueadb\ueadc\ueadd\ueade\ueadf\ueae0\ueae1\ueae2\ueae3\ueae4\ueae5\ueae6\ueae7\ueae8\ueae9\ueaea\ueaeb\ueaec\ueaed\ueaee\ueaef\ueaf0\ueaf1\ueaf2\ueaf3\ueaf4\ueaf5\ueaf6\ueaf7\ueaf8\ueaf9\ueafa\ueafb\ueafc\ueafd\ueafe\ueaff\ueb00\ueb01\ueb02\ueb03\ueb04\ueb05\ueb06\ueb07\ueb08\ueb09\ueb0a\ueb0b\ueb0c\ueb0d\ueb0e\ueb0f\ueb10\ueb11\ueb12\ueb13\ueb14\ueb15\ueb16\ueb17\ueb18\ueb19\ueb1a\ueb1b\ueb1c\ueb1d\ueb1e\ueb1f\ueb20\ueb21\ueb22\ueb23\ueb24\ueb25\ueb26\ueb27\ueb28\ueb29\ueb2a\ueb2b\ueb2c\ueb2d\ueb2e\ueb2f\ueb30\ueb31\ueb32\ueb33\ueb34\ueb35\ueb36\ueb37\ueb38\ueb39\ueb3a\ueb3b\ueb3c\ueb3d\ueb3e\ueb3f\ueb40\ueb41\ueb42\ueb43\ueb44\ueb45\ueb46\ueb47\ueb48\ueb49\ueb4a\ueb4b\ueb4c\ueb4d\ueb4e\ueb4f\ueb50\ueb51\ueb52\ueb53\ueb54\ueb55\ueb56\ueb57\ueb58\ueb59\ueb5a\ueb5b\ueb5c\ueb5d\ueb5e\ueb5f\ueb60\ueb61\ueb62\ueb63\ueb64\ueb65\ueb66\ueb67\ueb68\ueb69\ueb6a\ueb6b\ueb6c\ueb6d\ueb6e\ueb6f\ueb70\ueb71\ueb72\ueb73\ueb74\ueb75\ueb76\ueb77\ueb78\ueb79\ueb7a\ueb7b\ueb7c\ueb7d\ueb7e\ueb7f\ueb80\ueb81\ueb82\ueb83\ueb84\ueb85\ueb86\ueb87\ueb88\ueb89\ueb8a\ueb8b\ueb8c\ueb8d\ueb8e\ueb8f\ueb90\ueb91\ueb92\ueb93\ueb94\ueb95\ueb96\ueb97\ueb98\ueb99\ueb9a\ueb9b\ueb9c\ueb9d\ueb9e\ueb9f\ueba0\ueba1\ueba2\ueba3\ueba4\ueba5\ueba6\ueba7\ueba8\ueba9\uebaa\uebab\uebac\uebad\uebae\uebaf\uebb0\uebb1\uebb2\uebb3\uebb4\uebb5\uebb6\uebb7\uebb8\uebb9\uebba\uebbb\uebbc\uebbd\uebbe\uebbf\uebc0\uebc1\uebc2\uebc3\uebc4\uebc5\uebc6\uebc7\uebc8\uebc9\uebca\uebcb\uebcc\uebcd\uebce\uebcf\uebd0\uebd1\uebd2\uebd3\uebd4\uebd5\uebd6\uebd7\uebd8\uebd9\uebda\uebdb\uebdc\uebdd\uebde\uebdf\uebe0\uebe1\uebe2\uebe3\uebe4\uebe5\uebe6\uebe7\uebe8\uebe9\uebea\uebeb\uebec\uebed\uebee\uebef\uebf0\uebf1\uebf2\uebf3\uebf4\uebf5\uebf6\uebf7\uebf8\uebf9\uebfa\uebfb\uebfc\uebfd\uebfe\uebff\uec00\uec01\uec02\uec03\uec04\uec05\uec06\uec07\uec08\uec09\uec0a\uec0b\uec0c\uec0d\uec0e\uec0f\uec10\uec11\uec12\uec13\uec14\uec15\uec16\uec17\uec18\uec19\uec1a\uec1b\uec1c\uec1d\uec1e\uec1f\uec20\uec21\uec22\uec23\uec24\uec25\uec26\uec27\uec28\uec29\uec2a\uec2b\uec2c\uec2d\uec2e\uec2f\uec30\uec31\uec32\uec33\uec34\uec35\uec36\uec37\uec38\uec39\uec3a\uec3b\uec3c\uec3d\uec3e\uec3f\uec40\uec41\uec42\uec43\uec44\uec45\uec46\uec47\uec48\uec49\uec4a\uec4b\uec4c\uec4d\uec4e\uec4f\uec50\uec51\uec52\uec53\uec54\uec55\uec56\uec57\uec58\uec59\uec5a\uec5b\uec5c\uec5d\uec5e\uec5f\uec60\uec61\uec62\uec63\uec64\uec65\uec66\uec67\uec68\uec69\uec6a\uec6b\uec6c\uec6d\uec6e\uec6f\uec70\uec71\uec72\uec73\uec74\uec75\uec76\uec77\uec78\uec79\uec7a\uec7b\uec7c\uec7d\uec7e\uec7f\uec80\uec81\uec82\uec83\uec84\uec85\uec86\uec87\uec88\uec89\uec8a\uec8b\uec8c\uec8d\uec8e\uec8f\uec90\uec91\uec92\uec93\uec94\uec95\uec96\uec97\uec98\uec99\uec9a\uec9b\uec9c\uec9d\uec9e\uec9f\ueca0\ueca1\ueca2\ueca3\ueca4\ueca5\ueca6\ueca7\ueca8\ueca9\uecaa\uecab\uecac\uecad\uecae\uecaf\uecb0\uecb1\uecb2\uecb3\uecb4\uecb5\uecb6\uecb7\uecb8\uecb9\uecba\uecbb\uecbc\uecbd\uecbe\uecbf\uecc0\uecc1\uecc2\uecc3\uecc4\uecc5\uecc6\uecc7\uecc8\uecc9\uecca\ueccb\ueccc\ueccd\uecce\ueccf\uecd0\uecd1\uecd2\uecd3\uecd4\uecd5\uecd6\uecd7\uecd8\uecd9\uecda\uecdb\uecdc\uecdd\uecde\uecdf\uece0\uece1\uece2\uece3\uece4\uece5\uece6\uece7\uece8\uece9\uecea\ueceb\uecec\ueced\uecee\uecef\uecf0\uecf1\uecf2\uecf3\uecf4\uecf5\uecf6\uecf7\uecf8\uecf9\uecfa\uecfb\uecfc\uecfd\uecfe\uecff\ued00\ued01\ued02\ued03\ued04\ued05\ued06\ued07\ued08\ued09\ued0a\ued0b\ued0c\ued0d\ued0e\ued0f\ued10\ued11\ued12\ued13\ued14\ued15\ued16\ued17\ued18\ued19\ued1a\ued1b\ued1c\ued1d\ued1e\ued1f\ued20\ued21\ued22\ued23\ued24\ued25\ued26\ued27\ued28\ued29\ued2a\ued2b\ued2c\ued2d\ued2e\ued2f\ued30\ued31\ued32\ued33\ued34\ued35\ued36\ued37\ued38\ued39\ued3a\ued3b\ued3c\ued3d\ued3e\ued3f\ued40\ued41\ued42\ued43\ued44\ued45\ued46\ued47\ued48\ued49\ued4a\ued4b\ued4c\ued4d\ued4e\ued4f\ued50\ued51\ued52\ued53\ued54\ued55\ued56\ued57\ued58\ued59\ued5a\ued5b\ued5c\ued5d\ued5e\ued5f\ued60\ued61\ued62\ued63\ued64\ued65\ued66\ued67\ued68\ued69\ued6a\ued6b\ued6c\ued6d\ued6e\ued6f\ued70\ued71\ued72\ued73\ued74\ued75\ued76\ued77\ued78\ued79\ued7a\ued7b\ued7c\ued7d\ued7e\ued7f\ued80\ued81\ued82\ued83\ued84\ued85\ued86\ued87\ued88\ued89\ued8a\ued8b\ued8c\ued8d\ued8e\ued8f\ued90\ued91\ued92\ued93\ued94\ued95\ued96\ued97\ued98\ued99\ued9a\ued9b\ued9c\ued9d\ued9e\ued9f\ueda0\ueda1\ueda2\ueda3\ueda4\ueda5\ueda6\ueda7\ueda8\ueda9\uedaa\uedab\uedac\uedad\uedae\uedaf\uedb0\uedb1\uedb2\uedb3\uedb4\uedb5\uedb6\uedb7\uedb8\uedb9\uedba\uedbb\uedbc\uedbd\uedbe\uedbf\uedc0\uedc1\uedc2\uedc3\uedc4\uedc5\uedc6\uedc7\uedc8\uedc9\uedca\uedcb\uedcc\uedcd\uedce\uedcf\uedd0\uedd1\uedd2\uedd3\uedd4\uedd5\uedd6\uedd7\uedd8\uedd9\uedda\ueddb\ueddc\ueddd\uedde\ueddf\uede0\uede1\uede2\uede3\uede4\uede5\uede6\uede7\uede8\uede9\uedea\uedeb\uedec\ueded\uedee\uedef\uedf0\uedf1\uedf2\uedf3\uedf4\uedf5\uedf6\uedf7\uedf8\uedf9\uedfa\uedfb\uedfc\uedfd\uedfe\uedff\uee00\uee01\uee02\uee03\uee04\uee05\uee06\uee07\uee08\uee09\uee0a\uee0b\uee0c\uee0d\uee0e\uee0f\uee10\uee11\uee12\uee13\uee14\uee15\uee16\uee17\uee18\uee19\uee1a\uee1b\uee1c\uee1d\uee1e\uee1f\uee20\uee21\uee22\uee23\uee24\uee25\uee26\uee27\uee28\uee29\uee2a\uee2b\uee2c\uee2d\uee2e\uee2f\uee30\uee31\uee32\uee33\uee34\uee35\uee36\uee37\uee38\uee39\uee3a\uee3b\uee3c\uee3d\uee3e\uee3f\uee40\uee41\uee42\uee43\uee44\uee45\uee46\uee47\uee48\uee49\uee4a\uee4b\uee4c\uee4d\uee4e\uee4f\uee50\uee51\uee52\uee53\uee54\uee55\uee56\uee57\uee58\uee59\uee5a\uee5b\uee5c\uee5d\uee5e\uee5f\uee60\uee61\uee62\uee63\uee64\uee65\uee66\uee67\uee68\uee69\uee6a\uee6b\uee6c\uee6d\uee6e\uee6f\uee70\uee71\uee72\uee73\uee74\uee75\uee76\uee77\uee78\uee79\uee7a\uee7b\uee7c\uee7d\uee7e\uee7f\uee80\uee81\uee82\uee83\uee84\uee85\uee86\uee87\uee88\uee89\uee8a\uee8b\uee8c\uee8d\uee8e\uee8f\uee90\uee91\uee92\uee93\uee94\uee95\uee96\uee97\uee98\uee99\uee9a\uee9b\uee9c\uee9d\uee9e\uee9f\ueea0\ueea1\ueea2\ueea3\ueea4\ueea5\ueea6\ueea7\ueea8\ueea9\ueeaa\ueeab\ueeac\ueead\ueeae\ueeaf\ueeb0\ueeb1\ueeb2\ueeb3\ueeb4\ueeb5\ueeb6\ueeb7\ueeb8\ueeb9\ueeba\ueebb\ueebc\ueebd\ueebe\ueebf\ueec0\ueec1\ueec2\ueec3\ueec4\ueec5\ueec6\ueec7\ueec8\ueec9\ueeca\ueecb\ueecc\ueecd\ueece\ueecf\ueed0\ueed1\ueed2\ueed3\ueed4\ueed5\ueed6\ueed7\ueed8\ueed9\ueeda\ueedb\ueedc\ueedd\ueede\ueedf\ueee0\ueee1\ueee2\ueee3\ueee4\ueee5\ueee6\ueee7\ueee8\ueee9\ueeea\ueeeb\ueeec\ueeed\ueeee\ueeef\ueef0\ueef1\ueef2\ueef3\ueef4\ueef5\ueef6\ueef7\ueef8\ueef9\ueefa\ueefb\ueefc\ueefd\ueefe\ueeff\uef00\uef01\uef02\uef03\uef04\uef05\uef06\uef07\uef08\uef09\uef0a\uef0b\uef0c\uef0d\uef0e\uef0f\uef10\uef11\uef12\uef13\uef14\uef15\uef16\uef17\uef18\uef19\uef1a\uef1b\uef1c\uef1d\uef1e\uef1f\uef20\uef21\uef22\uef23\uef24\uef25\uef26\uef27\uef28\uef29\uef2a\uef2b\uef2c\uef2d\uef2e\uef2f\uef30\uef31\uef32\uef33\uef34\uef35\uef36\uef37\uef38\uef39\uef3a\uef3b\uef3c\uef3d\uef3e\uef3f\uef40\uef41\uef42\uef43\uef44\uef45\uef46\uef47\uef48\uef49\uef4a\uef4b\uef4c\uef4d\uef4e\uef4f\uef50\uef51\uef52\uef53\uef54\uef55\uef56\uef57\uef58\uef59\uef5a\uef5b\uef5c\uef5d\uef5e\uef5f\uef60\uef61\uef62\uef63\uef64\uef65\uef66\uef67\uef68\uef69\uef6a\uef6b\uef6c\uef6d\uef6e\uef6f\uef70\uef71\uef72\uef73\uef74\uef75\uef76\uef77\uef78\uef79\uef7a\uef7b\uef7c\uef7d\uef7e\uef7f\uef80\uef81\uef82\uef83\uef84\uef85\uef86\uef87\uef88\uef89\uef8a\uef8b\uef8c\uef8d\uef8e\uef8f\uef90\uef91\uef92\uef93\uef94\uef95\uef96\uef97\uef98\uef99\uef9a\uef9b\uef9c\uef9d\uef9e\uef9f\uefa0\uefa1\uefa2\uefa3\uefa4\uefa5\uefa6\uefa7\uefa8\uefa9\uefaa\uefab\uefac\uefad\uefae\uefaf\uefb0\uefb1\uefb2\uefb3\uefb4\uefb5\uefb6\uefb7\uefb8\uefb9\uefba\uefbb\uefbc\uefbd\uefbe\uefbf\uefc0\uefc1\uefc2\uefc3\uefc4\uefc5\uefc6\uefc7\uefc8\uefc9\uefca\uefcb\uefcc\uefcd\uefce\uefcf\uefd0\uefd1\uefd2\uefd3\uefd4\uefd5\uefd6\uefd7\uefd8\uefd9\uefda\uefdb\uefdc\uefdd\uefde\uefdf\uefe0\uefe1\uefe2\uefe3\uefe4\uefe5\uefe6\uefe7\uefe8\uefe9\uefea\uefeb\uefec\uefed\uefee\uefef\ueff0\ueff1\ueff2\ueff3\ueff4\ueff5\ueff6\ueff7\ueff8\ueff9\ueffa\ueffb\ueffc\ueffd\ueffe\uefff\uf000\uf001\uf002\uf003\uf004\uf005\uf006\uf007\uf008\uf009\uf00a\uf00b\uf00c\uf00d\uf00e\uf00f\uf010\uf011\uf012\uf013\uf014\uf015\uf016\uf017\uf018\uf019\uf01a\uf01b\uf01c\uf01d\uf01e\uf01f\uf020\uf021\uf022\uf023\uf024\uf025\uf026\uf027\uf028\uf029\uf02a\uf02b\uf02c\uf02d\uf02e\uf02f\uf030\uf031\uf032\uf033\uf034\uf035\uf036\uf037\uf038\uf039\uf03a\uf03b\uf03c\uf03d\uf03e\uf03f\uf040\uf041\uf042\uf043\uf044\uf045\uf046\uf047\uf048\uf049\uf04a\uf04b\uf04c\uf04d\uf04e\uf04f\uf050\uf051\uf052\uf053\uf054\uf055\uf056\uf057\uf058\uf059\uf05a\uf05b\uf05c\uf05d\uf05e\uf05f\uf060\uf061\uf062\uf063\uf064\uf065\uf066\uf067\uf068\uf069\uf06a\uf06b\uf06c\uf06d\uf06e\uf06f\uf070\uf071\uf072\uf073\uf074\uf075\uf076\uf077\uf078\uf079\uf07a\uf07b\uf07c\uf07d\uf07e\uf07f\uf080\uf081\uf082\uf083\uf084\uf085\uf086\uf087\uf088\uf089\uf08a\uf08b\uf08c\uf08d\uf08e\uf08f\uf090\uf091\uf092\uf093\uf094\uf095\uf096\uf097\uf098\uf099\uf09a\uf09b\uf09c\uf09d\uf09e\uf09f\uf0a0\uf0a1\uf0a2\uf0a3\uf0a4\uf0a5\uf0a6\uf0a7\uf0a8\uf0a9\uf0aa\uf0ab\uf0ac\uf0ad\uf0ae\uf0af\uf0b0\uf0b1\uf0b2\uf0b3\uf0b4\uf0b5\uf0b6\uf0b7\uf0b8\uf0b9\uf0ba\uf0bb\uf0bc\uf0bd\uf0be\uf0bf\uf0c0\uf0c1\uf0c2\uf0c3\uf0c4\uf0c5\uf0c6\uf0c7\uf0c8\uf0c9\uf0ca\uf0cb\uf0cc\uf0cd\uf0ce\uf0cf\uf0d0\uf0d1\uf0d2\uf0d3\uf0d4\uf0d5\uf0d6\uf0d7\uf0d8\uf0d9\uf0da\uf0db\uf0dc\uf0dd\uf0de\uf0df\uf0e0\uf0e1\uf0e2\uf0e3\uf0e4\uf0e5\uf0e6\uf0e7\uf0e8\uf0e9\uf0ea\uf0eb\uf0ec\uf0ed\uf0ee\uf0ef\uf0f0\uf0f1\uf0f2\uf0f3\uf0f4\uf0f5\uf0f6\uf0f7\uf0f8\uf0f9\uf0fa\uf0fb\uf0fc\uf0fd\uf0fe\uf0ff\uf100\uf101\uf102\uf103\uf104\uf105\uf106\uf107\uf108\uf109\uf10a\uf10b\uf10c\uf10d\uf10e\uf10f\uf110\uf111\uf112\uf113\uf114\uf115\uf116\uf117\uf118\uf119\uf11a\uf11b\uf11c\uf11d\uf11e\uf11f\uf120\uf121\uf122\uf123\uf124\uf125\uf126\uf127\uf128\uf129\uf12a\uf12b\uf12c\uf12d\uf12e\uf12f\uf130\uf131\uf132\uf133\uf134\uf135\uf136\uf137\uf138\uf139\uf13a\uf13b\uf13c\uf13d\uf13e\uf13f\uf140\uf141\uf142\uf143\uf144\uf145\uf146\uf147\uf148\uf149\uf14a\uf14b\uf14c\uf14d\uf14e\uf14f\uf150\uf151\uf152\uf153\uf154\uf155\uf156\uf157\uf158\uf159\uf15a\uf15b\uf15c\uf15d\uf15e\uf15f\uf160\uf161\uf162\uf163\uf164\uf165\uf166\uf167\uf168\uf169\uf16a\uf16b\uf16c\uf16d\uf16e\uf16f\uf170\uf171\uf172\uf173\uf174\uf175\uf176\uf177\uf178\uf179\uf17a\uf17b\uf17c\uf17d\uf17e\uf17f\uf180\uf181\uf182\uf183\uf184\uf185\uf186\uf187\uf188\uf189\uf18a\uf18b\uf18c\uf18d\uf18e\uf18f\uf190\uf191\uf192\uf193\uf194\uf195\uf196\uf197\uf198\uf199\uf19a\uf19b\uf19c\uf19d\uf19e\uf19f\uf1a0\uf1a1\uf1a2\uf1a3\uf1a4\uf1a5\uf1a6\uf1a7\uf1a8\uf1a9\uf1aa\uf1ab\uf1ac\uf1ad\uf1ae\uf1af\uf1b0\uf1b1\uf1b2\uf1b3\uf1b4\uf1b5\uf1b6\uf1b7\uf1b8\uf1b9\uf1ba\uf1bb\uf1bc\uf1bd\uf1be\uf1bf\uf1c0\uf1c1\uf1c2\uf1c3\uf1c4\uf1c5\uf1c6\uf1c7\uf1c8\uf1c9\uf1ca\uf1cb\uf1cc\uf1cd\uf1ce\uf1cf\uf1d0\uf1d1\uf1d2\uf1d3\uf1d4\uf1d5\uf1d6\uf1d7\uf1d8\uf1d9\uf1da\uf1db\uf1dc\uf1dd\uf1de\uf1df\uf1e0\uf1e1\uf1e2\uf1e3\uf1e4\uf1e5\uf1e6\uf1e7\uf1e8\uf1e9\uf1ea\uf1eb\uf1ec\uf1ed\uf1ee\uf1ef\uf1f0\uf1f1\uf1f2\uf1f3\uf1f4\uf1f5\uf1f6\uf1f7\uf1f8\uf1f9\uf1fa\uf1fb\uf1fc\uf1fd\uf1fe\uf1ff\uf200\uf201\uf202\uf203\uf204\uf205\uf206\uf207\uf208\uf209\uf20a\uf20b\uf20c\uf20d\uf20e\uf20f\uf210\uf211\uf212\uf213\uf214\uf215\uf216\uf217\uf218\uf219\uf21a\uf21b\uf21c\uf21d\uf21e\uf21f\uf220\uf221\uf222\uf223\uf224\uf225\uf226\uf227\uf228\uf229\uf22a\uf22b\uf22c\uf22d\uf22e\uf22f\uf230\uf231\uf232\uf233\uf234\uf235\uf236\uf237\uf238\uf239\uf23a\uf23b\uf23c\uf23d\uf23e\uf23f\uf240\uf241\uf242\uf243\uf244\uf245\uf246\uf247\uf248\uf249\uf24a\uf24b\uf24c\uf24d\uf24e\uf24f\uf250\uf251\uf252\uf253\uf254\uf255\uf256\uf257\uf258\uf259\uf25a\uf25b\uf25c\uf25d\uf25e\uf25f\uf260\uf261\uf262\uf263\uf264\uf265\uf266\uf267\uf268\uf269\uf26a\uf26b\uf26c\uf26d\uf26e\uf26f\uf270\uf271\uf272\uf273\uf274\uf275\uf276\uf277\uf278\uf279\uf27a\uf27b\uf27c\uf27d\uf27e\uf27f\uf280\uf281\uf282\uf283\uf284\uf285\uf286\uf287\uf288\uf289\uf28a\uf28b\uf28c\uf28d\uf28e\uf28f\uf290\uf291\uf292\uf293\uf294\uf295\uf296\uf297\uf298\uf299\uf29a\uf29b\uf29c\uf29d\uf29e\uf29f\uf2a0\uf2a1\uf2a2\uf2a3\uf2a4\uf2a5\uf2a6\uf2a7\uf2a8\uf2a9\uf2aa\uf2ab\uf2ac\uf2ad\uf2ae\uf2af\uf2b0\uf2b1\uf2b2\uf2b3\uf2b4\uf2b5\uf2b6\uf2b7\uf2b8\uf2b9\uf2ba\uf2bb\uf2bc\uf2bd\uf2be\uf2bf\uf2c0\uf2c1\uf2c2\uf2c3\uf2c4\uf2c5\uf2c6\uf2c7\uf2c8\uf2c9\uf2ca\uf2cb\uf2cc\uf2cd\uf2ce\uf2cf\uf2d0\uf2d1\uf2d2\uf2d3\uf2d4\uf2d5\uf2d6\uf2d7\uf2d8\uf2d9\uf2da\uf2db\uf2dc\uf2dd\uf2de\uf2df\uf2e0\uf2e1\uf2e2\uf2e3\uf2e4\uf2e5\uf2e6\uf2e7\uf2e8\uf2e9\uf2ea\uf2eb\uf2ec\uf2ed\uf2ee\uf2ef\uf2f0\uf2f1\uf2f2\uf2f3\uf2f4\uf2f5\uf2f6\uf2f7\uf2f8\uf2f9\uf2fa\uf2fb\uf2fc\uf2fd\uf2fe\uf2ff\uf300\uf301\uf302\uf303\uf304\uf305\uf306\uf307\uf308\uf309\uf30a\uf30b\uf30c\uf30d\uf30e\uf30f\uf310\uf311\uf312\uf313\uf314\uf315\uf316\uf317\uf318\uf319\uf31a\uf31b\uf31c\uf31d\uf31e\uf31f\uf320\uf321\uf322\uf323\uf324\uf325\uf326\uf327\uf328\uf329\uf32a\uf32b\uf32c\uf32d\uf32e\uf32f\uf330\uf331\uf332\uf333\uf334\uf335\uf336\uf337\uf338\uf339\uf33a\uf33b\uf33c\uf33d\uf33e\uf33f\uf340\uf341\uf342\uf343\uf344\uf345\uf346\uf347\uf348\uf349\uf34a\uf34b\uf34c\uf34d\uf34e\uf34f\uf350\uf351\uf352\uf353\uf354\uf355\uf356\uf357\uf358\uf359\uf35a\uf35b\uf35c\uf35d\uf35e\uf35f\uf360\uf361\uf362\uf363\uf364\uf365\uf366\uf367\uf368\uf369\uf36a\uf36b\uf36c\uf36d\uf36e\uf36f\uf370\uf371\uf372\uf373\uf374\uf375\uf376\uf377\uf378\uf379\uf37a\uf37b\uf37c\uf37d\uf37e\uf37f\uf380\uf381\uf382\uf383\uf384\uf385\uf386\uf387\uf388\uf389\uf38a\uf38b\uf38c\uf38d\uf38e\uf38f\uf390\uf391\uf392\uf393\uf394\uf395\uf396\uf397\uf398\uf399\uf39a\uf39b\uf39c\uf39d\uf39e\uf39f\uf3a0\uf3a1\uf3a2\uf3a3\uf3a4\uf3a5\uf3a6\uf3a7\uf3a8\uf3a9\uf3aa\uf3ab\uf3ac\uf3ad\uf3ae\uf3af\uf3b0\uf3b1\uf3b2\uf3b3\uf3b4\uf3b5\uf3b6\uf3b7\uf3b8\uf3b9\uf3ba\uf3bb\uf3bc\uf3bd\uf3be\uf3bf\uf3c0\uf3c1\uf3c2\uf3c3\uf3c4\uf3c5\uf3c6\uf3c7\uf3c8\uf3c9\uf3ca\uf3cb\uf3cc\uf3cd\uf3ce\uf3cf\uf3d0\uf3d1\uf3d2\uf3d3\uf3d4\uf3d5\uf3d6\uf3d7\uf3d8\uf3d9\uf3da\uf3db\uf3dc\uf3dd\uf3de\uf3df\uf3e0\uf3e1\uf3e2\uf3e3\uf3e4\uf3e5\uf3e6\uf3e7\uf3e8\uf3e9\uf3ea\uf3eb\uf3ec\uf3ed\uf3ee\uf3ef\uf3f0\uf3f1\uf3f2\uf3f3\uf3f4\uf3f5\uf3f6\uf3f7\uf3f8\uf3f9\uf3fa\uf3fb\uf3fc\uf3fd\uf3fe\uf3ff\uf400\uf401\uf402\uf403\uf404\uf405\uf406\uf407\uf408\uf409\uf40a\uf40b\uf40c\uf40d\uf40e\uf40f\uf410\uf411\uf412\uf413\uf414\uf415\uf416\uf417\uf418\uf419\uf41a\uf41b\uf41c\uf41d\uf41e\uf41f\uf420\uf421\uf422\uf423\uf424\uf425\uf426\uf427\uf428\uf429\uf42a\uf42b\uf42c\uf42d\uf42e\uf42f\uf430\uf431\uf432\uf433\uf434\uf435\uf436\uf437\uf438\uf439\uf43a\uf43b\uf43c\uf43d\uf43e\uf43f\uf440\uf441\uf442\uf443\uf444\uf445\uf446\uf447\uf448\uf449\uf44a\uf44b\uf44c\uf44d\uf44e\uf44f\uf450\uf451\uf452\uf453\uf454\uf455\uf456\uf457\uf458\uf459\uf45a\uf45b\uf45c\uf45d\uf45e\uf45f\uf460\uf461\uf462\uf463\uf464\uf465\uf466\uf467\uf468\uf469\uf46a\uf46b\uf46c\uf46d\uf46e\uf46f\uf470\uf471\uf472\uf473\uf474\uf475\uf476\uf477\uf478\uf479\uf47a\uf47b\uf47c\uf47d\uf47e\uf47f\uf480\uf481\uf482\uf483\uf484\uf485\uf486\uf487\uf488\uf489\uf48a\uf48b\uf48c\uf48d\uf48e\uf48f\uf490\uf491\uf492\uf493\uf494\uf495\uf496\uf497\uf498\uf499\uf49a\uf49b\uf49c\uf49d\uf49e\uf49f\uf4a0\uf4a1\uf4a2\uf4a3\uf4a4\uf4a5\uf4a6\uf4a7\uf4a8\uf4a9\uf4aa\uf4ab\uf4ac\uf4ad\uf4ae\uf4af\uf4b0\uf4b1\uf4b2\uf4b3\uf4b4\uf4b5\uf4b6\uf4b7\uf4b8\uf4b9\uf4ba\uf4bb\uf4bc\uf4bd\uf4be\uf4bf\uf4c0\uf4c1\uf4c2\uf4c3\uf4c4\uf4c5\uf4c6\uf4c7\uf4c8\uf4c9\uf4ca\uf4cb\uf4cc\uf4cd\uf4ce\uf4cf\uf4d0\uf4d1\uf4d2\uf4d3\uf4d4\uf4d5\uf4d6\uf4d7\uf4d8\uf4d9\uf4da\uf4db\uf4dc\uf4dd\uf4de\uf4df\uf4e0\uf4e1\uf4e2\uf4e3\uf4e4\uf4e5\uf4e6\uf4e7\uf4e8\uf4e9\uf4ea\uf4eb\uf4ec\uf4ed\uf4ee\uf4ef\uf4f0\uf4f1\uf4f2\uf4f3\uf4f4\uf4f5\uf4f6\uf4f7\uf4f8\uf4f9\uf4fa\uf4fb\uf4fc\uf4fd\uf4fe\uf4ff\uf500\uf501\uf502\uf503\uf504\uf505\uf506\uf507\uf508\uf509\uf50a\uf50b\uf50c\uf50d\uf50e\uf50f\uf510\uf511\uf512\uf513\uf514\uf515\uf516\uf517\uf518\uf519\uf51a\uf51b\uf51c\uf51d\uf51e\uf51f\uf520\uf521\uf522\uf523\uf524\uf525\uf526\uf527\uf528\uf529\uf52a\uf52b\uf52c\uf52d\uf52e\uf52f\uf530\uf531\uf532\uf533\uf534\uf535\uf536\uf537\uf538\uf539\uf53a\uf53b\uf53c\uf53d\uf53e\uf53f\uf540\uf541\uf542\uf543\uf544\uf545\uf546\uf547\uf548\uf549\uf54a\uf54b\uf54c\uf54d\uf54e\uf54f\uf550\uf551\uf552\uf553\uf554\uf555\uf556\uf557\uf558\uf559\uf55a\uf55b\uf55c\uf55d\uf55e\uf55f\uf560\uf561\uf562\uf563\uf564\uf565\uf566\uf567\uf568\uf569\uf56a\uf56b\uf56c\uf56d\uf56e\uf56f\uf570\uf571\uf572\uf573\uf574\uf575\uf576\uf577\uf578\uf579\uf57a\uf57b\uf57c\uf57d\uf57e\uf57f\uf580\uf581\uf582\uf583\uf584\uf585\uf586\uf587\uf588\uf589\uf58a\uf58b\uf58c\uf58d\uf58e\uf58f\uf590\uf591\uf592\uf593\uf594\uf595\uf596\uf597\uf598\uf599\uf59a\uf59b\uf59c\uf59d\uf59e\uf59f\uf5a0\uf5a1\uf5a2\uf5a3\uf5a4\uf5a5\uf5a6\uf5a7\uf5a8\uf5a9\uf5aa\uf5ab\uf5ac\uf5ad\uf5ae\uf5af\uf5b0\uf5b1\uf5b2\uf5b3\uf5b4\uf5b5\uf5b6\uf5b7\uf5b8\uf5b9\uf5ba\uf5bb\uf5bc\uf5bd\uf5be\uf5bf\uf5c0\uf5c1\uf5c2\uf5c3\uf5c4\uf5c5\uf5c6\uf5c7\uf5c8\uf5c9\uf5ca\uf5cb\uf5cc\uf5cd\uf5ce\uf5cf\uf5d0\uf5d1\uf5d2\uf5d3\uf5d4\uf5d5\uf5d6\uf5d7\uf5d8\uf5d9\uf5da\uf5db\uf5dc\uf5dd\uf5de\uf5df\uf5e0\uf5e1\uf5e2\uf5e3\uf5e4\uf5e5\uf5e6\uf5e7\uf5e8\uf5e9\uf5ea\uf5eb\uf5ec\uf5ed\uf5ee\uf5ef\uf5f0\uf5f1\uf5f2\uf5f3\uf5f4\uf5f5\uf5f6\uf5f7\uf5f8\uf5f9\uf5fa\uf5fb\uf5fc\uf5fd\uf5fe\uf5ff\uf600\uf601\uf602\uf603\uf604\uf605\uf606\uf607\uf608\uf609\uf60a\uf60b\uf60c\uf60d\uf60e\uf60f\uf610\uf611\uf612\uf613\uf614\uf615\uf616\uf617\uf618\uf619\uf61a\uf61b\uf61c\uf61d\uf61e\uf61f\uf620\uf621\uf622\uf623\uf624\uf625\uf626\uf627\uf628\uf629\uf62a\uf62b\uf62c\uf62d\uf62e\uf62f\uf630\uf631\uf632\uf633\uf634\uf635\uf636\uf637\uf638\uf639\uf63a\uf63b\uf63c\uf63d\uf63e\uf63f\uf640\uf641\uf642\uf643\uf644\uf645\uf646\uf647\uf648\uf649\uf64a\uf64b\uf64c\uf64d\uf64e\uf64f\uf650\uf651\uf652\uf653\uf654\uf655\uf656\uf657\uf658\uf659\uf65a\uf65b\uf65c\uf65d\uf65e\uf65f\uf660\uf661\uf662\uf663\uf664\uf665\uf666\uf667\uf668\uf669\uf66a\uf66b\uf66c\uf66d\uf66e\uf66f\uf670\uf671\uf672\uf673\uf674\uf675\uf676\uf677\uf678\uf679\uf67a\uf67b\uf67c\uf67d\uf67e\uf67f\uf680\uf681\uf682\uf683\uf684\uf685\uf686\uf687\uf688\uf689\uf68a\uf68b\uf68c\uf68d\uf68e\uf68f\uf690\uf691\uf692\uf693\uf694\uf695\uf696\uf697\uf698\uf699\uf69a\uf69b\uf69c\uf69d\uf69e\uf69f\uf6a0\uf6a1\uf6a2\uf6a3\uf6a4\uf6a5\uf6a6\uf6a7\uf6a8\uf6a9\uf6aa\uf6ab\uf6ac\uf6ad\uf6ae\uf6af\uf6b0\uf6b1\uf6b2\uf6b3\uf6b4\uf6b5\uf6b6\uf6b7\uf6b8\uf6b9\uf6ba\uf6bb\uf6bc\uf6bd\uf6be\uf6bf\uf6c0\uf6c1\uf6c2\uf6c3\uf6c4\uf6c5\uf6c6\uf6c7\uf6c8\uf6c9\uf6ca\uf6cb\uf6cc\uf6cd\uf6ce\uf6cf\uf6d0\uf6d1\uf6d2\uf6d3\uf6d4\uf6d5\uf6d6\uf6d7\uf6d8\uf6d9\uf6da\uf6db\uf6dc\uf6dd\uf6de\uf6df\uf6e0\uf6e1\uf6e2\uf6e3\uf6e4\uf6e5\uf6e6\uf6e7\uf6e8\uf6e9\uf6ea\uf6eb\uf6ec\uf6ed\uf6ee\uf6ef\uf6f0\uf6f1\uf6f2\uf6f3\uf6f4\uf6f5\uf6f6\uf6f7\uf6f8\uf6f9\uf6fa\uf6fb\uf6fc\uf6fd\uf6fe\uf6ff\uf700\uf701\uf702\uf703\uf704\uf705\uf706\uf707\uf708\uf709\uf70a\uf70b\uf70c\uf70d\uf70e\uf70f\uf710\uf711\uf712\uf713\uf714\uf715\uf716\uf717\uf718\uf719\uf71a\uf71b\uf71c\uf71d\uf71e\uf71f\uf720\uf721\uf722\uf723\uf724\uf725\uf726\uf727\uf728\uf729\uf72a\uf72b\uf72c\uf72d\uf72e\uf72f\uf730\uf731\uf732\uf733\uf734\uf735\uf736\uf737\uf738\uf739\uf73a\uf73b\uf73c\uf73d\uf73e\uf73f\uf740\uf741\uf742\uf743\uf744\uf745\uf746\uf747\uf748\uf749\uf74a\uf74b\uf74c\uf74d\uf74e\uf74f\uf750\uf751\uf752\uf753\uf754\uf755\uf756\uf757\uf758\uf759\uf75a\uf75b\uf75c\uf75d\uf75e\uf75f\uf760\uf761\uf762\uf763\uf764\uf765\uf766\uf767\uf768\uf769\uf76a\uf76b\uf76c\uf76d\uf76e\uf76f\uf770\uf771\uf772\uf773\uf774\uf775\uf776\uf777\uf778\uf779\uf77a\uf77b\uf77c\uf77d\uf77e\uf77f\uf780\uf781\uf782\uf783\uf784\uf785\uf786\uf787\uf788\uf789\uf78a\uf78b\uf78c\uf78d\uf78e\uf78f\uf790\uf791\uf792\uf793\uf794\uf795\uf796\uf797\uf798\uf799\uf79a\uf79b\uf79c\uf79d\uf79e\uf79f\uf7a0\uf7a1\uf7a2\uf7a3\uf7a4\uf7a5\uf7a6\uf7a7\uf7a8\uf7a9\uf7aa\uf7ab\uf7ac\uf7ad\uf7ae\uf7af\uf7b0\uf7b1\uf7b2\uf7b3\uf7b4\uf7b5\uf7b6\uf7b7\uf7b8\uf7b9\uf7ba\uf7bb\uf7bc\uf7bd\uf7be\uf7bf\uf7c0\uf7c1\uf7c2\uf7c3\uf7c4\uf7c5\uf7c6\uf7c7\uf7c8\uf7c9\uf7ca\uf7cb\uf7cc\uf7cd\uf7ce\uf7cf\uf7d0\uf7d1\uf7d2\uf7d3\uf7d4\uf7d5\uf7d6\uf7d7\uf7d8\uf7d9\uf7da\uf7db\uf7dc\uf7dd\uf7de\uf7df\uf7e0\uf7e1\uf7e2\uf7e3\uf7e4\uf7e5\uf7e6\uf7e7\uf7e8\uf7e9\uf7ea\uf7eb\uf7ec\uf7ed\uf7ee\uf7ef\uf7f0\uf7f1\uf7f2\uf7f3\uf7f4\uf7f5\uf7f6\uf7f7\uf7f8\uf7f9\uf7fa\uf7fb\uf7fc\uf7fd\uf7fe\uf7ff\uf800\uf801\uf802\uf803\uf804\uf805\uf806\uf807\uf808\uf809\uf80a\uf80b\uf80c\uf80d\uf80e\uf80f\uf810\uf811\uf812\uf813\uf814\uf815\uf816\uf817\uf818\uf819\uf81a\uf81b\uf81c\uf81d\uf81e\uf81f\uf820\uf821\uf822\uf823\uf824\uf825\uf826\uf827\uf828\uf829\uf82a\uf82b\uf82c\uf82d\uf82e\uf82f\uf830\uf831\uf832\uf833\uf834\uf835\uf836\uf837\uf838\uf839\uf83a\uf83b\uf83c\uf83d\uf83e\uf83f\uf840\uf841\uf842\uf843\uf844\uf845\uf846\uf847\uf848\uf849\uf84a\uf84b\uf84c\uf84d\uf84e\uf84f\uf850\uf851\uf852\uf853\uf854\uf855\uf856\uf857\uf858\uf859\uf85a\uf85b\uf85c\uf85d\uf85e\uf85f\uf860\uf861\uf862\uf863\uf864\uf865\uf866\uf867\uf868\uf869\uf86a\uf86b\uf86c\uf86d\uf86e\uf86f\uf870\uf871\uf872\uf873\uf874\uf875\uf876\uf877\uf878\uf879\uf87a\uf87b\uf87c\uf87d\uf87e\uf87f\uf880\uf881\uf882\uf883\uf884\uf885\uf886\uf887\uf888\uf889\uf88a\uf88b\uf88c\uf88d\uf88e\uf88f\uf890\uf891\uf892\uf893\uf894\uf895\uf896\uf897\uf898\uf899\uf89a\uf89b\uf89c\uf89d\uf89e\uf89f\uf8a0\uf8a1\uf8a2\uf8a3\uf8a4\uf8a5\uf8a6\uf8a7\uf8a8\uf8a9\uf8aa\uf8ab\uf8ac\uf8ad\uf8ae\uf8af\uf8b0\uf8b1\uf8b2\uf8b3\uf8b4\uf8b5\uf8b6\uf8b7\uf8b8\uf8b9\uf8ba\uf8bb\uf8bc\uf8bd\uf8be\uf8bf\uf8c0\uf8c1\uf8c2\uf8c3\uf8c4\uf8c5\uf8c6\uf8c7\uf8c8\uf8c9\uf8ca\uf8cb\uf8cc\uf8cd\uf8ce\uf8cf\uf8d0\uf8d1\uf8d2\uf8d3\uf8d4\uf8d5\uf8d6\uf8d7\uf8d8\uf8d9\uf8da\uf8db\uf8dc\uf8dd\uf8de\uf8df\uf8e0\uf8e1\uf8e2\uf8e3\uf8e4\uf8e5\uf8e6\uf8e7\uf8e8\uf8e9\uf8ea\uf8eb\uf8ec\uf8ed\uf8ee\uf8ef\uf8f0\uf8f1\uf8f2\uf8f3\uf8f4\uf8f5\uf8f6\uf8f7\uf8f8\uf8f9\uf8fa\uf8fb\uf8fc\uf8fd\uf8fe\uf8ff'
-
-try:
-    Cs = eval(r"'\ud800\ud801\ud802\ud803\ud804\ud805\ud806\ud807\ud808\ud809\ud80a\ud80b\ud80c\ud80d\ud80e\ud80f\ud810\ud811\ud812\ud813\ud814\ud815\ud816\ud817\ud818\ud819\ud81a\ud81b\ud81c\ud81d\ud81e\ud81f\ud820\ud821\ud822\ud823\ud824\ud825\ud826\ud827\ud828\ud829\ud82a\ud82b\ud82c\ud82d\ud82e\ud82f\ud830\ud831\ud832\ud833\ud834\ud835\ud836\ud837\ud838\ud839\ud83a\ud83b\ud83c\ud83d\ud83e\ud83f\ud840\ud841\ud842\ud843\ud844\ud845\ud846\ud847\ud848\ud849\ud84a\ud84b\ud84c\ud84d\ud84e\ud84f\ud850\ud851\ud852\ud853\ud854\ud855\ud856\ud857\ud858\ud859\ud85a\ud85b\ud85c\ud85d\ud85e\ud85f\ud860\ud861\ud862\ud863\ud864\ud865\ud866\ud867\ud868\ud869\ud86a\ud86b\ud86c\ud86d\ud86e\ud86f\ud870\ud871\ud872\ud873\ud874\ud875\ud876\ud877\ud878\ud879\ud87a\ud87b\ud87c\ud87d\ud87e\ud87f\ud880\ud881\ud882\ud883\ud884\ud885\ud886\ud887\ud888\ud889\ud88a\ud88b\ud88c\ud88d\ud88e\ud88f\ud890\ud891\ud892\ud893\ud894\ud895\ud896\ud897\ud898\ud899\ud89a\ud89b\ud89c\ud89d\ud89e\ud89f\ud8a0\ud8a1\ud8a2\ud8a3\ud8a4\ud8a5\ud8a6\ud8a7\ud8a8\ud8a9\ud8aa\ud8ab\ud8ac\ud8ad\ud8ae\ud8af\ud8b0\ud8b1\ud8b2\ud8b3\ud8b4\ud8b5\ud8b6\ud8b7\ud8b8\ud8b9\ud8ba\ud8bb\ud8bc\ud8bd\ud8be\ud8bf\ud8c0\ud8c1\ud8c2\ud8c3\ud8c4\ud8c5\ud8c6\ud8c7\ud8c8\ud8c9\ud8ca\ud8cb\ud8cc\ud8cd\ud8ce\ud8cf\ud8d0\ud8d1\ud8d2\ud8d3\ud8d4\ud8d5\ud8d6\ud8d7\ud8d8\ud8d9\ud8da\ud8db\ud8dc\ud8dd\ud8de\ud8df\ud8e0\ud8e1\ud8e2\ud8e3\ud8e4\ud8e5\ud8e6\ud8e7\ud8e8\ud8e9\ud8ea\ud8eb\ud8ec\ud8ed\ud8ee\ud8ef\ud8f0\ud8f1\ud8f2\ud8f3\ud8f4\ud8f5\ud8f6\ud8f7\ud8f8\ud8f9\ud8fa\ud8fb\ud8fc\ud8fd\ud8fe\ud8ff\ud900\ud901\ud902\ud903\ud904\ud905\ud906\ud907\ud908\ud909\ud90a\ud90b\ud90c\ud90d\ud90e\ud90f\ud910\ud911\ud912\ud913\ud914\ud915\ud916\ud917\ud918\ud919\ud91a\ud91b\ud91c\ud91d\ud91e\ud91f\ud920\ud921\ud922\ud923\ud924\ud925\ud926\ud927\ud928\ud929\ud92a\ud92b\ud92c\ud92d\ud92e\ud92f\ud930\ud931\ud932\ud933\ud934\ud935\ud936\ud937\ud938\ud939\ud93a\ud93b\ud93c\ud93d\ud93e\ud93f\ud940\ud941\ud942\ud943\ud944\ud945\ud946\ud947\ud948\ud949\ud94a\ud94b\ud94c\ud94d\ud94e\ud94f\ud950\ud951\ud952\ud953\ud954\ud955\ud956\ud957\ud958\ud959\ud95a\ud95b\ud95c\ud95d\ud95e\ud95f\ud960\ud961\ud962\ud963\ud964\ud965\ud966\ud967\ud968\ud969\ud96a\ud96b\ud96c\ud96d\ud96e\ud96f\ud970\ud971\ud972\ud973\ud974\ud975\ud976\ud977\ud978\ud979\ud97a\ud97b\ud97c\ud97d\ud97e\ud97f\ud980\ud981\ud982\ud983\ud984\ud985\ud986\ud987\ud988\ud989\ud98a\ud98b\ud98c\ud98d\ud98e\ud98f\ud990\ud991\ud992\ud993\ud994\ud995\ud996\ud997\ud998\ud999\ud99a\ud99b\ud99c\ud99d\ud99e\ud99f\ud9a0\ud9a1\ud9a2\ud9a3\ud9a4\ud9a5\ud9a6\ud9a7\ud9a8\ud9a9\ud9aa\ud9ab\ud9ac\ud9ad\ud9ae\ud9af\ud9b0\ud9b1\ud9b2\ud9b3\ud9b4\ud9b5\ud9b6\ud9b7\ud9b8\ud9b9\ud9ba\ud9bb\ud9bc\ud9bd\ud9be\ud9bf\ud9c0\ud9c1\ud9c2\ud9c3\ud9c4\ud9c5\ud9c6\ud9c7\ud9c8\ud9c9\ud9ca\ud9cb\ud9cc\ud9cd\ud9ce\ud9cf\ud9d0\ud9d1\ud9d2\ud9d3\ud9d4\ud9d5\ud9d6\ud9d7\ud9d8\ud9d9\ud9da\ud9db\ud9dc\ud9dd\ud9de\ud9df\ud9e0\ud9e1\ud9e2\ud9e3\ud9e4\ud9e5\ud9e6\ud9e7\ud9e8\ud9e9\ud9ea\ud9eb\ud9ec\ud9ed\ud9ee\ud9ef\ud9f0\ud9f1\ud9f2\ud9f3\ud9f4\ud9f5\ud9f6\ud9f7\ud9f8\ud9f9\ud9fa\ud9fb\ud9fc\ud9fd\ud9fe\ud9ff\uda00\uda01\uda02\uda03\uda04\uda05\uda06\uda07\uda08\uda09\uda0a\uda0b\uda0c\uda0d\uda0e\uda0f\uda10\uda11\uda12\uda13\uda14\uda15\uda16\uda17\uda18\uda19\uda1a\uda1b\uda1c\uda1d\uda1e\uda1f\uda20\uda21\uda22\uda23\uda24\uda25\uda26\uda27\uda28\uda29\uda2a\uda2b\uda2c\uda2d\uda2e\uda2f\uda30\uda31\uda32\uda33\uda34\uda35\uda36\uda37\uda38\uda39\uda3a\uda3b\uda3c\uda3d\uda3e\uda3f\uda40\uda41\uda42\uda43\uda44\uda45\uda46\uda47\uda48\uda49\uda4a\uda4b\uda4c\uda4d\uda4e\uda4f\uda50\uda51\uda52\uda53\uda54\uda55\uda56\uda57\uda58\uda59\uda5a\uda5b\uda5c\uda5d\uda5e\uda5f\uda60\uda61\uda62\uda63\uda64\uda65\uda66\uda67\uda68\uda69\uda6a\uda6b\uda6c\uda6d\uda6e\uda6f\uda70\uda71\uda72\uda73\uda74\uda75\uda76\uda77\uda78\uda79\uda7a\uda7b\uda7c\uda7d\uda7e\uda7f\uda80\uda81\uda82\uda83\uda84\uda85\uda86\uda87\uda88\uda89\uda8a\uda8b\uda8c\uda8d\uda8e\uda8f\uda90\uda91\uda92\uda93\uda94\uda95\uda96\uda97\uda98\uda99\uda9a\uda9b\uda9c\uda9d\uda9e\uda9f\udaa0\udaa1\udaa2\udaa3\udaa4\udaa5\udaa6\udaa7\udaa8\udaa9\udaaa\udaab\udaac\udaad\udaae\udaaf\udab0\udab1\udab2\udab3\udab4\udab5\udab6\udab7\udab8\udab9\udaba\udabb\udabc\udabd\udabe\udabf\udac0\udac1\udac2\udac3\udac4\udac5\udac6\udac7\udac8\udac9\udaca\udacb\udacc\udacd\udace\udacf\udad0\udad1\udad2\udad3\udad4\udad5\udad6\udad7\udad8\udad9\udada\udadb\udadc\udadd\udade\udadf\udae0\udae1\udae2\udae3\udae4\udae5\udae6\udae7\udae8\udae9\udaea\udaeb\udaec\udaed\udaee\udaef\udaf0\udaf1\udaf2\udaf3\udaf4\udaf5\udaf6\udaf7\udaf8\udaf9\udafa\udafb\udafc\udafd\udafe\udaff\udb00\udb01\udb02\udb03\udb04\udb05\udb06\udb07\udb08\udb09\udb0a\udb0b\udb0c\udb0d\udb0e\udb0f\udb10\udb11\udb12\udb13\udb14\udb15\udb16\udb17\udb18\udb19\udb1a\udb1b\udb1c\udb1d\udb1e\udb1f\udb20\udb21\udb22\udb23\udb24\udb25\udb26\udb27\udb28\udb29\udb2a\udb2b\udb2c\udb2d\udb2e\udb2f\udb30\udb31\udb32\udb33\udb34\udb35\udb36\udb37\udb38\udb39\udb3a\udb3b\udb3c\udb3d\udb3e\udb3f\udb40\udb41\udb42\udb43\udb44\udb45\udb46\udb47\udb48\udb49\udb4a\udb4b\udb4c\udb4d\udb4e\udb4f\udb50\udb51\udb52\udb53\udb54\udb55\udb56\udb57\udb58\udb59\udb5a\udb5b\udb5c\udb5d\udb5e\udb5f\udb60\udb61\udb62\udb63\udb64\udb65\udb66\udb67\udb68\udb69\udb6a\udb6b\udb6c\udb6d\udb6e\udb6f\udb70\udb71\udb72\udb73\udb74\udb75\udb76\udb77\udb78\udb79\udb7a\udb7b\udb7c\udb7d\udb7e\udb7f\udb80\udb81\udb82\udb83\udb84\udb85\udb86\udb87\udb88\udb89\udb8a\udb8b\udb8c\udb8d\udb8e\udb8f\udb90\udb91\udb92\udb93\udb94\udb95\udb96\udb97\udb98\udb99\udb9a\udb9b\udb9c\udb9d\udb9e\udb9f\udba0\udba1\udba2\udba3\udba4\udba5\udba6\udba7\udba8\udba9\udbaa\udbab\udbac\udbad\udbae\udbaf\udbb0\udbb1\udbb2\udbb3\udbb4\udbb5\udbb6\udbb7\udbb8\udbb9\udbba\udbbb\udbbc\udbbd\udbbe\udbbf\udbc0\udbc1\udbc2\udbc3\udbc4\udbc5\udbc6\udbc7\udbc8\udbc9\udbca\udbcb\udbcc\udbcd\udbce\udbcf\udbd0\udbd1\udbd2\udbd3\udbd4\udbd5\udbd6\udbd7\udbd8\udbd9\udbda\udbdb\udbdc\udbdd\udbde\udbdf\udbe0\udbe1\udbe2\udbe3\udbe4\udbe5\udbe6\udbe7\udbe8\udbe9\udbea\udbeb\udbec\udbed\udbee\udbef\udbf0\udbf1\udbf2\udbf3\udbf4\udbf5\udbf6\udbf7\udbf8\udbf9\udbfa\udbfb\udbfc\udbfd\udbfe\U0010fc00\udc01\udc02\udc03\udc04\udc05\udc06\udc07\udc08\udc09\udc0a\udc0b\udc0c\udc0d\udc0e\udc0f\udc10\udc11\udc12\udc13\udc14\udc15\udc16\udc17\udc18\udc19\udc1a\udc1b\udc1c\udc1d\udc1e\udc1f\udc20\udc21\udc22\udc23\udc24\udc25\udc26\udc27\udc28\udc29\udc2a\udc2b\udc2c\udc2d\udc2e\udc2f\udc30\udc31\udc32\udc33\udc34\udc35\udc36\udc37\udc38\udc39\udc3a\udc3b\udc3c\udc3d\udc3e\udc3f\udc40\udc41\udc42\udc43\udc44\udc45\udc46\udc47\udc48\udc49\udc4a\udc4b\udc4c\udc4d\udc4e\udc4f\udc50\udc51\udc52\udc53\udc54\udc55\udc56\udc57\udc58\udc59\udc5a\udc5b\udc5c\udc5d\udc5e\udc5f\udc60\udc61\udc62\udc63\udc64\udc65\udc66\udc67\udc68\udc69\udc6a\udc6b\udc6c\udc6d\udc6e\udc6f\udc70\udc71\udc72\udc73\udc74\udc75\udc76\udc77\udc78\udc79\udc7a\udc7b\udc7c\udc7d\udc7e\udc7f\udc80\udc81\udc82\udc83\udc84\udc85\udc86\udc87\udc88\udc89\udc8a\udc8b\udc8c\udc8d\udc8e\udc8f\udc90\udc91\udc92\udc93\udc94\udc95\udc96\udc97\udc98\udc99\udc9a\udc9b\udc9c\udc9d\udc9e\udc9f\udca0\udca1\udca2\udca3\udca4\udca5\udca6\udca7\udca8\udca9\udcaa\udcab\udcac\udcad\udcae\udcaf\udcb0\udcb1\udcb2\udcb3\udcb4\udcb5\udcb6\udcb7\udcb8\udcb9\udcba\udcbb\udcbc\udcbd\udcbe\udcbf\udcc0\udcc1\udcc2\udcc3\udcc4\udcc5\udcc6\udcc7\udcc8\udcc9\udcca\udccb\udccc\udccd\udcce\udccf\udcd0\udcd1\udcd2\udcd3\udcd4\udcd5\udcd6\udcd7\udcd8\udcd9\udcda\udcdb\udcdc\udcdd\udcde\udcdf\udce0\udce1\udce2\udce3\udce4\udce5\udce6\udce7\udce8\udce9\udcea\udceb\udcec\udced\udcee\udcef\udcf0\udcf1\udcf2\udcf3\udcf4\udcf5\udcf6\udcf7\udcf8\udcf9\udcfa\udcfb\udcfc\udcfd\udcfe\udcff\udd00\udd01\udd02\udd03\udd04\udd05\udd06\udd07\udd08\udd09\udd0a\udd0b\udd0c\udd0d\udd0e\udd0f\udd10\udd11\udd12\udd13\udd14\udd15\udd16\udd17\udd18\udd19\udd1a\udd1b\udd1c\udd1d\udd1e\udd1f\udd20\udd21\udd22\udd23\udd24\udd25\udd26\udd27\udd28\udd29\udd2a\udd2b\udd2c\udd2d\udd2e\udd2f\udd30\udd31\udd32\udd33\udd34\udd35\udd36\udd37\udd38\udd39\udd3a\udd3b\udd3c\udd3d\udd3e\udd3f\udd40\udd41\udd42\udd43\udd44\udd45\udd46\udd47\udd48\udd49\udd4a\udd4b\udd4c\udd4d\udd4e\udd4f\udd50\udd51\udd52\udd53\udd54\udd55\udd56\udd57\udd58\udd59\udd5a\udd5b\udd5c\udd5d\udd5e\udd5f\udd60\udd61\udd62\udd63\udd64\udd65\udd66\udd67\udd68\udd69\udd6a\udd6b\udd6c\udd6d\udd6e\udd6f\udd70\udd71\udd72\udd73\udd74\udd75\udd76\udd77\udd78\udd79\udd7a\udd7b\udd7c\udd7d\udd7e\udd7f\udd80\udd81\udd82\udd83\udd84\udd85\udd86\udd87\udd88\udd89\udd8a\udd8b\udd8c\udd8d\udd8e\udd8f\udd90\udd91\udd92\udd93\udd94\udd95\udd96\udd97\udd98\udd99\udd9a\udd9b\udd9c\udd9d\udd9e\udd9f\udda0\udda1\udda2\udda3\udda4\udda5\udda6\udda7\udda8\udda9\uddaa\uddab\uddac\uddad\uddae\uddaf\uddb0\uddb1\uddb2\uddb3\uddb4\uddb5\uddb6\uddb7\uddb8\uddb9\uddba\uddbb\uddbc\uddbd\uddbe\uddbf\uddc0\uddc1\uddc2\uddc3\uddc4\uddc5\uddc6\uddc7\uddc8\uddc9\uddca\uddcb\uddcc\uddcd\uddce\uddcf\uddd0\uddd1\uddd2\uddd3\uddd4\uddd5\uddd6\uddd7\uddd8\uddd9\uddda\udddb\udddc\udddd\uddde\udddf\udde0\udde1\udde2\udde3\udde4\udde5\udde6\udde7\udde8\udde9\uddea\uddeb\uddec\udded\uddee\uddef\uddf0\uddf1\uddf2\uddf3\uddf4\uddf5\uddf6\uddf7\uddf8\uddf9\uddfa\uddfb\uddfc\uddfd\uddfe\uddff\ude00\ude01\ude02\ude03\ude04\ude05\ude06\ude07\ude08\ude09\ude0a\ude0b\ude0c\ude0d\ude0e\ude0f\ude10\ude11\ude12\ude13\ude14\ude15\ude16\ude17\ude18\ude19\ude1a\ude1b\ude1c\ude1d\ude1e\ude1f\ude20\ude21\ude22\ude23\ude24\ude25\ude26\ude27\ude28\ude29\ude2a\ude2b\ude2c\ude2d\ude2e\ude2f\ude30\ude31\ude32\ude33\ude34\ude35\ude36\ude37\ude38\ude39\ude3a\ude3b\ude3c\ude3d\ude3e\ude3f\ude40\ude41\ude42\ude43\ude44\ude45\ude46\ude47\ude48\ude49\ude4a\ude4b\ude4c\ude4d\ude4e\ude4f\ude50\ude51\ude52\ude53\ude54\ude55\ude56\ude57\ude58\ude59\ude5a\ude5b\ude5c\ude5d\ude5e\ude5f\ude60\ude61\ude62\ude63\ude64\ude65\ude66\ude67\ude68\ude69\ude6a\ude6b\ude6c\ude6d\ude6e\ude6f\ude70\ude71\ude72\ude73\ude74\ude75\ude76\ude77\ude78\ude79\ude7a\ude7b\ude7c\ude7d\ude7e\ude7f\ude80\ude81\ude82\ude83\ude84\ude85\ude86\ude87\ude88\ude89\ude8a\ude8b\ude8c\ude8d\ude8e\ude8f\ude90\ude91\ude92\ude93\ude94\ude95\ude96\ude97\ude98\ude99\ude9a\ude9b\ude9c\ude9d\ude9e\ude9f\udea0\udea1\udea2\udea3\udea4\udea5\udea6\udea7\udea8\udea9\udeaa\udeab\udeac\udead\udeae\udeaf\udeb0\udeb1\udeb2\udeb3\udeb4\udeb5\udeb6\udeb7\udeb8\udeb9\udeba\udebb\udebc\udebd\udebe\udebf\udec0\udec1\udec2\udec3\udec4\udec5\udec6\udec7\udec8\udec9\udeca\udecb\udecc\udecd\udece\udecf\uded0\uded1\uded2\uded3\uded4\uded5\uded6\uded7\uded8\uded9\udeda\udedb\udedc\udedd\udede\udedf\udee0\udee1\udee2\udee3\udee4\udee5\udee6\udee7\udee8\udee9\udeea\udeeb\udeec\udeed\udeee\udeef\udef0\udef1\udef2\udef3\udef4\udef5\udef6\udef7\udef8\udef9\udefa\udefb\udefc\udefd\udefe\udeff\udf00\udf01\udf02\udf03\udf04\udf05\udf06\udf07\udf08\udf09\udf0a\udf0b\udf0c\udf0d\udf0e\udf0f\udf10\udf11\udf12\udf13\udf14\udf15\udf16\udf17\udf18\udf19\udf1a\udf1b\udf1c\udf1d\udf1e\udf1f\udf20\udf21\udf22\udf23\udf24\udf25\udf26\udf27\udf28\udf29\udf2a\udf2b\udf2c\udf2d\udf2e\udf2f\udf30\udf31\udf32\udf33\udf34\udf35\udf36\udf37\udf38\udf39\udf3a\udf3b\udf3c\udf3d\udf3e\udf3f\udf40\udf41\udf42\udf43\udf44\udf45\udf46\udf47\udf48\udf49\udf4a\udf4b\udf4c\udf4d\udf4e\udf4f\udf50\udf51\udf52\udf53\udf54\udf55\udf56\udf57\udf58\udf59\udf5a\udf5b\udf5c\udf5d\udf5e\udf5f\udf60\udf61\udf62\udf63\udf64\udf65\udf66\udf67\udf68\udf69\udf6a\udf6b\udf6c\udf6d\udf6e\udf6f\udf70\udf71\udf72\udf73\udf74\udf75\udf76\udf77\udf78\udf79\udf7a\udf7b\udf7c\udf7d\udf7e\udf7f\udf80\udf81\udf82\udf83\udf84\udf85\udf86\udf87\udf88\udf89\udf8a\udf8b\udf8c\udf8d\udf8e\udf8f\udf90\udf91\udf92\udf93\udf94\udf95\udf96\udf97\udf98\udf99\udf9a\udf9b\udf9c\udf9d\udf9e\udf9f\udfa0\udfa1\udfa2\udfa3\udfa4\udfa5\udfa6\udfa7\udfa8\udfa9\udfaa\udfab\udfac\udfad\udfae\udfaf\udfb0\udfb1\udfb2\udfb3\udfb4\udfb5\udfb6\udfb7\udfb8\udfb9\udfba\udfbb\udfbc\udfbd\udfbe\udfbf\udfc0\udfc1\udfc2\udfc3\udfc4\udfc5\udfc6\udfc7\udfc8\udfc9\udfca\udfcb\udfcc\udfcd\udfce\udfcf\udfd0\udfd1\udfd2\udfd3\udfd4\udfd5\udfd6\udfd7\udfd8\udfd9\udfda\udfdb\udfdc\udfdd\udfde\udfdf\udfe0\udfe1\udfe2\udfe3\udfe4\udfe5\udfe6\udfe7\udfe8\udfe9\udfea\udfeb\udfec\udfed\udfee\udfef\udff0\udff1\udff2\udff3\udff4\udff5\udff6\udff7\udff8\udff9\udffa\udffb\udffc\udffd\udffe\udfff'")
-except UnicodeDecodeError:
-    Cs = '' # Jython can't handle isolated surrogates
-
-Ll = u'abcdefghijklmnopqrstuvwxyz\xaa\xb5\xba\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e\u017f\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199\u019a\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd\u01be\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233\u0234\u0235\u0236\u0237\u0238\u0239\u023c\u023f\u0240\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u025b\u025c\u025d\u025e\u025f\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026a\u026b\u026c\u026d\u026e\u026f\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u027b\u027c\u027d\u027e\u027f\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028a\u028b\u028c\u028d\u028e\u028f\u0290\u0291\u0292\u0293\u0294\u0295\u0296\u0297\u0298\u0299\u029a\u029b\u029c\u029d\u029e\u029f\u02a0\u02a1\u02a2\u02a3\u02a4\u02a5\u02a6\u02a7\u02a8\u02a9\u02aa\u02ab\u02ac\u02ad\u02ae\u02af\u0390\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\u03d0\u03d1\u03d5\u03d6\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef\u03f0\u03f1\u03f2\u03f3\u03f5\u03f8\u03fb\u03fc\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045d\u045e\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u1d00\u1d01\u1d02\u1d03\u1d04\u1d05\u1d06\u1d07\u1d08\u1d09\u1d0a\u1d0b\u1d0c\u1d0d\u1d0e\u1d0f\u1d10\u1d11\u1d12\u1d13\u1d14\u1d15\u1d16\u1d17\u1d18\u1d19\u1d1a\u1d1b\u1d1c\u1d1d\u1d1e\u1d1f\u1d20\u1d21\u1d22\u1d23\u1d24\u1d25\u1d26\u1d27\u1d28\u1d29\u1d2a\u1d2b\u1d62\u1d63\u1d64\u1d65\u1d66\u1d67\u1d68\u1d69\u1d6a\u1d6b\u1d6c\u1d6d\u1d6e\u1d6f\u1d70\u1d71\u1d72\u1d73\u1d74\u1d75\u1d76\u1d77\u1d79\u1d7a\u1d7b\u1d7c\u1d7d\u1d7e\u1d7f\u1d80\u1d81\u1d82\u1d83\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a\u1d8b\u1d8c\u1d8d\u1d8e\u1d8f\u1d90\u1d91\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95\u1e96\u1e97\u1e98\u1e99\u1e9a\u1e9b\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1f00\u1f01\u1f02\u1f03\u1f04\u1f05\u1f06\u1f07\u1f10\u1f11\u1f12\u1f13\u1f14\u1f15\u1f20\u1f21\u1f22\u1f23\u1f24\u1f25\u1f26\u1f27\u1f30\u1f31\u1f32\u1f33\u1f34\u1f35\u1f36\u1f37\u1f40\u1f41\u1f42\u1f43\u1f44\u1f45\u1f50\u1f51\u1f52\u1f53\u1f54\u1f55\u1f56\u1f57\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u1f66\u1f67\u1f70\u1f71\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u1f7b\u1f7c\u1f7d\u1f80\u1f81\u1f82\u1f83\u1f84\u1f85\u1f86\u1f87\u1f90\u1f91\u1f92\u1f93\u1f94\u1f95\u1f96\u1f97\u1fa0\u1fa1\u1fa2\u1fa3\u1fa4\u1fa5\u1fa6\u1fa7\u1fb0\u1fb1\u1fb2\u1fb3\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2\u1fc3\u1fc4\u1fc6\u1fc7\u1fd0\u1fd1\u1fd2\u1fd3\u1fd6\u1fd7\u1fe0\u1fe1\u1fe2\u1fe3\u1fe4\u1fe5\u1fe6\u1fe7\u1ff2\u1ff3\u1ff4\u1ff6\u1ff7\u2071\u207f\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146\u2147\u2148\u2149\u2c30\u2c31\u2c32\u2c33\u2c34\u2c35\u2c36\u2c37\u2c38\u2c39\u2c3a\u2c3b\u2c3c\u2c3d\u2c3e\u2c3f\u2c40\u2c41\u2c42\u2c43\u2c44\u2c45\u2c46\u2c47\u2c48\u2c49\u2c4a\u2c4b\u2c4c\u2c4d\u2c4e\u2c4f\u2c50\u2c51\u2c52\u2c53\u2c54\u2c55\u2c56\u2c57\u2c58\u2c59\u2c5a\u2c5b\u2c5c\u2c5d\u2c5e\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d07\u2d08\u2d09\u2d0a\u2d0b\u2d0c\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d13\u2d14\u2d15\u2d16\u2d17\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d1f\u2d20\u2d21\u2d22\u2d23\u2d24\u2d25\ufb00\ufb01\ufb02\ufb03\ufb04\ufb05\ufb06\ufb13\ufb14\ufb15\ufb16\ufb17\uff41\uff42\uff43\uff44\uff45\uff46\uff47\uff48\uff49\uff4a\uff4b\uff4c\uff4d\uff4e\uff4f\uff50\uff51\uff52\uff53\uff54\uff55\uff56\uff57\uff58\uff59\uff5a'
-
-Lm = u'\u02b0\u02b1\u02b2\u02b3\u02b4\u02b5\u02b6\u02b7\u02b8\u02b9\u02ba\u02bb\u02bc\u02bd\u02be\u02bf\u02c0\u02c1\u02c6\u02c7\u02c8\u02c9\u02ca\u02cb\u02cc\u02cd\u02ce\u02cf\u02d0\u02d1\u02e0\u02e1\u02e2\u02e3\u02e4\u02ee\u037a\u0559\u0640\u06e5\u06e6\u0e46\u0ec6\u10fc\u17d7\u1843\u1d2c\u1d2d\u1d2e\u1d2f\u1d30\u1d31\u1d32\u1d33\u1d34\u1d35\u1d36\u1d37\u1d38\u1d39\u1d3a\u1d3b\u1d3c\u1d3d\u1d3e\u1d3f\u1d40\u1d41\u1d42\u1d43\u1d44\u1d45\u1d46\u1d47\u1d48\u1d49\u1d4a\u1d4b\u1d4c\u1d4d\u1d4e\u1d4f\u1d50\u1d51\u1d52\u1d53\u1d54\u1d55\u1d56\u1d57\u1d58\u1d59\u1d5a\u1d5b\u1d5c\u1d5d\u1d5e\u1d5f\u1d60\u1d61\u1d78\u1d9b\u1d9c\u1d9d\u1d9e\u1d9f\u1da0\u1da1\u1da2\u1da3\u1da4\u1da5\u1da6\u1da7\u1da8\u1da9\u1daa\u1dab\u1dac\u1dad\u1dae\u1daf\u1db0\u1db1\u1db2\u1db3\u1db4\u1db5\u1db6\u1db7\u1db8\u1db9\u1dba\u1dbb\u1dbc\u1dbd\u1dbe\u1dbf\u2090\u2091\u2092\u2093\u2094\u2d6f\u3005\u3031\u3032\u3033\u3034\u3035\u303b\u309d\u309e\u30fc\u30fd\u30fe\ua015\uff70\uff9e\uff9f'
-
-Lo = u'\u01bb\u01c0\u01c1\u01c2\u01c3\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u05f0\u05f1\u05f2\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063a\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u066e\u066f\u0671\u0672\u0673\u0674\u0675\u0676\u0677\u0678\u0679\u067a\u067b\u067c\u067d\u067e\u067f\u0680\u0681\u0682\u0683\u0684\u0685\u0686\u0687\u0688\u0689\u068a\u068b\u068c\u068d\u068e\u068f\u0690\u0691\u0692\u0693\u0694\u0695\u0696\u0697\u0698\u0699\u069a\u069b\u069c\u069d\u069e\u069f\u06a0\u06a1\u06a2\u06a3\u06a4\u06a5\u06a6\u06a7\u06a8\u06a9\u06aa\u06ab\u06ac\u06ad\u06ae\u06af\u06b0\u06b1\u06b2\u06b3\u06b4\u06b5\u06b6\u06b7\u06b8\u06b9\u06ba\u06bb\u06bc\u06bd\u06be\u06bf\u06c0\u06c1\u06c2\u06c3\u06c4\u06c5\u06c6\u06c7\u06c8\u06c9\u06ca\u06cb\u06cc\u06cd\u06ce\u06cf\u06d0\u06d1\u06d2\u06d3\u06d5\u06ee\u06ef\u06fa\u06fb\u06fc\u06ff\u0710\u0712\u0713\u0714\u0715\u0716\u0717\u0718\u0719\u071a\u071b\u071c\u071d\u071e\u071f\u0720\u0721\u0722\u0723\u0724\u0725\u0726\u0727\u0728\u0729\u072a\u072b\u072c\u072d\u072e\u072f\u074d\u074e\u074f\u0750\u0751\u0752\u0753\u0754\u0755\u0756\u0757\u0758\u0759\u075a\u075b\u075c\u075d\u075e\u075f\u0760\u0761\u0762\u0763\u0764\u0765\u0766\u0767\u0768\u0769\u076a\u076b\u076c\u076d\u0780\u0781\u0782\u0783\u0784\u0785\u0786\u0787\u0788\u0789\u078a\u078b\u078c\u078d\u078e\u078f\u0790\u0791\u0792\u0793\u0794\u0795\u0796\u0797\u0798\u0799\u079a\u079b\u079c\u079d\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u07b1\u0904\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090d\u090e\u090f\u0910\u0911\u0912\u0913\u0914\u0915\u0916\u0917\u0918\u0919\u091a\u091b\u091c\u091d\u091e\u091f\u0920\u0921\u0922\u0923\u0924\u0925\u0926\u0927\u0928\u0929\u092a\u092b\u092c\u092d\u092e\u092f\u0930\u0931\u0932\u0933\u0934\u0935\u0936\u0937\u0938\u0939\u093d\u0950\u0958\u0959\u095a\u095b\u095c\u095d\u095e\u095f\u0960\u0961\u097d\u0985\u0986\u0987\u0988\u0989\u098a\u098b\u098c\u098f\u0990\u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099a\u099b\u099c\u099d\u099e\u099f\u09a0\u09a1\u09a2\u09a3\u09a4\u09a5\u09a6\u09a7\u09a8\u09aa\u09ab\u09ac\u09ad\u09ae\u09af\u09b0\u09b2\u09b6\u09b7\u09b8\u09b9\u09bd\u09ce\u09dc\u09dd\u09df\u09e0\u09e1\u09f0\u09f1\u0a05\u0a06\u0a07\u0a08\u0a09\u0a0a\u0a0f\u0a10\u0a13\u0a14\u0a15\u0a16\u0a17\u0a18\u0a19\u0a1a\u0a1b\u0a1c\u0a1d\u0a1e\u0a1f\u0a20\u0a21\u0a22\u0a23\u0a24\u0a25\u0a26\u0a27\u0a28\u0a2a\u0a2b\u0a2c\u0a2d\u0a2e\u0a2f\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5a\u0a5b\u0a5c\u0a5e\u0a72\u0a73\u0a74\u0a85\u0a86\u0a87\u0a88\u0a89\u0a8a\u0a8b\u0a8c\u0a8d\u0a8f\u0a90\u0a91\u0a93\u0a94\u0a95\u0a96\u0a97\u0a98\u0a99\u0a9a\u0a9b\u0a9c\u0a9d\u0a9e\u0a9f\u0aa0\u0aa1\u0aa2\u0aa3\u0aa4\u0aa5\u0aa6\u0aa7\u0aa8\u0aaa\u0aab\u0aac\u0aad\u0aae\u0aaf\u0ab0\u0ab2\u0ab3\u0ab5\u0ab6\u0ab7\u0ab8\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05\u0b06\u0b07\u0b08\u0b09\u0b0a\u0b0b\u0b0c\u0b0f\u0b10\u0b13\u0b14\u0b15\u0b16\u0b17\u0b18\u0b19\u0b1a\u0b1b\u0b1c\u0b1d\u0b1e\u0b1f\u0b20\u0b21\u0b22\u0b23\u0b24\u0b25\u0b26\u0b27\u0b28\u0b2a\u0b2b\u0b2c\u0b2d\u0b2e\u0b2f\u0b30\u0b32\u0b33\u0b35\u0b36\u0b37\u0b38\u0b39\u0b3d\u0b5c\u0b5d\u0b5f\u0b60\u0b61\u0b71\u0b83\u0b85\u0b86\u0b87\u0b88\u0b89\u0b8a\u0b8e\u0b8f\u0b90\u0b92\u0b93\u0b94\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0ba9\u0baa\u0bae\u0baf\u0bb0\u0bb1\u0bb2\u0bb3\u0bb4\u0bb5\u0bb6\u0bb7\u0bb8\u0bb9\u0c05\u0c06\u0c07\u0c08\u0c09\u0c0a\u0c0b\u0c0c\u0c0e\u0c0f\u0c10\u0c12\u0c13\u0c14\u0c15\u0c16\u0c17\u0c18\u0c19\u0c1a\u0c1b\u0c1c\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24\u0c25\u0c26\u0c27\u0c28\u0c2a\u0c2b\u0c2c\u0c2d\u0c2e\u0c2f\u0c30\u0c31\u0c32\u0c33\u0c35\u0c36\u0c37\u0c38\u0c39\u0c60\u0c61\u0c85\u0c86\u0c87\u0c88\u0c89\u0c8a\u0c8b\u0c8c\u0c8e\u0c8f\u0c90\u0c92\u0c93\u0c94\u0c95\u0c96\u0c97\u0c98\u0c99\u0c9a\u0c9b\u0c9c\u0c9d\u0c9e\u0c9f\u0ca0\u0ca1\u0ca2\u0ca3\u0ca4\u0ca5\u0ca6\u0ca7\u0ca8\u0caa\u0cab\u0cac\u0cad\u0cae\u0caf\u0cb0\u0cb1\u0cb2\u0cb3\u0cb5\u0cb6\u0cb7\u0cb8\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0d05\u0d06\u0d07\u0d08\u0d09\u0d0a\u0d0b\u0d0c\u0d0e\u0d0f\u0d10\u0d12\u0d13\u0d14\u0d15\u0d16\u0d17\u0d18\u0d19\u0d1a\u0d1b\u0d1c\u0d1d\u0d1e\u0d1f\u0d20\u0d21\u0d22\u0d23\u0d24\u0d25\u0d26\u0d27\u0d28\u0d2a\u0d2b\u0d2c\u0d2d\u0d2e\u0d2f\u0d30\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36\u0d37\u0d38\u0d39\u0d60\u0d61\u0d85\u0d86\u0d87\u0d88\u0d89\u0d8a\u0d8b\u0d8c\u0d8d\u0d8e\u0d8f\u0d90\u0d91\u0d92\u0d93\u0d94\u0d95\u0d96\u0d9a\u0d9b\u0d9c\u0d9d\u0d9e\u0d9f\u0da0\u0da1\u0da2\u0da3\u0da4\u0da5\u0da6\u0da7\u0da8\u0da9\u0daa\u0dab\u0dac\u0dad\u0dae\u0daf\u0db0\u0db1\u0db3\u0db4\u0db5\u0db6\u0db7\u0db8\u0db9\u0dba\u0dbb\u0dbd\u0dc0\u0dc1\u0dc2\u0dc3\u0dc4\u0dc5\u0dc6\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e32\u0e33\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94\u0e95\u0e96\u0e97\u0e99\u0e9a\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea1\u0ea2\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead\u0eae\u0eaf\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4\u0edc\u0edd\u0f00\u0f40\u0f41\u0f42\u0f43\u0f44\u0f45\u0f46\u0f47\u0f49\u0f4a\u0f4b\u0f4c\u0f4d\u0f4e\u0f4f\u0f50\u0f51\u0f52\u0f53\u0f54\u0f55\u0f56\u0f57\u0f58\u0f59\u0f5a\u0f5b\u0f5c\u0f5d\u0f5e\u0f5f\u0f60\u0f61\u0f62\u0f63\u0f64\u0f65\u0f66\u0f67\u0f68\u0f69\u0f6a\u0f88\u0f89\u0f8a\u0f8b\u1000\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100a\u100b\u100c\u100d\u100e\u100f\u1010\u1011\u1012\u1013\u1014\u1015\u1016\u1017\u1018\u1019\u101a\u101b\u101c\u101d\u101e\u101f\u1020\u1021\u1023\u1024\u1025\u1026\u1027\u1029\u102a\u1050\u1051\u1052\u1053\u1054\u1055\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6\u10f7\u10f8\u10f9\u10fa\u1100\u1101\u1102\u1103\u1104\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u110c\u110d\u110e\u110f\u1110\u1111\u1112\u1113\u1114\u1115\u1116\u1117\u1118\u1119\u111a\u111b\u111c\u111d\u111e\u111f\u1120\u1121\u1122\u1123\u1124\u1125\u1126\u1127\u1128\u1129\u112a\u112b\u112c\u112d\u112e\u112f\u1130\u1131\u1132\u1133\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u113c\u113d\u113e\u113f\u1140\u1141\u1142\u1143\u1144\u1145\u1146\u1147\u1148\u1149\u114a\u114b\u114c\u114d\u114e\u114f\u1150\u1151\u1152\u1153\u1154\u1155\u1156\u1157\u1158\u1159\u115f\u1160\u1161\u1162\u1163\u1164\u1165\u1166\u1167\u1168\u1169\u116a\u116b\u116c\u116d\u116e\u116f\u1170\u1171\u1172\u1173\u1174\u1175\u1176\u1177\u1178\u1179\u117a\u117b\u117c\u117d\u117e\u117f\u1180\u1181\u1182\u1183\u1184\u1185\u1186\u1187\u1188\u1189\u118a\u118b\u118c\u118d\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u1195\u1196\u1197\u1198\u1199\u119a\u119b\u119c\u119d\u119e\u119f\u11a0\u11a1\u11a2\u11a8\u11a9\u11aa\u11ab\u11ac\u11ad\u11ae\u11af\u11b0\u11b1\u11b2\u11b3\u11b4\u11b5\u11b6\u11b7\u11b8\u11b9\u11ba\u11bb\u11bc\u11bd\u11be\u11bf\u11c0\u11c1\u11c2\u11c3\u11c4\u11c5\u11c6\u11c7\u11c8\u11c9\u11ca\u11cb\u11cc\u11cd\u11ce\u11cf\u11d0\u11d1\u11d2\u11d3\u11d4\u11d5\u11d6\u11d7\u11d8\u11d9\u11da\u11db\u11dc\u11dd\u11de\u11df\u11e0\u11e1\u11e2\u11e3\u11e4\u11e5\u11e6\u11e7\u11e8\u11e9\u11ea\u11eb\u11ec\u11ed\u11ee\u11ef\u11f0\u11f1\u11f2\u11f3\u11f4\u11f5\u11f6\u11f7\u11f8\u11f9\u1200\u1201\u1202\u1203\u1204\u1205\u1206\u1207\u1208\u1209\u120a\u120b\u120c\u120d\u120e\u120f\u1210\u1211\u1212\u1213\u1214\u1215\u1216\u1217\u1218\u1219\u121a\u121b\u121c\u121d\u121e\u121f\u1220\u1221\u1222\u1223\u1224\u1225\u1226\u1227\u1228\u1229\u122a\u122b\u122c\u122d\u122e\u122f\u1230\u1231\u1232\u1233\u1234\u1235\u1236\u1237\u1238\u1239\u123a\u123b\u123c\u123d\u123e\u123f\u1240\u1241\u1242\u1243\u1244\u1245\u1246\u1247\u1248\u124a\u124b\u124c\u124d\u1250\u1251\u1252\u1253\u1254\u1255\u1256\u1258\u125a\u125b\u125c\u125d\u1260\u1261\u1262\u1263\u1264\u1265\u1266\u1267\u1268\u1269\u126a\u126b\u126c\u126d\u126e\u126f\u1270\u1271\u1272\u1273\u1274\u1275\u1276\u1277\u1278\u1279\u127a\u127b\u127c\u127d\u127e\u127f\u1280\u1281\u1282\u1283\u1284\u1285\u1286\u1287\u1288\u128a\u128b\u128c\u128d\u1290\u1291\u1292\u1293\u1294\u1295\u1296\u1297\u1298\u1299\u129a\u129b\u129c\u129d\u129e\u129f\u12a0\u12a1\u12a2\u12a3\u12a4\u12a5\u12a6\u12a7\u12a8\u12a9\u12aa\u12ab\u12ac\u12ad\u12ae\u12af\u12b0\u12b2\u12b3\u12b4\u12b5\u12b8\u12b9\u12ba\u12bb\u12bc\u12bd\u12be\u12c0\u12c2\u12c3\u12c4\u12c5\u12c8\u12c9\u12ca\u12cb\u12cc\u12cd\u12ce\u12cf\u12d0\u12d1\u12d2\u12d3\u12d4\u12d5\u12d6\u12d8\u12d9\u12da\u12db\u12dc\u12dd\u12de\u12df\u12e0\u12e1\u12e2\u12e3\u12e4\u12e5\u12e6\u12e7\u12e8\u12e9\u12ea\u12eb\u12ec\u12ed\u12ee\u12ef\u12f0\u12f1\u12f2\u12f3\u12f4\u12f5\u12f6\u12f7\u12f8\u12f9\u12fa\u12fb\u12fc\u12fd\u12fe\u12ff\u1300\u1301\u1302\u1303\u1304\u1305\u1306\u1307\u1308\u1309\u130a\u130b\u130c\u130d\u130e\u130f\u1310\u1312\u1313\u1314\u1315\u1318\u1319\u131a\u131b\u131c\u131d\u131e\u131f\u1320\u1321\u1322\u1323\u1324\u1325\u1326\u1327\u1328\u1329\u132a\u132b\u132c\u132d\u132e\u132f\u1330\u1331\u1332\u1333\u1334\u1335\u1336\u1337\u1338\u1339\u133a\u133b\u133c\u133d\u133e\u133f\u1340\u1341\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134a\u134b\u134c\u134d\u134e\u134f\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u1357\u1358\u1359\u135a\u1380\u1381\u1382\u1383\u1384\u1385\u1386\u1387\u1388\u1389\u138a\u138b\u138c\u138d\u138e\u138f\u13a0\u13a1\u13a2\u13a3\u13a4\u13a5\u13a6\u13a7\u13a8\u13a9\u13aa\u13ab\u13ac\u13ad\u13ae\u13af\u13b0\u13b1\u13b2\u13b3\u13b4\u13b5\u13b6\u13b7\u13b8\u13b9\u13ba\u13bb\u13bc\u13bd\u13be\u13bf\u13c0\u13c1\u13c2\u13c3\u13c4\u13c5\u13c6\u13c7\u13c8\u13c9\u13ca\u13cb\u13cc\u13cd\u13ce\u13cf\u13d0\u13d1\u13d2\u13d3\u13d4\u13d5\u13d6\u13d7\u13d8\u13d9\u13da\u13db\u13dc\u13dd\u13de\u13df\u13e0\u13e1\u13e2\u13e3\u13e4\u13e5\u13e6\u13e7\u13e8\u13e9\u13ea\u13eb\u13ec\u13ed\u13ee\u13ef\u13f0\u13f1\u13f2\u13f3\u13f4\u1401\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u140a\u140b\u140c\u140d\u140e\u140f\u1410\u1411\u1412\u1413\u1414\u1415\u1416\u1417\u1418\u1419\u141a\u141b\u141c\u141d\u141e\u141f\u1420\u1421\u1422\u1423\u1424\u1425\u1426\u1427\u1428\u1429\u142a\u142b\u142c\u142d\u142e\u142f\u1430\u1431\u1432\u1433\u1434\u1435\u1436\u1437\u1438\u1439\u143a\u143b\u143c\u143d\u143e\u143f\u1440\u1441\u1442\u1443\u1444\u1445\u1446\u1447\u1448\u1449\u144a\u144b\u144c\u144d\u144e\u144f\u1450\u1451\u1452\u1453\u1454\u1455\u1456\u1457\u1458\u1459\u145a\u145b\u145c\u145d\u145e\u145f\u1460\u1461\u1462\u1463\u1464\u1465\u1466\u1467\u1468\u1469\u146a\u146b\u146c\u146d\u146e\u146f\u1470\u1471\u1472\u1473\u1474\u1475\u1476\u1477\u1478\u1479\u147a\u147b\u147c\u147d\u147e\u147f\u1480\u1481\u1482\u1483\u1484\u1485\u1486\u1487\u1488\u1489\u148a\u148b\u148c\u148d\u148e\u148f\u1490\u1491\u1492\u1493\u1494\u1495\u1496\u1497\u1498\u1499\u149a\u149b\u149c\u149d\u149e\u149f\u14a0\u14a1\u14a2\u14a3\u14a4\u14a5\u14a6\u14a7\u14a8\u14a9\u14aa\u14ab\u14ac\u14ad\u14ae\u14af\u14b0\u14b1\u14b2\u14b3\u14b4\u14b5\u14b6\u14b7\u14b8\u14b9\u14ba\u14bb\u14bc\u14bd\u14be\u14bf\u14c0\u14c1\u14c2\u14c3\u14c4\u14c5\u14c6\u14c7\u14c8\u14c9\u14ca\u14cb\u14cc\u14cd\u14ce\u14cf\u14d0\u14d1\u14d2\u14d3\u14d4\u14d5\u14d6\u14d7\u14d8\u14d9\u14da\u14db\u14dc\u14dd\u14de\u14df\u14e0\u14e1\u14e2\u14e3\u14e4\u14e5\u14e6\u14e7\u14e8\u14e9\u14ea\u14eb\u14ec\u14ed\u14ee\u14ef\u14f0\u14f1\u14f2\u14f3\u14f4\u14f5\u14f6\u14f7\u14f8\u14f9\u14fa\u14fb\u14fc\u14fd\u14fe\u14ff\u1500\u1501\u1502\u1503\u1504\u1505\u1506\u1507\u1508\u1509\u150a\u150b\u150c\u150d\u150e\u150f\u1510\u1511\u1512\u1513\u1514\u1515\u1516\u1517\u1518\u1519\u151a\u151b\u151c\u151d\u151e\u151f\u1520\u1521\u1522\u1523\u1524\u1525\u1526\u1527\u1528\u1529\u152a\u152b\u152c\u152d\u152e\u152f\u1530\u1531\u1532\u1533\u1534\u1535\u1536\u1537\u1538\u1539\u153a\u153b\u153c\u153d\u153e\u153f\u1540\u1541\u1542\u1543\u1544\u1545\u1546\u1547\u1548\u1549\u154a\u154b\u154c\u154d\u154e\u154f\u1550\u1551\u1552\u1553\u1554\u1555\u1556\u1557\u1558\u1559\u155a\u155b\u155c\u155d\u155e\u155f\u1560\u1561\u1562\u1563\u1564\u1565\u1566\u1567\u1568\u1569\u156a\u156b\u156c\u156d\u156e\u156f\u1570\u1571\u1572\u1573\u1574\u1575\u1576\u1577\u1578\u1579\u157a\u157b\u157c\u157d\u157e\u157f\u1580\u1581\u1582\u1583\u1584\u1585\u1586\u1587\u1588\u1589\u158a\u158b\u158c\u158d\u158e\u158f\u1590\u1591\u1592\u1593\u1594\u1595\u1596\u1597\u1598\u1599\u159a\u159b\u159c\u159d\u159e\u159f\u15a0\u15a1\u15a2\u15a3\u15a4\u15a5\u15a6\u15a7\u15a8\u15a9\u15aa\u15ab\u15ac\u15ad\u15ae\u15af\u15b0\u15b1\u15b2\u15b3\u15b4\u15b5\u15b6\u15b7\u15b8\u15b9\u15ba\u15bb\u15bc\u15bd\u15be\u15bf\u15c0\u15c1\u15c2\u15c3\u15c4\u15c5\u15c6\u15c7\u15c8\u15c9\u15ca\u15cb\u15cc\u15cd\u15ce\u15cf\u15d0\u15d1\u15d2\u15d3\u15d4\u15d5\u15d6\u15d7\u15d8\u15d9\u15da\u15db\u15dc\u15dd\u15de\u15df\u15e0\u15e1\u15e2\u15e3\u15e4\u15e5\u15e6\u15e7\u15e8\u15e9\u15ea\u15eb\u15ec\u15ed\u15ee\u15ef\u15f0\u15f1\u15f2\u15f3\u15f4\u15f5\u15f6\u15f7\u15f8\u15f9\u15fa\u15fb\u15fc\u15fd\u15fe\u15ff\u1600\u1601\u1602\u1603\u1604\u1605\u1606\u1607\u1608\u1609\u160a\u160b\u160c\u160d\u160e\u160f\u1610\u1611\u1612\u1613\u1614\u1615\u1616\u1617\u1618\u1619\u161a\u161b\u161c\u161d\u161e\u161f\u1620\u1621\u1622\u1623\u1624\u1625\u1626\u1627\u1628\u1629\u162a\u162b\u162c\u162d\u162e\u162f\u1630\u1631\u1632\u1633\u1634\u1635\u1636\u1637\u1638\u1639\u163a\u163b\u163c\u163d\u163e\u163f\u1640\u1641\u1642\u1643\u1644\u1645\u1646\u1647\u1648\u1649\u164a\u164b\u164c\u164d\u164e\u164f\u1650\u1651\u1652\u1653\u1654\u1655\u1656\u1657\u1658\u1659\u165a\u165b\u165c\u165d\u165e\u165f\u1660\u1661\u1662\u1663\u1664\u1665\u1666\u1667\u1668\u1669\u166a\u166b\u166c\u166f\u1670\u1671\u1672\u1673\u1674\u1675\u1676\u1681\u1682\u1683\u1684\u1685\u1686\u1687\u1688\u1689\u168a\u168b\u168c\u168d\u168e\u168f\u1690\u1691\u1692\u1693\u1694\u1695\u1696\u1697\u1698\u1699\u169a\u16a0\u16a1\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af\u16b0\u16b1\u16b2\u16b3\u16b4\u16b5\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u1700\u1701\u1702\u1703\u1704\u1705\u1706\u1707\u1708\u1709\u170a\u170b\u170c\u170e\u170f\u1710\u1711\u1720\u1721\u1722\u1723\u1724\u1725\u1726\u1727\u1728\u1729\u172a\u172b\u172c\u172d\u172e\u172f\u1730\u1731\u1740\u1741\u1742\u1743\u1744\u1745\u1746\u1747\u1748\u1749\u174a\u174b\u174c\u174d\u174e\u174f\u1750\u1751\u1760\u1761\u1762\u1763\u1764\u1765\u1766\u1767\u1768\u1769\u176a\u176b\u176c\u176e\u176f\u1770\u1780\u1781\u1782\u1783\u1784\u1785\u1786\u1787\u1788\u1789\u178a\u178b\u178c\u178d\u178e\u178f\u1790\u1791\u1792\u1793\u1794\u1795\u1796\u1797\u1798\u1799\u179a\u179b\u179c\u179d\u179e\u179f\u17a0\u17a1\u17a2\u17a3\u17a4\u17a5\u17a6\u17a7\u17a8\u17a9\u17aa\u17ab\u17ac\u17ad\u17ae\u17af\u17b0\u17b1\u17b2\u17b3\u17dc\u1820\u1821\u1822\u1823\u1824\u1825\u1826\u1827\u1828\u1829\u182a\u182b\u182c\u182d\u182e\u182f\u1830\u1831\u1832\u1833\u1834\u1835\u1836\u1837\u1838\u1839\u183a\u183b\u183c\u183d\u183e\u183f\u1840\u1841\u1842\u1844\u1845\u1846\u1847\u1848\u1849\u184a\u184b\u184c\u184d\u184e\u184f\u1850\u1851\u1852\u1853\u1854\u1855\u1856\u1857\u1858\u1859\u185a\u185b\u185c\u185d\u185e\u185f\u1860\u1861\u1862\u1863\u1864\u1865\u1866\u1867\u1868\u1869\u186a\u186b\u186c\u186d\u186e\u186f\u1870\u1871\u1872\u1873\u1874\u1875\u1876\u1877\u1880\u1881\u1882\u1883\u1884\u1885\u1886\u1887\u1888\u1889\u188a\u188b\u188c\u188d\u188e\u188f\u1890\u1891\u1892\u1893\u1894\u1895\u1896\u1897\u1898\u1899\u189a\u189b\u189c\u189d\u189e\u189f\u18a0\u18a1\u18a2\u18a3\u18a4\u18a5\u18a6\u18a7\u18a8\u1900\u1901\u1902\u1903\u1904\u1905\u1906\u1907\u1908\u1909\u190a\u190b\u190c\u190d\u190e\u190f\u1910\u1911\u1912\u1913\u1914\u1915\u1916\u1917\u1918\u1919\u191a\u191b\u191c\u1950\u1951\u1952\u1953\u1954\u1955\u1956\u1957\u1958\u1959\u195a\u195b\u195c\u195d\u195e\u195f\u1960\u1961\u1962\u1963\u1964\u1965\u1966\u1967\u1968\u1969\u196a\u196b\u196c\u196d\u1970\u1971\u1972\u1973\u1974\u1980\u1981\u1982\u1983\u1984\u1985\u1986\u1987\u1988\u1989\u198a\u198b\u198c\u198d\u198e\u198f\u1990\u1991\u1992\u1993\u1994\u1995\u1996\u1997\u1998\u1999\u199a\u199b\u199c\u199d\u199e\u199f\u19a0\u19a1\u19a2\u19a3\u19a4\u19a5\u19a6\u19a7\u19a8\u19a9\u19c1\u19c2\u19c3\u19c4\u19c5\u19c6\u19c7\u1a00\u1a01\u1a02\u1a03\u1a04\u1a05\u1a06\u1a07\u1a08\u1a09\u1a0a\u1a0b\u1a0c\u1a0d\u1a0e\u1a0f\u1a10\u1a11\u1a12\u1a13\u1a14\u1a15\u1a16\u2135\u2136\u2137\u2138\u2d30\u2d31\u2d32\u2d33\u2d34\u2d35\u2d36\u2d37\u2d38\u2d39\u2d3a\u2d3b\u2d3c\u2d3d\u2d3e\u2d3f\u2d40\u2d41\u2d42\u2d43\u2d44\u2d45\u2d46\u2d47\u2d48\u2d49\u2d4a\u2d4b\u2d4c\u2d4d\u2d4e\u2d4f\u2d50\u2d51\u2d52\u2d53\u2d54\u2d55\u2d56\u2d57\u2d58\u2d59\u2d5a\u2d5b\u2d5c\u2d5d\u2d5e\u2d5f\u2d60\u2d61\u2d62\u2d63\u2d64\u2d65\u2d80\u2d81\u2d82\u2d83\u2d84\u2d85\u2d86\u2d87\u2d88\u2d89\u2d8a\u2d8b\u2d8c\u2d8d\u2d8e\u2d8f\u2d90\u2d91\u2d92\u2d93\u2d94\u2d95\u2d96\u2da0\u2da1\u2da2\u2da3\u2da4\u2da5\u2da6\u2da8\u2da9\u2daa\u2dab\u2dac\u2dad\u2dae\u2db0\u2db1\u2db2\u2db3\u2db4\u2db5\u2db6\u2db8\u2db9\u2dba\u2dbb\u2dbc\u2dbd\u2dbe\u2dc0\u2dc1\u2dc2\u2dc3\u2dc4\u2dc5\u2dc6\u2dc8\u2dc9\u2dca\u2dcb\u2dcc\u2dcd\u2dce\u2dd0\u2dd1\u2dd2\u2dd3\u2dd4\u2dd5\u2dd6\u2dd8\u2dd9\u2dda\u2ddb\u2ddc\u2ddd\u2dde\u3006\u303c\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049\u304a\u304b\u304c\u304d\u304e\u304f\u3050\u3051\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059\u305a\u305b\u305c\u305d\u305e\u305f\u3060\u3061\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306a\u306b\u306c\u306d\u306e\u306f\u3070\u3071\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079\u307a\u307b\u307c\u307d\u307e\u307f\u3080\u3081\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089\u308a\u308b\u308c\u308d\u308e\u308f\u3090\u3091\u3092\u3093\u3094\u3095\u3096\u309f\u30a1\u30a2\u30a3\u30a4\u30a5\u30a6\u30a7\u30a8\u30a9\u30aa\u30ab\u30ac\u30ad\u30ae\u30af\u30b0\u30b1\u30b2\u30b3\u30b4\u30b5\u30b6\u30b7\u30b8\u30b9\u30ba\u30bb\u30bc\u30bd\u30be\u30bf\u30c0\u30c1\u30c2\u30c3\u30c4\u30c5\u30c6\u30c7\u30c8\u30c9\u30ca\u30cb\u30cc\u30cd\u30ce\u30cf\u30d0\u30d1\u30d2\u30d3\u30d4\u30d5\u30d6\u30d7\u30d8\u30d9\u30da\u30db\u30dc\u30dd\u30de\u30df\u30e0\u30e1\u30e2\u30e3\u30e4\u30e5\u30e6\u30e7\u30e8\u30e9\u30ea\u30eb\u30ec\u30ed\u30ee\u30ef\u30f0\u30f1\u30f2\u30f3\u30f4\u30f5\u30f6\u30f7\u30f8\u30f9\u30fa\u30ff\u3105\u3106\u3107\u3108\u3109\u310a\u310b\u310c\u310d\u310e\u310f\u3110\u3111\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119\u311a\u311b\u311c\u311d\u311e\u311f\u3120\u3121\u3122\u3123\u3124\u3125\u3126\u3127\u3128\u3129\u312a\u312b\u312c\u3131\u3132\u3133\u3134\u3135\u3136\u3137\u3138\u3139\u313a\u313b\u313c\u313d\u313e\u313f\u3140\u3141\u3142\u3143\u3144\u3145\u3146\u3147\u3148\u3149\u314a\u314b\u314c\u314d\u314e\u314f\u3150\u3151\u3152\u3153\u3154\u3155\u3156\u3157\u3158\u3159\u315a\u315b\u315c\u315d\u315e\u315f\u3160\u3161\u3162\u3163\u3164\u3165\u3166\u3167\u3168\u3169\u316a\u316b\u316c\u316d\u316e\u316f\u3170\u3171\u3172\u3173\u3174\u3175\u3176\u3177\u3178\u3179\u317a\u317b\u317c\u317d\u317e\u317f\u3180\u3181\u3182\u3183\u3184\u3185\u3186\u3187\u3188\u3189\u318a\u318b\u318c\u318d\u318e\u31a0\u31a1\u31a2\u31a3\u31a4\u31a5\u31a6\u31a7\u31a8\u31a9\u31aa\u31ab\u31ac\u31ad\u31ae\u31af\u31b0\u31b1\u31b2\u31b3\u31b4\u31b5\u31b6\u31b7\u31f0\u31f1\u31f2\u31f3\u31f4\u31f5\u31f6\u31f7\u31f8\u31f9\u31fa\u31fb\u31fc\u31fd\u31fe\u31ff\u3400\u3401\u3402\u3403\u3404\u3405\u3406\u3407\u3408\u3409\u340a\u340b\u340c\u340d\u340e\u340f\u3410\u3411\u3412\u3413\u3414\u3415\u3416\u3417\u3418\u3419\u341a\u341b\u341c\u341d\u341e\u341f\u3420\u3421\u3422\u3423\u3424\u3425\u3426\u3427\u3428\u3429\u342a\u342b\u342c\u342d\u342e\u342f\u3430\u3431\u3432\u3433\u3434\u3435\u3436\u3437\u3438\u3439\u343a\u343b\u343c\u343d\u343e\u343f\u3440\u3441\u3442\u3443\u3444\u3445\u3446\u3447\u3448\u3449\u344a\u344b\u344c\u344d\u344e\u344f\u3450\u3451\u3452\u3453\u3454\u3455\u3456\u3457\u3458\u3459\u345a\u345b\u345c\u345d\u345e\u345f\u3460\u3461\u3462\u3463\u3464\u3465\u3466\u3467\u3468\u3469\u346a\u346b\u346c\u346d\u346e\u346f\u3470\u3471\u3472\u3473\u3474\u3475\u3476\u3477\u3478\u3479\u347a\u347b\u347c\u347d\u347e\u347f\u3480\u3481\u3482\u3483\u3484\u3485\u3486\u3487\u3488\u3489\u348a\u348b\u348c\u348d\u348e\u348f\u3490\u3491\u3492\u3493\u3494\u3495\u3496\u3497\u3498\u3499\u349a\u349b\u349c\u349d\u349e\u349f\u34a0\u34a1\u34a2\u34a3\u34a4\u34a5\u34a6\u34a7\u34a8\u34a9\u34aa\u34ab\u34ac\u34ad\u34ae\u34af\u34b0\u34b1\u34b2\u34b3\u34b4\u34b5\u34b6\u34b7\u34b8\u34b9\u34ba\u34bb\u34bc\u34bd\u34be\u34bf\u34c0\u34c1\u34c2\u34c3\u34c4\u34c5\u34c6\u34c7\u34c8\u34c9\u34ca\u34cb\u34cc\u34cd\u34ce\u34cf\u34d0\u34d1\u34d2\u34d3\u34d4\u34d5\u34d6\u34d7\u34d8\u34d9\u34da\u34db\u34dc\u34dd\u34de\u34df\u34e0\u34e1\u34e2\u34e3\u34e4\u34e5\u34e6\u34e7\u34e8\u34e9\u34ea\u34eb\u34ec\u34ed\u34ee\u34ef\u34f0\u34f1\u34f2\u34f3\u34f4\u34f5\u34f6\u34f7\u34f8\u34f9\u34fa\u34fb\u34fc\u34fd\u34fe\u34ff\u3500\u3501\u3502\u3503\u3504\u3505\u3506\u3507\u3508\u3509\u350a\u350b\u350c\u350d\u350e\u350f\u3510\u3511\u3512\u3513\u3514\u3515\u3516\u3517\u3518\u3519\u351a\u351b\u351c\u351d\u351e\u351f\u3520\u3521\u3522\u3523\u3524\u3525\u3526\u3527\u3528\u3529\u352a\u352b\u352c\u352d\u352e\u352f\u3530\u3531\u3532\u3533\u3534\u3535\u3536\u3537\u3538\u3539\u353a\u353b\u353c\u353d\u353e\u353f\u3540\u3541\u3542\u3543\u3544\u3545\u3546\u3547\u3548\u3549\u354a\u354b\u354c\u354d\u354e\u354f\u3550\u3551\u3552\u3553\u3554\u3555\u3556\u3557\u3558\u3559\u355a\u355b\u355c\u355d\u355e\u355f\u3560\u3561\u3562\u3563\u3564\u3565\u3566\u3567\u3568\u3569\u356a\u356b\u356c\u356d\u356e\u356f\u3570\u3571\u3572\u3573\u3574\u3575\u3576\u3577\u3578\u3579\u357a\u357b\u357c\u357d\u357e\u357f\u3580\u3581\u3582\u3583\u3584\u3585\u3586\u3587\u3588\u3589\u358a\u358b\u358c\u358d\u358e\u358f\u3590\u3591\u3592\u3593\u3594\u3595\u3596\u3597\u3598\u3599\u359a\u359b\u359c\u359d\u359e\u359f\u35a0\u35a1\u35a2\u35a3\u35a4\u35a5\u35a6\u35a7\u35a8\u35a9\u35aa\u35ab\u35ac\u35ad\u35ae\u35af\u35b0\u35b1\u35b2\u35b3\u35b4\u35b5\u35b6\u35b7\u35b8\u35b9\u35ba\u35bb\u35bc\u35bd\u35be\u35bf\u35c0\u35c1\u35c2\u35c3\u35c4\u35c5\u35c6\u35c7\u35c8\u35c9\u35ca\u35cb\u35cc\u35cd\u35ce\u35cf\u35d0\u35d1\u35d2\u35d3\u35d4\u35d5\u35d6\u35d7\u35d8\u35d9\u35da\u35db\u35dc\u35dd\u35de\u35df\u35e0\u35e1\u35e2\u35e3\u35e4\u35e5\u35e6\u35e7\u35e8\u35e9\u35ea\u35eb\u35ec\u35ed\u35ee\u35ef\u35f0\u35f1\u35f2\u35f3\u35f4\u35f5\u35f6\u35f7\u35f8\u35f9\u35fa\u35fb\u35fc\u35fd\u35fe\u35ff\u3600\u3601\u3602\u3603\u3604\u3605\u3606\u3607\u3608\u3609\u360a\u360b\u360c\u360d\u360e\u360f\u3610\u3611\u3612\u3613\u3614\u3615\u3616\u3617\u3618\u3619\u361a\u361b\u361c\u361d\u361e\u361f\u3620\u3621\u3622\u3623\u3624\u3625\u3626\u3627\u3628\u3629\u362a\u362b\u362c\u362d\u362e\u362f\u3630\u3631\u3632\u3633\u3634\u3635\u3636\u3637\u3638\u3639\u363a\u363b\u363c\u363d\u363e\u363f\u3640\u3641\u3642\u3643\u3644\u3645\u3646\u3647\u3648\u3649\u364a\u364b\u364c\u364d\u364e\u364f\u3650\u3651\u3652\u3653\u3654\u3655\u3656\u3657\u3658\u3659\u365a\u365b\u365c\u365d\u365e\u365f\u3660\u3661\u3662\u3663\u3664\u3665\u3666\u3667\u3668\u3669\u366a\u366b\u366c\u366d\u366e\u366f\u3670\u3671\u3672\u3673\u3674\u3675\u3676\u3677\u3678\u3679\u367a\u367b\u367c\u367d\u367e\u367f\u3680\u3681\u3682\u3683\u3684\u3685\u3686\u3687\u3688\u3689\u368a\u368b\u368c\u368d\u368e\u368f\u3690\u3691\u3692\u3693\u3694\u3695\u3696\u3697\u3698\u3699\u369a\u369b\u369c\u369d\u369e\u369f\u36a0\u36a1\u36a2\u36a3\u36a4\u36a5\u36a6\u36a7\u36a8\u36a9\u36aa\u36ab\u36ac\u36ad\u36ae\u36af\u36b0\u36b1\u36b2\u36b3\u36b4\u36b5\u36b6\u36b7\u36b8\u36b9\u36ba\u36bb\u36bc\u36bd\u36be\u36bf\u36c0\u36c1\u36c2\u36c3\u36c4\u36c5\u36c6\u36c7\u36c8\u36c9\u36ca\u36cb\u36cc\u36cd\u36ce\u36cf\u36d0\u36d1\u36d2\u36d3\u36d4\u36d5\u36d6\u36d7\u36d8\u36d9\u36da\u36db\u36dc\u36dd\u36de\u36df\u36e0\u36e1\u36e2\u36e3\u36e4\u36e5\u36e6\u36e7\u36e8\u36e9\u36ea\u36eb\u36ec\u36ed\u36ee\u36ef\u36f0\u36f1\u36f2\u36f3\u36f4\u36f5\u36f6\u36f7\u36f8\u36f9\u36fa\u36fb\u36fc\u36fd\u36fe\u36ff\u3700\u3701\u3702\u3703\u3704\u3705\u3706\u3707\u3708\u3709\u370a\u370b\u370c\u370d\u370e\u370f\u3710\u3711\u3712\u3713\u3714\u3715\u3716\u3717\u3718\u3719\u371a\u371b\u371c\u371d\u371e\u371f\u3720\u3721\u3722\u3723\u3724\u3725\u3726\u3727\u3728\u3729\u372a\u372b\u372c\u372d\u372e\u372f\u3730\u3731\u3732\u3733\u3734\u3735\u3736\u3737\u3738\u3739\u373a\u373b\u373c\u373d\u373e\u373f\u3740\u3741\u3742\u3743\u3744\u3745\u3746\u3747\u3748\u3749\u374a\u374b\u374c\u374d\u374e\u374f\u3750\u3751\u3752\u3753\u3754\u3755\u3756\u3757\u3758\u3759\u375a\u375b\u375c\u375d\u375e\u375f\u3760\u3761\u3762\u3763\u3764\u3765\u3766\u3767\u3768\u3769\u376a\u376b\u376c\u376d\u376e\u376f\u3770\u3771\u3772\u3773\u3774\u3775\u3776\u3777\u3778\u3779\u377a\u377b\u377c\u377d\u377e\u377f\u3780\u3781\u3782\u3783\u3784\u3785\u3786\u3787\u3788\u3789\u378a\u378b\u378c\u378d\u378e\u378f\u3790\u3791\u3792\u3793\u3794\u3795\u3796\u3797\u3798\u3799\u379a\u379b\u379c\u379d\u379e\u379f\u37a0\u37a1\u37a2\u37a3\u37a4\u37a5\u37a6\u37a7\u37a8\u37a9\u37aa\u37ab\u37ac\u37ad\u37ae\u37af\u37b0\u37b1\u37b2\u37b3\u37b4\u37b5\u37b6\u37b7\u37b8\u37b9\u37ba\u37bb\u37bc\u37bd\u37be\u37bf\u37c0\u37c1\u37c2\u37c3\u37c4\u37c5\u37c6\u37c7\u37c8\u37c9\u37ca\u37cb\u37cc\u37cd\u37ce\u37cf\u37d0\u37d1\u37d2\u37d3\u37d4\u37d5\u37d6\u37d7\u37d8\u37d9\u37da\u37db\u37dc\u37dd\u37de\u37df\u37e0\u37e1\u37e2\u37e3\u37e4\u37e5\u37e6\u37e7\u37e8\u37e9\u37ea\u37eb\u37ec\u37ed\u37ee\u37ef\u37f0\u37f1\u37f2\u37f3\u37f4\u37f5\u37f6\u37f7\u37f8\u37f9\u37fa\u37fb\u37fc\u37fd\u37fe\u37ff\u3800\u3801\u3802\u3803\u3804\u3805\u3806\u3807\u3808\u3809\u380a\u380b\u380c\u380d\u380e\u380f\u3810\u3811\u3812\u3813\u3814\u3815\u3816\u3817\u3818\u3819\u381a\u381b\u381c\u381d\u381e\u381f\u3820\u3821\u3822\u3823\u3824\u3825\u3826\u3827\u3828\u3829\u382a\u382b\u382c\u382d\u382e\u382f\u3830\u3831\u3832\u3833\u3834\u3835\u3836\u3837\u3838\u3839\u383a\u383b\u383c\u383d\u383e\u383f\u3840\u3841\u3842\u3843\u3844\u3845\u3846\u3847\u3848\u3849\u384a\u384b\u384c\u384d\u384e\u384f\u3850\u3851\u3852\u3853\u3854\u3855\u3856\u3857\u3858\u3859\u385a\u385b\u385c\u385d\u385e\u385f\u3860\u3861\u3862\u3863\u3864\u3865\u3866\u3867\u3868\u3869\u386a\u386b\u386c\u386d\u386e\u386f\u3870\u3871\u3872\u3873\u3874\u3875\u3876\u3877\u3878\u3879\u387a\u387b\u387c\u387d\u387e\u387f\u3880\u3881\u3882\u3883\u3884\u3885\u3886\u3887\u3888\u3889\u388a\u388b\u388c\u388d\u388e\u388f\u3890\u3891\u3892\u3893\u3894\u3895\u3896\u3897\u3898\u3899\u389a\u389b\u389c\u389d\u389e\u389f\u38a0\u38a1\u38a2\u38a3\u38a4\u38a5\u38a6\u38a7\u38a8\u38a9\u38aa\u38ab\u38ac\u38ad\u38ae\u38af\u38b0\u38b1\u38b2\u38b3\u38b4\u38b5\u38b6\u38b7\u38b8\u38b9\u38ba\u38bb\u38bc\u38bd\u38be\u38bf\u38c0\u38c1\u38c2\u38c3\u38c4\u38c5\u38c6\u38c7\u38c8\u38c9\u38ca\u38cb\u38cc\u38cd\u38ce\u38cf\u38d0\u38d1\u38d2\u38d3\u38d4\u38d5\u38d6\u38d7\u38d8\u38d9\u38da\u38db\u38dc\u38dd\u38de\u38df\u38e0\u38e1\u38e2\u38e3\u38e4\u38e5\u38e6\u38e7\u38e8\u38e9\u38ea\u38eb\u38ec\u38ed\u38ee\u38ef\u38f0\u38f1\u38f2\u38f3\u38f4\u38f5\u38f6\u38f7\u38f8\u38f9\u38fa\u38fb\u38fc\u38fd\u38fe\u38ff\u3900\u3901\u3902\u3903\u3904\u3905\u3906\u3907\u3908\u3909\u390a\u390b\u390c\u390d\u390e\u390f\u3910\u3911\u3912\u3913\u3914\u3915\u3916\u3917\u3918\u3919\u391a\u391b\u391c\u391d\u391e\u391f\u3920\u3921\u3922\u3923\u3924\u3925\u3926\u3927\u3928\u3929\u392a\u392b\u392c\u392d\u392e\u392f\u3930\u3931\u3932\u3933\u3934\u3935\u3936\u3937\u3938\u3939\u393a\u393b\u393c\u393d\u393e\u393f\u3940\u3941\u3942\u3943\u3944\u3945\u3946\u3947\u3948\u3949\u394a\u394b\u394c\u394d\u394e\u394f\u3950\u3951\u3952\u3953\u3954\u3955\u3956\u3957\u3958\u3959\u395a\u395b\u395c\u395d\u395e\u395f\u3960\u3961\u3962\u3963\u3964\u3965\u3966\u3967\u3968\u3969\u396a\u396b\u396c\u396d\u396e\u396f\u3970\u3971\u3972\u3973\u3974\u3975\u3976\u3977\u3978\u3979\u397a\u397b\u397c\u397d\u397e\u397f\u3980\u3981\u3982\u3983\u3984\u3985\u3986\u3987\u3988\u3989\u398a\u398b\u398c\u398d\u398e\u398f\u3990\u3991\u3992\u3993\u3994\u3995\u3996\u3997\u3998\u3999\u399a\u399b\u399c\u399d\u399e\u399f\u39a0\u39a1\u39a2\u39a3\u39a4\u39a5\u39a6\u39a7\u39a8\u39a9\u39aa\u39ab\u39ac\u39ad\u39ae\u39af\u39b0\u39b1\u39b2\u39b3\u39b4\u39b5\u39b6\u39b7\u39b8\u39b9\u39ba\u39bb\u39bc\u39bd\u39be\u39bf\u39c0\u39c1\u39c2\u39c3\u39c4\u39c5\u39c6\u39c7\u39c8\u39c9\u39ca\u39cb\u39cc\u39cd\u39ce\u39cf\u39d0\u39d1\u39d2\u39d3\u39d4\u39d5\u39d6\u39d7\u39d8\u39d9\u39da\u39db\u39dc\u39dd\u39de\u39df\u39e0\u39e1\u39e2\u39e3\u39e4\u39e5\u39e6\u39e7\u39e8\u39e9\u39ea\u39eb\u39ec\u39ed\u39ee\u39ef\u39f0\u39f1\u39f2\u39f3\u39f4\u39f5\u39f6\u39f7\u39f8\u39f9\u39fa\u39fb\u39fc\u39fd\u39fe\u39ff\u3a00\u3a01\u3a02\u3a03\u3a04\u3a05\u3a06\u3a07\u3a08\u3a09\u3a0a\u3a0b\u3a0c\u3a0d\u3a0e\u3a0f\u3a10\u3a11\u3a12\u3a13\u3a14\u3a15\u3a16\u3a17\u3a18\u3a19\u3a1a\u3a1b\u3a1c\u3a1d\u3a1e\u3a1f\u3a20\u3a21\u3a22\u3a23\u3a24\u3a25\u3a26\u3a27\u3a28\u3a29\u3a2a\u3a2b\u3a2c\u3a2d\u3a2e\u3a2f\u3a30\u3a31\u3a32\u3a33\u3a34\u3a35\u3a36\u3a37\u3a38\u3a39\u3a3a\u3a3b\u3a3c\u3a3d\u3a3e\u3a3f\u3a40\u3a41\u3a42\u3a43\u3a44\u3a45\u3a46\u3a47\u3a48\u3a49\u3a4a\u3a4b\u3a4c\u3a4d\u3a4e\u3a4f\u3a50\u3a51\u3a52\u3a53\u3a54\u3a55\u3a56\u3a57\u3a58\u3a59\u3a5a\u3a5b\u3a5c\u3a5d\u3a5e\u3a5f\u3a60\u3a61\u3a62\u3a63\u3a64\u3a65\u3a66\u3a67\u3a68\u3a69\u3a6a\u3a6b\u3a6c\u3a6d\u3a6e\u3a6f\u3a70\u3a71\u3a72\u3a73\u3a74\u3a75\u3a76\u3a77\u3a78\u3a79\u3a7a\u3a7b\u3a7c\u3a7d\u3a7e\u3a7f\u3a80\u3a81\u3a82\u3a83\u3a84\u3a85\u3a86\u3a87\u3a88\u3a89\u3a8a\u3a8b\u3a8c\u3a8d\u3a8e\u3a8f\u3a90\u3a91\u3a92\u3a93\u3a94\u3a95\u3a96\u3a97\u3a98\u3a99\u3a9a\u3a9b\u3a9c\u3a9d\u3a9e\u3a9f\u3aa0\u3aa1\u3aa2\u3aa3\u3aa4\u3aa5\u3aa6\u3aa7\u3aa8\u3aa9\u3aaa\u3aab\u3aac\u3aad\u3aae\u3aaf\u3ab0\u3ab1\u3ab2\u3ab3\u3ab4\u3ab5\u3ab6\u3ab7\u3ab8\u3ab9\u3aba\u3abb\u3abc\u3abd\u3abe\u3abf\u3ac0\u3ac1\u3ac2\u3ac3\u3ac4\u3ac5\u3ac6\u3ac7\u3ac8\u3ac9\u3aca\u3acb\u3acc\u3acd\u3ace\u3acf\u3ad0\u3ad1\u3ad2\u3ad3\u3ad4\u3ad5\u3ad6\u3ad7\u3ad8\u3ad9\u3ada\u3adb\u3adc\u3add\u3ade\u3adf\u3ae0\u3ae1\u3ae2\u3ae3\u3ae4\u3ae5\u3ae6\u3ae7\u3ae8\u3ae9\u3aea\u3aeb\u3aec\u3aed\u3aee\u3aef\u3af0\u3af1\u3af2\u3af3\u3af4\u3af5\u3af6\u3af7\u3af8\u3af9\u3afa\u3afb\u3afc\u3afd\u3afe\u3aff\u3b00\u3b01\u3b02\u3b03\u3b04\u3b05\u3b06\u3b07\u3b08\u3b09\u3b0a\u3b0b\u3b0c\u3b0d\u3b0e\u3b0f\u3b10\u3b11\u3b12\u3b13\u3b14\u3b15\u3b16\u3b17\u3b18\u3b19\u3b1a\u3b1b\u3b1c\u3b1d\u3b1e\u3b1f\u3b20\u3b21\u3b22\u3b23\u3b24\u3b25\u3b26\u3b27\u3b28\u3b29\u3b2a\u3b2b\u3b2c\u3b2d\u3b2e\u3b2f\u3b30\u3b31\u3b32\u3b33\u3b34\u3b35\u3b36\u3b37\u3b38\u3b39\u3b3a\u3b3b\u3b3c\u3b3d\u3b3e\u3b3f\u3b40\u3b41\u3b42\u3b43\u3b44\u3b45\u3b46\u3b47\u3b48\u3b49\u3b4a\u3b4b\u3b4c\u3b4d\u3b4e\u3b4f\u3b50\u3b51\u3b52\u3b53\u3b54\u3b55\u3b56\u3b57\u3b58\u3b59\u3b5a\u3b5b\u3b5c\u3b5d\u3b5e\u3b5f\u3b60\u3b61\u3b62\u3b63\u3b64\u3b65\u3b66\u3b67\u3b68\u3b69\u3b6a\u3b6b\u3b6c\u3b6d\u3b6e\u3b6f\u3b70\u3b71\u3b72\u3b73\u3b74\u3b75\u3b76\u3b77\u3b78\u3b79\u3b7a\u3b7b\u3b7c\u3b7d\u3b7e\u3b7f\u3b80\u3b81\u3b82\u3b83\u3b84\u3b85\u3b86\u3b87\u3b88\u3b89\u3b8a\u3b8b\u3b8c\u3b8d\u3b8e\u3b8f\u3b90\u3b91\u3b92\u3b93\u3b94\u3b95\u3b96\u3b97\u3b98\u3b99\u3b9a\u3b9b\u3b9c\u3b9d\u3b9e\u3b9f\u3ba0\u3ba1\u3ba2\u3ba3\u3ba4\u3ba5\u3ba6\u3ba7\u3ba8\u3ba9\u3baa\u3bab\u3bac\u3bad\u3bae\u3baf\u3bb0\u3bb1\u3bb2\u3bb3\u3bb4\u3bb5\u3bb6\u3bb7\u3bb8\u3bb9\u3bba\u3bbb\u3bbc\u3bbd\u3bbe\u3bbf\u3bc0\u3bc1\u3bc2\u3bc3\u3bc4\u3bc5\u3bc6\u3bc7\u3bc8\u3bc9\u3bca\u3bcb\u3bcc\u3bcd\u3bce\u3bcf\u3bd0\u3bd1\u3bd2\u3bd3\u3bd4\u3bd5\u3bd6\u3bd7\u3bd8\u3bd9\u3bda\u3bdb\u3bdc\u3bdd\u3bde\u3bdf\u3be0\u3be1\u3be2\u3be3\u3be4\u3be5\u3be6\u3be7\u3be8\u3be9\u3bea\u3beb\u3bec\u3bed\u3bee\u3bef\u3bf0\u3bf1\u3bf2\u3bf3\u3bf4\u3bf5\u3bf6\u3bf7\u3bf8\u3bf9\u3bfa\u3bfb\u3bfc\u3bfd\u3bfe\u3bff\u3c00\u3c01\u3c02\u3c03\u3c04\u3c05\u3c06\u3c07\u3c08\u3c09\u3c0a\u3c0b\u3c0c\u3c0d\u3c0e\u3c0f\u3c10\u3c11\u3c12\u3c13\u3c14\u3c15\u3c16\u3c17\u3c18\u3c19\u3c1a\u3c1b\u3c1c\u3c1d\u3c1e\u3c1f\u3c20\u3c21\u3c22\u3c23\u3c24\u3c25\u3c26\u3c27\u3c28\u3c29\u3c2a\u3c2b\u3c2c\u3c2d\u3c2e\u3c2f\u3c30\u3c31\u3c32\u3c33\u3c34\u3c35\u3c36\u3c37\u3c38\u3c39\u3c3a\u3c3b\u3c3c\u3c3d\u3c3e\u3c3f\u3c40\u3c41\u3c42\u3c43\u3c44\u3c45\u3c46\u3c47\u3c48\u3c49\u3c4a\u3c4b\u3c4c\u3c4d\u3c4e\u3c4f\u3c50\u3c51\u3c52\u3c53\u3c54\u3c55\u3c56\u3c57\u3c58\u3c59\u3c5a\u3c5b\u3c5c\u3c5d\u3c5e\u3c5f\u3c60\u3c61\u3c62\u3c63\u3c64\u3c65\u3c66\u3c67\u3c68\u3c69\u3c6a\u3c6b\u3c6c\u3c6d\u3c6e\u3c6f\u3c70\u3c71\u3c72\u3c73\u3c74\u3c75\u3c76\u3c77\u3c78\u3c79\u3c7a\u3c7b\u3c7c\u3c7d\u3c7e\u3c7f\u3c80\u3c81\u3c82\u3c83\u3c84\u3c85\u3c86\u3c87\u3c88\u3c89\u3c8a\u3c8b\u3c8c\u3c8d\u3c8e\u3c8f\u3c90\u3c91\u3c92\u3c93\u3c94\u3c95\u3c96\u3c97\u3c98\u3c99\u3c9a\u3c9b\u3c9c\u3c9d\u3c9e\u3c9f\u3ca0\u3ca1\u3ca2\u3ca3\u3ca4\u3ca5\u3ca6\u3ca7\u3ca8\u3ca9\u3caa\u3cab\u3cac\u3cad\u3cae\u3caf\u3cb0\u3cb1\u3cb2\u3cb3\u3cb4\u3cb5\u3cb6\u3cb7\u3cb8\u3cb9\u3cba\u3cbb\u3cbc\u3cbd\u3cbe\u3cbf\u3cc0\u3cc1\u3cc2\u3cc3\u3cc4\u3cc5\u3cc6\u3cc7\u3cc8\u3cc9\u3cca\u3ccb\u3ccc\u3ccd\u3cce\u3ccf\u3cd0\u3cd1\u3cd2\u3cd3\u3cd4\u3cd5\u3cd6\u3cd7\u3cd8\u3cd9\u3cda\u3cdb\u3cdc\u3cdd\u3cde\u3cdf\u3ce0\u3ce1\u3ce2\u3ce3\u3ce4\u3ce5\u3ce6\u3ce7\u3ce8\u3ce9\u3cea\u3ceb\u3cec\u3ced\u3cee\u3cef\u3cf0\u3cf1\u3cf2\u3cf3\u3cf4\u3cf5\u3cf6\u3cf7\u3cf8\u3cf9\u3cfa\u3cfb\u3cfc\u3cfd\u3cfe\u3cff\u3d00\u3d01\u3d02\u3d03\u3d04\u3d05\u3d06\u3d07\u3d08\u3d09\u3d0a\u3d0b\u3d0c\u3d0d\u3d0e\u3d0f\u3d10\u3d11\u3d12\u3d13\u3d14\u3d15\u3d16\u3d17\u3d18\u3d19\u3d1a\u3d1b\u3d1c\u3d1d\u3d1e\u3d1f\u3d20\u3d21\u3d22\u3d23\u3d24\u3d25\u3d26\u3d27\u3d28\u3d29\u3d2a\u3d2b\u3d2c\u3d2d\u3d2e\u3d2f\u3d30\u3d31\u3d32\u3d33\u3d34\u3d35\u3d36\u3d37\u3d38\u3d39\u3d3a\u3d3b\u3d3c\u3d3d\u3d3e\u3d3f\u3d40\u3d41\u3d42\u3d43\u3d44\u3d45\u3d46\u3d47\u3d48\u3d49\u3d4a\u3d4b\u3d4c\u3d4d\u3d4e\u3d4f\u3d50\u3d51\u3d52\u3d53\u3d54\u3d55\u3d56\u3d57\u3d58\u3d59\u3d5a\u3d5b\u3d5c\u3d5d\u3d5e\u3d5f\u3d60\u3d61\u3d62\u3d63\u3d64\u3d65\u3d66\u3d67\u3d68\u3d69\u3d6a\u3d6b\u3d6c\u3d6d\u3d6e\u3d6f\u3d70\u3d71\u3d72\u3d73\u3d74\u3d75\u3d76\u3d77\u3d78\u3d79\u3d7a\u3d7b\u3d7c\u3d7d\u3d7e\u3d7f\u3d80\u3d81\u3d82\u3d83\u3d84\u3d85\u3d86\u3d87\u3d88\u3d89\u3d8a\u3d8b\u3d8c\u3d8d\u3d8e\u3d8f\u3d90\u3d91\u3d92\u3d93\u3d94\u3d95\u3d96\u3d97\u3d98\u3d99\u3d9a\u3d9b\u3d9c\u3d9d\u3d9e\u3d9f\u3da0\u3da1\u3da2\u3da3\u3da4\u3da5\u3da6\u3da7\u3da8\u3da9\u3daa\u3dab\u3dac\u3dad\u3dae\u3daf\u3db0\u3db1\u3db2\u3db3\u3db4\u3db5\u3db6\u3db7\u3db8\u3db9\u3dba\u3dbb\u3dbc\u3dbd\u3dbe\u3dbf\u3dc0\u3dc1\u3dc2\u3dc3\u3dc4\u3dc5\u3dc6\u3dc7\u3dc8\u3dc9\u3dca\u3dcb\u3dcc\u3dcd\u3dce\u3dcf\u3dd0\u3dd1\u3dd2\u3dd3\u3dd4\u3dd5\u3dd6\u3dd7\u3dd8\u3dd9\u3dda\u3ddb\u3ddc\u3ddd\u3dde\u3ddf\u3de0\u3de1\u3de2\u3de3\u3de4\u3de5\u3de6\u3de7\u3de8\u3de9\u3dea\u3deb\u3dec\u3ded\u3dee\u3def\u3df0\u3df1\u3df2\u3df3\u3df4\u3df5\u3df6\u3df7\u3df8\u3df9\u3dfa\u3dfb\u3dfc\u3dfd\u3dfe\u3dff\u3e00\u3e01\u3e02\u3e03\u3e04\u3e05\u3e06\u3e07\u3e08\u3e09\u3e0a\u3e0b\u3e0c\u3e0d\u3e0e\u3e0f\u3e10\u3e11\u3e12\u3e13\u3e14\u3e15\u3e16\u3e17\u3e18\u3e19\u3e1a\u3e1b\u3e1c\u3e1d\u3e1e\u3e1f\u3e20\u3e21\u3e22\u3e23\u3e24\u3e25\u3e26\u3e27\u3e28\u3e29\u3e2a\u3e2b\u3e2c\u3e2d\u3e2e\u3e2f\u3e30\u3e31\u3e32\u3e33\u3e34\u3e35\u3e36\u3e37\u3e38\u3e39\u3e3a\u3e3b\u3e3c\u3e3d\u3e3e\u3e3f\u3e40\u3e41\u3e42\u3e43\u3e44\u3e45\u3e46\u3e47\u3e48\u3e49\u3e4a\u3e4b\u3e4c\u3e4d\u3e4e\u3e4f\u3e50\u3e51\u3e52\u3e53\u3e54\u3e55\u3e56\u3e57\u3e58\u3e59\u3e5a\u3e5b\u3e5c\u3e5d\u3e5e\u3e5f\u3e60\u3e61\u3e62\u3e63\u3e64\u3e65\u3e66\u3e67\u3e68\u3e69\u3e6a\u3e6b\u3e6c\u3e6d\u3e6e\u3e6f\u3e70\u3e71\u3e72\u3e73\u3e74\u3e75\u3e76\u3e77\u3e78\u3e79\u3e7a\u3e7b\u3e7c\u3e7d\u3e7e\u3e7f\u3e80\u3e81\u3e82\u3e83\u3e84\u3e85\u3e86\u3e87\u3e88\u3e89\u3e8a\u3e8b\u3e8c\u3e8d\u3e8e\u3e8f\u3e90\u3e91\u3e92\u3e93\u3e94\u3e95\u3e96\u3e97\u3e98\u3e99\u3e9a\u3e9b\u3e9c\u3e9d\u3e9e\u3e9f\u3ea0\u3ea1\u3ea2\u3ea3\u3ea4\u3ea5\u3ea6\u3ea7\u3ea8\u3ea9\u3eaa\u3eab\u3eac\u3ead\u3eae\u3eaf\u3eb0\u3eb1\u3eb2\u3eb3\u3eb4\u3eb5\u3eb6\u3eb7\u3eb8\u3eb9\u3eba\u3ebb\u3ebc\u3ebd\u3ebe\u3ebf\u3ec0\u3ec1\u3ec2\u3ec3\u3ec4\u3ec5\u3ec6\u3ec7\u3ec8\u3ec9\u3eca\u3ecb\u3ecc\u3ecd\u3ece\u3ecf\u3ed0\u3ed1\u3ed2\u3ed3\u3ed4\u3ed5\u3ed6\u3ed7\u3ed8\u3ed9\u3eda\u3edb\u3edc\u3edd\u3ede\u3edf\u3ee0\u3ee1\u3ee2\u3ee3\u3ee4\u3ee5\u3ee6\u3ee7\u3ee8\u3ee9\u3eea\u3eeb\u3eec\u3eed\u3eee\u3eef\u3ef0\u3ef1\u3ef2\u3ef3\u3ef4\u3ef5\u3ef6\u3ef7\u3ef8\u3ef9\u3efa\u3efb\u3efc\u3efd\u3efe\u3eff\u3f00\u3f01\u3f02\u3f03\u3f04\u3f05\u3f06\u3f07\u3f08\u3f09\u3f0a\u3f0b\u3f0c\u3f0d\u3f0e\u3f0f\u3f10\u3f11\u3f12\u3f13\u3f14\u3f15\u3f16\u3f17\u3f18\u3f19\u3f1a\u3f1b\u3f1c\u3f1d\u3f1e\u3f1f\u3f20\u3f21\u3f22\u3f23\u3f24\u3f25\u3f26\u3f27\u3f28\u3f29\u3f2a\u3f2b\u3f2c\u3f2d\u3f2e\u3f2f\u3f30\u3f31\u3f32\u3f33\u3f34\u3f35\u3f36\u3f37\u3f38\u3f39\u3f3a\u3f3b\u3f3c\u3f3d\u3f3e\u3f3f\u3f40\u3f41\u3f42\u3f43\u3f44\u3f45\u3f46\u3f47\u3f48\u3f49\u3f4a\u3f4b\u3f4c\u3f4d\u3f4e\u3f4f\u3f50\u3f51\u3f52\u3f53\u3f54\u3f55\u3f56\u3f57\u3f58\u3f59\u3f5a\u3f5b\u3f5c\u3f5d\u3f5e\u3f5f\u3f60\u3f61\u3f62\u3f63\u3f64\u3f65\u3f66\u3f67\u3f68\u3f69\u3f6a\u3f6b\u3f6c\u3f6d\u3f6e\u3f6f\u3f70\u3f71\u3f72\u3f73\u3f74\u3f75\u3f76\u3f77\u3f78\u3f79\u3f7a\u3f7b\u3f7c\u3f7d\u3f7e\u3f7f\u3f80\u3f81\u3f82\u3f83\u3f84\u3f85\u3f86\u3f87\u3f88\u3f89\u3f8a\u3f8b\u3f8c\u3f8d\u3f8e\u3f8f\u3f90\u3f91\u3f92\u3f93\u3f94\u3f95\u3f96\u3f97\u3f98\u3f99\u3f9a\u3f9b\u3f9c\u3f9d\u3f9e\u3f9f\u3fa0\u3fa1\u3fa2\u3fa3\u3fa4\u3fa5\u3fa6\u3fa7\u3fa8\u3fa9\u3faa\u3fab\u3fac\u3fad\u3fae\u3faf\u3fb0\u3fb1\u3fb2\u3fb3\u3fb4\u3fb5\u3fb6\u3fb7\u3fb8\u3fb9\u3fba\u3fbb\u3fbc\u3fbd\u3fbe\u3fbf\u3fc0\u3fc1\u3fc2\u3fc3\u3fc4\u3fc5\u3fc6\u3fc7\u3fc8\u3fc9\u3fca\u3fcb\u3fcc\u3fcd\u3fce\u3fcf\u3fd0\u3fd1\u3fd2\u3fd3\u3fd4\u3fd5\u3fd6\u3fd7\u3fd8\u3fd9\u3fda\u3fdb\u3fdc\u3fdd\u3fde\u3fdf\u3fe0\u3fe1\u3fe2\u3fe3\u3fe4\u3fe5\u3fe6\u3fe7\u3fe8\u3fe9\u3fea\u3feb\u3fec\u3fed\u3fee\u3fef\u3ff0\u3ff1\u3ff2\u3ff3\u3ff4\u3ff5\u3ff6\u3ff7\u3ff8\u3ff9\u3ffa\u3ffb\u3ffc\u3ffd\u3ffe\u3fff\u4000\u4001\u4002\u4003\u4004\u4005\u4006\u4007\u4008\u4009\u400a\u400b\u400c\u400d\u400e\u400f\u4010\u4011\u4012\u4013\u4014\u4015\u4016\u4017\u4018\u4019\u401a\u401b\u401c\u401d\u401e\u401f\u4020\u4021\u4022\u4023\u4024\u4025\u4026\u4027\u4028\u4029\u402a\u402b\u402c\u402d\u402e\u402f\u4030\u4031\u4032\u4033\u4034\u4035\u4036\u4037\u4038\u4039\u403a\u403b\u403c\u403d\u403e\u403f\u4040\u4041\u4042\u4043\u4044\u4045\u4046\u4047\u4048\u4049\u404a\u404b\u404c\u404d\u404e\u404f\u4050\u4051\u4052\u4053\u4054\u4055\u4056\u4057\u4058\u4059\u405a\u405b\u405c\u405d\u405e\u405f\u4060\u4061\u4062\u4063\u4064\u4065\u4066\u4067\u4068\u4069\u406a\u406b\u406c\u406d\u406e\u406f\u4070\u4071\u4072\u4073\u4074\u4075\u4076\u4077\u4078\u4079\u407a\u407b\u407c\u407d\u407e\u407f\u4080\u4081\u4082\u4083\u4084\u4085\u4086\u4087\u4088\u4089\u408a\u408b\u408c\u408d\u408e\u408f\u4090\u4091\u4092\u4093\u4094\u4095\u4096\u4097\u4098\u4099\u409a\u409b\u409c\u409d\u409e\u409f\u40a0\u40a1\u40a2\u40a3\u40a4\u40a5\u40a6\u40a7\u40a8\u40a9\u40aa\u40ab\u40ac\u40ad\u40ae\u40af\u40b0\u40b1\u40b2\u40b3\u40b4\u40b5\u40b6\u40b7\u40b8\u40b9\u40ba\u40bb\u40bc\u40bd\u40be\u40bf\u40c0\u40c1\u40c2\u40c3\u40c4\u40c5\u40c6\u40c7\u40c8\u40c9\u40ca\u40cb\u40cc\u40cd\u40ce\u40cf\u40d0\u40d1\u40d2\u40d3\u40d4\u40d5\u40d6\u40d7\u40d8\u40d9\u40da\u40db\u40dc\u40dd\u40de\u40df\u40e0\u40e1\u40e2\u40e3\u40e4\u40e5\u40e6\u40e7\u40e8\u40e9\u40ea\u40eb\u40ec\u40ed\u40ee\u40ef\u40f0\u40f1\u40f2\u40f3\u40f4\u40f5\u40f6\u40f7\u40f8\u40f9\u40fa\u40fb\u40fc\u40fd\u40fe\u40ff\u4100\u4101\u4102\u4103\u4104\u4105\u4106\u4107\u4108\u4109\u410a\u410b\u410c\u410d\u410e\u410f\u4110\u4111\u4112\u4113\u4114\u4115\u4116\u4117\u4118\u4119\u411a\u411b\u411c\u411d\u411e\u411f\u4120\u4121\u4122\u4123\u4124\u4125\u4126\u4127\u4128\u4129\u412a\u412b\u412c\u412d\u412e\u412f\u4130\u4131\u4132\u4133\u4134\u4135\u4136\u4137\u4138\u4139\u413a\u413b\u413c\u413d\u413e\u413f\u4140\u4141\u4142\u4143\u4144\u4145\u4146\u4147\u4148\u4149\u414a\u414b\u414c\u414d\u414e\u414f\u4150\u4151\u4152\u4153\u4154\u4155\u4156\u4157\u4158\u4159\u415a\u415b\u415c\u415d\u415e\u415f\u4160\u4161\u4162\u4163\u4164\u4165\u4166\u4167\u4168\u4169\u416a\u416b\u416c\u416d\u416e\u416f\u4170\u4171\u4172\u4173\u4174\u4175\u4176\u4177\u4178\u4179\u417a\u417b\u417c\u417d\u417e\u417f\u4180\u4181\u4182\u4183\u4184\u4185\u4186\u4187\u4188\u4189\u418a\u418b\u418c\u418d\u418e\u418f\u4190\u4191\u4192\u4193\u4194\u4195\u4196\u4197\u4198\u4199\u419a\u419b\u419c\u419d\u419e\u419f\u41a0\u41a1\u41a2\u41a3\u41a4\u41a5\u41a6\u41a7\u41a8\u41a9\u41aa\u41ab\u41ac\u41ad\u41ae\u41af\u41b0\u41b1\u41b2\u41b3\u41b4\u41b5\u41b6\u41b7\u41b8\u41b9\u41ba\u41bb\u41bc\u41bd\u41be\u41bf\u41c0\u41c1\u41c2\u41c3\u41c4\u41c5\u41c6\u41c7\u41c8\u41c9\u41ca\u41cb\u41cc\u41cd\u41ce\u41cf\u41d0\u41d1\u41d2\u41d3\u41d4\u41d5\u41d6\u41d7\u41d8\u41d9\u41da\u41db\u41dc\u41dd\u41de\u41df\u41e0\u41e1\u41e2\u41e3\u41e4\u41e5\u41e6\u41e7\u41e8\u41e9\u41ea\u41eb\u41ec\u41ed\u41ee\u41ef\u41f0\u41f1\u41f2\u41f3\u41f4\u41f5\u41f6\u41f7\u41f8\u41f9\u41fa\u41fb\u41fc\u41fd\u41fe\u41ff\u4200\u4201\u4202\u4203\u4204\u4205\u4206\u4207\u4208\u4209\u420a\u420b\u420c\u420d\u420e\u420f\u4210\u4211\u4212\u4213\u4214\u4215\u4216\u4217\u4218\u4219\u421a\u421b\u421c\u421d\u421e\u421f\u4220\u4221\u4222\u4223\u4224\u4225\u4226\u4227\u4228\u4229\u422a\u422b\u422c\u422d\u422e\u422f\u4230\u4231\u4232\u4233\u4234\u4235\u4236\u4237\u4238\u4239\u423a\u423b\u423c\u423d\u423e\u423f\u4240\u4241\u4242\u4243\u4244\u4245\u4246\u4247\u4248\u4249\u424a\u424b\u424c\u424d\u424e\u424f\u4250\u4251\u4252\u4253\u4254\u4255\u4256\u4257\u4258\u4259\u425a\u425b\u425c\u425d\u425e\u425f\u4260\u4261\u4262\u4263\u4264\u4265\u4266\u4267\u4268\u4269\u426a\u426b\u426c\u426d\u426e\u426f\u4270\u4271\u4272\u4273\u4274\u4275\u4276\u4277\u4278\u4279\u427a\u427b\u427c\u427d\u427e\u427f\u4280\u4281\u4282\u4283\u4284\u4285\u4286\u4287\u4288\u4289\u428a\u428b\u428c\u428d\u428e\u428f\u4290\u4291\u4292\u4293\u4294\u4295\u4296\u4297\u4298\u4299\u429a\u429b\u429c\u429d\u429e\u429f\u42a0\u42a1\u42a2\u42a3\u42a4\u42a5\u42a6\u42a7\u42a8\u42a9\u42aa\u42ab\u42ac\u42ad\u42ae\u42af\u42b0\u42b1\u42b2\u42b3\u42b4\u42b5\u42b6\u42b7\u42b8\u42b9\u42ba\u42bb\u42bc\u42bd\u42be\u42bf\u42c0\u42c1\u42c2\u42c3\u42c4\u42c5\u42c6\u42c7\u42c8\u42c9\u42ca\u42cb\u42cc\u42cd\u42ce\u42cf\u42d0\u42d1\u42d2\u42d3\u42d4\u42d5\u42d6\u42d7\u42d8\u42d9\u42da\u42db\u42dc\u42dd\u42de\u42df\u42e0\u42e1\u42e2\u42e3\u42e4\u42e5\u42e6\u42e7\u42e8\u42e9\u42ea\u42eb\u42ec\u42ed\u42ee\u42ef\u42f0\u42f1\u42f2\u42f3\u42f4\u42f5\u42f6\u42f7\u42f8\u42f9\u42fa\u42fb\u42fc\u42fd\u42fe\u42ff\u4300\u4301\u4302\u4303\u4304\u4305\u4306\u4307\u4308\u4309\u430a\u430b\u430c\u430d\u430e\u430f\u4310\u4311\u4312\u4313\u4314\u4315\u4316\u4317\u4318\u4319\u431a\u431b\u431c\u431d\u431e\u431f\u4320\u4321\u4322\u4323\u4324\u4325\u4326\u4327\u4328\u4329\u432a\u432b\u432c\u432d\u432e\u432f\u4330\u4331\u4332\u4333\u4334\u4335\u4336\u4337\u4338\u4339\u433a\u433b\u433c\u433d\u433e\u433f\u4340\u4341\u4342\u4343\u4344\u4345\u4346\u4347\u4348\u4349\u434a\u434b\u434c\u434d\u434e\u434f\u4350\u4351\u4352\u4353\u4354\u4355\u4356\u4357\u4358\u4359\u435a\u435b\u435c\u435d\u435e\u435f\u4360\u4361\u4362\u4363\u4364\u4365\u4366\u4367\u4368\u4369\u436a\u436b\u436c\u436d\u436e\u436f\u4370\u4371\u4372\u4373\u4374\u4375\u4376\u4377\u4378\u4379\u437a\u437b\u437c\u437d\u437e\u437f\u4380\u4381\u4382\u4383\u4384\u4385\u4386\u4387\u4388\u4389\u438a\u438b\u438c\u438d\u438e\u438f\u4390\u4391\u4392\u4393\u4394\u4395\u4396\u4397\u4398\u4399\u439a\u439b\u439c\u439d\u439e\u439f\u43a0\u43a1\u43a2\u43a3\u43a4\u43a5\u43a6\u43a7\u43a8\u43a9\u43aa\u43ab\u43ac\u43ad\u43ae\u43af\u43b0\u43b1\u43b2\u43b3\u43b4\u43b5\u43b6\u43b7\u43b8\u43b9\u43ba\u43bb\u43bc\u43bd\u43be\u43bf\u43c0\u43c1\u43c2\u43c3\u43c4\u43c5\u43c6\u43c7\u43c8\u43c9\u43ca\u43cb\u43cc\u43cd\u43ce\u43cf\u43d0\u43d1\u43d2\u43d3\u43d4\u43d5\u43d6\u43d7\u43d8\u43d9\u43da\u43db\u43dc\u43dd\u43de\u43df\u43e0\u43e1\u43e2\u43e3\u43e4\u43e5\u43e6\u43e7\u43e8\u43e9\u43ea\u43eb\u43ec\u43ed\u43ee\u43ef\u43f0\u43f1\u43f2\u43f3\u43f4\u43f5\u43f6\u43f7\u43f8\u43f9\u43fa\u43fb\u43fc\u43fd\u43fe\u43ff\u4400\u4401\u4402\u4403\u4404\u4405\u4406\u4407\u4408\u4409\u440a\u440b\u440c\u440d\u440e\u440f\u4410\u4411\u4412\u4413\u4414\u4415\u4416\u4417\u4418\u4419\u441a\u441b\u441c\u441d\u441e\u441f\u4420\u4421\u4422\u4423\u4424\u4425\u4426\u4427\u4428\u4429\u442a\u442b\u442c\u442d\u442e\u442f\u4430\u4431\u4432\u4433\u4434\u4435\u4436\u4437\u4438\u4439\u443a\u443b\u443c\u443d\u443e\u443f\u4440\u4441\u4442\u4443\u4444\u4445\u4446\u4447\u4448\u4449\u444a\u444b\u444c\u444d\u444e\u444f\u4450\u4451\u4452\u4453\u4454\u4455\u4456\u4457\u4458\u4459\u445a\u445b\u445c\u445d\u445e\u445f\u4460\u4461\u4462\u4463\u4464\u4465\u4466\u4467\u4468\u4469\u446a\u446b\u446c\u446d\u446e\u446f\u4470\u4471\u4472\u4473\u4474\u4475\u4476\u4477\u4478\u4479\u447a\u447b\u447c\u447d\u447e\u447f\u4480\u4481\u4482\u4483\u4484\u4485\u4486\u4487\u4488\u4489\u448a\u448b\u448c\u448d\u448e\u448f\u4490\u4491\u4492\u4493\u4494\u4495\u4496\u4497\u4498\u4499\u449a\u449b\u449c\u449d\u449e\u449f\u44a0\u44a1\u44a2\u44a3\u44a4\u44a5\u44a6\u44a7\u44a8\u44a9\u44aa\u44ab\u44ac\u44ad\u44ae\u44af\u44b0\u44b1\u44b2\u44b3\u44b4\u44b5\u44b6\u44b7\u44b8\u44b9\u44ba\u44bb\u44bc\u44bd\u44be\u44bf\u44c0\u44c1\u44c2\u44c3\u44c4\u44c5\u44c6\u44c7\u44c8\u44c9\u44ca\u44cb\u44cc\u44cd\u44ce\u44cf\u44d0\u44d1\u44d2\u44d3\u44d4\u44d5\u44d6\u44d7\u44d8\u44d9\u44da\u44db\u44dc\u44dd\u44de\u44df\u44e0\u44e1\u44e2\u44e3\u44e4\u44e5\u44e6\u44e7\u44e8\u44e9\u44ea\u44eb\u44ec\u44ed\u44ee\u44ef\u44f0\u44f1\u44f2\u44f3\u44f4\u44f5\u44f6\u44f7\u44f8\u44f9\u44fa\u44fb\u44fc\u44fd\u44fe\u44ff\u4500\u4501\u4502\u4503\u4504\u4505\u4506\u4507\u4508\u4509\u450a\u450b\u450c\u450d\u450e\u450f\u4510\u4511\u4512\u4513\u4514\u4515\u4516\u4517\u4518\u4519\u451a\u451b\u451c\u451d\u451e\u451f\u4520\u4521\u4522\u4523\u4524\u4525\u4526\u4527\u4528\u4529\u452a\u452b\u452c\u452d\u452e\u452f\u4530\u4531\u4532\u4533\u4534\u4535\u4536\u4537\u4538\u4539\u453a\u453b\u453c\u453d\u453e\u453f\u4540\u4541\u4542\u4543\u4544\u4545\u4546\u4547\u4548\u4549\u454a\u454b\u454c\u454d\u454e\u454f\u4550\u4551\u4552\u4553\u4554\u4555\u4556\u4557\u4558\u4559\u455a\u455b\u455c\u455d\u455e\u455f\u4560\u4561\u4562\u4563\u4564\u4565\u4566\u4567\u4568\u4569\u456a\u456b\u456c\u456d\u456e\u456f\u4570\u4571\u4572\u4573\u4574\u4575\u4576\u4577\u4578\u4579\u457a\u457b\u457c\u457d\u457e\u457f\u4580\u4581\u4582\u4583\u4584\u4585\u4586\u4587\u4588\u4589\u458a\u458b\u458c\u458d\u458e\u458f\u4590\u4591\u4592\u4593\u4594\u4595\u4596\u4597\u4598\u4599\u459a\u459b\u459c\u459d\u459e\u459f\u45a0\u45a1\u45a2\u45a3\u45a4\u45a5\u45a6\u45a7\u45a8\u45a9\u45aa\u45ab\u45ac\u45ad\u45ae\u45af\u45b0\u45b1\u45b2\u45b3\u45b4\u45b5\u45b6\u45b7\u45b8\u45b9\u45ba\u45bb\u45bc\u45bd\u45be\u45bf\u45c0\u45c1\u45c2\u45c3\u45c4\u45c5\u45c6\u45c7\u45c8\u45c9\u45ca\u45cb\u45cc\u45cd\u45ce\u45cf\u45d0\u45d1\u45d2\u45d3\u45d4\u45d5\u45d6\u45d7\u45d8\u45d9\u45da\u45db\u45dc\u45dd\u45de\u45df\u45e0\u45e1\u45e2\u45e3\u45e4\u45e5\u45e6\u45e7\u45e8\u45e9\u45ea\u45eb\u45ec\u45ed\u45ee\u45ef\u45f0\u45f1\u45f2\u45f3\u45f4\u45f5\u45f6\u45f7\u45f8\u45f9\u45fa\u45fb\u45fc\u45fd\u45fe\u45ff\u4600\u4601\u4602\u4603\u4604\u4605\u4606\u4607\u4608\u4609\u460a\u460b\u460c\u460d\u460e\u460f\u4610\u4611\u4612\u4613\u4614\u4615\u4616\u4617\u4618\u4619\u461a\u461b\u461c\u461d\u461e\u461f\u4620\u4621\u4622\u4623\u4624\u4625\u4626\u4627\u4628\u4629\u462a\u462b\u462c\u462d\u462e\u462f\u4630\u4631\u4632\u4633\u4634\u4635\u4636\u4637\u4638\u4639\u463a\u463b\u463c\u463d\u463e\u463f\u4640\u4641\u4642\u4643\u4644\u4645\u4646\u4647\u4648\u4649\u464a\u464b\u464c\u464d\u464e\u464f\u4650\u4651\u4652\u4653\u4654\u4655\u4656\u4657\u4658\u4659\u465a\u465b\u465c\u465d\u465e\u465f\u4660\u4661\u4662\u4663\u4664\u4665\u4666\u4667\u4668\u4669\u466a\u466b\u466c\u466d\u466e\u466f\u4670\u4671\u4672\u4673\u4674\u4675\u4676\u4677\u4678\u4679\u467a\u467b\u467c\u467d\u467e\u467f\u4680\u4681\u4682\u4683\u4684\u4685\u4686\u4687\u4688\u4689\u468a\u468b\u468c\u468d\u468e\u468f\u4690\u4691\u4692\u4693\u4694\u4695\u4696\u4697\u4698\u4699\u469a\u469b\u469c\u469d\u469e\u469f\u46a0\u46a1\u46a2\u46a3\u46a4\u46a5\u46a6\u46a7\u46a8\u46a9\u46aa\u46ab\u46ac\u46ad\u46ae\u46af\u46b0\u46b1\u46b2\u46b3\u46b4\u46b5\u46b6\u46b7\u46b8\u46b9\u46ba\u46bb\u46bc\u46bd\u46be\u46bf\u46c0\u46c1\u46c2\u46c3\u46c4\u46c5\u46c6\u46c7\u46c8\u46c9\u46ca\u46cb\u46cc\u46cd\u46ce\u46cf\u46d0\u46d1\u46d2\u46d3\u46d4\u46d5\u46d6\u46d7\u46d8\u46d9\u46da\u46db\u46dc\u46dd\u46de\u46df\u46e0\u46e1\u46e2\u46e3\u46e4\u46e5\u46e6\u46e7\u46e8\u46e9\u46ea\u46eb\u46ec\u46ed\u46ee\u46ef\u46f0\u46f1\u46f2\u46f3\u46f4\u46f5\u46f6\u46f7\u46f8\u46f9\u46fa\u46fb\u46fc\u46fd\u46fe\u46ff\u4700\u4701\u4702\u4703\u4704\u4705\u4706\u4707\u4708\u4709\u470a\u470b\u470c\u470d\u470e\u470f\u4710\u4711\u4712\u4713\u4714\u4715\u4716\u4717\u4718\u4719\u471a\u471b\u471c\u471d\u471e\u471f\u4720\u4721\u4722\u4723\u4724\u4725\u4726\u4727\u4728\u4729\u472a\u472b\u472c\u472d\u472e\u472f\u4730\u4731\u4732\u4733\u4734\u4735\u4736\u4737\u4738\u4739\u473a\u473b\u473c\u473d\u473e\u473f\u4740\u4741\u4742\u4743\u4744\u4745\u4746\u4747\u4748\u4749\u474a\u474b\u474c\u474d\u474e\u474f\u4750\u4751\u4752\u4753\u4754\u4755\u4756\u4757\u4758\u4759\u475a\u475b\u475c\u475d\u475e\u475f\u4760\u4761\u4762\u4763\u4764\u4765\u4766\u4767\u4768\u4769\u476a\u476b\u476c\u476d\u476e\u476f\u4770\u4771\u4772\u4773\u4774\u4775\u4776\u4777\u4778\u4779\u477a\u477b\u477c\u477d\u477e\u477f\u4780\u4781\u4782\u4783\u4784\u4785\u4786\u4787\u4788\u4789\u478a\u478b\u478c\u478d\u478e\u478f\u4790\u4791\u4792\u4793\u4794\u4795\u4796\u4797\u4798\u4799\u479a\u479b\u479c\u479d\u479e\u479f\u47a0\u47a1\u47a2\u47a3\u47a4\u47a5\u47a6\u47a7\u47a8\u47a9\u47aa\u47ab\u47ac\u47ad\u47ae\u47af\u47b0\u47b1\u47b2\u47b3\u47b4\u47b5\u47b6\u47b7\u47b8\u47b9\u47ba\u47bb\u47bc\u47bd\u47be\u47bf\u47c0\u47c1\u47c2\u47c3\u47c4\u47c5\u47c6\u47c7\u47c8\u47c9\u47ca\u47cb\u47cc\u47cd\u47ce\u47cf\u47d0\u47d1\u47d2\u47d3\u47d4\u47d5\u47d6\u47d7\u47d8\u47d9\u47da\u47db\u47dc\u47dd\u47de\u47df\u47e0\u47e1\u47e2\u47e3\u47e4\u47e5\u47e6\u47e7\u47e8\u47e9\u47ea\u47eb\u47ec\u47ed\u47ee\u47ef\u47f0\u47f1\u47f2\u47f3\u47f4\u47f5\u47f6\u47f7\u47f8\u47f9\u47fa\u47fb\u47fc\u47fd\u47fe\u47ff\u4800\u4801\u4802\u4803\u4804\u4805\u4806\u4807\u4808\u4809\u480a\u480b\u480c\u480d\u480e\u480f\u4810\u4811\u4812\u4813\u4814\u4815\u4816\u4817\u4818\u4819\u481a\u481b\u481c\u481d\u481e\u481f\u4820\u4821\u4822\u4823\u4824\u4825\u4826\u4827\u4828\u4829\u482a\u482b\u482c\u482d\u482e\u482f\u4830\u4831\u4832\u4833\u4834\u4835\u4836\u4837\u4838\u4839\u483a\u483b\u483c\u483d\u483e\u483f\u4840\u4841\u4842\u4843\u4844\u4845\u4846\u4847\u4848\u4849\u484a\u484b\u484c\u484d\u484e\u484f\u4850\u4851\u4852\u4853\u4854\u4855\u4856\u4857\u4858\u4859\u485a\u485b\u485c\u485d\u485e\u485f\u4860\u4861\u4862\u4863\u4864\u4865\u4866\u4867\u4868\u4869\u486a\u486b\u486c\u486d\u486e\u486f\u4870\u4871\u4872\u4873\u4874\u4875\u4876\u4877\u4878\u4879\u487a\u487b\u487c\u487d\u487e\u487f\u4880\u4881\u4882\u4883\u4884\u4885\u4886\u4887\u4888\u4889\u488a\u488b\u488c\u488d\u488e\u488f\u4890\u4891\u4892\u4893\u4894\u4895\u4896\u4897\u4898\u4899\u489a\u489b\u489c\u489d\u489e\u489f\u48a0\u48a1\u48a2\u48a3\u48a4\u48a5\u48a6\u48a7\u48a8\u48a9\u48aa\u48ab\u48ac\u48ad\u48ae\u48af\u48b0\u48b1\u48b2\u48b3\u48b4\u48b5\u48b6\u48b7\u48b8\u48b9\u48ba\u48bb\u48bc\u48bd\u48be\u48bf\u48c0\u48c1\u48c2\u48c3\u48c4\u48c5\u48c6\u48c7\u48c8\u48c9\u48ca\u48cb\u48cc\u48cd\u48ce\u48cf\u48d0\u48d1\u48d2\u48d3\u48d4\u48d5\u48d6\u48d7\u48d8\u48d9\u48da\u48db\u48dc\u48dd\u48de\u48df\u48e0\u48e1\u48e2\u48e3\u48e4\u48e5\u48e6\u48e7\u48e8\u48e9\u48ea\u48eb\u48ec\u48ed\u48ee\u48ef\u48f0\u48f1\u48f2\u48f3\u48f4\u48f5\u48f6\u48f7\u48f8\u48f9\u48fa\u48fb\u48fc\u48fd\u48fe\u48ff\u4900\u4901\u4902\u4903\u4904\u4905\u4906\u4907\u4908\u4909\u490a\u490b\u490c\u490d\u490e\u490f\u4910\u4911\u4912\u4913\u4914\u4915\u4916\u4917\u4918\u4919\u491a\u491b\u491c\u491d\u491e\u491f\u4920\u4921\u4922\u4923\u4924\u4925\u4926\u4927\u4928\u4929\u492a\u492b\u492c\u492d\u492e\u492f\u4930\u4931\u4932\u4933\u4934\u4935\u4936\u4937\u4938\u4939\u493a\u493b\u493c\u493d\u493e\u493f\u4940\u4941\u4942\u4943\u4944\u4945\u4946\u4947\u4948\u4949\u494a\u494b\u494c\u494d\u494e\u494f\u4950\u4951\u4952\u4953\u4954\u4955\u4956\u4957\u4958\u4959\u495a\u495b\u495c\u495d\u495e\u495f\u4960\u4961\u4962\u4963\u4964\u4965\u4966\u4967\u4968\u4969\u496a\u496b\u496c\u496d\u496e\u496f\u4970\u4971\u4972\u4973\u4974\u4975\u4976\u4977\u4978\u4979\u497a\u497b\u497c\u497d\u497e\u497f\u4980\u4981\u4982\u4983\u4984\u4985\u4986\u4987\u4988\u4989\u498a\u498b\u498c\u498d\u498e\u498f\u4990\u4991\u4992\u4993\u4994\u4995\u4996\u4997\u4998\u4999\u499a\u499b\u499c\u499d\u499e\u499f\u49a0\u49a1\u49a2\u49a3\u49a4\u49a5\u49a6\u49a7\u49a8\u49a9\u49aa\u49ab\u49ac\u49ad\u49ae\u49af\u49b0\u49b1\u49b2\u49b3\u49b4\u49b5\u49b6\u49b7\u49b8\u49b9\u49ba\u49bb\u49bc\u49bd\u49be\u49bf\u49c0\u49c1\u49c2\u49c3\u49c4\u49c5\u49c6\u49c7\u49c8\u49c9\u49ca\u49cb\u49cc\u49cd\u49ce\u49cf\u49d0\u49d1\u49d2\u49d3\u49d4\u49d5\u49d6\u49d7\u49d8\u49d9\u49da\u49db\u49dc\u49dd\u49de\u49df\u49e0\u49e1\u49e2\u49e3\u49e4\u49e5\u49e6\u49e7\u49e8\u49e9\u49ea\u49eb\u49ec\u49ed\u49ee\u49ef\u49f0\u49f1\u49f2\u49f3\u49f4\u49f5\u49f6\u49f7\u49f8\u49f9\u49fa\u49fb\u49fc\u49fd\u49fe\u49ff\u4a00\u4a01\u4a02\u4a03\u4a04\u4a05\u4a06\u4a07\u4a08\u4a09\u4a0a\u4a0b\u4a0c\u4a0d\u4a0e\u4a0f\u4a10\u4a11\u4a12\u4a13\u4a14\u4a15\u4a16\u4a17\u4a18\u4a19\u4a1a\u4a1b\u4a1c\u4a1d\u4a1e\u4a1f\u4a20\u4a21\u4a22\u4a23\u4a24\u4a25\u4a26\u4a27\u4a28\u4a29\u4a2a\u4a2b\u4a2c\u4a2d\u4a2e\u4a2f\u4a30\u4a31\u4a32\u4a33\u4a34\u4a35\u4a36\u4a37\u4a38\u4a39\u4a3a\u4a3b\u4a3c\u4a3d\u4a3e\u4a3f\u4a40\u4a41\u4a42\u4a43\u4a44\u4a45\u4a46\u4a47\u4a48\u4a49\u4a4a\u4a4b\u4a4c\u4a4d\u4a4e\u4a4f\u4a50\u4a51\u4a52\u4a53\u4a54\u4a55\u4a56\u4a57\u4a58\u4a59\u4a5a\u4a5b\u4a5c\u4a5d\u4a5e\u4a5f\u4a60\u4a61\u4a62\u4a63\u4a64\u4a65\u4a66\u4a67\u4a68\u4a69\u4a6a\u4a6b\u4a6c\u4a6d\u4a6e\u4a6f\u4a70\u4a71\u4a72\u4a73\u4a74\u4a75\u4a76\u4a77\u4a78\u4a79\u4a7a\u4a7b\u4a7c\u4a7d\u4a7e\u4a7f\u4a80\u4a81\u4a82\u4a83\u4a84\u4a85\u4a86\u4a87\u4a88\u4a89\u4a8a\u4a8b\u4a8c\u4a8d\u4a8e\u4a8f\u4a90\u4a91\u4a92\u4a93\u4a94\u4a95\u4a96\u4a97\u4a98\u4a99\u4a9a\u4a9b\u4a9c\u4a9d\u4a9e\u4a9f\u4aa0\u4aa1\u4aa2\u4aa3\u4aa4\u4aa5\u4aa6\u4aa7\u4aa8\u4aa9\u4aaa\u4aab\u4aac\u4aad\u4aae\u4aaf\u4ab0\u4ab1\u4ab2\u4ab3\u4ab4\u4ab5\u4ab6\u4ab7\u4ab8\u4ab9\u4aba\u4abb\u4abc\u4abd\u4abe\u4abf\u4ac0\u4ac1\u4ac2\u4ac3\u4ac4\u4ac5\u4ac6\u4ac7\u4ac8\u4ac9\u4aca\u4acb\u4acc\u4acd\u4ace\u4acf\u4ad0\u4ad1\u4ad2\u4ad3\u4ad4\u4ad5\u4ad6\u4ad7\u4ad8\u4ad9\u4ada\u4adb\u4adc\u4add\u4ade\u4adf\u4ae0\u4ae1\u4ae2\u4ae3\u4ae4\u4ae5\u4ae6\u4ae7\u4ae8\u4ae9\u4aea\u4aeb\u4aec\u4aed\u4aee\u4aef\u4af0\u4af1\u4af2\u4af3\u4af4\u4af5\u4af6\u4af7\u4af8\u4af9\u4afa\u4afb\u4afc\u4afd\u4afe\u4aff\u4b00\u4b01\u4b02\u4b03\u4b04\u4b05\u4b06\u4b07\u4b08\u4b09\u4b0a\u4b0b\u4b0c\u4b0d\u4b0e\u4b0f\u4b10\u4b11\u4b12\u4b13\u4b14\u4b15\u4b16\u4b17\u4b18\u4b19\u4b1a\u4b1b\u4b1c\u4b1d\u4b1e\u4b1f\u4b20\u4b21\u4b22\u4b23\u4b24\u4b25\u4b26\u4b27\u4b28\u4b29\u4b2a\u4b2b\u4b2c\u4b2d\u4b2e\u4b2f\u4b30\u4b31\u4b32\u4b33\u4b34\u4b35\u4b36\u4b37\u4b38\u4b39\u4b3a\u4b3b\u4b3c\u4b3d\u4b3e\u4b3f\u4b40\u4b41\u4b42\u4b43\u4b44\u4b45\u4b46\u4b47\u4b48\u4b49\u4b4a\u4b4b\u4b4c\u4b4d\u4b4e\u4b4f\u4b50\u4b51\u4b52\u4b53\u4b54\u4b55\u4b56\u4b57\u4b58\u4b59\u4b5a\u4b5b\u4b5c\u4b5d\u4b5e\u4b5f\u4b60\u4b61\u4b62\u4b63\u4b64\u4b65\u4b66\u4b67\u4b68\u4b69\u4b6a\u4b6b\u4b6c\u4b6d\u4b6e\u4b6f\u4b70\u4b71\u4b72\u4b73\u4b74\u4b75\u4b76\u4b77\u4b78\u4b79\u4b7a\u4b7b\u4b7c\u4b7d\u4b7e\u4b7f\u4b80\u4b81\u4b82\u4b83\u4b84\u4b85\u4b86\u4b87\u4b88\u4b89\u4b8a\u4b8b\u4b8c\u4b8d\u4b8e\u4b8f\u4b90\u4b91\u4b92\u4b93\u4b94\u4b95\u4b96\u4b97\u4b98\u4b99\u4b9a\u4b9b\u4b9c\u4b9d\u4b9e\u4b9f\u4ba0\u4ba1\u4ba2\u4ba3\u4ba4\u4ba5\u4ba6\u4ba7\u4ba8\u4ba9\u4baa\u4bab\u4bac\u4bad\u4bae\u4baf\u4bb0\u4bb1\u4bb2\u4bb3\u4bb4\u4bb5\u4bb6\u4bb7\u4bb8\u4bb9\u4bba\u4bbb\u4bbc\u4bbd\u4bbe\u4bbf\u4bc0\u4bc1\u4bc2\u4bc3\u4bc4\u4bc5\u4bc6\u4bc7\u4bc8\u4bc9\u4bca\u4bcb\u4bcc\u4bcd\u4bce\u4bcf\u4bd0\u4bd1\u4bd2\u4bd3\u4bd4\u4bd5\u4bd6\u4bd7\u4bd8\u4bd9\u4bda\u4bdb\u4bdc\u4bdd\u4bde\u4bdf\u4be0\u4be1\u4be2\u4be3\u4be4\u4be5\u4be6\u4be7\u4be8\u4be9\u4bea\u4beb\u4bec\u4bed\u4bee\u4bef\u4bf0\u4bf1\u4bf2\u4bf3\u4bf4\u4bf5\u4bf6\u4bf7\u4bf8\u4bf9\u4bfa\u4bfb\u4bfc\u4bfd\u4bfe\u4bff\u4c00\u4c01\u4c02\u4c03\u4c04\u4c05\u4c06\u4c07\u4c08\u4c09\u4c0a\u4c0b\u4c0c\u4c0d\u4c0e\u4c0f\u4c10\u4c11\u4c12\u4c13\u4c14\u4c15\u4c16\u4c17\u4c18\u4c19\u4c1a\u4c1b\u4c1c\u4c1d\u4c1e\u4c1f\u4c20\u4c21\u4c22\u4c23\u4c24\u4c25\u4c26\u4c27\u4c28\u4c29\u4c2a\u4c2b\u4c2c\u4c2d\u4c2e\u4c2f\u4c30\u4c31\u4c32\u4c33\u4c34\u4c35\u4c36\u4c37\u4c38\u4c39\u4c3a\u4c3b\u4c3c\u4c3d\u4c3e\u4c3f\u4c40\u4c41\u4c42\u4c43\u4c44\u4c45\u4c46\u4c47\u4c48\u4c49\u4c4a\u4c4b\u4c4c\u4c4d\u4c4e\u4c4f\u4c50\u4c51\u4c52\u4c53\u4c54\u4c55\u4c56\u4c57\u4c58\u4c59\u4c5a\u4c5b\u4c5c\u4c5d\u4c5e\u4c5f\u4c60\u4c61\u4c62\u4c63\u4c64\u4c65\u4c66\u4c67\u4c68\u4c69\u4c6a\u4c6b\u4c6c\u4c6d\u4c6e\u4c6f\u4c70\u4c71\u4c72\u4c73\u4c74\u4c75\u4c76\u4c77\u4c78\u4c79\u4c7a\u4c7b\u4c7c\u4c7d\u4c7e\u4c7f\u4c80\u4c81\u4c82\u4c83\u4c84\u4c85\u4c86\u4c87\u4c88\u4c89\u4c8a\u4c8b\u4c8c\u4c8d\u4c8e\u4c8f\u4c90\u4c91\u4c92\u4c93\u4c94\u4c95\u4c96\u4c97\u4c98\u4c99\u4c9a\u4c9b\u4c9c\u4c9d\u4c9e\u4c9f\u4ca0\u4ca1\u4ca2\u4ca3\u4ca4\u4ca5\u4ca6\u4ca7\u4ca8\u4ca9\u4caa\u4cab\u4cac\u4cad\u4cae\u4caf\u4cb0\u4cb1\u4cb2\u4cb3\u4cb4\u4cb5\u4cb6\u4cb7\u4cb8\u4cb9\u4cba\u4cbb\u4cbc\u4cbd\u4cbe\u4cbf\u4cc0\u4cc1\u4cc2\u4cc3\u4cc4\u4cc5\u4cc6\u4cc7\u4cc8\u4cc9\u4cca\u4ccb\u4ccc\u4ccd\u4cce\u4ccf\u4cd0\u4cd1\u4cd2\u4cd3\u4cd4\u4cd5\u4cd6\u4cd7\u4cd8\u4cd9\u4cda\u4cdb\u4cdc\u4cdd\u4cde\u4cdf\u4ce0\u4ce1\u4ce2\u4ce3\u4ce4\u4ce5\u4ce6\u4ce7\u4ce8\u4ce9\u4cea\u4ceb\u4cec\u4ced\u4cee\u4cef\u4cf0\u4cf1\u4cf2\u4cf3\u4cf4\u4cf5\u4cf6\u4cf7\u4cf8\u4cf9\u4cfa\u4cfb\u4cfc\u4cfd\u4cfe\u4cff\u4d00\u4d01\u4d02\u4d03\u4d04\u4d05\u4d06\u4d07\u4d08\u4d09\u4d0a\u4d0b\u4d0c\u4d0d\u4d0e\u4d0f\u4d10\u4d11\u4d12\u4d13\u4d14\u4d15\u4d16\u4d17\u4d18\u4d19\u4d1a\u4d1b\u4d1c\u4d1d\u4d1e\u4d1f\u4d20\u4d21\u4d22\u4d23\u4d24\u4d25\u4d26\u4d27\u4d28\u4d29\u4d2a\u4d2b\u4d2c\u4d2d\u4d2e\u4d2f\u4d30\u4d31\u4d32\u4d33\u4d34\u4d35\u4d36\u4d37\u4d38\u4d39\u4d3a\u4d3b\u4d3c\u4d3d\u4d3e\u4d3f\u4d40\u4d41\u4d42\u4d43\u4d44\u4d45\u4d46\u4d47\u4d48\u4d49\u4d4a\u4d4b\u4d4c\u4d4d\u4d4e\u4d4f\u4d50\u4d51\u4d52\u4d53\u4d54\u4d55\u4d56\u4d57\u4d58\u4d59\u4d5a\u4d5b\u4d5c\u4d5d\u4d5e\u4d5f\u4d60\u4d61\u4d62\u4d63\u4d64\u4d65\u4d66\u4d67\u4d68\u4d69\u4d6a\u4d6b\u4d6c\u4d6d\u4d6e\u4d6f\u4d70\u4d71\u4d72\u4d73\u4d74\u4d75\u4d76\u4d77\u4d78\u4d79\u4d7a\u4d7b\u4d7c\u4d7d\u4d7e\u4d7f\u4d80\u4d81\u4d82\u4d83\u4d84\u4d85\u4d86\u4d87\u4d88\u4d89\u4d8a\u4d8b\u4d8c\u4d8d\u4d8e\u4d8f\u4d90\u4d91\u4d92\u4d93\u4d94\u4d95\u4d96\u4d97\u4d98\u4d99\u4d9a\u4d9b\u4d9c\u4d9d\u4d9e\u4d9f\u4da0\u4da1\u4da2\u4da3\u4da4\u4da5\u4da6\u4da7\u4da8\u4da9\u4daa\u4dab\u4dac\u4dad\u4dae\u4daf\u4db0\u4db1\u4db2\u4db3\u4db4\u4db5\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08\u4e09\u4e0a\u4e0b\u4e0c\u4e0d\u4e0e\u4e0f\u4e10\u4e11\u4e12\u4e13\u4e14\u4e15\u4e16\u4e17\u4e18\u4e19\u4e1a\u4e1b\u4e1c\u4e1d\u4e1e\u4e1f\u4e20\u4e21\u4e22\u4e23\u4e24\u4e25\u4e26\u4e27\u4e28\u4e29\u4e2a\u4e2b\u4e2c\u4e2d\u4e2e\u4e2f\u4e30\u4e31\u4e32\u4e33\u4e34\u4e35\u4e36\u4e37\u4e38\u4e39\u4e3a\u4e3b\u4e3c\u4e3d\u4e3e\u4e3f\u4e40\u4e41\u4e42\u4e43\u4e44\u4e45\u4e46\u4e47\u4e48\u4e49\u4e4a\u4e4b\u4e4c\u4e4d\u4e4e\u4e4f\u4e50\u4e51\u4e52\u4e53\u4e54\u4e55\u4e56\u4e57\u4e58\u4e59\u4e5a\u4e5b\u4e5c\u4e5d\u4e5e\u4e5f\u4e60\u4e61\u4e62\u4e63\u4e64\u4e65\u4e66\u4e67\u4e68\u4e69\u4e6a\u4e6b\u4e6c\u4e6d\u4e6e\u4e6f\u4e70\u4e71\u4e72\u4e73\u4e74\u4e75\u4e76\u4e77\u4e78\u4e79\u4e7a\u4e7b\u4e7c\u4e7d\u4e7e\u4e7f\u4e80\u4e81\u4e82\u4e83\u4e84\u4e85\u4e86\u4e87\u4e88\u4e89\u4e8a\u4e8b\u4e8c\u4e8d\u4e8e\u4e8f\u4e90\u4e91\u4e92\u4e93\u4e94\u4e95\u4e96\u4e97\u4e98\u4e99\u4e9a\u4e9b\u4e9c\u4e9d\u4e9e\u4e9f\u4ea0\u4ea1\u4ea2\u4ea3\u4ea4\u4ea5\u4ea6\u4ea7\u4ea8\u4ea9\u4eaa\u4eab\u4eac\u4ead\u4eae\u4eaf\u4eb0\u4eb1\u4eb2\u4eb3\u4eb4\u4eb5\u4eb6\u4eb7\u4eb8\u4eb9\u4eba\u4ebb\u4ebc\u4ebd\u4ebe\u4ebf\u4ec0\u4ec1\u4ec2\u4ec3\u4ec4\u4ec5\u4ec6\u4ec7\u4ec8\u4ec9\u4eca\u4ecb\u4ecc\u4ecd\u4ece\u4ecf\u4ed0\u4ed1\u4ed2\u4ed3\u4ed4\u4ed5\u4ed6\u4ed7\u4ed8\u4ed9\u4eda\u4edb\u4edc\u4edd\u4ede\u4edf\u4ee0\u4ee1\u4ee2\u4ee3\u4ee4\u4ee5\u4ee6\u4ee7\u4ee8\u4ee9\u4eea\u4eeb\u4eec\u4eed\u4eee\u4eef\u4ef0\u4ef1\u4ef2\u4ef3\u4ef4\u4ef5\u4ef6\u4ef7\u4ef8\u4ef9\u4efa\u4efb\u4efc\u4efd\u4efe\u4eff\u4f00\u4f01\u4f02\u4f03\u4f04\u4f05\u4f06\u4f07\u4f08\u4f09\u4f0a\u4f0b\u4f0c\u4f0d\u4f0e\u4f0f\u4f10\u4f11\u4f12\u4f13\u4f14\u4f15\u4f16\u4f17\u4f18\u4f19\u4f1a\u4f1b\u4f1c\u4f1d\u4f1e\u4f1f\u4f20\u4f21\u4f22\u4f23\u4f24\u4f25\u4f26\u4f27\u4f28\u4f29\u4f2a\u4f2b\u4f2c\u4f2d\u4f2e\u4f2f\u4f30\u4f31\u4f32\u4f33\u4f34\u4f35\u4f36\u4f37\u4f38\u4f39\u4f3a\u4f3b\u4f3c\u4f3d\u4f3e\u4f3f\u4f40\u4f41\u4f42\u4f43\u4f44\u4f45\u4f46\u4f47\u4f48\u4f49\u4f4a\u4f4b\u4f4c\u4f4d\u4f4e\u4f4f\u4f50\u4f51\u4f52\u4f53\u4f54\u4f55\u4f56\u4f57\u4f58\u4f59\u4f5a\u4f5b\u4f5c\u4f5d\u4f5e\u4f5f\u4f60\u4f61\u4f62\u4f63\u4f64\u4f65\u4f66\u4f67\u4f68\u4f69\u4f6a\u4f6b\u4f6c\u4f6d\u4f6e\u4f6f\u4f70\u4f71\u4f72\u4f73\u4f74\u4f75\u4f76\u4f77\u4f78\u4f79\u4f7a\u4f7b\u4f7c\u4f7d\u4f7e\u4f7f\u4f80\u4f81\u4f82\u4f83\u4f84\u4f85\u4f86\u4f87\u4f88\u4f89\u4f8a\u4f8b\u4f8c\u4f8d\u4f8e\u4f8f\u4f90\u4f91\u4f92\u4f93\u4f94\u4f95\u4f96\u4f97\u4f98\u4f99\u4f9a\u4f9b\u4f9c\u4f9d\u4f9e\u4f9f\u4fa0\u4fa1\u4fa2\u4fa3\u4fa4\u4fa5\u4fa6\u4fa7\u4fa8\u4fa9\u4faa\u4fab\u4fac\u4fad\u4fae\u4faf\u4fb0\u4fb1\u4fb2\u4fb3\u4fb4\u4fb5\u4fb6\u4fb7\u4fb8\u4fb9\u4fba\u4fbb\u4fbc\u4fbd\u4fbe\u4fbf\u4fc0\u4fc1\u4fc2\u4fc3\u4fc4\u4fc5\u4fc6\u4fc7\u4fc8\u4fc9\u4fca\u4fcb\u4fcc\u4fcd\u4fce\u4fcf\u4fd0\u4fd1\u4fd2\u4fd3\u4fd4\u4fd5\u4fd6\u4fd7\u4fd8\u4fd9\u4fda\u4fdb\u4fdc\u4fdd\u4fde\u4fdf\u4fe0\u4fe1\u4fe2\u4fe3\u4fe4\u4fe5\u4fe6\u4fe7\u4fe8\u4fe9\u4fea\u4feb\u4fec\u4fed\u4fee\u4fef\u4ff0\u4ff1\u4ff2\u4ff3\u4ff4\u4ff5\u4ff6\u4ff7\u4ff8\u4ff9\u4ffa\u4ffb\u4ffc\u4ffd\u4ffe\u4fff\u5000\u5001\u5002\u5003\u5004\u5005\u5006\u5007\u5008\u5009\u500a\u500b\u500c\u500d\u500e\u500f\u5010\u5011\u5012\u5013\u5014\u5015\u5016\u5017\u5018\u5019\u501a\u501b\u501c\u501d\u501e\u501f\u5020\u5021\u5022\u5023\u5024\u5025\u5026\u5027\u5028\u5029\u502a\u502b\u502c\u502d\u502e\u502f\u5030\u5031\u5032\u5033\u5034\u5035\u5036\u5037\u5038\u5039\u503a\u503b\u503c\u503d\u503e\u503f\u5040\u5041\u5042\u5043\u5044\u5045\u5046\u5047\u5048\u5049\u504a\u504b\u504c\u504d\u504e\u504f\u5050\u5051\u5052\u5053\u5054\u5055\u5056\u5057\u5058\u5059\u505a\u505b\u505c\u505d\u505e\u505f\u5060\u5061\u5062\u5063\u5064\u5065\u5066\u5067\u5068\u5069\u506a\u506b\u506c\u506d\u506e\u506f\u5070\u5071\u5072\u5073\u5074\u5075\u5076\u5077\u5078\u5079\u507a\u507b\u507c\u507d\u507e\u507f\u5080\u5081\u5082\u5083\u5084\u5085\u5086\u5087\u5088\u5089\u508a\u508b\u508c\u508d\u508e\u508f\u5090\u5091\u5092\u5093\u5094\u5095\u5096\u5097\u5098\u5099\u509a\u509b\u509c\u509d\u509e\u509f\u50a0\u50a1\u50a2\u50a3\u50a4\u50a5\u50a6\u50a7\u50a8\u50a9\u50aa\u50ab\u50ac\u50ad\u50ae\u50af\u50b0\u50b1\u50b2\u50b3\u50b4\u50b5\u50b6\u50b7\u50b8\u50b9\u50ba\u50bb\u50bc\u50bd\u50be\u50bf\u50c0\u50c1\u50c2\u50c3\u50c4\u50c5\u50c6\u50c7\u50c8\u50c9\u50ca\u50cb\u50cc\u50cd\u50ce\u50cf\u50d0\u50d1\u50d2\u50d3\u50d4\u50d5\u50d6\u50d7\u50d8\u50d9\u50da\u50db\u50dc\u50dd\u50de\u50df\u50e0\u50e1\u50e2\u50e3\u50e4\u50e5\u50e6\u50e7\u50e8\u50e9\u50ea\u50eb\u50ec\u50ed\u50ee\u50ef\u50f0\u50f1\u50f2\u50f3\u50f4\u50f5\u50f6\u50f7\u50f8\u50f9\u50fa\u50fb\u50fc\u50fd\u50fe\u50ff\u5100\u5101\u5102\u5103\u5104\u5105\u5106\u5107\u5108\u5109\u510a\u510b\u510c\u510d\u510e\u510f\u5110\u5111\u5112\u5113\u5114\u5115\u5116\u5117\u5118\u5119\u511a\u511b\u511c\u511d\u511e\u511f\u5120\u5121\u5122\u5123\u5124\u5125\u5126\u5127\u5128\u5129\u512a\u512b\u512c\u512d\u512e\u512f\u5130\u5131\u5132\u5133\u5134\u5135\u5136\u5137\u5138\u5139\u513a\u513b\u513c\u513d\u513e\u513f\u5140\u5141\u5142\u5143\u5144\u5145\u5146\u5147\u5148\u5149\u514a\u514b\u514c\u514d\u514e\u514f\u5150\u5151\u5152\u5153\u5154\u5155\u5156\u5157\u5158\u5159\u515a\u515b\u515c\u515d\u515e\u515f\u5160\u5161\u5162\u5163\u5164\u5165\u5166\u5167\u5168\u5169\u516a\u516b\u516c\u516d\u516e\u516f\u5170\u5171\u5172\u5173\u5174\u5175\u5176\u5177\u5178\u5179\u517a\u517b\u517c\u517d\u517e\u517f\u5180\u5181\u5182\u5183\u5184\u5185\u5186\u5187\u5188\u5189\u518a\u518b\u518c\u518d\u518e\u518f\u5190\u5191\u5192\u5193\u5194\u5195\u5196\u5197\u5198\u5199\u519a\u519b\u519c\u519d\u519e\u519f\u51a0\u51a1\u51a2\u51a3\u51a4\u51a5\u51a6\u51a7\u51a8\u51a9\u51aa\u51ab\u51ac\u51ad\u51ae\u51af\u51b0\u51b1\u51b2\u51b3\u51b4\u51b5\u51b6\u51b7\u51b8\u51b9\u51ba\u51bb\u51bc\u51bd\u51be\u51bf\u51c0\u51c1\u51c2\u51c3\u51c4\u51c5\u51c6\u51c7\u51c8\u51c9\u51ca\u51cb\u51cc\u51cd\u51ce\u51cf\u51d0\u51d1\u51d2\u51d3\u51d4\u51d5\u51d6\u51d7\u51d8\u51d9\u51da\u51db\u51dc\u51dd\u51de\u51df\u51e0\u51e1\u51e2\u51e3\u51e4\u51e5\u51e6\u51e7\u51e8\u51e9\u51ea\u51eb\u51ec\u51ed\u51ee\u51ef\u51f0\u51f1\u51f2\u51f3\u51f4\u51f5\u51f6\u51f7\u51f8\u51f9\u51fa\u51fb\u51fc\u51fd\u51fe\u51ff\u5200\u5201\u5202\u5203\u5204\u5205\u5206\u5207\u5208\u5209\u520a\u520b\u520c\u520d\u520e\u520f\u5210\u5211\u5212\u5213\u5214\u5215\u5216\u5217\u5218\u5219\u521a\u521b\u521c\u521d\u521e\u521f\u5220\u5221\u5222\u5223\u5224\u5225\u5226\u5227\u5228\u5229\u522a\u522b\u522c\u522d\u522e\u522f\u5230\u5231\u5232\u5233\u5234\u5235\u5236\u5237\u5238\u5239\u523a\u523b\u523c\u523d\u523e\u523f\u5240\u5241\u5242\u5243\u5244\u5245\u5246\u5247\u5248\u5249\u524a\u524b\u524c\u524d\u524e\u524f\u5250\u5251\u5252\u5253\u5254\u5255\u5256\u5257\u5258\u5259\u525a\u525b\u525c\u525d\u525e\u525f\u5260\u5261\u5262\u5263\u5264\u5265\u5266\u5267\u5268\u5269\u526a\u526b\u526c\u526d\u526e\u526f\u5270\u5271\u5272\u5273\u5274\u5275\u5276\u5277\u5278\u5279\u527a\u527b\u527c\u527d\u527e\u527f\u5280\u5281\u5282\u5283\u5284\u5285\u5286\u5287\u5288\u5289\u528a\u528b\u528c\u528d\u528e\u528f\u5290\u5291\u5292\u5293\u5294\u5295\u5296\u5297\u5298\u5299\u529a\u529b\u529c\u529d\u529e\u529f\u52a0\u52a1\u52a2\u52a3\u52a4\u52a5\u52a6\u52a7\u52a8\u52a9\u52aa\u52ab\u52ac\u52ad\u52ae\u52af\u52b0\u52b1\u52b2\u52b3\u52b4\u52b5\u52b6\u52b7\u52b8\u52b9\u52ba\u52bb\u52bc\u52bd\u52be\u52bf\u52c0\u52c1\u52c2\u52c3\u52c4\u52c5\u52c6\u52c7\u52c8\u52c9\u52ca\u52cb\u52cc\u52cd\u52ce\u52cf\u52d0\u52d1\u52d2\u52d3\u52d4\u52d5\u52d6\u52d7\u52d8\u52d9\u52da\u52db\u52dc\u52dd\u52de\u52df\u52e0\u52e1\u52e2\u52e3\u52e4\u52e5\u52e6\u52e7\u52e8\u52e9\u52ea\u52eb\u52ec\u52ed\u52ee\u52ef\u52f0\u52f1\u52f2\u52f3\u52f4\u52f5\u52f6\u52f7\u52f8\u52f9\u52fa\u52fb\u52fc\u52fd\u52fe\u52ff\u5300\u5301\u5302\u5303\u5304\u5305\u5306\u5307\u5308\u5309\u530a\u530b\u530c\u530d\u530e\u530f\u5310\u5311\u5312\u5313\u5314\u5315\u5316\u5317\u5318\u5319\u531a\u531b\u531c\u531d\u531e\u531f\u5320\u5321\u5322\u5323\u5324\u5325\u5326\u5327\u5328\u5329\u532a\u532b\u532c\u532d\u532e\u532f\u5330\u5331\u5332\u5333\u5334\u5335\u5336\u5337\u5338\u5339\u533a\u533b\u533c\u533d\u533e\u533f\u5340\u5341\u5342\u5343\u5344\u5345\u5346\u5347\u5348\u5349\u534a\u534b\u534c\u534d\u534e\u534f\u5350\u5351\u5352\u5353\u5354\u5355\u5356\u5357\u5358\u5359\u535a\u535b\u535c\u535d\u535e\u535f\u5360\u5361\u5362\u5363\u5364\u5365\u5366\u5367\u5368\u5369\u536a\u536b\u536c\u536d\u536e\u536f\u5370\u5371\u5372\u5373\u5374\u5375\u5376\u5377\u5378\u5379\u537a\u537b\u537c\u537d\u537e\u537f\u5380\u5381\u5382\u5383\u5384\u5385\u5386\u5387\u5388\u5389\u538a\u538b\u538c\u538d\u538e\u538f\u5390\u5391\u5392\u5393\u5394\u5395\u5396\u5397\u5398\u5399\u539a\u539b\u539c\u539d\u539e\u539f\u53a0\u53a1\u53a2\u53a3\u53a4\u53a5\u53a6\u53a7\u53a8\u53a9\u53aa\u53ab\u53ac\u53ad\u53ae\u53af\u53b0\u53b1\u53b2\u53b3\u53b4\u53b5\u53b6\u53b7\u53b8\u53b9\u53ba\u53bb\u53bc\u53bd\u53be\u53bf\u53c0\u53c1\u53c2\u53c3\u53c4\u53c5\u53c6\u53c7\u53c8\u53c9\u53ca\u53cb\u53cc\u53cd\u53ce\u53cf\u53d0\u53d1\u53d2\u53d3\u53d4\u53d5\u53d6\u53d7\u53d8\u53d9\u53da\u53db\u53dc\u53dd\u53de\u53df\u53e0\u53e1\u53e2\u53e3\u53e4\u53e5\u53e6\u53e7\u53e8\u53e9\u53ea\u53eb\u53ec\u53ed\u53ee\u53ef\u53f0\u53f1\u53f2\u53f3\u53f4\u53f5\u53f6\u53f7\u53f8\u53f9\u53fa\u53fb\u53fc\u53fd\u53fe\u53ff\u5400\u5401\u5402\u5403\u5404\u5405\u5406\u5407\u5408\u5409\u540a\u540b\u540c\u540d\u540e\u540f\u5410\u5411\u5412\u5413\u5414\u5415\u5416\u5417\u5418\u5419\u541a\u541b\u541c\u541d\u541e\u541f\u5420\u5421\u5422\u5423\u5424\u5425\u5426\u5427\u5428\u5429\u542a\u542b\u542c\u542d\u542e\u542f\u5430\u5431\u5432\u5433\u5434\u5435\u5436\u5437\u5438\u5439\u543a\u543b\u543c\u543d\u543e\u543f\u5440\u5441\u5442\u5443\u5444\u5445\u5446\u5447\u5448\u5449\u544a\u544b\u544c\u544d\u544e\u544f\u5450\u5451\u5452\u5453\u5454\u5455\u5456\u5457\u5458\u5459\u545a\u545b\u545c\u545d\u545e\u545f\u5460\u5461\u5462\u5463\u5464\u5465\u5466\u5467\u5468\u5469\u546a\u546b\u546c\u546d\u546e\u546f\u5470\u5471\u5472\u5473\u5474\u5475\u5476\u5477\u5478\u5479\u547a\u547b\u547c\u547d\u547e\u547f\u5480\u5481\u5482\u5483\u5484\u5485\u5486\u5487\u5488\u5489\u548a\u548b\u548c\u548d\u548e\u548f\u5490\u5491\u5492\u5493\u5494\u5495\u5496\u5497\u5498\u5499\u549a\u549b\u549c\u549d\u549e\u549f\u54a0\u54a1\u54a2\u54a3\u54a4\u54a5\u54a6\u54a7\u54a8\u54a9\u54aa\u54ab\u54ac\u54ad\u54ae\u54af\u54b0\u54b1\u54b2\u54b3\u54b4\u54b5\u54b6\u54b7\u54b8\u54b9\u54ba\u54bb\u54bc\u54bd\u54be\u54bf\u54c0\u54c1\u54c2\u54c3\u54c4\u54c5\u54c6\u54c7\u54c8\u54c9\u54ca\u54cb\u54cc\u54cd\u54ce\u54cf\u54d0\u54d1\u54d2\u54d3\u54d4\u54d5\u54d6\u54d7\u54d8\u54d9\u54da\u54db\u54dc\u54dd\u54de\u54df\u54e0\u54e1\u54e2\u54e3\u54e4\u54e5\u54e6\u54e7\u54e8\u54e9\u54ea\u54eb\u54ec\u54ed\u54ee\u54ef\u54f0\u54f1\u54f2\u54f3\u54f4\u54f5\u54f6\u54f7\u54f8\u54f9\u54fa\u54fb\u54fc\u54fd\u54fe\u54ff\u5500\u5501\u5502\u5503\u5504\u5505\u5506\u5507\u5508\u5509\u550a\u550b\u550c\u550d\u550e\u550f\u5510\u5511\u5512\u5513\u5514\u5515\u5516\u5517\u5518\u5519\u551a\u551b\u551c\u551d\u551e\u551f\u5520\u5521\u5522\u5523\u5524\u5525\u5526\u5527\u5528\u5529\u552a\u552b\u552c\u552d\u552e\u552f\u5530\u5531\u5532\u5533\u5534\u5535\u5536\u5537\u5538\u5539\u553a\u553b\u553c\u553d\u553e\u553f\u5540\u5541\u5542\u5543\u5544\u5545\u5546\u5547\u5548\u5549\u554a\u554b\u554c\u554d\u554e\u554f\u5550\u5551\u5552\u5553\u5554\u5555\u5556\u5557\u5558\u5559\u555a\u555b\u555c\u555d\u555e\u555f\u5560\u5561\u5562\u5563\u5564\u5565\u5566\u5567\u5568\u5569\u556a\u556b\u556c\u556d\u556e\u556f\u5570\u5571\u5572\u5573\u5574\u5575\u5576\u5577\u5578\u5579\u557a\u557b\u557c\u557d\u557e\u557f\u5580\u5581\u5582\u5583\u5584\u5585\u5586\u5587\u5588\u5589\u558a\u558b\u558c\u558d\u558e\u558f\u5590\u5591\u5592\u5593\u5594\u5595\u5596\u5597\u5598\u5599\u559a\u559b\u559c\u559d\u559e\u559f\u55a0\u55a1\u55a2\u55a3\u55a4\u55a5\u55a6\u55a7\u55a8\u55a9\u55aa\u55ab\u55ac\u55ad\u55ae\u55af\u55b0\u55b1\u55b2\u55b3\u55b4\u55b5\u55b6\u55b7\u55b8\u55b9\u55ba\u55bb\u55bc\u55bd\u55be\u55bf\u55c0\u55c1\u55c2\u55c3\u55c4\u55c5\u55c6\u55c7\u55c8\u55c9\u55ca\u55cb\u55cc\u55cd\u55ce\u55cf\u55d0\u55d1\u55d2\u55d3\u55d4\u55d5\u55d6\u55d7\u55d8\u55d9\u55da\u55db\u55dc\u55dd\u55de\u55df\u55e0\u55e1\u55e2\u55e3\u55e4\u55e5\u55e6\u55e7\u55e8\u55e9\u55ea\u55eb\u55ec\u55ed\u55ee\u55ef\u55f0\u55f1\u55f2\u55f3\u55f4\u55f5\u55f6\u55f7\u55f8\u55f9\u55fa\u55fb\u55fc\u55fd\u55fe\u55ff\u5600\u5601\u5602\u5603\u5604\u5605\u5606\u5607\u5608\u5609\u560a\u560b\u560c\u560d\u560e\u560f\u5610\u5611\u5612\u5613\u5614\u5615\u5616\u5617\u5618\u5619\u561a\u561b\u561c\u561d\u561e\u561f\u5620\u5621\u5622\u5623\u5624\u5625\u5626\u5627\u5628\u5629\u562a\u562b\u562c\u562d\u562e\u562f\u5630\u5631\u5632\u5633\u5634\u5635\u5636\u5637\u5638\u5639\u563a\u563b\u563c\u563d\u563e\u563f\u5640\u5641\u5642\u5643\u5644\u5645\u5646\u5647\u5648\u5649\u564a\u564b\u564c\u564d\u564e\u564f\u5650\u5651\u5652\u5653\u5654\u5655\u5656\u5657\u5658\u5659\u565a\u565b\u565c\u565d\u565e\u565f\u5660\u5661\u5662\u5663\u5664\u5665\u5666\u5667\u5668\u5669\u566a\u566b\u566c\u566d\u566e\u566f\u5670\u5671\u5672\u5673\u5674\u5675\u5676\u5677\u5678\u5679\u567a\u567b\u567c\u567d\u567e\u567f\u5680\u5681\u5682\u5683\u5684\u5685\u5686\u5687\u5688\u5689\u568a\u568b\u568c\u568d\u568e\u568f\u5690\u5691\u5692\u5693\u5694\u5695\u5696\u5697\u5698\u5699\u569a\u569b\u569c\u569d\u569e\u569f\u56a0\u56a1\u56a2\u56a3\u56a4\u56a5\u56a6\u56a7\u56a8\u56a9\u56aa\u56ab\u56ac\u56ad\u56ae\u56af\u56b0\u56b1\u56b2\u56b3\u56b4\u56b5\u56b6\u56b7\u56b8\u56b9\u56ba\u56bb\u56bc\u56bd\u56be\u56bf\u56c0\u56c1\u56c2\u56c3\u56c4\u56c5\u56c6\u56c7\u56c8\u56c9\u56ca\u56cb\u56cc\u56cd\u56ce\u56cf\u56d0\u56d1\u56d2\u56d3\u56d4\u56d5\u56d6\u56d7\u56d8\u56d9\u56da\u56db\u56dc\u56dd\u56de\u56df\u56e0\u56e1\u56e2\u56e3\u56e4\u56e5\u56e6\u56e7\u56e8\u56e9\u56ea\u56eb\u56ec\u56ed\u56ee\u56ef\u56f0\u56f1\u56f2\u56f3\u56f4\u56f5\u56f6\u56f7\u56f8\u56f9\u56fa\u56fb\u56fc\u56fd\u56fe\u56ff\u5700\u5701\u5702\u5703\u5704\u5705\u5706\u5707\u5708\u5709\u570a\u570b\u570c\u570d\u570e\u570f\u5710\u5711\u5712\u5713\u5714\u5715\u5716\u5717\u5718\u5719\u571a\u571b\u571c\u571d\u571e\u571f\u5720\u5721\u5722\u5723\u5724\u5725\u5726\u5727\u5728\u5729\u572a\u572b\u572c\u572d\u572e\u572f\u5730\u5731\u5732\u5733\u5734\u5735\u5736\u5737\u5738\u5739\u573a\u573b\u573c\u573d\u573e\u573f\u5740\u5741\u5742\u5743\u5744\u5745\u5746\u5747\u5748\u5749\u574a\u574b\u574c\u574d\u574e\u574f\u5750\u5751\u5752\u5753\u5754\u5755\u5756\u5757\u5758\u5759\u575a\u575b\u575c\u575d\u575e\u575f\u5760\u5761\u5762\u5763\u5764\u5765\u5766\u5767\u5768\u5769\u576a\u576b\u576c\u576d\u576e\u576f\u5770\u5771\u5772\u5773\u5774\u5775\u5776\u5777\u5778\u5779\u577a\u577b\u577c\u577d\u577e\u577f\u5780\u5781\u5782\u5783\u5784\u5785\u5786\u5787\u5788\u5789\u578a\u578b\u578c\u578d\u578e\u578f\u5790\u5791\u5792\u5793\u5794\u5795\u5796\u5797\u5798\u5799\u579a\u579b\u579c\u579d\u579e\u579f\u57a0\u57a1\u57a2\u57a3\u57a4\u57a5\u57a6\u57a7\u57a8\u57a9\u57aa\u57ab\u57ac\u57ad\u57ae\u57af\u57b0\u57b1\u57b2\u57b3\u57b4\u57b5\u57b6\u57b7\u57b8\u57b9\u57ba\u57bb\u57bc\u57bd\u57be\u57bf\u57c0\u57c1\u57c2\u57c3\u57c4\u57c5\u57c6\u57c7\u57c8\u57c9\u57ca\u57cb\u57cc\u57cd\u57ce\u57cf\u57d0\u57d1\u57d2\u57d3\u57d4\u57d5\u57d6\u57d7\u57d8\u57d9\u57da\u57db\u57dc\u57dd\u57de\u57df\u57e0\u57e1\u57e2\u57e3\u57e4\u57e5\u57e6\u57e7\u57e8\u57e9\u57ea\u57eb\u57ec\u57ed\u57ee\u57ef\u57f0\u57f1\u57f2\u57f3\u57f4\u57f5\u57f6\u57f7\u57f8\u57f9\u57fa\u57fb\u57fc\u57fd\u57fe\u57ff\u5800\u5801\u5802\u5803\u5804\u5805\u5806\u5807\u5808\u5809\u580a\u580b\u580c\u580d\u580e\u580f\u5810\u5811\u5812\u5813\u5814\u5815\u5816\u5817\u5818\u5819\u581a\u581b\u581c\u581d\u581e\u581f\u5820\u5821\u5822\u5823\u5824\u5825\u5826\u5827\u5828\u5829\u582a\u582b\u582c\u582d\u582e\u582f\u5830\u5831\u5832\u5833\u5834\u5835\u5836\u5837\u5838\u5839\u583a\u583b\u583c\u583d\u583e\u583f\u5840\u5841\u5842\u5843\u5844\u5845\u5846\u5847\u5848\u5849\u584a\u584b\u584c\u584d\u584e\u584f\u5850\u5851\u5852\u5853\u5854\u5855\u5856\u5857\u5858\u5859\u585a\u585b\u585c\u585d\u585e\u585f\u5860\u5861\u5862\u5863\u5864\u5865\u5866\u5867\u5868\u5869\u586a\u586b\u586c\u586d\u586e\u586f\u5870\u5871\u5872\u5873\u5874\u5875\u5876\u5877\u5878\u5879\u587a\u587b\u587c\u587d\u587e\u587f\u5880\u5881\u5882\u5883\u5884\u5885\u5886\u5887\u5888\u5889\u588a\u588b\u588c\u588d\u588e\u588f\u5890\u5891\u5892\u5893\u5894\u5895\u5896\u5897\u5898\u5899\u589a\u589b\u589c\u589d\u589e\u589f\u58a0\u58a1\u58a2\u58a3\u58a4\u58a5\u58a6\u58a7\u58a8\u58a9\u58aa\u58ab\u58ac\u58ad\u58ae\u58af\u58b0\u58b1\u58b2\u58b3\u58b4\u58b5\u58b6\u58b7\u58b8\u58b9\u58ba\u58bb\u58bc\u58bd\u58be\u58bf\u58c0\u58c1\u58c2\u58c3\u58c4\u58c5\u58c6\u58c7\u58c8\u58c9\u58ca\u58cb\u58cc\u58cd\u58ce\u58cf\u58d0\u58d1\u58d2\u58d3\u58d4\u58d5\u58d6\u58d7\u58d8\u58d9\u58da\u58db\u58dc\u58dd\u58de\u58df\u58e0\u58e1\u58e2\u58e3\u58e4\u58e5\u58e6\u58e7\u58e8\u58e9\u58ea\u58eb\u58ec\u58ed\u58ee\u58ef\u58f0\u58f1\u58f2\u58f3\u58f4\u58f5\u58f6\u58f7\u58f8\u58f9\u58fa\u58fb\u58fc\u58fd\u58fe\u58ff\u5900\u5901\u5902\u5903\u5904\u5905\u5906\u5907\u5908\u5909\u590a\u590b\u590c\u590d\u590e\u590f\u5910\u5911\u5912\u5913\u5914\u5915\u5916\u5917\u5918\u5919\u591a\u591b\u591c\u591d\u591e\u591f\u5920\u5921\u5922\u5923\u5924\u5925\u5926\u5927\u5928\u5929\u592a\u592b\u592c\u592d\u592e\u592f\u5930\u5931\u5932\u5933\u5934\u5935\u5936\u5937\u5938\u5939\u593a\u593b\u593c\u593d\u593e\u593f\u5940\u5941\u5942\u5943\u5944\u5945\u5946\u5947\u5948\u5949\u594a\u594b\u594c\u594d\u594e\u594f\u5950\u5951\u5952\u5953\u5954\u5955\u5956\u5957\u5958\u5959\u595a\u595b\u595c\u595d\u595e\u595f\u5960\u5961\u5962\u5963\u5964\u5965\u5966\u5967\u5968\u5969\u596a\u596b\u596c\u596d\u596e\u596f\u5970\u5971\u5972\u5973\u5974\u5975\u5976\u5977\u5978\u5979\u597a\u597b\u597c\u597d\u597e\u597f\u5980\u5981\u5982\u5983\u5984\u5985\u5986\u5987\u5988\u5989\u598a\u598b\u598c\u598d\u598e\u598f\u5990\u5991\u5992\u5993\u5994\u5995\u5996\u5997\u5998\u5999\u599a\u599b\u599c\u599d\u599e\u599f\u59a0\u59a1\u59a2\u59a3\u59a4\u59a5\u59a6\u59a7\u59a8\u59a9\u59aa\u59ab\u59ac\u59ad\u59ae\u59af\u59b0\u59b1\u59b2\u59b3\u59b4\u59b5\u59b6\u59b7\u59b8\u59b9\u59ba\u59bb\u59bc\u59bd\u59be\u59bf\u59c0\u59c1\u59c2\u59c3\u59c4\u59c5\u59c6\u59c7\u59c8\u59c9\u59ca\u59cb\u59cc\u59cd\u59ce\u59cf\u59d0\u59d1\u59d2\u59d3\u59d4\u59d5\u59d6\u59d7\u59d8\u59d9\u59da\u59db\u59dc\u59dd\u59de\u59df\u59e0\u59e1\u59e2\u59e3\u59e4\u59e5\u59e6\u59e7\u59e8\u59e9\u59ea\u59eb\u59ec\u59ed\u59ee\u59ef\u59f0\u59f1\u59f2\u59f3\u59f4\u59f5\u59f6\u59f7\u59f8\u59f9\u59fa\u59fb\u59fc\u59fd\u59fe\u59ff\u5a00\u5a01\u5a02\u5a03\u5a04\u5a05\u5a06\u5a07\u5a08\u5a09\u5a0a\u5a0b\u5a0c\u5a0d\u5a0e\u5a0f\u5a10\u5a11\u5a12\u5a13\u5a14\u5a15\u5a16\u5a17\u5a18\u5a19\u5a1a\u5a1b\u5a1c\u5a1d\u5a1e\u5a1f\u5a20\u5a21\u5a22\u5a23\u5a24\u5a25\u5a26\u5a27\u5a28\u5a29\u5a2a\u5a2b\u5a2c\u5a2d\u5a2e\u5a2f\u5a30\u5a31\u5a32\u5a33\u5a34\u5a35\u5a36\u5a37\u5a38\u5a39\u5a3a\u5a3b\u5a3c\u5a3d\u5a3e\u5a3f\u5a40\u5a41\u5a42\u5a43\u5a44\u5a45\u5a46\u5a47\u5a48\u5a49\u5a4a\u5a4b\u5a4c\u5a4d\u5a4e\u5a4f\u5a50\u5a51\u5a52\u5a53\u5a54\u5a55\u5a56\u5a57\u5a58\u5a59\u5a5a\u5a5b\u5a5c\u5a5d\u5a5e\u5a5f\u5a60\u5a61\u5a62\u5a63\u5a64\u5a65\u5a66\u5a67\u5a68\u5a69\u5a6a\u5a6b\u5a6c\u5a6d\u5a6e\u5a6f\u5a70\u5a71\u5a72\u5a73\u5a74\u5a75\u5a76\u5a77\u5a78\u5a79\u5a7a\u5a7b\u5a7c\u5a7d\u5a7e\u5a7f\u5a80\u5a81\u5a82\u5a83\u5a84\u5a85\u5a86\u5a87\u5a88\u5a89\u5a8a\u5a8b\u5a8c\u5a8d\u5a8e\u5a8f\u5a90\u5a91\u5a92\u5a93\u5a94\u5a95\u5a96\u5a97\u5a98\u5a99\u5a9a\u5a9b\u5a9c\u5a9d\u5a9e\u5a9f\u5aa0\u5aa1\u5aa2\u5aa3\u5aa4\u5aa5\u5aa6\u5aa7\u5aa8\u5aa9\u5aaa\u5aab\u5aac\u5aad\u5aae\u5aaf\u5ab0\u5ab1\u5ab2\u5ab3\u5ab4\u5ab5\u5ab6\u5ab7\u5ab8\u5ab9\u5aba\u5abb\u5abc\u5abd\u5abe\u5abf\u5ac0\u5ac1\u5ac2\u5ac3\u5ac4\u5ac5\u5ac6\u5ac7\u5ac8\u5ac9\u5aca\u5acb\u5acc\u5acd\u5ace\u5acf\u5ad0\u5ad1\u5ad2\u5ad3\u5ad4\u5ad5\u5ad6\u5ad7\u5ad8\u5ad9\u5ada\u5adb\u5adc\u5add\u5ade\u5adf\u5ae0\u5ae1\u5ae2\u5ae3\u5ae4\u5ae5\u5ae6\u5ae7\u5ae8\u5ae9\u5aea\u5aeb\u5aec\u5aed\u5aee\u5aef\u5af0\u5af1\u5af2\u5af3\u5af4\u5af5\u5af6\u5af7\u5af8\u5af9\u5afa\u5afb\u5afc\u5afd\u5afe\u5aff\u5b00\u5b01\u5b02\u5b03\u5b04\u5b05\u5b06\u5b07\u5b08\u5b09\u5b0a\u5b0b\u5b0c\u5b0d\u5b0e\u5b0f\u5b10\u5b11\u5b12\u5b13\u5b14\u5b15\u5b16\u5b17\u5b18\u5b19\u5b1a\u5b1b\u5b1c\u5b1d\u5b1e\u5b1f\u5b20\u5b21\u5b22\u5b23\u5b24\u5b25\u5b26\u5b27\u5b28\u5b29\u5b2a\u5b2b\u5b2c\u5b2d\u5b2e\u5b2f\u5b30\u5b31\u5b32\u5b33\u5b34\u5b35\u5b36\u5b37\u5b38\u5b39\u5b3a\u5b3b\u5b3c\u5b3d\u5b3e\u5b3f\u5b40\u5b41\u5b42\u5b43\u5b44\u5b45\u5b46\u5b47\u5b48\u5b49\u5b4a\u5b4b\u5b4c\u5b4d\u5b4e\u5b4f\u5b50\u5b51\u5b52\u5b53\u5b54\u5b55\u5b56\u5b57\u5b58\u5b59\u5b5a\u5b5b\u5b5c\u5b5d\u5b5e\u5b5f\u5b60\u5b61\u5b62\u5b63\u5b64\u5b65\u5b66\u5b67\u5b68\u5b69\u5b6a\u5b6b\u5b6c\u5b6d\u5b6e\u5b6f\u5b70\u5b71\u5b72\u5b73\u5b74\u5b75\u5b76\u5b77\u5b78\u5b79\u5b7a\u5b7b\u5b7c\u5b7d\u5b7e\u5b7f\u5b80\u5b81\u5b82\u5b83\u5b84\u5b85\u5b86\u5b87\u5b88\u5b89\u5b8a\u5b8b\u5b8c\u5b8d\u5b8e\u5b8f\u5b90\u5b91\u5b92\u5b93\u5b94\u5b95\u5b96\u5b97\u5b98\u5b99\u5b9a\u5b9b\u5b9c\u5b9d\u5b9e\u5b9f\u5ba0\u5ba1\u5ba2\u5ba3\u5ba4\u5ba5\u5ba6\u5ba7\u5ba8\u5ba9\u5baa\u5bab\u5bac\u5bad\u5bae\u5baf\u5bb0\u5bb1\u5bb2\u5bb3\u5bb4\u5bb5\u5bb6\u5bb7\u5bb8\u5bb9\u5bba\u5bbb\u5bbc\u5bbd\u5bbe\u5bbf\u5bc0\u5bc1\u5bc2\u5bc3\u5bc4\u5bc5\u5bc6\u5bc7\u5bc8\u5bc9\u5bca\u5bcb\u5bcc\u5bcd\u5bce\u5bcf\u5bd0\u5bd1\u5bd2\u5bd3\u5bd4\u5bd5\u5bd6\u5bd7\u5bd8\u5bd9\u5bda\u5bdb\u5bdc\u5bdd\u5bde\u5bdf\u5be0\u5be1\u5be2\u5be3\u5be4\u5be5\u5be6\u5be7\u5be8\u5be9\u5bea\u5beb\u5bec\u5bed\u5bee\u5bef\u5bf0\u5bf1\u5bf2\u5bf3\u5bf4\u5bf5\u5bf6\u5bf7\u5bf8\u5bf9\u5bfa\u5bfb\u5bfc\u5bfd\u5bfe\u5bff\u5c00\u5c01\u5c02\u5c03\u5c04\u5c05\u5c06\u5c07\u5c08\u5c09\u5c0a\u5c0b\u5c0c\u5c0d\u5c0e\u5c0f\u5c10\u5c11\u5c12\u5c13\u5c14\u5c15\u5c16\u5c17\u5c18\u5c19\u5c1a\u5c1b\u5c1c\u5c1d\u5c1e\u5c1f\u5c20\u5c21\u5c22\u5c23\u5c24\u5c25\u5c26\u5c27\u5c28\u5c29\u5c2a\u5c2b\u5c2c\u5c2d\u5c2e\u5c2f\u5c30\u5c31\u5c32\u5c33\u5c34\u5c35\u5c36\u5c37\u5c38\u5c39\u5c3a\u5c3b\u5c3c\u5c3d\u5c3e\u5c3f\u5c40\u5c41\u5c42\u5c43\u5c44\u5c45\u5c46\u5c47\u5c48\u5c49\u5c4a\u5c4b\u5c4c\u5c4d\u5c4e\u5c4f\u5c50\u5c51\u5c52\u5c53\u5c54\u5c55\u5c56\u5c57\u5c58\u5c59\u5c5a\u5c5b\u5c5c\u5c5d\u5c5e\u5c5f\u5c60\u5c61\u5c62\u5c63\u5c64\u5c65\u5c66\u5c67\u5c68\u5c69\u5c6a\u5c6b\u5c6c\u5c6d\u5c6e\u5c6f\u5c70\u5c71\u5c72\u5c73\u5c74\u5c75\u5c76\u5c77\u5c78\u5c79\u5c7a\u5c7b\u5c7c\u5c7d\u5c7e\u5c7f\u5c80\u5c81\u5c82\u5c83\u5c84\u5c85\u5c86\u5c87\u5c88\u5c89\u5c8a\u5c8b\u5c8c\u5c8d\u5c8e\u5c8f\u5c90\u5c91\u5c92\u5c93\u5c94\u5c95\u5c96\u5c97\u5c98\u5c99\u5c9a\u5c9b\u5c9c\u5c9d\u5c9e\u5c9f\u5ca0\u5ca1\u5ca2\u5ca3\u5ca4\u5ca5\u5ca6\u5ca7\u5ca8\u5ca9\u5caa\u5cab\u5cac\u5cad\u5cae\u5caf\u5cb0\u5cb1\u5cb2\u5cb3\u5cb4\u5cb5\u5cb6\u5cb7\u5cb8\u5cb9\u5cba\u5cbb\u5cbc\u5cbd\u5cbe\u5cbf\u5cc0\u5cc1\u5cc2\u5cc3\u5cc4\u5cc5\u5cc6\u5cc7\u5cc8\u5cc9\u5cca\u5ccb\u5ccc\u5ccd\u5cce\u5ccf\u5cd0\u5cd1\u5cd2\u5cd3\u5cd4\u5cd5\u5cd6\u5cd7\u5cd8\u5cd9\u5cda\u5cdb\u5cdc\u5cdd\u5cde\u5cdf\u5ce0\u5ce1\u5ce2\u5ce3\u5ce4\u5ce5\u5ce6\u5ce7\u5ce8\u5ce9\u5cea\u5ceb\u5cec\u5ced\u5cee\u5cef\u5cf0\u5cf1\u5cf2\u5cf3\u5cf4\u5cf5\u5cf6\u5cf7\u5cf8\u5cf9\u5cfa\u5cfb\u5cfc\u5cfd\u5cfe\u5cff\u5d00\u5d01\u5d02\u5d03\u5d04\u5d05\u5d06\u5d07\u5d08\u5d09\u5d0a\u5d0b\u5d0c\u5d0d\u5d0e\u5d0f\u5d10\u5d11\u5d12\u5d13\u5d14\u5d15\u5d16\u5d17\u5d18\u5d19\u5d1a\u5d1b\u5d1c\u5d1d\u5d1e\u5d1f\u5d20\u5d21\u5d22\u5d23\u5d24\u5d25\u5d26\u5d27\u5d28\u5d29\u5d2a\u5d2b\u5d2c\u5d2d\u5d2e\u5d2f\u5d30\u5d31\u5d32\u5d33\u5d34\u5d35\u5d36\u5d37\u5d38\u5d39\u5d3a\u5d3b\u5d3c\u5d3d\u5d3e\u5d3f\u5d40\u5d41\u5d42\u5d43\u5d44\u5d45\u5d46\u5d47\u5d48\u5d49\u5d4a\u5d4b\u5d4c\u5d4d\u5d4e\u5d4f\u5d50\u5d51\u5d52\u5d53\u5d54\u5d55\u5d56\u5d57\u5d58\u5d59\u5d5a\u5d5b\u5d5c\u5d5d\u5d5e\u5d5f\u5d60\u5d61\u5d62\u5d63\u5d64\u5d65\u5d66\u5d67\u5d68\u5d69\u5d6a\u5d6b\u5d6c\u5d6d\u5d6e\u5d6f\u5d70\u5d71\u5d72\u5d73\u5d74\u5d75\u5d76\u5d77\u5d78\u5d79\u5d7a\u5d7b\u5d7c\u5d7d\u5d7e\u5d7f\u5d80\u5d81\u5d82\u5d83\u5d84\u5d85\u5d86\u5d87\u5d88\u5d89\u5d8a\u5d8b\u5d8c\u5d8d\u5d8e\u5d8f\u5d90\u5d91\u5d92\u5d93\u5d94\u5d95\u5d96\u5d97\u5d98\u5d99\u5d9a\u5d9b\u5d9c\u5d9d\u5d9e\u5d9f\u5da0\u5da1\u5da2\u5da3\u5da4\u5da5\u5da6\u5da7\u5da8\u5da9\u5daa\u5dab\u5dac\u5dad\u5dae\u5daf\u5db0\u5db1\u5db2\u5db3\u5db4\u5db5\u5db6\u5db7\u5db8\u5db9\u5dba\u5dbb\u5dbc\u5dbd\u5dbe\u5dbf\u5dc0\u5dc1\u5dc2\u5dc3\u5dc4\u5dc5\u5dc6\u5dc7\u5dc8\u5dc9\u5dca\u5dcb\u5dcc\u5dcd\u5dce\u5dcf\u5dd0\u5dd1\u5dd2\u5dd3\u5dd4\u5dd5\u5dd6\u5dd7\u5dd8\u5dd9\u5dda\u5ddb\u5ddc\u5ddd\u5dde\u5ddf\u5de0\u5de1\u5de2\u5de3\u5de4\u5de5\u5de6\u5de7\u5de8\u5de9\u5dea\u5deb\u5dec\u5ded\u5dee\u5def\u5df0\u5df1\u5df2\u5df3\u5df4\u5df5\u5df6\u5df7\u5df8\u5df9\u5dfa\u5dfb\u5dfc\u5dfd\u5dfe\u5dff\u5e00\u5e01\u5e02\u5e03\u5e04\u5e05\u5e06\u5e07\u5e08\u5e09\u5e0a\u5e0b\u5e0c\u5e0d\u5e0e\u5e0f\u5e10\u5e11\u5e12\u5e13\u5e14\u5e15\u5e16\u5e17\u5e18\u5e19\u5e1a\u5e1b\u5e1c\u5e1d\u5e1e\u5e1f\u5e20\u5e21\u5e22\u5e23\u5e24\u5e25\u5e26\u5e27\u5e28\u5e29\u5e2a\u5e2b\u5e2c\u5e2d\u5e2e\u5e2f\u5e30\u5e31\u5e32\u5e33\u5e34\u5e35\u5e36\u5e37\u5e38\u5e39\u5e3a\u5e3b\u5e3c\u5e3d\u5e3e\u5e3f\u5e40\u5e41\u5e42\u5e43\u5e44\u5e45\u5e46\u5e47\u5e48\u5e49\u5e4a\u5e4b\u5e4c\u5e4d\u5e4e\u5e4f\u5e50\u5e51\u5e52\u5e53\u5e54\u5e55\u5e56\u5e57\u5e58\u5e59\u5e5a\u5e5b\u5e5c\u5e5d\u5e5e\u5e5f\u5e60\u5e61\u5e62\u5e63\u5e64\u5e65\u5e66\u5e67\u5e68\u5e69\u5e6a\u5e6b\u5e6c\u5e6d\u5e6e\u5e6f\u5e70\u5e71\u5e72\u5e73\u5e74\u5e75\u5e76\u5e77\u5e78\u5e79\u5e7a\u5e7b\u5e7c\u5e7d\u5e7e\u5e7f\u5e80\u5e81\u5e82\u5e83\u5e84\u5e85\u5e86\u5e87\u5e88\u5e89\u5e8a\u5e8b\u5e8c\u5e8d\u5e8e\u5e8f\u5e90\u5e91\u5e92\u5e93\u5e94\u5e95\u5e96\u5e97\u5e98\u5e99\u5e9a\u5e9b\u5e9c\u5e9d\u5e9e\u5e9f\u5ea0\u5ea1\u5ea2\u5ea3\u5ea4\u5ea5\u5ea6\u5ea7\u5ea8\u5ea9\u5eaa\u5eab\u5eac\u5ead\u5eae\u5eaf\u5eb0\u5eb1\u5eb2\u5eb3\u5eb4\u5eb5\u5eb6\u5eb7\u5eb8\u5eb9\u5eba\u5ebb\u5ebc\u5ebd\u5ebe\u5ebf\u5ec0\u5ec1\u5ec2\u5ec3\u5ec4\u5ec5\u5ec6\u5ec7\u5ec8\u5ec9\u5eca\u5ecb\u5ecc\u5ecd\u5ece\u5ecf\u5ed0\u5ed1\u5ed2\u5ed3\u5ed4\u5ed5\u5ed6\u5ed7\u5ed8\u5ed9\u5eda\u5edb\u5edc\u5edd\u5ede\u5edf\u5ee0\u5ee1\u5ee2\u5ee3\u5ee4\u5ee5\u5ee6\u5ee7\u5ee8\u5ee9\u5eea\u5eeb\u5eec\u5eed\u5eee\u5eef\u5ef0\u5ef1\u5ef2\u5ef3\u5ef4\u5ef5\u5ef6\u5ef7\u5ef8\u5ef9\u5efa\u5efb\u5efc\u5efd\u5efe\u5eff\u5f00\u5f01\u5f02\u5f03\u5f04\u5f05\u5f06\u5f07\u5f08\u5f09\u5f0a\u5f0b\u5f0c\u5f0d\u5f0e\u5f0f\u5f10\u5f11\u5f12\u5f13\u5f14\u5f15\u5f16\u5f17\u5f18\u5f19\u5f1a\u5f1b\u5f1c\u5f1d\u5f1e\u5f1f\u5f20\u5f21\u5f22\u5f23\u5f24\u5f25\u5f26\u5f27\u5f28\u5f29\u5f2a\u5f2b\u5f2c\u5f2d\u5f2e\u5f2f\u5f30\u5f31\u5f32\u5f33\u5f34\u5f35\u5f36\u5f37\u5f38\u5f39\u5f3a\u5f3b\u5f3c\u5f3d\u5f3e\u5f3f\u5f40\u5f41\u5f42\u5f43\u5f44\u5f45\u5f46\u5f47\u5f48\u5f49\u5f4a\u5f4b\u5f4c\u5f4d\u5f4e\u5f4f\u5f50\u5f51\u5f52\u5f53\u5f54\u5f55\u5f56\u5f57\u5f58\u5f59\u5f5a\u5f5b\u5f5c\u5f5d\u5f5e\u5f5f\u5f60\u5f61\u5f62\u5f63\u5f64\u5f65\u5f66\u5f67\u5f68\u5f69\u5f6a\u5f6b\u5f6c\u5f6d\u5f6e\u5f6f\u5f70\u5f71\u5f72\u5f73\u5f74\u5f75\u5f76\u5f77\u5f78\u5f79\u5f7a\u5f7b\u5f7c\u5f7d\u5f7e\u5f7f\u5f80\u5f81\u5f82\u5f83\u5f84\u5f85\u5f86\u5f87\u5f88\u5f89\u5f8a\u5f8b\u5f8c\u5f8d\u5f8e\u5f8f\u5f90\u5f91\u5f92\u5f93\u5f94\u5f95\u5f96\u5f97\u5f98\u5f99\u5f9a\u5f9b\u5f9c\u5f9d\u5f9e\u5f9f\u5fa0\u5fa1\u5fa2\u5fa3\u5fa4\u5fa5\u5fa6\u5fa7\u5fa8\u5fa9\u5faa\u5fab\u5fac\u5fad\u5fae\u5faf\u5fb0\u5fb1\u5fb2\u5fb3\u5fb4\u5fb5\u5fb6\u5fb7\u5fb8\u5fb9\u5fba\u5fbb\u5fbc\u5fbd\u5fbe\u5fbf\u5fc0\u5fc1\u5fc2\u5fc3\u5fc4\u5fc5\u5fc6\u5fc7\u5fc8\u5fc9\u5fca\u5fcb\u5fcc\u5fcd\u5fce\u5fcf\u5fd0\u5fd1\u5fd2\u5fd3\u5fd4\u5fd5\u5fd6\u5fd7\u5fd8\u5fd9\u5fda\u5fdb\u5fdc\u5fdd\u5fde\u5fdf\u5fe0\u5fe1\u5fe2\u5fe3\u5fe4\u5fe5\u5fe6\u5fe7\u5fe8\u5fe9\u5fea\u5feb\u5fec\u5fed\u5fee\u5fef\u5ff0\u5ff1\u5ff2\u5ff3\u5ff4\u5ff5\u5ff6\u5ff7\u5ff8\u5ff9\u5ffa\u5ffb\u5ffc\u5ffd\u5ffe\u5fff\u6000\u6001\u6002\u6003\u6004\u6005\u6006\u6007\u6008\u6009\u600a\u600b\u600c\u600d\u600e\u600f\u6010\u6011\u6012\u6013\u6014\u6015\u6016\u6017\u6018\u6019\u601a\u601b\u601c\u601d\u601e\u601f\u6020\u6021\u6022\u6023\u6024\u6025\u6026\u6027\u6028\u6029\u602a\u602b\u602c\u602d\u602e\u602f\u6030\u6031\u6032\u6033\u6034\u6035\u6036\u6037\u6038\u6039\u603a\u603b\u603c\u603d\u603e\u603f\u6040\u6041\u6042\u6043\u6044\u6045\u6046\u6047\u6048\u6049\u604a\u604b\u604c\u604d\u604e\u604f\u6050\u6051\u6052\u6053\u6054\u6055\u6056\u6057\u6058\u6059\u605a\u605b\u605c\u605d\u605e\u605f\u6060\u6061\u6062\u6063\u6064\u6065\u6066\u6067\u6068\u6069\u606a\u606b\u606c\u606d\u606e\u606f\u6070\u6071\u6072\u6073\u6074\u6075\u6076\u6077\u6078\u6079\u607a\u607b\u607c\u607d\u607e\u607f\u6080\u6081\u6082\u6083\u6084\u6085\u6086\u6087\u6088\u6089\u608a\u608b\u608c\u608d\u608e\u608f\u6090\u6091\u6092\u6093\u6094\u6095\u6096\u6097\u6098\u6099\u609a\u609b\u609c\u609d\u609e\u609f\u60a0\u60a1\u60a2\u60a3\u60a4\u60a5\u60a6\u60a7\u60a8\u60a9\u60aa\u60ab\u60ac\u60ad\u60ae\u60af\u60b0\u60b1\u60b2\u60b3\u60b4\u60b5\u60b6\u60b7\u60b8\u60b9\u60ba\u60bb\u60bc\u60bd\u60be\u60bf\u60c0\u60c1\u60c2\u60c3\u60c4\u60c5\u60c6\u60c7\u60c8\u60c9\u60ca\u60cb\u60cc\u60cd\u60ce\u60cf\u60d0\u60d1\u60d2\u60d3\u60d4\u60d5\u60d6\u60d7\u60d8\u60d9\u60da\u60db\u60dc\u60dd\u60de\u60df\u60e0\u60e1\u60e2\u60e3\u60e4\u60e5\u60e6\u60e7\u60e8\u60e9\u60ea\u60eb\u60ec\u60ed\u60ee\u60ef\u60f0\u60f1\u60f2\u60f3\u60f4\u60f5\u60f6\u60f7\u60f8\u60f9\u60fa\u60fb\u60fc\u60fd\u60fe\u60ff\u6100\u6101\u6102\u6103\u6104\u6105\u6106\u6107\u6108\u6109\u610a\u610b\u610c\u610d\u610e\u610f\u6110\u6111\u6112\u6113\u6114\u6115\u6116\u6117\u6118\u6119\u611a\u611b\u611c\u611d\u611e\u611f\u6120\u6121\u6122\u6123\u6124\u6125\u6126\u6127\u6128\u6129\u612a\u612b\u612c\u612d\u612e\u612f\u6130\u6131\u6132\u6133\u6134\u6135\u6136\u6137\u6138\u6139\u613a\u613b\u613c\u613d\u613e\u613f\u6140\u6141\u6142\u6143\u6144\u6145\u6146\u6147\u6148\u6149\u614a\u614b\u614c\u614d\u614e\u614f\u6150\u6151\u6152\u6153\u6154\u6155\u6156\u6157\u6158\u6159\u615a\u615b\u615c\u615d\u615e\u615f\u6160\u6161\u6162\u6163\u6164\u6165\u6166\u6167\u6168\u6169\u616a\u616b\u616c\u616d\u616e\u616f\u6170\u6171\u6172\u6173\u6174\u6175\u6176\u6177\u6178\u6179\u617a\u617b\u617c\u617d\u617e\u617f\u6180\u6181\u6182\u6183\u6184\u6185\u6186\u6187\u6188\u6189\u618a\u618b\u618c\u618d\u618e\u618f\u6190\u6191\u6192\u6193\u6194\u6195\u6196\u6197\u6198\u6199\u619a\u619b\u619c\u619d\u619e\u619f\u61a0\u61a1\u61a2\u61a3\u61a4\u61a5\u61a6\u61a7\u61a8\u61a9\u61aa\u61ab\u61ac\u61ad\u61ae\u61af\u61b0\u61b1\u61b2\u61b3\u61b4\u61b5\u61b6\u61b7\u61b8\u61b9\u61ba\u61bb\u61bc\u61bd\u61be\u61bf\u61c0\u61c1\u61c2\u61c3\u61c4\u61c5\u61c6\u61c7\u61c8\u61c9\u61ca\u61cb\u61cc\u61cd\u61ce\u61cf\u61d0\u61d1\u61d2\u61d3\u61d4\u61d5\u61d6\u61d7\u61d8\u61d9\u61da\u61db\u61dc\u61dd\u61de\u61df\u61e0\u61e1\u61e2\u61e3\u61e4\u61e5\u61e6\u61e7\u61e8\u61e9\u61ea\u61eb\u61ec\u61ed\u61ee\u61ef\u61f0\u61f1\u61f2\u61f3\u61f4\u61f5\u61f6\u61f7\u61f8\u61f9\u61fa\u61fb\u61fc\u61fd\u61fe\u61ff\u6200\u6201\u6202\u6203\u6204\u6205\u6206\u6207\u6208\u6209\u620a\u620b\u620c\u620d\u620e\u620f\u6210\u6211\u6212\u6213\u6214\u6215\u6216\u6217\u6218\u6219\u621a\u621b\u621c\u621d\u621e\u621f\u6220\u6221\u6222\u6223\u6224\u6225\u6226\u6227\u6228\u6229\u622a\u622b\u622c\u622d\u622e\u622f\u6230\u6231\u6232\u6233\u6234\u6235\u6236\u6237\u6238\u6239\u623a\u623b\u623c\u623d\u623e\u623f\u6240\u6241\u6242\u6243\u6244\u6245\u6246\u6247\u6248\u6249\u624a\u624b\u624c\u624d\u624e\u624f\u6250\u6251\u6252\u6253\u6254\u6255\u6256\u6257\u6258\u6259\u625a\u625b\u625c\u625d\u625e\u625f\u6260\u6261\u6262\u6263\u6264\u6265\u6266\u6267\u6268\u6269\u626a\u626b\u626c\u626d\u626e\u626f\u6270\u6271\u6272\u6273\u6274\u6275\u6276\u6277\u6278\u6279\u627a\u627b\u627c\u627d\u627e\u627f\u6280\u6281\u6282\u6283\u6284\u6285\u6286\u6287\u6288\u6289\u628a\u628b\u628c\u628d\u628e\u628f\u6290\u6291\u6292\u6293\u6294\u6295\u6296\u6297\u6298\u6299\u629a\u629b\u629c\u629d\u629e\u629f\u62a0\u62a1\u62a2\u62a3\u62a4\u62a5\u62a6\u62a7\u62a8\u62a9\u62aa\u62ab\u62ac\u62ad\u62ae\u62af\u62b0\u62b1\u62b2\u62b3\u62b4\u62b5\u62b6\u62b7\u62b8\u62b9\u62ba\u62bb\u62bc\u62bd\u62be\u62bf\u62c0\u62c1\u62c2\u62c3\u62c4\u62c5\u62c6\u62c7\u62c8\u62c9\u62ca\u62cb\u62cc\u62cd\u62ce\u62cf\u62d0\u62d1\u62d2\u62d3\u62d4\u62d5\u62d6\u62d7\u62d8\u62d9\u62da\u62db\u62dc\u62dd\u62de\u62df\u62e0\u62e1\u62e2\u62e3\u62e4\u62e5\u62e6\u62e7\u62e8\u62e9\u62ea\u62eb\u62ec\u62ed\u62ee\u62ef\u62f0\u62f1\u62f2\u62f3\u62f4\u62f5\u62f6\u62f7\u62f8\u62f9\u62fa\u62fb\u62fc\u62fd\u62fe\u62ff\u6300\u6301\u6302\u6303\u6304\u6305\u6306\u6307\u6308\u6309\u630a\u630b\u630c\u630d\u630e\u630f\u6310\u6311\u6312\u6313\u6314\u6315\u6316\u6317\u6318\u6319\u631a\u631b\u631c\u631d\u631e\u631f\u6320\u6321\u6322\u6323\u6324\u6325\u6326\u6327\u6328\u6329\u632a\u632b\u632c\u632d\u632e\u632f\u6330\u6331\u6332\u6333\u6334\u6335\u6336\u6337\u6338\u6339\u633a\u633b\u633c\u633d\u633e\u633f\u6340\u6341\u6342\u6343\u6344\u6345\u6346\u6347\u6348\u6349\u634a\u634b\u634c\u634d\u634e\u634f\u6350\u6351\u6352\u6353\u6354\u6355\u6356\u6357\u6358\u6359\u635a\u635b\u635c\u635d\u635e\u635f\u6360\u6361\u6362\u6363\u6364\u6365\u6366\u6367\u6368\u6369\u636a\u636b\u636c\u636d\u636e\u636f\u6370\u6371\u6372\u6373\u6374\u6375\u6376\u6377\u6378\u6379\u637a\u637b\u637c\u637d\u637e\u637f\u6380\u6381\u6382\u6383\u6384\u6385\u6386\u6387\u6388\u6389\u638a\u638b\u638c\u638d\u638e\u638f\u6390\u6391\u6392\u6393\u6394\u6395\u6396\u6397\u6398\u6399\u639a\u639b\u639c\u639d\u639e\u639f\u63a0\u63a1\u63a2\u63a3\u63a4\u63a5\u63a6\u63a7\u63a8\u63a9\u63aa\u63ab\u63ac\u63ad\u63ae\u63af\u63b0\u63b1\u63b2\u63b3\u63b4\u63b5\u63b6\u63b7\u63b8\u63b9\u63ba\u63bb\u63bc\u63bd\u63be\u63bf\u63c0\u63c1\u63c2\u63c3\u63c4\u63c5\u63c6\u63c7\u63c8\u63c9\u63ca\u63cb\u63cc\u63cd\u63ce\u63cf\u63d0\u63d1\u63d2\u63d3\u63d4\u63d5\u63d6\u63d7\u63d8\u63d9\u63da\u63db\u63dc\u63dd\u63de\u63df\u63e0\u63e1\u63e2\u63e3\u63e4\u63e5\u63e6\u63e7\u63e8\u63e9\u63ea\u63eb\u63ec\u63ed\u63ee\u63ef\u63f0\u63f1\u63f2\u63f3\u63f4\u63f5\u63f6\u63f7\u63f8\u63f9\u63fa\u63fb\u63fc\u63fd\u63fe\u63ff\u6400\u6401\u6402\u6403\u6404\u6405\u6406\u6407\u6408\u6409\u640a\u640b\u640c\u640d\u640e\u640f\u6410\u6411\u6412\u6413\u6414\u6415\u6416\u6417\u6418\u6419\u641a\u641b\u641c\u641d\u641e\u641f\u6420\u6421\u6422\u6423\u6424\u6425\u6426\u6427\u6428\u6429\u642a\u642b\u642c\u642d\u642e\u642f\u6430\u6431\u6432\u6433\u6434\u6435\u6436\u6437\u6438\u6439\u643a\u643b\u643c\u643d\u643e\u643f\u6440\u6441\u6442\u6443\u6444\u6445\u6446\u6447\u6448\u6449\u644a\u644b\u644c\u644d\u644e\u644f\u6450\u6451\u6452\u6453\u6454\u6455\u6456\u6457\u6458\u6459\u645a\u645b\u645c\u645d\u645e\u645f\u6460\u6461\u6462\u6463\u6464\u6465\u6466\u6467\u6468\u6469\u646a\u646b\u646c\u646d\u646e\u646f\u6470\u6471\u6472\u6473\u6474\u6475\u6476\u6477\u6478\u6479\u647a\u647b\u647c\u647d\u647e\u647f\u6480\u6481\u6482\u6483\u6484\u6485\u6486\u6487\u6488\u6489\u648a\u648b\u648c\u648d\u648e\u648f\u6490\u6491\u6492\u6493\u6494\u6495\u6496\u6497\u6498\u6499\u649a\u649b\u649c\u649d\u649e\u649f\u64a0\u64a1\u64a2\u64a3\u64a4\u64a5\u64a6\u64a7\u64a8\u64a9\u64aa\u64ab\u64ac\u64ad\u64ae\u64af\u64b0\u64b1\u64b2\u64b3\u64b4\u64b5\u64b6\u64b7\u64b8\u64b9\u64ba\u64bb\u64bc\u64bd\u64be\u64bf\u64c0\u64c1\u64c2\u64c3\u64c4\u64c5\u64c6\u64c7\u64c8\u64c9\u64ca\u64cb\u64cc\u64cd\u64ce\u64cf\u64d0\u64d1\u64d2\u64d3\u64d4\u64d5\u64d6\u64d7\u64d8\u64d9\u64da\u64db\u64dc\u64dd\u64de\u64df\u64e0\u64e1\u64e2\u64e3\u64e4\u64e5\u64e6\u64e7\u64e8\u64e9\u64ea\u64eb\u64ec\u64ed\u64ee\u64ef\u64f0\u64f1\u64f2\u64f3\u64f4\u64f5\u64f6\u64f7\u64f8\u64f9\u64fa\u64fb\u64fc\u64fd\u64fe\u64ff\u6500\u6501\u6502\u6503\u6504\u6505\u6506\u6507\u6508\u6509\u650a\u650b\u650c\u650d\u650e\u650f\u6510\u6511\u6512\u6513\u6514\u6515\u6516\u6517\u6518\u6519\u651a\u651b\u651c\u651d\u651e\u651f\u6520\u6521\u6522\u6523\u6524\u6525\u6526\u6527\u6528\u6529\u652a\u652b\u652c\u652d\u652e\u652f\u6530\u6531\u6532\u6533\u6534\u6535\u6536\u6537\u6538\u6539\u653a\u653b\u653c\u653d\u653e\u653f\u6540\u6541\u6542\u6543\u6544\u6545\u6546\u6547\u6548\u6549\u654a\u654b\u654c\u654d\u654e\u654f\u6550\u6551\u6552\u6553\u6554\u6555\u6556\u6557\u6558\u6559\u655a\u655b\u655c\u655d\u655e\u655f\u6560\u6561\u6562\u6563\u6564\u6565\u6566\u6567\u6568\u6569\u656a\u656b\u656c\u656d\u656e\u656f\u6570\u6571\u6572\u6573\u6574\u6575\u6576\u6577\u6578\u6579\u657a\u657b\u657c\u657d\u657e\u657f\u6580\u6581\u6582\u6583\u6584\u6585\u6586\u6587\u6588\u6589\u658a\u658b\u658c\u658d\u658e\u658f\u6590\u6591\u6592\u6593\u6594\u6595\u6596\u6597\u6598\u6599\u659a\u659b\u659c\u659d\u659e\u659f\u65a0\u65a1\u65a2\u65a3\u65a4\u65a5\u65a6\u65a7\u65a8\u65a9\u65aa\u65ab\u65ac\u65ad\u65ae\u65af\u65b0\u65b1\u65b2\u65b3\u65b4\u65b5\u65b6\u65b7\u65b8\u65b9\u65ba\u65bb\u65bc\u65bd\u65be\u65bf\u65c0\u65c1\u65c2\u65c3\u65c4\u65c5\u65c6\u65c7\u65c8\u65c9\u65ca\u65cb\u65cc\u65cd\u65ce\u65cf\u65d0\u65d1\u65d2\u65d3\u65d4\u65d5\u65d6\u65d7\u65d8\u65d9\u65da\u65db\u65dc\u65dd\u65de\u65df\u65e0\u65e1\u65e2\u65e3\u65e4\u65e5\u65e6\u65e7\u65e8\u65e9\u65ea\u65eb\u65ec\u65ed\u65ee\u65ef\u65f0\u65f1\u65f2\u65f3\u65f4\u65f5\u65f6\u65f7\u65f8\u65f9\u65fa\u65fb\u65fc\u65fd\u65fe\u65ff\u6600\u6601\u6602\u6603\u6604\u6605\u6606\u6607\u6608\u6609\u660a\u660b\u660c\u660d\u660e\u660f\u6610\u6611\u6612\u6613\u6614\u6615\u6616\u6617\u6618\u6619\u661a\u661b\u661c\u661d\u661e\u661f\u6620\u6621\u6622\u6623\u6624\u6625\u6626\u6627\u6628\u6629\u662a\u662b\u662c\u662d\u662e\u662f\u6630\u6631\u6632\u6633\u6634\u6635\u6636\u6637\u6638\u6639\u663a\u663b\u663c\u663d\u663e\u663f\u6640\u6641\u6642\u6643\u6644\u6645\u6646\u6647\u6648\u6649\u664a\u664b\u664c\u664d\u664e\u664f\u6650\u6651\u6652\u6653\u6654\u6655\u6656\u6657\u6658\u6659\u665a\u665b\u665c\u665d\u665e\u665f\u6660\u6661\u6662\u6663\u6664\u6665\u6666\u6667\u6668\u6669\u666a\u666b\u666c\u666d\u666e\u666f\u6670\u6671\u6672\u6673\u6674\u6675\u6676\u6677\u6678\u6679\u667a\u667b\u667c\u667d\u667e\u667f\u6680\u6681\u6682\u6683\u6684\u6685\u6686\u6687\u6688\u6689\u668a\u668b\u668c\u668d\u668e\u668f\u6690\u6691\u6692\u6693\u6694\u6695\u6696\u6697\u6698\u6699\u669a\u669b\u669c\u669d\u669e\u669f\u66a0\u66a1\u66a2\u66a3\u66a4\u66a5\u66a6\u66a7\u66a8\u66a9\u66aa\u66ab\u66ac\u66ad\u66ae\u66af\u66b0\u66b1\u66b2\u66b3\u66b4\u66b5\u66b6\u66b7\u66b8\u66b9\u66ba\u66bb\u66bc\u66bd\u66be\u66bf\u66c0\u66c1\u66c2\u66c3\u66c4\u66c5\u66c6\u66c7\u66c8\u66c9\u66ca\u66cb\u66cc\u66cd\u66ce\u66cf\u66d0\u66d1\u66d2\u66d3\u66d4\u66d5\u66d6\u66d7\u66d8\u66d9\u66da\u66db\u66dc\u66dd\u66de\u66df\u66e0\u66e1\u66e2\u66e3\u66e4\u66e5\u66e6\u66e7\u66e8\u66e9\u66ea\u66eb\u66ec\u66ed\u66ee\u66ef\u66f0\u66f1\u66f2\u66f3\u66f4\u66f5\u66f6\u66f7\u66f8\u66f9\u66fa\u66fb\u66fc\u66fd\u66fe\u66ff\u6700\u6701\u6702\u6703\u6704\u6705\u6706\u6707\u6708\u6709\u670a\u670b\u670c\u670d\u670e\u670f\u6710\u6711\u6712\u6713\u6714\u6715\u6716\u6717\u6718\u6719\u671a\u671b\u671c\u671d\u671e\u671f\u6720\u6721\u6722\u6723\u6724\u6725\u6726\u6727\u6728\u6729\u672a\u672b\u672c\u672d\u672e\u672f\u6730\u6731\u6732\u6733\u6734\u6735\u6736\u6737\u6738\u6739\u673a\u673b\u673c\u673d\u673e\u673f\u6740\u6741\u6742\u6743\u6744\u6745\u6746\u6747\u6748\u6749\u674a\u674b\u674c\u674d\u674e\u674f\u6750\u6751\u6752\u6753\u6754\u6755\u6756\u6757\u6758\u6759\u675a\u675b\u675c\u675d\u675e\u675f\u6760\u6761\u6762\u6763\u6764\u6765\u6766\u6767\u6768\u6769\u676a\u676b\u676c\u676d\u676e\u676f\u6770\u6771\u6772\u6773\u6774\u6775\u6776\u6777\u6778\u6779\u677a\u677b\u677c\u677d\u677e\u677f\u6780\u6781\u6782\u6783\u6784\u6785\u6786\u6787\u6788\u6789\u678a\u678b\u678c\u678d\u678e\u678f\u6790\u6791\u6792\u6793\u6794\u6795\u6796\u6797\u6798\u6799\u679a\u679b\u679c\u679d\u679e\u679f\u67a0\u67a1\u67a2\u67a3\u67a4\u67a5\u67a6\u67a7\u67a8\u67a9\u67aa\u67ab\u67ac\u67ad\u67ae\u67af\u67b0\u67b1\u67b2\u67b3\u67b4\u67b5\u67b6\u67b7\u67b8\u67b9\u67ba\u67bb\u67bc\u67bd\u67be\u67bf\u67c0\u67c1\u67c2\u67c3\u67c4\u67c5\u67c6\u67c7\u67c8\u67c9\u67ca\u67cb\u67cc\u67cd\u67ce\u67cf\u67d0\u67d1\u67d2\u67d3\u67d4\u67d5\u67d6\u67d7\u67d8\u67d9\u67da\u67db\u67dc\u67dd\u67de\u67df\u67e0\u67e1\u67e2\u67e3\u67e4\u67e5\u67e6\u67e7\u67e8\u67e9\u67ea\u67eb\u67ec\u67ed\u67ee\u67ef\u67f0\u67f1\u67f2\u67f3\u67f4\u67f5\u67f6\u67f7\u67f8\u67f9\u67fa\u67fb\u67fc\u67fd\u67fe\u67ff\u6800\u6801\u6802\u6803\u6804\u6805\u6806\u6807\u6808\u6809\u680a\u680b\u680c\u680d\u680e\u680f\u6810\u6811\u6812\u6813\u6814\u6815\u6816\u6817\u6818\u6819\u681a\u681b\u681c\u681d\u681e\u681f\u6820\u6821\u6822\u6823\u6824\u6825\u6826\u6827\u6828\u6829\u682a\u682b\u682c\u682d\u682e\u682f\u6830\u6831\u6832\u6833\u6834\u6835\u6836\u6837\u6838\u6839\u683a\u683b\u683c\u683d\u683e\u683f\u6840\u6841\u6842\u6843\u6844\u6845\u6846\u6847\u6848\u6849\u684a\u684b\u684c\u684d\u684e\u684f\u6850\u6851\u6852\u6853\u6854\u6855\u6856\u6857\u6858\u6859\u685a\u685b\u685c\u685d\u685e\u685f\u6860\u6861\u6862\u6863\u6864\u6865\u6866\u6867\u6868\u6869\u686a\u686b\u686c\u686d\u686e\u686f\u6870\u6871\u6872\u6873\u6874\u6875\u6876\u6877\u6878\u6879\u687a\u687b\u687c\u687d\u687e\u687f\u6880\u6881\u6882\u6883\u6884\u6885\u6886\u6887\u6888\u6889\u688a\u688b\u688c\u688d\u688e\u688f\u6890\u6891\u6892\u6893\u6894\u6895\u6896\u6897\u6898\u6899\u689a\u689b\u689c\u689d\u689e\u689f\u68a0\u68a1\u68a2\u68a3\u68a4\u68a5\u68a6\u68a7\u68a8\u68a9\u68aa\u68ab\u68ac\u68ad\u68ae\u68af\u68b0\u68b1\u68b2\u68b3\u68b4\u68b5\u68b6\u68b7\u68b8\u68b9\u68ba\u68bb\u68bc\u68bd\u68be\u68bf\u68c0\u68c1\u68c2\u68c3\u68c4\u68c5\u68c6\u68c7\u68c8\u68c9\u68ca\u68cb\u68cc\u68cd\u68ce\u68cf\u68d0\u68d1\u68d2\u68d3\u68d4\u68d5\u68d6\u68d7\u68d8\u68d9\u68da\u68db\u68dc\u68dd\u68de\u68df\u68e0\u68e1\u68e2\u68e3\u68e4\u68e5\u68e6\u68e7\u68e8\u68e9\u68ea\u68eb\u68ec\u68ed\u68ee\u68ef\u68f0\u68f1\u68f2\u68f3\u68f4\u68f5\u68f6\u68f7\u68f8\u68f9\u68fa\u68fb\u68fc\u68fd\u68fe\u68ff\u6900\u6901\u6902\u6903\u6904\u6905\u6906\u6907\u6908\u6909\u690a\u690b\u690c\u690d\u690e\u690f\u6910\u6911\u6912\u6913\u6914\u6915\u6916\u6917\u6918\u6919\u691a\u691b\u691c\u691d\u691e\u691f\u6920\u6921\u6922\u6923\u6924\u6925\u6926\u6927\u6928\u6929\u692a\u692b\u692c\u692d\u692e\u692f\u6930\u6931\u6932\u6933\u6934\u6935\u6936\u6937\u6938\u6939\u693a\u693b\u693c\u693d\u693e\u693f\u6940\u6941\u6942\u6943\u6944\u6945\u6946\u6947\u6948\u6949\u694a\u694b\u694c\u694d\u694e\u694f\u6950\u6951\u6952\u6953\u6954\u6955\u6956\u6957\u6958\u6959\u695a\u695b\u695c\u695d\u695e\u695f\u6960\u6961\u6962\u6963\u6964\u6965\u6966\u6967\u6968\u6969\u696a\u696b\u696c\u696d\u696e\u696f\u6970\u6971\u6972\u6973\u6974\u6975\u6976\u6977\u6978\u6979\u697a\u697b\u697c\u697d\u697e\u697f\u6980\u6981\u6982\u6983\u6984\u6985\u6986\u6987\u6988\u6989\u698a\u698b\u698c\u698d\u698e\u698f\u6990\u6991\u6992\u6993\u6994\u6995\u6996\u6997\u6998\u6999\u699a\u699b\u699c\u699d\u699e\u699f\u69a0\u69a1\u69a2\u69a3\u69a4\u69a5\u69a6\u69a7\u69a8\u69a9\u69aa\u69ab\u69ac\u69ad\u69ae\u69af\u69b0\u69b1\u69b2\u69b3\u69b4\u69b5\u69b6\u69b7\u69b8\u69b9\u69ba\u69bb\u69bc\u69bd\u69be\u69bf\u69c0\u69c1\u69c2\u69c3\u69c4\u69c5\u69c6\u69c7\u69c8\u69c9\u69ca\u69cb\u69cc\u69cd\u69ce\u69cf\u69d0\u69d1\u69d2\u69d3\u69d4\u69d5\u69d6\u69d7\u69d8\u69d9\u69da\u69db\u69dc\u69dd\u69de\u69df\u69e0\u69e1\u69e2\u69e3\u69e4\u69e5\u69e6\u69e7\u69e8\u69e9\u69ea\u69eb\u69ec\u69ed\u69ee\u69ef\u69f0\u69f1\u69f2\u69f3\u69f4\u69f5\u69f6\u69f7\u69f8\u69f9\u69fa\u69fb\u69fc\u69fd\u69fe\u69ff\u6a00\u6a01\u6a02\u6a03\u6a04\u6a05\u6a06\u6a07\u6a08\u6a09\u6a0a\u6a0b\u6a0c\u6a0d\u6a0e\u6a0f\u6a10\u6a11\u6a12\u6a13\u6a14\u6a15\u6a16\u6a17\u6a18\u6a19\u6a1a\u6a1b\u6a1c\u6a1d\u6a1e\u6a1f\u6a20\u6a21\u6a22\u6a23\u6a24\u6a25\u6a26\u6a27\u6a28\u6a29\u6a2a\u6a2b\u6a2c\u6a2d\u6a2e\u6a2f\u6a30\u6a31\u6a32\u6a33\u6a34\u6a35\u6a36\u6a37\u6a38\u6a39\u6a3a\u6a3b\u6a3c\u6a3d\u6a3e\u6a3f\u6a40\u6a41\u6a42\u6a43\u6a44\u6a45\u6a46\u6a47\u6a48\u6a49\u6a4a\u6a4b\u6a4c\u6a4d\u6a4e\u6a4f\u6a50\u6a51\u6a52\u6a53\u6a54\u6a55\u6a56\u6a57\u6a58\u6a59\u6a5a\u6a5b\u6a5c\u6a5d\u6a5e\u6a5f\u6a60\u6a61\u6a62\u6a63\u6a64\u6a65\u6a66\u6a67\u6a68\u6a69\u6a6a\u6a6b\u6a6c\u6a6d\u6a6e\u6a6f\u6a70\u6a71\u6a72\u6a73\u6a74\u6a75\u6a76\u6a77\u6a78\u6a79\u6a7a\u6a7b\u6a7c\u6a7d\u6a7e\u6a7f\u6a80\u6a81\u6a82\u6a83\u6a84\u6a85\u6a86\u6a87\u6a88\u6a89\u6a8a\u6a8b\u6a8c\u6a8d\u6a8e\u6a8f\u6a90\u6a91\u6a92\u6a93\u6a94\u6a95\u6a96\u6a97\u6a98\u6a99\u6a9a\u6a9b\u6a9c\u6a9d\u6a9e\u6a9f\u6aa0\u6aa1\u6aa2\u6aa3\u6aa4\u6aa5\u6aa6\u6aa7\u6aa8\u6aa9\u6aaa\u6aab\u6aac\u6aad\u6aae\u6aaf\u6ab0\u6ab1\u6ab2\u6ab3\u6ab4\u6ab5\u6ab6\u6ab7\u6ab8\u6ab9\u6aba\u6abb\u6abc\u6abd\u6abe\u6abf\u6ac0\u6ac1\u6ac2\u6ac3\u6ac4\u6ac5\u6ac6\u6ac7\u6ac8\u6ac9\u6aca\u6acb\u6acc\u6acd\u6ace\u6acf\u6ad0\u6ad1\u6ad2\u6ad3\u6ad4\u6ad5\u6ad6\u6ad7\u6ad8\u6ad9\u6ada\u6adb\u6adc\u6add\u6ade\u6adf\u6ae0\u6ae1\u6ae2\u6ae3\u6ae4\u6ae5\u6ae6\u6ae7\u6ae8\u6ae9\u6aea\u6aeb\u6aec\u6aed\u6aee\u6aef\u6af0\u6af1\u6af2\u6af3\u6af4\u6af5\u6af6\u6af7\u6af8\u6af9\u6afa\u6afb\u6afc\u6afd\u6afe\u6aff\u6b00\u6b01\u6b02\u6b03\u6b04\u6b05\u6b06\u6b07\u6b08\u6b09\u6b0a\u6b0b\u6b0c\u6b0d\u6b0e\u6b0f\u6b10\u6b11\u6b12\u6b13\u6b14\u6b15\u6b16\u6b17\u6b18\u6b19\u6b1a\u6b1b\u6b1c\u6b1d\u6b1e\u6b1f\u6b20\u6b21\u6b22\u6b23\u6b24\u6b25\u6b26\u6b27\u6b28\u6b29\u6b2a\u6b2b\u6b2c\u6b2d\u6b2e\u6b2f\u6b30\u6b31\u6b32\u6b33\u6b34\u6b35\u6b36\u6b37\u6b38\u6b39\u6b3a\u6b3b\u6b3c\u6b3d\u6b3e\u6b3f\u6b40\u6b41\u6b42\u6b43\u6b44\u6b45\u6b46\u6b47\u6b48\u6b49\u6b4a\u6b4b\u6b4c\u6b4d\u6b4e\u6b4f\u6b50\u6b51\u6b52\u6b53\u6b54\u6b55\u6b56\u6b57\u6b58\u6b59\u6b5a\u6b5b\u6b5c\u6b5d\u6b5e\u6b5f\u6b60\u6b61\u6b62\u6b63\u6b64\u6b65\u6b66\u6b67\u6b68\u6b69\u6b6a\u6b6b\u6b6c\u6b6d\u6b6e\u6b6f\u6b70\u6b71\u6b72\u6b73\u6b74\u6b75\u6b76\u6b77\u6b78\u6b79\u6b7a\u6b7b\u6b7c\u6b7d\u6b7e\u6b7f\u6b80\u6b81\u6b82\u6b83\u6b84\u6b85\u6b86\u6b87\u6b88\u6b89\u6b8a\u6b8b\u6b8c\u6b8d\u6b8e\u6b8f\u6b90\u6b91\u6b92\u6b93\u6b94\u6b95\u6b96\u6b97\u6b98\u6b99\u6b9a\u6b9b\u6b9c\u6b9d\u6b9e\u6b9f\u6ba0\u6ba1\u6ba2\u6ba3\u6ba4\u6ba5\u6ba6\u6ba7\u6ba8\u6ba9\u6baa\u6bab\u6bac\u6bad\u6bae\u6baf\u6bb0\u6bb1\u6bb2\u6bb3\u6bb4\u6bb5\u6bb6\u6bb7\u6bb8\u6bb9\u6bba\u6bbb\u6bbc\u6bbd\u6bbe\u6bbf\u6bc0\u6bc1\u6bc2\u6bc3\u6bc4\u6bc5\u6bc6\u6bc7\u6bc8\u6bc9\u6bca\u6bcb\u6bcc\u6bcd\u6bce\u6bcf\u6bd0\u6bd1\u6bd2\u6bd3\u6bd4\u6bd5\u6bd6\u6bd7\u6bd8\u6bd9\u6bda\u6bdb\u6bdc\u6bdd\u6bde\u6bdf\u6be0\u6be1\u6be2\u6be3\u6be4\u6be5\u6be6\u6be7\u6be8\u6be9\u6bea\u6beb\u6bec\u6bed\u6bee\u6bef\u6bf0\u6bf1\u6bf2\u6bf3\u6bf4\u6bf5\u6bf6\u6bf7\u6bf8\u6bf9\u6bfa\u6bfb\u6bfc\u6bfd\u6bfe\u6bff\u6c00\u6c01\u6c02\u6c03\u6c04\u6c05\u6c06\u6c07\u6c08\u6c09\u6c0a\u6c0b\u6c0c\u6c0d\u6c0e\u6c0f\u6c10\u6c11\u6c12\u6c13\u6c14\u6c15\u6c16\u6c17\u6c18\u6c19\u6c1a\u6c1b\u6c1c\u6c1d\u6c1e\u6c1f\u6c20\u6c21\u6c22\u6c23\u6c24\u6c25\u6c26\u6c27\u6c28\u6c29\u6c2a\u6c2b\u6c2c\u6c2d\u6c2e\u6c2f\u6c30\u6c31\u6c32\u6c33\u6c34\u6c35\u6c36\u6c37\u6c38\u6c39\u6c3a\u6c3b\u6c3c\u6c3d\u6c3e\u6c3f\u6c40\u6c41\u6c42\u6c43\u6c44\u6c45\u6c46\u6c47\u6c48\u6c49\u6c4a\u6c4b\u6c4c\u6c4d\u6c4e\u6c4f\u6c50\u6c51\u6c52\u6c53\u6c54\u6c55\u6c56\u6c57\u6c58\u6c59\u6c5a\u6c5b\u6c5c\u6c5d\u6c5e\u6c5f\u6c60\u6c61\u6c62\u6c63\u6c64\u6c65\u6c66\u6c67\u6c68\u6c69\u6c6a\u6c6b\u6c6c\u6c6d\u6c6e\u6c6f\u6c70\u6c71\u6c72\u6c73\u6c74\u6c75\u6c76\u6c77\u6c78\u6c79\u6c7a\u6c7b\u6c7c\u6c7d\u6c7e\u6c7f\u6c80\u6c81\u6c82\u6c83\u6c84\u6c85\u6c86\u6c87\u6c88\u6c89\u6c8a\u6c8b\u6c8c\u6c8d\u6c8e\u6c8f\u6c90\u6c91\u6c92\u6c93\u6c94\u6c95\u6c96\u6c97\u6c98\u6c99\u6c9a\u6c9b\u6c9c\u6c9d\u6c9e\u6c9f\u6ca0\u6ca1\u6ca2\u6ca3\u6ca4\u6ca5\u6ca6\u6ca7\u6ca8\u6ca9\u6caa\u6cab\u6cac\u6cad\u6cae\u6caf\u6cb0\u6cb1\u6cb2\u6cb3\u6cb4\u6cb5\u6cb6\u6cb7\u6cb8\u6cb9\u6cba\u6cbb\u6cbc\u6cbd\u6cbe\u6cbf\u6cc0\u6cc1\u6cc2\u6cc3\u6cc4\u6cc5\u6cc6\u6cc7\u6cc8\u6cc9\u6cca\u6ccb\u6ccc\u6ccd\u6cce\u6ccf\u6cd0\u6cd1\u6cd2\u6cd3\u6cd4\u6cd5\u6cd6\u6cd7\u6cd8\u6cd9\u6cda\u6cdb\u6cdc\u6cdd\u6cde\u6cdf\u6ce0\u6ce1\u6ce2\u6ce3\u6ce4\u6ce5\u6ce6\u6ce7\u6ce8\u6ce9\u6cea\u6ceb\u6cec\u6ced\u6cee\u6cef\u6cf0\u6cf1\u6cf2\u6cf3\u6cf4\u6cf5\u6cf6\u6cf7\u6cf8\u6cf9\u6cfa\u6cfb\u6cfc\u6cfd\u6cfe\u6cff\u6d00\u6d01\u6d02\u6d03\u6d04\u6d05\u6d06\u6d07\u6d08\u6d09\u6d0a\u6d0b\u6d0c\u6d0d\u6d0e\u6d0f\u6d10\u6d11\u6d12\u6d13\u6d14\u6d15\u6d16\u6d17\u6d18\u6d19\u6d1a\u6d1b\u6d1c\u6d1d\u6d1e\u6d1f\u6d20\u6d21\u6d22\u6d23\u6d24\u6d25\u6d26\u6d27\u6d28\u6d29\u6d2a\u6d2b\u6d2c\u6d2d\u6d2e\u6d2f\u6d30\u6d31\u6d32\u6d33\u6d34\u6d35\u6d36\u6d37\u6d38\u6d39\u6d3a\u6d3b\u6d3c\u6d3d\u6d3e\u6d3f\u6d40\u6d41\u6d42\u6d43\u6d44\u6d45\u6d46\u6d47\u6d48\u6d49\u6d4a\u6d4b\u6d4c\u6d4d\u6d4e\u6d4f\u6d50\u6d51\u6d52\u6d53\u6d54\u6d55\u6d56\u6d57\u6d58\u6d59\u6d5a\u6d5b\u6d5c\u6d5d\u6d5e\u6d5f\u6d60\u6d61\u6d62\u6d63\u6d64\u6d65\u6d66\u6d67\u6d68\u6d69\u6d6a\u6d6b\u6d6c\u6d6d\u6d6e\u6d6f\u6d70\u6d71\u6d72\u6d73\u6d74\u6d75\u6d76\u6d77\u6d78\u6d79\u6d7a\u6d7b\u6d7c\u6d7d\u6d7e\u6d7f\u6d80\u6d81\u6d82\u6d83\u6d84\u6d85\u6d86\u6d87\u6d88\u6d89\u6d8a\u6d8b\u6d8c\u6d8d\u6d8e\u6d8f\u6d90\u6d91\u6d92\u6d93\u6d94\u6d95\u6d96\u6d97\u6d98\u6d99\u6d9a\u6d9b\u6d9c\u6d9d\u6d9e\u6d9f\u6da0\u6da1\u6da2\u6da3\u6da4\u6da5\u6da6\u6da7\u6da8\u6da9\u6daa\u6dab\u6dac\u6dad\u6dae\u6daf\u6db0\u6db1\u6db2\u6db3\u6db4\u6db5\u6db6\u6db7\u6db8\u6db9\u6dba\u6dbb\u6dbc\u6dbd\u6dbe\u6dbf\u6dc0\u6dc1\u6dc2\u6dc3\u6dc4\u6dc5\u6dc6\u6dc7\u6dc8\u6dc9\u6dca\u6dcb\u6dcc\u6dcd\u6dce\u6dcf\u6dd0\u6dd1\u6dd2\u6dd3\u6dd4\u6dd5\u6dd6\u6dd7\u6dd8\u6dd9\u6dda\u6ddb\u6ddc\u6ddd\u6dde\u6ddf\u6de0\u6de1\u6de2\u6de3\u6de4\u6de5\u6de6\u6de7\u6de8\u6de9\u6dea\u6deb\u6dec\u6ded\u6dee\u6def\u6df0\u6df1\u6df2\u6df3\u6df4\u6df5\u6df6\u6df7\u6df8\u6df9\u6dfa\u6dfb\u6dfc\u6dfd\u6dfe\u6dff\u6e00\u6e01\u6e02\u6e03\u6e04\u6e05\u6e06\u6e07\u6e08\u6e09\u6e0a\u6e0b\u6e0c\u6e0d\u6e0e\u6e0f\u6e10\u6e11\u6e12\u6e13\u6e14\u6e15\u6e16\u6e17\u6e18\u6e19\u6e1a\u6e1b\u6e1c\u6e1d\u6e1e\u6e1f\u6e20\u6e21\u6e22\u6e23\u6e24\u6e25\u6e26\u6e27\u6e28\u6e29\u6e2a\u6e2b\u6e2c\u6e2d\u6e2e\u6e2f\u6e30\u6e31\u6e32\u6e33\u6e34\u6e35\u6e36\u6e37\u6e38\u6e39\u6e3a\u6e3b\u6e3c\u6e3d\u6e3e\u6e3f\u6e40\u6e41\u6e42\u6e43\u6e44\u6e45\u6e46\u6e47\u6e48\u6e49\u6e4a\u6e4b\u6e4c\u6e4d\u6e4e\u6e4f\u6e50\u6e51\u6e52\u6e53\u6e54\u6e55\u6e56\u6e57\u6e58\u6e59\u6e5a\u6e5b\u6e5c\u6e5d\u6e5e\u6e5f\u6e60\u6e61\u6e62\u6e63\u6e64\u6e65\u6e66\u6e67\u6e68\u6e69\u6e6a\u6e6b\u6e6c\u6e6d\u6e6e\u6e6f\u6e70\u6e71\u6e72\u6e73\u6e74\u6e75\u6e76\u6e77\u6e78\u6e79\u6e7a\u6e7b\u6e7c\u6e7d\u6e7e\u6e7f\u6e80\u6e81\u6e82\u6e83\u6e84\u6e85\u6e86\u6e87\u6e88\u6e89\u6e8a\u6e8b\u6e8c\u6e8d\u6e8e\u6e8f\u6e90\u6e91\u6e92\u6e93\u6e94\u6e95\u6e96\u6e97\u6e98\u6e99\u6e9a\u6e9b\u6e9c\u6e9d\u6e9e\u6e9f\u6ea0\u6ea1\u6ea2\u6ea3\u6ea4\u6ea5\u6ea6\u6ea7\u6ea8\u6ea9\u6eaa\u6eab\u6eac\u6ead\u6eae\u6eaf\u6eb0\u6eb1\u6eb2\u6eb3\u6eb4\u6eb5\u6eb6\u6eb7\u6eb8\u6eb9\u6eba\u6ebb\u6ebc\u6ebd\u6ebe\u6ebf\u6ec0\u6ec1\u6ec2\u6ec3\u6ec4\u6ec5\u6ec6\u6ec7\u6ec8\u6ec9\u6eca\u6ecb\u6ecc\u6ecd\u6ece\u6ecf\u6ed0\u6ed1\u6ed2\u6ed3\u6ed4\u6ed5\u6ed6\u6ed7\u6ed8\u6ed9\u6eda\u6edb\u6edc\u6edd\u6ede\u6edf\u6ee0\u6ee1\u6ee2\u6ee3\u6ee4\u6ee5\u6ee6\u6ee7\u6ee8\u6ee9\u6eea\u6eeb\u6eec\u6eed\u6eee\u6eef\u6ef0\u6ef1\u6ef2\u6ef3\u6ef4\u6ef5\u6ef6\u6ef7\u6ef8\u6ef9\u6efa\u6efb\u6efc\u6efd\u6efe\u6eff\u6f00\u6f01\u6f02\u6f03\u6f04\u6f05\u6f06\u6f07\u6f08\u6f09\u6f0a\u6f0b\u6f0c\u6f0d\u6f0e\u6f0f\u6f10\u6f11\u6f12\u6f13\u6f14\u6f15\u6f16\u6f17\u6f18\u6f19\u6f1a\u6f1b\u6f1c\u6f1d\u6f1e\u6f1f\u6f20\u6f21\u6f22\u6f23\u6f24\u6f25\u6f26\u6f27\u6f28\u6f29\u6f2a\u6f2b\u6f2c\u6f2d\u6f2e\u6f2f\u6f30\u6f31\u6f32\u6f33\u6f34\u6f35\u6f36\u6f37\u6f38\u6f39\u6f3a\u6f3b\u6f3c\u6f3d\u6f3e\u6f3f\u6f40\u6f41\u6f42\u6f43\u6f44\u6f45\u6f46\u6f47\u6f48\u6f49\u6f4a\u6f4b\u6f4c\u6f4d\u6f4e\u6f4f\u6f50\u6f51\u6f52\u6f53\u6f54\u6f55\u6f56\u6f57\u6f58\u6f59\u6f5a\u6f5b\u6f5c\u6f5d\u6f5e\u6f5f\u6f60\u6f61\u6f62\u6f63\u6f64\u6f65\u6f66\u6f67\u6f68\u6f69\u6f6a\u6f6b\u6f6c\u6f6d\u6f6e\u6f6f\u6f70\u6f71\u6f72\u6f73\u6f74\u6f75\u6f76\u6f77\u6f78\u6f79\u6f7a\u6f7b\u6f7c\u6f7d\u6f7e\u6f7f\u6f80\u6f81\u6f82\u6f83\u6f84\u6f85\u6f86\u6f87\u6f88\u6f89\u6f8a\u6f8b\u6f8c\u6f8d\u6f8e\u6f8f\u6f90\u6f91\u6f92\u6f93\u6f94\u6f95\u6f96\u6f97\u6f98\u6f99\u6f9a\u6f9b\u6f9c\u6f9d\u6f9e\u6f9f\u6fa0\u6fa1\u6fa2\u6fa3\u6fa4\u6fa5\u6fa6\u6fa7\u6fa8\u6fa9\u6faa\u6fab\u6fac\u6fad\u6fae\u6faf\u6fb0\u6fb1\u6fb2\u6fb3\u6fb4\u6fb5\u6fb6\u6fb7\u6fb8\u6fb9\u6fba\u6fbb\u6fbc\u6fbd\u6fbe\u6fbf\u6fc0\u6fc1\u6fc2\u6fc3\u6fc4\u6fc5\u6fc6\u6fc7\u6fc8\u6fc9\u6fca\u6fcb\u6fcc\u6fcd\u6fce\u6fcf\u6fd0\u6fd1\u6fd2\u6fd3\u6fd4\u6fd5\u6fd6\u6fd7\u6fd8\u6fd9\u6fda\u6fdb\u6fdc\u6fdd\u6fde\u6fdf\u6fe0\u6fe1\u6fe2\u6fe3\u6fe4\u6fe5\u6fe6\u6fe7\u6fe8\u6fe9\u6fea\u6feb\u6fec\u6fed\u6fee\u6fef\u6ff0\u6ff1\u6ff2\u6ff3\u6ff4\u6ff5\u6ff6\u6ff7\u6ff8\u6ff9\u6ffa\u6ffb\u6ffc\u6ffd\u6ffe\u6fff\u7000\u7001\u7002\u7003\u7004\u7005\u7006\u7007\u7008\u7009\u700a\u700b\u700c\u700d\u700e\u700f\u7010\u7011\u7012\u7013\u7014\u7015\u7016\u7017\u7018\u7019\u701a\u701b\u701c\u701d\u701e\u701f\u7020\u7021\u7022\u7023\u7024\u7025\u7026\u7027\u7028\u7029\u702a\u702b\u702c\u702d\u702e\u702f\u7030\u7031\u7032\u7033\u7034\u7035\u7036\u7037\u7038\u7039\u703a\u703b\u703c\u703d\u703e\u703f\u7040\u7041\u7042\u7043\u7044\u7045\u7046\u7047\u7048\u7049\u704a\u704b\u704c\u704d\u704e\u704f\u7050\u7051\u7052\u7053\u7054\u7055\u7056\u7057\u7058\u7059\u705a\u705b\u705c\u705d\u705e\u705f\u7060\u7061\u7062\u7063\u7064\u7065\u7066\u7067\u7068\u7069\u706a\u706b\u706c\u706d\u706e\u706f\u7070\u7071\u7072\u7073\u7074\u7075\u7076\u7077\u7078\u7079\u707a\u707b\u707c\u707d\u707e\u707f\u7080\u7081\u7082\u7083\u7084\u7085\u7086\u7087\u7088\u7089\u708a\u708b\u708c\u708d\u708e\u708f\u7090\u7091\u7092\u7093\u7094\u7095\u7096\u7097\u7098\u7099\u709a\u709b\u709c\u709d\u709e\u709f\u70a0\u70a1\u70a2\u70a3\u70a4\u70a5\u70a6\u70a7\u70a8\u70a9\u70aa\u70ab\u70ac\u70ad\u70ae\u70af\u70b0\u70b1\u70b2\u70b3\u70b4\u70b5\u70b6\u70b7\u70b8\u70b9\u70ba\u70bb\u70bc\u70bd\u70be\u70bf\u70c0\u70c1\u70c2\u70c3\u70c4\u70c5\u70c6\u70c7\u70c8\u70c9\u70ca\u70cb\u70cc\u70cd\u70ce\u70cf\u70d0\u70d1\u70d2\u70d3\u70d4\u70d5\u70d6\u70d7\u70d8\u70d9\u70da\u70db\u70dc\u70dd\u70de\u70df\u70e0\u70e1\u70e2\u70e3\u70e4\u70e5\u70e6\u70e7\u70e8\u70e9\u70ea\u70eb\u70ec\u70ed\u70ee\u70ef\u70f0\u70f1\u70f2\u70f3\u70f4\u70f5\u70f6\u70f7\u70f8\u70f9\u70fa\u70fb\u70fc\u70fd\u70fe\u70ff\u7100\u7101\u7102\u7103\u7104\u7105\u7106\u7107\u7108\u7109\u710a\u710b\u710c\u710d\u710e\u710f\u7110\u7111\u7112\u7113\u7114\u7115\u7116\u7117\u7118\u7119\u711a\u711b\u711c\u711d\u711e\u711f\u7120\u7121\u7122\u7123\u7124\u7125\u7126\u7127\u7128\u7129\u712a\u712b\u712c\u712d\u712e\u712f\u7130\u7131\u7132\u7133\u7134\u7135\u7136\u7137\u7138\u7139\u713a\u713b\u713c\u713d\u713e\u713f\u7140\u7141\u7142\u7143\u7144\u7145\u7146\u7147\u7148\u7149\u714a\u714b\u714c\u714d\u714e\u714f\u7150\u7151\u7152\u7153\u7154\u7155\u7156\u7157\u7158\u7159\u715a\u715b\u715c\u715d\u715e\u715f\u7160\u7161\u7162\u7163\u7164\u7165\u7166\u7167\u7168\u7169\u716a\u716b\u716c\u716d\u716e\u716f\u7170\u7171\u7172\u7173\u7174\u7175\u7176\u7177\u7178\u7179\u717a\u717b\u717c\u717d\u717e\u717f\u7180\u7181\u7182\u7183\u7184\u7185\u7186\u7187\u7188\u7189\u718a\u718b\u718c\u718d\u718e\u718f\u7190\u7191\u7192\u7193\u7194\u7195\u7196\u7197\u7198\u7199\u719a\u719b\u719c\u719d\u719e\u719f\u71a0\u71a1\u71a2\u71a3\u71a4\u71a5\u71a6\u71a7\u71a8\u71a9\u71aa\u71ab\u71ac\u71ad\u71ae\u71af\u71b0\u71b1\u71b2\u71b3\u71b4\u71b5\u71b6\u71b7\u71b8\u71b9\u71ba\u71bb\u71bc\u71bd\u71be\u71bf\u71c0\u71c1\u71c2\u71c3\u71c4\u71c5\u71c6\u71c7\u71c8\u71c9\u71ca\u71cb\u71cc\u71cd\u71ce\u71cf\u71d0\u71d1\u71d2\u71d3\u71d4\u71d5\u71d6\u71d7\u71d8\u71d9\u71da\u71db\u71dc\u71dd\u71de\u71df\u71e0\u71e1\u71e2\u71e3\u71e4\u71e5\u71e6\u71e7\u71e8\u71e9\u71ea\u71eb\u71ec\u71ed\u71ee\u71ef\u71f0\u71f1\u71f2\u71f3\u71f4\u71f5\u71f6\u71f7\u71f8\u71f9\u71fa\u71fb\u71fc\u71fd\u71fe\u71ff\u7200\u7201\u7202\u7203\u7204\u7205\u7206\u7207\u7208\u7209\u720a\u720b\u720c\u720d\u720e\u720f\u7210\u7211\u7212\u7213\u7214\u7215\u7216\u7217\u7218\u7219\u721a\u721b\u721c\u721d\u721e\u721f\u7220\u7221\u7222\u7223\u7224\u7225\u7226\u7227\u7228\u7229\u722a\u722b\u722c\u722d\u722e\u722f\u7230\u7231\u7232\u7233\u7234\u7235\u7236\u7237\u7238\u7239\u723a\u723b\u723c\u723d\u723e\u723f\u7240\u7241\u7242\u7243\u7244\u7245\u7246\u7247\u7248\u7249\u724a\u724b\u724c\u724d\u724e\u724f\u7250\u7251\u7252\u7253\u7254\u7255\u7256\u7257\u7258\u7259\u725a\u725b\u725c\u725d\u725e\u725f\u7260\u7261\u7262\u7263\u7264\u7265\u7266\u7267\u7268\u7269\u726a\u726b\u726c\u726d\u726e\u726f\u7270\u7271\u7272\u7273\u7274\u7275\u7276\u7277\u7278\u7279\u727a\u727b\u727c\u727d\u727e\u727f\u7280\u7281\u7282\u7283\u7284\u7285\u7286\u7287\u7288\u7289\u728a\u728b\u728c\u728d\u728e\u728f\u7290\u7291\u7292\u7293\u7294\u7295\u7296\u7297\u7298\u7299\u729a\u729b\u729c\u729d\u729e\u729f\u72a0\u72a1\u72a2\u72a3\u72a4\u72a5\u72a6\u72a7\u72a8\u72a9\u72aa\u72ab\u72ac\u72ad\u72ae\u72af\u72b0\u72b1\u72b2\u72b3\u72b4\u72b5\u72b6\u72b7\u72b8\u72b9\u72ba\u72bb\u72bc\u72bd\u72be\u72bf\u72c0\u72c1\u72c2\u72c3\u72c4\u72c5\u72c6\u72c7\u72c8\u72c9\u72ca\u72cb\u72cc\u72cd\u72ce\u72cf\u72d0\u72d1\u72d2\u72d3\u72d4\u72d5\u72d6\u72d7\u72d8\u72d9\u72da\u72db\u72dc\u72dd\u72de\u72df\u72e0\u72e1\u72e2\u72e3\u72e4\u72e5\u72e6\u72e7\u72e8\u72e9\u72ea\u72eb\u72ec\u72ed\u72ee\u72ef\u72f0\u72f1\u72f2\u72f3\u72f4\u72f5\u72f6\u72f7\u72f8\u72f9\u72fa\u72fb\u72fc\u72fd\u72fe\u72ff\u7300\u7301\u7302\u7303\u7304\u7305\u7306\u7307\u7308\u7309\u730a\u730b\u730c\u730d\u730e\u730f\u7310\u7311\u7312\u7313\u7314\u7315\u7316\u7317\u7318\u7319\u731a\u731b\u731c\u731d\u731e\u731f\u7320\u7321\u7322\u7323\u7324\u7325\u7326\u7327\u7328\u7329\u732a\u732b\u732c\u732d\u732e\u732f\u7330\u7331\u7332\u7333\u7334\u7335\u7336\u7337\u7338\u7339\u733a\u733b\u733c\u733d\u733e\u733f\u7340\u7341\u7342\u7343\u7344\u7345\u7346\u7347\u7348\u7349\u734a\u734b\u734c\u734d\u734e\u734f\u7350\u7351\u7352\u7353\u7354\u7355\u7356\u7357\u7358\u7359\u735a\u735b\u735c\u735d\u735e\u735f\u7360\u7361\u7362\u7363\u7364\u7365\u7366\u7367\u7368\u7369\u736a\u736b\u736c\u736d\u736e\u736f\u7370\u7371\u7372\u7373\u7374\u7375\u7376\u7377\u7378\u7379\u737a\u737b\u737c\u737d\u737e\u737f\u7380\u7381\u7382\u7383\u7384\u7385\u7386\u7387\u7388\u7389\u738a\u738b\u738c\u738d\u738e\u738f\u7390\u7391\u7392\u7393\u7394\u7395\u7396\u7397\u7398\u7399\u739a\u739b\u739c\u739d\u739e\u739f\u73a0\u73a1\u73a2\u73a3\u73a4\u73a5\u73a6\u73a7\u73a8\u73a9\u73aa\u73ab\u73ac\u73ad\u73ae\u73af\u73b0\u73b1\u73b2\u73b3\u73b4\u73b5\u73b6\u73b7\u73b8\u73b9\u73ba\u73bb\u73bc\u73bd\u73be\u73bf\u73c0\u73c1\u73c2\u73c3\u73c4\u73c5\u73c6\u73c7\u73c8\u73c9\u73ca\u73cb\u73cc\u73cd\u73ce\u73cf\u73d0\u73d1\u73d2\u73d3\u73d4\u73d5\u73d6\u73d7\u73d8\u73d9\u73da\u73db\u73dc\u73dd\u73de\u73df\u73e0\u73e1\u73e2\u73e3\u73e4\u73e5\u73e6\u73e7\u73e8\u73e9\u73ea\u73eb\u73ec\u73ed\u73ee\u73ef\u73f0\u73f1\u73f2\u73f3\u73f4\u73f5\u73f6\u73f7\u73f8\u73f9\u73fa\u73fb\u73fc\u73fd\u73fe\u73ff\u7400\u7401\u7402\u7403\u7404\u7405\u7406\u7407\u7408\u7409\u740a\u740b\u740c\u740d\u740e\u740f\u7410\u7411\u7412\u7413\u7414\u7415\u7416\u7417\u7418\u7419\u741a\u741b\u741c\u741d\u741e\u741f\u7420\u7421\u7422\u7423\u7424\u7425\u7426\u7427\u7428\u7429\u742a\u742b\u742c\u742d\u742e\u742f\u7430\u7431\u7432\u7433\u7434\u7435\u7436\u7437\u7438\u7439\u743a\u743b\u743c\u743d\u743e\u743f\u7440\u7441\u7442\u7443\u7444\u7445\u7446\u7447\u7448\u7449\u744a\u744b\u744c\u744d\u744e\u744f\u7450\u7451\u7452\u7453\u7454\u7455\u7456\u7457\u7458\u7459\u745a\u745b\u745c\u745d\u745e\u745f\u7460\u7461\u7462\u7463\u7464\u7465\u7466\u7467\u7468\u7469\u746a\u746b\u746c\u746d\u746e\u746f\u7470\u7471\u7472\u7473\u7474\u7475\u7476\u7477\u7478\u7479\u747a\u747b\u747c\u747d\u747e\u747f\u7480\u7481\u7482\u7483\u7484\u7485\u7486\u7487\u7488\u7489\u748a\u748b\u748c\u748d\u748e\u748f\u7490\u7491\u7492\u7493\u7494\u7495\u7496\u7497\u7498\u7499\u749a\u749b\u749c\u749d\u749e\u749f\u74a0\u74a1\u74a2\u74a3\u74a4\u74a5\u74a6\u74a7\u74a8\u74a9\u74aa\u74ab\u74ac\u74ad\u74ae\u74af\u74b0\u74b1\u74b2\u74b3\u74b4\u74b5\u74b6\u74b7\u74b8\u74b9\u74ba\u74bb\u74bc\u74bd\u74be\u74bf\u74c0\u74c1\u74c2\u74c3\u74c4\u74c5\u74c6\u74c7\u74c8\u74c9\u74ca\u74cb\u74cc\u74cd\u74ce\u74cf\u74d0\u74d1\u74d2\u74d3\u74d4\u74d5\u74d6\u74d7\u74d8\u74d9\u74da\u74db\u74dc\u74dd\u74de\u74df\u74e0\u74e1\u74e2\u74e3\u74e4\u74e5\u74e6\u74e7\u74e8\u74e9\u74ea\u74eb\u74ec\u74ed\u74ee\u74ef\u74f0\u74f1\u74f2\u74f3\u74f4\u74f5\u74f6\u74f7\u74f8\u74f9\u74fa\u74fb\u74fc\u74fd\u74fe\u74ff\u7500\u7501\u7502\u7503\u7504\u7505\u7506\u7507\u7508\u7509\u750a\u750b\u750c\u750d\u750e\u750f\u7510\u7511\u7512\u7513\u7514\u7515\u7516\u7517\u7518\u7519\u751a\u751b\u751c\u751d\u751e\u751f\u7520\u7521\u7522\u7523\u7524\u7525\u7526\u7527\u7528\u7529\u752a\u752b\u752c\u752d\u752e\u752f\u7530\u7531\u7532\u7533\u7534\u7535\u7536\u7537\u7538\u7539\u753a\u753b\u753c\u753d\u753e\u753f\u7540\u7541\u7542\u7543\u7544\u7545\u7546\u7547\u7548\u7549\u754a\u754b\u754c\u754d\u754e\u754f\u7550\u7551\u7552\u7553\u7554\u7555\u7556\u7557\u7558\u7559\u755a\u755b\u755c\u755d\u755e\u755f\u7560\u7561\u7562\u7563\u7564\u7565\u7566\u7567\u7568\u7569\u756a\u756b\u756c\u756d\u756e\u756f\u7570\u7571\u7572\u7573\u7574\u7575\u7576\u7577\u7578\u7579\u757a\u757b\u757c\u757d\u757e\u757f\u7580\u7581\u7582\u7583\u7584\u7585\u7586\u7587\u7588\u7589\u758a\u758b\u758c\u758d\u758e\u758f\u7590\u7591\u7592\u7593\u7594\u7595\u7596\u7597\u7598\u7599\u759a\u759b\u759c\u759d\u759e\u759f\u75a0\u75a1\u75a2\u75a3\u75a4\u75a5\u75a6\u75a7\u75a8\u75a9\u75aa\u75ab\u75ac\u75ad\u75ae\u75af\u75b0\u75b1\u75b2\u75b3\u75b4\u75b5\u75b6\u75b7\u75b8\u75b9\u75ba\u75bb\u75bc\u75bd\u75be\u75bf\u75c0\u75c1\u75c2\u75c3\u75c4\u75c5\u75c6\u75c7\u75c8\u75c9\u75ca\u75cb\u75cc\u75cd\u75ce\u75cf\u75d0\u75d1\u75d2\u75d3\u75d4\u75d5\u75d6\u75d7\u75d8\u75d9\u75da\u75db\u75dc\u75dd\u75de\u75df\u75e0\u75e1\u75e2\u75e3\u75e4\u75e5\u75e6\u75e7\u75e8\u75e9\u75ea\u75eb\u75ec\u75ed\u75ee\u75ef\u75f0\u75f1\u75f2\u75f3\u75f4\u75f5\u75f6\u75f7\u75f8\u75f9\u75fa\u75fb\u75fc\u75fd\u75fe\u75ff\u7600\u7601\u7602\u7603\u7604\u7605\u7606\u7607\u7608\u7609\u760a\u760b\u760c\u760d\u760e\u760f\u7610\u7611\u7612\u7613\u7614\u7615\u7616\u7617\u7618\u7619\u761a\u761b\u761c\u761d\u761e\u761f\u7620\u7621\u7622\u7623\u7624\u7625\u7626\u7627\u7628\u7629\u762a\u762b\u762c\u762d\u762e\u762f\u7630\u7631\u7632\u7633\u7634\u7635\u7636\u7637\u7638\u7639\u763a\u763b\u763c\u763d\u763e\u763f\u7640\u7641\u7642\u7643\u7644\u7645\u7646\u7647\u7648\u7649\u764a\u764b\u764c\u764d\u764e\u764f\u7650\u7651\u7652\u7653\u7654\u7655\u7656\u7657\u7658\u7659\u765a\u765b\u765c\u765d\u765e\u765f\u7660\u7661\u7662\u7663\u7664\u7665\u7666\u7667\u7668\u7669\u766a\u766b\u766c\u766d\u766e\u766f\u7670\u7671\u7672\u7673\u7674\u7675\u7676\u7677\u7678\u7679\u767a\u767b\u767c\u767d\u767e\u767f\u7680\u7681\u7682\u7683\u7684\u7685\u7686\u7687\u7688\u7689\u768a\u768b\u768c\u768d\u768e\u768f\u7690\u7691\u7692\u7693\u7694\u7695\u7696\u7697\u7698\u7699\u769a\u769b\u769c\u769d\u769e\u769f\u76a0\u76a1\u76a2\u76a3\u76a4\u76a5\u76a6\u76a7\u76a8\u76a9\u76aa\u76ab\u76ac\u76ad\u76ae\u76af\u76b0\u76b1\u76b2\u76b3\u76b4\u76b5\u76b6\u76b7\u76b8\u76b9\u76ba\u76bb\u76bc\u76bd\u76be\u76bf\u76c0\u76c1\u76c2\u76c3\u76c4\u76c5\u76c6\u76c7\u76c8\u76c9\u76ca\u76cb\u76cc\u76cd\u76ce\u76cf\u76d0\u76d1\u76d2\u76d3\u76d4\u76d5\u76d6\u76d7\u76d8\u76d9\u76da\u76db\u76dc\u76dd\u76de\u76df\u76e0\u76e1\u76e2\u76e3\u76e4\u76e5\u76e6\u76e7\u76e8\u76e9\u76ea\u76eb\u76ec\u76ed\u76ee\u76ef\u76f0\u76f1\u76f2\u76f3\u76f4\u76f5\u76f6\u76f7\u76f8\u76f9\u76fa\u76fb\u76fc\u76fd\u76fe\u76ff\u7700\u7701\u7702\u7703\u7704\u7705\u7706\u7707\u7708\u7709\u770a\u770b\u770c\u770d\u770e\u770f\u7710\u7711\u7712\u7713\u7714\u7715\u7716\u7717\u7718\u7719\u771a\u771b\u771c\u771d\u771e\u771f\u7720\u7721\u7722\u7723\u7724\u7725\u7726\u7727\u7728\u7729\u772a\u772b\u772c\u772d\u772e\u772f\u7730\u7731\u7732\u7733\u7734\u7735\u7736\u7737\u7738\u7739\u773a\u773b\u773c\u773d\u773e\u773f\u7740\u7741\u7742\u7743\u7744\u7745\u7746\u7747\u7748\u7749\u774a\u774b\u774c\u774d\u774e\u774f\u7750\u7751\u7752\u7753\u7754\u7755\u7756\u7757\u7758\u7759\u775a\u775b\u775c\u775d\u775e\u775f\u7760\u7761\u7762\u7763\u7764\u7765\u7766\u7767\u7768\u7769\u776a\u776b\u776c\u776d\u776e\u776f\u7770\u7771\u7772\u7773\u7774\u7775\u7776\u7777\u7778\u7779\u777a\u777b\u777c\u777d\u777e\u777f\u7780\u7781\u7782\u7783\u7784\u7785\u7786\u7787\u7788\u7789\u778a\u778b\u778c\u778d\u778e\u778f\u7790\u7791\u7792\u7793\u7794\u7795\u7796\u7797\u7798\u7799\u779a\u779b\u779c\u779d\u779e\u779f\u77a0\u77a1\u77a2\u77a3\u77a4\u77a5\u77a6\u77a7\u77a8\u77a9\u77aa\u77ab\u77ac\u77ad\u77ae\u77af\u77b0\u77b1\u77b2\u77b3\u77b4\u77b5\u77b6\u77b7\u77b8\u77b9\u77ba\u77bb\u77bc\u77bd\u77be\u77bf\u77c0\u77c1\u77c2\u77c3\u77c4\u77c5\u77c6\u77c7\u77c8\u77c9\u77ca\u77cb\u77cc\u77cd\u77ce\u77cf\u77d0\u77d1\u77d2\u77d3\u77d4\u77d5\u77d6\u77d7\u77d8\u77d9\u77da\u77db\u77dc\u77dd\u77de\u77df\u77e0\u77e1\u77e2\u77e3\u77e4\u77e5\u77e6\u77e7\u77e8\u77e9\u77ea\u77eb\u77ec\u77ed\u77ee\u77ef\u77f0\u77f1\u77f2\u77f3\u77f4\u77f5\u77f6\u77f7\u77f8\u77f9\u77fa\u77fb\u77fc\u77fd\u77fe\u77ff\u7800\u7801\u7802\u7803\u7804\u7805\u7806\u7807\u7808\u7809\u780a\u780b\u780c\u780d\u780e\u780f\u7810\u7811\u7812\u7813\u7814\u7815\u7816\u7817\u7818\u7819\u781a\u781b\u781c\u781d\u781e\u781f\u7820\u7821\u7822\u7823\u7824\u7825\u7826\u7827\u7828\u7829\u782a\u782b\u782c\u782d\u782e\u782f\u7830\u7831\u7832\u7833\u7834\u7835\u7836\u7837\u7838\u7839\u783a\u783b\u783c\u783d\u783e\u783f\u7840\u7841\u7842\u7843\u7844\u7845\u7846\u7847\u7848\u7849\u784a\u784b\u784c\u784d\u784e\u784f\u7850\u7851\u7852\u7853\u7854\u7855\u7856\u7857\u7858\u7859\u785a\u785b\u785c\u785d\u785e\u785f\u7860\u7861\u7862\u7863\u7864\u7865\u7866\u7867\u7868\u7869\u786a\u786b\u786c\u786d\u786e\u786f\u7870\u7871\u7872\u7873\u7874\u7875\u7876\u7877\u7878\u7879\u787a\u787b\u787c\u787d\u787e\u787f\u7880\u7881\u7882\u7883\u7884\u7885\u7886\u7887\u7888\u7889\u788a\u788b\u788c\u788d\u788e\u788f\u7890\u7891\u7892\u7893\u7894\u7895\u7896\u7897\u7898\u7899\u789a\u789b\u789c\u789d\u789e\u789f\u78a0\u78a1\u78a2\u78a3\u78a4\u78a5\u78a6\u78a7\u78a8\u78a9\u78aa\u78ab\u78ac\u78ad\u78ae\u78af\u78b0\u78b1\u78b2\u78b3\u78b4\u78b5\u78b6\u78b7\u78b8\u78b9\u78ba\u78bb\u78bc\u78bd\u78be\u78bf\u78c0\u78c1\u78c2\u78c3\u78c4\u78c5\u78c6\u78c7\u78c8\u78c9\u78ca\u78cb\u78cc\u78cd\u78ce\u78cf\u78d0\u78d1\u78d2\u78d3\u78d4\u78d5\u78d6\u78d7\u78d8\u78d9\u78da\u78db\u78dc\u78dd\u78de\u78df\u78e0\u78e1\u78e2\u78e3\u78e4\u78e5\u78e6\u78e7\u78e8\u78e9\u78ea\u78eb\u78ec\u78ed\u78ee\u78ef\u78f0\u78f1\u78f2\u78f3\u78f4\u78f5\u78f6\u78f7\u78f8\u78f9\u78fa\u78fb\u78fc\u78fd\u78fe\u78ff\u7900\u7901\u7902\u7903\u7904\u7905\u7906\u7907\u7908\u7909\u790a\u790b\u790c\u790d\u790e\u790f\u7910\u7911\u7912\u7913\u7914\u7915\u7916\u7917\u7918\u7919\u791a\u791b\u791c\u791d\u791e\u791f\u7920\u7921\u7922\u7923\u7924\u7925\u7926\u7927\u7928\u7929\u792a\u792b\u792c\u792d\u792e\u792f\u7930\u7931\u7932\u7933\u7934\u7935\u7936\u7937\u7938\u7939\u793a\u793b\u793c\u793d\u793e\u793f\u7940\u7941\u7942\u7943\u7944\u7945\u7946\u7947\u7948\u7949\u794a\u794b\u794c\u794d\u794e\u794f\u7950\u7951\u7952\u7953\u7954\u7955\u7956\u7957\u7958\u7959\u795a\u795b\u795c\u795d\u795e\u795f\u7960\u7961\u7962\u7963\u7964\u7965\u7966\u7967\u7968\u7969\u796a\u796b\u796c\u796d\u796e\u796f\u7970\u7971\u7972\u7973\u7974\u7975\u7976\u7977\u7978\u7979\u797a\u797b\u797c\u797d\u797e\u797f\u7980\u7981\u7982\u7983\u7984\u7985\u7986\u7987\u7988\u7989\u798a\u798b\u798c\u798d\u798e\u798f\u7990\u7991\u7992\u7993\u7994\u7995\u7996\u7997\u7998\u7999\u799a\u799b\u799c\u799d\u799e\u799f\u79a0\u79a1\u79a2\u79a3\u79a4\u79a5\u79a6\u79a7\u79a8\u79a9\u79aa\u79ab\u79ac\u79ad\u79ae\u79af\u79b0\u79b1\u79b2\u79b3\u79b4\u79b5\u79b6\u79b7\u79b8\u79b9\u79ba\u79bb\u79bc\u79bd\u79be\u79bf\u79c0\u79c1\u79c2\u79c3\u79c4\u79c5\u79c6\u79c7\u79c8\u79c9\u79ca\u79cb\u79cc\u79cd\u79ce\u79cf\u79d0\u79d1\u79d2\u79d3\u79d4\u79d5\u79d6\u79d7\u79d8\u79d9\u79da\u79db\u79dc\u79dd\u79de\u79df\u79e0\u79e1\u79e2\u79e3\u79e4\u79e5\u79e6\u79e7\u79e8\u79e9\u79ea\u79eb\u79ec\u79ed\u79ee\u79ef\u79f0\u79f1\u79f2\u79f3\u79f4\u79f5\u79f6\u79f7\u79f8\u79f9\u79fa\u79fb\u79fc\u79fd\u79fe\u79ff\u7a00\u7a01\u7a02\u7a03\u7a04\u7a05\u7a06\u7a07\u7a08\u7a09\u7a0a\u7a0b\u7a0c\u7a0d\u7a0e\u7a0f\u7a10\u7a11\u7a12\u7a13\u7a14\u7a15\u7a16\u7a17\u7a18\u7a19\u7a1a\u7a1b\u7a1c\u7a1d\u7a1e\u7a1f\u7a20\u7a21\u7a22\u7a23\u7a24\u7a25\u7a26\u7a27\u7a28\u7a29\u7a2a\u7a2b\u7a2c\u7a2d\u7a2e\u7a2f\u7a30\u7a31\u7a32\u7a33\u7a34\u7a35\u7a36\u7a37\u7a38\u7a39\u7a3a\u7a3b\u7a3c\u7a3d\u7a3e\u7a3f\u7a40\u7a41\u7a42\u7a43\u7a44\u7a45\u7a46\u7a47\u7a48\u7a49\u7a4a\u7a4b\u7a4c\u7a4d\u7a4e\u7a4f\u7a50\u7a51\u7a52\u7a53\u7a54\u7a55\u7a56\u7a57\u7a58\u7a59\u7a5a\u7a5b\u7a5c\u7a5d\u7a5e\u7a5f\u7a60\u7a61\u7a62\u7a63\u7a64\u7a65\u7a66\u7a67\u7a68\u7a69\u7a6a\u7a6b\u7a6c\u7a6d\u7a6e\u7a6f\u7a70\u7a71\u7a72\u7a73\u7a74\u7a75\u7a76\u7a77\u7a78\u7a79\u7a7a\u7a7b\u7a7c\u7a7d\u7a7e\u7a7f\u7a80\u7a81\u7a82\u7a83\u7a84\u7a85\u7a86\u7a87\u7a88\u7a89\u7a8a\u7a8b\u7a8c\u7a8d\u7a8e\u7a8f\u7a90\u7a91\u7a92\u7a93\u7a94\u7a95\u7a96\u7a97\u7a98\u7a99\u7a9a\u7a9b\u7a9c\u7a9d\u7a9e\u7a9f\u7aa0\u7aa1\u7aa2\u7aa3\u7aa4\u7aa5\u7aa6\u7aa7\u7aa8\u7aa9\u7aaa\u7aab\u7aac\u7aad\u7aae\u7aaf\u7ab0\u7ab1\u7ab2\u7ab3\u7ab4\u7ab5\u7ab6\u7ab7\u7ab8\u7ab9\u7aba\u7abb\u7abc\u7abd\u7abe\u7abf\u7ac0\u7ac1\u7ac2\u7ac3\u7ac4\u7ac5\u7ac6\u7ac7\u7ac8\u7ac9\u7aca\u7acb\u7acc\u7acd\u7ace\u7acf\u7ad0\u7ad1\u7ad2\u7ad3\u7ad4\u7ad5\u7ad6\u7ad7\u7ad8\u7ad9\u7ada\u7adb\u7adc\u7add\u7ade\u7adf\u7ae0\u7ae1\u7ae2\u7ae3\u7ae4\u7ae5\u7ae6\u7ae7\u7ae8\u7ae9\u7aea\u7aeb\u7aec\u7aed\u7aee\u7aef\u7af0\u7af1\u7af2\u7af3\u7af4\u7af5\u7af6\u7af7\u7af8\u7af9\u7afa\u7afb\u7afc\u7afd\u7afe\u7aff\u7b00\u7b01\u7b02\u7b03\u7b04\u7b05\u7b06\u7b07\u7b08\u7b09\u7b0a\u7b0b\u7b0c\u7b0d\u7b0e\u7b0f\u7b10\u7b11\u7b12\u7b13\u7b14\u7b15\u7b16\u7b17\u7b18\u7b19\u7b1a\u7b1b\u7b1c\u7b1d\u7b1e\u7b1f\u7b20\u7b21\u7b22\u7b23\u7b24\u7b25\u7b26\u7b27\u7b28\u7b29\u7b2a\u7b2b\u7b2c\u7b2d\u7b2e\u7b2f\u7b30\u7b31\u7b32\u7b33\u7b34\u7b35\u7b36\u7b37\u7b38\u7b39\u7b3a\u7b3b\u7b3c\u7b3d\u7b3e\u7b3f\u7b40\u7b41\u7b42\u7b43\u7b44\u7b45\u7b46\u7b47\u7b48\u7b49\u7b4a\u7b4b\u7b4c\u7b4d\u7b4e\u7b4f\u7b50\u7b51\u7b52\u7b53\u7b54\u7b55\u7b56\u7b57\u7b58\u7b59\u7b5a\u7b5b\u7b5c\u7b5d\u7b5e\u7b5f\u7b60\u7b61\u7b62\u7b63\u7b64\u7b65\u7b66\u7b67\u7b68\u7b69\u7b6a\u7b6b\u7b6c\u7b6d\u7b6e\u7b6f\u7b70\u7b71\u7b72\u7b73\u7b74\u7b75\u7b76\u7b77\u7b78\u7b79\u7b7a\u7b7b\u7b7c\u7b7d\u7b7e\u7b7f\u7b80\u7b81\u7b82\u7b83\u7b84\u7b85\u7b86\u7b87\u7b88\u7b89\u7b8a\u7b8b\u7b8c\u7b8d\u7b8e\u7b8f\u7b90\u7b91\u7b92\u7b93\u7b94\u7b95\u7b96\u7b97\u7b98\u7b99\u7b9a\u7b9b\u7b9c\u7b9d\u7b9e\u7b9f\u7ba0\u7ba1\u7ba2\u7ba3\u7ba4\u7ba5\u7ba6\u7ba7\u7ba8\u7ba9\u7baa\u7bab\u7bac\u7bad\u7bae\u7baf\u7bb0\u7bb1\u7bb2\u7bb3\u7bb4\u7bb5\u7bb6\u7bb7\u7bb8\u7bb9\u7bba\u7bbb\u7bbc\u7bbd\u7bbe\u7bbf\u7bc0\u7bc1\u7bc2\u7bc3\u7bc4\u7bc5\u7bc6\u7bc7\u7bc8\u7bc9\u7bca\u7bcb\u7bcc\u7bcd\u7bce\u7bcf\u7bd0\u7bd1\u7bd2\u7bd3\u7bd4\u7bd5\u7bd6\u7bd7\u7bd8\u7bd9\u7bda\u7bdb\u7bdc\u7bdd\u7bde\u7bdf\u7be0\u7be1\u7be2\u7be3\u7be4\u7be5\u7be6\u7be7\u7be8\u7be9\u7bea\u7beb\u7bec\u7bed\u7bee\u7bef\u7bf0\u7bf1\u7bf2\u7bf3\u7bf4\u7bf5\u7bf6\u7bf7\u7bf8\u7bf9\u7bfa\u7bfb\u7bfc\u7bfd\u7bfe\u7bff\u7c00\u7c01\u7c02\u7c03\u7c04\u7c05\u7c06\u7c07\u7c08\u7c09\u7c0a\u7c0b\u7c0c\u7c0d\u7c0e\u7c0f\u7c10\u7c11\u7c12\u7c13\u7c14\u7c15\u7c16\u7c17\u7c18\u7c19\u7c1a\u7c1b\u7c1c\u7c1d\u7c1e\u7c1f\u7c20\u7c21\u7c22\u7c23\u7c24\u7c25\u7c26\u7c27\u7c28\u7c29\u7c2a\u7c2b\u7c2c\u7c2d\u7c2e\u7c2f\u7c30\u7c31\u7c32\u7c33\u7c34\u7c35\u7c36\u7c37\u7c38\u7c39\u7c3a\u7c3b\u7c3c\u7c3d\u7c3e\u7c3f\u7c40\u7c41\u7c42\u7c43\u7c44\u7c45\u7c46\u7c47\u7c48\u7c49\u7c4a\u7c4b\u7c4c\u7c4d\u7c4e\u7c4f\u7c50\u7c51\u7c52\u7c53\u7c54\u7c55\u7c56\u7c57\u7c58\u7c59\u7c5a\u7c5b\u7c5c\u7c5d\u7c5e\u7c5f\u7c60\u7c61\u7c62\u7c63\u7c64\u7c65\u7c66\u7c67\u7c68\u7c69\u7c6a\u7c6b\u7c6c\u7c6d\u7c6e\u7c6f\u7c70\u7c71\u7c72\u7c73\u7c74\u7c75\u7c76\u7c77\u7c78\u7c79\u7c7a\u7c7b\u7c7c\u7c7d\u7c7e\u7c7f\u7c80\u7c81\u7c82\u7c83\u7c84\u7c85\u7c86\u7c87\u7c88\u7c89\u7c8a\u7c8b\u7c8c\u7c8d\u7c8e\u7c8f\u7c90\u7c91\u7c92\u7c93\u7c94\u7c95\u7c96\u7c97\u7c98\u7c99\u7c9a\u7c9b\u7c9c\u7c9d\u7c9e\u7c9f\u7ca0\u7ca1\u7ca2\u7ca3\u7ca4\u7ca5\u7ca6\u7ca7\u7ca8\u7ca9\u7caa\u7cab\u7cac\u7cad\u7cae\u7caf\u7cb0\u7cb1\u7cb2\u7cb3\u7cb4\u7cb5\u7cb6\u7cb7\u7cb8\u7cb9\u7cba\u7cbb\u7cbc\u7cbd\u7cbe\u7cbf\u7cc0\u7cc1\u7cc2\u7cc3\u7cc4\u7cc5\u7cc6\u7cc7\u7cc8\u7cc9\u7cca\u7ccb\u7ccc\u7ccd\u7cce\u7ccf\u7cd0\u7cd1\u7cd2\u7cd3\u7cd4\u7cd5\u7cd6\u7cd7\u7cd8\u7cd9\u7cda\u7cdb\u7cdc\u7cdd\u7cde\u7cdf\u7ce0\u7ce1\u7ce2\u7ce3\u7ce4\u7ce5\u7ce6\u7ce7\u7ce8\u7ce9\u7cea\u7ceb\u7cec\u7ced\u7cee\u7cef\u7cf0\u7cf1\u7cf2\u7cf3\u7cf4\u7cf5\u7cf6\u7cf7\u7cf8\u7cf9\u7cfa\u7cfb\u7cfc\u7cfd\u7cfe\u7cff\u7d00\u7d01\u7d02\u7d03\u7d04\u7d05\u7d06\u7d07\u7d08\u7d09\u7d0a\u7d0b\u7d0c\u7d0d\u7d0e\u7d0f\u7d10\u7d11\u7d12\u7d13\u7d14\u7d15\u7d16\u7d17\u7d18\u7d19\u7d1a\u7d1b\u7d1c\u7d1d\u7d1e\u7d1f\u7d20\u7d21\u7d22\u7d23\u7d24\u7d25\u7d26\u7d27\u7d28\u7d29\u7d2a\u7d2b\u7d2c\u7d2d\u7d2e\u7d2f\u7d30\u7d31\u7d32\u7d33\u7d34\u7d35\u7d36\u7d37\u7d38\u7d39\u7d3a\u7d3b\u7d3c\u7d3d\u7d3e\u7d3f\u7d40\u7d41\u7d42\u7d43\u7d44\u7d45\u7d46\u7d47\u7d48\u7d49\u7d4a\u7d4b\u7d4c\u7d4d\u7d4e\u7d4f\u7d50\u7d51\u7d52\u7d53\u7d54\u7d55\u7d56\u7d57\u7d58\u7d59\u7d5a\u7d5b\u7d5c\u7d5d\u7d5e\u7d5f\u7d60\u7d61\u7d62\u7d63\u7d64\u7d65\u7d66\u7d67\u7d68\u7d69\u7d6a\u7d6b\u7d6c\u7d6d\u7d6e\u7d6f\u7d70\u7d71\u7d72\u7d73\u7d74\u7d75\u7d76\u7d77\u7d78\u7d79\u7d7a\u7d7b\u7d7c\u7d7d\u7d7e\u7d7f\u7d80\u7d81\u7d82\u7d83\u7d84\u7d85\u7d86\u7d87\u7d88\u7d89\u7d8a\u7d8b\u7d8c\u7d8d\u7d8e\u7d8f\u7d90\u7d91\u7d92\u7d93\u7d94\u7d95\u7d96\u7d97\u7d98\u7d99\u7d9a\u7d9b\u7d9c\u7d9d\u7d9e\u7d9f\u7da0\u7da1\u7da2\u7da3\u7da4\u7da5\u7da6\u7da7\u7da8\u7da9\u7daa\u7dab\u7dac\u7dad\u7dae\u7daf\u7db0\u7db1\u7db2\u7db3\u7db4\u7db5\u7db6\u7db7\u7db8\u7db9\u7dba\u7dbb\u7dbc\u7dbd\u7dbe\u7dbf\u7dc0\u7dc1\u7dc2\u7dc3\u7dc4\u7dc5\u7dc6\u7dc7\u7dc8\u7dc9\u7dca\u7dcb\u7dcc\u7dcd\u7dce\u7dcf\u7dd0\u7dd1\u7dd2\u7dd3\u7dd4\u7dd5\u7dd6\u7dd7\u7dd8\u7dd9\u7dda\u7ddb\u7ddc\u7ddd\u7dde\u7ddf\u7de0\u7de1\u7de2\u7de3\u7de4\u7de5\u7de6\u7de7\u7de8\u7de9\u7dea\u7deb\u7dec\u7ded\u7dee\u7def\u7df0\u7df1\u7df2\u7df3\u7df4\u7df5\u7df6\u7df7\u7df8\u7df9\u7dfa\u7dfb\u7dfc\u7dfd\u7dfe\u7dff\u7e00\u7e01\u7e02\u7e03\u7e04\u7e05\u7e06\u7e07\u7e08\u7e09\u7e0a\u7e0b\u7e0c\u7e0d\u7e0e\u7e0f\u7e10\u7e11\u7e12\u7e13\u7e14\u7e15\u7e16\u7e17\u7e18\u7e19\u7e1a\u7e1b\u7e1c\u7e1d\u7e1e\u7e1f\u7e20\u7e21\u7e22\u7e23\u7e24\u7e25\u7e26\u7e27\u7e28\u7e29\u7e2a\u7e2b\u7e2c\u7e2d\u7e2e\u7e2f\u7e30\u7e31\u7e32\u7e33\u7e34\u7e35\u7e36\u7e37\u7e38\u7e39\u7e3a\u7e3b\u7e3c\u7e3d\u7e3e\u7e3f\u7e40\u7e41\u7e42\u7e43\u7e44\u7e45\u7e46\u7e47\u7e48\u7e49\u7e4a\u7e4b\u7e4c\u7e4d\u7e4e\u7e4f\u7e50\u7e51\u7e52\u7e53\u7e54\u7e55\u7e56\u7e57\u7e58\u7e59\u7e5a\u7e5b\u7e5c\u7e5d\u7e5e\u7e5f\u7e60\u7e61\u7e62\u7e63\u7e64\u7e65\u7e66\u7e67\u7e68\u7e69\u7e6a\u7e6b\u7e6c\u7e6d\u7e6e\u7e6f\u7e70\u7e71\u7e72\u7e73\u7e74\u7e75\u7e76\u7e77\u7e78\u7e79\u7e7a\u7e7b\u7e7c\u7e7d\u7e7e\u7e7f\u7e80\u7e81\u7e82\u7e83\u7e84\u7e85\u7e86\u7e87\u7e88\u7e89\u7e8a\u7e8b\u7e8c\u7e8d\u7e8e\u7e8f\u7e90\u7e91\u7e92\u7e93\u7e94\u7e95\u7e96\u7e97\u7e98\u7e99\u7e9a\u7e9b\u7e9c\u7e9d\u7e9e\u7e9f\u7ea0\u7ea1\u7ea2\u7ea3\u7ea4\u7ea5\u7ea6\u7ea7\u7ea8\u7ea9\u7eaa\u7eab\u7eac\u7ead\u7eae\u7eaf\u7eb0\u7eb1\u7eb2\u7eb3\u7eb4\u7eb5\u7eb6\u7eb7\u7eb8\u7eb9\u7eba\u7ebb\u7ebc\u7ebd\u7ebe\u7ebf\u7ec0\u7ec1\u7ec2\u7ec3\u7ec4\u7ec5\u7ec6\u7ec7\u7ec8\u7ec9\u7eca\u7ecb\u7ecc\u7ecd\u7ece\u7ecf\u7ed0\u7ed1\u7ed2\u7ed3\u7ed4\u7ed5\u7ed6\u7ed7\u7ed8\u7ed9\u7eda\u7edb\u7edc\u7edd\u7ede\u7edf\u7ee0\u7ee1\u7ee2\u7ee3\u7ee4\u7ee5\u7ee6\u7ee7\u7ee8\u7ee9\u7eea\u7eeb\u7eec\u7eed\u7eee\u7eef\u7ef0\u7ef1\u7ef2\u7ef3\u7ef4\u7ef5\u7ef6\u7ef7\u7ef8\u7ef9\u7efa\u7efb\u7efc\u7efd\u7efe\u7eff\u7f00\u7f01\u7f02\u7f03\u7f04\u7f05\u7f06\u7f07\u7f08\u7f09\u7f0a\u7f0b\u7f0c\u7f0d\u7f0e\u7f0f\u7f10\u7f11\u7f12\u7f13\u7f14\u7f15\u7f16\u7f17\u7f18\u7f19\u7f1a\u7f1b\u7f1c\u7f1d\u7f1e\u7f1f\u7f20\u7f21\u7f22\u7f23\u7f24\u7f25\u7f26\u7f27\u7f28\u7f29\u7f2a\u7f2b\u7f2c\u7f2d\u7f2e\u7f2f\u7f30\u7f31\u7f32\u7f33\u7f34\u7f35\u7f36\u7f37\u7f38\u7f39\u7f3a\u7f3b\u7f3c\u7f3d\u7f3e\u7f3f\u7f40\u7f41\u7f42\u7f43\u7f44\u7f45\u7f46\u7f47\u7f48\u7f49\u7f4a\u7f4b\u7f4c\u7f4d\u7f4e\u7f4f\u7f50\u7f51\u7f52\u7f53\u7f54\u7f55\u7f56\u7f57\u7f58\u7f59\u7f5a\u7f5b\u7f5c\u7f5d\u7f5e\u7f5f\u7f60\u7f61\u7f62\u7f63\u7f64\u7f65\u7f66\u7f67\u7f68\u7f69\u7f6a\u7f6b\u7f6c\u7f6d\u7f6e\u7f6f\u7f70\u7f71\u7f72\u7f73\u7f74\u7f75\u7f76\u7f77\u7f78\u7f79\u7f7a\u7f7b\u7f7c\u7f7d\u7f7e\u7f7f\u7f80\u7f81\u7f82\u7f83\u7f84\u7f85\u7f86\u7f87\u7f88\u7f89\u7f8a\u7f8b\u7f8c\u7f8d\u7f8e\u7f8f\u7f90\u7f91\u7f92\u7f93\u7f94\u7f95\u7f96\u7f97\u7f98\u7f99\u7f9a\u7f9b\u7f9c\u7f9d\u7f9e\u7f9f\u7fa0\u7fa1\u7fa2\u7fa3\u7fa4\u7fa5\u7fa6\u7fa7\u7fa8\u7fa9\u7faa\u7fab\u7fac\u7fad\u7fae\u7faf\u7fb0\u7fb1\u7fb2\u7fb3\u7fb4\u7fb5\u7fb6\u7fb7\u7fb8\u7fb9\u7fba\u7fbb\u7fbc\u7fbd\u7fbe\u7fbf\u7fc0\u7fc1\u7fc2\u7fc3\u7fc4\u7fc5\u7fc6\u7fc7\u7fc8\u7fc9\u7fca\u7fcb\u7fcc\u7fcd\u7fce\u7fcf\u7fd0\u7fd1\u7fd2\u7fd3\u7fd4\u7fd5\u7fd6\u7fd7\u7fd8\u7fd9\u7fda\u7fdb\u7fdc\u7fdd\u7fde\u7fdf\u7fe0\u7fe1\u7fe2\u7fe3\u7fe4\u7fe5\u7fe6\u7fe7\u7fe8\u7fe9\u7fea\u7feb\u7fec\u7fed\u7fee\u7fef\u7ff0\u7ff1\u7ff2\u7ff3\u7ff4\u7ff5\u7ff6\u7ff7\u7ff8\u7ff9\u7ffa\u7ffb\u7ffc\u7ffd\u7ffe\u7fff\u8000\u8001\u8002\u8003\u8004\u8005\u8006\u8007\u8008\u8009\u800a\u800b\u800c\u800d\u800e\u800f\u8010\u8011\u8012\u8013\u8014\u8015\u8016\u8017\u8018\u8019\u801a\u801b\u801c\u801d\u801e\u801f\u8020\u8021\u8022\u8023\u8024\u8025\u8026\u8027\u8028\u8029\u802a\u802b\u802c\u802d\u802e\u802f\u8030\u8031\u8032\u8033\u8034\u8035\u8036\u8037\u8038\u8039\u803a\u803b\u803c\u803d\u803e\u803f\u8040\u8041\u8042\u8043\u8044\u8045\u8046\u8047\u8048\u8049\u804a\u804b\u804c\u804d\u804e\u804f\u8050\u8051\u8052\u8053\u8054\u8055\u8056\u8057\u8058\u8059\u805a\u805b\u805c\u805d\u805e\u805f\u8060\u8061\u8062\u8063\u8064\u8065\u8066\u8067\u8068\u8069\u806a\u806b\u806c\u806d\u806e\u806f\u8070\u8071\u8072\u8073\u8074\u8075\u8076\u8077\u8078\u8079\u807a\u807b\u807c\u807d\u807e\u807f\u8080\u8081\u8082\u8083\u8084\u8085\u8086\u8087\u8088\u8089\u808a\u808b\u808c\u808d\u808e\u808f\u8090\u8091\u8092\u8093\u8094\u8095\u8096\u8097\u8098\u8099\u809a\u809b\u809c\u809d\u809e\u809f\u80a0\u80a1\u80a2\u80a3\u80a4\u80a5\u80a6\u80a7\u80a8\u80a9\u80aa\u80ab\u80ac\u80ad\u80ae\u80af\u80b0\u80b1\u80b2\u80b3\u80b4\u80b5\u80b6\u80b7\u80b8\u80b9\u80ba\u80bb\u80bc\u80bd\u80be\u80bf\u80c0\u80c1\u80c2\u80c3\u80c4\u80c5\u80c6\u80c7\u80c8\u80c9\u80ca\u80cb\u80cc\u80cd\u80ce\u80cf\u80d0\u80d1\u80d2\u80d3\u80d4\u80d5\u80d6\u80d7\u80d8\u80d9\u80da\u80db\u80dc\u80dd\u80de\u80df\u80e0\u80e1\u80e2\u80e3\u80e4\u80e5\u80e6\u80e7\u80e8\u80e9\u80ea\u80eb\u80ec\u80ed\u80ee\u80ef\u80f0\u80f1\u80f2\u80f3\u80f4\u80f5\u80f6\u80f7\u80f8\u80f9\u80fa\u80fb\u80fc\u80fd\u80fe\u80ff\u8100\u8101\u8102\u8103\u8104\u8105\u8106\u8107\u8108\u8109\u810a\u810b\u810c\u810d\u810e\u810f\u8110\u8111\u8112\u8113\u8114\u8115\u8116\u8117\u8118\u8119\u811a\u811b\u811c\u811d\u811e\u811f\u8120\u8121\u8122\u8123\u8124\u8125\u8126\u8127\u8128\u8129\u812a\u812b\u812c\u812d\u812e\u812f\u8130\u8131\u8132\u8133\u8134\u8135\u8136\u8137\u8138\u8139\u813a\u813b\u813c\u813d\u813e\u813f\u8140\u8141\u8142\u8143\u8144\u8145\u8146\u8147\u8148\u8149\u814a\u814b\u814c\u814d\u814e\u814f\u8150\u8151\u8152\u8153\u8154\u8155\u8156\u8157\u8158\u8159\u815a\u815b\u815c\u815d\u815e\u815f\u8160\u8161\u8162\u8163\u8164\u8165\u8166\u8167\u8168\u8169\u816a\u816b\u816c\u816d\u816e\u816f\u8170\u8171\u8172\u8173\u8174\u8175\u8176\u8177\u8178\u8179\u817a\u817b\u817c\u817d\u817e\u817f\u8180\u8181\u8182\u8183\u8184\u8185\u8186\u8187\u8188\u8189\u818a\u818b\u818c\u818d\u818e\u818f\u8190\u8191\u8192\u8193\u8194\u8195\u8196\u8197\u8198\u8199\u819a\u819b\u819c\u819d\u819e\u819f\u81a0\u81a1\u81a2\u81a3\u81a4\u81a5\u81a6\u81a7\u81a8\u81a9\u81aa\u81ab\u81ac\u81ad\u81ae\u81af\u81b0\u81b1\u81b2\u81b3\u81b4\u81b5\u81b6\u81b7\u81b8\u81b9\u81ba\u81bb\u81bc\u81bd\u81be\u81bf\u81c0\u81c1\u81c2\u81c3\u81c4\u81c5\u81c6\u81c7\u81c8\u81c9\u81ca\u81cb\u81cc\u81cd\u81ce\u81cf\u81d0\u81d1\u81d2\u81d3\u81d4\u81d5\u81d6\u81d7\u81d8\u81d9\u81da\u81db\u81dc\u81dd\u81de\u81df\u81e0\u81e1\u81e2\u81e3\u81e4\u81e5\u81e6\u81e7\u81e8\u81e9\u81ea\u81eb\u81ec\u81ed\u81ee\u81ef\u81f0\u81f1\u81f2\u81f3\u81f4\u81f5\u81f6\u81f7\u81f8\u81f9\u81fa\u81fb\u81fc\u81fd\u81fe\u81ff\u8200\u8201\u8202\u8203\u8204\u8205\u8206\u8207\u8208\u8209\u820a\u820b\u820c\u820d\u820e\u820f\u8210\u8211\u8212\u8213\u8214\u8215\u8216\u8217\u8218\u8219\u821a\u821b\u821c\u821d\u821e\u821f\u8220\u8221\u8222\u8223\u8224\u8225\u8226\u8227\u8228\u8229\u822a\u822b\u822c\u822d\u822e\u822f\u8230\u8231\u8232\u8233\u8234\u8235\u8236\u8237\u8238\u8239\u823a\u823b\u823c\u823d\u823e\u823f\u8240\u8241\u8242\u8243\u8244\u8245\u8246\u8247\u8248\u8249\u824a\u824b\u824c\u824d\u824e\u824f\u8250\u8251\u8252\u8253\u8254\u8255\u8256\u8257\u8258\u8259\u825a\u825b\u825c\u825d\u825e\u825f\u8260\u8261\u8262\u8263\u8264\u8265\u8266\u8267\u8268\u8269\u826a\u826b\u826c\u826d\u826e\u826f\u8270\u8271\u8272\u8273\u8274\u8275\u8276\u8277\u8278\u8279\u827a\u827b\u827c\u827d\u827e\u827f\u8280\u8281\u8282\u8283\u8284\u8285\u8286\u8287\u8288\u8289\u828a\u828b\u828c\u828d\u828e\u828f\u8290\u8291\u8292\u8293\u8294\u8295\u8296\u8297\u8298\u8299\u829a\u829b\u829c\u829d\u829e\u829f\u82a0\u82a1\u82a2\u82a3\u82a4\u82a5\u82a6\u82a7\u82a8\u82a9\u82aa\u82ab\u82ac\u82ad\u82ae\u82af\u82b0\u82b1\u82b2\u82b3\u82b4\u82b5\u82b6\u82b7\u82b8\u82b9\u82ba\u82bb\u82bc\u82bd\u82be\u82bf\u82c0\u82c1\u82c2\u82c3\u82c4\u82c5\u82c6\u82c7\u82c8\u82c9\u82ca\u82cb\u82cc\u82cd\u82ce\u82cf\u82d0\u82d1\u82d2\u82d3\u82d4\u82d5\u82d6\u82d7\u82d8\u82d9\u82da\u82db\u82dc\u82dd\u82de\u82df\u82e0\u82e1\u82e2\u82e3\u82e4\u82e5\u82e6\u82e7\u82e8\u82e9\u82ea\u82eb\u82ec\u82ed\u82ee\u82ef\u82f0\u82f1\u82f2\u82f3\u82f4\u82f5\u82f6\u82f7\u82f8\u82f9\u82fa\u82fb\u82fc\u82fd\u82fe\u82ff\u8300\u8301\u8302\u8303\u8304\u8305\u8306\u8307\u8308\u8309\u830a\u830b\u830c\u830d\u830e\u830f\u8310\u8311\u8312\u8313\u8314\u8315\u8316\u8317\u8318\u8319\u831a\u831b\u831c\u831d\u831e\u831f\u8320\u8321\u8322\u8323\u8324\u8325\u8326\u8327\u8328\u8329\u832a\u832b\u832c\u832d\u832e\u832f\u8330\u8331\u8332\u8333\u8334\u8335\u8336\u8337\u8338\u8339\u833a\u833b\u833c\u833d\u833e\u833f\u8340\u8341\u8342\u8343\u8344\u8345\u8346\u8347\u8348\u8349\u834a\u834b\u834c\u834d\u834e\u834f\u8350\u8351\u8352\u8353\u8354\u8355\u8356\u8357\u8358\u8359\u835a\u835b\u835c\u835d\u835e\u835f\u8360\u8361\u8362\u8363\u8364\u8365\u8366\u8367\u8368\u8369\u836a\u836b\u836c\u836d\u836e\u836f\u8370\u8371\u8372\u8373\u8374\u8375\u8376\u8377\u8378\u8379\u837a\u837b\u837c\u837d\u837e\u837f\u8380\u8381\u8382\u8383\u8384\u8385\u8386\u8387\u8388\u8389\u838a\u838b\u838c\u838d\u838e\u838f\u8390\u8391\u8392\u8393\u8394\u8395\u8396\u8397\u8398\u8399\u839a\u839b\u839c\u839d\u839e\u839f\u83a0\u83a1\u83a2\u83a3\u83a4\u83a5\u83a6\u83a7\u83a8\u83a9\u83aa\u83ab\u83ac\u83ad\u83ae\u83af\u83b0\u83b1\u83b2\u83b3\u83b4\u83b5\u83b6\u83b7\u83b8\u83b9\u83ba\u83bb\u83bc\u83bd\u83be\u83bf\u83c0\u83c1\u83c2\u83c3\u83c4\u83c5\u83c6\u83c7\u83c8\u83c9\u83ca\u83cb\u83cc\u83cd\u83ce\u83cf\u83d0\u83d1\u83d2\u83d3\u83d4\u83d5\u83d6\u83d7\u83d8\u83d9\u83da\u83db\u83dc\u83dd\u83de\u83df\u83e0\u83e1\u83e2\u83e3\u83e4\u83e5\u83e6\u83e7\u83e8\u83e9\u83ea\u83eb\u83ec\u83ed\u83ee\u83ef\u83f0\u83f1\u83f2\u83f3\u83f4\u83f5\u83f6\u83f7\u83f8\u83f9\u83fa\u83fb\u83fc\u83fd\u83fe\u83ff\u8400\u8401\u8402\u8403\u8404\u8405\u8406\u8407\u8408\u8409\u840a\u840b\u840c\u840d\u840e\u840f\u8410\u8411\u8412\u8413\u8414\u8415\u8416\u8417\u8418\u8419\u841a\u841b\u841c\u841d\u841e\u841f\u8420\u8421\u8422\u8423\u8424\u8425\u8426\u8427\u8428\u8429\u842a\u842b\u842c\u842d\u842e\u842f\u8430\u8431\u8432\u8433\u8434\u8435\u8436\u8437\u8438\u8439\u843a\u843b\u843c\u843d\u843e\u843f\u8440\u8441\u8442\u8443\u8444\u8445\u8446\u8447\u8448\u8449\u844a\u844b\u844c\u844d\u844e\u844f\u8450\u8451\u8452\u8453\u8454\u8455\u8456\u8457\u8458\u8459\u845a\u845b\u845c\u845d\u845e\u845f\u8460\u8461\u8462\u8463\u8464\u8465\u8466\u8467\u8468\u8469\u846a\u846b\u846c\u846d\u846e\u846f\u8470\u8471\u8472\u8473\u8474\u8475\u8476\u8477\u8478\u8479\u847a\u847b\u847c\u847d\u847e\u847f\u8480\u8481\u8482\u8483\u8484\u8485\u8486\u8487\u8488\u8489\u848a\u848b\u848c\u848d\u848e\u848f\u8490\u8491\u8492\u8493\u8494\u8495\u8496\u8497\u8498\u8499\u849a\u849b\u849c\u849d\u849e\u849f\u84a0\u84a1\u84a2\u84a3\u84a4\u84a5\u84a6\u84a7\u84a8\u84a9\u84aa\u84ab\u84ac\u84ad\u84ae\u84af\u84b0\u84b1\u84b2\u84b3\u84b4\u84b5\u84b6\u84b7\u84b8\u84b9\u84ba\u84bb\u84bc\u84bd\u84be\u84bf\u84c0\u84c1\u84c2\u84c3\u84c4\u84c5\u84c6\u84c7\u84c8\u84c9\u84ca\u84cb\u84cc\u84cd\u84ce\u84cf\u84d0\u84d1\u84d2\u84d3\u84d4\u84d5\u84d6\u84d7\u84d8\u84d9\u84da\u84db\u84dc\u84dd\u84de\u84df\u84e0\u84e1\u84e2\u84e3\u84e4\u84e5\u84e6\u84e7\u84e8\u84e9\u84ea\u84eb\u84ec\u84ed\u84ee\u84ef\u84f0\u84f1\u84f2\u84f3\u84f4\u84f5\u84f6\u84f7\u84f8\u84f9\u84fa\u84fb\u84fc\u84fd\u84fe\u84ff\u8500\u8501\u8502\u8503\u8504\u8505\u8506\u8507\u8508\u8509\u850a\u850b\u850c\u850d\u850e\u850f\u8510\u8511\u8512\u8513\u8514\u8515\u8516\u8517\u8518\u8519\u851a\u851b\u851c\u851d\u851e\u851f\u8520\u8521\u8522\u8523\u8524\u8525\u8526\u8527\u8528\u8529\u852a\u852b\u852c\u852d\u852e\u852f\u8530\u8531\u8532\u8533\u8534\u8535\u8536\u8537\u8538\u8539\u853a\u853b\u853c\u853d\u853e\u853f\u8540\u8541\u8542\u8543\u8544\u8545\u8546\u8547\u8548\u8549\u854a\u854b\u854c\u854d\u854e\u854f\u8550\u8551\u8552\u8553\u8554\u8555\u8556\u8557\u8558\u8559\u855a\u855b\u855c\u855d\u855e\u855f\u8560\u8561\u8562\u8563\u8564\u8565\u8566\u8567\u8568\u8569\u856a\u856b\u856c\u856d\u856e\u856f\u8570\u8571\u8572\u8573\u8574\u8575\u8576\u8577\u8578\u8579\u857a\u857b\u857c\u857d\u857e\u857f\u8580\u8581\u8582\u8583\u8584\u8585\u8586\u8587\u8588\u8589\u858a\u858b\u858c\u858d\u858e\u858f\u8590\u8591\u8592\u8593\u8594\u8595\u8596\u8597\u8598\u8599\u859a\u859b\u859c\u859d\u859e\u859f\u85a0\u85a1\u85a2\u85a3\u85a4\u85a5\u85a6\u85a7\u85a8\u85a9\u85aa\u85ab\u85ac\u85ad\u85ae\u85af\u85b0\u85b1\u85b2\u85b3\u85b4\u85b5\u85b6\u85b7\u85b8\u85b9\u85ba\u85bb\u85bc\u85bd\u85be\u85bf\u85c0\u85c1\u85c2\u85c3\u85c4\u85c5\u85c6\u85c7\u85c8\u85c9\u85ca\u85cb\u85cc\u85cd\u85ce\u85cf\u85d0\u85d1\u85d2\u85d3\u85d4\u85d5\u85d6\u85d7\u85d8\u85d9\u85da\u85db\u85dc\u85dd\u85de\u85df\u85e0\u85e1\u85e2\u85e3\u85e4\u85e5\u85e6\u85e7\u85e8\u85e9\u85ea\u85eb\u85ec\u85ed\u85ee\u85ef\u85f0\u85f1\u85f2\u85f3\u85f4\u85f5\u85f6\u85f7\u85f8\u85f9\u85fa\u85fb\u85fc\u85fd\u85fe\u85ff\u8600\u8601\u8602\u8603\u8604\u8605\u8606\u8607\u8608\u8609\u860a\u860b\u860c\u860d\u860e\u860f\u8610\u8611\u8612\u8613\u8614\u8615\u8616\u8617\u8618\u8619\u861a\u861b\u861c\u861d\u861e\u861f\u8620\u8621\u8622\u8623\u8624\u8625\u8626\u8627\u8628\u8629\u862a\u862b\u862c\u862d\u862e\u862f\u8630\u8631\u8632\u8633\u8634\u8635\u8636\u8637\u8638\u8639\u863a\u863b\u863c\u863d\u863e\u863f\u8640\u8641\u8642\u8643\u8644\u8645\u8646\u8647\u8648\u8649\u864a\u864b\u864c\u864d\u864e\u864f\u8650\u8651\u8652\u8653\u8654\u8655\u8656\u8657\u8658\u8659\u865a\u865b\u865c\u865d\u865e\u865f\u8660\u8661\u8662\u8663\u8664\u8665\u8666\u8667\u8668\u8669\u866a\u866b\u866c\u866d\u866e\u866f\u8670\u8671\u8672\u8673\u8674\u8675\u8676\u8677\u8678\u8679\u867a\u867b\u867c\u867d\u867e\u867f\u8680\u8681\u8682\u8683\u8684\u8685\u8686\u8687\u8688\u8689\u868a\u868b\u868c\u868d\u868e\u868f\u8690\u8691\u8692\u8693\u8694\u8695\u8696\u8697\u8698\u8699\u869a\u869b\u869c\u869d\u869e\u869f\u86a0\u86a1\u86a2\u86a3\u86a4\u86a5\u86a6\u86a7\u86a8\u86a9\u86aa\u86ab\u86ac\u86ad\u86ae\u86af\u86b0\u86b1\u86b2\u86b3\u86b4\u86b5\u86b6\u86b7\u86b8\u86b9\u86ba\u86bb\u86bc\u86bd\u86be\u86bf\u86c0\u86c1\u86c2\u86c3\u86c4\u86c5\u86c6\u86c7\u86c8\u86c9\u86ca\u86cb\u86cc\u86cd\u86ce\u86cf\u86d0\u86d1\u86d2\u86d3\u86d4\u86d5\u86d6\u86d7\u86d8\u86d9\u86da\u86db\u86dc\u86dd\u86de\u86df\u86e0\u86e1\u86e2\u86e3\u86e4\u86e5\u86e6\u86e7\u86e8\u86e9\u86ea\u86eb\u86ec\u86ed\u86ee\u86ef\u86f0\u86f1\u86f2\u86f3\u86f4\u86f5\u86f6\u86f7\u86f8\u86f9\u86fa\u86fb\u86fc\u86fd\u86fe\u86ff\u8700\u8701\u8702\u8703\u8704\u8705\u8706\u8707\u8708\u8709\u870a\u870b\u870c\u870d\u870e\u870f\u8710\u8711\u8712\u8713\u8714\u8715\u8716\u8717\u8718\u8719\u871a\u871b\u871c\u871d\u871e\u871f\u8720\u8721\u8722\u8723\u8724\u8725\u8726\u8727\u8728\u8729\u872a\u872b\u872c\u872d\u872e\u872f\u8730\u8731\u8732\u8733\u8734\u8735\u8736\u8737\u8738\u8739\u873a\u873b\u873c\u873d\u873e\u873f\u8740\u8741\u8742\u8743\u8744\u8745\u8746\u8747\u8748\u8749\u874a\u874b\u874c\u874d\u874e\u874f\u8750\u8751\u8752\u8753\u8754\u8755\u8756\u8757\u8758\u8759\u875a\u875b\u875c\u875d\u875e\u875f\u8760\u8761\u8762\u8763\u8764\u8765\u8766\u8767\u8768\u8769\u876a\u876b\u876c\u876d\u876e\u876f\u8770\u8771\u8772\u8773\u8774\u8775\u8776\u8777\u8778\u8779\u877a\u877b\u877c\u877d\u877e\u877f\u8780\u8781\u8782\u8783\u8784\u8785\u8786\u8787\u8788\u8789\u878a\u878b\u878c\u878d\u878e\u878f\u8790\u8791\u8792\u8793\u8794\u8795\u8796\u8797\u8798\u8799\u879a\u879b\u879c\u879d\u879e\u879f\u87a0\u87a1\u87a2\u87a3\u87a4\u87a5\u87a6\u87a7\u87a8\u87a9\u87aa\u87ab\u87ac\u87ad\u87ae\u87af\u87b0\u87b1\u87b2\u87b3\u87b4\u87b5\u87b6\u87b7\u87b8\u87b9\u87ba\u87bb\u87bc\u87bd\u87be\u87bf\u87c0\u87c1\u87c2\u87c3\u87c4\u87c5\u87c6\u87c7\u87c8\u87c9\u87ca\u87cb\u87cc\u87cd\u87ce\u87cf\u87d0\u87d1\u87d2\u87d3\u87d4\u87d5\u87d6\u87d7\u87d8\u87d9\u87da\u87db\u87dc\u87dd\u87de\u87df\u87e0\u87e1\u87e2\u87e3\u87e4\u87e5\u87e6\u87e7\u87e8\u87e9\u87ea\u87eb\u87ec\u87ed\u87ee\u87ef\u87f0\u87f1\u87f2\u87f3\u87f4\u87f5\u87f6\u87f7\u87f8\u87f9\u87fa\u87fb\u87fc\u87fd\u87fe\u87ff\u8800\u8801\u8802\u8803\u8804\u8805\u8806\u8807\u8808\u8809\u880a\u880b\u880c\u880d\u880e\u880f\u8810\u8811\u8812\u8813\u8814\u8815\u8816\u8817\u8818\u8819\u881a\u881b\u881c\u881d\u881e\u881f\u8820\u8821\u8822\u8823\u8824\u8825\u8826\u8827\u8828\u8829\u882a\u882b\u882c\u882d\u882e\u882f\u8830\u8831\u8832\u8833\u8834\u8835\u8836\u8837\u8838\u8839\u883a\u883b\u883c\u883d\u883e\u883f\u8840\u8841\u8842\u8843\u8844\u8845\u8846\u8847\u8848\u8849\u884a\u884b\u884c\u884d\u884e\u884f\u8850\u8851\u8852\u8853\u8854\u8855\u8856\u8857\u8858\u8859\u885a\u885b\u885c\u885d\u885e\u885f\u8860\u8861\u8862\u8863\u8864\u8865\u8866\u8867\u8868\u8869\u886a\u886b\u886c\u886d\u886e\u886f\u8870\u8871\u8872\u8873\u8874\u8875\u8876\u8877\u8878\u8879\u887a\u887b\u887c\u887d\u887e\u887f\u8880\u8881\u8882\u8883\u8884\u8885\u8886\u8887\u8888\u8889\u888a\u888b\u888c\u888d\u888e\u888f\u8890\u8891\u8892\u8893\u8894\u8895\u8896\u8897\u8898\u8899\u889a\u889b\u889c\u889d\u889e\u889f\u88a0\u88a1\u88a2\u88a3\u88a4\u88a5\u88a6\u88a7\u88a8\u88a9\u88aa\u88ab\u88ac\u88ad\u88ae\u88af\u88b0\u88b1\u88b2\u88b3\u88b4\u88b5\u88b6\u88b7\u88b8\u88b9\u88ba\u88bb\u88bc\u88bd\u88be\u88bf\u88c0\u88c1\u88c2\u88c3\u88c4\u88c5\u88c6\u88c7\u88c8\u88c9\u88ca\u88cb\u88cc\u88cd\u88ce\u88cf\u88d0\u88d1\u88d2\u88d3\u88d4\u88d5\u88d6\u88d7\u88d8\u88d9\u88da\u88db\u88dc\u88dd\u88de\u88df\u88e0\u88e1\u88e2\u88e3\u88e4\u88e5\u88e6\u88e7\u88e8\u88e9\u88ea\u88eb\u88ec\u88ed\u88ee\u88ef\u88f0\u88f1\u88f2\u88f3\u88f4\u88f5\u88f6\u88f7\u88f8\u88f9\u88fa\u88fb\u88fc\u88fd\u88fe\u88ff\u8900\u8901\u8902\u8903\u8904\u8905\u8906\u8907\u8908\u8909\u890a\u890b\u890c\u890d\u890e\u890f\u8910\u8911\u8912\u8913\u8914\u8915\u8916\u8917\u8918\u8919\u891a\u891b\u891c\u891d\u891e\u891f\u8920\u8921\u8922\u8923\u8924\u8925\u8926\u8927\u8928\u8929\u892a\u892b\u892c\u892d\u892e\u892f\u8930\u8931\u8932\u8933\u8934\u8935\u8936\u8937\u8938\u8939\u893a\u893b\u893c\u893d\u893e\u893f\u8940\u8941\u8942\u8943\u8944\u8945\u8946\u8947\u8948\u8949\u894a\u894b\u894c\u894d\u894e\u894f\u8950\u8951\u8952\u8953\u8954\u8955\u8956\u8957\u8958\u8959\u895a\u895b\u895c\u895d\u895e\u895f\u8960\u8961\u8962\u8963\u8964\u8965\u8966\u8967\u8968\u8969\u896a\u896b\u896c\u896d\u896e\u896f\u8970\u8971\u8972\u8973\u8974\u8975\u8976\u8977\u8978\u8979\u897a\u897b\u897c\u897d\u897e\u897f\u8980\u8981\u8982\u8983\u8984\u8985\u8986\u8987\u8988\u8989\u898a\u898b\u898c\u898d\u898e\u898f\u8990\u8991\u8992\u8993\u8994\u8995\u8996\u8997\u8998\u8999\u899a\u899b\u899c\u899d\u899e\u899f\u89a0\u89a1\u89a2\u89a3\u89a4\u89a5\u89a6\u89a7\u89a8\u89a9\u89aa\u89ab\u89ac\u89ad\u89ae\u89af\u89b0\u89b1\u89b2\u89b3\u89b4\u89b5\u89b6\u89b7\u89b8\u89b9\u89ba\u89bb\u89bc\u89bd\u89be\u89bf\u89c0\u89c1\u89c2\u89c3\u89c4\u89c5\u89c6\u89c7\u89c8\u89c9\u89ca\u89cb\u89cc\u89cd\u89ce\u89cf\u89d0\u89d1\u89d2\u89d3\u89d4\u89d5\u89d6\u89d7\u89d8\u89d9\u89da\u89db\u89dc\u89dd\u89de\u89df\u89e0\u89e1\u89e2\u89e3\u89e4\u89e5\u89e6\u89e7\u89e8\u89e9\u89ea\u89eb\u89ec\u89ed\u89ee\u89ef\u89f0\u89f1\u89f2\u89f3\u89f4\u89f5\u89f6\u89f7\u89f8\u89f9\u89fa\u89fb\u89fc\u89fd\u89fe\u89ff\u8a00\u8a01\u8a02\u8a03\u8a04\u8a05\u8a06\u8a07\u8a08\u8a09\u8a0a\u8a0b\u8a0c\u8a0d\u8a0e\u8a0f\u8a10\u8a11\u8a12\u8a13\u8a14\u8a15\u8a16\u8a17\u8a18\u8a19\u8a1a\u8a1b\u8a1c\u8a1d\u8a1e\u8a1f\u8a20\u8a21\u8a22\u8a23\u8a24\u8a25\u8a26\u8a27\u8a28\u8a29\u8a2a\u8a2b\u8a2c\u8a2d\u8a2e\u8a2f\u8a30\u8a31\u8a32\u8a33\u8a34\u8a35\u8a36\u8a37\u8a38\u8a39\u8a3a\u8a3b\u8a3c\u8a3d\u8a3e\u8a3f\u8a40\u8a41\u8a42\u8a43\u8a44\u8a45\u8a46\u8a47\u8a48\u8a49\u8a4a\u8a4b\u8a4c\u8a4d\u8a4e\u8a4f\u8a50\u8a51\u8a52\u8a53\u8a54\u8a55\u8a56\u8a57\u8a58\u8a59\u8a5a\u8a5b\u8a5c\u8a5d\u8a5e\u8a5f\u8a60\u8a61\u8a62\u8a63\u8a64\u8a65\u8a66\u8a67\u8a68\u8a69\u8a6a\u8a6b\u8a6c\u8a6d\u8a6e\u8a6f\u8a70\u8a71\u8a72\u8a73\u8a74\u8a75\u8a76\u8a77\u8a78\u8a79\u8a7a\u8a7b\u8a7c\u8a7d\u8a7e\u8a7f\u8a80\u8a81\u8a82\u8a83\u8a84\u8a85\u8a86\u8a87\u8a88\u8a89\u8a8a\u8a8b\u8a8c\u8a8d\u8a8e\u8a8f\u8a90\u8a91\u8a92\u8a93\u8a94\u8a95\u8a96\u8a97\u8a98\u8a99\u8a9a\u8a9b\u8a9c\u8a9d\u8a9e\u8a9f\u8aa0\u8aa1\u8aa2\u8aa3\u8aa4\u8aa5\u8aa6\u8aa7\u8aa8\u8aa9\u8aaa\u8aab\u8aac\u8aad\u8aae\u8aaf\u8ab0\u8ab1\u8ab2\u8ab3\u8ab4\u8ab5\u8ab6\u8ab7\u8ab8\u8ab9\u8aba\u8abb\u8abc\u8abd\u8abe\u8abf\u8ac0\u8ac1\u8ac2\u8ac3\u8ac4\u8ac5\u8ac6\u8ac7\u8ac8\u8ac9\u8aca\u8acb\u8acc\u8acd\u8ace\u8acf\u8ad0\u8ad1\u8ad2\u8ad3\u8ad4\u8ad5\u8ad6\u8ad7\u8ad8\u8ad9\u8ada\u8adb\u8adc\u8add\u8ade\u8adf\u8ae0\u8ae1\u8ae2\u8ae3\u8ae4\u8ae5\u8ae6\u8ae7\u8ae8\u8ae9\u8aea\u8aeb\u8aec\u8aed\u8aee\u8aef\u8af0\u8af1\u8af2\u8af3\u8af4\u8af5\u8af6\u8af7\u8af8\u8af9\u8afa\u8afb\u8afc\u8afd\u8afe\u8aff\u8b00\u8b01\u8b02\u8b03\u8b04\u8b05\u8b06\u8b07\u8b08\u8b09\u8b0a\u8b0b\u8b0c\u8b0d\u8b0e\u8b0f\u8b10\u8b11\u8b12\u8b13\u8b14\u8b15\u8b16\u8b17\u8b18\u8b19\u8b1a\u8b1b\u8b1c\u8b1d\u8b1e\u8b1f\u8b20\u8b21\u8b22\u8b23\u8b24\u8b25\u8b26\u8b27\u8b28\u8b29\u8b2a\u8b2b\u8b2c\u8b2d\u8b2e\u8b2f\u8b30\u8b31\u8b32\u8b33\u8b34\u8b35\u8b36\u8b37\u8b38\u8b39\u8b3a\u8b3b\u8b3c\u8b3d\u8b3e\u8b3f\u8b40\u8b41\u8b42\u8b43\u8b44\u8b45\u8b46\u8b47\u8b48\u8b49\u8b4a\u8b4b\u8b4c\u8b4d\u8b4e\u8b4f\u8b50\u8b51\u8b52\u8b53\u8b54\u8b55\u8b56\u8b57\u8b58\u8b59\u8b5a\u8b5b\u8b5c\u8b5d\u8b5e\u8b5f\u8b60\u8b61\u8b62\u8b63\u8b64\u8b65\u8b66\u8b67\u8b68\u8b69\u8b6a\u8b6b\u8b6c\u8b6d\u8b6e\u8b6f\u8b70\u8b71\u8b72\u8b73\u8b74\u8b75\u8b76\u8b77\u8b78\u8b79\u8b7a\u8b7b\u8b7c\u8b7d\u8b7e\u8b7f\u8b80\u8b81\u8b82\u8b83\u8b84\u8b85\u8b86\u8b87\u8b88\u8b89\u8b8a\u8b8b\u8b8c\u8b8d\u8b8e\u8b8f\u8b90\u8b91\u8b92\u8b93\u8b94\u8b95\u8b96\u8b97\u8b98\u8b99\u8b9a\u8b9b\u8b9c\u8b9d\u8b9e\u8b9f\u8ba0\u8ba1\u8ba2\u8ba3\u8ba4\u8ba5\u8ba6\u8ba7\u8ba8\u8ba9\u8baa\u8bab\u8bac\u8bad\u8bae\u8baf\u8bb0\u8bb1\u8bb2\u8bb3\u8bb4\u8bb5\u8bb6\u8bb7\u8bb8\u8bb9\u8bba\u8bbb\u8bbc\u8bbd\u8bbe\u8bbf\u8bc0\u8bc1\u8bc2\u8bc3\u8bc4\u8bc5\u8bc6\u8bc7\u8bc8\u8bc9\u8bca\u8bcb\u8bcc\u8bcd\u8bce\u8bcf\u8bd0\u8bd1\u8bd2\u8bd3\u8bd4\u8bd5\u8bd6\u8bd7\u8bd8\u8bd9\u8bda\u8bdb\u8bdc\u8bdd\u8bde\u8bdf\u8be0\u8be1\u8be2\u8be3\u8be4\u8be5\u8be6\u8be7\u8be8\u8be9\u8bea\u8beb\u8bec\u8bed\u8bee\u8bef\u8bf0\u8bf1\u8bf2\u8bf3\u8bf4\u8bf5\u8bf6\u8bf7\u8bf8\u8bf9\u8bfa\u8bfb\u8bfc\u8bfd\u8bfe\u8bff\u8c00\u8c01\u8c02\u8c03\u8c04\u8c05\u8c06\u8c07\u8c08\u8c09\u8c0a\u8c0b\u8c0c\u8c0d\u8c0e\u8c0f\u8c10\u8c11\u8c12\u8c13\u8c14\u8c15\u8c16\u8c17\u8c18\u8c19\u8c1a\u8c1b\u8c1c\u8c1d\u8c1e\u8c1f\u8c20\u8c21\u8c22\u8c23\u8c24\u8c25\u8c26\u8c27\u8c28\u8c29\u8c2a\u8c2b\u8c2c\u8c2d\u8c2e\u8c2f\u8c30\u8c31\u8c32\u8c33\u8c34\u8c35\u8c36\u8c37\u8c38\u8c39\u8c3a\u8c3b\u8c3c\u8c3d\u8c3e\u8c3f\u8c40\u8c41\u8c42\u8c43\u8c44\u8c45\u8c46\u8c47\u8c48\u8c49\u8c4a\u8c4b\u8c4c\u8c4d\u8c4e\u8c4f\u8c50\u8c51\u8c52\u8c53\u8c54\u8c55\u8c56\u8c57\u8c58\u8c59\u8c5a\u8c5b\u8c5c\u8c5d\u8c5e\u8c5f\u8c60\u8c61\u8c62\u8c63\u8c64\u8c65\u8c66\u8c67\u8c68\u8c69\u8c6a\u8c6b\u8c6c\u8c6d\u8c6e\u8c6f\u8c70\u8c71\u8c72\u8c73\u8c74\u8c75\u8c76\u8c77\u8c78\u8c79\u8c7a\u8c7b\u8c7c\u8c7d\u8c7e\u8c7f\u8c80\u8c81\u8c82\u8c83\u8c84\u8c85\u8c86\u8c87\u8c88\u8c89\u8c8a\u8c8b\u8c8c\u8c8d\u8c8e\u8c8f\u8c90\u8c91\u8c92\u8c93\u8c94\u8c95\u8c96\u8c97\u8c98\u8c99\u8c9a\u8c9b\u8c9c\u8c9d\u8c9e\u8c9f\u8ca0\u8ca1\u8ca2\u8ca3\u8ca4\u8ca5\u8ca6\u8ca7\u8ca8\u8ca9\u8caa\u8cab\u8cac\u8cad\u8cae\u8caf\u8cb0\u8cb1\u8cb2\u8cb3\u8cb4\u8cb5\u8cb6\u8cb7\u8cb8\u8cb9\u8cba\u8cbb\u8cbc\u8cbd\u8cbe\u8cbf\u8cc0\u8cc1\u8cc2\u8cc3\u8cc4\u8cc5\u8cc6\u8cc7\u8cc8\u8cc9\u8cca\u8ccb\u8ccc\u8ccd\u8cce\u8ccf\u8cd0\u8cd1\u8cd2\u8cd3\u8cd4\u8cd5\u8cd6\u8cd7\u8cd8\u8cd9\u8cda\u8cdb\u8cdc\u8cdd\u8cde\u8cdf\u8ce0\u8ce1\u8ce2\u8ce3\u8ce4\u8ce5\u8ce6\u8ce7\u8ce8\u8ce9\u8cea\u8ceb\u8cec\u8ced\u8cee\u8cef\u8cf0\u8cf1\u8cf2\u8cf3\u8cf4\u8cf5\u8cf6\u8cf7\u8cf8\u8cf9\u8cfa\u8cfb\u8cfc\u8cfd\u8cfe\u8cff\u8d00\u8d01\u8d02\u8d03\u8d04\u8d05\u8d06\u8d07\u8d08\u8d09\u8d0a\u8d0b\u8d0c\u8d0d\u8d0e\u8d0f\u8d10\u8d11\u8d12\u8d13\u8d14\u8d15\u8d16\u8d17\u8d18\u8d19\u8d1a\u8d1b\u8d1c\u8d1d\u8d1e\u8d1f\u8d20\u8d21\u8d22\u8d23\u8d24\u8d25\u8d26\u8d27\u8d28\u8d29\u8d2a\u8d2b\u8d2c\u8d2d\u8d2e\u8d2f\u8d30\u8d31\u8d32\u8d33\u8d34\u8d35\u8d36\u8d37\u8d38\u8d39\u8d3a\u8d3b\u8d3c\u8d3d\u8d3e\u8d3f\u8d40\u8d41\u8d42\u8d43\u8d44\u8d45\u8d46\u8d47\u8d48\u8d49\u8d4a\u8d4b\u8d4c\u8d4d\u8d4e\u8d4f\u8d50\u8d51\u8d52\u8d53\u8d54\u8d55\u8d56\u8d57\u8d58\u8d59\u8d5a\u8d5b\u8d5c\u8d5d\u8d5e\u8d5f\u8d60\u8d61\u8d62\u8d63\u8d64\u8d65\u8d66\u8d67\u8d68\u8d69\u8d6a\u8d6b\u8d6c\u8d6d\u8d6e\u8d6f\u8d70\u8d71\u8d72\u8d73\u8d74\u8d75\u8d76\u8d77\u8d78\u8d79\u8d7a\u8d7b\u8d7c\u8d7d\u8d7e\u8d7f\u8d80\u8d81\u8d82\u8d83\u8d84\u8d85\u8d86\u8d87\u8d88\u8d89\u8d8a\u8d8b\u8d8c\u8d8d\u8d8e\u8d8f\u8d90\u8d91\u8d92\u8d93\u8d94\u8d95\u8d96\u8d97\u8d98\u8d99\u8d9a\u8d9b\u8d9c\u8d9d\u8d9e\u8d9f\u8da0\u8da1\u8da2\u8da3\u8da4\u8da5\u8da6\u8da7\u8da8\u8da9\u8daa\u8dab\u8dac\u8dad\u8dae\u8daf\u8db0\u8db1\u8db2\u8db3\u8db4\u8db5\u8db6\u8db7\u8db8\u8db9\u8dba\u8dbb\u8dbc\u8dbd\u8dbe\u8dbf\u8dc0\u8dc1\u8dc2\u8dc3\u8dc4\u8dc5\u8dc6\u8dc7\u8dc8\u8dc9\u8dca\u8dcb\u8dcc\u8dcd\u8dce\u8dcf\u8dd0\u8dd1\u8dd2\u8dd3\u8dd4\u8dd5\u8dd6\u8dd7\u8dd8\u8dd9\u8dda\u8ddb\u8ddc\u8ddd\u8dde\u8ddf\u8de0\u8de1\u8de2\u8de3\u8de4\u8de5\u8de6\u8de7\u8de8\u8de9\u8dea\u8deb\u8dec\u8ded\u8dee\u8def\u8df0\u8df1\u8df2\u8df3\u8df4\u8df5\u8df6\u8df7\u8df8\u8df9\u8dfa\u8dfb\u8dfc\u8dfd\u8dfe\u8dff\u8e00\u8e01\u8e02\u8e03\u8e04\u8e05\u8e06\u8e07\u8e08\u8e09\u8e0a\u8e0b\u8e0c\u8e0d\u8e0e\u8e0f\u8e10\u8e11\u8e12\u8e13\u8e14\u8e15\u8e16\u8e17\u8e18\u8e19\u8e1a\u8e1b\u8e1c\u8e1d\u8e1e\u8e1f\u8e20\u8e21\u8e22\u8e23\u8e24\u8e25\u8e26\u8e27\u8e28\u8e29\u8e2a\u8e2b\u8e2c\u8e2d\u8e2e\u8e2f\u8e30\u8e31\u8e32\u8e33\u8e34\u8e35\u8e36\u8e37\u8e38\u8e39\u8e3a\u8e3b\u8e3c\u8e3d\u8e3e\u8e3f\u8e40\u8e41\u8e42\u8e43\u8e44\u8e45\u8e46\u8e47\u8e48\u8e49\u8e4a\u8e4b\u8e4c\u8e4d\u8e4e\u8e4f\u8e50\u8e51\u8e52\u8e53\u8e54\u8e55\u8e56\u8e57\u8e58\u8e59\u8e5a\u8e5b\u8e5c\u8e5d\u8e5e\u8e5f\u8e60\u8e61\u8e62\u8e63\u8e64\u8e65\u8e66\u8e67\u8e68\u8e69\u8e6a\u8e6b\u8e6c\u8e6d\u8e6e\u8e6f\u8e70\u8e71\u8e72\u8e73\u8e74\u8e75\u8e76\u8e77\u8e78\u8e79\u8e7a\u8e7b\u8e7c\u8e7d\u8e7e\u8e7f\u8e80\u8e81\u8e82\u8e83\u8e84\u8e85\u8e86\u8e87\u8e88\u8e89\u8e8a\u8e8b\u8e8c\u8e8d\u8e8e\u8e8f\u8e90\u8e91\u8e92\u8e93\u8e94\u8e95\u8e96\u8e97\u8e98\u8e99\u8e9a\u8e9b\u8e9c\u8e9d\u8e9e\u8e9f\u8ea0\u8ea1\u8ea2\u8ea3\u8ea4\u8ea5\u8ea6\u8ea7\u8ea8\u8ea9\u8eaa\u8eab\u8eac\u8ead\u8eae\u8eaf\u8eb0\u8eb1\u8eb2\u8eb3\u8eb4\u8eb5\u8eb6\u8eb7\u8eb8\u8eb9\u8eba\u8ebb\u8ebc\u8ebd\u8ebe\u8ebf\u8ec0\u8ec1\u8ec2\u8ec3\u8ec4\u8ec5\u8ec6\u8ec7\u8ec8\u8ec9\u8eca\u8ecb\u8ecc\u8ecd\u8ece\u8ecf\u8ed0\u8ed1\u8ed2\u8ed3\u8ed4\u8ed5\u8ed6\u8ed7\u8ed8\u8ed9\u8eda\u8edb\u8edc\u8edd\u8ede\u8edf\u8ee0\u8ee1\u8ee2\u8ee3\u8ee4\u8ee5\u8ee6\u8ee7\u8ee8\u8ee9\u8eea\u8eeb\u8eec\u8eed\u8eee\u8eef\u8ef0\u8ef1\u8ef2\u8ef3\u8ef4\u8ef5\u8ef6\u8ef7\u8ef8\u8ef9\u8efa\u8efb\u8efc\u8efd\u8efe\u8eff\u8f00\u8f01\u8f02\u8f03\u8f04\u8f05\u8f06\u8f07\u8f08\u8f09\u8f0a\u8f0b\u8f0c\u8f0d\u8f0e\u8f0f\u8f10\u8f11\u8f12\u8f13\u8f14\u8f15\u8f16\u8f17\u8f18\u8f19\u8f1a\u8f1b\u8f1c\u8f1d\u8f1e\u8f1f\u8f20\u8f21\u8f22\u8f23\u8f24\u8f25\u8f26\u8f27\u8f28\u8f29\u8f2a\u8f2b\u8f2c\u8f2d\u8f2e\u8f2f\u8f30\u8f31\u8f32\u8f33\u8f34\u8f35\u8f36\u8f37\u8f38\u8f39\u8f3a\u8f3b\u8f3c\u8f3d\u8f3e\u8f3f\u8f40\u8f41\u8f42\u8f43\u8f44\u8f45\u8f46\u8f47\u8f48\u8f49\u8f4a\u8f4b\u8f4c\u8f4d\u8f4e\u8f4f\u8f50\u8f51\u8f52\u8f53\u8f54\u8f55\u8f56\u8f57\u8f58\u8f59\u8f5a\u8f5b\u8f5c\u8f5d\u8f5e\u8f5f\u8f60\u8f61\u8f62\u8f63\u8f64\u8f65\u8f66\u8f67\u8f68\u8f69\u8f6a\u8f6b\u8f6c\u8f6d\u8f6e\u8f6f\u8f70\u8f71\u8f72\u8f73\u8f74\u8f75\u8f76\u8f77\u8f78\u8f79\u8f7a\u8f7b\u8f7c\u8f7d\u8f7e\u8f7f\u8f80\u8f81\u8f82\u8f83\u8f84\u8f85\u8f86\u8f87\u8f88\u8f89\u8f8a\u8f8b\u8f8c\u8f8d\u8f8e\u8f8f\u8f90\u8f91\u8f92\u8f93\u8f94\u8f95\u8f96\u8f97\u8f98\u8f99\u8f9a\u8f9b\u8f9c\u8f9d\u8f9e\u8f9f\u8fa0\u8fa1\u8fa2\u8fa3\u8fa4\u8fa5\u8fa6\u8fa7\u8fa8\u8fa9\u8faa\u8fab\u8fac\u8fad\u8fae\u8faf\u8fb0\u8fb1\u8fb2\u8fb3\u8fb4\u8fb5\u8fb6\u8fb7\u8fb8\u8fb9\u8fba\u8fbb\u8fbc\u8fbd\u8fbe\u8fbf\u8fc0\u8fc1\u8fc2\u8fc3\u8fc4\u8fc5\u8fc6\u8fc7\u8fc8\u8fc9\u8fca\u8fcb\u8fcc\u8fcd\u8fce\u8fcf\u8fd0\u8fd1\u8fd2\u8fd3\u8fd4\u8fd5\u8fd6\u8fd7\u8fd8\u8fd9\u8fda\u8fdb\u8fdc\u8fdd\u8fde\u8fdf\u8fe0\u8fe1\u8fe2\u8fe3\u8fe4\u8fe5\u8fe6\u8fe7\u8fe8\u8fe9\u8fea\u8feb\u8fec\u8fed\u8fee\u8fef\u8ff0\u8ff1\u8ff2\u8ff3\u8ff4\u8ff5\u8ff6\u8ff7\u8ff8\u8ff9\u8ffa\u8ffb\u8ffc\u8ffd\u8ffe\u8fff\u9000\u9001\u9002\u9003\u9004\u9005\u9006\u9007\u9008\u9009\u900a\u900b\u900c\u900d\u900e\u900f\u9010\u9011\u9012\u9013\u9014\u9015\u9016\u9017\u9018\u9019\u901a\u901b\u901c\u901d\u901e\u901f\u9020\u9021\u9022\u9023\u9024\u9025\u9026\u9027\u9028\u9029\u902a\u902b\u902c\u902d\u902e\u902f\u9030\u9031\u9032\u9033\u9034\u9035\u9036\u9037\u9038\u9039\u903a\u903b\u903c\u903d\u903e\u903f\u9040\u9041\u9042\u9043\u9044\u9045\u9046\u9047\u9048\u9049\u904a\u904b\u904c\u904d\u904e\u904f\u9050\u9051\u9052\u9053\u9054\u9055\u9056\u9057\u9058\u9059\u905a\u905b\u905c\u905d\u905e\u905f\u9060\u9061\u9062\u9063\u9064\u9065\u9066\u9067\u9068\u9069\u906a\u906b\u906c\u906d\u906e\u906f\u9070\u9071\u9072\u9073\u9074\u9075\u9076\u9077\u9078\u9079\u907a\u907b\u907c\u907d\u907e\u907f\u9080\u9081\u9082\u9083\u9084\u9085\u9086\u9087\u9088\u9089\u908a\u908b\u908c\u908d\u908e\u908f\u9090\u9091\u9092\u9093\u9094\u9095\u9096\u9097\u9098\u9099\u909a\u909b\u909c\u909d\u909e\u909f\u90a0\u90a1\u90a2\u90a3\u90a4\u90a5\u90a6\u90a7\u90a8\u90a9\u90aa\u90ab\u90ac\u90ad\u90ae\u90af\u90b0\u90b1\u90b2\u90b3\u90b4\u90b5\u90b6\u90b7\u90b8\u90b9\u90ba\u90bb\u90bc\u90bd\u90be\u90bf\u90c0\u90c1\u90c2\u90c3\u90c4\u90c5\u90c6\u90c7\u90c8\u90c9\u90ca\u90cb\u90cc\u90cd\u90ce\u90cf\u90d0\u90d1\u90d2\u90d3\u90d4\u90d5\u90d6\u90d7\u90d8\u90d9\u90da\u90db\u90dc\u90dd\u90de\u90df\u90e0\u90e1\u90e2\u90e3\u90e4\u90e5\u90e6\u90e7\u90e8\u90e9\u90ea\u90eb\u90ec\u90ed\u90ee\u90ef\u90f0\u90f1\u90f2\u90f3\u90f4\u90f5\u90f6\u90f7\u90f8\u90f9\u90fa\u90fb\u90fc\u90fd\u90fe\u90ff\u9100\u9101\u9102\u9103\u9104\u9105\u9106\u9107\u9108\u9109\u910a\u910b\u910c\u910d\u910e\u910f\u9110\u9111\u9112\u9113\u9114\u9115\u9116\u9117\u9118\u9119\u911a\u911b\u911c\u911d\u911e\u911f\u9120\u9121\u9122\u9123\u9124\u9125\u9126\u9127\u9128\u9129\u912a\u912b\u912c\u912d\u912e\u912f\u9130\u9131\u9132\u9133\u9134\u9135\u9136\u9137\u9138\u9139\u913a\u913b\u913c\u913d\u913e\u913f\u9140\u9141\u9142\u9143\u9144\u9145\u9146\u9147\u9148\u9149\u914a\u914b\u914c\u914d\u914e\u914f\u9150\u9151\u9152\u9153\u9154\u9155\u9156\u9157\u9158\u9159\u915a\u915b\u915c\u915d\u915e\u915f\u9160\u9161\u9162\u9163\u9164\u9165\u9166\u9167\u9168\u9169\u916a\u916b\u916c\u916d\u916e\u916f\u9170\u9171\u9172\u9173\u9174\u9175\u9176\u9177\u9178\u9179\u917a\u917b\u917c\u917d\u917e\u917f\u9180\u9181\u9182\u9183\u9184\u9185\u9186\u9187\u9188\u9189\u918a\u918b\u918c\u918d\u918e\u918f\u9190\u9191\u9192\u9193\u9194\u9195\u9196\u9197\u9198\u9199\u919a\u919b\u919c\u919d\u919e\u919f\u91a0\u91a1\u91a2\u91a3\u91a4\u91a5\u91a6\u91a7\u91a8\u91a9\u91aa\u91ab\u91ac\u91ad\u91ae\u91af\u91b0\u91b1\u91b2\u91b3\u91b4\u91b5\u91b6\u91b7\u91b8\u91b9\u91ba\u91bb\u91bc\u91bd\u91be\u91bf\u91c0\u91c1\u91c2\u91c3\u91c4\u91c5\u91c6\u91c7\u91c8\u91c9\u91ca\u91cb\u91cc\u91cd\u91ce\u91cf\u91d0\u91d1\u91d2\u91d3\u91d4\u91d5\u91d6\u91d7\u91d8\u91d9\u91da\u91db\u91dc\u91dd\u91de\u91df\u91e0\u91e1\u91e2\u91e3\u91e4\u91e5\u91e6\u91e7\u91e8\u91e9\u91ea\u91eb\u91ec\u91ed\u91ee\u91ef\u91f0\u91f1\u91f2\u91f3\u91f4\u91f5\u91f6\u91f7\u91f8\u91f9\u91fa\u91fb\u91fc\u91fd\u91fe\u91ff\u9200\u9201\u9202\u9203\u9204\u9205\u9206\u9207\u9208\u9209\u920a\u920b\u920c\u920d\u920e\u920f\u9210\u9211\u9212\u9213\u9214\u9215\u9216\u9217\u9218\u9219\u921a\u921b\u921c\u921d\u921e\u921f\u9220\u9221\u9222\u9223\u9224\u9225\u9226\u9227\u9228\u9229\u922a\u922b\u922c\u922d\u922e\u922f\u9230\u9231\u9232\u9233\u9234\u9235\u9236\u9237\u9238\u9239\u923a\u923b\u923c\u923d\u923e\u923f\u9240\u9241\u9242\u9243\u9244\u9245\u9246\u9247\u9248\u9249\u924a\u924b\u924c\u924d\u924e\u924f\u9250\u9251\u9252\u9253\u9254\u9255\u9256\u9257\u9258\u9259\u925a\u925b\u925c\u925d\u925e\u925f\u9260\u9261\u9262\u9263\u9264\u9265\u9266\u9267\u9268\u9269\u926a\u926b\u926c\u926d\u926e\u926f\u9270\u9271\u9272\u9273\u9274\u9275\u9276\u9277\u9278\u9279\u927a\u927b\u927c\u927d\u927e\u927f\u9280\u9281\u9282\u9283\u9284\u9285\u9286\u9287\u9288\u9289\u928a\u928b\u928c\u928d\u928e\u928f\u9290\u9291\u9292\u9293\u9294\u9295\u9296\u9297\u9298\u9299\u929a\u929b\u929c\u929d\u929e\u929f\u92a0\u92a1\u92a2\u92a3\u92a4\u92a5\u92a6\u92a7\u92a8\u92a9\u92aa\u92ab\u92ac\u92ad\u92ae\u92af\u92b0\u92b1\u92b2\u92b3\u92b4\u92b5\u92b6\u92b7\u92b8\u92b9\u92ba\u92bb\u92bc\u92bd\u92be\u92bf\u92c0\u92c1\u92c2\u92c3\u92c4\u92c5\u92c6\u92c7\u92c8\u92c9\u92ca\u92cb\u92cc\u92cd\u92ce\u92cf\u92d0\u92d1\u92d2\u92d3\u92d4\u92d5\u92d6\u92d7\u92d8\u92d9\u92da\u92db\u92dc\u92dd\u92de\u92df\u92e0\u92e1\u92e2\u92e3\u92e4\u92e5\u92e6\u92e7\u92e8\u92e9\u92ea\u92eb\u92ec\u92ed\u92ee\u92ef\u92f0\u92f1\u92f2\u92f3\u92f4\u92f5\u92f6\u92f7\u92f8\u92f9\u92fa\u92fb\u92fc\u92fd\u92fe\u92ff\u9300\u9301\u9302\u9303\u9304\u9305\u9306\u9307\u9308\u9309\u930a\u930b\u930c\u930d\u930e\u930f\u9310\u9311\u9312\u9313\u9314\u9315\u9316\u9317\u9318\u9319\u931a\u931b\u931c\u931d\u931e\u931f\u9320\u9321\u9322\u9323\u9324\u9325\u9326\u9327\u9328\u9329\u932a\u932b\u932c\u932d\u932e\u932f\u9330\u9331\u9332\u9333\u9334\u9335\u9336\u9337\u9338\u9339\u933a\u933b\u933c\u933d\u933e\u933f\u9340\u9341\u9342\u9343\u9344\u9345\u9346\u9347\u9348\u9349\u934a\u934b\u934c\u934d\u934e\u934f\u9350\u9351\u9352\u9353\u9354\u9355\u9356\u9357\u9358\u9359\u935a\u935b\u935c\u935d\u935e\u935f\u9360\u9361\u9362\u9363\u9364\u9365\u9366\u9367\u9368\u9369\u936a\u936b\u936c\u936d\u936e\u936f\u9370\u9371\u9372\u9373\u9374\u9375\u9376\u9377\u9378\u9379\u937a\u937b\u937c\u937d\u937e\u937f\u9380\u9381\u9382\u9383\u9384\u9385\u9386\u9387\u9388\u9389\u938a\u938b\u938c\u938d\u938e\u938f\u9390\u9391\u9392\u9393\u9394\u9395\u9396\u9397\u9398\u9399\u939a\u939b\u939c\u939d\u939e\u939f\u93a0\u93a1\u93a2\u93a3\u93a4\u93a5\u93a6\u93a7\u93a8\u93a9\u93aa\u93ab\u93ac\u93ad\u93ae\u93af\u93b0\u93b1\u93b2\u93b3\u93b4\u93b5\u93b6\u93b7\u93b8\u93b9\u93ba\u93bb\u93bc\u93bd\u93be\u93bf\u93c0\u93c1\u93c2\u93c3\u93c4\u93c5\u93c6\u93c7\u93c8\u93c9\u93ca\u93cb\u93cc\u93cd\u93ce\u93cf\u93d0\u93d1\u93d2\u93d3\u93d4\u93d5\u93d6\u93d7\u93d8\u93d9\u93da\u93db\u93dc\u93dd\u93de\u93df\u93e0\u93e1\u93e2\u93e3\u93e4\u93e5\u93e6\u93e7\u93e8\u93e9\u93ea\u93eb\u93ec\u93ed\u93ee\u93ef\u93f0\u93f1\u93f2\u93f3\u93f4\u93f5\u93f6\u93f7\u93f8\u93f9\u93fa\u93fb\u93fc\u93fd\u93fe\u93ff\u9400\u9401\u9402\u9403\u9404\u9405\u9406\u9407\u9408\u9409\u940a\u940b\u940c\u940d\u940e\u940f\u9410\u9411\u9412\u9413\u9414\u9415\u9416\u9417\u9418\u9419\u941a\u941b\u941c\u941d\u941e\u941f\u9420\u9421\u9422\u9423\u9424\u9425\u9426\u9427\u9428\u9429\u942a\u942b\u942c\u942d\u942e\u942f\u9430\u9431\u9432\u9433\u9434\u9435\u9436\u9437\u9438\u9439\u943a\u943b\u943c\u943d\u943e\u943f\u9440\u9441\u9442\u9443\u9444\u9445\u9446\u9447\u9448\u9449\u944a\u944b\u944c\u944d\u944e\u944f\u9450\u9451\u9452\u9453\u9454\u9455\u9456\u9457\u9458\u9459\u945a\u945b\u945c\u945d\u945e\u945f\u9460\u9461\u9462\u9463\u9464\u9465\u9466\u9467\u9468\u9469\u946a\u946b\u946c\u946d\u946e\u946f\u9470\u9471\u9472\u9473\u9474\u9475\u9476\u9477\u9478\u9479\u947a\u947b\u947c\u947d\u947e\u947f\u9480\u9481\u9482\u9483\u9484\u9485\u9486\u9487\u9488\u9489\u948a\u948b\u948c\u948d\u948e\u948f\u9490\u9491\u9492\u9493\u9494\u9495\u9496\u9497\u9498\u9499\u949a\u949b\u949c\u949d\u949e\u949f\u94a0\u94a1\u94a2\u94a3\u94a4\u94a5\u94a6\u94a7\u94a8\u94a9\u94aa\u94ab\u94ac\u94ad\u94ae\u94af\u94b0\u94b1\u94b2\u94b3\u94b4\u94b5\u94b6\u94b7\u94b8\u94b9\u94ba\u94bb\u94bc\u94bd\u94be\u94bf\u94c0\u94c1\u94c2\u94c3\u94c4\u94c5\u94c6\u94c7\u94c8\u94c9\u94ca\u94cb\u94cc\u94cd\u94ce\u94cf\u94d0\u94d1\u94d2\u94d3\u94d4\u94d5\u94d6\u94d7\u94d8\u94d9\u94da\u94db\u94dc\u94dd\u94de\u94df\u94e0\u94e1\u94e2\u94e3\u94e4\u94e5\u94e6\u94e7\u94e8\u94e9\u94ea\u94eb\u94ec\u94ed\u94ee\u94ef\u94f0\u94f1\u94f2\u94f3\u94f4\u94f5\u94f6\u94f7\u94f8\u94f9\u94fa\u94fb\u94fc\u94fd\u94fe\u94ff\u9500\u9501\u9502\u9503\u9504\u9505\u9506\u9507\u9508\u9509\u950a\u950b\u950c\u950d\u950e\u950f\u9510\u9511\u9512\u9513\u9514\u9515\u9516\u9517\u9518\u9519\u951a\u951b\u951c\u951d\u951e\u951f\u9520\u9521\u9522\u9523\u9524\u9525\u9526\u9527\u9528\u9529\u952a\u952b\u952c\u952d\u952e\u952f\u9530\u9531\u9532\u9533\u9534\u9535\u9536\u9537\u9538\u9539\u953a\u953b\u953c\u953d\u953e\u953f\u9540\u9541\u9542\u9543\u9544\u9545\u9546\u9547\u9548\u9549\u954a\u954b\u954c\u954d\u954e\u954f\u9550\u9551\u9552\u9553\u9554\u9555\u9556\u9557\u9558\u9559\u955a\u955b\u955c\u955d\u955e\u955f\u9560\u9561\u9562\u9563\u9564\u9565\u9566\u9567\u9568\u9569\u956a\u956b\u956c\u956d\u956e\u956f\u9570\u9571\u9572\u9573\u9574\u9575\u9576\u9577\u9578\u9579\u957a\u957b\u957c\u957d\u957e\u957f\u9580\u9581\u9582\u9583\u9584\u9585\u9586\u9587\u9588\u9589\u958a\u958b\u958c\u958d\u958e\u958f\u9590\u9591\u9592\u9593\u9594\u9595\u9596\u9597\u9598\u9599\u959a\u959b\u959c\u959d\u959e\u959f\u95a0\u95a1\u95a2\u95a3\u95a4\u95a5\u95a6\u95a7\u95a8\u95a9\u95aa\u95ab\u95ac\u95ad\u95ae\u95af\u95b0\u95b1\u95b2\u95b3\u95b4\u95b5\u95b6\u95b7\u95b8\u95b9\u95ba\u95bb\u95bc\u95bd\u95be\u95bf\u95c0\u95c1\u95c2\u95c3\u95c4\u95c5\u95c6\u95c7\u95c8\u95c9\u95ca\u95cb\u95cc\u95cd\u95ce\u95cf\u95d0\u95d1\u95d2\u95d3\u95d4\u95d5\u95d6\u95d7\u95d8\u95d9\u95da\u95db\u95dc\u95dd\u95de\u95df\u95e0\u95e1\u95e2\u95e3\u95e4\u95e5\u95e6\u95e7\u95e8\u95e9\u95ea\u95eb\u95ec\u95ed\u95ee\u95ef\u95f0\u95f1\u95f2\u95f3\u95f4\u95f5\u95f6\u95f7\u95f8\u95f9\u95fa\u95fb\u95fc\u95fd\u95fe\u95ff\u9600\u9601\u9602\u9603\u9604\u9605\u9606\u9607\u9608\u9609\u960a\u960b\u960c\u960d\u960e\u960f\u9610\u9611\u9612\u9613\u9614\u9615\u9616\u9617\u9618\u9619\u961a\u961b\u961c\u961d\u961e\u961f\u9620\u9621\u9622\u9623\u9624\u9625\u9626\u9627\u9628\u9629\u962a\u962b\u962c\u962d\u962e\u962f\u9630\u9631\u9632\u9633\u9634\u9635\u9636\u9637\u9638\u9639\u963a\u963b\u963c\u963d\u963e\u963f\u9640\u9641\u9642\u9643\u9644\u9645\u9646\u9647\u9648\u9649\u964a\u964b\u964c\u964d\u964e\u964f\u9650\u9651\u9652\u9653\u9654\u9655\u9656\u9657\u9658\u9659\u965a\u965b\u965c\u965d\u965e\u965f\u9660\u9661\u9662\u9663\u9664\u9665\u9666\u9667\u9668\u9669\u966a\u966b\u966c\u966d\u966e\u966f\u9670\u9671\u9672\u9673\u9674\u9675\u9676\u9677\u9678\u9679\u967a\u967b\u967c\u967d\u967e\u967f\u9680\u9681\u9682\u9683\u9684\u9685\u9686\u9687\u9688\u9689\u968a\u968b\u968c\u968d\u968e\u968f\u9690\u9691\u9692\u9693\u9694\u9695\u9696\u9697\u9698\u9699\u969a\u969b\u969c\u969d\u969e\u969f\u96a0\u96a1\u96a2\u96a3\u96a4\u96a5\u96a6\u96a7\u96a8\u96a9\u96aa\u96ab\u96ac\u96ad\u96ae\u96af\u96b0\u96b1\u96b2\u96b3\u96b4\u96b5\u96b6\u96b7\u96b8\u96b9\u96ba\u96bb\u96bc\u96bd\u96be\u96bf\u96c0\u96c1\u96c2\u96c3\u96c4\u96c5\u96c6\u96c7\u96c8\u96c9\u96ca\u96cb\u96cc\u96cd\u96ce\u96cf\u96d0\u96d1\u96d2\u96d3\u96d4\u96d5\u96d6\u96d7\u96d8\u96d9\u96da\u96db\u96dc\u96dd\u96de\u96df\u96e0\u96e1\u96e2\u96e3\u96e4\u96e5\u96e6\u96e7\u96e8\u96e9\u96ea\u96eb\u96ec\u96ed\u96ee\u96ef\u96f0\u96f1\u96f2\u96f3\u96f4\u96f5\u96f6\u96f7\u96f8\u96f9\u96fa\u96fb\u96fc\u96fd\u96fe\u96ff\u9700\u9701\u9702\u9703\u9704\u9705\u9706\u9707\u9708\u9709\u970a\u970b\u970c\u970d\u970e\u970f\u9710\u9711\u9712\u9713\u9714\u9715\u9716\u9717\u9718\u9719\u971a\u971b\u971c\u971d\u971e\u971f\u9720\u9721\u9722\u9723\u9724\u9725\u9726\u9727\u9728\u9729\u972a\u972b\u972c\u972d\u972e\u972f\u9730\u9731\u9732\u9733\u9734\u9735\u9736\u9737\u9738\u9739\u973a\u973b\u973c\u973d\u973e\u973f\u9740\u9741\u9742\u9743\u9744\u9745\u9746\u9747\u9748\u9749\u974a\u974b\u974c\u974d\u974e\u974f\u9750\u9751\u9752\u9753\u9754\u9755\u9756\u9757\u9758\u9759\u975a\u975b\u975c\u975d\u975e\u975f\u9760\u9761\u9762\u9763\u9764\u9765\u9766\u9767\u9768\u9769\u976a\u976b\u976c\u976d\u976e\u976f\u9770\u9771\u9772\u9773\u9774\u9775\u9776\u9777\u9778\u9779\u977a\u977b\u977c\u977d\u977e\u977f\u9780\u9781\u9782\u9783\u9784\u9785\u9786\u9787\u9788\u9789\u978a\u978b\u978c\u978d\u978e\u978f\u9790\u9791\u9792\u9793\u9794\u9795\u9796\u9797\u9798\u9799\u979a\u979b\u979c\u979d\u979e\u979f\u97a0\u97a1\u97a2\u97a3\u97a4\u97a5\u97a6\u97a7\u97a8\u97a9\u97aa\u97ab\u97ac\u97ad\u97ae\u97af\u97b0\u97b1\u97b2\u97b3\u97b4\u97b5\u97b6\u97b7\u97b8\u97b9\u97ba\u97bb\u97bc\u97bd\u97be\u97bf\u97c0\u97c1\u97c2\u97c3\u97c4\u97c5\u97c6\u97c7\u97c8\u97c9\u97ca\u97cb\u97cc\u97cd\u97ce\u97cf\u97d0\u97d1\u97d2\u97d3\u97d4\u97d5\u97d6\u97d7\u97d8\u97d9\u97da\u97db\u97dc\u97dd\u97de\u97df\u97e0\u97e1\u97e2\u97e3\u97e4\u97e5\u97e6\u97e7\u97e8\u97e9\u97ea\u97eb\u97ec\u97ed\u97ee\u97ef\u97f0\u97f1\u97f2\u97f3\u97f4\u97f5\u97f6\u97f7\u97f8\u97f9\u97fa\u97fb\u97fc\u97fd\u97fe\u97ff\u9800\u9801\u9802\u9803\u9804\u9805\u9806\u9807\u9808\u9809\u980a\u980b\u980c\u980d\u980e\u980f\u9810\u9811\u9812\u9813\u9814\u9815\u9816\u9817\u9818\u9819\u981a\u981b\u981c\u981d\u981e\u981f\u9820\u9821\u9822\u9823\u9824\u9825\u9826\u9827\u9828\u9829\u982a\u982b\u982c\u982d\u982e\u982f\u9830\u9831\u9832\u9833\u9834\u9835\u9836\u9837\u9838\u9839\u983a\u983b\u983c\u983d\u983e\u983f\u9840\u9841\u9842\u9843\u9844\u9845\u9846\u9847\u9848\u9849\u984a\u984b\u984c\u984d\u984e\u984f\u9850\u9851\u9852\u9853\u9854\u9855\u9856\u9857\u9858\u9859\u985a\u985b\u985c\u985d\u985e\u985f\u9860\u9861\u9862\u9863\u9864\u9865\u9866\u9867\u9868\u9869\u986a\u986b\u986c\u986d\u986e\u986f\u9870\u9871\u9872\u9873\u9874\u9875\u9876\u9877\u9878\u9879\u987a\u987b\u987c\u987d\u987e\u987f\u9880\u9881\u9882\u9883\u9884\u9885\u9886\u9887\u9888\u9889\u988a\u988b\u988c\u988d\u988e\u988f\u9890\u9891\u9892\u9893\u9894\u9895\u9896\u9897\u9898\u9899\u989a\u989b\u989c\u989d\u989e\u989f\u98a0\u98a1\u98a2\u98a3\u98a4\u98a5\u98a6\u98a7\u98a8\u98a9\u98aa\u98ab\u98ac\u98ad\u98ae\u98af\u98b0\u98b1\u98b2\u98b3\u98b4\u98b5\u98b6\u98b7\u98b8\u98b9\u98ba\u98bb\u98bc\u98bd\u98be\u98bf\u98c0\u98c1\u98c2\u98c3\u98c4\u98c5\u98c6\u98c7\u98c8\u98c9\u98ca\u98cb\u98cc\u98cd\u98ce\u98cf\u98d0\u98d1\u98d2\u98d3\u98d4\u98d5\u98d6\u98d7\u98d8\u98d9\u98da\u98db\u98dc\u98dd\u98de\u98df\u98e0\u98e1\u98e2\u98e3\u98e4\u98e5\u98e6\u98e7\u98e8\u98e9\u98ea\u98eb\u98ec\u98ed\u98ee\u98ef\u98f0\u98f1\u98f2\u98f3\u98f4\u98f5\u98f6\u98f7\u98f8\u98f9\u98fa\u98fb\u98fc\u98fd\u98fe\u98ff\u9900\u9901\u9902\u9903\u9904\u9905\u9906\u9907\u9908\u9909\u990a\u990b\u990c\u990d\u990e\u990f\u9910\u9911\u9912\u9913\u9914\u9915\u9916\u9917\u9918\u9919\u991a\u991b\u991c\u991d\u991e\u991f\u9920\u9921\u9922\u9923\u9924\u9925\u9926\u9927\u9928\u9929\u992a\u992b\u992c\u992d\u992e\u992f\u9930\u9931\u9932\u9933\u9934\u9935\u9936\u9937\u9938\u9939\u993a\u993b\u993c\u993d\u993e\u993f\u9940\u9941\u9942\u9943\u9944\u9945\u9946\u9947\u9948\u9949\u994a\u994b\u994c\u994d\u994e\u994f\u9950\u9951\u9952\u9953\u9954\u9955\u9956\u9957\u9958\u9959\u995a\u995b\u995c\u995d\u995e\u995f\u9960\u9961\u9962\u9963\u9964\u9965\u9966\u9967\u9968\u9969\u996a\u996b\u996c\u996d\u996e\u996f\u9970\u9971\u9972\u9973\u9974\u9975\u9976\u9977\u9978\u9979\u997a\u997b\u997c\u997d\u997e\u997f\u9980\u9981\u9982\u9983\u9984\u9985\u9986\u9987\u9988\u9989\u998a\u998b\u998c\u998d\u998e\u998f\u9990\u9991\u9992\u9993\u9994\u9995\u9996\u9997\u9998\u9999\u999a\u999b\u999c\u999d\u999e\u999f\u99a0\u99a1\u99a2\u99a3\u99a4\u99a5\u99a6\u99a7\u99a8\u99a9\u99aa\u99ab\u99ac\u99ad\u99ae\u99af\u99b0\u99b1\u99b2\u99b3\u99b4\u99b5\u99b6\u99b7\u99b8\u99b9\u99ba\u99bb\u99bc\u99bd\u99be\u99bf\u99c0\u99c1\u99c2\u99c3\u99c4\u99c5\u99c6\u99c7\u99c8\u99c9\u99ca\u99cb\u99cc\u99cd\u99ce\u99cf\u99d0\u99d1\u99d2\u99d3\u99d4\u99d5\u99d6\u99d7\u99d8\u99d9\u99da\u99db\u99dc\u99dd\u99de\u99df\u99e0\u99e1\u99e2\u99e3\u99e4\u99e5\u99e6\u99e7\u99e8\u99e9\u99ea\u99eb\u99ec\u99ed\u99ee\u99ef\u99f0\u99f1\u99f2\u99f3\u99f4\u99f5\u99f6\u99f7\u99f8\u99f9\u99fa\u99fb\u99fc\u99fd\u99fe\u99ff\u9a00\u9a01\u9a02\u9a03\u9a04\u9a05\u9a06\u9a07\u9a08\u9a09\u9a0a\u9a0b\u9a0c\u9a0d\u9a0e\u9a0f\u9a10\u9a11\u9a12\u9a13\u9a14\u9a15\u9a16\u9a17\u9a18\u9a19\u9a1a\u9a1b\u9a1c\u9a1d\u9a1e\u9a1f\u9a20\u9a21\u9a22\u9a23\u9a24\u9a25\u9a26\u9a27\u9a28\u9a29\u9a2a\u9a2b\u9a2c\u9a2d\u9a2e\u9a2f\u9a30\u9a31\u9a32\u9a33\u9a34\u9a35\u9a36\u9a37\u9a38\u9a39\u9a3a\u9a3b\u9a3c\u9a3d\u9a3e\u9a3f\u9a40\u9a41\u9a42\u9a43\u9a44\u9a45\u9a46\u9a47\u9a48\u9a49\u9a4a\u9a4b\u9a4c\u9a4d\u9a4e\u9a4f\u9a50\u9a51\u9a52\u9a53\u9a54\u9a55\u9a56\u9a57\u9a58\u9a59\u9a5a\u9a5b\u9a5c\u9a5d\u9a5e\u9a5f\u9a60\u9a61\u9a62\u9a63\u9a64\u9a65\u9a66\u9a67\u9a68\u9a69\u9a6a\u9a6b\u9a6c\u9a6d\u9a6e\u9a6f\u9a70\u9a71\u9a72\u9a73\u9a74\u9a75\u9a76\u9a77\u9a78\u9a79\u9a7a\u9a7b\u9a7c\u9a7d\u9a7e\u9a7f\u9a80\u9a81\u9a82\u9a83\u9a84\u9a85\u9a86\u9a87\u9a88\u9a89\u9a8a\u9a8b\u9a8c\u9a8d\u9a8e\u9a8f\u9a90\u9a91\u9a92\u9a93\u9a94\u9a95\u9a96\u9a97\u9a98\u9a99\u9a9a\u9a9b\u9a9c\u9a9d\u9a9e\u9a9f\u9aa0\u9aa1\u9aa2\u9aa3\u9aa4\u9aa5\u9aa6\u9aa7\u9aa8\u9aa9\u9aaa\u9aab\u9aac\u9aad\u9aae\u9aaf\u9ab0\u9ab1\u9ab2\u9ab3\u9ab4\u9ab5\u9ab6\u9ab7\u9ab8\u9ab9\u9aba\u9abb\u9abc\u9abd\u9abe\u9abf\u9ac0\u9ac1\u9ac2\u9ac3\u9ac4\u9ac5\u9ac6\u9ac7\u9ac8\u9ac9\u9aca\u9acb\u9acc\u9acd\u9ace\u9acf\u9ad0\u9ad1\u9ad2\u9ad3\u9ad4\u9ad5\u9ad6\u9ad7\u9ad8\u9ad9\u9ada\u9adb\u9adc\u9add\u9ade\u9adf\u9ae0\u9ae1\u9ae2\u9ae3\u9ae4\u9ae5\u9ae6\u9ae7\u9ae8\u9ae9\u9aea\u9aeb\u9aec\u9aed\u9aee\u9aef\u9af0\u9af1\u9af2\u9af3\u9af4\u9af5\u9af6\u9af7\u9af8\u9af9\u9afa\u9afb\u9afc\u9afd\u9afe\u9aff\u9b00\u9b01\u9b02\u9b03\u9b04\u9b05\u9b06\u9b07\u9b08\u9b09\u9b0a\u9b0b\u9b0c\u9b0d\u9b0e\u9b0f\u9b10\u9b11\u9b12\u9b13\u9b14\u9b15\u9b16\u9b17\u9b18\u9b19\u9b1a\u9b1b\u9b1c\u9b1d\u9b1e\u9b1f\u9b20\u9b21\u9b22\u9b23\u9b24\u9b25\u9b26\u9b27\u9b28\u9b29\u9b2a\u9b2b\u9b2c\u9b2d\u9b2e\u9b2f\u9b30\u9b31\u9b32\u9b33\u9b34\u9b35\u9b36\u9b37\u9b38\u9b39\u9b3a\u9b3b\u9b3c\u9b3d\u9b3e\u9b3f\u9b40\u9b41\u9b42\u9b43\u9b44\u9b45\u9b46\u9b47\u9b48\u9b49\u9b4a\u9b4b\u9b4c\u9b4d\u9b4e\u9b4f\u9b50\u9b51\u9b52\u9b53\u9b54\u9b55\u9b56\u9b57\u9b58\u9b59\u9b5a\u9b5b\u9b5c\u9b5d\u9b5e\u9b5f\u9b60\u9b61\u9b62\u9b63\u9b64\u9b65\u9b66\u9b67\u9b68\u9b69\u9b6a\u9b6b\u9b6c\u9b6d\u9b6e\u9b6f\u9b70\u9b71\u9b72\u9b73\u9b74\u9b75\u9b76\u9b77\u9b78\u9b79\u9b7a\u9b7b\u9b7c\u9b7d\u9b7e\u9b7f\u9b80\u9b81\u9b82\u9b83\u9b84\u9b85\u9b86\u9b87\u9b88\u9b89\u9b8a\u9b8b\u9b8c\u9b8d\u9b8e\u9b8f\u9b90\u9b91\u9b92\u9b93\u9b94\u9b95\u9b96\u9b97\u9b98\u9b99\u9b9a\u9b9b\u9b9c\u9b9d\u9b9e\u9b9f\u9ba0\u9ba1\u9ba2\u9ba3\u9ba4\u9ba5\u9ba6\u9ba7\u9ba8\u9ba9\u9baa\u9bab\u9bac\u9bad\u9bae\u9baf\u9bb0\u9bb1\u9bb2\u9bb3\u9bb4\u9bb5\u9bb6\u9bb7\u9bb8\u9bb9\u9bba\u9bbb\u9bbc\u9bbd\u9bbe\u9bbf\u9bc0\u9bc1\u9bc2\u9bc3\u9bc4\u9bc5\u9bc6\u9bc7\u9bc8\u9bc9\u9bca\u9bcb\u9bcc\u9bcd\u9bce\u9bcf\u9bd0\u9bd1\u9bd2\u9bd3\u9bd4\u9bd5\u9bd6\u9bd7\u9bd8\u9bd9\u9bda\u9bdb\u9bdc\u9bdd\u9bde\u9bdf\u9be0\u9be1\u9be2\u9be3\u9be4\u9be5\u9be6\u9be7\u9be8\u9be9\u9bea\u9beb\u9bec\u9bed\u9bee\u9bef\u9bf0\u9bf1\u9bf2\u9bf3\u9bf4\u9bf5\u9bf6\u9bf7\u9bf8\u9bf9\u9bfa\u9bfb\u9bfc\u9bfd\u9bfe\u9bff\u9c00\u9c01\u9c02\u9c03\u9c04\u9c05\u9c06\u9c07\u9c08\u9c09\u9c0a\u9c0b\u9c0c\u9c0d\u9c0e\u9c0f\u9c10\u9c11\u9c12\u9c13\u9c14\u9c15\u9c16\u9c17\u9c18\u9c19\u9c1a\u9c1b\u9c1c\u9c1d\u9c1e\u9c1f\u9c20\u9c21\u9c22\u9c23\u9c24\u9c25\u9c26\u9c27\u9c28\u9c29\u9c2a\u9c2b\u9c2c\u9c2d\u9c2e\u9c2f\u9c30\u9c31\u9c32\u9c33\u9c34\u9c35\u9c36\u9c37\u9c38\u9c39\u9c3a\u9c3b\u9c3c\u9c3d\u9c3e\u9c3f\u9c40\u9c41\u9c42\u9c43\u9c44\u9c45\u9c46\u9c47\u9c48\u9c49\u9c4a\u9c4b\u9c4c\u9c4d\u9c4e\u9c4f\u9c50\u9c51\u9c52\u9c53\u9c54\u9c55\u9c56\u9c57\u9c58\u9c59\u9c5a\u9c5b\u9c5c\u9c5d\u9c5e\u9c5f\u9c60\u9c61\u9c62\u9c63\u9c64\u9c65\u9c66\u9c67\u9c68\u9c69\u9c6a\u9c6b\u9c6c\u9c6d\u9c6e\u9c6f\u9c70\u9c71\u9c72\u9c73\u9c74\u9c75\u9c76\u9c77\u9c78\u9c79\u9c7a\u9c7b\u9c7c\u9c7d\u9c7e\u9c7f\u9c80\u9c81\u9c82\u9c83\u9c84\u9c85\u9c86\u9c87\u9c88\u9c89\u9c8a\u9c8b\u9c8c\u9c8d\u9c8e\u9c8f\u9c90\u9c91\u9c92\u9c93\u9c94\u9c95\u9c96\u9c97\u9c98\u9c99\u9c9a\u9c9b\u9c9c\u9c9d\u9c9e\u9c9f\u9ca0\u9ca1\u9ca2\u9ca3\u9ca4\u9ca5\u9ca6\u9ca7\u9ca8\u9ca9\u9caa\u9cab\u9cac\u9cad\u9cae\u9caf\u9cb0\u9cb1\u9cb2\u9cb3\u9cb4\u9cb5\u9cb6\u9cb7\u9cb8\u9cb9\u9cba\u9cbb\u9cbc\u9cbd\u9cbe\u9cbf\u9cc0\u9cc1\u9cc2\u9cc3\u9cc4\u9cc5\u9cc6\u9cc7\u9cc8\u9cc9\u9cca\u9ccb\u9ccc\u9ccd\u9cce\u9ccf\u9cd0\u9cd1\u9cd2\u9cd3\u9cd4\u9cd5\u9cd6\u9cd7\u9cd8\u9cd9\u9cda\u9cdb\u9cdc\u9cdd\u9cde\u9cdf\u9ce0\u9ce1\u9ce2\u9ce3\u9ce4\u9ce5\u9ce6\u9ce7\u9ce8\u9ce9\u9cea\u9ceb\u9cec\u9ced\u9cee\u9cef\u9cf0\u9cf1\u9cf2\u9cf3\u9cf4\u9cf5\u9cf6\u9cf7\u9cf8\u9cf9\u9cfa\u9cfb\u9cfc\u9cfd\u9cfe\u9cff\u9d00\u9d01\u9d02\u9d03\u9d04\u9d05\u9d06\u9d07\u9d08\u9d09\u9d0a\u9d0b\u9d0c\u9d0d\u9d0e\u9d0f\u9d10\u9d11\u9d12\u9d13\u9d14\u9d15\u9d16\u9d17\u9d18\u9d19\u9d1a\u9d1b\u9d1c\u9d1d\u9d1e\u9d1f\u9d20\u9d21\u9d22\u9d23\u9d24\u9d25\u9d26\u9d27\u9d28\u9d29\u9d2a\u9d2b\u9d2c\u9d2d\u9d2e\u9d2f\u9d30\u9d31\u9d32\u9d33\u9d34\u9d35\u9d36\u9d37\u9d38\u9d39\u9d3a\u9d3b\u9d3c\u9d3d\u9d3e\u9d3f\u9d40\u9d41\u9d42\u9d43\u9d44\u9d45\u9d46\u9d47\u9d48\u9d49\u9d4a\u9d4b\u9d4c\u9d4d\u9d4e\u9d4f\u9d50\u9d51\u9d52\u9d53\u9d54\u9d55\u9d56\u9d57\u9d58\u9d59\u9d5a\u9d5b\u9d5c\u9d5d\u9d5e\u9d5f\u9d60\u9d61\u9d62\u9d63\u9d64\u9d65\u9d66\u9d67\u9d68\u9d69\u9d6a\u9d6b\u9d6c\u9d6d\u9d6e\u9d6f\u9d70\u9d71\u9d72\u9d73\u9d74\u9d75\u9d76\u9d77\u9d78\u9d79\u9d7a\u9d7b\u9d7c\u9d7d\u9d7e\u9d7f\u9d80\u9d81\u9d82\u9d83\u9d84\u9d85\u9d86\u9d87\u9d88\u9d89\u9d8a\u9d8b\u9d8c\u9d8d\u9d8e\u9d8f\u9d90\u9d91\u9d92\u9d93\u9d94\u9d95\u9d96\u9d97\u9d98\u9d99\u9d9a\u9d9b\u9d9c\u9d9d\u9d9e\u9d9f\u9da0\u9da1\u9da2\u9da3\u9da4\u9da5\u9da6\u9da7\u9da8\u9da9\u9daa\u9dab\u9dac\u9dad\u9dae\u9daf\u9db0\u9db1\u9db2\u9db3\u9db4\u9db5\u9db6\u9db7\u9db8\u9db9\u9dba\u9dbb\u9dbc\u9dbd\u9dbe\u9dbf\u9dc0\u9dc1\u9dc2\u9dc3\u9dc4\u9dc5\u9dc6\u9dc7\u9dc8\u9dc9\u9dca\u9dcb\u9dcc\u9dcd\u9dce\u9dcf\u9dd0\u9dd1\u9dd2\u9dd3\u9dd4\u9dd5\u9dd6\u9dd7\u9dd8\u9dd9\u9dda\u9ddb\u9ddc\u9ddd\u9dde\u9ddf\u9de0\u9de1\u9de2\u9de3\u9de4\u9de5\u9de6\u9de7\u9de8\u9de9\u9dea\u9deb\u9dec\u9ded\u9dee\u9def\u9df0\u9df1\u9df2\u9df3\u9df4\u9df5\u9df6\u9df7\u9df8\u9df9\u9dfa\u9dfb\u9dfc\u9dfd\u9dfe\u9dff\u9e00\u9e01\u9e02\u9e03\u9e04\u9e05\u9e06\u9e07\u9e08\u9e09\u9e0a\u9e0b\u9e0c\u9e0d\u9e0e\u9e0f\u9e10\u9e11\u9e12\u9e13\u9e14\u9e15\u9e16\u9e17\u9e18\u9e19\u9e1a\u9e1b\u9e1c\u9e1d\u9e1e\u9e1f\u9e20\u9e21\u9e22\u9e23\u9e24\u9e25\u9e26\u9e27\u9e28\u9e29\u9e2a\u9e2b\u9e2c\u9e2d\u9e2e\u9e2f\u9e30\u9e31\u9e32\u9e33\u9e34\u9e35\u9e36\u9e37\u9e38\u9e39\u9e3a\u9e3b\u9e3c\u9e3d\u9e3e\u9e3f\u9e40\u9e41\u9e42\u9e43\u9e44\u9e45\u9e46\u9e47\u9e48\u9e49\u9e4a\u9e4b\u9e4c\u9e4d\u9e4e\u9e4f\u9e50\u9e51\u9e52\u9e53\u9e54\u9e55\u9e56\u9e57\u9e58\u9e59\u9e5a\u9e5b\u9e5c\u9e5d\u9e5e\u9e5f\u9e60\u9e61\u9e62\u9e63\u9e64\u9e65\u9e66\u9e67\u9e68\u9e69\u9e6a\u9e6b\u9e6c\u9e6d\u9e6e\u9e6f\u9e70\u9e71\u9e72\u9e73\u9e74\u9e75\u9e76\u9e77\u9e78\u9e79\u9e7a\u9e7b\u9e7c\u9e7d\u9e7e\u9e7f\u9e80\u9e81\u9e82\u9e83\u9e84\u9e85\u9e86\u9e87\u9e88\u9e89\u9e8a\u9e8b\u9e8c\u9e8d\u9e8e\u9e8f\u9e90\u9e91\u9e92\u9e93\u9e94\u9e95\u9e96\u9e97\u9e98\u9e99\u9e9a\u9e9b\u9e9c\u9e9d\u9e9e\u9e9f\u9ea0\u9ea1\u9ea2\u9ea3\u9ea4\u9ea5\u9ea6\u9ea7\u9ea8\u9ea9\u9eaa\u9eab\u9eac\u9ead\u9eae\u9eaf\u9eb0\u9eb1\u9eb2\u9eb3\u9eb4\u9eb5\u9eb6\u9eb7\u9eb8\u9eb9\u9eba\u9ebb\u9ebc\u9ebd\u9ebe\u9ebf\u9ec0\u9ec1\u9ec2\u9ec3\u9ec4\u9ec5\u9ec6\u9ec7\u9ec8\u9ec9\u9eca\u9ecb\u9ecc\u9ecd\u9ece\u9ecf\u9ed0\u9ed1\u9ed2\u9ed3\u9ed4\u9ed5\u9ed6\u9ed7\u9ed8\u9ed9\u9eda\u9edb\u9edc\u9edd\u9ede\u9edf\u9ee0\u9ee1\u9ee2\u9ee3\u9ee4\u9ee5\u9ee6\u9ee7\u9ee8\u9ee9\u9eea\u9eeb\u9eec\u9eed\u9eee\u9eef\u9ef0\u9ef1\u9ef2\u9ef3\u9ef4\u9ef5\u9ef6\u9ef7\u9ef8\u9ef9\u9efa\u9efb\u9efc\u9efd\u9efe\u9eff\u9f00\u9f01\u9f02\u9f03\u9f04\u9f05\u9f06\u9f07\u9f08\u9f09\u9f0a\u9f0b\u9f0c\u9f0d\u9f0e\u9f0f\u9f10\u9f11\u9f12\u9f13\u9f14\u9f15\u9f16\u9f17\u9f18\u9f19\u9f1a\u9f1b\u9f1c\u9f1d\u9f1e\u9f1f\u9f20\u9f21\u9f22\u9f23\u9f24\u9f25\u9f26\u9f27\u9f28\u9f29\u9f2a\u9f2b\u9f2c\u9f2d\u9f2e\u9f2f\u9f30\u9f31\u9f32\u9f33\u9f34\u9f35\u9f36\u9f37\u9f38\u9f39\u9f3a\u9f3b\u9f3c\u9f3d\u9f3e\u9f3f\u9f40\u9f41\u9f42\u9f43\u9f44\u9f45\u9f46\u9f47\u9f48\u9f49\u9f4a\u9f4b\u9f4c\u9f4d\u9f4e\u9f4f\u9f50\u9f51\u9f52\u9f53\u9f54\u9f55\u9f56\u9f57\u9f58\u9f59\u9f5a\u9f5b\u9f5c\u9f5d\u9f5e\u9f5f\u9f60\u9f61\u9f62\u9f63\u9f64\u9f65\u9f66\u9f67\u9f68\u9f69\u9f6a\u9f6b\u9f6c\u9f6d\u9f6e\u9f6f\u9f70\u9f71\u9f72\u9f73\u9f74\u9f75\u9f76\u9f77\u9f78\u9f79\u9f7a\u9f7b\u9f7c\u9f7d\u9f7e\u9f7f\u9f80\u9f81\u9f82\u9f83\u9f84\u9f85\u9f86\u9f87\u9f88\u9f89\u9f8a\u9f8b\u9f8c\u9f8d\u9f8e\u9f8f\u9f90\u9f91\u9f92\u9f93\u9f94\u9f95\u9f96\u9f97\u9f98\u9f99\u9f9a\u9f9b\u9f9c\u9f9d\u9f9e\u9f9f\u9fa0\u9fa1\u9fa2\u9fa3\u9fa4\u9fa5\u9fa6\u9fa7\u9fa8\u9fa9\u9faa\u9fab\u9fac\u9fad\u9fae\u9faf\u9fb0\u9fb1\u9fb2\u9fb3\u9fb4\u9fb5\u9fb6\u9fb7\u9fb8\u9fb9\u9fba\u9fbb\ua000\ua001\ua002\ua003\ua004\ua005\ua006\ua007\ua008\ua009\ua00a\ua00b\ua00c\ua00d\ua00e\ua00f\ua010\ua011\ua012\ua013\ua014\ua016\ua017\ua018\ua019\ua01a\ua01b\ua01c\ua01d\ua01e\ua01f\ua020\ua021\ua022\ua023\ua024\ua025\ua026\ua027\ua028\ua029\ua02a\ua02b\ua02c\ua02d\ua02e\ua02f\ua030\ua031\ua032\ua033\ua034\ua035\ua036\ua037\ua038\ua039\ua03a\ua03b\ua03c\ua03d\ua03e\ua03f\ua040\ua041\ua042\ua043\ua044\ua045\ua046\ua047\ua048\ua049\ua04a\ua04b\ua04c\ua04d\ua04e\ua04f\ua050\ua051\ua052\ua053\ua054\ua055\ua056\ua057\ua058\ua059\ua05a\ua05b\ua05c\ua05d\ua05e\ua05f\ua060\ua061\ua062\ua063\ua064\ua065\ua066\ua067\ua068\ua069\ua06a\ua06b\ua06c\ua06d\ua06e\ua06f\ua070\ua071\ua072\ua073\ua074\ua075\ua076\ua077\ua078\ua079\ua07a\ua07b\ua07c\ua07d\ua07e\ua07f\ua080\ua081\ua082\ua083\ua084\ua085\ua086\ua087\ua088\ua089\ua08a\ua08b\ua08c\ua08d\ua08e\ua08f\ua090\ua091\ua092\ua093\ua094\ua095\ua096\ua097\ua098\ua099\ua09a\ua09b\ua09c\ua09d\ua09e\ua09f\ua0a0\ua0a1\ua0a2\ua0a3\ua0a4\ua0a5\ua0a6\ua0a7\ua0a8\ua0a9\ua0aa\ua0ab\ua0ac\ua0ad\ua0ae\ua0af\ua0b0\ua0b1\ua0b2\ua0b3\ua0b4\ua0b5\ua0b6\ua0b7\ua0b8\ua0b9\ua0ba\ua0bb\ua0bc\ua0bd\ua0be\ua0bf\ua0c0\ua0c1\ua0c2\ua0c3\ua0c4\ua0c5\ua0c6\ua0c7\ua0c8\ua0c9\ua0ca\ua0cb\ua0cc\ua0cd\ua0ce\ua0cf\ua0d0\ua0d1\ua0d2\ua0d3\ua0d4\ua0d5\ua0d6\ua0d7\ua0d8\ua0d9\ua0da\ua0db\ua0dc\ua0dd\ua0de\ua0df\ua0e0\ua0e1\ua0e2\ua0e3\ua0e4\ua0e5\ua0e6\ua0e7\ua0e8\ua0e9\ua0ea\ua0eb\ua0ec\ua0ed\ua0ee\ua0ef\ua0f0\ua0f1\ua0f2\ua0f3\ua0f4\ua0f5\ua0f6\ua0f7\ua0f8\ua0f9\ua0fa\ua0fb\ua0fc\ua0fd\ua0fe\ua0ff\ua100\ua101\ua102\ua103\ua104\ua105\ua106\ua107\ua108\ua109\ua10a\ua10b\ua10c\ua10d\ua10e\ua10f\ua110\ua111\ua112\ua113\ua114\ua115\ua116\ua117\ua118\ua119\ua11a\ua11b\ua11c\ua11d\ua11e\ua11f\ua120\ua121\ua122\ua123\ua124\ua125\ua126\ua127\ua128\ua129\ua12a\ua12b\ua12c\ua12d\ua12e\ua12f\ua130\ua131\ua132\ua133\ua134\ua135\ua136\ua137\ua138\ua139\ua13a\ua13b\ua13c\ua13d\ua13e\ua13f\ua140\ua141\ua142\ua143\ua144\ua145\ua146\ua147\ua148\ua149\ua14a\ua14b\ua14c\ua14d\ua14e\ua14f\ua150\ua151\ua152\ua153\ua154\ua155\ua156\ua157\ua158\ua159\ua15a\ua15b\ua15c\ua15d\ua15e\ua15f\ua160\ua161\ua162\ua163\ua164\ua165\ua166\ua167\ua168\ua169\ua16a\ua16b\ua16c\ua16d\ua16e\ua16f\ua170\ua171\ua172\ua173\ua174\ua175\ua176\ua177\ua178\ua179\ua17a\ua17b\ua17c\ua17d\ua17e\ua17f\ua180\ua181\ua182\ua183\ua184\ua185\ua186\ua187\ua188\ua189\ua18a\ua18b\ua18c\ua18d\ua18e\ua18f\ua190\ua191\ua192\ua193\ua194\ua195\ua196\ua197\ua198\ua199\ua19a\ua19b\ua19c\ua19d\ua19e\ua19f\ua1a0\ua1a1\ua1a2\ua1a3\ua1a4\ua1a5\ua1a6\ua1a7\ua1a8\ua1a9\ua1aa\ua1ab\ua1ac\ua1ad\ua1ae\ua1af\ua1b0\ua1b1\ua1b2\ua1b3\ua1b4\ua1b5\ua1b6\ua1b7\ua1b8\ua1b9\ua1ba\ua1bb\ua1bc\ua1bd\ua1be\ua1bf\ua1c0\ua1c1\ua1c2\ua1c3\ua1c4\ua1c5\ua1c6\ua1c7\ua1c8\ua1c9\ua1ca\ua1cb\ua1cc\ua1cd\ua1ce\ua1cf\ua1d0\ua1d1\ua1d2\ua1d3\ua1d4\ua1d5\ua1d6\ua1d7\ua1d8\ua1d9\ua1da\ua1db\ua1dc\ua1dd\ua1de\ua1df\ua1e0\ua1e1\ua1e2\ua1e3\ua1e4\ua1e5\ua1e6\ua1e7\ua1e8\ua1e9\ua1ea\ua1eb\ua1ec\ua1ed\ua1ee\ua1ef\ua1f0\ua1f1\ua1f2\ua1f3\ua1f4\ua1f5\ua1f6\ua1f7\ua1f8\ua1f9\ua1fa\ua1fb\ua1fc\ua1fd\ua1fe\ua1ff\ua200\ua201\ua202\ua203\ua204\ua205\ua206\ua207\ua208\ua209\ua20a\ua20b\ua20c\ua20d\ua20e\ua20f\ua210\ua211\ua212\ua213\ua214\ua215\ua216\ua217\ua218\ua219\ua21a\ua21b\ua21c\ua21d\ua21e\ua21f\ua220\ua221\ua222\ua223\ua224\ua225\ua226\ua227\ua228\ua229\ua22a\ua22b\ua22c\ua22d\ua22e\ua22f\ua230\ua231\ua232\ua233\ua234\ua235\ua236\ua237\ua238\ua239\ua23a\ua23b\ua23c\ua23d\ua23e\ua23f\ua240\ua241\ua242\ua243\ua244\ua245\ua246\ua247\ua248\ua249\ua24a\ua24b\ua24c\ua24d\ua24e\ua24f\ua250\ua251\ua252\ua253\ua254\ua255\ua256\ua257\ua258\ua259\ua25a\ua25b\ua25c\ua25d\ua25e\ua25f\ua260\ua261\ua262\ua263\ua264\ua265\ua266\ua267\ua268\ua269\ua26a\ua26b\ua26c\ua26d\ua26e\ua26f\ua270\ua271\ua272\ua273\ua274\ua275\ua276\ua277\ua278\ua279\ua27a\ua27b\ua27c\ua27d\ua27e\ua27f\ua280\ua281\ua282\ua283\ua284\ua285\ua286\ua287\ua288\ua289\ua28a\ua28b\ua28c\ua28d\ua28e\ua28f\ua290\ua291\ua292\ua293\ua294\ua295\ua296\ua297\ua298\ua299\ua29a\ua29b\ua29c\ua29d\ua29e\ua29f\ua2a0\ua2a1\ua2a2\ua2a3\ua2a4\ua2a5\ua2a6\ua2a7\ua2a8\ua2a9\ua2aa\ua2ab\ua2ac\ua2ad\ua2ae\ua2af\ua2b0\ua2b1\ua2b2\ua2b3\ua2b4\ua2b5\ua2b6\ua2b7\ua2b8\ua2b9\ua2ba\ua2bb\ua2bc\ua2bd\ua2be\ua2bf\ua2c0\ua2c1\ua2c2\ua2c3\ua2c4\ua2c5\ua2c6\ua2c7\ua2c8\ua2c9\ua2ca\ua2cb\ua2cc\ua2cd\ua2ce\ua2cf\ua2d0\ua2d1\ua2d2\ua2d3\ua2d4\ua2d5\ua2d6\ua2d7\ua2d8\ua2d9\ua2da\ua2db\ua2dc\ua2dd\ua2de\ua2df\ua2e0\ua2e1\ua2e2\ua2e3\ua2e4\ua2e5\ua2e6\ua2e7\ua2e8\ua2e9\ua2ea\ua2eb\ua2ec\ua2ed\ua2ee\ua2ef\ua2f0\ua2f1\ua2f2\ua2f3\ua2f4\ua2f5\ua2f6\ua2f7\ua2f8\ua2f9\ua2fa\ua2fb\ua2fc\ua2fd\ua2fe\ua2ff\ua300\ua301\ua302\ua303\ua304\ua305\ua306\ua307\ua308\ua309\ua30a\ua30b\ua30c\ua30d\ua30e\ua30f\ua310\ua311\ua312\ua313\ua314\ua315\ua316\ua317\ua318\ua319\ua31a\ua31b\ua31c\ua31d\ua31e\ua31f\ua320\ua321\ua322\ua323\ua324\ua325\ua326\ua327\ua328\ua329\ua32a\ua32b\ua32c\ua32d\ua32e\ua32f\ua330\ua331\ua332\ua333\ua334\ua335\ua336\ua337\ua338\ua339\ua33a\ua33b\ua33c\ua33d\ua33e\ua33f\ua340\ua341\ua342\ua343\ua344\ua345\ua346\ua347\ua348\ua349\ua34a\ua34b\ua34c\ua34d\ua34e\ua34f\ua350\ua351\ua352\ua353\ua354\ua355\ua356\ua357\ua358\ua359\ua35a\ua35b\ua35c\ua35d\ua35e\ua35f\ua360\ua361\ua362\ua363\ua364\ua365\ua366\ua367\ua368\ua369\ua36a\ua36b\ua36c\ua36d\ua36e\ua36f\ua370\ua371\ua372\ua373\ua374\ua375\ua376\ua377\ua378\ua379\ua37a\ua37b\ua37c\ua37d\ua37e\ua37f\ua380\ua381\ua382\ua383\ua384\ua385\ua386\ua387\ua388\ua389\ua38a\ua38b\ua38c\ua38d\ua38e\ua38f\ua390\ua391\ua392\ua393\ua394\ua395\ua396\ua397\ua398\ua399\ua39a\ua39b\ua39c\ua39d\ua39e\ua39f\ua3a0\ua3a1\ua3a2\ua3a3\ua3a4\ua3a5\ua3a6\ua3a7\ua3a8\ua3a9\ua3aa\ua3ab\ua3ac\ua3ad\ua3ae\ua3af\ua3b0\ua3b1\ua3b2\ua3b3\ua3b4\ua3b5\ua3b6\ua3b7\ua3b8\ua3b9\ua3ba\ua3bb\ua3bc\ua3bd\ua3be\ua3bf\ua3c0\ua3c1\ua3c2\ua3c3\ua3c4\ua3c5\ua3c6\ua3c7\ua3c8\ua3c9\ua3ca\ua3cb\ua3cc\ua3cd\ua3ce\ua3cf\ua3d0\ua3d1\ua3d2\ua3d3\ua3d4\ua3d5\ua3d6\ua3d7\ua3d8\ua3d9\ua3da\ua3db\ua3dc\ua3dd\ua3de\ua3df\ua3e0\ua3e1\ua3e2\ua3e3\ua3e4\ua3e5\ua3e6\ua3e7\ua3e8\ua3e9\ua3ea\ua3eb\ua3ec\ua3ed\ua3ee\ua3ef\ua3f0\ua3f1\ua3f2\ua3f3\ua3f4\ua3f5\ua3f6\ua3f7\ua3f8\ua3f9\ua3fa\ua3fb\ua3fc\ua3fd\ua3fe\ua3ff\ua400\ua401\ua402\ua403\ua404\ua405\ua406\ua407\ua408\ua409\ua40a\ua40b\ua40c\ua40d\ua40e\ua40f\ua410\ua411\ua412\ua413\ua414\ua415\ua416\ua417\ua418\ua419\ua41a\ua41b\ua41c\ua41d\ua41e\ua41f\ua420\ua421\ua422\ua423\ua424\ua425\ua426\ua427\ua428\ua429\ua42a\ua42b\ua42c\ua42d\ua42e\ua42f\ua430\ua431\ua432\ua433\ua434\ua435\ua436\ua437\ua438\ua439\ua43a\ua43b\ua43c\ua43d\ua43e\ua43f\ua440\ua441\ua442\ua443\ua444\ua445\ua446\ua447\ua448\ua449\ua44a\ua44b\ua44c\ua44d\ua44e\ua44f\ua450\ua451\ua452\ua453\ua454\ua455\ua456\ua457\ua458\ua459\ua45a\ua45b\ua45c\ua45d\ua45e\ua45f\ua460\ua461\ua462\ua463\ua464\ua465\ua466\ua467\ua468\ua469\ua46a\ua46b\ua46c\ua46d\ua46e\ua46f\ua470\ua471\ua472\ua473\ua474\ua475\ua476\ua477\ua478\ua479\ua47a\ua47b\ua47c\ua47d\ua47e\ua47f\ua480\ua481\ua482\ua483\ua484\ua485\ua486\ua487\ua488\ua489\ua48a\ua48b\ua48c\ua800\ua801\ua803\ua804\ua805\ua807\ua808\ua809\ua80a\ua80c\ua80d\ua80e\ua80f\ua810\ua811\ua812\ua813\ua814\ua815\ua816\ua817\ua818\ua819\ua81a\ua81b\ua81c\ua81d\ua81e\ua81f\ua820\ua821\ua822\uac00\uac01\uac02\uac03\uac04\uac05\uac06\uac07\uac08\uac09\uac0a\uac0b\uac0c\uac0d\uac0e\uac0f\uac10\uac11\uac12\uac13\uac14\uac15\uac16\uac17\uac18\uac19\uac1a\uac1b\uac1c\uac1d\uac1e\uac1f\uac20\uac21\uac22\uac23\uac24\uac25\uac26\uac27\uac28\uac29\uac2a\uac2b\uac2c\uac2d\uac2e\uac2f\uac30\uac31\uac32\uac33\uac34\uac35\uac36\uac37\uac38\uac39\uac3a\uac3b\uac3c\uac3d\uac3e\uac3f\uac40\uac41\uac42\uac43\uac44\uac45\uac46\uac47\uac48\uac49\uac4a\uac4b\uac4c\uac4d\uac4e\uac4f\uac50\uac51\uac52\uac53\uac54\uac55\uac56\uac57\uac58\uac59\uac5a\uac5b\uac5c\uac5d\uac5e\uac5f\uac60\uac61\uac62\uac63\uac64\uac65\uac66\uac67\uac68\uac69\uac6a\uac6b\uac6c\uac6d\uac6e\uac6f\uac70\uac71\uac72\uac73\uac74\uac75\uac76\uac77\uac78\uac79\uac7a\uac7b\uac7c\uac7d\uac7e\uac7f\uac80\uac81\uac82\uac83\uac84\uac85\uac86\uac87\uac88\uac89\uac8a\uac8b\uac8c\uac8d\uac8e\uac8f\uac90\uac91\uac92\uac93\uac94\uac95\uac96\uac97\uac98\uac99\uac9a\uac9b\uac9c\uac9d\uac9e\uac9f\uaca0\uaca1\uaca2\uaca3\uaca4\uaca5\uaca6\uaca7\uaca8\uaca9\uacaa\uacab\uacac\uacad\uacae\uacaf\uacb0\uacb1\uacb2\uacb3\uacb4\uacb5\uacb6\uacb7\uacb8\uacb9\uacba\uacbb\uacbc\uacbd\uacbe\uacbf\uacc0\uacc1\uacc2\uacc3\uacc4\uacc5\uacc6\uacc7\uacc8\uacc9\uacca\uaccb\uaccc\uaccd\uacce\uaccf\uacd0\uacd1\uacd2\uacd3\uacd4\uacd5\uacd6\uacd7\uacd8\uacd9\uacda\uacdb\uacdc\uacdd\uacde\uacdf\uace0\uace1\uace2\uace3\uace4\uace5\uace6\uace7\uace8\uace9\uacea\uaceb\uacec\uaced\uacee\uacef\uacf0\uacf1\uacf2\uacf3\uacf4\uacf5\uacf6\uacf7\uacf8\uacf9\uacfa\uacfb\uacfc\uacfd\uacfe\uacff\uad00\uad01\uad02\uad03\uad04\uad05\uad06\uad07\uad08\uad09\uad0a\uad0b\uad0c\uad0d\uad0e\uad0f\uad10\uad11\uad12\uad13\uad14\uad15\uad16\uad17\uad18\uad19\uad1a\uad1b\uad1c\uad1d\uad1e\uad1f\uad20\uad21\uad22\uad23\uad24\uad25\uad26\uad27\uad28\uad29\uad2a\uad2b\uad2c\uad2d\uad2e\uad2f\uad30\uad31\uad32\uad33\uad34\uad35\uad36\uad37\uad38\uad39\uad3a\uad3b\uad3c\uad3d\uad3e\uad3f\uad40\uad41\uad42\uad43\uad44\uad45\uad46\uad47\uad48\uad49\uad4a\uad4b\uad4c\uad4d\uad4e\uad4f\uad50\uad51\uad52\uad53\uad54\uad55\uad56\uad57\uad58\uad59\uad5a\uad5b\uad5c\uad5d\uad5e\uad5f\uad60\uad61\uad62\uad63\uad64\uad65\uad66\uad67\uad68\uad69\uad6a\uad6b\uad6c\uad6d\uad6e\uad6f\uad70\uad71\uad72\uad73\uad74\uad75\uad76\uad77\uad78\uad79\uad7a\uad7b\uad7c\uad7d\uad7e\uad7f\uad80\uad81\uad82\uad83\uad84\uad85\uad86\uad87\uad88\uad89\uad8a\uad8b\uad8c\uad8d\uad8e\uad8f\uad90\uad91\uad92\uad93\uad94\uad95\uad96\uad97\uad98\uad99\uad9a\uad9b\uad9c\uad9d\uad9e\uad9f\uada0\uada1\uada2\uada3\uada4\uada5\uada6\uada7\uada8\uada9\uadaa\uadab\uadac\uadad\uadae\uadaf\uadb0\uadb1\uadb2\uadb3\uadb4\uadb5\uadb6\uadb7\uadb8\uadb9\uadba\uadbb\uadbc\uadbd\uadbe\uadbf\uadc0\uadc1\uadc2\uadc3\uadc4\uadc5\uadc6\uadc7\uadc8\uadc9\uadca\uadcb\uadcc\uadcd\uadce\uadcf\uadd0\uadd1\uadd2\uadd3\uadd4\uadd5\uadd6\uadd7\uadd8\uadd9\uadda\uaddb\uaddc\uaddd\uadde\uaddf\uade0\uade1\uade2\uade3\uade4\uade5\uade6\uade7\uade8\uade9\uadea\uadeb\uadec\uaded\uadee\uadef\uadf0\uadf1\uadf2\uadf3\uadf4\uadf5\uadf6\uadf7\uadf8\uadf9\uadfa\uadfb\uadfc\uadfd\uadfe\uadff\uae00\uae01\uae02\uae03\uae04\uae05\uae06\uae07\uae08\uae09\uae0a\uae0b\uae0c\uae0d\uae0e\uae0f\uae10\uae11\uae12\uae13\uae14\uae15\uae16\uae17\uae18\uae19\uae1a\uae1b\uae1c\uae1d\uae1e\uae1f\uae20\uae21\uae22\uae23\uae24\uae25\uae26\uae27\uae28\uae29\uae2a\uae2b\uae2c\uae2d\uae2e\uae2f\uae30\uae31\uae32\uae33\uae34\uae35\uae36\uae37\uae38\uae39\uae3a\uae3b\uae3c\uae3d\uae3e\uae3f\uae40\uae41\uae42\uae43\uae44\uae45\uae46\uae47\uae48\uae49\uae4a\uae4b\uae4c\uae4d\uae4e\uae4f\uae50\uae51\uae52\uae53\uae54\uae55\uae56\uae57\uae58\uae59\uae5a\uae5b\uae5c\uae5d\uae5e\uae5f\uae60\uae61\uae62\uae63\uae64\uae65\uae66\uae67\uae68\uae69\uae6a\uae6b\uae6c\uae6d\uae6e\uae6f\uae70\uae71\uae72\uae73\uae74\uae75\uae76\uae77\uae78\uae79\uae7a\uae7b\uae7c\uae7d\uae7e\uae7f\uae80\uae81\uae82\uae83\uae84\uae85\uae86\uae87\uae88\uae89\uae8a\uae8b\uae8c\uae8d\uae8e\uae8f\uae90\uae91\uae92\uae93\uae94\uae95\uae96\uae97\uae98\uae99\uae9a\uae9b\uae9c\uae9d\uae9e\uae9f\uaea0\uaea1\uaea2\uaea3\uaea4\uaea5\uaea6\uaea7\uaea8\uaea9\uaeaa\uaeab\uaeac\uaead\uaeae\uaeaf\uaeb0\uaeb1\uaeb2\uaeb3\uaeb4\uaeb5\uaeb6\uaeb7\uaeb8\uaeb9\uaeba\uaebb\uaebc\uaebd\uaebe\uaebf\uaec0\uaec1\uaec2\uaec3\uaec4\uaec5\uaec6\uaec7\uaec8\uaec9\uaeca\uaecb\uaecc\uaecd\uaece\uaecf\uaed0\uaed1\uaed2\uaed3\uaed4\uaed5\uaed6\uaed7\uaed8\uaed9\uaeda\uaedb\uaedc\uaedd\uaede\uaedf\uaee0\uaee1\uaee2\uaee3\uaee4\uaee5\uaee6\uaee7\uaee8\uaee9\uaeea\uaeeb\uaeec\uaeed\uaeee\uaeef\uaef0\uaef1\uaef2\uaef3\uaef4\uaef5\uaef6\uaef7\uaef8\uaef9\uaefa\uaefb\uaefc\uaefd\uaefe\uaeff\uaf00\uaf01\uaf02\uaf03\uaf04\uaf05\uaf06\uaf07\uaf08\uaf09\uaf0a\uaf0b\uaf0c\uaf0d\uaf0e\uaf0f\uaf10\uaf11\uaf12\uaf13\uaf14\uaf15\uaf16\uaf17\uaf18\uaf19\uaf1a\uaf1b\uaf1c\uaf1d\uaf1e\uaf1f\uaf20\uaf21\uaf22\uaf23\uaf24\uaf25\uaf26\uaf27\uaf28\uaf29\uaf2a\uaf2b\uaf2c\uaf2d\uaf2e\uaf2f\uaf30\uaf31\uaf32\uaf33\uaf34\uaf35\uaf36\uaf37\uaf38\uaf39\uaf3a\uaf3b\uaf3c\uaf3d\uaf3e\uaf3f\uaf40\uaf41\uaf42\uaf43\uaf44\uaf45\uaf46\uaf47\uaf48\uaf49\uaf4a\uaf4b\uaf4c\uaf4d\uaf4e\uaf4f\uaf50\uaf51\uaf52\uaf53\uaf54\uaf55\uaf56\uaf57\uaf58\uaf59\uaf5a\uaf5b\uaf5c\uaf5d\uaf5e\uaf5f\uaf60\uaf61\uaf62\uaf63\uaf64\uaf65\uaf66\uaf67\uaf68\uaf69\uaf6a\uaf6b\uaf6c\uaf6d\uaf6e\uaf6f\uaf70\uaf71\uaf72\uaf73\uaf74\uaf75\uaf76\uaf77\uaf78\uaf79\uaf7a\uaf7b\uaf7c\uaf7d\uaf7e\uaf7f\uaf80\uaf81\uaf82\uaf83\uaf84\uaf85\uaf86\uaf87\uaf88\uaf89\uaf8a\uaf8b\uaf8c\uaf8d\uaf8e\uaf8f\uaf90\uaf91\uaf92\uaf93\uaf94\uaf95\uaf96\uaf97\uaf98\uaf99\uaf9a\uaf9b\uaf9c\uaf9d\uaf9e\uaf9f\uafa0\uafa1\uafa2\uafa3\uafa4\uafa5\uafa6\uafa7\uafa8\uafa9\uafaa\uafab\uafac\uafad\uafae\uafaf\uafb0\uafb1\uafb2\uafb3\uafb4\uafb5\uafb6\uafb7\uafb8\uafb9\uafba\uafbb\uafbc\uafbd\uafbe\uafbf\uafc0\uafc1\uafc2\uafc3\uafc4\uafc5\uafc6\uafc7\uafc8\uafc9\uafca\uafcb\uafcc\uafcd\uafce\uafcf\uafd0\uafd1\uafd2\uafd3\uafd4\uafd5\uafd6\uafd7\uafd8\uafd9\uafda\uafdb\uafdc\uafdd\uafde\uafdf\uafe0\uafe1\uafe2\uafe3\uafe4\uafe5\uafe6\uafe7\uafe8\uafe9\uafea\uafeb\uafec\uafed\uafee\uafef\uaff0\uaff1\uaff2\uaff3\uaff4\uaff5\uaff6\uaff7\uaff8\uaff9\uaffa\uaffb\uaffc\uaffd\uaffe\uafff\ub000\ub001\ub002\ub003\ub004\ub005\ub006\ub007\ub008\ub009\ub00a\ub00b\ub00c\ub00d\ub00e\ub00f\ub010\ub011\ub012\ub013\ub014\ub015\ub016\ub017\ub018\ub019\ub01a\ub01b\ub01c\ub01d\ub01e\ub01f\ub020\ub021\ub022\ub023\ub024\ub025\ub026\ub027\ub028\ub029\ub02a\ub02b\ub02c\ub02d\ub02e\ub02f\ub030\ub031\ub032\ub033\ub034\ub035\ub036\ub037\ub038\ub039\ub03a\ub03b\ub03c\ub03d\ub03e\ub03f\ub040\ub041\ub042\ub043\ub044\ub045\ub046\ub047\ub048\ub049\ub04a\ub04b\ub04c\ub04d\ub04e\ub04f\ub050\ub051\ub052\ub053\ub054\ub055\ub056\ub057\ub058\ub059\ub05a\ub05b\ub05c\ub05d\ub05e\ub05f\ub060\ub061\ub062\ub063\ub064\ub065\ub066\ub067\ub068\ub069\ub06a\ub06b\ub06c\ub06d\ub06e\ub06f\ub070\ub071\ub072\ub073\ub074\ub075\ub076\ub077\ub078\ub079\ub07a\ub07b\ub07c\ub07d\ub07e\ub07f\ub080\ub081\ub082\ub083\ub084\ub085\ub086\ub087\ub088\ub089\ub08a\ub08b\ub08c\ub08d\ub08e\ub08f\ub090\ub091\ub092\ub093\ub094\ub095\ub096\ub097\ub098\ub099\ub09a\ub09b\ub09c\ub09d\ub09e\ub09f\ub0a0\ub0a1\ub0a2\ub0a3\ub0a4\ub0a5\ub0a6\ub0a7\ub0a8\ub0a9\ub0aa\ub0ab\ub0ac\ub0ad\ub0ae\ub0af\ub0b0\ub0b1\ub0b2\ub0b3\ub0b4\ub0b5\ub0b6\ub0b7\ub0b8\ub0b9\ub0ba\ub0bb\ub0bc\ub0bd\ub0be\ub0bf\ub0c0\ub0c1\ub0c2\ub0c3\ub0c4\ub0c5\ub0c6\ub0c7\ub0c8\ub0c9\ub0ca\ub0cb\ub0cc\ub0cd\ub0ce\ub0cf\ub0d0\ub0d1\ub0d2\ub0d3\ub0d4\ub0d5\ub0d6\ub0d7\ub0d8\ub0d9\ub0da\ub0db\ub0dc\ub0dd\ub0de\ub0df\ub0e0\ub0e1\ub0e2\ub0e3\ub0e4\ub0e5\ub0e6\ub0e7\ub0e8\ub0e9\ub0ea\ub0eb\ub0ec\ub0ed\ub0ee\ub0ef\ub0f0\ub0f1\ub0f2\ub0f3\ub0f4\ub0f5\ub0f6\ub0f7\ub0f8\ub0f9\ub0fa\ub0fb\ub0fc\ub0fd\ub0fe\ub0ff\ub100\ub101\ub102\ub103\ub104\ub105\ub106\ub107\ub108\ub109\ub10a\ub10b\ub10c\ub10d\ub10e\ub10f\ub110\ub111\ub112\ub113\ub114\ub115\ub116\ub117\ub118\ub119\ub11a\ub11b\ub11c\ub11d\ub11e\ub11f\ub120\ub121\ub122\ub123\ub124\ub125\ub126\ub127\ub128\ub129\ub12a\ub12b\ub12c\ub12d\ub12e\ub12f\ub130\ub131\ub132\ub133\ub134\ub135\ub136\ub137\ub138\ub139\ub13a\ub13b\ub13c\ub13d\ub13e\ub13f\ub140\ub141\ub142\ub143\ub144\ub145\ub146\ub147\ub148\ub149\ub14a\ub14b\ub14c\ub14d\ub14e\ub14f\ub150\ub151\ub152\ub153\ub154\ub155\ub156\ub157\ub158\ub159\ub15a\ub15b\ub15c\ub15d\ub15e\ub15f\ub160\ub161\ub162\ub163\ub164\ub165\ub166\ub167\ub168\ub169\ub16a\ub16b\ub16c\ub16d\ub16e\ub16f\ub170\ub171\ub172\ub173\ub174\ub175\ub176\ub177\ub178\ub179\ub17a\ub17b\ub17c\ub17d\ub17e\ub17f\ub180\ub181\ub182\ub183\ub184\ub185\ub186\ub187\ub188\ub189\ub18a\ub18b\ub18c\ub18d\ub18e\ub18f\ub190\ub191\ub192\ub193\ub194\ub195\ub196\ub197\ub198\ub199\ub19a\ub19b\ub19c\ub19d\ub19e\ub19f\ub1a0\ub1a1\ub1a2\ub1a3\ub1a4\ub1a5\ub1a6\ub1a7\ub1a8\ub1a9\ub1aa\ub1ab\ub1ac\ub1ad\ub1ae\ub1af\ub1b0\ub1b1\ub1b2\ub1b3\ub1b4\ub1b5\ub1b6\ub1b7\ub1b8\ub1b9\ub1ba\ub1bb\ub1bc\ub1bd\ub1be\ub1bf\ub1c0\ub1c1\ub1c2\ub1c3\ub1c4\ub1c5\ub1c6\ub1c7\ub1c8\ub1c9\ub1ca\ub1cb\ub1cc\ub1cd\ub1ce\ub1cf\ub1d0\ub1d1\ub1d2\ub1d3\ub1d4\ub1d5\ub1d6\ub1d7\ub1d8\ub1d9\ub1da\ub1db\ub1dc\ub1dd\ub1de\ub1df\ub1e0\ub1e1\ub1e2\ub1e3\ub1e4\ub1e5\ub1e6\ub1e7\ub1e8\ub1e9\ub1ea\ub1eb\ub1ec\ub1ed\ub1ee\ub1ef\ub1f0\ub1f1\ub1f2\ub1f3\ub1f4\ub1f5\ub1f6\ub1f7\ub1f8\ub1f9\ub1fa\ub1fb\ub1fc\ub1fd\ub1fe\ub1ff\ub200\ub201\ub202\ub203\ub204\ub205\ub206\ub207\ub208\ub209\ub20a\ub20b\ub20c\ub20d\ub20e\ub20f\ub210\ub211\ub212\ub213\ub214\ub215\ub216\ub217\ub218\ub219\ub21a\ub21b\ub21c\ub21d\ub21e\ub21f\ub220\ub221\ub222\ub223\ub224\ub225\ub226\ub227\ub228\ub229\ub22a\ub22b\ub22c\ub22d\ub22e\ub22f\ub230\ub231\ub232\ub233\ub234\ub235\ub236\ub237\ub238\ub239\ub23a\ub23b\ub23c\ub23d\ub23e\ub23f\ub240\ub241\ub242\ub243\ub244\ub245\ub246\ub247\ub248\ub249\ub24a\ub24b\ub24c\ub24d\ub24e\ub24f\ub250\ub251\ub252\ub253\ub254\ub255\ub256\ub257\ub258\ub259\ub25a\ub25b\ub25c\ub25d\ub25e\ub25f\ub260\ub261\ub262\ub263\ub264\ub265\ub266\ub267\ub268\ub269\ub26a\ub26b\ub26c\ub26d\ub26e\ub26f\ub270\ub271\ub272\ub273\ub274\ub275\ub276\ub277\ub278\ub279\ub27a\ub27b\ub27c\ub27d\ub27e\ub27f\ub280\ub281\ub282\ub283\ub284\ub285\ub286\ub287\ub288\ub289\ub28a\ub28b\ub28c\ub28d\ub28e\ub28f\ub290\ub291\ub292\ub293\ub294\ub295\ub296\ub297\ub298\ub299\ub29a\ub29b\ub29c\ub29d\ub29e\ub29f\ub2a0\ub2a1\ub2a2\ub2a3\ub2a4\ub2a5\ub2a6\ub2a7\ub2a8\ub2a9\ub2aa\ub2ab\ub2ac\ub2ad\ub2ae\ub2af\ub2b0\ub2b1\ub2b2\ub2b3\ub2b4\ub2b5\ub2b6\ub2b7\ub2b8\ub2b9\ub2ba\ub2bb\ub2bc\ub2bd\ub2be\ub2bf\ub2c0\ub2c1\ub2c2\ub2c3\ub2c4\ub2c5\ub2c6\ub2c7\ub2c8\ub2c9\ub2ca\ub2cb\ub2cc\ub2cd\ub2ce\ub2cf\ub2d0\ub2d1\ub2d2\ub2d3\ub2d4\ub2d5\ub2d6\ub2d7\ub2d8\ub2d9\ub2da\ub2db\ub2dc\ub2dd\ub2de\ub2df\ub2e0\ub2e1\ub2e2\ub2e3\ub2e4\ub2e5\ub2e6\ub2e7\ub2e8\ub2e9\ub2ea\ub2eb\ub2ec\ub2ed\ub2ee\ub2ef\ub2f0\ub2f1\ub2f2\ub2f3\ub2f4\ub2f5\ub2f6\ub2f7\ub2f8\ub2f9\ub2fa\ub2fb\ub2fc\ub2fd\ub2fe\ub2ff\ub300\ub301\ub302\ub303\ub304\ub305\ub306\ub307\ub308\ub309\ub30a\ub30b\ub30c\ub30d\ub30e\ub30f\ub310\ub311\ub312\ub313\ub314\ub315\ub316\ub317\ub318\ub319\ub31a\ub31b\ub31c\ub31d\ub31e\ub31f\ub320\ub321\ub322\ub323\ub324\ub325\ub326\ub327\ub328\ub329\ub32a\ub32b\ub32c\ub32d\ub32e\ub32f\ub330\ub331\ub332\ub333\ub334\ub335\ub336\ub337\ub338\ub339\ub33a\ub33b\ub33c\ub33d\ub33e\ub33f\ub340\ub341\ub342\ub343\ub344\ub345\ub346\ub347\ub348\ub349\ub34a\ub34b\ub34c\ub34d\ub34e\ub34f\ub350\ub351\ub352\ub353\ub354\ub355\ub356\ub357\ub358\ub359\ub35a\ub35b\ub35c\ub35d\ub35e\ub35f\ub360\ub361\ub362\ub363\ub364\ub365\ub366\ub367\ub368\ub369\ub36a\ub36b\ub36c\ub36d\ub36e\ub36f\ub370\ub371\ub372\ub373\ub374\ub375\ub376\ub377\ub378\ub379\ub37a\ub37b\ub37c\ub37d\ub37e\ub37f\ub380\ub381\ub382\ub383\ub384\ub385\ub386\ub387\ub388\ub389\ub38a\ub38b\ub38c\ub38d\ub38e\ub38f\ub390\ub391\ub392\ub393\ub394\ub395\ub396\ub397\ub398\ub399\ub39a\ub39b\ub39c\ub39d\ub39e\ub39f\ub3a0\ub3a1\ub3a2\ub3a3\ub3a4\ub3a5\ub3a6\ub3a7\ub3a8\ub3a9\ub3aa\ub3ab\ub3ac\ub3ad\ub3ae\ub3af\ub3b0\ub3b1\ub3b2\ub3b3\ub3b4\ub3b5\ub3b6\ub3b7\ub3b8\ub3b9\ub3ba\ub3bb\ub3bc\ub3bd\ub3be\ub3bf\ub3c0\ub3c1\ub3c2\ub3c3\ub3c4\ub3c5\ub3c6\ub3c7\ub3c8\ub3c9\ub3ca\ub3cb\ub3cc\ub3cd\ub3ce\ub3cf\ub3d0\ub3d1\ub3d2\ub3d3\ub3d4\ub3d5\ub3d6\ub3d7\ub3d8\ub3d9\ub3da\ub3db\ub3dc\ub3dd\ub3de\ub3df\ub3e0\ub3e1\ub3e2\ub3e3\ub3e4\ub3e5\ub3e6\ub3e7\ub3e8\ub3e9\ub3ea\ub3eb\ub3ec\ub3ed\ub3ee\ub3ef\ub3f0\ub3f1\ub3f2\ub3f3\ub3f4\ub3f5\ub3f6\ub3f7\ub3f8\ub3f9\ub3fa\ub3fb\ub3fc\ub3fd\ub3fe\ub3ff\ub400\ub401\ub402\ub403\ub404\ub405\ub406\ub407\ub408\ub409\ub40a\ub40b\ub40c\ub40d\ub40e\ub40f\ub410\ub411\ub412\ub413\ub414\ub415\ub416\ub417\ub418\ub419\ub41a\ub41b\ub41c\ub41d\ub41e\ub41f\ub420\ub421\ub422\ub423\ub424\ub425\ub426\ub427\ub428\ub429\ub42a\ub42b\ub42c\ub42d\ub42e\ub42f\ub430\ub431\ub432\ub433\ub434\ub435\ub436\ub437\ub438\ub439\ub43a\ub43b\ub43c\ub43d\ub43e\ub43f\ub440\ub441\ub442\ub443\ub444\ub445\ub446\ub447\ub448\ub449\ub44a\ub44b\ub44c\ub44d\ub44e\ub44f\ub450\ub451\ub452\ub453\ub454\ub455\ub456\ub457\ub458\ub459\ub45a\ub45b\ub45c\ub45d\ub45e\ub45f\ub460\ub461\ub462\ub463\ub464\ub465\ub466\ub467\ub468\ub469\ub46a\ub46b\ub46c\ub46d\ub46e\ub46f\ub470\ub471\ub472\ub473\ub474\ub475\ub476\ub477\ub478\ub479\ub47a\ub47b\ub47c\ub47d\ub47e\ub47f\ub480\ub481\ub482\ub483\ub484\ub485\ub486\ub487\ub488\ub489\ub48a\ub48b\ub48c\ub48d\ub48e\ub48f\ub490\ub491\ub492\ub493\ub494\ub495\ub496\ub497\ub498\ub499\ub49a\ub49b\ub49c\ub49d\ub49e\ub49f\ub4a0\ub4a1\ub4a2\ub4a3\ub4a4\ub4a5\ub4a6\ub4a7\ub4a8\ub4a9\ub4aa\ub4ab\ub4ac\ub4ad\ub4ae\ub4af\ub4b0\ub4b1\ub4b2\ub4b3\ub4b4\ub4b5\ub4b6\ub4b7\ub4b8\ub4b9\ub4ba\ub4bb\ub4bc\ub4bd\ub4be\ub4bf\ub4c0\ub4c1\ub4c2\ub4c3\ub4c4\ub4c5\ub4c6\ub4c7\ub4c8\ub4c9\ub4ca\ub4cb\ub4cc\ub4cd\ub4ce\ub4cf\ub4d0\ub4d1\ub4d2\ub4d3\ub4d4\ub4d5\ub4d6\ub4d7\ub4d8\ub4d9\ub4da\ub4db\ub4dc\ub4dd\ub4de\ub4df\ub4e0\ub4e1\ub4e2\ub4e3\ub4e4\ub4e5\ub4e6\ub4e7\ub4e8\ub4e9\ub4ea\ub4eb\ub4ec\ub4ed\ub4ee\ub4ef\ub4f0\ub4f1\ub4f2\ub4f3\ub4f4\ub4f5\ub4f6\ub4f7\ub4f8\ub4f9\ub4fa\ub4fb\ub4fc\ub4fd\ub4fe\ub4ff\ub500\ub501\ub502\ub503\ub504\ub505\ub506\ub507\ub508\ub509\ub50a\ub50b\ub50c\ub50d\ub50e\ub50f\ub510\ub511\ub512\ub513\ub514\ub515\ub516\ub517\ub518\ub519\ub51a\ub51b\ub51c\ub51d\ub51e\ub51f\ub520\ub521\ub522\ub523\ub524\ub525\ub526\ub527\ub528\ub529\ub52a\ub52b\ub52c\ub52d\ub52e\ub52f\ub530\ub531\ub532\ub533\ub534\ub535\ub536\ub537\ub538\ub539\ub53a\ub53b\ub53c\ub53d\ub53e\ub53f\ub540\ub541\ub542\ub543\ub544\ub545\ub546\ub547\ub548\ub549\ub54a\ub54b\ub54c\ub54d\ub54e\ub54f\ub550\ub551\ub552\ub553\ub554\ub555\ub556\ub557\ub558\ub559\ub55a\ub55b\ub55c\ub55d\ub55e\ub55f\ub560\ub561\ub562\ub563\ub564\ub565\ub566\ub567\ub568\ub569\ub56a\ub56b\ub56c\ub56d\ub56e\ub56f\ub570\ub571\ub572\ub573\ub574\ub575\ub576\ub577\ub578\ub579\ub57a\ub57b\ub57c\ub57d\ub57e\ub57f\ub580\ub581\ub582\ub583\ub584\ub585\ub586\ub587\ub588\ub589\ub58a\ub58b\ub58c\ub58d\ub58e\ub58f\ub590\ub591\ub592\ub593\ub594\ub595\ub596\ub597\ub598\ub599\ub59a\ub59b\ub59c\ub59d\ub59e\ub59f\ub5a0\ub5a1\ub5a2\ub5a3\ub5a4\ub5a5\ub5a6\ub5a7\ub5a8\ub5a9\ub5aa\ub5ab\ub5ac\ub5ad\ub5ae\ub5af\ub5b0\ub5b1\ub5b2\ub5b3\ub5b4\ub5b5\ub5b6\ub5b7\ub5b8\ub5b9\ub5ba\ub5bb\ub5bc\ub5bd\ub5be\ub5bf\ub5c0\ub5c1\ub5c2\ub5c3\ub5c4\ub5c5\ub5c6\ub5c7\ub5c8\ub5c9\ub5ca\ub5cb\ub5cc\ub5cd\ub5ce\ub5cf\ub5d0\ub5d1\ub5d2\ub5d3\ub5d4\ub5d5\ub5d6\ub5d7\ub5d8\ub5d9\ub5da\ub5db\ub5dc\ub5dd\ub5de\ub5df\ub5e0\ub5e1\ub5e2\ub5e3\ub5e4\ub5e5\ub5e6\ub5e7\ub5e8\ub5e9\ub5ea\ub5eb\ub5ec\ub5ed\ub5ee\ub5ef\ub5f0\ub5f1\ub5f2\ub5f3\ub5f4\ub5f5\ub5f6\ub5f7\ub5f8\ub5f9\ub5fa\ub5fb\ub5fc\ub5fd\ub5fe\ub5ff\ub600\ub601\ub602\ub603\ub604\ub605\ub606\ub607\ub608\ub609\ub60a\ub60b\ub60c\ub60d\ub60e\ub60f\ub610\ub611\ub612\ub613\ub614\ub615\ub616\ub617\ub618\ub619\ub61a\ub61b\ub61c\ub61d\ub61e\ub61f\ub620\ub621\ub622\ub623\ub624\ub625\ub626\ub627\ub628\ub629\ub62a\ub62b\ub62c\ub62d\ub62e\ub62f\ub630\ub631\ub632\ub633\ub634\ub635\ub636\ub637\ub638\ub639\ub63a\ub63b\ub63c\ub63d\ub63e\ub63f\ub640\ub641\ub642\ub643\ub644\ub645\ub646\ub647\ub648\ub649\ub64a\ub64b\ub64c\ub64d\ub64e\ub64f\ub650\ub651\ub652\ub653\ub654\ub655\ub656\ub657\ub658\ub659\ub65a\ub65b\ub65c\ub65d\ub65e\ub65f\ub660\ub661\ub662\ub663\ub664\ub665\ub666\ub667\ub668\ub669\ub66a\ub66b\ub66c\ub66d\ub66e\ub66f\ub670\ub671\ub672\ub673\ub674\ub675\ub676\ub677\ub678\ub679\ub67a\ub67b\ub67c\ub67d\ub67e\ub67f\ub680\ub681\ub682\ub683\ub684\ub685\ub686\ub687\ub688\ub689\ub68a\ub68b\ub68c\ub68d\ub68e\ub68f\ub690\ub691\ub692\ub693\ub694\ub695\ub696\ub697\ub698\ub699\ub69a\ub69b\ub69c\ub69d\ub69e\ub69f\ub6a0\ub6a1\ub6a2\ub6a3\ub6a4\ub6a5\ub6a6\ub6a7\ub6a8\ub6a9\ub6aa\ub6ab\ub6ac\ub6ad\ub6ae\ub6af\ub6b0\ub6b1\ub6b2\ub6b3\ub6b4\ub6b5\ub6b6\ub6b7\ub6b8\ub6b9\ub6ba\ub6bb\ub6bc\ub6bd\ub6be\ub6bf\ub6c0\ub6c1\ub6c2\ub6c3\ub6c4\ub6c5\ub6c6\ub6c7\ub6c8\ub6c9\ub6ca\ub6cb\ub6cc\ub6cd\ub6ce\ub6cf\ub6d0\ub6d1\ub6d2\ub6d3\ub6d4\ub6d5\ub6d6\ub6d7\ub6d8\ub6d9\ub6da\ub6db\ub6dc\ub6dd\ub6de\ub6df\ub6e0\ub6e1\ub6e2\ub6e3\ub6e4\ub6e5\ub6e6\ub6e7\ub6e8\ub6e9\ub6ea\ub6eb\ub6ec\ub6ed\ub6ee\ub6ef\ub6f0\ub6f1\ub6f2\ub6f3\ub6f4\ub6f5\ub6f6\ub6f7\ub6f8\ub6f9\ub6fa\ub6fb\ub6fc\ub6fd\ub6fe\ub6ff\ub700\ub701\ub702\ub703\ub704\ub705\ub706\ub707\ub708\ub709\ub70a\ub70b\ub70c\ub70d\ub70e\ub70f\ub710\ub711\ub712\ub713\ub714\ub715\ub716\ub717\ub718\ub719\ub71a\ub71b\ub71c\ub71d\ub71e\ub71f\ub720\ub721\ub722\ub723\ub724\ub725\ub726\ub727\ub728\ub729\ub72a\ub72b\ub72c\ub72d\ub72e\ub72f\ub730\ub731\ub732\ub733\ub734\ub735\ub736\ub737\ub738\ub739\ub73a\ub73b\ub73c\ub73d\ub73e\ub73f\ub740\ub741\ub742\ub743\ub744\ub745\ub746\ub747\ub748\ub749\ub74a\ub74b\ub74c\ub74d\ub74e\ub74f\ub750\ub751\ub752\ub753\ub754\ub755\ub756\ub757\ub758\ub759\ub75a\ub75b\ub75c\ub75d\ub75e\ub75f\ub760\ub761\ub762\ub763\ub764\ub765\ub766\ub767\ub768\ub769\ub76a\ub76b\ub76c\ub76d\ub76e\ub76f\ub770\ub771\ub772\ub773\ub774\ub775\ub776\ub777\ub778\ub779\ub77a\ub77b\ub77c\ub77d\ub77e\ub77f\ub780\ub781\ub782\ub783\ub784\ub785\ub786\ub787\ub788\ub789\ub78a\ub78b\ub78c\ub78d\ub78e\ub78f\ub790\ub791\ub792\ub793\ub794\ub795\ub796\ub797\ub798\ub799\ub79a\ub79b\ub79c\ub79d\ub79e\ub79f\ub7a0\ub7a1\ub7a2\ub7a3\ub7a4\ub7a5\ub7a6\ub7a7\ub7a8\ub7a9\ub7aa\ub7ab\ub7ac\ub7ad\ub7ae\ub7af\ub7b0\ub7b1\ub7b2\ub7b3\ub7b4\ub7b5\ub7b6\ub7b7\ub7b8\ub7b9\ub7ba\ub7bb\ub7bc\ub7bd\ub7be\ub7bf\ub7c0\ub7c1\ub7c2\ub7c3\ub7c4\ub7c5\ub7c6\ub7c7\ub7c8\ub7c9\ub7ca\ub7cb\ub7cc\ub7cd\ub7ce\ub7cf\ub7d0\ub7d1\ub7d2\ub7d3\ub7d4\ub7d5\ub7d6\ub7d7\ub7d8\ub7d9\ub7da\ub7db\ub7dc\ub7dd\ub7de\ub7df\ub7e0\ub7e1\ub7e2\ub7e3\ub7e4\ub7e5\ub7e6\ub7e7\ub7e8\ub7e9\ub7ea\ub7eb\ub7ec\ub7ed\ub7ee\ub7ef\ub7f0\ub7f1\ub7f2\ub7f3\ub7f4\ub7f5\ub7f6\ub7f7\ub7f8\ub7f9\ub7fa\ub7fb\ub7fc\ub7fd\ub7fe\ub7ff\ub800\ub801\ub802\ub803\ub804\ub805\ub806\ub807\ub808\ub809\ub80a\ub80b\ub80c\ub80d\ub80e\ub80f\ub810\ub811\ub812\ub813\ub814\ub815\ub816\ub817\ub818\ub819\ub81a\ub81b\ub81c\ub81d\ub81e\ub81f\ub820\ub821\ub822\ub823\ub824\ub825\ub826\ub827\ub828\ub829\ub82a\ub82b\ub82c\ub82d\ub82e\ub82f\ub830\ub831\ub832\ub833\ub834\ub835\ub836\ub837\ub838\ub839\ub83a\ub83b\ub83c\ub83d\ub83e\ub83f\ub840\ub841\ub842\ub843\ub844\ub845\ub846\ub847\ub848\ub849\ub84a\ub84b\ub84c\ub84d\ub84e\ub84f\ub850\ub851\ub852\ub853\ub854\ub855\ub856\ub857\ub858\ub859\ub85a\ub85b\ub85c\ub85d\ub85e\ub85f\ub860\ub861\ub862\ub863\ub864\ub865\ub866\ub867\ub868\ub869\ub86a\ub86b\ub86c\ub86d\ub86e\ub86f\ub870\ub871\ub872\ub873\ub874\ub875\ub876\ub877\ub878\ub879\ub87a\ub87b\ub87c\ub87d\ub87e\ub87f\ub880\ub881\ub882\ub883\ub884\ub885\ub886\ub887\ub888\ub889\ub88a\ub88b\ub88c\ub88d\ub88e\ub88f\ub890\ub891\ub892\ub893\ub894\ub895\ub896\ub897\ub898\ub899\ub89a\ub89b\ub89c\ub89d\ub89e\ub89f\ub8a0\ub8a1\ub8a2\ub8a3\ub8a4\ub8a5\ub8a6\ub8a7\ub8a8\ub8a9\ub8aa\ub8ab\ub8ac\ub8ad\ub8ae\ub8af\ub8b0\ub8b1\ub8b2\ub8b3\ub8b4\ub8b5\ub8b6\ub8b7\ub8b8\ub8b9\ub8ba\ub8bb\ub8bc\ub8bd\ub8be\ub8bf\ub8c0\ub8c1\ub8c2\ub8c3\ub8c4\ub8c5\ub8c6\ub8c7\ub8c8\ub8c9\ub8ca\ub8cb\ub8cc\ub8cd\ub8ce\ub8cf\ub8d0\ub8d1\ub8d2\ub8d3\ub8d4\ub8d5\ub8d6\ub8d7\ub8d8\ub8d9\ub8da\ub8db\ub8dc\ub8dd\ub8de\ub8df\ub8e0\ub8e1\ub8e2\ub8e3\ub8e4\ub8e5\ub8e6\ub8e7\ub8e8\ub8e9\ub8ea\ub8eb\ub8ec\ub8ed\ub8ee\ub8ef\ub8f0\ub8f1\ub8f2\ub8f3\ub8f4\ub8f5\ub8f6\ub8f7\ub8f8\ub8f9\ub8fa\ub8fb\ub8fc\ub8fd\ub8fe\ub8ff\ub900\ub901\ub902\ub903\ub904\ub905\ub906\ub907\ub908\ub909\ub90a\ub90b\ub90c\ub90d\ub90e\ub90f\ub910\ub911\ub912\ub913\ub914\ub915\ub916\ub917\ub918\ub919\ub91a\ub91b\ub91c\ub91d\ub91e\ub91f\ub920\ub921\ub922\ub923\ub924\ub925\ub926\ub927\ub928\ub929\ub92a\ub92b\ub92c\ub92d\ub92e\ub92f\ub930\ub931\ub932\ub933\ub934\ub935\ub936\ub937\ub938\ub939\ub93a\ub93b\ub93c\ub93d\ub93e\ub93f\ub940\ub941\ub942\ub943\ub944\ub945\ub946\ub947\ub948\ub949\ub94a\ub94b\ub94c\ub94d\ub94e\ub94f\ub950\ub951\ub952\ub953\ub954\ub955\ub956\ub957\ub958\ub959\ub95a\ub95b\ub95c\ub95d\ub95e\ub95f\ub960\ub961\ub962\ub963\ub964\ub965\ub966\ub967\ub968\ub969\ub96a\ub96b\ub96c\ub96d\ub96e\ub96f\ub970\ub971\ub972\ub973\ub974\ub975\ub976\ub977\ub978\ub979\ub97a\ub97b\ub97c\ub97d\ub97e\ub97f\ub980\ub981\ub982\ub983\ub984\ub985\ub986\ub987\ub988\ub989\ub98a\ub98b\ub98c\ub98d\ub98e\ub98f\ub990\ub991\ub992\ub993\ub994\ub995\ub996\ub997\ub998\ub999\ub99a\ub99b\ub99c\ub99d\ub99e\ub99f\ub9a0\ub9a1\ub9a2\ub9a3\ub9a4\ub9a5\ub9a6\ub9a7\ub9a8\ub9a9\ub9aa\ub9ab\ub9ac\ub9ad\ub9ae\ub9af\ub9b0\ub9b1\ub9b2\ub9b3\ub9b4\ub9b5\ub9b6\ub9b7\ub9b8\ub9b9\ub9ba\ub9bb\ub9bc\ub9bd\ub9be\ub9bf\ub9c0\ub9c1\ub9c2\ub9c3\ub9c4\ub9c5\ub9c6\ub9c7\ub9c8\ub9c9\ub9ca\ub9cb\ub9cc\ub9cd\ub9ce\ub9cf\ub9d0\ub9d1\ub9d2\ub9d3\ub9d4\ub9d5\ub9d6\ub9d7\ub9d8\ub9d9\ub9da\ub9db\ub9dc\ub9dd\ub9de\ub9df\ub9e0\ub9e1\ub9e2\ub9e3\ub9e4\ub9e5\ub9e6\ub9e7\ub9e8\ub9e9\ub9ea\ub9eb\ub9ec\ub9ed\ub9ee\ub9ef\ub9f0\ub9f1\ub9f2\ub9f3\ub9f4\ub9f5\ub9f6\ub9f7\ub9f8\ub9f9\ub9fa\ub9fb\ub9fc\ub9fd\ub9fe\ub9ff\uba00\uba01\uba02\uba03\uba04\uba05\uba06\uba07\uba08\uba09\uba0a\uba0b\uba0c\uba0d\uba0e\uba0f\uba10\uba11\uba12\uba13\uba14\uba15\uba16\uba17\uba18\uba19\uba1a\uba1b\uba1c\uba1d\uba1e\uba1f\uba20\uba21\uba22\uba23\uba24\uba25\uba26\uba27\uba28\uba29\uba2a\uba2b\uba2c\uba2d\uba2e\uba2f\uba30\uba31\uba32\uba33\uba34\uba35\uba36\uba37\uba38\uba39\uba3a\uba3b\uba3c\uba3d\uba3e\uba3f\uba40\uba41\uba42\uba43\uba44\uba45\uba46\uba47\uba48\uba49\uba4a\uba4b\uba4c\uba4d\uba4e\uba4f\uba50\uba51\uba52\uba53\uba54\uba55\uba56\uba57\uba58\uba59\uba5a\uba5b\uba5c\uba5d\uba5e\uba5f\uba60\uba61\uba62\uba63\uba64\uba65\uba66\uba67\uba68\uba69\uba6a\uba6b\uba6c\uba6d\uba6e\uba6f\uba70\uba71\uba72\uba73\uba74\uba75\uba76\uba77\uba78\uba79\uba7a\uba7b\uba7c\uba7d\uba7e\uba7f\uba80\uba81\uba82\uba83\uba84\uba85\uba86\uba87\uba88\uba89\uba8a\uba8b\uba8c\uba8d\uba8e\uba8f\uba90\uba91\uba92\uba93\uba94\uba95\uba96\uba97\uba98\uba99\uba9a\uba9b\uba9c\uba9d\uba9e\uba9f\ubaa0\ubaa1\ubaa2\ubaa3\ubaa4\ubaa5\ubaa6\ubaa7\ubaa8\ubaa9\ubaaa\ubaab\ubaac\ubaad\ubaae\ubaaf\ubab0\ubab1\ubab2\ubab3\ubab4\ubab5\ubab6\ubab7\ubab8\ubab9\ubaba\ubabb\ubabc\ubabd\ubabe\ubabf\ubac0\ubac1\ubac2\ubac3\ubac4\ubac5\ubac6\ubac7\ubac8\ubac9\ubaca\ubacb\ubacc\ubacd\ubace\ubacf\ubad0\ubad1\ubad2\ubad3\ubad4\ubad5\ubad6\ubad7\ubad8\ubad9\ubada\ubadb\ubadc\ubadd\ubade\ubadf\ubae0\ubae1\ubae2\ubae3\ubae4\ubae5\ubae6\ubae7\ubae8\ubae9\ubaea\ubaeb\ubaec\ubaed\ubaee\ubaef\ubaf0\ubaf1\ubaf2\ubaf3\ubaf4\ubaf5\ubaf6\ubaf7\ubaf8\ubaf9\ubafa\ubafb\ubafc\ubafd\ubafe\ubaff\ubb00\ubb01\ubb02\ubb03\ubb04\ubb05\ubb06\ubb07\ubb08\ubb09\ubb0a\ubb0b\ubb0c\ubb0d\ubb0e\ubb0f\ubb10\ubb11\ubb12\ubb13\ubb14\ubb15\ubb16\ubb17\ubb18\ubb19\ubb1a\ubb1b\ubb1c\ubb1d\ubb1e\ubb1f\ubb20\ubb21\ubb22\ubb23\ubb24\ubb25\ubb26\ubb27\ubb28\ubb29\ubb2a\ubb2b\ubb2c\ubb2d\ubb2e\ubb2f\ubb30\ubb31\ubb32\ubb33\ubb34\ubb35\ubb36\ubb37\ubb38\ubb39\ubb3a\ubb3b\ubb3c\ubb3d\ubb3e\ubb3f\ubb40\ubb41\ubb42\ubb43\ubb44\ubb45\ubb46\ubb47\ubb48\ubb49\ubb4a\ubb4b\ubb4c\ubb4d\ubb4e\ubb4f\ubb50\ubb51\ubb52\ubb53\ubb54\ubb55\ubb56\ubb57\ubb58\ubb59\ubb5a\ubb5b\ubb5c\ubb5d\ubb5e\ubb5f\ubb60\ubb61\ubb62\ubb63\ubb64\ubb65\ubb66\ubb67\ubb68\ubb69\ubb6a\ubb6b\ubb6c\ubb6d\ubb6e\ubb6f\ubb70\ubb71\ubb72\ubb73\ubb74\ubb75\ubb76\ubb77\ubb78\ubb79\ubb7a\ubb7b\ubb7c\ubb7d\ubb7e\ubb7f\ubb80\ubb81\ubb82\ubb83\ubb84\ubb85\ubb86\ubb87\ubb88\ubb89\ubb8a\ubb8b\ubb8c\ubb8d\ubb8e\ubb8f\ubb90\ubb91\ubb92\ubb93\ubb94\ubb95\ubb96\ubb97\ubb98\ubb99\ubb9a\ubb9b\ubb9c\ubb9d\ubb9e\ubb9f\ubba0\ubba1\ubba2\ubba3\ubba4\ubba5\ubba6\ubba7\ubba8\ubba9\ubbaa\ubbab\ubbac\ubbad\ubbae\ubbaf\ubbb0\ubbb1\ubbb2\ubbb3\ubbb4\ubbb5\ubbb6\ubbb7\ubbb8\ubbb9\ubbba\ubbbb\ubbbc\ubbbd\ubbbe\ubbbf\ubbc0\ubbc1\ubbc2\ubbc3\ubbc4\ubbc5\ubbc6\ubbc7\ubbc8\ubbc9\ubbca\ubbcb\ubbcc\ubbcd\ubbce\ubbcf\ubbd0\ubbd1\ubbd2\ubbd3\ubbd4\ubbd5\ubbd6\ubbd7\ubbd8\ubbd9\ubbda\ubbdb\ubbdc\ubbdd\ubbde\ubbdf\ubbe0\ubbe1\ubbe2\ubbe3\ubbe4\ubbe5\ubbe6\ubbe7\ubbe8\ubbe9\ubbea\ubbeb\ubbec\ubbed\ubbee\ubbef\ubbf0\ubbf1\ubbf2\ubbf3\ubbf4\ubbf5\ubbf6\ubbf7\ubbf8\ubbf9\ubbfa\ubbfb\ubbfc\ubbfd\ubbfe\ubbff\ubc00\ubc01\ubc02\ubc03\ubc04\ubc05\ubc06\ubc07\ubc08\ubc09\ubc0a\ubc0b\ubc0c\ubc0d\ubc0e\ubc0f\ubc10\ubc11\ubc12\ubc13\ubc14\ubc15\ubc16\ubc17\ubc18\ubc19\ubc1a\ubc1b\ubc1c\ubc1d\ubc1e\ubc1f\ubc20\ubc21\ubc22\ubc23\ubc24\ubc25\ubc26\ubc27\ubc28\ubc29\ubc2a\ubc2b\ubc2c\ubc2d\ubc2e\ubc2f\ubc30\ubc31\ubc32\ubc33\ubc34\ubc35\ubc36\ubc37\ubc38\ubc39\ubc3a\ubc3b\ubc3c\ubc3d\ubc3e\ubc3f\ubc40\ubc41\ubc42\ubc43\ubc44\ubc45\ubc46\ubc47\ubc48\ubc49\ubc4a\ubc4b\ubc4c\ubc4d\ubc4e\ubc4f\ubc50\ubc51\ubc52\ubc53\ubc54\ubc55\ubc56\ubc57\ubc58\ubc59\ubc5a\ubc5b\ubc5c\ubc5d\ubc5e\ubc5f\ubc60\ubc61\ubc62\ubc63\ubc64\ubc65\ubc66\ubc67\ubc68\ubc69\ubc6a\ubc6b\ubc6c\ubc6d\ubc6e\ubc6f\ubc70\ubc71\ubc72\ubc73\ubc74\ubc75\ubc76\ubc77\ubc78\ubc79\ubc7a\ubc7b\ubc7c\ubc7d\ubc7e\ubc7f\ubc80\ubc81\ubc82\ubc83\ubc84\ubc85\ubc86\ubc87\ubc88\ubc89\ubc8a\ubc8b\ubc8c\ubc8d\ubc8e\ubc8f\ubc90\ubc91\ubc92\ubc93\ubc94\ubc95\ubc96\ubc97\ubc98\ubc99\ubc9a\ubc9b\ubc9c\ubc9d\ubc9e\ubc9f\ubca0\ubca1\ubca2\ubca3\ubca4\ubca5\ubca6\ubca7\ubca8\ubca9\ubcaa\ubcab\ubcac\ubcad\ubcae\ubcaf\ubcb0\ubcb1\ubcb2\ubcb3\ubcb4\ubcb5\ubcb6\ubcb7\ubcb8\ubcb9\ubcba\ubcbb\ubcbc\ubcbd\ubcbe\ubcbf\ubcc0\ubcc1\ubcc2\ubcc3\ubcc4\ubcc5\ubcc6\ubcc7\ubcc8\ubcc9\ubcca\ubccb\ubccc\ubccd\ubcce\ubccf\ubcd0\ubcd1\ubcd2\ubcd3\ubcd4\ubcd5\ubcd6\ubcd7\ubcd8\ubcd9\ubcda\ubcdb\ubcdc\ubcdd\ubcde\ubcdf\ubce0\ubce1\ubce2\ubce3\ubce4\ubce5\ubce6\ubce7\ubce8\ubce9\ubcea\ubceb\ubcec\ubced\ubcee\ubcef\ubcf0\ubcf1\ubcf2\ubcf3\ubcf4\ubcf5\ubcf6\ubcf7\ubcf8\ubcf9\ubcfa\ubcfb\ubcfc\ubcfd\ubcfe\ubcff\ubd00\ubd01\ubd02\ubd03\ubd04\ubd05\ubd06\ubd07\ubd08\ubd09\ubd0a\ubd0b\ubd0c\ubd0d\ubd0e\ubd0f\ubd10\ubd11\ubd12\ubd13\ubd14\ubd15\ubd16\ubd17\ubd18\ubd19\ubd1a\ubd1b\ubd1c\ubd1d\ubd1e\ubd1f\ubd20\ubd21\ubd22\ubd23\ubd24\ubd25\ubd26\ubd27\ubd28\ubd29\ubd2a\ubd2b\ubd2c\ubd2d\ubd2e\ubd2f\ubd30\ubd31\ubd32\ubd33\ubd34\ubd35\ubd36\ubd37\ubd38\ubd39\ubd3a\ubd3b\ubd3c\ubd3d\ubd3e\ubd3f\ubd40\ubd41\ubd42\ubd43\ubd44\ubd45\ubd46\ubd47\ubd48\ubd49\ubd4a\ubd4b\ubd4c\ubd4d\ubd4e\ubd4f\ubd50\ubd51\ubd52\ubd53\ubd54\ubd55\ubd56\ubd57\ubd58\ubd59\ubd5a\ubd5b\ubd5c\ubd5d\ubd5e\ubd5f\ubd60\ubd61\ubd62\ubd63\ubd64\ubd65\ubd66\ubd67\ubd68\ubd69\ubd6a\ubd6b\ubd6c\ubd6d\ubd6e\ubd6f\ubd70\ubd71\ubd72\ubd73\ubd74\ubd75\ubd76\ubd77\ubd78\ubd79\ubd7a\ubd7b\ubd7c\ubd7d\ubd7e\ubd7f\ubd80\ubd81\ubd82\ubd83\ubd84\ubd85\ubd86\ubd87\ubd88\ubd89\ubd8a\ubd8b\ubd8c\ubd8d\ubd8e\ubd8f\ubd90\ubd91\ubd92\ubd93\ubd94\ubd95\ubd96\ubd97\ubd98\ubd99\ubd9a\ubd9b\ubd9c\ubd9d\ubd9e\ubd9f\ubda0\ubda1\ubda2\ubda3\ubda4\ubda5\ubda6\ubda7\ubda8\ubda9\ubdaa\ubdab\ubdac\ubdad\ubdae\ubdaf\ubdb0\ubdb1\ubdb2\ubdb3\ubdb4\ubdb5\ubdb6\ubdb7\ubdb8\ubdb9\ubdba\ubdbb\ubdbc\ubdbd\ubdbe\ubdbf\ubdc0\ubdc1\ubdc2\ubdc3\ubdc4\ubdc5\ubdc6\ubdc7\ubdc8\ubdc9\ubdca\ubdcb\ubdcc\ubdcd\ubdce\ubdcf\ubdd0\ubdd1\ubdd2\ubdd3\ubdd4\ubdd5\ubdd6\ubdd7\ubdd8\ubdd9\ubdda\ubddb\ubddc\ubddd\ubdde\ubddf\ubde0\ubde1\ubde2\ubde3\ubde4\ubde5\ubde6\ubde7\ubde8\ubde9\ubdea\ubdeb\ubdec\ubded\ubdee\ubdef\ubdf0\ubdf1\ubdf2\ubdf3\ubdf4\ubdf5\ubdf6\ubdf7\ubdf8\ubdf9\ubdfa\ubdfb\ubdfc\ubdfd\ubdfe\ubdff\ube00\ube01\ube02\ube03\ube04\ube05\ube06\ube07\ube08\ube09\ube0a\ube0b\ube0c\ube0d\ube0e\ube0f\ube10\ube11\ube12\ube13\ube14\ube15\ube16\ube17\ube18\ube19\ube1a\ube1b\ube1c\ube1d\ube1e\ube1f\ube20\ube21\ube22\ube23\ube24\ube25\ube26\ube27\ube28\ube29\ube2a\ube2b\ube2c\ube2d\ube2e\ube2f\ube30\ube31\ube32\ube33\ube34\ube35\ube36\ube37\ube38\ube39\ube3a\ube3b\ube3c\ube3d\ube3e\ube3f\ube40\ube41\ube42\ube43\ube44\ube45\ube46\ube47\ube48\ube49\ube4a\ube4b\ube4c\ube4d\ube4e\ube4f\ube50\ube51\ube52\ube53\ube54\ube55\ube56\ube57\ube58\ube59\ube5a\ube5b\ube5c\ube5d\ube5e\ube5f\ube60\ube61\ube62\ube63\ube64\ube65\ube66\ube67\ube68\ube69\ube6a\ube6b\ube6c\ube6d\ube6e\ube6f\ube70\ube71\ube72\ube73\ube74\ube75\ube76\ube77\ube78\ube79\ube7a\ube7b\ube7c\ube7d\ube7e\ube7f\ube80\ube81\ube82\ube83\ube84\ube85\ube86\ube87\ube88\ube89\ube8a\ube8b\ube8c\ube8d\ube8e\ube8f\ube90\ube91\ube92\ube93\ube94\ube95\ube96\ube97\ube98\ube99\ube9a\ube9b\ube9c\ube9d\ube9e\ube9f\ubea0\ubea1\ubea2\ubea3\ubea4\ubea5\ubea6\ubea7\ubea8\ubea9\ubeaa\ubeab\ubeac\ubead\ubeae\ubeaf\ubeb0\ubeb1\ubeb2\ubeb3\ubeb4\ubeb5\ubeb6\ubeb7\ubeb8\ubeb9\ubeba\ubebb\ubebc\ubebd\ubebe\ubebf\ubec0\ubec1\ubec2\ubec3\ubec4\ubec5\ubec6\ubec7\ubec8\ubec9\ubeca\ubecb\ubecc\ubecd\ubece\ubecf\ubed0\ubed1\ubed2\ubed3\ubed4\ubed5\ubed6\ubed7\ubed8\ubed9\ubeda\ubedb\ubedc\ubedd\ubede\ubedf\ubee0\ubee1\ubee2\ubee3\ubee4\ubee5\ubee6\ubee7\ubee8\ubee9\ubeea\ubeeb\ubeec\ubeed\ubeee\ubeef\ubef0\ubef1\ubef2\ubef3\ubef4\ubef5\ubef6\ubef7\ubef8\ubef9\ubefa\ubefb\ubefc\ubefd\ubefe\ubeff\ubf00\ubf01\ubf02\ubf03\ubf04\ubf05\ubf06\ubf07\ubf08\ubf09\ubf0a\ubf0b\ubf0c\ubf0d\ubf0e\ubf0f\ubf10\ubf11\ubf12\ubf13\ubf14\ubf15\ubf16\ubf17\ubf18\ubf19\ubf1a\ubf1b\ubf1c\ubf1d\ubf1e\ubf1f\ubf20\ubf21\ubf22\ubf23\ubf24\ubf25\ubf26\ubf27\ubf28\ubf29\ubf2a\ubf2b\ubf2c\ubf2d\ubf2e\ubf2f\ubf30\ubf31\ubf32\ubf33\ubf34\ubf35\ubf36\ubf37\ubf38\ubf39\ubf3a\ubf3b\ubf3c\ubf3d\ubf3e\ubf3f\ubf40\ubf41\ubf42\ubf43\ubf44\ubf45\ubf46\ubf47\ubf48\ubf49\ubf4a\ubf4b\ubf4c\ubf4d\ubf4e\ubf4f\ubf50\ubf51\ubf52\ubf53\ubf54\ubf55\ubf56\ubf57\ubf58\ubf59\ubf5a\ubf5b\ubf5c\ubf5d\ubf5e\ubf5f\ubf60\ubf61\ubf62\ubf63\ubf64\ubf65\ubf66\ubf67\ubf68\ubf69\ubf6a\ubf6b\ubf6c\ubf6d\ubf6e\ubf6f\ubf70\ubf71\ubf72\ubf73\ubf74\ubf75\ubf76\ubf77\ubf78\ubf79\ubf7a\ubf7b\ubf7c\ubf7d\ubf7e\ubf7f\ubf80\ubf81\ubf82\ubf83\ubf84\ubf85\ubf86\ubf87\ubf88\ubf89\ubf8a\ubf8b\ubf8c\ubf8d\ubf8e\ubf8f\ubf90\ubf91\ubf92\ubf93\ubf94\ubf95\ubf96\ubf97\ubf98\ubf99\ubf9a\ubf9b\ubf9c\ubf9d\ubf9e\ubf9f\ubfa0\ubfa1\ubfa2\ubfa3\ubfa4\ubfa5\ubfa6\ubfa7\ubfa8\ubfa9\ubfaa\ubfab\ubfac\ubfad\ubfae\ubfaf\ubfb0\ubfb1\ubfb2\ubfb3\ubfb4\ubfb5\ubfb6\ubfb7\ubfb8\ubfb9\ubfba\ubfbb\ubfbc\ubfbd\ubfbe\ubfbf\ubfc0\ubfc1\ubfc2\ubfc3\ubfc4\ubfc5\ubfc6\ubfc7\ubfc8\ubfc9\ubfca\ubfcb\ubfcc\ubfcd\ubfce\ubfcf\ubfd0\ubfd1\ubfd2\ubfd3\ubfd4\ubfd5\ubfd6\ubfd7\ubfd8\ubfd9\ubfda\ubfdb\ubfdc\ubfdd\ubfde\ubfdf\ubfe0\ubfe1\ubfe2\ubfe3\ubfe4\ubfe5\ubfe6\ubfe7\ubfe8\ubfe9\ubfea\ubfeb\ubfec\ubfed\ubfee\ubfef\ubff0\ubff1\ubff2\ubff3\ubff4\ubff5\ubff6\ubff7\ubff8\ubff9\ubffa\ubffb\ubffc\ubffd\ubffe\ubfff\uc000\uc001\uc002\uc003\uc004\uc005\uc006\uc007\uc008\uc009\uc00a\uc00b\uc00c\uc00d\uc00e\uc00f\uc010\uc011\uc012\uc013\uc014\uc015\uc016\uc017\uc018\uc019\uc01a\uc01b\uc01c\uc01d\uc01e\uc01f\uc020\uc021\uc022\uc023\uc024\uc025\uc026\uc027\uc028\uc029\uc02a\uc02b\uc02c\uc02d\uc02e\uc02f\uc030\uc031\uc032\uc033\uc034\uc035\uc036\uc037\uc038\uc039\uc03a\uc03b\uc03c\uc03d\uc03e\uc03f\uc040\uc041\uc042\uc043\uc044\uc045\uc046\uc047\uc048\uc049\uc04a\uc04b\uc04c\uc04d\uc04e\uc04f\uc050\uc051\uc052\uc053\uc054\uc055\uc056\uc057\uc058\uc059\uc05a\uc05b\uc05c\uc05d\uc05e\uc05f\uc060\uc061\uc062\uc063\uc064\uc065\uc066\uc067\uc068\uc069\uc06a\uc06b\uc06c\uc06d\uc06e\uc06f\uc070\uc071\uc072\uc073\uc074\uc075\uc076\uc077\uc078\uc079\uc07a\uc07b\uc07c\uc07d\uc07e\uc07f\uc080\uc081\uc082\uc083\uc084\uc085\uc086\uc087\uc088\uc089\uc08a\uc08b\uc08c\uc08d\uc08e\uc08f\uc090\uc091\uc092\uc093\uc094\uc095\uc096\uc097\uc098\uc099\uc09a\uc09b\uc09c\uc09d\uc09e\uc09f\uc0a0\uc0a1\uc0a2\uc0a3\uc0a4\uc0a5\uc0a6\uc0a7\uc0a8\uc0a9\uc0aa\uc0ab\uc0ac\uc0ad\uc0ae\uc0af\uc0b0\uc0b1\uc0b2\uc0b3\uc0b4\uc0b5\uc0b6\uc0b7\uc0b8\uc0b9\uc0ba\uc0bb\uc0bc\uc0bd\uc0be\uc0bf\uc0c0\uc0c1\uc0c2\uc0c3\uc0c4\uc0c5\uc0c6\uc0c7\uc0c8\uc0c9\uc0ca\uc0cb\uc0cc\uc0cd\uc0ce\uc0cf\uc0d0\uc0d1\uc0d2\uc0d3\uc0d4\uc0d5\uc0d6\uc0d7\uc0d8\uc0d9\uc0da\uc0db\uc0dc\uc0dd\uc0de\uc0df\uc0e0\uc0e1\uc0e2\uc0e3\uc0e4\uc0e5\uc0e6\uc0e7\uc0e8\uc0e9\uc0ea\uc0eb\uc0ec\uc0ed\uc0ee\uc0ef\uc0f0\uc0f1\uc0f2\uc0f3\uc0f4\uc0f5\uc0f6\uc0f7\uc0f8\uc0f9\uc0fa\uc0fb\uc0fc\uc0fd\uc0fe\uc0ff\uc100\uc101\uc102\uc103\uc104\uc105\uc106\uc107\uc108\uc109\uc10a\uc10b\uc10c\uc10d\uc10e\uc10f\uc110\uc111\uc112\uc113\uc114\uc115\uc116\uc117\uc118\uc119\uc11a\uc11b\uc11c\uc11d\uc11e\uc11f\uc120\uc121\uc122\uc123\uc124\uc125\uc126\uc127\uc128\uc129\uc12a\uc12b\uc12c\uc12d\uc12e\uc12f\uc130\uc131\uc132\uc133\uc134\uc135\uc136\uc137\uc138\uc139\uc13a\uc13b\uc13c\uc13d\uc13e\uc13f\uc140\uc141\uc142\uc143\uc144\uc145\uc146\uc147\uc148\uc149\uc14a\uc14b\uc14c\uc14d\uc14e\uc14f\uc150\uc151\uc152\uc153\uc154\uc155\uc156\uc157\uc158\uc159\uc15a\uc15b\uc15c\uc15d\uc15e\uc15f\uc160\uc161\uc162\uc163\uc164\uc165\uc166\uc167\uc168\uc169\uc16a\uc16b\uc16c\uc16d\uc16e\uc16f\uc170\uc171\uc172\uc173\uc174\uc175\uc176\uc177\uc178\uc179\uc17a\uc17b\uc17c\uc17d\uc17e\uc17f\uc180\uc181\uc182\uc183\uc184\uc185\uc186\uc187\uc188\uc189\uc18a\uc18b\uc18c\uc18d\uc18e\uc18f\uc190\uc191\uc192\uc193\uc194\uc195\uc196\uc197\uc198\uc199\uc19a\uc19b\uc19c\uc19d\uc19e\uc19f\uc1a0\uc1a1\uc1a2\uc1a3\uc1a4\uc1a5\uc1a6\uc1a7\uc1a8\uc1a9\uc1aa\uc1ab\uc1ac\uc1ad\uc1ae\uc1af\uc1b0\uc1b1\uc1b2\uc1b3\uc1b4\uc1b5\uc1b6\uc1b7\uc1b8\uc1b9\uc1ba\uc1bb\uc1bc\uc1bd\uc1be\uc1bf\uc1c0\uc1c1\uc1c2\uc1c3\uc1c4\uc1c5\uc1c6\uc1c7\uc1c8\uc1c9\uc1ca\uc1cb\uc1cc\uc1cd\uc1ce\uc1cf\uc1d0\uc1d1\uc1d2\uc1d3\uc1d4\uc1d5\uc1d6\uc1d7\uc1d8\uc1d9\uc1da\uc1db\uc1dc\uc1dd\uc1de\uc1df\uc1e0\uc1e1\uc1e2\uc1e3\uc1e4\uc1e5\uc1e6\uc1e7\uc1e8\uc1e9\uc1ea\uc1eb\uc1ec\uc1ed\uc1ee\uc1ef\uc1f0\uc1f1\uc1f2\uc1f3\uc1f4\uc1f5\uc1f6\uc1f7\uc1f8\uc1f9\uc1fa\uc1fb\uc1fc\uc1fd\uc1fe\uc1ff\uc200\uc201\uc202\uc203\uc204\uc205\uc206\uc207\uc208\uc209\uc20a\uc20b\uc20c\uc20d\uc20e\uc20f\uc210\uc211\uc212\uc213\uc214\uc215\uc216\uc217\uc218\uc219\uc21a\uc21b\uc21c\uc21d\uc21e\uc21f\uc220\uc221\uc222\uc223\uc224\uc225\uc226\uc227\uc228\uc229\uc22a\uc22b\uc22c\uc22d\uc22e\uc22f\uc230\uc231\uc232\uc233\uc234\uc235\uc236\uc237\uc238\uc239\uc23a\uc23b\uc23c\uc23d\uc23e\uc23f\uc240\uc241\uc242\uc243\uc244\uc245\uc246\uc247\uc248\uc249\uc24a\uc24b\uc24c\uc24d\uc24e\uc24f\uc250\uc251\uc252\uc253\uc254\uc255\uc256\uc257\uc258\uc259\uc25a\uc25b\uc25c\uc25d\uc25e\uc25f\uc260\uc261\uc262\uc263\uc264\uc265\uc266\uc267\uc268\uc269\uc26a\uc26b\uc26c\uc26d\uc26e\uc26f\uc270\uc271\uc272\uc273\uc274\uc275\uc276\uc277\uc278\uc279\uc27a\uc27b\uc27c\uc27d\uc27e\uc27f\uc280\uc281\uc282\uc283\uc284\uc285\uc286\uc287\uc288\uc289\uc28a\uc28b\uc28c\uc28d\uc28e\uc28f\uc290\uc291\uc292\uc293\uc294\uc295\uc296\uc297\uc298\uc299\uc29a\uc29b\uc29c\uc29d\uc29e\uc29f\uc2a0\uc2a1\uc2a2\uc2a3\uc2a4\uc2a5\uc2a6\uc2a7\uc2a8\uc2a9\uc2aa\uc2ab\uc2ac\uc2ad\uc2ae\uc2af\uc2b0\uc2b1\uc2b2\uc2b3\uc2b4\uc2b5\uc2b6\uc2b7\uc2b8\uc2b9\uc2ba\uc2bb\uc2bc\uc2bd\uc2be\uc2bf\uc2c0\uc2c1\uc2c2\uc2c3\uc2c4\uc2c5\uc2c6\uc2c7\uc2c8\uc2c9\uc2ca\uc2cb\uc2cc\uc2cd\uc2ce\uc2cf\uc2d0\uc2d1\uc2d2\uc2d3\uc2d4\uc2d5\uc2d6\uc2d7\uc2d8\uc2d9\uc2da\uc2db\uc2dc\uc2dd\uc2de\uc2df\uc2e0\uc2e1\uc2e2\uc2e3\uc2e4\uc2e5\uc2e6\uc2e7\uc2e8\uc2e9\uc2ea\uc2eb\uc2ec\uc2ed\uc2ee\uc2ef\uc2f0\uc2f1\uc2f2\uc2f3\uc2f4\uc2f5\uc2f6\uc2f7\uc2f8\uc2f9\uc2fa\uc2fb\uc2fc\uc2fd\uc2fe\uc2ff\uc300\uc301\uc302\uc303\uc304\uc305\uc306\uc307\uc308\uc309\uc30a\uc30b\uc30c\uc30d\uc30e\uc30f\uc310\uc311\uc312\uc313\uc314\uc315\uc316\uc317\uc318\uc319\uc31a\uc31b\uc31c\uc31d\uc31e\uc31f\uc320\uc321\uc322\uc323\uc324\uc325\uc326\uc327\uc328\uc329\uc32a\uc32b\uc32c\uc32d\uc32e\uc32f\uc330\uc331\uc332\uc333\uc334\uc335\uc336\uc337\uc338\uc339\uc33a\uc33b\uc33c\uc33d\uc33e\uc33f\uc340\uc341\uc342\uc343\uc344\uc345\uc346\uc347\uc348\uc349\uc34a\uc34b\uc34c\uc34d\uc34e\uc34f\uc350\uc351\uc352\uc353\uc354\uc355\uc356\uc357\uc358\uc359\uc35a\uc35b\uc35c\uc35d\uc35e\uc35f\uc360\uc361\uc362\uc363\uc364\uc365\uc366\uc367\uc368\uc369\uc36a\uc36b\uc36c\uc36d\uc36e\uc36f\uc370\uc371\uc372\uc373\uc374\uc375\uc376\uc377\uc378\uc379\uc37a\uc37b\uc37c\uc37d\uc37e\uc37f\uc380\uc381\uc382\uc383\uc384\uc385\uc386\uc387\uc388\uc389\uc38a\uc38b\uc38c\uc38d\uc38e\uc38f\uc390\uc391\uc392\uc393\uc394\uc395\uc396\uc397\uc398\uc399\uc39a\uc39b\uc39c\uc39d\uc39e\uc39f\uc3a0\uc3a1\uc3a2\uc3a3\uc3a4\uc3a5\uc3a6\uc3a7\uc3a8\uc3a9\uc3aa\uc3ab\uc3ac\uc3ad\uc3ae\uc3af\uc3b0\uc3b1\uc3b2\uc3b3\uc3b4\uc3b5\uc3b6\uc3b7\uc3b8\uc3b9\uc3ba\uc3bb\uc3bc\uc3bd\uc3be\uc3bf\uc3c0\uc3c1\uc3c2\uc3c3\uc3c4\uc3c5\uc3c6\uc3c7\uc3c8\uc3c9\uc3ca\uc3cb\uc3cc\uc3cd\uc3ce\uc3cf\uc3d0\uc3d1\uc3d2\uc3d3\uc3d4\uc3d5\uc3d6\uc3d7\uc3d8\uc3d9\uc3da\uc3db\uc3dc\uc3dd\uc3de\uc3df\uc3e0\uc3e1\uc3e2\uc3e3\uc3e4\uc3e5\uc3e6\uc3e7\uc3e8\uc3e9\uc3ea\uc3eb\uc3ec\uc3ed\uc3ee\uc3ef\uc3f0\uc3f1\uc3f2\uc3f3\uc3f4\uc3f5\uc3f6\uc3f7\uc3f8\uc3f9\uc3fa\uc3fb\uc3fc\uc3fd\uc3fe\uc3ff\uc400\uc401\uc402\uc403\uc404\uc405\uc406\uc407\uc408\uc409\uc40a\uc40b\uc40c\uc40d\uc40e\uc40f\uc410\uc411\uc412\uc413\uc414\uc415\uc416\uc417\uc418\uc419\uc41a\uc41b\uc41c\uc41d\uc41e\uc41f\uc420\uc421\uc422\uc423\uc424\uc425\uc426\uc427\uc428\uc429\uc42a\uc42b\uc42c\uc42d\uc42e\uc42f\uc430\uc431\uc432\uc433\uc434\uc435\uc436\uc437\uc438\uc439\uc43a\uc43b\uc43c\uc43d\uc43e\uc43f\uc440\uc441\uc442\uc443\uc444\uc445\uc446\uc447\uc448\uc449\uc44a\uc44b\uc44c\uc44d\uc44e\uc44f\uc450\uc451\uc452\uc453\uc454\uc455\uc456\uc457\uc458\uc459\uc45a\uc45b\uc45c\uc45d\uc45e\uc45f\uc460\uc461\uc462\uc463\uc464\uc465\uc466\uc467\uc468\uc469\uc46a\uc46b\uc46c\uc46d\uc46e\uc46f\uc470\uc471\uc472\uc473\uc474\uc475\uc476\uc477\uc478\uc479\uc47a\uc47b\uc47c\uc47d\uc47e\uc47f\uc480\uc481\uc482\uc483\uc484\uc485\uc486\uc487\uc488\uc489\uc48a\uc48b\uc48c\uc48d\uc48e\uc48f\uc490\uc491\uc492\uc493\uc494\uc495\uc496\uc497\uc498\uc499\uc49a\uc49b\uc49c\uc49d\uc49e\uc49f\uc4a0\uc4a1\uc4a2\uc4a3\uc4a4\uc4a5\uc4a6\uc4a7\uc4a8\uc4a9\uc4aa\uc4ab\uc4ac\uc4ad\uc4ae\uc4af\uc4b0\uc4b1\uc4b2\uc4b3\uc4b4\uc4b5\uc4b6\uc4b7\uc4b8\uc4b9\uc4ba\uc4bb\uc4bc\uc4bd\uc4be\uc4bf\uc4c0\uc4c1\uc4c2\uc4c3\uc4c4\uc4c5\uc4c6\uc4c7\uc4c8\uc4c9\uc4ca\uc4cb\uc4cc\uc4cd\uc4ce\uc4cf\uc4d0\uc4d1\uc4d2\uc4d3\uc4d4\uc4d5\uc4d6\uc4d7\uc4d8\uc4d9\uc4da\uc4db\uc4dc\uc4dd\uc4de\uc4df\uc4e0\uc4e1\uc4e2\uc4e3\uc4e4\uc4e5\uc4e6\uc4e7\uc4e8\uc4e9\uc4ea\uc4eb\uc4ec\uc4ed\uc4ee\uc4ef\uc4f0\uc4f1\uc4f2\uc4f3\uc4f4\uc4f5\uc4f6\uc4f7\uc4f8\uc4f9\uc4fa\uc4fb\uc4fc\uc4fd\uc4fe\uc4ff\uc500\uc501\uc502\uc503\uc504\uc505\uc506\uc507\uc508\uc509\uc50a\uc50b\uc50c\uc50d\uc50e\uc50f\uc510\uc511\uc512\uc513\uc514\uc515\uc516\uc517\uc518\uc519\uc51a\uc51b\uc51c\uc51d\uc51e\uc51f\uc520\uc521\uc522\uc523\uc524\uc525\uc526\uc527\uc528\uc529\uc52a\uc52b\uc52c\uc52d\uc52e\uc52f\uc530\uc531\uc532\uc533\uc534\uc535\uc536\uc537\uc538\uc539\uc53a\uc53b\uc53c\uc53d\uc53e\uc53f\uc540\uc541\uc542\uc543\uc544\uc545\uc546\uc547\uc548\uc549\uc54a\uc54b\uc54c\uc54d\uc54e\uc54f\uc550\uc551\uc552\uc553\uc554\uc555\uc556\uc557\uc558\uc559\uc55a\uc55b\uc55c\uc55d\uc55e\uc55f\uc560\uc561\uc562\uc563\uc564\uc565\uc566\uc567\uc568\uc569\uc56a\uc56b\uc56c\uc56d\uc56e\uc56f\uc570\uc571\uc572\uc573\uc574\uc575\uc576\uc577\uc578\uc579\uc57a\uc57b\uc57c\uc57d\uc57e\uc57f\uc580\uc581\uc582\uc583\uc584\uc585\uc586\uc587\uc588\uc589\uc58a\uc58b\uc58c\uc58d\uc58e\uc58f\uc590\uc591\uc592\uc593\uc594\uc595\uc596\uc597\uc598\uc599\uc59a\uc59b\uc59c\uc59d\uc59e\uc59f\uc5a0\uc5a1\uc5a2\uc5a3\uc5a4\uc5a5\uc5a6\uc5a7\uc5a8\uc5a9\uc5aa\uc5ab\uc5ac\uc5ad\uc5ae\uc5af\uc5b0\uc5b1\uc5b2\uc5b3\uc5b4\uc5b5\uc5b6\uc5b7\uc5b8\uc5b9\uc5ba\uc5bb\uc5bc\uc5bd\uc5be\uc5bf\uc5c0\uc5c1\uc5c2\uc5c3\uc5c4\uc5c5\uc5c6\uc5c7\uc5c8\uc5c9\uc5ca\uc5cb\uc5cc\uc5cd\uc5ce\uc5cf\uc5d0\uc5d1\uc5d2\uc5d3\uc5d4\uc5d5\uc5d6\uc5d7\uc5d8\uc5d9\uc5da\uc5db\uc5dc\uc5dd\uc5de\uc5df\uc5e0\uc5e1\uc5e2\uc5e3\uc5e4\uc5e5\uc5e6\uc5e7\uc5e8\uc5e9\uc5ea\uc5eb\uc5ec\uc5ed\uc5ee\uc5ef\uc5f0\uc5f1\uc5f2\uc5f3\uc5f4\uc5f5\uc5f6\uc5f7\uc5f8\uc5f9\uc5fa\uc5fb\uc5fc\uc5fd\uc5fe\uc5ff\uc600\uc601\uc602\uc603\uc604\uc605\uc606\uc607\uc608\uc609\uc60a\uc60b\uc60c\uc60d\uc60e\uc60f\uc610\uc611\uc612\uc613\uc614\uc615\uc616\uc617\uc618\uc619\uc61a\uc61b\uc61c\uc61d\uc61e\uc61f\uc620\uc621\uc622\uc623\uc624\uc625\uc626\uc627\uc628\uc629\uc62a\uc62b\uc62c\uc62d\uc62e\uc62f\uc630\uc631\uc632\uc633\uc634\uc635\uc636\uc637\uc638\uc639\uc63a\uc63b\uc63c\uc63d\uc63e\uc63f\uc640\uc641\uc642\uc643\uc644\uc645\uc646\uc647\uc648\uc649\uc64a\uc64b\uc64c\uc64d\uc64e\uc64f\uc650\uc651\uc652\uc653\uc654\uc655\uc656\uc657\uc658\uc659\uc65a\uc65b\uc65c\uc65d\uc65e\uc65f\uc660\uc661\uc662\uc663\uc664\uc665\uc666\uc667\uc668\uc669\uc66a\uc66b\uc66c\uc66d\uc66e\uc66f\uc670\uc671\uc672\uc673\uc674\uc675\uc676\uc677\uc678\uc679\uc67a\uc67b\uc67c\uc67d\uc67e\uc67f\uc680\uc681\uc682\uc683\uc684\uc685\uc686\uc687\uc688\uc689\uc68a\uc68b\uc68c\uc68d\uc68e\uc68f\uc690\uc691\uc692\uc693\uc694\uc695\uc696\uc697\uc698\uc699\uc69a\uc69b\uc69c\uc69d\uc69e\uc69f\uc6a0\uc6a1\uc6a2\uc6a3\uc6a4\uc6a5\uc6a6\uc6a7\uc6a8\uc6a9\uc6aa\uc6ab\uc6ac\uc6ad\uc6ae\uc6af\uc6b0\uc6b1\uc6b2\uc6b3\uc6b4\uc6b5\uc6b6\uc6b7\uc6b8\uc6b9\uc6ba\uc6bb\uc6bc\uc6bd\uc6be\uc6bf\uc6c0\uc6c1\uc6c2\uc6c3\uc6c4\uc6c5\uc6c6\uc6c7\uc6c8\uc6c9\uc6ca\uc6cb\uc6cc\uc6cd\uc6ce\uc6cf\uc6d0\uc6d1\uc6d2\uc6d3\uc6d4\uc6d5\uc6d6\uc6d7\uc6d8\uc6d9\uc6da\uc6db\uc6dc\uc6dd\uc6de\uc6df\uc6e0\uc6e1\uc6e2\uc6e3\uc6e4\uc6e5\uc6e6\uc6e7\uc6e8\uc6e9\uc6ea\uc6eb\uc6ec\uc6ed\uc6ee\uc6ef\uc6f0\uc6f1\uc6f2\uc6f3\uc6f4\uc6f5\uc6f6\uc6f7\uc6f8\uc6f9\uc6fa\uc6fb\uc6fc\uc6fd\uc6fe\uc6ff\uc700\uc701\uc702\uc703\uc704\uc705\uc706\uc707\uc708\uc709\uc70a\uc70b\uc70c\uc70d\uc70e\uc70f\uc710\uc711\uc712\uc713\uc714\uc715\uc716\uc717\uc718\uc719\uc71a\uc71b\uc71c\uc71d\uc71e\uc71f\uc720\uc721\uc722\uc723\uc724\uc725\uc726\uc727\uc728\uc729\uc72a\uc72b\uc72c\uc72d\uc72e\uc72f\uc730\uc731\uc732\uc733\uc734\uc735\uc736\uc737\uc738\uc739\uc73a\uc73b\uc73c\uc73d\uc73e\uc73f\uc740\uc741\uc742\uc743\uc744\uc745\uc746\uc747\uc748\uc749\uc74a\uc74b\uc74c\uc74d\uc74e\uc74f\uc750\uc751\uc752\uc753\uc754\uc755\uc756\uc757\uc758\uc759\uc75a\uc75b\uc75c\uc75d\uc75e\uc75f\uc760\uc761\uc762\uc763\uc764\uc765\uc766\uc767\uc768\uc769\uc76a\uc76b\uc76c\uc76d\uc76e\uc76f\uc770\uc771\uc772\uc773\uc774\uc775\uc776\uc777\uc778\uc779\uc77a\uc77b\uc77c\uc77d\uc77e\uc77f\uc780\uc781\uc782\uc783\uc784\uc785\uc786\uc787\uc788\uc789\uc78a\uc78b\uc78c\uc78d\uc78e\uc78f\uc790\uc791\uc792\uc793\uc794\uc795\uc796\uc797\uc798\uc799\uc79a\uc79b\uc79c\uc79d\uc79e\uc79f\uc7a0\uc7a1\uc7a2\uc7a3\uc7a4\uc7a5\uc7a6\uc7a7\uc7a8\uc7a9\uc7aa\uc7ab\uc7ac\uc7ad\uc7ae\uc7af\uc7b0\uc7b1\uc7b2\uc7b3\uc7b4\uc7b5\uc7b6\uc7b7\uc7b8\uc7b9\uc7ba\uc7bb\uc7bc\uc7bd\uc7be\uc7bf\uc7c0\uc7c1\uc7c2\uc7c3\uc7c4\uc7c5\uc7c6\uc7c7\uc7c8\uc7c9\uc7ca\uc7cb\uc7cc\uc7cd\uc7ce\uc7cf\uc7d0\uc7d1\uc7d2\uc7d3\uc7d4\uc7d5\uc7d6\uc7d7\uc7d8\uc7d9\uc7da\uc7db\uc7dc\uc7dd\uc7de\uc7df\uc7e0\uc7e1\uc7e2\uc7e3\uc7e4\uc7e5\uc7e6\uc7e7\uc7e8\uc7e9\uc7ea\uc7eb\uc7ec\uc7ed\uc7ee\uc7ef\uc7f0\uc7f1\uc7f2\uc7f3\uc7f4\uc7f5\uc7f6\uc7f7\uc7f8\uc7f9\uc7fa\uc7fb\uc7fc\uc7fd\uc7fe\uc7ff\uc800\uc801\uc802\uc803\uc804\uc805\uc806\uc807\uc808\uc809\uc80a\uc80b\uc80c\uc80d\uc80e\uc80f\uc810\uc811\uc812\uc813\uc814\uc815\uc816\uc817\uc818\uc819\uc81a\uc81b\uc81c\uc81d\uc81e\uc81f\uc820\uc821\uc822\uc823\uc824\uc825\uc826\uc827\uc828\uc829\uc82a\uc82b\uc82c\uc82d\uc82e\uc82f\uc830\uc831\uc832\uc833\uc834\uc835\uc836\uc837\uc838\uc839\uc83a\uc83b\uc83c\uc83d\uc83e\uc83f\uc840\uc841\uc842\uc843\uc844\uc845\uc846\uc847\uc848\uc849\uc84a\uc84b\uc84c\uc84d\uc84e\uc84f\uc850\uc851\uc852\uc853\uc854\uc855\uc856\uc857\uc858\uc859\uc85a\uc85b\uc85c\uc85d\uc85e\uc85f\uc860\uc861\uc862\uc863\uc864\uc865\uc866\uc867\uc868\uc869\uc86a\uc86b\uc86c\uc86d\uc86e\uc86f\uc870\uc871\uc872\uc873\uc874\uc875\uc876\uc877\uc878\uc879\uc87a\uc87b\uc87c\uc87d\uc87e\uc87f\uc880\uc881\uc882\uc883\uc884\uc885\uc886\uc887\uc888\uc889\uc88a\uc88b\uc88c\uc88d\uc88e\uc88f\uc890\uc891\uc892\uc893\uc894\uc895\uc896\uc897\uc898\uc899\uc89a\uc89b\uc89c\uc89d\uc89e\uc89f\uc8a0\uc8a1\uc8a2\uc8a3\uc8a4\uc8a5\uc8a6\uc8a7\uc8a8\uc8a9\uc8aa\uc8ab\uc8ac\uc8ad\uc8ae\uc8af\uc8b0\uc8b1\uc8b2\uc8b3\uc8b4\uc8b5\uc8b6\uc8b7\uc8b8\uc8b9\uc8ba\uc8bb\uc8bc\uc8bd\uc8be\uc8bf\uc8c0\uc8c1\uc8c2\uc8c3\uc8c4\uc8c5\uc8c6\uc8c7\uc8c8\uc8c9\uc8ca\uc8cb\uc8cc\uc8cd\uc8ce\uc8cf\uc8d0\uc8d1\uc8d2\uc8d3\uc8d4\uc8d5\uc8d6\uc8d7\uc8d8\uc8d9\uc8da\uc8db\uc8dc\uc8dd\uc8de\uc8df\uc8e0\uc8e1\uc8e2\uc8e3\uc8e4\uc8e5\uc8e6\uc8e7\uc8e8\uc8e9\uc8ea\uc8eb\uc8ec\uc8ed\uc8ee\uc8ef\uc8f0\uc8f1\uc8f2\uc8f3\uc8f4\uc8f5\uc8f6\uc8f7\uc8f8\uc8f9\uc8fa\uc8fb\uc8fc\uc8fd\uc8fe\uc8ff\uc900\uc901\uc902\uc903\uc904\uc905\uc906\uc907\uc908\uc909\uc90a\uc90b\uc90c\uc90d\uc90e\uc90f\uc910\uc911\uc912\uc913\uc914\uc915\uc916\uc917\uc918\uc919\uc91a\uc91b\uc91c\uc91d\uc91e\uc91f\uc920\uc921\uc922\uc923\uc924\uc925\uc926\uc927\uc928\uc929\uc92a\uc92b\uc92c\uc92d\uc92e\uc92f\uc930\uc931\uc932\uc933\uc934\uc935\uc936\uc937\uc938\uc939\uc93a\uc93b\uc93c\uc93d\uc93e\uc93f\uc940\uc941\uc942\uc943\uc944\uc945\uc946\uc947\uc948\uc949\uc94a\uc94b\uc94c\uc94d\uc94e\uc94f\uc950\uc951\uc952\uc953\uc954\uc955\uc956\uc957\uc958\uc959\uc95a\uc95b\uc95c\uc95d\uc95e\uc95f\uc960\uc961\uc962\uc963\uc964\uc965\uc966\uc967\uc968\uc969\uc96a\uc96b\uc96c\uc96d\uc96e\uc96f\uc970\uc971\uc972\uc973\uc974\uc975\uc976\uc977\uc978\uc979\uc97a\uc97b\uc97c\uc97d\uc97e\uc97f\uc980\uc981\uc982\uc983\uc984\uc985\uc986\uc987\uc988\uc989\uc98a\uc98b\uc98c\uc98d\uc98e\uc98f\uc990\uc991\uc992\uc993\uc994\uc995\uc996\uc997\uc998\uc999\uc99a\uc99b\uc99c\uc99d\uc99e\uc99f\uc9a0\uc9a1\uc9a2\uc9a3\uc9a4\uc9a5\uc9a6\uc9a7\uc9a8\uc9a9\uc9aa\uc9ab\uc9ac\uc9ad\uc9ae\uc9af\uc9b0\uc9b1\uc9b2\uc9b3\uc9b4\uc9b5\uc9b6\uc9b7\uc9b8\uc9b9\uc9ba\uc9bb\uc9bc\uc9bd\uc9be\uc9bf\uc9c0\uc9c1\uc9c2\uc9c3\uc9c4\uc9c5\uc9c6\uc9c7\uc9c8\uc9c9\uc9ca\uc9cb\uc9cc\uc9cd\uc9ce\uc9cf\uc9d0\uc9d1\uc9d2\uc9d3\uc9d4\uc9d5\uc9d6\uc9d7\uc9d8\uc9d9\uc9da\uc9db\uc9dc\uc9dd\uc9de\uc9df\uc9e0\uc9e1\uc9e2\uc9e3\uc9e4\uc9e5\uc9e6\uc9e7\uc9e8\uc9e9\uc9ea\uc9eb\uc9ec\uc9ed\uc9ee\uc9ef\uc9f0\uc9f1\uc9f2\uc9f3\uc9f4\uc9f5\uc9f6\uc9f7\uc9f8\uc9f9\uc9fa\uc9fb\uc9fc\uc9fd\uc9fe\uc9ff\uca00\uca01\uca02\uca03\uca04\uca05\uca06\uca07\uca08\uca09\uca0a\uca0b\uca0c\uca0d\uca0e\uca0f\uca10\uca11\uca12\uca13\uca14\uca15\uca16\uca17\uca18\uca19\uca1a\uca1b\uca1c\uca1d\uca1e\uca1f\uca20\uca21\uca22\uca23\uca24\uca25\uca26\uca27\uca28\uca29\uca2a\uca2b\uca2c\uca2d\uca2e\uca2f\uca30\uca31\uca32\uca33\uca34\uca35\uca36\uca37\uca38\uca39\uca3a\uca3b\uca3c\uca3d\uca3e\uca3f\uca40\uca41\uca42\uca43\uca44\uca45\uca46\uca47\uca48\uca49\uca4a\uca4b\uca4c\uca4d\uca4e\uca4f\uca50\uca51\uca52\uca53\uca54\uca55\uca56\uca57\uca58\uca59\uca5a\uca5b\uca5c\uca5d\uca5e\uca5f\uca60\uca61\uca62\uca63\uca64\uca65\uca66\uca67\uca68\uca69\uca6a\uca6b\uca6c\uca6d\uca6e\uca6f\uca70\uca71\uca72\uca73\uca74\uca75\uca76\uca77\uca78\uca79\uca7a\uca7b\uca7c\uca7d\uca7e\uca7f\uca80\uca81\uca82\uca83\uca84\uca85\uca86\uca87\uca88\uca89\uca8a\uca8b\uca8c\uca8d\uca8e\uca8f\uca90\uca91\uca92\uca93\uca94\uca95\uca96\uca97\uca98\uca99\uca9a\uca9b\uca9c\uca9d\uca9e\uca9f\ucaa0\ucaa1\ucaa2\ucaa3\ucaa4\ucaa5\ucaa6\ucaa7\ucaa8\ucaa9\ucaaa\ucaab\ucaac\ucaad\ucaae\ucaaf\ucab0\ucab1\ucab2\ucab3\ucab4\ucab5\ucab6\ucab7\ucab8\ucab9\ucaba\ucabb\ucabc\ucabd\ucabe\ucabf\ucac0\ucac1\ucac2\ucac3\ucac4\ucac5\ucac6\ucac7\ucac8\ucac9\ucaca\ucacb\ucacc\ucacd\ucace\ucacf\ucad0\ucad1\ucad2\ucad3\ucad4\ucad5\ucad6\ucad7\ucad8\ucad9\ucada\ucadb\ucadc\ucadd\ucade\ucadf\ucae0\ucae1\ucae2\ucae3\ucae4\ucae5\ucae6\ucae7\ucae8\ucae9\ucaea\ucaeb\ucaec\ucaed\ucaee\ucaef\ucaf0\ucaf1\ucaf2\ucaf3\ucaf4\ucaf5\ucaf6\ucaf7\ucaf8\ucaf9\ucafa\ucafb\ucafc\ucafd\ucafe\ucaff\ucb00\ucb01\ucb02\ucb03\ucb04\ucb05\ucb06\ucb07\ucb08\ucb09\ucb0a\ucb0b\ucb0c\ucb0d\ucb0e\ucb0f\ucb10\ucb11\ucb12\ucb13\ucb14\ucb15\ucb16\ucb17\ucb18\ucb19\ucb1a\ucb1b\ucb1c\ucb1d\ucb1e\ucb1f\ucb20\ucb21\ucb22\ucb23\ucb24\ucb25\ucb26\ucb27\ucb28\ucb29\ucb2a\ucb2b\ucb2c\ucb2d\ucb2e\ucb2f\ucb30\ucb31\ucb32\ucb33\ucb34\ucb35\ucb36\ucb37\ucb38\ucb39\ucb3a\ucb3b\ucb3c\ucb3d\ucb3e\ucb3f\ucb40\ucb41\ucb42\ucb43\ucb44\ucb45\ucb46\ucb47\ucb48\ucb49\ucb4a\ucb4b\ucb4c\ucb4d\ucb4e\ucb4f\ucb50\ucb51\ucb52\ucb53\ucb54\ucb55\ucb56\ucb57\ucb58\ucb59\ucb5a\ucb5b\ucb5c\ucb5d\ucb5e\ucb5f\ucb60\ucb61\ucb62\ucb63\ucb64\ucb65\ucb66\ucb67\ucb68\ucb69\ucb6a\ucb6b\ucb6c\ucb6d\ucb6e\ucb6f\ucb70\ucb71\ucb72\ucb73\ucb74\ucb75\ucb76\ucb77\ucb78\ucb79\ucb7a\ucb7b\ucb7c\ucb7d\ucb7e\ucb7f\ucb80\ucb81\ucb82\ucb83\ucb84\ucb85\ucb86\ucb87\ucb88\ucb89\ucb8a\ucb8b\ucb8c\ucb8d\ucb8e\ucb8f\ucb90\ucb91\ucb92\ucb93\ucb94\ucb95\ucb96\ucb97\ucb98\ucb99\ucb9a\ucb9b\ucb9c\ucb9d\ucb9e\ucb9f\ucba0\ucba1\ucba2\ucba3\ucba4\ucba5\ucba6\ucba7\ucba8\ucba9\ucbaa\ucbab\ucbac\ucbad\ucbae\ucbaf\ucbb0\ucbb1\ucbb2\ucbb3\ucbb4\ucbb5\ucbb6\ucbb7\ucbb8\ucbb9\ucbba\ucbbb\ucbbc\ucbbd\ucbbe\ucbbf\ucbc0\ucbc1\ucbc2\ucbc3\ucbc4\ucbc5\ucbc6\ucbc7\ucbc8\ucbc9\ucbca\ucbcb\ucbcc\ucbcd\ucbce\ucbcf\ucbd0\ucbd1\ucbd2\ucbd3\ucbd4\ucbd5\ucbd6\ucbd7\ucbd8\ucbd9\ucbda\ucbdb\ucbdc\ucbdd\ucbde\ucbdf\ucbe0\ucbe1\ucbe2\ucbe3\ucbe4\ucbe5\ucbe6\ucbe7\ucbe8\ucbe9\ucbea\ucbeb\ucbec\ucbed\ucbee\ucbef\ucbf0\ucbf1\ucbf2\ucbf3\ucbf4\ucbf5\ucbf6\ucbf7\ucbf8\ucbf9\ucbfa\ucbfb\ucbfc\ucbfd\ucbfe\ucbff\ucc00\ucc01\ucc02\ucc03\ucc04\ucc05\ucc06\ucc07\ucc08\ucc09\ucc0a\ucc0b\ucc0c\ucc0d\ucc0e\ucc0f\ucc10\ucc11\ucc12\ucc13\ucc14\ucc15\ucc16\ucc17\ucc18\ucc19\ucc1a\ucc1b\ucc1c\ucc1d\ucc1e\ucc1f\ucc20\ucc21\ucc22\ucc23\ucc24\ucc25\ucc26\ucc27\ucc28\ucc29\ucc2a\ucc2b\ucc2c\ucc2d\ucc2e\ucc2f\ucc30\ucc31\ucc32\ucc33\ucc34\ucc35\ucc36\ucc37\ucc38\ucc39\ucc3a\ucc3b\ucc3c\ucc3d\ucc3e\ucc3f\ucc40\ucc41\ucc42\ucc43\ucc44\ucc45\ucc46\ucc47\ucc48\ucc49\ucc4a\ucc4b\ucc4c\ucc4d\ucc4e\ucc4f\ucc50\ucc51\ucc52\ucc53\ucc54\ucc55\ucc56\ucc57\ucc58\ucc59\ucc5a\ucc5b\ucc5c\ucc5d\ucc5e\ucc5f\ucc60\ucc61\ucc62\ucc63\ucc64\ucc65\ucc66\ucc67\ucc68\ucc69\ucc6a\ucc6b\ucc6c\ucc6d\ucc6e\ucc6f\ucc70\ucc71\ucc72\ucc73\ucc74\ucc75\ucc76\ucc77\ucc78\ucc79\ucc7a\ucc7b\ucc7c\ucc7d\ucc7e\ucc7f\ucc80\ucc81\ucc82\ucc83\ucc84\ucc85\ucc86\ucc87\ucc88\ucc89\ucc8a\ucc8b\ucc8c\ucc8d\ucc8e\ucc8f\ucc90\ucc91\ucc92\ucc93\ucc94\ucc95\ucc96\ucc97\ucc98\ucc99\ucc9a\ucc9b\ucc9c\ucc9d\ucc9e\ucc9f\ucca0\ucca1\ucca2\ucca3\ucca4\ucca5\ucca6\ucca7\ucca8\ucca9\uccaa\uccab\uccac\uccad\uccae\uccaf\uccb0\uccb1\uccb2\uccb3\uccb4\uccb5\uccb6\uccb7\uccb8\uccb9\uccba\uccbb\uccbc\uccbd\uccbe\uccbf\uccc0\uccc1\uccc2\uccc3\uccc4\uccc5\uccc6\uccc7\uccc8\uccc9\uccca\ucccb\ucccc\ucccd\uccce\ucccf\uccd0\uccd1\uccd2\uccd3\uccd4\uccd5\uccd6\uccd7\uccd8\uccd9\uccda\uccdb\uccdc\uccdd\uccde\uccdf\ucce0\ucce1\ucce2\ucce3\ucce4\ucce5\ucce6\ucce7\ucce8\ucce9\uccea\ucceb\uccec\ucced\uccee\uccef\uccf0\uccf1\uccf2\uccf3\uccf4\uccf5\uccf6\uccf7\uccf8\uccf9\uccfa\uccfb\uccfc\uccfd\uccfe\uccff\ucd00\ucd01\ucd02\ucd03\ucd04\ucd05\ucd06\ucd07\ucd08\ucd09\ucd0a\ucd0b\ucd0c\ucd0d\ucd0e\ucd0f\ucd10\ucd11\ucd12\ucd13\ucd14\ucd15\ucd16\ucd17\ucd18\ucd19\ucd1a\ucd1b\ucd1c\ucd1d\ucd1e\ucd1f\ucd20\ucd21\ucd22\ucd23\ucd24\ucd25\ucd26\ucd27\ucd28\ucd29\ucd2a\ucd2b\ucd2c\ucd2d\ucd2e\ucd2f\ucd30\ucd31\ucd32\ucd33\ucd34\ucd35\ucd36\ucd37\ucd38\ucd39\ucd3a\ucd3b\ucd3c\ucd3d\ucd3e\ucd3f\ucd40\ucd41\ucd42\ucd43\ucd44\ucd45\ucd46\ucd47\ucd48\ucd49\ucd4a\ucd4b\ucd4c\ucd4d\ucd4e\ucd4f\ucd50\ucd51\ucd52\ucd53\ucd54\ucd55\ucd56\ucd57\ucd58\ucd59\ucd5a\ucd5b\ucd5c\ucd5d\ucd5e\ucd5f\ucd60\ucd61\ucd62\ucd63\ucd64\ucd65\ucd66\ucd67\ucd68\ucd69\ucd6a\ucd6b\ucd6c\ucd6d\ucd6e\ucd6f\ucd70\ucd71\ucd72\ucd73\ucd74\ucd75\ucd76\ucd77\ucd78\ucd79\ucd7a\ucd7b\ucd7c\ucd7d\ucd7e\ucd7f\ucd80\ucd81\ucd82\ucd83\ucd84\ucd85\ucd86\ucd87\ucd88\ucd89\ucd8a\ucd8b\ucd8c\ucd8d\ucd8e\ucd8f\ucd90\ucd91\ucd92\ucd93\ucd94\ucd95\ucd96\ucd97\ucd98\ucd99\ucd9a\ucd9b\ucd9c\ucd9d\ucd9e\ucd9f\ucda0\ucda1\ucda2\ucda3\ucda4\ucda5\ucda6\ucda7\ucda8\ucda9\ucdaa\ucdab\ucdac\ucdad\ucdae\ucdaf\ucdb0\ucdb1\ucdb2\ucdb3\ucdb4\ucdb5\ucdb6\ucdb7\ucdb8\ucdb9\ucdba\ucdbb\ucdbc\ucdbd\ucdbe\ucdbf\ucdc0\ucdc1\ucdc2\ucdc3\ucdc4\ucdc5\ucdc6\ucdc7\ucdc8\ucdc9\ucdca\ucdcb\ucdcc\ucdcd\ucdce\ucdcf\ucdd0\ucdd1\ucdd2\ucdd3\ucdd4\ucdd5\ucdd6\ucdd7\ucdd8\ucdd9\ucdda\ucddb\ucddc\ucddd\ucdde\ucddf\ucde0\ucde1\ucde2\ucde3\ucde4\ucde5\ucde6\ucde7\ucde8\ucde9\ucdea\ucdeb\ucdec\ucded\ucdee\ucdef\ucdf0\ucdf1\ucdf2\ucdf3\ucdf4\ucdf5\ucdf6\ucdf7\ucdf8\ucdf9\ucdfa\ucdfb\ucdfc\ucdfd\ucdfe\ucdff\uce00\uce01\uce02\uce03\uce04\uce05\uce06\uce07\uce08\uce09\uce0a\uce0b\uce0c\uce0d\uce0e\uce0f\uce10\uce11\uce12\uce13\uce14\uce15\uce16\uce17\uce18\uce19\uce1a\uce1b\uce1c\uce1d\uce1e\uce1f\uce20\uce21\uce22\uce23\uce24\uce25\uce26\uce27\uce28\uce29\uce2a\uce2b\uce2c\uce2d\uce2e\uce2f\uce30\uce31\uce32\uce33\uce34\uce35\uce36\uce37\uce38\uce39\uce3a\uce3b\uce3c\uce3d\uce3e\uce3f\uce40\uce41\uce42\uce43\uce44\uce45\uce46\uce47\uce48\uce49\uce4a\uce4b\uce4c\uce4d\uce4e\uce4f\uce50\uce51\uce52\uce53\uce54\uce55\uce56\uce57\uce58\uce59\uce5a\uce5b\uce5c\uce5d\uce5e\uce5f\uce60\uce61\uce62\uce63\uce64\uce65\uce66\uce67\uce68\uce69\uce6a\uce6b\uce6c\uce6d\uce6e\uce6f\uce70\uce71\uce72\uce73\uce74\uce75\uce76\uce77\uce78\uce79\uce7a\uce7b\uce7c\uce7d\uce7e\uce7f\uce80\uce81\uce82\uce83\uce84\uce85\uce86\uce87\uce88\uce89\uce8a\uce8b\uce8c\uce8d\uce8e\uce8f\uce90\uce91\uce92\uce93\uce94\uce95\uce96\uce97\uce98\uce99\uce9a\uce9b\uce9c\uce9d\uce9e\uce9f\ucea0\ucea1\ucea2\ucea3\ucea4\ucea5\ucea6\ucea7\ucea8\ucea9\uceaa\uceab\uceac\ucead\uceae\uceaf\uceb0\uceb1\uceb2\uceb3\uceb4\uceb5\uceb6\uceb7\uceb8\uceb9\uceba\ucebb\ucebc\ucebd\ucebe\ucebf\ucec0\ucec1\ucec2\ucec3\ucec4\ucec5\ucec6\ucec7\ucec8\ucec9\uceca\ucecb\ucecc\ucecd\ucece\ucecf\uced0\uced1\uced2\uced3\uced4\uced5\uced6\uced7\uced8\uced9\uceda\ucedb\ucedc\ucedd\ucede\ucedf\ucee0\ucee1\ucee2\ucee3\ucee4\ucee5\ucee6\ucee7\ucee8\ucee9\uceea\uceeb\uceec\uceed\uceee\uceef\ucef0\ucef1\ucef2\ucef3\ucef4\ucef5\ucef6\ucef7\ucef8\ucef9\ucefa\ucefb\ucefc\ucefd\ucefe\uceff\ucf00\ucf01\ucf02\ucf03\ucf04\ucf05\ucf06\ucf07\ucf08\ucf09\ucf0a\ucf0b\ucf0c\ucf0d\ucf0e\ucf0f\ucf10\ucf11\ucf12\ucf13\ucf14\ucf15\ucf16\ucf17\ucf18\ucf19\ucf1a\ucf1b\ucf1c\ucf1d\ucf1e\ucf1f\ucf20\ucf21\ucf22\ucf23\ucf24\ucf25\ucf26\ucf27\ucf28\ucf29\ucf2a\ucf2b\ucf2c\ucf2d\ucf2e\ucf2f\ucf30\ucf31\ucf32\ucf33\ucf34\ucf35\ucf36\ucf37\ucf38\ucf39\ucf3a\ucf3b\ucf3c\ucf3d\ucf3e\ucf3f\ucf40\ucf41\ucf42\ucf43\ucf44\ucf45\ucf46\ucf47\ucf48\ucf49\ucf4a\ucf4b\ucf4c\ucf4d\ucf4e\ucf4f\ucf50\ucf51\ucf52\ucf53\ucf54\ucf55\ucf56\ucf57\ucf58\ucf59\ucf5a\ucf5b\ucf5c\ucf5d\ucf5e\ucf5f\ucf60\ucf61\ucf62\ucf63\ucf64\ucf65\ucf66\ucf67\ucf68\ucf69\ucf6a\ucf6b\ucf6c\ucf6d\ucf6e\ucf6f\ucf70\ucf71\ucf72\ucf73\ucf74\ucf75\ucf76\ucf77\ucf78\ucf79\ucf7a\ucf7b\ucf7c\ucf7d\ucf7e\ucf7f\ucf80\ucf81\ucf82\ucf83\ucf84\ucf85\ucf86\ucf87\ucf88\ucf89\ucf8a\ucf8b\ucf8c\ucf8d\ucf8e\ucf8f\ucf90\ucf91\ucf92\ucf93\ucf94\ucf95\ucf96\ucf97\ucf98\ucf99\ucf9a\ucf9b\ucf9c\ucf9d\ucf9e\ucf9f\ucfa0\ucfa1\ucfa2\ucfa3\ucfa4\ucfa5\ucfa6\ucfa7\ucfa8\ucfa9\ucfaa\ucfab\ucfac\ucfad\ucfae\ucfaf\ucfb0\ucfb1\ucfb2\ucfb3\ucfb4\ucfb5\ucfb6\ucfb7\ucfb8\ucfb9\ucfba\ucfbb\ucfbc\ucfbd\ucfbe\ucfbf\ucfc0\ucfc1\ucfc2\ucfc3\ucfc4\ucfc5\ucfc6\ucfc7\ucfc8\ucfc9\ucfca\ucfcb\ucfcc\ucfcd\ucfce\ucfcf\ucfd0\ucfd1\ucfd2\ucfd3\ucfd4\ucfd5\ucfd6\ucfd7\ucfd8\ucfd9\ucfda\ucfdb\ucfdc\ucfdd\ucfde\ucfdf\ucfe0\ucfe1\ucfe2\ucfe3\ucfe4\ucfe5\ucfe6\ucfe7\ucfe8\ucfe9\ucfea\ucfeb\ucfec\ucfed\ucfee\ucfef\ucff0\ucff1\ucff2\ucff3\ucff4\ucff5\ucff6\ucff7\ucff8\ucff9\ucffa\ucffb\ucffc\ucffd\ucffe\ucfff\ud000\ud001\ud002\ud003\ud004\ud005\ud006\ud007\ud008\ud009\ud00a\ud00b\ud00c\ud00d\ud00e\ud00f\ud010\ud011\ud012\ud013\ud014\ud015\ud016\ud017\ud018\ud019\ud01a\ud01b\ud01c\ud01d\ud01e\ud01f\ud020\ud021\ud022\ud023\ud024\ud025\ud026\ud027\ud028\ud029\ud02a\ud02b\ud02c\ud02d\ud02e\ud02f\ud030\ud031\ud032\ud033\ud034\ud035\ud036\ud037\ud038\ud039\ud03a\ud03b\ud03c\ud03d\ud03e\ud03f\ud040\ud041\ud042\ud043\ud044\ud045\ud046\ud047\ud048\ud049\ud04a\ud04b\ud04c\ud04d\ud04e\ud04f\ud050\ud051\ud052\ud053\ud054\ud055\ud056\ud057\ud058\ud059\ud05a\ud05b\ud05c\ud05d\ud05e\ud05f\ud060\ud061\ud062\ud063\ud064\ud065\ud066\ud067\ud068\ud069\ud06a\ud06b\ud06c\ud06d\ud06e\ud06f\ud070\ud071\ud072\ud073\ud074\ud075\ud076\ud077\ud078\ud079\ud07a\ud07b\ud07c\ud07d\ud07e\ud07f\ud080\ud081\ud082\ud083\ud084\ud085\ud086\ud087\ud088\ud089\ud08a\ud08b\ud08c\ud08d\ud08e\ud08f\ud090\ud091\ud092\ud093\ud094\ud095\ud096\ud097\ud098\ud099\ud09a\ud09b\ud09c\ud09d\ud09e\ud09f\ud0a0\ud0a1\ud0a2\ud0a3\ud0a4\ud0a5\ud0a6\ud0a7\ud0a8\ud0a9\ud0aa\ud0ab\ud0ac\ud0ad\ud0ae\ud0af\ud0b0\ud0b1\ud0b2\ud0b3\ud0b4\ud0b5\ud0b6\ud0b7\ud0b8\ud0b9\ud0ba\ud0bb\ud0bc\ud0bd\ud0be\ud0bf\ud0c0\ud0c1\ud0c2\ud0c3\ud0c4\ud0c5\ud0c6\ud0c7\ud0c8\ud0c9\ud0ca\ud0cb\ud0cc\ud0cd\ud0ce\ud0cf\ud0d0\ud0d1\ud0d2\ud0d3\ud0d4\ud0d5\ud0d6\ud0d7\ud0d8\ud0d9\ud0da\ud0db\ud0dc\ud0dd\ud0de\ud0df\ud0e0\ud0e1\ud0e2\ud0e3\ud0e4\ud0e5\ud0e6\ud0e7\ud0e8\ud0e9\ud0ea\ud0eb\ud0ec\ud0ed\ud0ee\ud0ef\ud0f0\ud0f1\ud0f2\ud0f3\ud0f4\ud0f5\ud0f6\ud0f7\ud0f8\ud0f9\ud0fa\ud0fb\ud0fc\ud0fd\ud0fe\ud0ff\ud100\ud101\ud102\ud103\ud104\ud105\ud106\ud107\ud108\ud109\ud10a\ud10b\ud10c\ud10d\ud10e\ud10f\ud110\ud111\ud112\ud113\ud114\ud115\ud116\ud117\ud118\ud119\ud11a\ud11b\ud11c\ud11d\ud11e\ud11f\ud120\ud121\ud122\ud123\ud124\ud125\ud126\ud127\ud128\ud129\ud12a\ud12b\ud12c\ud12d\ud12e\ud12f\ud130\ud131\ud132\ud133\ud134\ud135\ud136\ud137\ud138\ud139\ud13a\ud13b\ud13c\ud13d\ud13e\ud13f\ud140\ud141\ud142\ud143\ud144\ud145\ud146\ud147\ud148\ud149\ud14a\ud14b\ud14c\ud14d\ud14e\ud14f\ud150\ud151\ud152\ud153\ud154\ud155\ud156\ud157\ud158\ud159\ud15a\ud15b\ud15c\ud15d\ud15e\ud15f\ud160\ud161\ud162\ud163\ud164\ud165\ud166\ud167\ud168\ud169\ud16a\ud16b\ud16c\ud16d\ud16e\ud16f\ud170\ud171\ud172\ud173\ud174\ud175\ud176\ud177\ud178\ud179\ud17a\ud17b\ud17c\ud17d\ud17e\ud17f\ud180\ud181\ud182\ud183\ud184\ud185\ud186\ud187\ud188\ud189\ud18a\ud18b\ud18c\ud18d\ud18e\ud18f\ud190\ud191\ud192\ud193\ud194\ud195\ud196\ud197\ud198\ud199\ud19a\ud19b\ud19c\ud19d\ud19e\ud19f\ud1a0\ud1a1\ud1a2\ud1a3\ud1a4\ud1a5\ud1a6\ud1a7\ud1a8\ud1a9\ud1aa\ud1ab\ud1ac\ud1ad\ud1ae\ud1af\ud1b0\ud1b1\ud1b2\ud1b3\ud1b4\ud1b5\ud1b6\ud1b7\ud1b8\ud1b9\ud1ba\ud1bb\ud1bc\ud1bd\ud1be\ud1bf\ud1c0\ud1c1\ud1c2\ud1c3\ud1c4\ud1c5\ud1c6\ud1c7\ud1c8\ud1c9\ud1ca\ud1cb\ud1cc\ud1cd\ud1ce\ud1cf\ud1d0\ud1d1\ud1d2\ud1d3\ud1d4\ud1d5\ud1d6\ud1d7\ud1d8\ud1d9\ud1da\ud1db\ud1dc\ud1dd\ud1de\ud1df\ud1e0\ud1e1\ud1e2\ud1e3\ud1e4\ud1e5\ud1e6\ud1e7\ud1e8\ud1e9\ud1ea\ud1eb\ud1ec\ud1ed\ud1ee\ud1ef\ud1f0\ud1f1\ud1f2\ud1f3\ud1f4\ud1f5\ud1f6\ud1f7\ud1f8\ud1f9\ud1fa\ud1fb\ud1fc\ud1fd\ud1fe\ud1ff\ud200\ud201\ud202\ud203\ud204\ud205\ud206\ud207\ud208\ud209\ud20a\ud20b\ud20c\ud20d\ud20e\ud20f\ud210\ud211\ud212\ud213\ud214\ud215\ud216\ud217\ud218\ud219\ud21a\ud21b\ud21c\ud21d\ud21e\ud21f\ud220\ud221\ud222\ud223\ud224\ud225\ud226\ud227\ud228\ud229\ud22a\ud22b\ud22c\ud22d\ud22e\ud22f\ud230\ud231\ud232\ud233\ud234\ud235\ud236\ud237\ud238\ud239\ud23a\ud23b\ud23c\ud23d\ud23e\ud23f\ud240\ud241\ud242\ud243\ud244\ud245\ud246\ud247\ud248\ud249\ud24a\ud24b\ud24c\ud24d\ud24e\ud24f\ud250\ud251\ud252\ud253\ud254\ud255\ud256\ud257\ud258\ud259\ud25a\ud25b\ud25c\ud25d\ud25e\ud25f\ud260\ud261\ud262\ud263\ud264\ud265\ud266\ud267\ud268\ud269\ud26a\ud26b\ud26c\ud26d\ud26e\ud26f\ud270\ud271\ud272\ud273\ud274\ud275\ud276\ud277\ud278\ud279\ud27a\ud27b\ud27c\ud27d\ud27e\ud27f\ud280\ud281\ud282\ud283\ud284\ud285\ud286\ud287\ud288\ud289\ud28a\ud28b\ud28c\ud28d\ud28e\ud28f\ud290\ud291\ud292\ud293\ud294\ud295\ud296\ud297\ud298\ud299\ud29a\ud29b\ud29c\ud29d\ud29e\ud29f\ud2a0\ud2a1\ud2a2\ud2a3\ud2a4\ud2a5\ud2a6\ud2a7\ud2a8\ud2a9\ud2aa\ud2ab\ud2ac\ud2ad\ud2ae\ud2af\ud2b0\ud2b1\ud2b2\ud2b3\ud2b4\ud2b5\ud2b6\ud2b7\ud2b8\ud2b9\ud2ba\ud2bb\ud2bc\ud2bd\ud2be\ud2bf\ud2c0\ud2c1\ud2c2\ud2c3\ud2c4\ud2c5\ud2c6\ud2c7\ud2c8\ud2c9\ud2ca\ud2cb\ud2cc\ud2cd\ud2ce\ud2cf\ud2d0\ud2d1\ud2d2\ud2d3\ud2d4\ud2d5\ud2d6\ud2d7\ud2d8\ud2d9\ud2da\ud2db\ud2dc\ud2dd\ud2de\ud2df\ud2e0\ud2e1\ud2e2\ud2e3\ud2e4\ud2e5\ud2e6\ud2e7\ud2e8\ud2e9\ud2ea\ud2eb\ud2ec\ud2ed\ud2ee\ud2ef\ud2f0\ud2f1\ud2f2\ud2f3\ud2f4\ud2f5\ud2f6\ud2f7\ud2f8\ud2f9\ud2fa\ud2fb\ud2fc\ud2fd\ud2fe\ud2ff\ud300\ud301\ud302\ud303\ud304\ud305\ud306\ud307\ud308\ud309\ud30a\ud30b\ud30c\ud30d\ud30e\ud30f\ud310\ud311\ud312\ud313\ud314\ud315\ud316\ud317\ud318\ud319\ud31a\ud31b\ud31c\ud31d\ud31e\ud31f\ud320\ud321\ud322\ud323\ud324\ud325\ud326\ud327\ud328\ud329\ud32a\ud32b\ud32c\ud32d\ud32e\ud32f\ud330\ud331\ud332\ud333\ud334\ud335\ud336\ud337\ud338\ud339\ud33a\ud33b\ud33c\ud33d\ud33e\ud33f\ud340\ud341\ud342\ud343\ud344\ud345\ud346\ud347\ud348\ud349\ud34a\ud34b\ud34c\ud34d\ud34e\ud34f\ud350\ud351\ud352\ud353\ud354\ud355\ud356\ud357\ud358\ud359\ud35a\ud35b\ud35c\ud35d\ud35e\ud35f\ud360\ud361\ud362\ud363\ud364\ud365\ud366\ud367\ud368\ud369\ud36a\ud36b\ud36c\ud36d\ud36e\ud36f\ud370\ud371\ud372\ud373\ud374\ud375\ud376\ud377\ud378\ud379\ud37a\ud37b\ud37c\ud37d\ud37e\ud37f\ud380\ud381\ud382\ud383\ud384\ud385\ud386\ud387\ud388\ud389\ud38a\ud38b\ud38c\ud38d\ud38e\ud38f\ud390\ud391\ud392\ud393\ud394\ud395\ud396\ud397\ud398\ud399\ud39a\ud39b\ud39c\ud39d\ud39e\ud39f\ud3a0\ud3a1\ud3a2\ud3a3\ud3a4\ud3a5\ud3a6\ud3a7\ud3a8\ud3a9\ud3aa\ud3ab\ud3ac\ud3ad\ud3ae\ud3af\ud3b0\ud3b1\ud3b2\ud3b3\ud3b4\ud3b5\ud3b6\ud3b7\ud3b8\ud3b9\ud3ba\ud3bb\ud3bc\ud3bd\ud3be\ud3bf\ud3c0\ud3c1\ud3c2\ud3c3\ud3c4\ud3c5\ud3c6\ud3c7\ud3c8\ud3c9\ud3ca\ud3cb\ud3cc\ud3cd\ud3ce\ud3cf\ud3d0\ud3d1\ud3d2\ud3d3\ud3d4\ud3d5\ud3d6\ud3d7\ud3d8\ud3d9\ud3da\ud3db\ud3dc\ud3dd\ud3de\ud3df\ud3e0\ud3e1\ud3e2\ud3e3\ud3e4\ud3e5\ud3e6\ud3e7\ud3e8\ud3e9\ud3ea\ud3eb\ud3ec\ud3ed\ud3ee\ud3ef\ud3f0\ud3f1\ud3f2\ud3f3\ud3f4\ud3f5\ud3f6\ud3f7\ud3f8\ud3f9\ud3fa\ud3fb\ud3fc\ud3fd\ud3fe\ud3ff\ud400\ud401\ud402\ud403\ud404\ud405\ud406\ud407\ud408\ud409\ud40a\ud40b\ud40c\ud40d\ud40e\ud40f\ud410\ud411\ud412\ud413\ud414\ud415\ud416\ud417\ud418\ud419\ud41a\ud41b\ud41c\ud41d\ud41e\ud41f\ud420\ud421\ud422\ud423\ud424\ud425\ud426\ud427\ud428\ud429\ud42a\ud42b\ud42c\ud42d\ud42e\ud42f\ud430\ud431\ud432\ud433\ud434\ud435\ud436\ud437\ud438\ud439\ud43a\ud43b\ud43c\ud43d\ud43e\ud43f\ud440\ud441\ud442\ud443\ud444\ud445\ud446\ud447\ud448\ud449\ud44a\ud44b\ud44c\ud44d\ud44e\ud44f\ud450\ud451\ud452\ud453\ud454\ud455\ud456\ud457\ud458\ud459\ud45a\ud45b\ud45c\ud45d\ud45e\ud45f\ud460\ud461\ud462\ud463\ud464\ud465\ud466\ud467\ud468\ud469\ud46a\ud46b\ud46c\ud46d\ud46e\ud46f\ud470\ud471\ud472\ud473\ud474\ud475\ud476\ud477\ud478\ud479\ud47a\ud47b\ud47c\ud47d\ud47e\ud47f\ud480\ud481\ud482\ud483\ud484\ud485\ud486\ud487\ud488\ud489\ud48a\ud48b\ud48c\ud48d\ud48e\ud48f\ud490\ud491\ud492\ud493\ud494\ud495\ud496\ud497\ud498\ud499\ud49a\ud49b\ud49c\ud49d\ud49e\ud49f\ud4a0\ud4a1\ud4a2\ud4a3\ud4a4\ud4a5\ud4a6\ud4a7\ud4a8\ud4a9\ud4aa\ud4ab\ud4ac\ud4ad\ud4ae\ud4af\ud4b0\ud4b1\ud4b2\ud4b3\ud4b4\ud4b5\ud4b6\ud4b7\ud4b8\ud4b9\ud4ba\ud4bb\ud4bc\ud4bd\ud4be\ud4bf\ud4c0\ud4c1\ud4c2\ud4c3\ud4c4\ud4c5\ud4c6\ud4c7\ud4c8\ud4c9\ud4ca\ud4cb\ud4cc\ud4cd\ud4ce\ud4cf\ud4d0\ud4d1\ud4d2\ud4d3\ud4d4\ud4d5\ud4d6\ud4d7\ud4d8\ud4d9\ud4da\ud4db\ud4dc\ud4dd\ud4de\ud4df\ud4e0\ud4e1\ud4e2\ud4e3\ud4e4\ud4e5\ud4e6\ud4e7\ud4e8\ud4e9\ud4ea\ud4eb\ud4ec\ud4ed\ud4ee\ud4ef\ud4f0\ud4f1\ud4f2\ud4f3\ud4f4\ud4f5\ud4f6\ud4f7\ud4f8\ud4f9\ud4fa\ud4fb\ud4fc\ud4fd\ud4fe\ud4ff\ud500\ud501\ud502\ud503\ud504\ud505\ud506\ud507\ud508\ud509\ud50a\ud50b\ud50c\ud50d\ud50e\ud50f\ud510\ud511\ud512\ud513\ud514\ud515\ud516\ud517\ud518\ud519\ud51a\ud51b\ud51c\ud51d\ud51e\ud51f\ud520\ud521\ud522\ud523\ud524\ud525\ud526\ud527\ud528\ud529\ud52a\ud52b\ud52c\ud52d\ud52e\ud52f\ud530\ud531\ud532\ud533\ud534\ud535\ud536\ud537\ud538\ud539\ud53a\ud53b\ud53c\ud53d\ud53e\ud53f\ud540\ud541\ud542\ud543\ud544\ud545\ud546\ud547\ud548\ud549\ud54a\ud54b\ud54c\ud54d\ud54e\ud54f\ud550\ud551\ud552\ud553\ud554\ud555\ud556\ud557\ud558\ud559\ud55a\ud55b\ud55c\ud55d\ud55e\ud55f\ud560\ud561\ud562\ud563\ud564\ud565\ud566\ud567\ud568\ud569\ud56a\ud56b\ud56c\ud56d\ud56e\ud56f\ud570\ud571\ud572\ud573\ud574\ud575\ud576\ud577\ud578\ud579\ud57a\ud57b\ud57c\ud57d\ud57e\ud57f\ud580\ud581\ud582\ud583\ud584\ud585\ud586\ud587\ud588\ud589\ud58a\ud58b\ud58c\ud58d\ud58e\ud58f\ud590\ud591\ud592\ud593\ud594\ud595\ud596\ud597\ud598\ud599\ud59a\ud59b\ud59c\ud59d\ud59e\ud59f\ud5a0\ud5a1\ud5a2\ud5a3\ud5a4\ud5a5\ud5a6\ud5a7\ud5a8\ud5a9\ud5aa\ud5ab\ud5ac\ud5ad\ud5ae\ud5af\ud5b0\ud5b1\ud5b2\ud5b3\ud5b4\ud5b5\ud5b6\ud5b7\ud5b8\ud5b9\ud5ba\ud5bb\ud5bc\ud5bd\ud5be\ud5bf\ud5c0\ud5c1\ud5c2\ud5c3\ud5c4\ud5c5\ud5c6\ud5c7\ud5c8\ud5c9\ud5ca\ud5cb\ud5cc\ud5cd\ud5ce\ud5cf\ud5d0\ud5d1\ud5d2\ud5d3\ud5d4\ud5d5\ud5d6\ud5d7\ud5d8\ud5d9\ud5da\ud5db\ud5dc\ud5dd\ud5de\ud5df\ud5e0\ud5e1\ud5e2\ud5e3\ud5e4\ud5e5\ud5e6\ud5e7\ud5e8\ud5e9\ud5ea\ud5eb\ud5ec\ud5ed\ud5ee\ud5ef\ud5f0\ud5f1\ud5f2\ud5f3\ud5f4\ud5f5\ud5f6\ud5f7\ud5f8\ud5f9\ud5fa\ud5fb\ud5fc\ud5fd\ud5fe\ud5ff\ud600\ud601\ud602\ud603\ud604\ud605\ud606\ud607\ud608\ud609\ud60a\ud60b\ud60c\ud60d\ud60e\ud60f\ud610\ud611\ud612\ud613\ud614\ud615\ud616\ud617\ud618\ud619\ud61a\ud61b\ud61c\ud61d\ud61e\ud61f\ud620\ud621\ud622\ud623\ud624\ud625\ud626\ud627\ud628\ud629\ud62a\ud62b\ud62c\ud62d\ud62e\ud62f\ud630\ud631\ud632\ud633\ud634\ud635\ud636\ud637\ud638\ud639\ud63a\ud63b\ud63c\ud63d\ud63e\ud63f\ud640\ud641\ud642\ud643\ud644\ud645\ud646\ud647\ud648\ud649\ud64a\ud64b\ud64c\ud64d\ud64e\ud64f\ud650\ud651\ud652\ud653\ud654\ud655\ud656\ud657\ud658\ud659\ud65a\ud65b\ud65c\ud65d\ud65e\ud65f\ud660\ud661\ud662\ud663\ud664\ud665\ud666\ud667\ud668\ud669\ud66a\ud66b\ud66c\ud66d\ud66e\ud66f\ud670\ud671\ud672\ud673\ud674\ud675\ud676\ud677\ud678\ud679\ud67a\ud67b\ud67c\ud67d\ud67e\ud67f\ud680\ud681\ud682\ud683\ud684\ud685\ud686\ud687\ud688\ud689\ud68a\ud68b\ud68c\ud68d\ud68e\ud68f\ud690\ud691\ud692\ud693\ud694\ud695\ud696\ud697\ud698\ud699\ud69a\ud69b\ud69c\ud69d\ud69e\ud69f\ud6a0\ud6a1\ud6a2\ud6a3\ud6a4\ud6a5\ud6a6\ud6a7\ud6a8\ud6a9\ud6aa\ud6ab\ud6ac\ud6ad\ud6ae\ud6af\ud6b0\ud6b1\ud6b2\ud6b3\ud6b4\ud6b5\ud6b6\ud6b7\ud6b8\ud6b9\ud6ba\ud6bb\ud6bc\ud6bd\ud6be\ud6bf\ud6c0\ud6c1\ud6c2\ud6c3\ud6c4\ud6c5\ud6c6\ud6c7\ud6c8\ud6c9\ud6ca\ud6cb\ud6cc\ud6cd\ud6ce\ud6cf\ud6d0\ud6d1\ud6d2\ud6d3\ud6d4\ud6d5\ud6d6\ud6d7\ud6d8\ud6d9\ud6da\ud6db\ud6dc\ud6dd\ud6de\ud6df\ud6e0\ud6e1\ud6e2\ud6e3\ud6e4\ud6e5\ud6e6\ud6e7\ud6e8\ud6e9\ud6ea\ud6eb\ud6ec\ud6ed\ud6ee\ud6ef\ud6f0\ud6f1\ud6f2\ud6f3\ud6f4\ud6f5\ud6f6\ud6f7\ud6f8\ud6f9\ud6fa\ud6fb\ud6fc\ud6fd\ud6fe\ud6ff\ud700\ud701\ud702\ud703\ud704\ud705\ud706\ud707\ud708\ud709\ud70a\ud70b\ud70c\ud70d\ud70e\ud70f\ud710\ud711\ud712\ud713\ud714\ud715\ud716\ud717\ud718\ud719\ud71a\ud71b\ud71c\ud71d\ud71e\ud71f\ud720\ud721\ud722\ud723\ud724\ud725\ud726\ud727\ud728\ud729\ud72a\ud72b\ud72c\ud72d\ud72e\ud72f\ud730\ud731\ud732\ud733\ud734\ud735\ud736\ud737\ud738\ud739\ud73a\ud73b\ud73c\ud73d\ud73e\ud73f\ud740\ud741\ud742\ud743\ud744\ud745\ud746\ud747\ud748\ud749\ud74a\ud74b\ud74c\ud74d\ud74e\ud74f\ud750\ud751\ud752\ud753\ud754\ud755\ud756\ud757\ud758\ud759\ud75a\ud75b\ud75c\ud75d\ud75e\ud75f\ud760\ud761\ud762\ud763\ud764\ud765\ud766\ud767\ud768\ud769\ud76a\ud76b\ud76c\ud76d\ud76e\ud76f\ud770\ud771\ud772\ud773\ud774\ud775\ud776\ud777\ud778\ud779\ud77a\ud77b\ud77c\ud77d\ud77e\ud77f\ud780\ud781\ud782\ud783\ud784\ud785\ud786\ud787\ud788\ud789\ud78a\ud78b\ud78c\ud78d\ud78e\ud78f\ud790\ud791\ud792\ud793\ud794\ud795\ud796\ud797\ud798\ud799\ud79a\ud79b\ud79c\ud79d\ud79e\ud79f\ud7a0\ud7a1\ud7a2\ud7a3\uf900\uf901\uf902\uf903\uf904\uf905\uf906\uf907\uf908\uf909\uf90a\uf90b\uf90c\uf90d\uf90e\uf90f\uf910\uf911\uf912\uf913\uf914\uf915\uf916\uf917\uf918\uf919\uf91a\uf91b\uf91c\uf91d\uf91e\uf91f\uf920\uf921\uf922\uf923\uf924\uf925\uf926\uf927\uf928\uf929\uf92a\uf92b\uf92c\uf92d\uf92e\uf92f\uf930\uf931\uf932\uf933\uf934\uf935\uf936\uf937\uf938\uf939\uf93a\uf93b\uf93c\uf93d\uf93e\uf93f\uf940\uf941\uf942\uf943\uf944\uf945\uf946\uf947\uf948\uf949\uf94a\uf94b\uf94c\uf94d\uf94e\uf94f\uf950\uf951\uf952\uf953\uf954\uf955\uf956\uf957\uf958\uf959\uf95a\uf95b\uf95c\uf95d\uf95e\uf95f\uf960\uf961\uf962\uf963\uf964\uf965\uf966\uf967\uf968\uf969\uf96a\uf96b\uf96c\uf96d\uf96e\uf96f\uf970\uf971\uf972\uf973\uf974\uf975\uf976\uf977\uf978\uf979\uf97a\uf97b\uf97c\uf97d\uf97e\uf97f\uf980\uf981\uf982\uf983\uf984\uf985\uf986\uf987\uf988\uf989\uf98a\uf98b\uf98c\uf98d\uf98e\uf98f\uf990\uf991\uf992\uf993\uf994\uf995\uf996\uf997\uf998\uf999\uf99a\uf99b\uf99c\uf99d\uf99e\uf99f\uf9a0\uf9a1\uf9a2\uf9a3\uf9a4\uf9a5\uf9a6\uf9a7\uf9a8\uf9a9\uf9aa\uf9ab\uf9ac\uf9ad\uf9ae\uf9af\uf9b0\uf9b1\uf9b2\uf9b3\uf9b4\uf9b5\uf9b6\uf9b7\uf9b8\uf9b9\uf9ba\uf9bb\uf9bc\uf9bd\uf9be\uf9bf\uf9c0\uf9c1\uf9c2\uf9c3\uf9c4\uf9c5\uf9c6\uf9c7\uf9c8\uf9c9\uf9ca\uf9cb\uf9cc\uf9cd\uf9ce\uf9cf\uf9d0\uf9d1\uf9d2\uf9d3\uf9d4\uf9d5\uf9d6\uf9d7\uf9d8\uf9d9\uf9da\uf9db\uf9dc\uf9dd\uf9de\uf9df\uf9e0\uf9e1\uf9e2\uf9e3\uf9e4\uf9e5\uf9e6\uf9e7\uf9e8\uf9e9\uf9ea\uf9eb\uf9ec\uf9ed\uf9ee\uf9ef\uf9f0\uf9f1\uf9f2\uf9f3\uf9f4\uf9f5\uf9f6\uf9f7\uf9f8\uf9f9\uf9fa\uf9fb\uf9fc\uf9fd\uf9fe\uf9ff\ufa00\ufa01\ufa02\ufa03\ufa04\ufa05\ufa06\ufa07\ufa08\ufa09\ufa0a\ufa0b\ufa0c\ufa0d\ufa0e\ufa0f\ufa10\ufa11\ufa12\ufa13\ufa14\ufa15\ufa16\ufa17\ufa18\ufa19\ufa1a\ufa1b\ufa1c\ufa1d\ufa1e\ufa1f\ufa20\ufa21\ufa22\ufa23\ufa24\ufa25\ufa26\ufa27\ufa28\ufa29\ufa2a\ufa2b\ufa2c\ufa2d\ufa30\ufa31\ufa32\ufa33\ufa34\ufa35\ufa36\ufa37\ufa38\ufa39\ufa3a\ufa3b\ufa3c\ufa3d\ufa3e\ufa3f\ufa40\ufa41\ufa42\ufa43\ufa44\ufa45\ufa46\ufa47\ufa48\ufa49\ufa4a\ufa4b\ufa4c\ufa4d\ufa4e\ufa4f\ufa50\ufa51\ufa52\ufa53\ufa54\ufa55\ufa56\ufa57\ufa58\ufa59\ufa5a\ufa5b\ufa5c\ufa5d\ufa5e\ufa5f\ufa60\ufa61\ufa62\ufa63\ufa64\ufa65\ufa66\ufa67\ufa68\ufa69\ufa6a\ufa70\ufa71\ufa72\ufa73\ufa74\ufa75\ufa76\ufa77\ufa78\ufa79\ufa7a\ufa7b\ufa7c\ufa7d\ufa7e\ufa7f\ufa80\ufa81\ufa82\ufa83\ufa84\ufa85\ufa86\ufa87\ufa88\ufa89\ufa8a\ufa8b\ufa8c\ufa8d\ufa8e\ufa8f\ufa90\ufa91\ufa92\ufa93\ufa94\ufa95\ufa96\ufa97\ufa98\ufa99\ufa9a\ufa9b\ufa9c\ufa9d\ufa9e\ufa9f\ufaa0\ufaa1\ufaa2\ufaa3\ufaa4\ufaa5\ufaa6\ufaa7\ufaa8\ufaa9\ufaaa\ufaab\ufaac\ufaad\ufaae\ufaaf\ufab0\ufab1\ufab2\ufab3\ufab4\ufab5\ufab6\ufab7\ufab8\ufab9\ufaba\ufabb\ufabc\ufabd\ufabe\ufabf\ufac0\ufac1\ufac2\ufac3\ufac4\ufac5\ufac6\ufac7\ufac8\ufac9\ufaca\ufacb\ufacc\ufacd\uface\ufacf\ufad0\ufad1\ufad2\ufad3\ufad4\ufad5\ufad6\ufad7\ufad8\ufad9\ufb1d\ufb1f\ufb20\ufb21\ufb22\ufb23\ufb24\ufb25\ufb26\ufb27\ufb28\ufb2a\ufb2b\ufb2c\ufb2d\ufb2e\ufb2f\ufb30\ufb31\ufb32\ufb33\ufb34\ufb35\ufb36\ufb38\ufb39\ufb3a\ufb3b\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46\ufb47\ufb48\ufb49\ufb4a\ufb4b\ufb4c\ufb4d\ufb4e\ufb4f\ufb50\ufb51\ufb52\ufb53\ufb54\ufb55\ufb56\ufb57\ufb58\ufb59\ufb5a\ufb5b\ufb5c\ufb5d\ufb5e\ufb5f\ufb60\ufb61\ufb62\ufb63\ufb64\ufb65\ufb66\ufb67\ufb68\ufb69\ufb6a\ufb6b\ufb6c\ufb6d\ufb6e\ufb6f\ufb70\ufb71\ufb72\ufb73\ufb74\ufb75\ufb76\ufb77\ufb78\ufb79\ufb7a\ufb7b\ufb7c\ufb7d\ufb7e\ufb7f\ufb80\ufb81\ufb82\ufb83\ufb84\ufb85\ufb86\ufb87\ufb88\ufb89\ufb8a\ufb8b\ufb8c\ufb8d\ufb8e\ufb8f\ufb90\ufb91\ufb92\ufb93\ufb94\ufb95\ufb96\ufb97\ufb98\ufb99\ufb9a\ufb9b\ufb9c\ufb9d\ufb9e\ufb9f\ufba0\ufba1\ufba2\ufba3\ufba4\ufba5\ufba6\ufba7\ufba8\ufba9\ufbaa\ufbab\ufbac\ufbad\ufbae\ufbaf\ufbb0\ufbb1\ufbd3\ufbd4\ufbd5\ufbd6\ufbd7\ufbd8\ufbd9\ufbda\ufbdb\ufbdc\ufbdd\ufbde\ufbdf\ufbe0\ufbe1\ufbe2\ufbe3\ufbe4\ufbe5\ufbe6\ufbe7\ufbe8\ufbe9\ufbea\ufbeb\ufbec\ufbed\ufbee\ufbef\ufbf0\ufbf1\ufbf2\ufbf3\ufbf4\ufbf5\ufbf6\ufbf7\ufbf8\ufbf9\ufbfa\ufbfb\ufbfc\ufbfd\ufbfe\ufbff\ufc00\ufc01\ufc02\ufc03\ufc04\ufc05\ufc06\ufc07\ufc08\ufc09\ufc0a\ufc0b\ufc0c\ufc0d\ufc0e\ufc0f\ufc10\ufc11\ufc12\ufc13\ufc14\ufc15\ufc16\ufc17\ufc18\ufc19\ufc1a\ufc1b\ufc1c\ufc1d\ufc1e\ufc1f\ufc20\ufc21\ufc22\ufc23\ufc24\ufc25\ufc26\ufc27\ufc28\ufc29\ufc2a\ufc2b\ufc2c\ufc2d\ufc2e\ufc2f\ufc30\ufc31\ufc32\ufc33\ufc34\ufc35\ufc36\ufc37\ufc38\ufc39\ufc3a\ufc3b\ufc3c\ufc3d\ufc3e\ufc3f\ufc40\ufc41\ufc42\ufc43\ufc44\ufc45\ufc46\ufc47\ufc48\ufc49\ufc4a\ufc4b\ufc4c\ufc4d\ufc4e\ufc4f\ufc50\ufc51\ufc52\ufc53\ufc54\ufc55\ufc56\ufc57\ufc58\ufc59\ufc5a\ufc5b\ufc5c\ufc5d\ufc5e\ufc5f\ufc60\ufc61\ufc62\ufc63\ufc64\ufc65\ufc66\ufc67\ufc68\ufc69\ufc6a\ufc6b\ufc6c\ufc6d\ufc6e\ufc6f\ufc70\ufc71\ufc72\ufc73\ufc74\ufc75\ufc76\ufc77\ufc78\ufc79\ufc7a\ufc7b\ufc7c\ufc7d\ufc7e\ufc7f\ufc80\ufc81\ufc82\ufc83\ufc84\ufc85\ufc86\ufc87\ufc88\ufc89\ufc8a\ufc8b\ufc8c\ufc8d\ufc8e\ufc8f\ufc90\ufc91\ufc92\ufc93\ufc94\ufc95\ufc96\ufc97\ufc98\ufc99\ufc9a\ufc9b\ufc9c\ufc9d\ufc9e\ufc9f\ufca0\ufca1\ufca2\ufca3\ufca4\ufca5\ufca6\ufca7\ufca8\ufca9\ufcaa\ufcab\ufcac\ufcad\ufcae\ufcaf\ufcb0\ufcb1\ufcb2\ufcb3\ufcb4\ufcb5\ufcb6\ufcb7\ufcb8\ufcb9\ufcba\ufcbb\ufcbc\ufcbd\ufcbe\ufcbf\ufcc0\ufcc1\ufcc2\ufcc3\ufcc4\ufcc5\ufcc6\ufcc7\ufcc8\ufcc9\ufcca\ufccb\ufccc\ufccd\ufcce\ufccf\ufcd0\ufcd1\ufcd2\ufcd3\ufcd4\ufcd5\ufcd6\ufcd7\ufcd8\ufcd9\ufcda\ufcdb\ufcdc\ufcdd\ufcde\ufcdf\ufce0\ufce1\ufce2\ufce3\ufce4\ufce5\ufce6\ufce7\ufce8\ufce9\ufcea\ufceb\ufcec\ufced\ufcee\ufcef\ufcf0\ufcf1\ufcf2\ufcf3\ufcf4\ufcf5\ufcf6\ufcf7\ufcf8\ufcf9\ufcfa\ufcfb\ufcfc\ufcfd\ufcfe\ufcff\ufd00\ufd01\ufd02\ufd03\ufd04\ufd05\ufd06\ufd07\ufd08\ufd09\ufd0a\ufd0b\ufd0c\ufd0d\ufd0e\ufd0f\ufd10\ufd11\ufd12\ufd13\ufd14\ufd15\ufd16\ufd17\ufd18\ufd19\ufd1a\ufd1b\ufd1c\ufd1d\ufd1e\ufd1f\ufd20\ufd21\ufd22\ufd23\ufd24\ufd25\ufd26\ufd27\ufd28\ufd29\ufd2a\ufd2b\ufd2c\ufd2d\ufd2e\ufd2f\ufd30\ufd31\ufd32\ufd33\ufd34\ufd35\ufd36\ufd37\ufd38\ufd39\ufd3a\ufd3b\ufd3c\ufd3d\ufd50\ufd51\ufd52\ufd53\ufd54\ufd55\ufd56\ufd57\ufd58\ufd59\ufd5a\ufd5b\ufd5c\ufd5d\ufd5e\ufd5f\ufd60\ufd61\ufd62\ufd63\ufd64\ufd65\ufd66\ufd67\ufd68\ufd69\ufd6a\ufd6b\ufd6c\ufd6d\ufd6e\ufd6f\ufd70\ufd71\ufd72\ufd73\ufd74\ufd75\ufd76\ufd77\ufd78\ufd79\ufd7a\ufd7b\ufd7c\ufd7d\ufd7e\ufd7f\ufd80\ufd81\ufd82\ufd83\ufd84\ufd85\ufd86\ufd87\ufd88\ufd89\ufd8a\ufd8b\ufd8c\ufd8d\ufd8e\ufd8f\ufd92\ufd93\ufd94\ufd95\ufd96\ufd97\ufd98\ufd99\ufd9a\ufd9b\ufd9c\ufd9d\ufd9e\ufd9f\ufda0\ufda1\ufda2\ufda3\ufda4\ufda5\ufda6\ufda7\ufda8\ufda9\ufdaa\ufdab\ufdac\ufdad\ufdae\ufdaf\ufdb0\ufdb1\ufdb2\ufdb3\ufdb4\ufdb5\ufdb6\ufdb7\ufdb8\ufdb9\ufdba\ufdbb\ufdbc\ufdbd\ufdbe\ufdbf\ufdc0\ufdc1\ufdc2\ufdc3\ufdc4\ufdc5\ufdc6\ufdc7\ufdf0\ufdf1\ufdf2\ufdf3\ufdf4\ufdf5\ufdf6\ufdf7\ufdf8\ufdf9\ufdfa\ufdfb\ufe70\ufe71\ufe72\ufe73\ufe74\ufe76\ufe77\ufe78\ufe79\ufe7a\ufe7b\ufe7c\ufe7d\ufe7e\ufe7f\ufe80\ufe81\ufe82\ufe83\ufe84\ufe85\ufe86\ufe87\ufe88\ufe89\ufe8a\ufe8b\ufe8c\ufe8d\ufe8e\ufe8f\ufe90\ufe91\ufe92\ufe93\ufe94\ufe95\ufe96\ufe97\ufe98\ufe99\ufe9a\ufe9b\ufe9c\ufe9d\ufe9e\ufe9f\ufea0\ufea1\ufea2\ufea3\ufea4\ufea5\ufea6\ufea7\ufea8\ufea9\ufeaa\ufeab\ufeac\ufead\ufeae\ufeaf\ufeb0\ufeb1\ufeb2\ufeb3\ufeb4\ufeb5\ufeb6\ufeb7\ufeb8\ufeb9\ufeba\ufebb\ufebc\ufebd\ufebe\ufebf\ufec0\ufec1\ufec2\ufec3\ufec4\ufec5\ufec6\ufec7\ufec8\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed2\ufed3\ufed4\ufed5\ufed6\ufed7\ufed8\ufed9\ufeda\ufedb\ufedc\ufedd\ufede\ufedf\ufee0\ufee1\ufee2\ufee3\ufee4\ufee5\ufee6\ufee7\ufee8\ufee9\ufeea\ufeeb\ufeec\ufeed\ufeee\ufeef\ufef0\ufef1\ufef2\ufef3\ufef4\ufef5\ufef6\ufef7\ufef8\ufef9\ufefa\ufefb\ufefc\uff66\uff67\uff68\uff69\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff7a\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82\uff83\uff84\uff85\uff86\uff87\uff88\uff89\uff8a\uff8b\uff8c\uff8d\uff8e\uff8f\uff90\uff91\uff92\uff93\uff94\uff95\uff96\uff97\uff98\uff99\uff9a\uff9b\uff9c\uff9d\uffa0\uffa1\uffa2\uffa3\uffa4\uffa5\uffa6\uffa7\uffa8\uffa9\uffaa\uffab\uffac\uffad\uffae\uffaf\uffb0\uffb1\uffb2\uffb3\uffb4\uffb5\uffb6\uffb7\uffb8\uffb9\uffba\uffbb\uffbc\uffbd\uffbe\uffc2\uffc3\uffc4\uffc5\uffc6\uffc7\uffca\uffcb\uffcc\uffcd\uffce\uffcf\uffd2\uffd3\uffd4\uffd5\uffd6\uffd7\uffda\uffdb\uffdc'
-
-Lt = u'\u01c5\u01c8\u01cb\u01f2\u1f88\u1f89\u1f8a\u1f8b\u1f8c\u1f8d\u1f8e\u1f8f\u1f98\u1f99\u1f9a\u1f9b\u1f9c\u1f9d\u1f9e\u1f9f\u1fa8\u1fa9\u1faa\u1fab\u1fac\u1fad\u1fae\u1faf\u1fbc\u1fcc\u1ffc'
-
-Lu = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189\u018a\u018b\u018e\u018f\u0190\u0191\u0193\u0194\u0196\u0197\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1\u01b2\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6\u01f7\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03d2\u03d3\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd\u03fe\u03ff\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u040d\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054a\u054b\u054c\u054d\u054e\u054f\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1f18\u1f19\u1f1a\u1f1b\u1f1c\u1f1d\u1f28\u1f29\u1f2a\u1f2b\u1f2c\u1f2d\u1f2e\u1f2f\u1f38\u1f39\u1f3a\u1f3b\u1f3c\u1f3d\u1f3e\u1f3f\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68\u1f69\u1f6a\u1f6b\u1f6c\u1f6d\u1f6e\u1f6f\u1fb8\u1fb9\u1fba\u1fbb\u1fc8\u1fc9\u1fca\u1fcb\u1fd8\u1fd9\u1fda\u1fdb\u1fe8\u1fe9\u1fea\u1feb\u1fec\u1ff8\u1ff9\u1ffa\u1ffb\u2102\u2107\u210b\u210c\u210d\u2110\u2111\u2112\u2115\u2119\u211a\u211b\u211c\u211d\u2124\u2126\u2128\u212a\u212b\u212c\u212d\u2130\u2131\u2133\u213e\u213f\u2145\u2c00\u2c01\u2c02\u2c03\u2c04\u2c05\u2c06\u2c07\u2c08\u2c09\u2c0a\u2c0b\u2c0c\u2c0d\u2c0e\u2c0f\u2c10\u2c11\u2c12\u2c13\u2c14\u2c15\u2c16\u2c17\u2c18\u2c19\u2c1a\u2c1b\u2c1c\u2c1d\u2c1e\u2c1f\u2c20\u2c21\u2c22\u2c23\u2c24\u2c25\u2c26\u2c27\u2c28\u2c29\u2c2a\u2c2b\u2c2c\u2c2d\u2c2e\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\uff21\uff22\uff23\uff24\uff25\uff26\uff27\uff28\uff29\uff2a\uff2b\uff2c\uff2d\uff2e\uff2f\uff30\uff31\uff32\uff33\uff34\uff35\uff36\uff37\uff38\uff39\uff3a'
-
-Mc = u'\u0903\u093e\u093f\u0940\u0949\u094a\u094b\u094c\u0982\u0983\u09be\u09bf\u09c0\u09c7\u09c8\u09cb\u09cc\u09d7\u0a03\u0a3e\u0a3f\u0a40\u0a83\u0abe\u0abf\u0ac0\u0ac9\u0acb\u0acc\u0b02\u0b03\u0b3e\u0b40\u0b47\u0b48\u0b4b\u0b4c\u0b57\u0bbe\u0bbf\u0bc1\u0bc2\u0bc6\u0bc7\u0bc8\u0bca\u0bcb\u0bcc\u0bd7\u0c01\u0c02\u0c03\u0c41\u0c42\u0c43\u0c44\u0c82\u0c83\u0cbe\u0cc0\u0cc1\u0cc2\u0cc3\u0cc4\u0cc7\u0cc8\u0cca\u0ccb\u0cd5\u0cd6\u0d02\u0d03\u0d3e\u0d3f\u0d40\u0d46\u0d47\u0d48\u0d4a\u0d4b\u0d4c\u0d57\u0d82\u0d83\u0dcf\u0dd0\u0dd1\u0dd8\u0dd9\u0dda\u0ddb\u0ddc\u0ddd\u0dde\u0ddf\u0df2\u0df3\u0f3e\u0f3f\u0f7f\u102c\u1031\u1038\u1056\u1057\u17b6\u17be\u17bf\u17c0\u17c1\u17c2\u17c3\u17c4\u17c5\u17c7\u17c8\u1923\u1924\u1925\u1926\u1929\u192a\u192b\u1930\u1931\u1933\u1934\u1935\u1936\u1937\u1938\u19b0\u19b1\u19b2\u19b3\u19b4\u19b5\u19b6\u19b7\u19b8\u19b9\u19ba\u19bb\u19bc\u19bd\u19be\u19bf\u19c0\u19c8\u19c9\u1a19\u1a1a\u1a1b\ua802\ua823\ua824\ua827'
-
-Me = u'\u0488\u0489\u06de\u20dd\u20de\u20df\u20e0\u20e2\u20e3\u20e4'
-
-Mn = u'\u0300\u0301\u0302\u0303\u0304\u0305\u0306\u0307\u0308\u0309\u030a\u030b\u030c\u030d\u030e\u030f\u0310\u0311\u0312\u0313\u0314\u0315\u0316\u0317\u0318\u0319\u031a\u031b\u031c\u031d\u031e\u031f\u0320\u0321\u0322\u0323\u0324\u0325\u0326\u0327\u0328\u0329\u032a\u032b\u032c\u032d\u032e\u032f\u0330\u0331\u0332\u0333\u0334\u0335\u0336\u0337\u0338\u0339\u033a\u033b\u033c\u033d\u033e\u033f\u0340\u0341\u0342\u0343\u0344\u0345\u0346\u0347\u0348\u0349\u034a\u034b\u034c\u034d\u034e\u034f\u0350\u0351\u0352\u0353\u0354\u0355\u0356\u0357\u0358\u0359\u035a\u035b\u035c\u035d\u035e\u035f\u0360\u0361\u0362\u0363\u0364\u0365\u0366\u0367\u0368\u0369\u036a\u036b\u036c\u036d\u036e\u036f\u0483\u0484\u0485\u0486\u0591\u0592\u0593\u0594\u0595\u0596\u0597\u0598\u0599\u059a\u059b\u059c\u059d\u059e\u059f\u05a0\u05a1\u05a2\u05a3\u05a4\u05a5\u05a6\u05a7\u05a8\u05a9\u05aa\u05ab\u05ac\u05ad\u05ae\u05af\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9\u05bb\u05bc\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610\u0611\u0612\u0613\u0614\u0615\u064b\u064c\u064d\u064e\u064f\u0650\u0651\u0652\u0653\u0654\u0655\u0656\u0657\u0658\u0659\u065a\u065b\u065c\u065d\u065e\u0670\u06d6\u06d7\u06d8\u06d9\u06da\u06db\u06dc\u06df\u06e0\u06e1\u06e2\u06e3\u06e4\u06e7\u06e8\u06ea\u06eb\u06ec\u06ed\u0711\u0730\u0731\u0732\u0733\u0734\u0735\u0736\u0737\u0738\u0739\u073a\u073b\u073c\u073d\u073e\u073f\u0740\u0741\u0742\u0743\u0744\u0745\u0746\u0747\u0748\u0749\u074a\u07a6\u07a7\u07a8\u07a9\u07aa\u07ab\u07ac\u07ad\u07ae\u07af\u07b0\u0901\u0902\u093c\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u094d\u0951\u0952\u0953\u0954\u0962\u0963\u0981\u09bc\u09c1\u09c2\u09c3\u09c4\u09cd\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a4d\u0a70\u0a71\u0a81\u0a82\u0abc\u0ac1\u0ac2\u0ac3\u0ac4\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3f\u0b41\u0b42\u0b43\u0b4d\u0b56\u0b82\u0bc0\u0bcd\u0c3e\u0c3f\u0c40\u0c46\u0c47\u0c48\u0c4a\u0c4b\u0c4c\u0c4d\u0c55\u0c56\u0cbc\u0cbf\u0cc6\u0ccc\u0ccd\u0d41\u0d42\u0d43\u0d4d\u0dca\u0dd2\u0dd3\u0dd4\u0dd6\u0e31\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0eb1\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0ebb\u0ebc\u0ec8\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71\u0f72\u0f73\u0f74\u0f75\u0f76\u0f77\u0f78\u0f79\u0f7a\u0f7b\u0f7c\u0f7d\u0f7e\u0f80\u0f81\u0f82\u0f83\u0f84\u0f86\u0f87\u0f90\u0f91\u0f92\u0f93\u0f94\u0f95\u0f96\u0f97\u0f99\u0f9a\u0f9b\u0f9c\u0f9d\u0f9e\u0f9f\u0fa0\u0fa1\u0fa2\u0fa3\u0fa4\u0fa5\u0fa6\u0fa7\u0fa8\u0fa9\u0faa\u0fab\u0fac\u0fad\u0fae\u0faf\u0fb0\u0fb1\u0fb2\u0fb3\u0fb4\u0fb5\u0fb6\u0fb7\u0fb8\u0fb9\u0fba\u0fbb\u0fbc\u0fc6\u102d\u102e\u102f\u1030\u1032\u1036\u1037\u1039\u1058\u1059\u135f\u1712\u1713\u1714\u1732\u1733\u1734\u1752\u1753\u1772\u1773\u17b7\u17b8\u17b9\u17ba\u17bb\u17bc\u17bd\u17c6\u17c9\u17ca\u17cb\u17cc\u17cd\u17ce\u17cf\u17d0\u17d1\u17d2\u17d3\u17dd\u180b\u180c\u180d\u18a9\u1920\u1921\u1922\u1927\u1928\u1932\u1939\u193a\u193b\u1a17\u1a18\u1dc0\u1dc1\u1dc2\u1dc3\u20d0\u20d1\u20d2\u20d3\u20d4\u20d5\u20d6\u20d7\u20d8\u20d9\u20da\u20db\u20dc\u20e1\u20e5\u20e6\u20e7\u20e8\u20e9\u20ea\u20eb\u302a\u302b\u302c\u302d\u302e\u302f\u3099\u309a\ua806\ua80b\ua825\ua826\ufb1e\ufe00\ufe01\ufe02\ufe03\ufe04\ufe05\ufe06\ufe07\ufe08\ufe09\ufe0a\ufe0b\ufe0c\ufe0d\ufe0e\ufe0f\ufe20\ufe21\ufe22\ufe23'
-
-Nd = u'0123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e\u0c6f\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u17e0\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u1810\u1811\u1812\u1813\u1814\u1815\u1816\u1817\u1818\u1819\u1946\u1947\u1948\u1949\u194a\u194b\u194c\u194d\u194e\u194f\u19d0\u19d1\u19d2\u19d3\u19d4\u19d5\u19d6\u19d7\u19d8\u19d9\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19'
-
-Nl = u'\u16ee\u16ef\u16f0\u2160\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168\u2169\u216a\u216b\u216c\u216d\u216e\u216f\u2170\u2171\u2172\u2173\u2174\u2175\u2176\u2177\u2178\u2179\u217a\u217b\u217c\u217d\u217e\u217f\u2180\u2181\u2182\u2183\u3007\u3021\u3022\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u3038\u3039\u303a'
-
-No = u'\xb2\xb3\xb9\xbc\xbd\xbe\u09f4\u09f5\u09f6\u09f7\u09f8\u09f9\u0bf0\u0bf1\u0bf2\u0f2a\u0f2b\u0f2c\u0f2d\u0f2e\u0f2f\u0f30\u0f31\u0f32\u0f33\u1369\u136a\u136b\u136c\u136d\u136e\u136f\u1370\u1371\u1372\u1373\u1374\u1375\u1376\u1377\u1378\u1379\u137a\u137b\u137c\u17f0\u17f1\u17f2\u17f3\u17f4\u17f5\u17f6\u17f7\u17f8\u17f9\u2070\u2074\u2075\u2076\u2077\u2078\u2079\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2153\u2154\u2155\u2156\u2157\u2158\u2159\u215a\u215b\u215c\u215d\u215e\u215f\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u2474\u2475\u2476\u2477\u2478\u2479\u247a\u247b\u247c\u247d\u247e\u247f\u2480\u2481\u2482\u2483\u2484\u2485\u2486\u2487\u2488\u2489\u248a\u248b\u248c\u248d\u248e\u248f\u2490\u2491\u2492\u2493\u2494\u2495\u2496\u2497\u2498\u2499\u249a\u249b\u24ea\u24eb\u24ec\u24ed\u24ee\u24ef\u24f0\u24f1\u24f2\u24f3\u24f4\u24f5\u24f6\u24f7\u24f8\u24f9\u24fa\u24fb\u24fc\u24fd\u24fe\u24ff\u2776\u2777\u2778\u2779\u277a\u277b\u277c\u277d\u277e\u277f\u2780\u2781\u2782\u2783\u2784\u2785\u2786\u2787\u2788\u2789\u278a\u278b\u278c\u278d\u278e\u278f\u2790\u2791\u2792\u2793\u2cfd\u3192\u3193\u3194\u3195\u3220\u3221\u3222\u3223\u3224\u3225\u3226\u3227\u3228\u3229\u3251\u3252\u3253\u3254\u3255\u3256\u3257\u3258\u3259\u325a\u325b\u325c\u325d\u325e\u325f\u3280\u3281\u3282\u3283\u3284\u3285\u3286\u3287\u3288\u3289\u32b1\u32b2\u32b3\u32b4\u32b5\u32b6\u32b7\u32b8\u32b9\u32ba\u32bb\u32bc\u32bd\u32be\u32bf'
-
-Pc = u'_\u203f\u2040\u2054\ufe33\ufe34\ufe4d\ufe4e\ufe4f\uff3f'
-
-Pd = u'-\u058a\u1806\u2010\u2011\u2012\u2013\u2014\u2015\u2e17\u301c\u3030\u30a0\ufe31\ufe32\ufe58\ufe63\uff0d'
-
-Pe = u')]}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u232a\u23b5\u2769\u276b\u276d\u276f\u2771\u2773\u2775\u27c6\u27e7\u27e9\u27eb\u2984\u2986\u2988\u298a\u298c\u298e\u2990\u2992\u2994\u2996\u2998\u29d9\u29db\u29fd\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\u301e\u301f\ufd3f\ufe18\ufe36\ufe38\ufe3a\ufe3c\ufe3e\ufe40\ufe42\ufe44\ufe48\ufe5a\ufe5c\ufe5e\uff09\uff3d\uff5d\uff60\uff63'
-
-Pf = u'\xbb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d'
-
-Pi = u'\xab\u2018\u201b\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c'
-
-Po = u'!"#%&\'*,./:;?@\\\xa1\xb7\xbf\u037e\u0387\u055a\u055b\u055c\u055d\u055e\u055f\u0589\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u060c\u060d\u061b\u061e\u061f\u066a\u066b\u066c\u066d\u06d4\u0700\u0701\u0702\u0703\u0704\u0705\u0706\u0707\u0708\u0709\u070a\u070b\u070c\u070d\u0964\u0965\u0970\u0df4\u0e4f\u0e5a\u0e5b\u0f04\u0f05\u0f06\u0f07\u0f08\u0f09\u0f0a\u0f0b\u0f0c\u0f0d\u0f0e\u0f0f\u0f10\u0f11\u0f12\u0f85\u0fd0\u0fd1\u104a\u104b\u104c\u104d\u104e\u104f\u10fb\u1361\u1362\u1363\u1364\u1365\u1366\u1367\u1368\u166d\u166e\u16eb\u16ec\u16ed\u1735\u1736\u17d4\u17d5\u17d6\u17d8\u17d9\u17da\u1800\u1801\u1802\u1803\u1804\u1805\u1807\u1808\u1809\u180a\u1944\u1945\u19de\u19df\u1a1e\u1a1f\u2016\u2017\u2020\u2021\u2022\u2023\u2024\u2025\u2026\u2027\u2030\u2031\u2032\u2033\u2034\u2035\u2036\u2037\u2038\u203b\u203c\u203d\u203e\u2041\u2042\u2043\u2047\u2048\u2049\u204a\u204b\u204c\u204d\u204e\u204f\u2050\u2051\u2053\u2055\u2056\u2057\u2058\u2059\u205a\u205b\u205c\u205d\u205e\u23b6\u2cf9\u2cfa\u2cfb\u2cfc\u2cfe\u2cff\u2e00\u2e01\u2e06\u2e07\u2e08\u2e0b\u2e0e\u2e0f\u2e10\u2e11\u2e12\u2e13\u2e14\u2e15\u2e16\u3001\u3002\u3003\u303d\u30fb\ufe10\ufe11\ufe12\ufe13\ufe14\ufe15\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49\ufe4a\ufe4b\ufe4c\ufe50\ufe51\ufe52\ufe54\ufe55\ufe56\ufe57\ufe5f\ufe60\ufe61\ufe68\ufe6a\ufe6b\uff01\uff02\uff03\uff05\uff06\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65'
-
-Ps = u'([{\u0f3a\u0f3c\u169b\u201a\u201e\u2045\u207d\u208d\u2329\u23b4\u2768\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991\u2993\u2995\u2997\u29d8\u29da\u29fc\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d\ufd3e\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62'
-
-Sc = u'$\xa2\xa3\xa4\xa5\u060b\u09f2\u09f3\u0af1\u0bf9\u0e3f\u17db\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5\u20a6\u20a7\u20a8\u20a9\u20aa\u20ab\u20ac\u20ad\u20ae\u20af\u20b0\u20b1\u20b2\u20b3\u20b4\u20b5\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6'
-
-Sk = u'^`\xa8\xaf\xb4\xb8\u02c2\u02c3\u02c4\u02c5\u02d2\u02d3\u02d4\u02d5\u02d6\u02d7\u02d8\u02d9\u02da\u02db\u02dc\u02dd\u02de\u02df\u02e5\u02e6\u02e7\u02e8\u02e9\u02ea\u02eb\u02ec\u02ed\u02ef\u02f0\u02f1\u02f2\u02f3\u02f4\u02f5\u02f6\u02f7\u02f8\u02f9\u02fa\u02fb\u02fc\u02fd\u02fe\u02ff\u0374\u0375\u0384\u0385\u1fbd\u1fbf\u1fc0\u1fc1\u1fcd\u1fce\u1fcf\u1fdd\u1fde\u1fdf\u1fed\u1fee\u1fef\u1ffd\u1ffe\u309b\u309c\ua700\ua701\ua702\ua703\ua704\ua705\ua706\ua707\ua708\ua709\ua70a\ua70b\ua70c\ua70d\ua70e\ua70f\ua710\ua711\ua712\ua713\ua714\ua715\ua716\uff3e\uff40\uffe3'
-
-Sm = u'+<=>|~\xac\xb1\xd7\xf7\u03f6\u2044\u2052\u207a\u207b\u207c\u208a\u208b\u208c\u2140\u2141\u2142\u2143\u2144\u214b\u2190\u2191\u2192\u2193\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4\u21f5\u21f6\u21f7\u21f8\u21f9\u21fa\u21fb\u21fc\u21fd\u21fe\u21ff\u2200\u2201\u2202\u2203\u2204\u2205\u2206\u2207\u2208\u2209\u220a\u220b\u220c\u220d\u220e\u220f\u2210\u2211\u2212\u2213\u2214\u2215\u2216\u2217\u2218\u2219\u221a\u221b\u221c\u221d\u221e\u221f\u2220\u2221\u2222\u2223\u2224\u2225\u2226\u2227\u2228\u2229\u222a\u222b\u222c\u222d\u222e\u222f\u2230\u2231\u2232\u2233\u2234\u2235\u2236\u2237\u2238\u2239\u223a\u223b\u223c\u223d\u223e\u223f\u2240\u2241\u2242\u2243\u2244\u2245\u2246\u2247\u2248\u2249\u224a\u224b\u224c\u224d\u224e\u224f\u2250\u2251\u2252\u2253\u2254\u2255\u2256\u2257\u2258\u2259\u225a\u225b\u225c\u225d\u225e\u225f\u2260\u2261\u2262\u2263\u2264\u2265\u2266\u2267\u2268\u2269\u226a\u226b\u226c\u226d\u226e\u226f\u2270\u2271\u2272\u2273\u2274\u2275\u2276\u2277\u2278\u2279\u227a\u227b\u227c\u227d\u227e\u227f\u2280\u2281\u2282\u2283\u2284\u2285\u2286\u2287\u2288\u2289\u228a\u228b\u228c\u228d\u228e\u228f\u2290\u2291\u2292\u2293\u2294\u2295\u2296\u2297\u2298\u2299\u229a\u229b\u229c\u229d\u229e\u229f\u22a0\u22a1\u22a2\u22a3\u22a4\u22a5\u22a6\u22a7\u22a8\u22a9\u22aa\u22ab\u22ac\u22ad\u22ae\u22af\u22b0\u22b1\u22b2\u22b3\u22b4\u22b5\u22b6\u22b7\u22b8\u22b9\u22ba\u22bb\u22bc\u22bd\u22be\u22bf\u22c0\u22c1\u22c2\u22c3\u22c4\u22c5\u22c6\u22c7\u22c8\u22c9\u22ca\u22cb\u22cc\u22cd\u22ce\u22cf\u22d0\u22d1\u22d2\u22d3\u22d4\u22d5\u22d6\u22d7\u22d8\u22d9\u22da\u22db\u22dc\u22dd\u22de\u22df\u22e0\u22e1\u22e2\u22e3\u22e4\u22e5\u22e6\u22e7\u22e8\u22e9\u22ea\u22eb\u22ec\u22ed\u22ee\u22ef\u22f0\u22f1\u22f2\u22f3\u22f4\u22f5\u22f6\u22f7\u22f8\u22f9\u22fa\u22fb\u22fc\u22fd\u22fe\u22ff\u2308\u2309\u230a\u230b\u2320\u2321\u237c\u239b\u239c\u239d\u239e\u239f\u23a0\u23a1\u23a2\u23a3\u23a4\u23a5\u23a6\u23a7\u23a8\u23a9\u23aa\u23ab\u23ac\u23ad\u23ae\u23af\u23b0\u23b1\u23b2\u23b3\u25b7\u25c1\u25f8\u25f9\u25fa\u25fb\u25fc\u25fd\u25fe\u25ff\u266f\u27c0\u27c1\u27c2\u27c3\u27c4\u27d0\u27d1\u27d2\u27d3\u27d4\u27d5\u27d6\u27d7\u27d8\u27d9\u27da\u27db\u27dc\u27dd\u27de\u27df\u27e0\u27e1\u27e2\u27e3\u27e4\u27e5\u27f0\u27f1\u27f2\u27f3\u27f4\u27f5\u27f6\u27f7\u27f8\u27f9\u27fa\u27fb\u27fc\u27fd\u27fe\u27ff\u2900\u2901\u2902\u2903\u2904\u2905\u2906\u2907\u2908\u2909\u290a\u290b\u290c\u290d\u290e\u290f\u2910\u2911\u2912\u2913\u2914\u2915\u2916\u2917\u2918\u2919\u291a\u291b\u291c\u291d\u291e\u291f\u2920\u2921\u2922\u2923\u2924\u2925\u2926\u2927\u2928\u2929\u292a\u292b\u292c\u292d\u292e\u292f\u2930\u2931\u2932\u2933\u2934\u2935\u2936\u2937\u2938\u2939\u293a\u293b\u293c\u293d\u293e\u293f\u2940\u2941\u2942\u2943\u2944\u2945\u2946\u2947\u2948\u2949\u294a\u294b\u294c\u294d\u294e\u294f\u2950\u2951\u2952\u2953\u2954\u2955\u2956\u2957\u2958\u2959\u295a\u295b\u295c\u295d\u295e\u295f\u2960\u2961\u2962\u2963\u2964\u2965\u2966\u2967\u2968\u2969\u296a\u296b\u296c\u296d\u296e\u296f\u2970\u2971\u2972\u2973\u2974\u2975\u2976\u2977\u2978\u2979\u297a\u297b\u297c\u297d\u297e\u297f\u2980\u2981\u2982\u2999\u299a\u299b\u299c\u299d\u299e\u299f\u29a0\u29a1\u29a2\u29a3\u29a4\u29a5\u29a6\u29a7\u29a8\u29a9\u29aa\u29ab\u29ac\u29ad\u29ae\u29af\u29b0\u29b1\u29b2\u29b3\u29b4\u29b5\u29b6\u29b7\u29b8\u29b9\u29ba\u29bb\u29bc\u29bd\u29be\u29bf\u29c0\u29c1\u29c2\u29c3\u29c4\u29c5\u29c6\u29c7\u29c8\u29c9\u29ca\u29cb\u29cc\u29cd\u29ce\u29cf\u29d0\u29d1\u29d2\u29d3\u29d4\u29d5\u29d6\u29d7\u29dc\u29dd\u29de\u29df\u29e0\u29e1\u29e2\u29e3\u29e4\u29e5\u29e6\u29e7\u29e8\u29e9\u29ea\u29eb\u29ec\u29ed\u29ee\u29ef\u29f0\u29f1\u29f2\u29f3\u29f4\u29f5\u29f6\u29f7\u29f8\u29f9\u29fa\u29fb\u29fe\u29ff\u2a00\u2a01\u2a02\u2a03\u2a04\u2a05\u2a06\u2a07\u2a08\u2a09\u2a0a\u2a0b\u2a0c\u2a0d\u2a0e\u2a0f\u2a10\u2a11\u2a12\u2a13\u2a14\u2a15\u2a16\u2a17\u2a18\u2a19\u2a1a\u2a1b\u2a1c\u2a1d\u2a1e\u2a1f\u2a20\u2a21\u2a22\u2a23\u2a24\u2a25\u2a26\u2a27\u2a28\u2a29\u2a2a\u2a2b\u2a2c\u2a2d\u2a2e\u2a2f\u2a30\u2a31\u2a32\u2a33\u2a34\u2a35\u2a36\u2a37\u2a38\u2a39\u2a3a\u2a3b\u2a3c\u2a3d\u2a3e\u2a3f\u2a40\u2a41\u2a42\u2a43\u2a44\u2a45\u2a46\u2a47\u2a48\u2a49\u2a4a\u2a4b\u2a4c\u2a4d\u2a4e\u2a4f\u2a50\u2a51\u2a52\u2a53\u2a54\u2a55\u2a56\u2a57\u2a58\u2a59\u2a5a\u2a5b\u2a5c\u2a5d\u2a5e\u2a5f\u2a60\u2a61\u2a62\u2a63\u2a64\u2a65\u2a66\u2a67\u2a68\u2a69\u2a6a\u2a6b\u2a6c\u2a6d\u2a6e\u2a6f\u2a70\u2a71\u2a72\u2a73\u2a74\u2a75\u2a76\u2a77\u2a78\u2a79\u2a7a\u2a7b\u2a7c\u2a7d\u2a7e\u2a7f\u2a80\u2a81\u2a82\u2a83\u2a84\u2a85\u2a86\u2a87\u2a88\u2a89\u2a8a\u2a8b\u2a8c\u2a8d\u2a8e\u2a8f\u2a90\u2a91\u2a92\u2a93\u2a94\u2a95\u2a96\u2a97\u2a98\u2a99\u2a9a\u2a9b\u2a9c\u2a9d\u2a9e\u2a9f\u2aa0\u2aa1\u2aa2\u2aa3\u2aa4\u2aa5\u2aa6\u2aa7\u2aa8\u2aa9\u2aaa\u2aab\u2aac\u2aad\u2aae\u2aaf\u2ab0\u2ab1\u2ab2\u2ab3\u2ab4\u2ab5\u2ab6\u2ab7\u2ab8\u2ab9\u2aba\u2abb\u2abc\u2abd\u2abe\u2abf\u2ac0\u2ac1\u2ac2\u2ac3\u2ac4\u2ac5\u2ac6\u2ac7\u2ac8\u2ac9\u2aca\u2acb\u2acc\u2acd\u2ace\u2acf\u2ad0\u2ad1\u2ad2\u2ad3\u2ad4\u2ad5\u2ad6\u2ad7\u2ad8\u2ad9\u2ada\u2adb\u2adc\u2add\u2ade\u2adf\u2ae0\u2ae1\u2ae2\u2ae3\u2ae4\u2ae5\u2ae6\u2ae7\u2ae8\u2ae9\u2aea\u2aeb\u2aec\u2aed\u2aee\u2aef\u2af0\u2af1\u2af2\u2af3\u2af4\u2af5\u2af6\u2af7\u2af8\u2af9\u2afa\u2afb\u2afc\u2afd\u2afe\u2aff\ufb29\ufe62\ufe64\ufe65\ufe66\uff0b\uff1c\uff1d\uff1e\uff5c\uff5e\uffe2\uffe9\uffea\uffeb\uffec'
-
-So = u'\xa6\xa7\xa9\xae\xb0\xb6\u0482\u060e\u060f\u06e9\u06fd\u06fe\u09fa\u0b70\u0bf3\u0bf4\u0bf5\u0bf6\u0bf7\u0bf8\u0bfa\u0f01\u0f02\u0f03\u0f13\u0f14\u0f15\u0f16\u0f17\u0f1a\u0f1b\u0f1c\u0f1d\u0f1e\u0f1f\u0f34\u0f36\u0f38\u0fbe\u0fbf\u0fc0\u0fc1\u0fc2\u0fc3\u0fc4\u0fc5\u0fc7\u0fc8\u0fc9\u0fca\u0fcb\u0fcc\u0fcf\u1360\u1390\u1391\u1392\u1393\u1394\u1395\u1396\u1397\u1398\u1399\u1940\u19e0\u19e1\u19e2\u19e3\u19e4\u19e5\u19e6\u19e7\u19e8\u19e9\u19ea\u19eb\u19ec\u19ed\u19ee\u19ef\u19f0\u19f1\u19f2\u19f3\u19f4\u19f5\u19f6\u19f7\u19f8\u19f9\u19fa\u19fb\u19fc\u19fd\u19fe\u19ff\u2100\u2101\u2103\u2104\u2105\u2106\u2108\u2109\u2114\u2116\u2117\u2118\u211e\u211f\u2120\u2121\u2122\u2123\u2125\u2127\u2129\u212e\u2132\u213a\u213b\u214a\u214c\u2195\u2196\u2197\u2198\u2199\u219c\u219d\u219e\u219f\u21a1\u21a2\u21a4\u21a5\u21a7\u21a8\u21a9\u21aa\u21ab\u21ac\u21ad\u21af\u21b0\u21b1\u21b2\u21b3\u21b4\u21b5\u21b6\u21b7\u21b8\u21b9\u21ba\u21bb\u21bc\u21bd\u21be\u21bf\u21c0\u21c1\u21c2\u21c3\u21c4\u21c5\u21c6\u21c7\u21c8\u21c9\u21ca\u21cb\u21cc\u21cd\u21d0\u21d1\u21d3\u21d5\u21d6\u21d7\u21d8\u21d9\u21da\u21db\u21dc\u21dd\u21de\u21df\u21e0\u21e1\u21e2\u21e3\u21e4\u21e5\u21e6\u21e7\u21e8\u21e9\u21ea\u21eb\u21ec\u21ed\u21ee\u21ef\u21f0\u21f1\u21f2\u21f3\u2300\u2301\u2302\u2303\u2304\u2305\u2306\u2307\u230c\u230d\u230e\u230f\u2310\u2311\u2312\u2313\u2314\u2315\u2316\u2317\u2318\u2319\u231a\u231b\u231c\u231d\u231e\u231f\u2322\u2323\u2324\u2325\u2326\u2327\u2328\u232b\u232c\u232d\u232e\u232f\u2330\u2331\u2332\u2333\u2334\u2335\u2336\u2337\u2338\u2339\u233a\u233b\u233c\u233d\u233e\u233f\u2340\u2341\u2342\u2343\u2344\u2345\u2346\u2347\u2348\u2349\u234a\u234b\u234c\u234d\u234e\u234f\u2350\u2351\u2352\u2353\u2354\u2355\u2356\u2357\u2358\u2359\u235a\u235b\u235c\u235d\u235e\u235f\u2360\u2361\u2362\u2363\u2364\u2365\u2366\u2367\u2368\u2369\u236a\u236b\u236c\u236d\u236e\u236f\u2370\u2371\u2372\u2373\u2374\u2375\u2376\u2377\u2378\u2379\u237a\u237b\u237d\u237e\u237f\u2380\u2381\u2382\u2383\u2384\u2385\u2386\u2387\u2388\u2389\u238a\u238b\u238c\u238d\u238e\u238f\u2390\u2391\u2392\u2393\u2394\u2395\u2396\u2397\u2398\u2399\u239a\u23b7\u23b8\u23b9\u23ba\u23bb\u23bc\u23bd\u23be\u23bf\u23c0\u23c1\u23c2\u23c3\u23c4\u23c5\u23c6\u23c7\u23c8\u23c9\u23ca\u23cb\u23cc\u23cd\u23ce\u23cf\u23d0\u23d1\u23d2\u23d3\u23d4\u23d5\u23d6\u23d7\u23d8\u23d9\u23da\u23db\u2400\u2401\u2402\u2403\u2404\u2405\u2406\u2407\u2408\u2409\u240a\u240b\u240c\u240d\u240e\u240f\u2410\u2411\u2412\u2413\u2414\u2415\u2416\u2417\u2418\u2419\u241a\u241b\u241c\u241d\u241e\u241f\u2420\u2421\u2422\u2423\u2424\u2425\u2426\u2440\u2441\u2442\u2443\u2444\u2445\u2446\u2447\u2448\u2449\u244a\u249c\u249d\u249e\u249f\u24a0\u24a1\u24a2\u24a3\u24a4\u24a5\u24a6\u24a7\u24a8\u24a9\u24aa\u24ab\u24ac\u24ad\u24ae\u24af\u24b0\u24b1\u24b2\u24b3\u24b4\u24b5\u24b6\u24b7\u24b8\u24b9\u24ba\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u2500\u2501\u2502\u2503\u2504\u2505\u2506\u2507\u2508\u2509\u250a\u250b\u250c\u250d\u250e\u250f\u2510\u2511\u2512\u2513\u2514\u2515\u2516\u2517\u2518\u2519\u251a\u251b\u251c\u251d\u251e\u251f\u2520\u2521\u2522\u2523\u2524\u2525\u2526\u2527\u2528\u2529\u252a\u252b\u252c\u252d\u252e\u252f\u2530\u2531\u2532\u2533\u2534\u2535\u2536\u2537\u2538\u2539\u253a\u253b\u253c\u253d\u253e\u253f\u2540\u2541\u2542\u2543\u2544\u2545\u2546\u2547\u2548\u2549\u254a\u254b\u254c\u254d\u254e\u254f\u2550\u2551\u2552\u2553\u2554\u2555\u2556\u2557\u2558\u2559\u255a\u255b\u255c\u255d\u255e\u255f\u2560\u2561\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569\u256a\u256b\u256c\u256d\u256e\u256f\u2570\u2571\u2572\u2573\u2574\u2575\u2576\u2577\u2578\u2579\u257a\u257b\u257c\u257d\u257e\u257f\u2580\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588\u2589\u258a\u258b\u258c\u258d\u258e\u258f\u2590\u2591\u2592\u2593\u2594\u2595\u2596\u2597\u2598\u2599\u259a\u259b\u259c\u259d\u259e\u259f\u25a0\u25a1\u25a2\u25a3\u25a4\u25a5\u25a6\u25a7\u25a8\u25a9\u25aa\u25ab\u25ac\u25ad\u25ae\u25af\u25b0\u25b1\u25b2\u25b3\u25b4\u25b5\u25b6\u25b8\u25b9\u25ba\u25bb\u25bc\u25bd\u25be\u25bf\u25c0\u25c2\u25c3\u25c4\u25c5\u25c6\u25c7\u25c8\u25c9\u25ca\u25cb\u25cc\u25cd\u25ce\u25cf\u25d0\u25d1\u25d2\u25d3\u25d4\u25d5\u25d6\u25d7\u25d8\u25d9\u25da\u25db\u25dc\u25dd\u25de\u25df\u25e0\u25e1\u25e2\u25e3\u25e4\u25e5\u25e6\u25e7\u25e8\u25e9\u25ea\u25eb\u25ec\u25ed\u25ee\u25ef\u25f0\u25f1\u25f2\u25f3\u25f4\u25f5\u25f6\u25f7\u2600\u2601\u2602\u2603\u2604\u2605\u2606\u2607\u2608\u2609\u260a\u260b\u260c\u260d\u260e\u260f\u2610\u2611\u2612\u2613\u2614\u2615\u2616\u2617\u2618\u2619\u261a\u261b\u261c\u261d\u261e\u261f\u2620\u2621\u2622\u2623\u2624\u2625\u2626\u2627\u2628\u2629\u262a\u262b\u262c\u262d\u262e\u262f\u2630\u2631\u2632\u2633\u2634\u2635\u2636\u2637\u2638\u2639\u263a\u263b\u263c\u263d\u263e\u263f\u2640\u2641\u2642\u2643\u2644\u2645\u2646\u2647\u2648\u2649\u264a\u264b\u264c\u264d\u264e\u264f\u2650\u2651\u2652\u2653\u2654\u2655\u2656\u2657\u2658\u2659\u265a\u265b\u265c\u265d\u265e\u265f\u2660\u2661\u2662\u2663\u2664\u2665\u2666\u2667\u2668\u2669\u266a\u266b\u266c\u266d\u266e\u2670\u2671\u2672\u2673\u2674\u2675\u2676\u2677\u2678\u2679\u267a\u267b\u267c\u267d\u267e\u267f\u2680\u2681\u2682\u2683\u2684\u2685\u2686\u2687\u2688\u2689\u268a\u268b\u268c\u268d\u268e\u268f\u2690\u2691\u2692\u2693\u2694\u2695\u2696\u2697\u2698\u2699\u269a\u269b\u269c\u26a0\u26a1\u26a2\u26a3\u26a4\u26a5\u26a6\u26a7\u26a8\u26a9\u26aa\u26ab\u26ac\u26ad\u26ae\u26af\u26b0\u26b1\u2701\u2702\u2703\u2704\u2706\u2707\u2708\u2709\u270c\u270d\u270e\u270f\u2710\u2711\u2712\u2713\u2714\u2715\u2716\u2717\u2718\u2719\u271a\u271b\u271c\u271d\u271e\u271f\u2720\u2721\u2722\u2723\u2724\u2725\u2726\u2727\u2729\u272a\u272b\u272c\u272d\u272e\u272f\u2730\u2731\u2732\u2733\u2734\u2735\u2736\u2737\u2738\u2739\u273a\u273b\u273c\u273d\u273e\u273f\u2740\u2741\u2742\u2743\u2744\u2745\u2746\u2747\u2748\u2749\u274a\u274b\u274d\u274f\u2750\u2751\u2752\u2756\u2758\u2759\u275a\u275b\u275c\u275d\u275e\u2761\u2762\u2763\u2764\u2765\u2766\u2767\u2794\u2798\u2799\u279a\u279b\u279c\u279d\u279e\u279f\u27a0\u27a1\u27a2\u27a3\u27a4\u27a5\u27a6\u27a7\u27a8\u27a9\u27aa\u27ab\u27ac\u27ad\u27ae\u27af\u27b1\u27b2\u27b3\u27b4\u27b5\u27b6\u27b7\u27b8\u27b9\u27ba\u27bb\u27bc\u27bd\u27be\u2800\u2801\u2802\u2803\u2804\u2805\u2806\u2807\u2808\u2809\u280a\u280b\u280c\u280d\u280e\u280f\u2810\u2811\u2812\u2813\u2814\u2815\u2816\u2817\u2818\u2819\u281a\u281b\u281c\u281d\u281e\u281f\u2820\u2821\u2822\u2823\u2824\u2825\u2826\u2827\u2828\u2829\u282a\u282b\u282c\u282d\u282e\u282f\u2830\u2831\u2832\u2833\u2834\u2835\u2836\u2837\u2838\u2839\u283a\u283b\u283c\u283d\u283e\u283f\u2840\u2841\u2842\u2843\u2844\u2845\u2846\u2847\u2848\u2849\u284a\u284b\u284c\u284d\u284e\u284f\u2850\u2851\u2852\u2853\u2854\u2855\u2856\u2857\u2858\u2859\u285a\u285b\u285c\u285d\u285e\u285f\u2860\u2861\u2862\u2863\u2864\u2865\u2866\u2867\u2868\u2869\u286a\u286b\u286c\u286d\u286e\u286f\u2870\u2871\u2872\u2873\u2874\u2875\u2876\u2877\u2878\u2879\u287a\u287b\u287c\u287d\u287e\u287f\u2880\u2881\u2882\u2883\u2884\u2885\u2886\u2887\u2888\u2889\u288a\u288b\u288c\u288d\u288e\u288f\u2890\u2891\u2892\u2893\u2894\u2895\u2896\u2897\u2898\u2899\u289a\u289b\u289c\u289d\u289e\u289f\u28a0\u28a1\u28a2\u28a3\u28a4\u28a5\u28a6\u28a7\u28a8\u28a9\u28aa\u28ab\u28ac\u28ad\u28ae\u28af\u28b0\u28b1\u28b2\u28b3\u28b4\u28b5\u28b6\u28b7\u28b8\u28b9\u28ba\u28bb\u28bc\u28bd\u28be\u28bf\u28c0\u28c1\u28c2\u28c3\u28c4\u28c5\u28c6\u28c7\u28c8\u28c9\u28ca\u28cb\u28cc\u28cd\u28ce\u28cf\u28d0\u28d1\u28d2\u28d3\u28d4\u28d5\u28d6\u28d7\u28d8\u28d9\u28da\u28db\u28dc\u28dd\u28de\u28df\u28e0\u28e1\u28e2\u28e3\u28e4\u28e5\u28e6\u28e7\u28e8\u28e9\u28ea\u28eb\u28ec\u28ed\u28ee\u28ef\u28f0\u28f1\u28f2\u28f3\u28f4\u28f5\u28f6\u28f7\u28f8\u28f9\u28fa\u28fb\u28fc\u28fd\u28fe\u28ff\u2b00\u2b01\u2b02\u2b03\u2b04\u2b05\u2b06\u2b07\u2b08\u2b09\u2b0a\u2b0b\u2b0c\u2b0d\u2b0e\u2b0f\u2b10\u2b11\u2b12\u2b13\u2ce5\u2ce6\u2ce7\u2ce8\u2ce9\u2cea\u2e80\u2e81\u2e82\u2e83\u2e84\u2e85\u2e86\u2e87\u2e88\u2e89\u2e8a\u2e8b\u2e8c\u2e8d\u2e8e\u2e8f\u2e90\u2e91\u2e92\u2e93\u2e94\u2e95\u2e96\u2e97\u2e98\u2e99\u2e9b\u2e9c\u2e9d\u2e9e\u2e9f\u2ea0\u2ea1\u2ea2\u2ea3\u2ea4\u2ea5\u2ea6\u2ea7\u2ea8\u2ea9\u2eaa\u2eab\u2eac\u2ead\u2eae\u2eaf\u2eb0\u2eb1\u2eb2\u2eb3\u2eb4\u2eb5\u2eb6\u2eb7\u2eb8\u2eb9\u2eba\u2ebb\u2ebc\u2ebd\u2ebe\u2ebf\u2ec0\u2ec1\u2ec2\u2ec3\u2ec4\u2ec5\u2ec6\u2ec7\u2ec8\u2ec9\u2eca\u2ecb\u2ecc\u2ecd\u2ece\u2ecf\u2ed0\u2ed1\u2ed2\u2ed3\u2ed4\u2ed5\u2ed6\u2ed7\u2ed8\u2ed9\u2eda\u2edb\u2edc\u2edd\u2ede\u2edf\u2ee0\u2ee1\u2ee2\u2ee3\u2ee4\u2ee5\u2ee6\u2ee7\u2ee8\u2ee9\u2eea\u2eeb\u2eec\u2eed\u2eee\u2eef\u2ef0\u2ef1\u2ef2\u2ef3\u2f00\u2f01\u2f02\u2f03\u2f04\u2f05\u2f06\u2f07\u2f08\u2f09\u2f0a\u2f0b\u2f0c\u2f0d\u2f0e\u2f0f\u2f10\u2f11\u2f12\u2f13\u2f14\u2f15\u2f16\u2f17\u2f18\u2f19\u2f1a\u2f1b\u2f1c\u2f1d\u2f1e\u2f1f\u2f20\u2f21\u2f22\u2f23\u2f24\u2f25\u2f26\u2f27\u2f28\u2f29\u2f2a\u2f2b\u2f2c\u2f2d\u2f2e\u2f2f\u2f30\u2f31\u2f32\u2f33\u2f34\u2f35\u2f36\u2f37\u2f38\u2f39\u2f3a\u2f3b\u2f3c\u2f3d\u2f3e\u2f3f\u2f40\u2f41\u2f42\u2f43\u2f44\u2f45\u2f46\u2f47\u2f48\u2f49\u2f4a\u2f4b\u2f4c\u2f4d\u2f4e\u2f4f\u2f50\u2f51\u2f52\u2f53\u2f54\u2f55\u2f56\u2f57\u2f58\u2f59\u2f5a\u2f5b\u2f5c\u2f5d\u2f5e\u2f5f\u2f60\u2f61\u2f62\u2f63\u2f64\u2f65\u2f66\u2f67\u2f68\u2f69\u2f6a\u2f6b\u2f6c\u2f6d\u2f6e\u2f6f\u2f70\u2f71\u2f72\u2f73\u2f74\u2f75\u2f76\u2f77\u2f78\u2f79\u2f7a\u2f7b\u2f7c\u2f7d\u2f7e\u2f7f\u2f80\u2f81\u2f82\u2f83\u2f84\u2f85\u2f86\u2f87\u2f88\u2f89\u2f8a\u2f8b\u2f8c\u2f8d\u2f8e\u2f8f\u2f90\u2f91\u2f92\u2f93\u2f94\u2f95\u2f96\u2f97\u2f98\u2f99\u2f9a\u2f9b\u2f9c\u2f9d\u2f9e\u2f9f\u2fa0\u2fa1\u2fa2\u2fa3\u2fa4\u2fa5\u2fa6\u2fa7\u2fa8\u2fa9\u2faa\u2fab\u2fac\u2fad\u2fae\u2faf\u2fb0\u2fb1\u2fb2\u2fb3\u2fb4\u2fb5\u2fb6\u2fb7\u2fb8\u2fb9\u2fba\u2fbb\u2fbc\u2fbd\u2fbe\u2fbf\u2fc0\u2fc1\u2fc2\u2fc3\u2fc4\u2fc5\u2fc6\u2fc7\u2fc8\u2fc9\u2fca\u2fcb\u2fcc\u2fcd\u2fce\u2fcf\u2fd0\u2fd1\u2fd2\u2fd3\u2fd4\u2fd5\u2ff0\u2ff1\u2ff2\u2ff3\u2ff4\u2ff5\u2ff6\u2ff7\u2ff8\u2ff9\u2ffa\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196\u3197\u3198\u3199\u319a\u319b\u319c\u319d\u319e\u319f\u31c0\u31c1\u31c2\u31c3\u31c4\u31c5\u31c6\u31c7\u31c8\u31c9\u31ca\u31cb\u31cc\u31cd\u31ce\u31cf\u3200\u3201\u3202\u3203\u3204\u3205\u3206\u3207\u3208\u3209\u320a\u320b\u320c\u320d\u320e\u320f\u3210\u3211\u3212\u3213\u3214\u3215\u3216\u3217\u3218\u3219\u321a\u321b\u321c\u321d\u321e\u322a\u322b\u322c\u322d\u322e\u322f\u3230\u3231\u3232\u3233\u3234\u3235\u3236\u3237\u3238\u3239\u323a\u323b\u323c\u323d\u323e\u323f\u3240\u3241\u3242\u3243\u3250\u3260\u3261\u3262\u3263\u3264\u3265\u3266\u3267\u3268\u3269\u326a\u326b\u326c\u326d\u326e\u326f\u3270\u3271\u3272\u3273\u3274\u3275\u3276\u3277\u3278\u3279\u327a\u327b\u327c\u327d\u327e\u327f\u328a\u328b\u328c\u328d\u328e\u328f\u3290\u3291\u3292\u3293\u3294\u3295\u3296\u3297\u3298\u3299\u329a\u329b\u329c\u329d\u329e\u329f\u32a0\u32a1\u32a2\u32a3\u32a4\u32a5\u32a6\u32a7\u32a8\u32a9\u32aa\u32ab\u32ac\u32ad\u32ae\u32af\u32b0\u32c0\u32c1\u32c2\u32c3\u32c4\u32c5\u32c6\u32c7\u32c8\u32c9\u32ca\u32cb\u32cc\u32cd\u32ce\u32cf\u32d0\u32d1\u32d2\u32d3\u32d4\u32d5\u32d6\u32d7\u32d8\u32d9\u32da\u32db\u32dc\u32dd\u32de\u32df\u32e0\u32e1\u32e2\u32e3\u32e4\u32e5\u32e6\u32e7\u32e8\u32e9\u32ea\u32eb\u32ec\u32ed\u32ee\u32ef\u32f0\u32f1\u32f2\u32f3\u32f4\u32f5\u32f6\u32f7\u32f8\u32f9\u32fa\u32fb\u32fc\u32fd\u32fe\u3300\u3301\u3302\u3303\u3304\u3305\u3306\u3307\u3308\u3309\u330a\u330b\u330c\u330d\u330e\u330f\u3310\u3311\u3312\u3313\u3314\u3315\u3316\u3317\u3318\u3319\u331a\u331b\u331c\u331d\u331e\u331f\u3320\u3321\u3322\u3323\u3324\u3325\u3326\u3327\u3328\u3329\u332a\u332b\u332c\u332d\u332e\u332f\u3330\u3331\u3332\u3333\u3334\u3335\u3336\u3337\u3338\u3339\u333a\u333b\u333c\u333d\u333e\u333f\u3340\u3341\u3342\u3343\u3344\u3345\u3346\u3347\u3348\u3349\u334a\u334b\u334c\u334d\u334e\u334f\u3350\u3351\u3352\u3353\u3354\u3355\u3356\u3357\u3358\u3359\u335a\u335b\u335c\u335d\u335e\u335f\u3360\u3361\u3362\u3363\u3364\u3365\u3366\u3367\u3368\u3369\u336a\u336b\u336c\u336d\u336e\u336f\u3370\u3371\u3372\u3373\u3374\u3375\u3376\u3377\u3378\u3379\u337a\u337b\u337c\u337d\u337e\u337f\u3380\u3381\u3382\u3383\u3384\u3385\u3386\u3387\u3388\u3389\u338a\u338b\u338c\u338d\u338e\u338f\u3390\u3391\u3392\u3393\u3394\u3395\u3396\u3397\u3398\u3399\u339a\u339b\u339c\u339d\u339e\u339f\u33a0\u33a1\u33a2\u33a3\u33a4\u33a5\u33a6\u33a7\u33a8\u33a9\u33aa\u33ab\u33ac\u33ad\u33ae\u33af\u33b0\u33b1\u33b2\u33b3\u33b4\u33b5\u33b6\u33b7\u33b8\u33b9\u33ba\u33bb\u33bc\u33bd\u33be\u33bf\u33c0\u33c1\u33c2\u33c3\u33c4\u33c5\u33c6\u33c7\u33c8\u33c9\u33ca\u33cb\u33cc\u33cd\u33ce\u33cf\u33d0\u33d1\u33d2\u33d3\u33d4\u33d5\u33d6\u33d7\u33d8\u33d9\u33da\u33db\u33dc\u33dd\u33de\u33df\u33e0\u33e1\u33e2\u33e3\u33e4\u33e5\u33e6\u33e7\u33e8\u33e9\u33ea\u33eb\u33ec\u33ed\u33ee\u33ef\u33f0\u33f1\u33f2\u33f3\u33f4\u33f5\u33f6\u33f7\u33f8\u33f9\u33fa\u33fb\u33fc\u33fd\u33fe\u33ff\u4dc0\u4dc1\u4dc2\u4dc3\u4dc4\u4dc5\u4dc6\u4dc7\u4dc8\u4dc9\u4dca\u4dcb\u4dcc\u4dcd\u4dce\u4dcf\u4dd0\u4dd1\u4dd2\u4dd3\u4dd4\u4dd5\u4dd6\u4dd7\u4dd8\u4dd9\u4dda\u4ddb\u4ddc\u4ddd\u4dde\u4ddf\u4de0\u4de1\u4de2\u4de3\u4de4\u4de5\u4de6\u4de7\u4de8\u4de9\u4dea\u4deb\u4dec\u4ded\u4dee\u4def\u4df0\u4df1\u4df2\u4df3\u4df4\u4df5\u4df6\u4df7\u4df8\u4df9\u4dfa\u4dfb\u4dfc\u4dfd\u4dfe\u4dff\ua490\ua491\ua492\ua493\ua494\ua495\ua496\ua497\ua498\ua499\ua49a\ua49b\ua49c\ua49d\ua49e\ua49f\ua4a0\ua4a1\ua4a2\ua4a3\ua4a4\ua4a5\ua4a6\ua4a7\ua4a8\ua4a9\ua4aa\ua4ab\ua4ac\ua4ad\ua4ae\ua4af\ua4b0\ua4b1\ua4b2\ua4b3\ua4b4\ua4b5\ua4b6\ua4b7\ua4b8\ua4b9\ua4ba\ua4bb\ua4bc\ua4bd\ua4be\ua4bf\ua4c0\ua4c1\ua4c2\ua4c3\ua4c4\ua4c5\ua4c6\ua828\ua829\ua82a\ua82b\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd'
-
-Zl = u'\u2028'
-
-Zp = u'\u2029'
-
-Zs = u' \xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000'
-
-cats = ['Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', 'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs']
-
-def combine(*args):
-    return u''.join([globals()[cat] for cat in args])
-
-xid_start = u'\u0041-\u005A\u005F\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01BA\u01BB\u01BC-\u01BF\u01C0-\u01C3\u01C4-\u0241\u0250-\u02AF\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EE\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03F5\u03F7-\u0481\u048A-\u04CE\u04D0-\u04F9\u0500-\u050F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0640\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06E5-\u06E6\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u076D\u0780-\u07A5\u07B1\u0904-\u0939\u093D\u0950\u0958-\u0961\u097D\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60-\u0D61\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E40-\u0E45\u0E46\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDD\u0F00\u0F40-\u0F47\u0F49-\u0F6A\u0F88-\u0F8B\u1000-\u1021\u1023-\u1027\u1029-\u102A\u1050-\u1055\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1159\u115F-\u11A2\u11A8-\u11F9\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u1676\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1842\u1843\u1844-\u1877\u1880-\u18A8\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19A9\u19C1-\u19C7\u1A00-\u1A16\u1D00-\u1D2B\u1D2C-\u1D61\u1D62-\u1D77\u1D78\u1D79-\u1D9A\u1D9B-\u1DBF\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u2094\u2102\u2107\u210A-\u2113\u2115\u2118\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212E\u212F-\u2131\u2133-\u2134\u2135-\u2138\u2139\u213C-\u213F\u2145-\u2149\u2160-\u2183\u2C00-\u2C2E\u2C30-\u2C5E\u2C80-\u2CE4\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005\u3006\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303A\u303B\u303C\u3041-\u3096\u309D-\u309E\u309F\u30A1-\u30FA\u30FC-\u30FE\u30FF\u3105-\u312C\u3131-\u318E\u31A0-\u31B7\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FBB\uA000-\uA014\uA015\uA016-\uA48C\uA800-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uAC00-\uD7A3\uF900-\uFA2D\uFA30-\uFA6A\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFF6F\uFF70\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC'
-
-xid_continue = u'\u0030-\u0039\u0041-\u005A\u005F\u0061-\u007A\u00AA\u00B5\u00B7\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01BA\u01BB\u01BC-\u01BF\u01C0-\u01C3\u01C4-\u0241\u0250-\u02AF\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EE\u0300-\u036F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03F5\u03F7-\u0481\u0483-\u0486\u048A-\u04CE\u04D0-\u04F9\u0500-\u050F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05B9\u05BB-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u0615\u0621-\u063A\u0640\u0641-\u064A\u064B-\u065E\u0660-\u0669\u066E-\u066F\u0670\u0671-\u06D3\u06D5\u06D6-\u06DC\u06DF-\u06E4\u06E5-\u06E6\u06E7-\u06E8\u06EA-\u06ED\u06EE-\u06EF\u06F0-\u06F9\u06FA-\u06FC\u06FF\u0710\u0711\u0712-\u072F\u0730-\u074A\u074D-\u076D\u0780-\u07A5\u07A6-\u07B0\u07B1\u0901-\u0902\u0903\u0904-\u0939\u093C\u093D\u093E-\u0940\u0941-\u0948\u0949-\u094C\u094D\u0950\u0951-\u0954\u0958-\u0961\u0962-\u0963\u0966-\u096F\u097D\u0981\u0982-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BD\u09BE-\u09C0\u09C1-\u09C4\u09C7-\u09C8\u09CB-\u09CC\u09CD\u09CE\u09D7\u09DC-\u09DD\u09DF-\u09E1\u09E2-\u09E3\u09E6-\u09EF\u09F0-\u09F1\u0A01-\u0A02\u0A03\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A40\u0A41-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A70-\u0A71\u0A72-\u0A74\u0A81-\u0A82\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC\u0ABD\u0ABE-\u0AC0\u0AC1-\u0AC5\u0AC7-\u0AC8\u0AC9\u0ACB-\u0ACC\u0ACD\u0AD0\u0AE0-\u0AE1\u0AE2-\u0AE3\u0AE6-\u0AEF\u0B01\u0B02-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3C\u0B3D\u0B3E\u0B3F\u0B40\u0B41-\u0B43\u0B47-\u0B48\u0B4B-\u0B4C\u0B4D\u0B56\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BBF\u0BC0\u0BC1-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BCD\u0BD7\u0BE6-\u0BEF\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C40\u0C41-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC\u0CBD\u0CBE\u0CBF\u0CC0-\u0CC4\u0CC6\u0CC7-\u0CC8\u0CCA-\u0CCB\u0CCC-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D40\u0D41-\u0D43\u0D46-\u0D48\u0D4A-\u0D4C\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F\u0D82-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD1\u0DD2-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2-\u0DF3\u0E01-\u0E30\u0E31\u0E32-\u0E33\u0E34-\u0E3A\u0E40-\u0E45\u0E46\u0E47-\u0E4E\u0E50-\u0E59\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB1\u0EB2-\u0EB3\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDD\u0F00\u0F18-\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F3F\u0F40-\u0F47\u0F49-\u0F6A\u0F71-\u0F7E\u0F7F\u0F80-\u0F84\u0F86-\u0F87\u0F88-\u0F8B\u0F90-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1021\u1023-\u1027\u1029-\u102A\u102C\u102D-\u1030\u1031\u1032\u1036-\u1037\u1038\u1039\u1040-\u1049\u1050-\u1055\u1056-\u1057\u1058-\u1059\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1159\u115F-\u11A2\u11A8-\u11F9\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u1676\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1712-\u1714\u1720-\u1731\u1732-\u1734\u1740-\u1751\u1752-\u1753\u1760-\u176C\u176E-\u1770\u1772-\u1773\u1780-\u17B3\u17B6\u17B7-\u17BD\u17BE-\u17C5\u17C6\u17C7-\u17C8\u17C9-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1842\u1843\u1844-\u1877\u1880-\u18A8\u18A9\u1900-\u191C\u1920-\u1922\u1923-\u1926\u1927-\u1928\u1929-\u192B\u1930-\u1931\u1932\u1933-\u1938\u1939-\u193B\u1946-\u194F\u1950-\u196D\u1970-\u1974\u1980-\u19A9\u19B0-\u19C0\u19C1-\u19C7\u19C8-\u19C9\u19D0-\u19D9\u1A00-\u1A16\u1A17-\u1A18\u1A19-\u1A1B\u1D00-\u1D2B\u1D2C-\u1D61\u1D62-\u1D77\u1D78\u1D79-\u1D9A\u1D9B-\u1DBF\u1DC0-\u1DC3\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F-\u2040\u2054\u2071\u207F\u2090-\u2094\u20D0-\u20DC\u20E1\u20E5-\u20EB\u2102\u2107\u210A-\u2113\u2115\u2118\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212E\u212F-\u2131\u2133-\u2134\u2135-\u2138\u2139\u213C-\u213F\u2145-\u2149\u2160-\u2183\u2C00-\u2C2E\u2C30-\u2C5E\u2C80-\u2CE4\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005\u3006\u3007\u3021-\u3029\u302A-\u302F\u3031-\u3035\u3038-\u303A\u303B\u303C\u3041-\u3096\u3099-\u309A\u309D-\u309E\u309F\u30A1-\u30FA\u30FC-\u30FE\u30FF\u3105-\u312C\u3131-\u318E\u31A0-\u31B7\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FBB\uA000-\uA014\uA015\uA016-\uA48C\uA800-\uA801\uA802\uA803-\uA805\uA806\uA807-\uA80A\uA80B\uA80C-\uA822\uA823-\uA824\uA825-\uA826\uA827\uAC00-\uD7A3\uF900-\uFA2D\uFA30-\uFA6A\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1E\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE00-\uFE0F\uFE20-\uFE23\uFE33-\uFE34\uFE4D-\uFE4F\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFF6F\uFF70\uFF71-\uFF9D\uFF9E-\uFF9F\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC'
-
-def allexcept(*args):
-    newcats = cats[:]
-    for arg in args:
-        newcats.remove(arg)
-    return u''.join([globals()[cat] for cat in newcats])
-
-if __name__ == '__main__':
-    import unicodedata
-
-    categories = {}
-
-    f = open(__file__.rstrip('co'))
-    try:
-        content = f.read()
-    finally:
-        f.close()
-
-    header = content[:content.find('Cc =')]
-    footer = content[content.find("def combine("):]
-
-    for code in range(65535):
-        c = unichr(code)
-        cat = unicodedata.category(c)
-        categories.setdefault(cat, []).append(c)
-
-    f = open(__file__, 'w')
-    f.write(header)
-
-    for cat in sorted(categories):
-        val = u''.join(categories[cat])
-        if cat == 'Cs':
-            # Jython can't handle isolated surrogates
-            f.write("""\
-try:
-    Cs = eval(r"%r")
-except UnicodeDecodeError:
-    Cs = '' # Jython can't handle isolated surrogates\n\n""" % val)
-        else:
-            f.write('%s = %r\n\n' % (cat, val))
-    f.write('cats = %r\n\n' % sorted(categories.keys()))
-
-    f.write(footer)
-    f.close()
diff --git a/third_party/jinja2/bccache.py b/third_party/jinja2/bccache.py
deleted file mode 100644
index f5bd314..0000000
--- a/third_party/jinja2/bccache.py
+++ /dev/null
@@ -1,362 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.bccache
-    ~~~~~~~~~~~~~~
-
-    This module implements the bytecode cache system Jinja is optionally
-    using.  This is useful if you have very complex template situations and
-    the compiliation of all those templates slow down your application too
-    much.
-
-    Situations where this is useful are often forking web applications that
-    are initialized on the first request.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD.
-"""
-from os import path, listdir
-import os
-import sys
-import stat
-import errno
-import marshal
-import tempfile
-import fnmatch
-from hashlib import sha1
-from jinja2.utils import open_if_exists
-from jinja2._compat import BytesIO, pickle, PY2, text_type
-
-
-# marshal works better on 3.x, one hack less required
-if not PY2:
-    marshal_dump = marshal.dump
-    marshal_load = marshal.load
-else:
-
-    def marshal_dump(code, f):
-        if isinstance(f, file):
-            marshal.dump(code, f)
-        else:
-            f.write(marshal.dumps(code))
-
-    def marshal_load(f):
-        if isinstance(f, file):
-            return marshal.load(f)
-        return marshal.loads(f.read())
-
-
-bc_version = 2
-
-# magic version used to only change with new jinja versions.  With 2.6
-# we change this to also take Python version changes into account.  The
-# reason for this is that Python tends to segfault if fed earlier bytecode
-# versions because someone thought it would be a good idea to reuse opcodes
-# or make Python incompatible with earlier versions.
-bc_magic = 'j2'.encode('ascii') + \
-    pickle.dumps(bc_version, 2) + \
-    pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1])
-
-
-class Bucket(object):
-    """Buckets are used to store the bytecode for one template.  It's created
-    and initialized by the bytecode cache and passed to the loading functions.
-
-    The buckets get an internal checksum from the cache assigned and use this
-    to automatically reject outdated cache material.  Individual bytecode
-    cache subclasses don't have to care about cache invalidation.
-    """
-
-    def __init__(self, environment, key, checksum):
-        self.environment = environment
-        self.key = key
-        self.checksum = checksum
-        self.reset()
-
-    def reset(self):
-        """Resets the bucket (unloads the bytecode)."""
-        self.code = None
-
-    def load_bytecode(self, f):
-        """Loads bytecode from a file or file like object."""
-        # make sure the magic header is correct
-        magic = f.read(len(bc_magic))
-        if magic != bc_magic:
-            self.reset()
-            return
-        # the source code of the file changed, we need to reload
-        checksum = pickle.load(f)
-        if self.checksum != checksum:
-            self.reset()
-            return
-        # if marshal_load fails then we need to reload
-        try:
-            self.code = marshal_load(f)
-        except (EOFError, ValueError, TypeError):
-            self.reset()
-            return
-
-    def write_bytecode(self, f):
-        """Dump the bytecode into the file or file like object passed."""
-        if self.code is None:
-            raise TypeError('can\'t write empty bucket')
-        f.write(bc_magic)
-        pickle.dump(self.checksum, f, 2)
-        marshal_dump(self.code, f)
-
-    def bytecode_from_string(self, string):
-        """Load bytecode from a string."""
-        self.load_bytecode(BytesIO(string))
-
-    def bytecode_to_string(self):
-        """Return the bytecode as string."""
-        out = BytesIO()
-        self.write_bytecode(out)
-        return out.getvalue()
-
-
-class BytecodeCache(object):
-    """To implement your own bytecode cache you have to subclass this class
-    and override :meth:`load_bytecode` and :meth:`dump_bytecode`.  Both of
-    these methods are passed a :class:`~jinja2.bccache.Bucket`.
-
-    A very basic bytecode cache that saves the bytecode on the file system::
-
-        from os import path
-
-        class MyCache(BytecodeCache):
-
-            def __init__(self, directory):
-                self.directory = directory
-
-            def load_bytecode(self, bucket):
-                filename = path.join(self.directory, bucket.key)
-                if path.exists(filename):
-                    with open(filename, 'rb') as f:
-                        bucket.load_bytecode(f)
-
-            def dump_bytecode(self, bucket):
-                filename = path.join(self.directory, bucket.key)
-                with open(filename, 'wb') as f:
-                    bucket.write_bytecode(f)
-
-    A more advanced version of a filesystem based bytecode cache is part of
-    Jinja2.
-    """
-
-    def load_bytecode(self, bucket):
-        """Subclasses have to override this method to load bytecode into a
-        bucket.  If they are not able to find code in the cache for the
-        bucket, it must not do anything.
-        """
-        raise NotImplementedError()
-
-    def dump_bytecode(self, bucket):
-        """Subclasses have to override this method to write the bytecode
-        from a bucket back to the cache.  If it unable to do so it must not
-        fail silently but raise an exception.
-        """
-        raise NotImplementedError()
-
-    def clear(self):
-        """Clears the cache.  This method is not used by Jinja2 but should be
-        implemented to allow applications to clear the bytecode cache used
-        by a particular environment.
-        """
-
-    def get_cache_key(self, name, filename=None):
-        """Returns the unique hash key for this template name."""
-        hash = sha1(name.encode('utf-8'))
-        if filename is not None:
-            filename = '|' + filename
-            if isinstance(filename, text_type):
-                filename = filename.encode('utf-8')
-            hash.update(filename)
-        return hash.hexdigest()
-
-    def get_source_checksum(self, source):
-        """Returns a checksum for the source."""
-        return sha1(source.encode('utf-8')).hexdigest()
-
-    def get_bucket(self, environment, name, filename, source):
-        """Return a cache bucket for the given template.  All arguments are
-        mandatory but filename may be `None`.
-        """
-        key = self.get_cache_key(name, filename)
-        checksum = self.get_source_checksum(source)
-        bucket = Bucket(environment, key, checksum)
-        self.load_bytecode(bucket)
-        return bucket
-
-    def set_bucket(self, bucket):
-        """Put the bucket into the cache."""
-        self.dump_bytecode(bucket)
-
-
-class FileSystemBytecodeCache(BytecodeCache):
-    """A bytecode cache that stores bytecode on the filesystem.  It accepts
-    two arguments: The directory where the cache items are stored and a
-    pattern string that is used to build the filename.
-
-    If no directory is specified a default cache directory is selected.  On
-    Windows the user's temp directory is used, on UNIX systems a directory
-    is created for the user in the system temp directory.
-
-    The pattern can be used to have multiple separate caches operate on the
-    same directory.  The default pattern is ``'__jinja2_%s.cache'``.  ``%s``
-    is replaced with the cache key.
-
-    >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache')
-
-    This bytecode cache supports clearing of the cache using the clear method.
-    """
-
-    def __init__(self, directory=None, pattern='__jinja2_%s.cache'):
-        if directory is None:
-            directory = self._get_default_cache_dir()
-        self.directory = directory
-        self.pattern = pattern
-
-    def _get_default_cache_dir(self):
-        def _unsafe_dir():
-            raise RuntimeError('Cannot determine safe temp directory.  You '
-                               'need to explicitly provide one.')
-
-        tmpdir = tempfile.gettempdir()
-
-        # On windows the temporary directory is used specific unless
-        # explicitly forced otherwise.  We can just use that.
-        if os.name == 'nt':
-            return tmpdir
-        if not hasattr(os, 'getuid'):
-            _unsafe_dir()
-
-        dirname = '_jinja2-cache-%d' % os.getuid()
-        actual_dir = os.path.join(tmpdir, dirname)
-
-        try:
-            os.mkdir(actual_dir, stat.S_IRWXU)
-        except OSError as e:
-            if e.errno != errno.EEXIST:
-                raise
-        try:
-            os.chmod(actual_dir, stat.S_IRWXU)
-            actual_dir_stat = os.lstat(actual_dir)
-            if actual_dir_stat.st_uid != os.getuid() \
-               or not stat.S_ISDIR(actual_dir_stat.st_mode) \
-               or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU:
-                _unsafe_dir()
-        except OSError as e:
-            if e.errno != errno.EEXIST:
-                raise
-
-        actual_dir_stat = os.lstat(actual_dir)
-        if actual_dir_stat.st_uid != os.getuid() \
-           or not stat.S_ISDIR(actual_dir_stat.st_mode) \
-           or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU:
-            _unsafe_dir()
-
-        return actual_dir
-
-    def _get_cache_filename(self, bucket):
-        return path.join(self.directory, self.pattern % bucket.key)
-
-    def load_bytecode(self, bucket):
-        f = open_if_exists(self._get_cache_filename(bucket), 'rb')
-        if f is not None:
-            try:
-                bucket.load_bytecode(f)
-            finally:
-                f.close()
-
-    def dump_bytecode(self, bucket):
-        f = open(self._get_cache_filename(bucket), 'wb')
-        try:
-            bucket.write_bytecode(f)
-        finally:
-            f.close()
-
-    def clear(self):
-        # imported lazily here because google app-engine doesn't support
-        # write access on the file system and the function does not exist
-        # normally.
-        from os import remove
-        files = fnmatch.filter(listdir(self.directory), self.pattern % '*')
-        for filename in files:
-            try:
-                remove(path.join(self.directory, filename))
-            except OSError:
-                pass
-
-
-class MemcachedBytecodeCache(BytecodeCache):
-    """This class implements a bytecode cache that uses a memcache cache for
-    storing the information.  It does not enforce a specific memcache library
-    (tummy's memcache or cmemcache) but will accept any class that provides
-    the minimal interface required.
-
-    Libraries compatible with this class:
-
-    -   `werkzeug <http://werkzeug.pocoo.org/>`_.contrib.cache
-    -   `python-memcached <http://www.tummy.com/Community/software/python-memcached/>`_
-    -   `cmemcache <http://gijsbert.org/cmemcache/>`_
-
-    (Unfortunately the django cache interface is not compatible because it
-    does not support storing binary data, only unicode.  You can however pass
-    the underlying cache client to the bytecode cache which is available
-    as `django.core.cache.cache._client`.)
-
-    The minimal interface for the client passed to the constructor is this:
-
-    .. class:: MinimalClientInterface
-
-        .. method:: set(key, value[, timeout])
-
-            Stores the bytecode in the cache.  `value` is a string and
-            `timeout` the timeout of the key.  If timeout is not provided
-            a default timeout or no timeout should be assumed, if it's
-            provided it's an integer with the number of seconds the cache
-            item should exist.
-
-        .. method:: get(key)
-
-            Returns the value for the cache key.  If the item does not
-            exist in the cache the return value must be `None`.
-
-    The other arguments to the constructor are the prefix for all keys that
-    is added before the actual cache key and the timeout for the bytecode in
-    the cache system.  We recommend a high (or no) timeout.
-
-    This bytecode cache does not support clearing of used items in the cache.
-    The clear method is a no-operation function.
-
-    .. versionadded:: 2.7
-       Added support for ignoring memcache errors through the
-       `ignore_memcache_errors` parameter.
-    """
-
-    def __init__(self, client, prefix='jinja2/bytecode/', timeout=None,
-                 ignore_memcache_errors=True):
-        self.client = client
-        self.prefix = prefix
-        self.timeout = timeout
-        self.ignore_memcache_errors = ignore_memcache_errors
-
-    def load_bytecode(self, bucket):
-        try:
-            code = self.client.get(self.prefix + bucket.key)
-        except Exception:
-            if not self.ignore_memcache_errors:
-                raise
-            code = None
-        if code is not None:
-            bucket.bytecode_from_string(code)
-
-    def dump_bytecode(self, bucket):
-        args = (self.prefix + bucket.key, bucket.bytecode_to_string())
-        if self.timeout is not None:
-            args += (self.timeout,)
-        try:
-            self.client.set(*args)
-        except Exception:
-            if not self.ignore_memcache_errors:
-                raise
diff --git a/third_party/jinja2/compiler.py b/third_party/jinja2/compiler.py
deleted file mode 100644
index fad007b..0000000
--- a/third_party/jinja2/compiler.py
+++ /dev/null
@@ -1,1686 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.compiler
-    ~~~~~~~~~~~~~~~
-
-    Compiles nodes into python code.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-from itertools import chain
-from copy import deepcopy
-from keyword import iskeyword as is_python_keyword
-from jinja2 import nodes
-from jinja2.nodes import EvalContext
-from jinja2.visitor import NodeVisitor
-from jinja2.exceptions import TemplateAssertionError
-from jinja2.utils import Markup, concat, escape
-from jinja2._compat import range_type, text_type, string_types, \
-     iteritems, NativeStringIO, imap
-
-
-operators = {
-    'eq':       '==',
-    'ne':       '!=',
-    'gt':       '>',
-    'gteq':     '>=',
-    'lt':       '<',
-    'lteq':     '<=',
-    'in':       'in',
-    'notin':    'not in'
-}
-
-# what method to iterate over items do we want to use for dict iteration
-# in generated code?  on 2.x let's go with iteritems, on 3.x with items
-if hasattr(dict, 'iteritems'):
-    dict_item_iter = 'iteritems'
-else:
-    dict_item_iter = 'items'
-
-
-# does if 0: dummy(x) get us x into the scope?
-def unoptimize_before_dead_code():
-    x = 42
-    def f():
-        if 0: dummy(x)
-    return f
-
-# The getattr is necessary for pypy which does not set this attribute if
-# no closure is on the function
-unoptimize_before_dead_code = bool(
-    getattr(unoptimize_before_dead_code(), '__closure__', None))
-
-
-def generate(node, environment, name, filename, stream=None,
-             defer_init=False):
-    """Generate the python source for a node tree."""
-    if not isinstance(node, nodes.Template):
-        raise TypeError('Can\'t compile non template nodes')
-    generator = environment.code_generator_class(environment, name, filename,
-                                                 stream, defer_init)
-    generator.visit(node)
-    if stream is None:
-        return generator.stream.getvalue()
-
-
-def has_safe_repr(value):
-    """Does the node have a safe representation?"""
-    if value is None or value is NotImplemented or value is Ellipsis:
-        return True
-    if isinstance(value, (bool, int, float, complex, range_type,
-            Markup) + string_types):
-        return True
-    if isinstance(value, (tuple, list, set, frozenset)):
-        for item in value:
-            if not has_safe_repr(item):
-                return False
-        return True
-    elif isinstance(value, dict):
-        for key, value in iteritems(value):
-            if not has_safe_repr(key):
-                return False
-            if not has_safe_repr(value):
-                return False
-        return True
-    return False
-
-
-def find_undeclared(nodes, names):
-    """Check if the names passed are accessed undeclared.  The return value
-    is a set of all the undeclared names from the sequence of names found.
-    """
-    visitor = UndeclaredNameVisitor(names)
-    try:
-        for node in nodes:
-            visitor.visit(node)
-    except VisitorExit:
-        pass
-    return visitor.undeclared
-
-
-class Identifiers(object):
-    """Tracks the status of identifiers in frames."""
-
-    def __init__(self):
-        # variables that are known to be declared (probably from outer
-        # frames or because they are special for the frame)
-        self.declared = set()
-
-        # undeclared variables from outer scopes
-        self.outer_undeclared = set()
-
-        # names that are accessed without being explicitly declared by
-        # this one or any of the outer scopes.  Names can appear both in
-        # declared and undeclared.
-        self.undeclared = set()
-
-        # names that are declared locally
-        self.declared_locally = set()
-
-        # names that are declared by parameters
-        self.declared_parameter = set()
-
-    def add_special(self, name):
-        """Register a special name like `loop`."""
-        self.undeclared.discard(name)
-        self.declared.add(name)
-
-    def is_declared(self, name):
-        """Check if a name is declared in this or an outer scope."""
-        if name in self.declared_locally or name in self.declared_parameter:
-            return True
-        return name in self.declared
-
-    def copy(self):
-        return deepcopy(self)
-
-
-class Frame(object):
-    """Holds compile time information for us."""
-
-    def __init__(self, eval_ctx, parent=None):
-        self.eval_ctx = eval_ctx
-        self.identifiers = Identifiers()
-
-        # a toplevel frame is the root + soft frames such as if conditions.
-        self.toplevel = False
-
-        # the root frame is basically just the outermost frame, so no if
-        # conditions.  This information is used to optimize inheritance
-        # situations.
-        self.rootlevel = False
-
-        # in some dynamic inheritance situations the compiler needs to add
-        # write tests around output statements.
-        self.require_output_check = parent and parent.require_output_check
-
-        # inside some tags we are using a buffer rather than yield statements.
-        # this for example affects {% filter %} or {% macro %}.  If a frame
-        # is buffered this variable points to the name of the list used as
-        # buffer.
-        self.buffer = None
-
-        # the name of the block we're in, otherwise None.
-        self.block = parent and parent.block or None
-
-        # a set of actually assigned names
-        self.assigned_names = set()
-
-        # the parent of this frame
-        self.parent = parent
-
-        if parent is not None:
-            self.identifiers.declared.update(
-                parent.identifiers.declared |
-                parent.identifiers.declared_parameter |
-                parent.assigned_names
-            )
-            self.identifiers.outer_undeclared.update(
-                parent.identifiers.undeclared -
-                self.identifiers.declared
-            )
-            self.buffer = parent.buffer
-
-    def copy(self):
-        """Create a copy of the current one."""
-        rv = object.__new__(self.__class__)
-        rv.__dict__.update(self.__dict__)
-        rv.identifiers = object.__new__(self.identifiers.__class__)
-        rv.identifiers.__dict__.update(self.identifiers.__dict__)
-        return rv
-
-    def inspect(self, nodes):
-        """Walk the node and check for identifiers.  If the scope is hard (eg:
-        enforce on a python level) overrides from outer scopes are tracked
-        differently.
-        """
-        visitor = FrameIdentifierVisitor(self.identifiers)
-        for node in nodes:
-            visitor.visit(node)
-
-    def find_shadowed(self, extra=()):
-        """Find all the shadowed names.  extra is an iterable of variables
-        that may be defined with `add_special` which may occour scoped.
-        """
-        i = self.identifiers
-        return (i.declared | i.outer_undeclared) & \
-               (i.declared_locally | i.declared_parameter) | \
-               set(x for x in extra if i.is_declared(x))
-
-    def inner(self):
-        """Return an inner frame."""
-        return Frame(self.eval_ctx, self)
-
-    def soft(self):
-        """Return a soft frame.  A soft frame may not be modified as
-        standalone thing as it shares the resources with the frame it
-        was created of, but it's not a rootlevel frame any longer.
-        """
-        rv = self.copy()
-        rv.rootlevel = False
-        return rv
-
-    __copy__ = copy
-
-
-class VisitorExit(RuntimeError):
-    """Exception used by the `UndeclaredNameVisitor` to signal a stop."""
-
-
-class DependencyFinderVisitor(NodeVisitor):
-    """A visitor that collects filter and test calls."""
-
-    def __init__(self):
-        self.filters = set()
-        self.tests = set()
-
-    def visit_Filter(self, node):
-        self.generic_visit(node)
-        self.filters.add(node.name)
-
-    def visit_Test(self, node):
-        self.generic_visit(node)
-        self.tests.add(node.name)
-
-    def visit_Block(self, node):
-        """Stop visiting at blocks."""
-
-
-class UndeclaredNameVisitor(NodeVisitor):
-    """A visitor that checks if a name is accessed without being
-    declared.  This is different from the frame visitor as it will
-    not stop at closure frames.
-    """
-
-    def __init__(self, names):
-        self.names = set(names)
-        self.undeclared = set()
-
-    def visit_Name(self, node):
-        if node.ctx == 'load' and node.name in self.names:
-            self.undeclared.add(node.name)
-            if self.undeclared == self.names:
-                raise VisitorExit()
-        else:
-            self.names.discard(node.name)
-
-    def visit_Block(self, node):
-        """Stop visiting a blocks."""
-
-
-class FrameIdentifierVisitor(NodeVisitor):
-    """A visitor for `Frame.inspect`."""
-
-    def __init__(self, identifiers):
-        self.identifiers = identifiers
-
-    def visit_Name(self, node):
-        """All assignments to names go through this function."""
-        if node.ctx == 'store':
-            self.identifiers.declared_locally.add(node.name)
-        elif node.ctx == 'param':
-            self.identifiers.declared_parameter.add(node.name)
-        elif node.ctx == 'load' and not \
-             self.identifiers.is_declared(node.name):
-            self.identifiers.undeclared.add(node.name)
-
-    def visit_If(self, node):
-        self.visit(node.test)
-        real_identifiers = self.identifiers
-
-        old_names = real_identifiers.declared_locally | \
-                    real_identifiers.declared_parameter
-
-        def inner_visit(nodes):
-            if not nodes:
-                return set()
-            self.identifiers = real_identifiers.copy()
-            for subnode in nodes:
-                self.visit(subnode)
-            rv = self.identifiers.declared_locally - old_names
-            # we have to remember the undeclared variables of this branch
-            # because we will have to pull them.
-            real_identifiers.undeclared.update(self.identifiers.undeclared)
-            self.identifiers = real_identifiers
-            return rv
-
-        body = inner_visit(node.body)
-        else_ = inner_visit(node.else_ or ())
-
-        # the differences between the two branches are also pulled as
-        # undeclared variables
-        real_identifiers.undeclared.update(body.symmetric_difference(else_) -
-                                           real_identifiers.declared)
-
-        # remember those that are declared.
-        real_identifiers.declared_locally.update(body | else_)
-
-    def visit_Macro(self, node):
-        self.identifiers.declared_locally.add(node.name)
-
-    def visit_Import(self, node):
-        self.generic_visit(node)
-        self.identifiers.declared_locally.add(node.target)
-
-    def visit_FromImport(self, node):
-        self.generic_visit(node)
-        for name in node.names:
-            if isinstance(name, tuple):
-                self.identifiers.declared_locally.add(name[1])
-            else:
-                self.identifiers.declared_locally.add(name)
-
-    def visit_Assign(self, node):
-        """Visit assignments in the correct order."""
-        self.visit(node.node)
-        self.visit(node.target)
-
-    def visit_For(self, node):
-        """Visiting stops at for blocks.  However the block sequence
-        is visited as part of the outer scope.
-        """
-        self.visit(node.iter)
-
-    def visit_CallBlock(self, node):
-        self.visit(node.call)
-
-    def visit_FilterBlock(self, node):
-        self.visit(node.filter)
-
-    def visit_AssignBlock(self, node):
-        """Stop visiting at block assigns."""
-
-    def visit_Scope(self, node):
-        """Stop visiting at scopes."""
-
-    def visit_Block(self, node):
-        """Stop visiting at blocks."""
-
-
-class CompilerExit(Exception):
-    """Raised if the compiler encountered a situation where it just
-    doesn't make sense to further process the code.  Any block that
-    raises such an exception is not further processed.
-    """
-
-
-class CodeGenerator(NodeVisitor):
-
-    def __init__(self, environment, name, filename, stream=None,
-                 defer_init=False):
-        if stream is None:
-            stream = NativeStringIO()
-        self.environment = environment
-        self.name = name
-        self.filename = filename
-        self.stream = stream
-        self.created_block_context = False
-        self.defer_init = defer_init
-
-        # aliases for imports
-        self.import_aliases = {}
-
-        # a registry for all blocks.  Because blocks are moved out
-        # into the global python scope they are registered here
-        self.blocks = {}
-
-        # the number of extends statements so far
-        self.extends_so_far = 0
-
-        # some templates have a rootlevel extends.  In this case we
-        # can safely assume that we're a child template and do some
-        # more optimizations.
-        self.has_known_extends = False
-
-        # the current line number
-        self.code_lineno = 1
-
-        # registry of all filters and tests (global, not block local)
-        self.tests = {}
-        self.filters = {}
-
-        # the debug information
-        self.debug_info = []
-        self._write_debug_info = None
-
-        # the number of new lines before the next write()
-        self._new_lines = 0
-
-        # the line number of the last written statement
-        self._last_line = 0
-
-        # true if nothing was written so far.
-        self._first_write = True
-
-        # used by the `temporary_identifier` method to get new
-        # unique, temporary identifier
-        self._last_identifier = 0
-
-        # the current indentation
-        self._indentation = 0
-
-    # -- Various compilation helpers
-
-    def fail(self, msg, lineno):
-        """Fail with a :exc:`TemplateAssertionError`."""
-        raise TemplateAssertionError(msg, lineno, self.name, self.filename)
-
-    def temporary_identifier(self):
-        """Get a new unique identifier."""
-        self._last_identifier += 1
-        return 't_%d' % self._last_identifier
-
-    def buffer(self, frame):
-        """Enable buffering for the frame from that point onwards."""
-        frame.buffer = self.temporary_identifier()
-        self.writeline('%s = []' % frame.buffer)
-
-    def return_buffer_contents(self, frame):
-        """Return the buffer contents of the frame."""
-        if frame.eval_ctx.volatile:
-            self.writeline('if context.eval_ctx.autoescape:')
-            self.indent()
-            self.writeline('return Markup(concat(%s))' % frame.buffer)
-            self.outdent()
-            self.writeline('else:')
-            self.indent()
-            self.writeline('return concat(%s)' % frame.buffer)
-            self.outdent()
-        elif frame.eval_ctx.autoescape:
-            self.writeline('return Markup(concat(%s))' % frame.buffer)
-        else:
-            self.writeline('return concat(%s)' % frame.buffer)
-
-    def indent(self):
-        """Indent by one."""
-        self._indentation += 1
-
-    def outdent(self, step=1):
-        """Outdent by step."""
-        self._indentation -= step
-
-    def start_write(self, frame, node=None):
-        """Yield or write into the frame buffer."""
-        if frame.buffer is None:
-            self.writeline('yield ', node)
-        else:
-            self.writeline('%s.append(' % frame.buffer, node)
-
-    def end_write(self, frame):
-        """End the writing process started by `start_write`."""
-        if frame.buffer is not None:
-            self.write(')')
-
-    def simple_write(self, s, frame, node=None):
-        """Simple shortcut for start_write + write + end_write."""
-        self.start_write(frame, node)
-        self.write(s)
-        self.end_write(frame)
-
-    def blockvisit(self, nodes, frame):
-        """Visit a list of nodes as block in a frame.  If the current frame
-        is no buffer a dummy ``if 0: yield None`` is written automatically
-        unless the force_generator parameter is set to False.
-        """
-        if frame.buffer is None:
-            self.writeline('if 0: yield None')
-        else:
-            self.writeline('pass')
-        try:
-            for node in nodes:
-                self.visit(node, frame)
-        except CompilerExit:
-            pass
-
-    def write(self, x):
-        """Write a string into the output stream."""
-        if self._new_lines:
-            if not self._first_write:
-                self.stream.write('\n' * self._new_lines)
-                self.code_lineno += self._new_lines
-                if self._write_debug_info is not None:
-                    self.debug_info.append((self._write_debug_info,
-                                            self.code_lineno))
-                    self._write_debug_info = None
-            self._first_write = False
-            self.stream.write('    ' * self._indentation)
-            self._new_lines = 0
-        self.stream.write(x)
-
-    def writeline(self, x, node=None, extra=0):
-        """Combination of newline and write."""
-        self.newline(node, extra)
-        self.write(x)
-
-    def newline(self, node=None, extra=0):
-        """Add one or more newlines before the next write."""
-        self._new_lines = max(self._new_lines, 1 + extra)
-        if node is not None and node.lineno != self._last_line:
-            self._write_debug_info = node.lineno
-            self._last_line = node.lineno
-
-    def signature(self, node, frame, extra_kwargs=None):
-        """Writes a function call to the stream for the current node.
-        A leading comma is added automatically.  The extra keyword
-        arguments may not include python keywords otherwise a syntax
-        error could occour.  The extra keyword arguments should be given
-        as python dict.
-        """
-        # if any of the given keyword arguments is a python keyword
-        # we have to make sure that no invalid call is created.
-        kwarg_workaround = False
-        for kwarg in chain((x.key for x in node.kwargs), extra_kwargs or ()):
-            if is_python_keyword(kwarg):
-                kwarg_workaround = True
-                break
-
-        for arg in node.args:
-            self.write(', ')
-            self.visit(arg, frame)
-
-        if not kwarg_workaround:
-            for kwarg in node.kwargs:
-                self.write(', ')
-                self.visit(kwarg, frame)
-            if extra_kwargs is not None:
-                for key, value in iteritems(extra_kwargs):
-                    self.write(', %s=%s' % (key, value))
-        if node.dyn_args:
-            self.write(', *')
-            self.visit(node.dyn_args, frame)
-
-        if kwarg_workaround:
-            if node.dyn_kwargs is not None:
-                self.write(', **dict({')
-            else:
-                self.write(', **{')
-            for kwarg in node.kwargs:
-                self.write('%r: ' % kwarg.key)
-                self.visit(kwarg.value, frame)
-                self.write(', ')
-            if extra_kwargs is not None:
-                for key, value in iteritems(extra_kwargs):
-                    self.write('%r: %s, ' % (key, value))
-            if node.dyn_kwargs is not None:
-                self.write('}, **')
-                self.visit(node.dyn_kwargs, frame)
-                self.write(')')
-            else:
-                self.write('}')
-
-        elif node.dyn_kwargs is not None:
-            self.write(', **')
-            self.visit(node.dyn_kwargs, frame)
-
-    def pull_locals(self, frame):
-        """Pull all the references identifiers into the local scope."""
-        for name in frame.identifiers.undeclared:
-            self.writeline('l_%s = context.resolve(%r)' % (name, name))
-
-    def pull_dependencies(self, nodes):
-        """Pull all the dependencies."""
-        visitor = DependencyFinderVisitor()
-        for node in nodes:
-            visitor.visit(node)
-        for dependency in 'filters', 'tests':
-            mapping = getattr(self, dependency)
-            for name in getattr(visitor, dependency):
-                if name not in mapping:
-                    mapping[name] = self.temporary_identifier()
-                self.writeline('%s = environment.%s[%r]' %
-                               (mapping[name], dependency, name))
-
-    def unoptimize_scope(self, frame):
-        """Disable Python optimizations for the frame."""
-        # XXX: this is not that nice but it has no real overhead.  It
-        # mainly works because python finds the locals before dead code
-        # is removed.  If that breaks we have to add a dummy function
-        # that just accepts the arguments and does nothing.
-        if frame.identifiers.declared:
-            self.writeline('%sdummy(%s)' % (
-                unoptimize_before_dead_code and 'if 0: ' or '',
-                ', '.join('l_' + name for name in frame.identifiers.declared)
-            ))
-
-    def push_scope(self, frame, extra_vars=()):
-        """This function returns all the shadowed variables in a dict
-        in the form name: alias and will write the required assignments
-        into the current scope.  No indentation takes place.
-
-        This also predefines locally declared variables from the loop
-        body because under some circumstances it may be the case that
-
-        `extra_vars` is passed to `Frame.find_shadowed`.
-        """
-        aliases = {}
-        for name in frame.find_shadowed(extra_vars):
-            aliases[name] = ident = self.temporary_identifier()
-            self.writeline('%s = l_%s' % (ident, name))
-        to_declare = set()
-        for name in frame.identifiers.declared_locally:
-            if name not in aliases:
-                to_declare.add('l_' + name)
-        if to_declare:
-            self.writeline(' = '.join(to_declare) + ' = missing')
-        return aliases
-
-    def pop_scope(self, aliases, frame):
-        """Restore all aliases and delete unused variables."""
-        for name, alias in iteritems(aliases):
-            self.writeline('l_%s = %s' % (name, alias))
-        to_delete = set()
-        for name in frame.identifiers.declared_locally:
-            if name not in aliases:
-                to_delete.add('l_' + name)
-        if to_delete:
-            # we cannot use the del statement here because enclosed
-            # scopes can trigger a SyntaxError:
-            #   a = 42; b = lambda: a; del a
-            self.writeline(' = '.join(to_delete) + ' = missing')
-
-    def function_scoping(self, node, frame, children=None,
-                         find_special=True):
-        """In Jinja a few statements require the help of anonymous
-        functions.  Those are currently macros and call blocks and in
-        the future also recursive loops.  As there is currently
-        technical limitation that doesn't allow reading and writing a
-        variable in a scope where the initial value is coming from an
-        outer scope, this function tries to fall back with a common
-        error message.  Additionally the frame passed is modified so
-        that the argumetns are collected and callers are looked up.
-
-        This will return the modified frame.
-        """
-        # we have to iterate twice over it, make sure that works
-        if children is None:
-            children = node.iter_child_nodes()
-        children = list(children)
-        func_frame = frame.inner()
-        func_frame.inspect(children)
-
-        # variables that are undeclared (accessed before declaration) and
-        # declared locally *and* part of an outside scope raise a template
-        # assertion error. Reason: we can't generate reasonable code from
-        # it without aliasing all the variables.
-        # this could be fixed in Python 3 where we have the nonlocal
-        # keyword or if we switch to bytecode generation
-        overridden_closure_vars = (
-            func_frame.identifiers.undeclared &
-            func_frame.identifiers.declared &
-            (func_frame.identifiers.declared_locally |
-             func_frame.identifiers.declared_parameter)
-        )
-        if overridden_closure_vars:
-            self.fail('It\'s not possible to set and access variables '
-                      'derived from an outer scope! (affects: %s)' %
-                      ', '.join(sorted(overridden_closure_vars)), node.lineno)
-
-        # remove variables from a closure from the frame's undeclared
-        # identifiers.
-        func_frame.identifiers.undeclared -= (
-            func_frame.identifiers.undeclared &
-            func_frame.identifiers.declared
-        )
-
-        # no special variables for this scope, abort early
-        if not find_special:
-            return func_frame
-
-        func_frame.accesses_kwargs = False
-        func_frame.accesses_varargs = False
-        func_frame.accesses_caller = False
-        func_frame.arguments = args = ['l_' + x.name for x in node.args]
-
-        undeclared = find_undeclared(children, ('caller', 'kwargs', 'varargs'))
-
-        if 'caller' in undeclared:
-            func_frame.accesses_caller = True
-            func_frame.identifiers.add_special('caller')
-            args.append('l_caller')
-        if 'kwargs' in undeclared:
-            func_frame.accesses_kwargs = True
-            func_frame.identifiers.add_special('kwargs')
-            args.append('l_kwargs')
-        if 'varargs' in undeclared:
-            func_frame.accesses_varargs = True
-            func_frame.identifiers.add_special('varargs')
-            args.append('l_varargs')
-        return func_frame
-
-    def macro_body(self, node, frame, children=None):
-        """Dump the function def of a macro or call block."""
-        frame = self.function_scoping(node, frame, children)
-        # macros are delayed, they never require output checks
-        frame.require_output_check = False
-        args = frame.arguments
-        # XXX: this is an ugly fix for the loop nesting bug
-        # (tests.test_old_bugs.test_loop_call_bug).  This works around
-        # a identifier nesting problem we have in general.  It's just more
-        # likely to happen in loops which is why we work around it.  The
-        # real solution would be "nonlocal" all the identifiers that are
-        # leaking into a new python frame and might be used both unassigned
-        # and assigned.
-        if 'loop' in frame.identifiers.declared:
-            args = args + ['l_loop=l_loop']
-        self.writeline('def macro(%s):' % ', '.join(args), node)
-        self.indent()
-        self.buffer(frame)
-        self.pull_locals(frame)
-        self.blockvisit(node.body, frame)
-        self.return_buffer_contents(frame)
-        self.outdent()
-        return frame
-
-    def macro_def(self, node, frame):
-        """Dump the macro definition for the def created by macro_body."""
-        arg_tuple = ', '.join(repr(x.name) for x in node.args)
-        name = getattr(node, 'name', None)
-        if len(node.args) == 1:
-            arg_tuple += ','
-        self.write('Macro(environment, macro, %r, (%s), (' %
-                   (name, arg_tuple))
-        for arg in node.defaults:
-            self.visit(arg, frame)
-            self.write(', ')
-        self.write('), %r, %r, %r)' % (
-            bool(frame.accesses_kwargs),
-            bool(frame.accesses_varargs),
-            bool(frame.accesses_caller)
-        ))
-
-    def position(self, node):
-        """Return a human readable position for the node."""
-        rv = 'line %d' % node.lineno
-        if self.name is not None:
-            rv += ' in ' + repr(self.name)
-        return rv
-
-    # -- Statement Visitors
-
-    def visit_Template(self, node, frame=None):
-        assert frame is None, 'no root frame allowed'
-        eval_ctx = EvalContext(self.environment, self.name)
-
-        from jinja2.runtime import __all__ as exported
-        self.writeline('from __future__ import division')
-        self.writeline('from jinja2.runtime import ' + ', '.join(exported))
-        if not unoptimize_before_dead_code:
-            self.writeline('dummy = lambda *x: None')
-
-        # if we want a deferred initialization we cannot move the
-        # environment into a local name
-        envenv = not self.defer_init and ', environment=environment' or ''
-
-        # do we have an extends tag at all?  If not, we can save some
-        # overhead by just not processing any inheritance code.
-        have_extends = node.find(nodes.Extends) is not None
-
-        # find all blocks
-        for block in node.find_all(nodes.Block):
-            if block.name in self.blocks:
-                self.fail('block %r defined twice' % block.name, block.lineno)
-            self.blocks[block.name] = block
-
-        # find all imports and import them
-        for import_ in node.find_all(nodes.ImportedName):
-            if import_.importname not in self.import_aliases:
-                imp = import_.importname
-                self.import_aliases[imp] = alias = self.temporary_identifier()
-                if '.' in imp:
-                    module, obj = imp.rsplit('.', 1)
-                    self.writeline('from %s import %s as %s' %
-                                   (module, obj, alias))
-                else:
-                    self.writeline('import %s as %s' % (imp, alias))
-
-        # add the load name
-        self.writeline('name = %r' % self.name)
-
-        # generate the root render function.
-        self.writeline('def root(context%s):' % envenv, extra=1)
-
-        # process the root
-        frame = Frame(eval_ctx)
-        frame.inspect(node.body)
-        frame.toplevel = frame.rootlevel = True
-        frame.require_output_check = have_extends and not self.has_known_extends
-        self.indent()
-        if have_extends:
-            self.writeline('parent_template = None')
-        if 'self' in find_undeclared(node.body, ('self',)):
-            frame.identifiers.add_special('self')
-            self.writeline('l_self = TemplateReference(context)')
-        self.pull_locals(frame)
-        self.pull_dependencies(node.body)
-        self.blockvisit(node.body, frame)
-        self.outdent()
-
-        # make sure that the parent root is called.
-        if have_extends:
-            if not self.has_known_extends:
-                self.indent()
-                self.writeline('if parent_template is not None:')
-            self.indent()
-            self.writeline('for event in parent_template.'
-                           'root_render_func(context):')
-            self.indent()
-            self.writeline('yield event')
-            self.outdent(2 + (not self.has_known_extends))
-
-        # at this point we now have the blocks collected and can visit them too.
-        for name, block in iteritems(self.blocks):
-            block_frame = Frame(eval_ctx)
-            block_frame.inspect(block.body)
-            block_frame.block = name
-            self.writeline('def block_%s(context%s):' % (name, envenv),
-                           block, 1)
-            self.indent()
-            undeclared = find_undeclared(block.body, ('self', 'super'))
-            if 'self' in undeclared:
-                block_frame.identifiers.add_special('self')
-                self.writeline('l_self = TemplateReference(context)')
-            if 'super' in undeclared:
-                block_frame.identifiers.add_special('super')
-                self.writeline('l_super = context.super(%r, '
-                               'block_%s)' % (name, name))
-            self.pull_locals(block_frame)
-            self.pull_dependencies(block.body)
-            self.blockvisit(block.body, block_frame)
-            self.outdent()
-
-        self.writeline('blocks = {%s}' % ', '.join('%r: block_%s' % (x, x)
-                                                   for x in self.blocks),
-                       extra=1)
-
-        # add a function that returns the debug info
-        self.writeline('debug_info = %r' % '&'.join('%s=%s' % x for x
-                                                    in self.debug_info))
-
-    def visit_Block(self, node, frame):
-        """Call a block and register it for the template."""
-        level = 1
-        if frame.toplevel:
-            # if we know that we are a child template, there is no need to
-            # check if we are one
-            if self.has_known_extends:
-                return
-            if self.extends_so_far > 0:
-                self.writeline('if parent_template is None:')
-                self.indent()
-                level += 1
-        context = node.scoped and 'context.derived(locals())' or 'context'
-        self.writeline('for event in context.blocks[%r][0](%s):' % (
-                       node.name, context), node)
-        self.indent()
-        self.simple_write('event', frame)
-        self.outdent(level)
-
-    def visit_Extends(self, node, frame):
-        """Calls the extender."""
-        if not frame.toplevel:
-            self.fail('cannot use extend from a non top-level scope',
-                      node.lineno)
-
-        # if the number of extends statements in general is zero so
-        # far, we don't have to add a check if something extended
-        # the template before this one.
-        if self.extends_so_far > 0:
-
-            # if we have a known extends we just add a template runtime
-            # error into the generated code.  We could catch that at compile
-            # time too, but i welcome it not to confuse users by throwing the
-            # same error at different times just "because we can".
-            if not self.has_known_extends:
-                self.writeline('if parent_template is not None:')
-                self.indent()
-            self.writeline('raise TemplateRuntimeError(%r)' %
-                           'extended multiple times')
-
-            # if we have a known extends already we don't need that code here
-            # as we know that the template execution will end here.
-            if self.has_known_extends:
-                raise CompilerExit()
-            else:
-                self.outdent()
-
-        self.writeline('parent_template = environment.get_template(', node)
-        self.visit(node.template, frame)
-        self.write(', %r)' % self.name)
-        self.writeline('for name, parent_block in parent_template.'
-                       'blocks.%s():' % dict_item_iter)
-        self.indent()
-        self.writeline('context.blocks.setdefault(name, []).'
-                       'append(parent_block)')
-        self.outdent()
-
-        # if this extends statement was in the root level we can take
-        # advantage of that information and simplify the generated code
-        # in the top level from this point onwards
-        if frame.rootlevel:
-            self.has_known_extends = True
-
-        # and now we have one more
-        self.extends_so_far += 1
-
-    def visit_Include(self, node, frame):
-        """Handles includes."""
-        if node.with_context:
-            self.unoptimize_scope(frame)
-        if node.ignore_missing:
-            self.writeline('try:')
-            self.indent()
-
-        func_name = 'get_or_select_template'
-        if isinstance(node.template, nodes.Const):
-            if isinstance(node.template.value, string_types):
-                func_name = 'get_template'
-            elif isinstance(node.template.value, (tuple, list)):
-                func_name = 'select_template'
-        elif isinstance(node.template, (nodes.Tuple, nodes.List)):
-            func_name = 'select_template'
-
-        self.writeline('template = environment.%s(' % func_name, node)
-        self.visit(node.template, frame)
-        self.write(', %r)' % self.name)
-        if node.ignore_missing:
-            self.outdent()
-            self.writeline('except TemplateNotFound:')
-            self.indent()
-            self.writeline('pass')
-            self.outdent()
-            self.writeline('else:')
-            self.indent()
-
-        if node.with_context:
-            self.writeline('for event in template.root_render_func('
-                           'template.new_context(context.parent, True, '
-                           'locals())):')
-        else:
-            self.writeline('for event in template.module._body_stream:')
-
-        self.indent()
-        self.simple_write('event', frame)
-        self.outdent()
-
-        if node.ignore_missing:
-            self.outdent()
-
-    def visit_Import(self, node, frame):
-        """Visit regular imports."""
-        if node.with_context:
-            self.unoptimize_scope(frame)
-        self.writeline('l_%s = ' % node.target, node)
-        if frame.toplevel:
-            self.write('context.vars[%r] = ' % node.target)
-        self.write('environment.get_template(')
-        self.visit(node.template, frame)
-        self.write(', %r).' % self.name)
-        if node.with_context:
-            self.write('make_module(context.parent, True, locals())')
-        else:
-            self.write('module')
-        if frame.toplevel and not node.target.startswith('_'):
-            self.writeline('context.exported_vars.discard(%r)' % node.target)
-        frame.assigned_names.add(node.target)
-
-    def visit_FromImport(self, node, frame):
-        """Visit named imports."""
-        self.newline(node)
-        self.write('included_template = environment.get_template(')
-        self.visit(node.template, frame)
-        self.write(', %r).' % self.name)
-        if node.with_context:
-            self.write('make_module(context.parent, True)')
-        else:
-            self.write('module')
-
-        var_names = []
-        discarded_names = []
-        for name in node.names:
-            if isinstance(name, tuple):
-                name, alias = name
-            else:
-                alias = name
-            self.writeline('l_%s = getattr(included_template, '
-                           '%r, missing)' % (alias, name))
-            self.writeline('if l_%s is missing:' % alias)
-            self.indent()
-            self.writeline('l_%s = environment.undefined(%r %% '
-                           'included_template.__name__, '
-                           'name=%r)' %
-                           (alias, 'the template %%r (imported on %s) does '
-                           'not export the requested name %s' % (
-                                self.position(node),
-                                repr(name)
-                           ), name))
-            self.outdent()
-            if frame.toplevel:
-                var_names.append(alias)
-                if not alias.startswith('_'):
-                    discarded_names.append(alias)
-            frame.assigned_names.add(alias)
-
-        if var_names:
-            if len(var_names) == 1:
-                name = var_names[0]
-                self.writeline('context.vars[%r] = l_%s' % (name, name))
-            else:
-                self.writeline('context.vars.update({%s})' % ', '.join(
-                    '%r: l_%s' % (name, name) for name in var_names
-                ))
-        if discarded_names:
-            if len(discarded_names) == 1:
-                self.writeline('context.exported_vars.discard(%r)' %
-                               discarded_names[0])
-            else:
-                self.writeline('context.exported_vars.difference_'
-                               'update((%s))' % ', '.join(imap(repr, discarded_names)))
-
-    def visit_For(self, node, frame):
-        # when calculating the nodes for the inner frame we have to exclude
-        # the iterator contents from it
-        children = node.iter_child_nodes(exclude=('iter',))
-        if node.recursive:
-            loop_frame = self.function_scoping(node, frame, children,
-                                               find_special=False)
-        else:
-            loop_frame = frame.inner()
-            loop_frame.inspect(children)
-
-        # try to figure out if we have an extended loop.  An extended loop
-        # is necessary if the loop is in recursive mode if the special loop
-        # variable is accessed in the body.
-        extended_loop = node.recursive or 'loop' in \
-                        find_undeclared(node.iter_child_nodes(
-                            only=('body',)), ('loop',))
-
-        # if we don't have an recursive loop we have to find the shadowed
-        # variables at that point.  Because loops can be nested but the loop
-        # variable is a special one we have to enforce aliasing for it.
-        if not node.recursive:
-            aliases = self.push_scope(loop_frame, ('loop',))
-
-        # otherwise we set up a buffer and add a function def
-        else:
-            self.writeline('def loop(reciter, loop_render_func, depth=0):', node)
-            self.indent()
-            self.buffer(loop_frame)
-            aliases = {}
-
-        # make sure the loop variable is a special one and raise a template
-        # assertion error if a loop tries to write to loop
-        if extended_loop:
-            self.writeline('l_loop = missing')
-            loop_frame.identifiers.add_special('loop')
-        for name in node.find_all(nodes.Name):
-            if name.ctx == 'store' and name.name == 'loop':
-                self.fail('Can\'t assign to special loop variable '
-                          'in for-loop target', name.lineno)
-
-        self.pull_locals(loop_frame)
-        if node.else_:
-            iteration_indicator = self.temporary_identifier()
-            self.writeline('%s = 1' % iteration_indicator)
-
-        # Create a fake parent loop if the else or test section of a
-        # loop is accessing the special loop variable and no parent loop
-        # exists.
-        if 'loop' not in aliases and 'loop' in find_undeclared(
-           node.iter_child_nodes(only=('else_', 'test')), ('loop',)):
-            self.writeline("l_loop = environment.undefined(%r, name='loop')" %
-                ("'loop' is undefined. the filter section of a loop as well "
-                 "as the else block don't have access to the special 'loop'"
-                 " variable of the current loop.  Because there is no parent "
-                 "loop it's undefined.  Happened in loop on %s" %
-                 self.position(node)))
-
-        self.writeline('for ', node)
-        self.visit(node.target, loop_frame)
-        self.write(extended_loop and ', l_loop in LoopContext(' or ' in ')
-
-        # if we have an extened loop and a node test, we filter in the
-        # "outer frame".
-        if extended_loop and node.test is not None:
-            self.write('(')
-            self.visit(node.target, loop_frame)
-            self.write(' for ')
-            self.visit(node.target, loop_frame)
-            self.write(' in ')
-            if node.recursive:
-                self.write('reciter')
-            else:
-                self.visit(node.iter, loop_frame)
-            self.write(' if (')
-            test_frame = loop_frame.copy()
-            self.visit(node.test, test_frame)
-            self.write('))')
-
-        elif node.recursive:
-            self.write('reciter')
-        else:
-            self.visit(node.iter, loop_frame)
-
-        if node.recursive:
-            self.write(', loop_render_func, depth):')
-        else:
-            self.write(extended_loop and '):' or ':')
-
-        # tests in not extended loops become a continue
-        if not extended_loop and node.test is not None:
-            self.indent()
-            self.writeline('if not ')
-            self.visit(node.test, loop_frame)
-            self.write(':')
-            self.indent()
-            self.writeline('continue')
-            self.outdent(2)
-
-        self.indent()
-        self.blockvisit(node.body, loop_frame)
-        if node.else_:
-            self.writeline('%s = 0' % iteration_indicator)
-        self.outdent()
-
-        if node.else_:
-            self.writeline('if %s:' % iteration_indicator)
-            self.indent()
-            self.blockvisit(node.else_, loop_frame)
-            self.outdent()
-
-        # reset the aliases if there are any.
-        if not node.recursive:
-            self.pop_scope(aliases, loop_frame)
-
-        # if the node was recursive we have to return the buffer contents
-        # and start the iteration code
-        if node.recursive:
-            self.return_buffer_contents(loop_frame)
-            self.outdent()
-            self.start_write(frame, node)
-            self.write('loop(')
-            self.visit(node.iter, frame)
-            self.write(', loop)')
-            self.end_write(frame)
-
-    def visit_If(self, node, frame):
-        if_frame = frame.soft()
-        self.writeline('if ', node)
-        self.visit(node.test, if_frame)
-        self.write(':')
-        self.indent()
-        self.blockvisit(node.body, if_frame)
-        self.outdent()
-        if node.else_:
-            self.writeline('else:')
-            self.indent()
-            self.blockvisit(node.else_, if_frame)
-            self.outdent()
-
-    def visit_Macro(self, node, frame):
-        macro_frame = self.macro_body(node, frame)
-        self.newline()
-        if frame.toplevel:
-            if not node.name.startswith('_'):
-                self.write('context.exported_vars.add(%r)' % node.name)
-            self.writeline('context.vars[%r] = ' % node.name)
-        self.write('l_%s = ' % node.name)
-        self.macro_def(node, macro_frame)
-        frame.assigned_names.add(node.name)
-
-    def visit_CallBlock(self, node, frame):
-        children = node.iter_child_nodes(exclude=('call',))
-        call_frame = self.macro_body(node, frame, children)
-        self.writeline('caller = ')
-        self.macro_def(node, call_frame)
-        self.start_write(frame, node)
-        self.visit_Call(node.call, call_frame, forward_caller=True)
-        self.end_write(frame)
-
-    def visit_FilterBlock(self, node, frame):
-        filter_frame = frame.inner()
-        filter_frame.inspect(node.iter_child_nodes())
-        aliases = self.push_scope(filter_frame)
-        self.pull_locals(filter_frame)
-        self.buffer(filter_frame)
-        self.blockvisit(node.body, filter_frame)
-        self.start_write(frame, node)
-        self.visit_Filter(node.filter, filter_frame)
-        self.end_write(frame)
-        self.pop_scope(aliases, filter_frame)
-
-    def visit_ExprStmt(self, node, frame):
-        self.newline(node)
-        self.visit(node.node, frame)
-
-    def visit_Output(self, node, frame):
-        # if we have a known extends statement, we don't output anything
-        # if we are in a require_output_check section
-        if self.has_known_extends and frame.require_output_check:
-            return
-
-        allow_constant_finalize = True
-        if self.environment.finalize:
-            func = self.environment.finalize
-            if getattr(func, 'contextfunction', False) or \
-               getattr(func, 'evalcontextfunction', False):
-                allow_constant_finalize = False
-            elif getattr(func, 'environmentfunction', False):
-                finalize = lambda x: text_type(
-                    self.environment.finalize(self.environment, x))
-            else:
-                finalize = lambda x: text_type(self.environment.finalize(x))
-        else:
-            finalize = text_type
-
-        # if we are inside a frame that requires output checking, we do so
-        outdent_later = False
-        if frame.require_output_check:
-            self.writeline('if parent_template is None:')
-            self.indent()
-            outdent_later = True
-
-        # try to evaluate as many chunks as possible into a static
-        # string at compile time.
-        body = []
-        for child in node.nodes:
-            try:
-                if not allow_constant_finalize:
-                    raise nodes.Impossible()
-                const = child.as_const(frame.eval_ctx)
-            except nodes.Impossible:
-                body.append(child)
-                continue
-            # the frame can't be volatile here, becaus otherwise the
-            # as_const() function would raise an Impossible exception
-            # at that point.
-            try:
-                if frame.eval_ctx.autoescape:
-                    if hasattr(const, '__html__'):
-                        const = const.__html__()
-                    else:
-                        const = escape(const)
-                const = finalize(const)
-            except Exception:
-                # if something goes wrong here we evaluate the node
-                # at runtime for easier debugging
-                body.append(child)
-                continue
-            if body and isinstance(body[-1], list):
-                body[-1].append(const)
-            else:
-                body.append([const])
-
-        # if we have less than 3 nodes or a buffer we yield or extend/append
-        if len(body) < 3 or frame.buffer is not None:
-            if frame.buffer is not None:
-                # for one item we append, for more we extend
-                if len(body) == 1:
-                    self.writeline('%s.append(' % frame.buffer)
-                else:
-                    self.writeline('%s.extend((' % frame.buffer)
-                self.indent()
-            for item in body:
-                if isinstance(item, list):
-                    val = repr(concat(item))
-                    if frame.buffer is None:
-                        self.writeline('yield ' + val)
-                    else:
-                        self.writeline(val + ', ')
-                else:
-                    if frame.buffer is None:
-                        self.writeline('yield ', item)
-                    else:
-                        self.newline(item)
-                    close = 1
-                    if frame.eval_ctx.volatile:
-                        self.write('(context.eval_ctx.autoescape and'
-                                   ' escape or to_string)(')
-                    elif frame.eval_ctx.autoescape:
-                        self.write('escape(')
-                    else:
-                        self.write('to_string(')
-                    if self.environment.finalize is not None:
-                        self.write('environment.finalize(')
-                        if getattr(self.environment.finalize,
-                                   "contextfunction", False):
-                            self.write('context, ')
-                        close += 1
-                    self.visit(item, frame)
-                    self.write(')' * close)
-                    if frame.buffer is not None:
-                        self.write(', ')
-            if frame.buffer is not None:
-                # close the open parentheses
-                self.outdent()
-                self.writeline(len(body) == 1 and ')' or '))')
-
-        # otherwise we create a format string as this is faster in that case
-        else:
-            format = []
-            arguments = []
-            for item in body:
-                if isinstance(item, list):
-                    format.append(concat(item).replace('%', '%%'))
-                else:
-                    format.append('%s')
-                    arguments.append(item)
-            self.writeline('yield ')
-            self.write(repr(concat(format)) + ' % (')
-            self.indent()
-            for argument in arguments:
-                self.newline(argument)
-                close = 0
-                if frame.eval_ctx.volatile:
-                    self.write('(context.eval_ctx.autoescape and'
-                               ' escape or to_string)(')
-                    close += 1
-                elif frame.eval_ctx.autoescape:
-                    self.write('escape(')
-                    close += 1
-                if self.environment.finalize is not None:
-                    self.write('environment.finalize(')
-                    if getattr(self.environment.finalize,
-                               'contextfunction', False):
-                        self.write('context, ')
-                    elif getattr(self.environment.finalize,
-                               'evalcontextfunction', False):
-                        self.write('context.eval_ctx, ')
-                    elif getattr(self.environment.finalize,
-                               'environmentfunction', False):
-                        self.write('environment, ')
-                    close += 1
-                self.visit(argument, frame)
-                self.write(')' * close + ', ')
-            self.outdent()
-            self.writeline(')')
-
-        if outdent_later:
-            self.outdent()
-
-    def make_assignment_frame(self, frame):
-        # toplevel assignments however go into the local namespace and
-        # the current template's context.  We create a copy of the frame
-        # here and add a set so that the Name visitor can add the assigned
-        # names here.
-        if not frame.toplevel:
-            return frame
-        assignment_frame = frame.copy()
-        assignment_frame.toplevel_assignments = set()
-        return assignment_frame
-
-    def export_assigned_vars(self, frame, assignment_frame):
-        if not frame.toplevel:
-            return
-        public_names = [x for x in assignment_frame.toplevel_assignments
-                        if not x.startswith('_')]
-        if len(assignment_frame.toplevel_assignments) == 1:
-            name = next(iter(assignment_frame.toplevel_assignments))
-            self.writeline('context.vars[%r] = l_%s' % (name, name))
-        else:
-            self.writeline('context.vars.update({')
-            for idx, name in enumerate(assignment_frame.toplevel_assignments):
-                if idx:
-                    self.write(', ')
-                self.write('%r: l_%s' % (name, name))
-            self.write('})')
-        if public_names:
-            if len(public_names) == 1:
-                self.writeline('context.exported_vars.add(%r)' %
-                               public_names[0])
-            else:
-                self.writeline('context.exported_vars.update((%s))' %
-                               ', '.join(imap(repr, public_names)))
-
-    def visit_Assign(self, node, frame):
-        self.newline(node)
-        assignment_frame = self.make_assignment_frame(frame)
-        self.visit(node.target, assignment_frame)
-        self.write(' = ')
-        self.visit(node.node, frame)
-        self.export_assigned_vars(frame, assignment_frame)
-
-    def visit_AssignBlock(self, node, frame):
-        block_frame = frame.inner()
-        block_frame.inspect(node.body)
-        aliases = self.push_scope(block_frame)
-        self.pull_locals(block_frame)
-        self.buffer(block_frame)
-        self.blockvisit(node.body, block_frame)
-        self.pop_scope(aliases, block_frame)
-
-        assignment_frame = self.make_assignment_frame(frame)
-        self.newline(node)
-        self.visit(node.target, assignment_frame)
-        self.write(' = concat(%s)' % block_frame.buffer)
-        self.export_assigned_vars(frame, assignment_frame)
-
-    # -- Expression Visitors
-
-    def visit_Name(self, node, frame):
-        if node.ctx == 'store' and frame.toplevel:
-            frame.toplevel_assignments.add(node.name)
-        self.write('l_' + node.name)
-        frame.assigned_names.add(node.name)
-
-    def visit_Const(self, node, frame):
-        val = node.value
-        if isinstance(val, float):
-            self.write(str(val))
-        else:
-            self.write(repr(val))
-
-    def visit_TemplateData(self, node, frame):
-        try:
-            self.write(repr(node.as_const(frame.eval_ctx)))
-        except nodes.Impossible:
-            self.write('(context.eval_ctx.autoescape and Markup or identity)(%r)'
-                       % node.data)
-
-    def visit_Tuple(self, node, frame):
-        self.write('(')
-        idx = -1
-        for idx, item in enumerate(node.items):
-            if idx:
-                self.write(', ')
-            self.visit(item, frame)
-        self.write(idx == 0 and ',)' or ')')
-
-    def visit_List(self, node, frame):
-        self.write('[')
-        for idx, item in enumerate(node.items):
-            if idx:
-                self.write(', ')
-            self.visit(item, frame)
-        self.write(']')
-
-    def visit_Dict(self, node, frame):
-        self.write('{')
-        for idx, item in enumerate(node.items):
-            if idx:
-                self.write(', ')
-            self.visit(item.key, frame)
-            self.write(': ')
-            self.visit(item.value, frame)
-        self.write('}')
-
-    def binop(operator, interceptable=True):
-        def visitor(self, node, frame):
-            if self.environment.sandboxed and \
-               operator in self.environment.intercepted_binops:
-                self.write('environment.call_binop(context, %r, ' % operator)
-                self.visit(node.left, frame)
-                self.write(', ')
-                self.visit(node.right, frame)
-            else:
-                self.write('(')
-                self.visit(node.left, frame)
-                self.write(' %s ' % operator)
-                self.visit(node.right, frame)
-            self.write(')')
-        return visitor
-
-    def uaop(operator, interceptable=True):
-        def visitor(self, node, frame):
-            if self.environment.sandboxed and \
-               operator in self.environment.intercepted_unops:
-                self.write('environment.call_unop(context, %r, ' % operator)
-                self.visit(node.node, frame)
-            else:
-                self.write('(' + operator)
-                self.visit(node.node, frame)
-            self.write(')')
-        return visitor
-
-    visit_Add = binop('+')
-    visit_Sub = binop('-')
-    visit_Mul = binop('*')
-    visit_Div = binop('/')
-    visit_FloorDiv = binop('//')
-    visit_Pow = binop('**')
-    visit_Mod = binop('%')
-    visit_And = binop('and', interceptable=False)
-    visit_Or = binop('or', interceptable=False)
-    visit_Pos = uaop('+')
-    visit_Neg = uaop('-')
-    visit_Not = uaop('not ', interceptable=False)
-    del binop, uaop
-
-    def visit_Concat(self, node, frame):
-        if frame.eval_ctx.volatile:
-            func_name = '(context.eval_ctx.volatile and' \
-                        ' markup_join or unicode_join)'
-        elif frame.eval_ctx.autoescape:
-            func_name = 'markup_join'
-        else:
-            func_name = 'unicode_join'
-        self.write('%s((' % func_name)
-        for arg in node.nodes:
-            self.visit(arg, frame)
-            self.write(', ')
-        self.write('))')
-
-    def visit_Compare(self, node, frame):
-        self.visit(node.expr, frame)
-        for op in node.ops:
-            self.visit(op, frame)
-
-    def visit_Operand(self, node, frame):
-        self.write(' %s ' % operators[node.op])
-        self.visit(node.expr, frame)
-
-    def visit_Getattr(self, node, frame):
-        self.write('environment.getattr(')
-        self.visit(node.node, frame)
-        self.write(', %r)' % node.attr)
-
-    def visit_Getitem(self, node, frame):
-        # slices bypass the environment getitem method.
-        if isinstance(node.arg, nodes.Slice):
-            self.visit(node.node, frame)
-            self.write('[')
-            self.visit(node.arg, frame)
-            self.write(']')
-        else:
-            self.write('environment.getitem(')
-            self.visit(node.node, frame)
-            self.write(', ')
-            self.visit(node.arg, frame)
-            self.write(')')
-
-    def visit_Slice(self, node, frame):
-        if node.start is not None:
-            self.visit(node.start, frame)
-        self.write(':')
-        if node.stop is not None:
-            self.visit(node.stop, frame)
-        if node.step is not None:
-            self.write(':')
-            self.visit(node.step, frame)
-
-    def visit_Filter(self, node, frame):
-        self.write(self.filters[node.name] + '(')
-        func = self.environment.filters.get(node.name)
-        if func is None:
-            self.fail('no filter named %r' % node.name, node.lineno)
-        if getattr(func, 'contextfilter', False):
-            self.write('context, ')
-        elif getattr(func, 'evalcontextfilter', False):
-            self.write('context.eval_ctx, ')
-        elif getattr(func, 'environmentfilter', False):
-            self.write('environment, ')
-
-        # if the filter node is None we are inside a filter block
-        # and want to write to the current buffer
-        if node.node is not None:
-            self.visit(node.node, frame)
-        elif frame.eval_ctx.volatile:
-            self.write('(context.eval_ctx.autoescape and'
-                       ' Markup(concat(%s)) or concat(%s))' %
-                       (frame.buffer, frame.buffer))
-        elif frame.eval_ctx.autoescape:
-            self.write('Markup(concat(%s))' % frame.buffer)
-        else:
-            self.write('concat(%s)' % frame.buffer)
-        self.signature(node, frame)
-        self.write(')')
-
-    def visit_Test(self, node, frame):
-        self.write(self.tests[node.name] + '(')
-        if node.name not in self.environment.tests:
-            self.fail('no test named %r' % node.name, node.lineno)
-        self.visit(node.node, frame)
-        self.signature(node, frame)
-        self.write(')')
-
-    def visit_CondExpr(self, node, frame):
-        def write_expr2():
-            if node.expr2 is not None:
-                return self.visit(node.expr2, frame)
-            self.write('environment.undefined(%r)' % ('the inline if-'
-                       'expression on %s evaluated to false and '
-                       'no else section was defined.' % self.position(node)))
-
-        self.write('(')
-        self.visit(node.expr1, frame)
-        self.write(' if ')
-        self.visit(node.test, frame)
-        self.write(' else ')
-        write_expr2()
-        self.write(')')
-
-    def visit_Call(self, node, frame, forward_caller=False):
-        if self.environment.sandboxed:
-            self.write('environment.call(context, ')
-        else:
-            self.write('context.call(')
-        self.visit(node.node, frame)
-        extra_kwargs = forward_caller and {'caller': 'caller'} or None
-        self.signature(node, frame, extra_kwargs)
-        self.write(')')
-
-    def visit_Keyword(self, node, frame):
-        self.write(node.key + '=')
-        self.visit(node.value, frame)
-
-    # -- Unused nodes for extensions
-
-    def visit_MarkSafe(self, node, frame):
-        self.write('Markup(')
-        self.visit(node.expr, frame)
-        self.write(')')
-
-    def visit_MarkSafeIfAutoescape(self, node, frame):
-        self.write('(context.eval_ctx.autoescape and Markup or identity)(')
-        self.visit(node.expr, frame)
-        self.write(')')
-
-    def visit_EnvironmentAttribute(self, node, frame):
-        self.write('environment.' + node.name)
-
-    def visit_ExtensionAttribute(self, node, frame):
-        self.write('environment.extensions[%r].%s' % (node.identifier, node.name))
-
-    def visit_ImportedName(self, node, frame):
-        self.write(self.import_aliases[node.importname])
-
-    def visit_InternalName(self, node, frame):
-        self.write(node.name)
-
-    def visit_ContextReference(self, node, frame):
-        self.write('context')
-
-    def visit_Continue(self, node, frame):
-        self.writeline('continue', node)
-
-    def visit_Break(self, node, frame):
-        self.writeline('break', node)
-
-    def visit_Scope(self, node, frame):
-        scope_frame = frame.inner()
-        scope_frame.inspect(node.iter_child_nodes())
-        aliases = self.push_scope(scope_frame)
-        self.pull_locals(scope_frame)
-        self.blockvisit(node.body, scope_frame)
-        self.pop_scope(aliases, scope_frame)
-
-    def visit_EvalContextModifier(self, node, frame):
-        for keyword in node.options:
-            self.writeline('context.eval_ctx.%s = ' % keyword.key)
-            self.visit(keyword.value, frame)
-            try:
-                val = keyword.value.as_const(frame.eval_ctx)
-            except nodes.Impossible:
-                frame.eval_ctx.volatile = True
-            else:
-                setattr(frame.eval_ctx, keyword.key, val)
-
-    def visit_ScopedEvalContextModifier(self, node, frame):
-        old_ctx_name = self.temporary_identifier()
-        safed_ctx = frame.eval_ctx.save()
-        self.writeline('%s = context.eval_ctx.save()' % old_ctx_name)
-        self.visit_EvalContextModifier(node, frame)
-        for child in node.body:
-            self.visit(child, frame)
-        frame.eval_ctx.revert(safed_ctx)
-        self.writeline('context.eval_ctx.revert(%s)' % old_ctx_name)
diff --git a/third_party/jinja2/constants.py b/third_party/jinja2/constants.py
deleted file mode 100644
index cab203c..0000000
--- a/third_party/jinja2/constants.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja.constants
-    ~~~~~~~~~~~~~~~
-
-    Various constants.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-
-
-#: list of lorem ipsum words used by the lipsum() helper function
-LOREM_IPSUM_WORDS = u'''\
-a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at
-auctor augue bibendum blandit class commodo condimentum congue consectetuer
-consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus
-diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend
-elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames
-faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac
-hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum
-justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem
-luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie
-mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non
-nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque
-penatibus per pharetra phasellus placerat platea porta porttitor posuere
-potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus
-ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit
-sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor
-tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices
-ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus
-viverra volutpat vulputate'''
diff --git a/third_party/jinja2/debug.py b/third_party/jinja2/debug.py
deleted file mode 100644
index 3252748..0000000
--- a/third_party/jinja2/debug.py
+++ /dev/null
@@ -1,350 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.debug
-    ~~~~~~~~~~~~
-
-    Implements the debug interface for Jinja.  This module does some pretty
-    ugly stuff with the Python traceback system in order to achieve tracebacks
-    with correct line numbers, locals and contents.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import sys
-import traceback
-from types import TracebackType, CodeType
-from jinja2.utils import missing, internal_code
-from jinja2.exceptions import TemplateSyntaxError
-from jinja2._compat import iteritems, reraise, PY2
-
-# on pypy we can take advantage of transparent proxies
-try:
-    from __pypy__ import tproxy
-except ImportError:
-    tproxy = None
-
-
-# how does the raise helper look like?
-try:
-    exec("raise TypeError, 'foo'")
-except SyntaxError:
-    raise_helper = 'raise __jinja_exception__[1]'
-except TypeError:
-    raise_helper = 'raise __jinja_exception__[0], __jinja_exception__[1]'
-
-
-class TracebackFrameProxy(object):
-    """Proxies a traceback frame."""
-
-    def __init__(self, tb):
-        self.tb = tb
-        self._tb_next = None
-
-    @property
-    def tb_next(self):
-        return self._tb_next
-
-    def set_next(self, next):
-        if tb_set_next is not None:
-            try:
-                tb_set_next(self.tb, next and next.tb or None)
-            except Exception:
-                # this function can fail due to all the hackery it does
-                # on various python implementations.  We just catch errors
-                # down and ignore them if necessary.
-                pass
-        self._tb_next = next
-
-    @property
-    def is_jinja_frame(self):
-        return '__jinja_template__' in self.tb.tb_frame.f_globals
-
-    def __getattr__(self, name):
-        return getattr(self.tb, name)
-
-
-def make_frame_proxy(frame):
-    proxy = TracebackFrameProxy(frame)
-    if tproxy is None:
-        return proxy
-    def operation_handler(operation, *args, **kwargs):
-        if operation in ('__getattribute__', '__getattr__'):
-            return getattr(proxy, args[0])
-        elif operation == '__setattr__':
-            proxy.__setattr__(*args, **kwargs)
-        else:
-            return getattr(proxy, operation)(*args, **kwargs)
-    return tproxy(TracebackType, operation_handler)
-
-
-class ProcessedTraceback(object):
-    """Holds a Jinja preprocessed traceback for printing or reraising."""
-
-    def __init__(self, exc_type, exc_value, frames):
-        assert frames, 'no frames for this traceback?'
-        self.exc_type = exc_type
-        self.exc_value = exc_value
-        self.frames = frames
-
-        # newly concatenate the frames (which are proxies)
-        prev_tb = None
-        for tb in self.frames:
-            if prev_tb is not None:
-                prev_tb.set_next(tb)
-            prev_tb = tb
-        prev_tb.set_next(None)
-
-    def render_as_text(self, limit=None):
-        """Return a string with the traceback."""
-        lines = traceback.format_exception(self.exc_type, self.exc_value,
-                                           self.frames[0], limit=limit)
-        return ''.join(lines).rstrip()
-
-    def render_as_html(self, full=False):
-        """Return a unicode string with the traceback as rendered HTML."""
-        from jinja2.debugrenderer import render_traceback
-        return u'%s\n\n<!--\n%s\n-->' % (
-            render_traceback(self, full=full),
-            self.render_as_text().decode('utf-8', 'replace')
-        )
-
-    @property
-    def is_template_syntax_error(self):
-        """`True` if this is a template syntax error."""
-        return isinstance(self.exc_value, TemplateSyntaxError)
-
-    @property
-    def exc_info(self):
-        """Exception info tuple with a proxy around the frame objects."""
-        return self.exc_type, self.exc_value, self.frames[0]
-
-    @property
-    def standard_exc_info(self):
-        """Standard python exc_info for re-raising"""
-        tb = self.frames[0]
-        # the frame will be an actual traceback (or transparent proxy) if
-        # we are on pypy or a python implementation with support for tproxy
-        if type(tb) is not TracebackType:
-            tb = tb.tb
-        return self.exc_type, self.exc_value, tb
-
-
-def make_traceback(exc_info, source_hint=None):
-    """Creates a processed traceback object from the exc_info."""
-    exc_type, exc_value, tb = exc_info
-    if isinstance(exc_value, TemplateSyntaxError):
-        exc_info = translate_syntax_error(exc_value, source_hint)
-        initial_skip = 0
-    else:
-        initial_skip = 1
-    return translate_exception(exc_info, initial_skip)
-
-
-def translate_syntax_error(error, source=None):
-    """Rewrites a syntax error to please traceback systems."""
-    error.source = source
-    error.translated = True
-    exc_info = (error.__class__, error, None)
-    filename = error.filename
-    if filename is None:
-        filename = '<unknown>'
-    return fake_exc_info(exc_info, filename, error.lineno)
-
-
-def translate_exception(exc_info, initial_skip=0):
-    """If passed an exc_info it will automatically rewrite the exceptions
-    all the way down to the correct line numbers and frames.
-    """
-    tb = exc_info[2]
-    frames = []
-
-    # skip some internal frames if wanted
-    for x in range(initial_skip):
-        if tb is not None:
-            tb = tb.tb_next
-    initial_tb = tb
-
-    while tb is not None:
-        # skip frames decorated with @internalcode.  These are internal
-        # calls we can't avoid and that are useless in template debugging
-        # output.
-        if tb.tb_frame.f_code in internal_code:
-            tb = tb.tb_next
-            continue
-
-        # save a reference to the next frame if we override the current
-        # one with a faked one.
-        next = tb.tb_next
-
-        # fake template exceptions
-        template = tb.tb_frame.f_globals.get('__jinja_template__')
-        if template is not None:
-            lineno = template.get_corresponding_lineno(tb.tb_lineno)
-            tb = fake_exc_info(exc_info[:2] + (tb,), template.filename,
-                               lineno)[2]
-
-        frames.append(make_frame_proxy(tb))
-        tb = next
-
-    # if we don't have any exceptions in the frames left, we have to
-    # reraise it unchanged.
-    # XXX: can we backup here?  when could this happen?
-    if not frames:
-        reraise(exc_info[0], exc_info[1], exc_info[2])
-
-    return ProcessedTraceback(exc_info[0], exc_info[1], frames)
-
-
-def fake_exc_info(exc_info, filename, lineno):
-    """Helper for `translate_exception`."""
-    exc_type, exc_value, tb = exc_info
-
-    # figure the real context out
-    if tb is not None:
-        real_locals = tb.tb_frame.f_locals.copy()
-        ctx = real_locals.get('context')
-        if ctx:
-            locals = ctx.get_all()
-        else:
-            locals = {}
-        for name, value in iteritems(real_locals):
-            if name.startswith('l_') and value is not missing:
-                locals[name[2:]] = value
-
-        # if there is a local called __jinja_exception__, we get
-        # rid of it to not break the debug functionality.
-        locals.pop('__jinja_exception__', None)
-    else:
-        locals = {}
-
-    # assamble fake globals we need
-    globals = {
-        '__name__':             filename,
-        '__file__':             filename,
-        '__jinja_exception__':  exc_info[:2],
-
-        # we don't want to keep the reference to the template around
-        # to not cause circular dependencies, but we mark it as Jinja
-        # frame for the ProcessedTraceback
-        '__jinja_template__':   None
-    }
-
-    # and fake the exception
-    code = compile('\n' * (lineno - 1) + raise_helper, filename, 'exec')
-
-    # if it's possible, change the name of the code.  This won't work
-    # on some python environments such as google appengine
-    try:
-        if tb is None:
-            location = 'template'
-        else:
-            function = tb.tb_frame.f_code.co_name
-            if function == 'root':
-                location = 'top-level template code'
-            elif function.startswith('block_'):
-                location = 'block "%s"' % function[6:]
-            else:
-                location = 'template'
-
-        if PY2:
-            code = CodeType(0, code.co_nlocals, code.co_stacksize,
-                            code.co_flags, code.co_code, code.co_consts,
-                            code.co_names, code.co_varnames, filename,
-                            location, code.co_firstlineno,
-                            code.co_lnotab, (), ())
-        else:
-            code = CodeType(0, code.co_kwonlyargcount,
-                            code.co_nlocals, code.co_stacksize,
-                            code.co_flags, code.co_code, code.co_consts,
-                            code.co_names, code.co_varnames, filename,
-                            location, code.co_firstlineno,
-                            code.co_lnotab, (), ())
-    except Exception as e:
-        pass
-
-    # execute the code and catch the new traceback
-    try:
-        exec(code, globals, locals)
-    except:
-        exc_info = sys.exc_info()
-        new_tb = exc_info[2].tb_next
-
-    # return without this frame
-    return exc_info[:2] + (new_tb,)
-
-
-def _init_ugly_crap():
-    """This function implements a few ugly things so that we can patch the
-    traceback objects.  The function returned allows resetting `tb_next` on
-    any python traceback object.  Do not attempt to use this on non cpython
-    interpreters
-    """
-    import ctypes
-    from types import TracebackType
-
-    if PY2:
-        # figure out size of _Py_ssize_t for Python 2:
-        if hasattr(ctypes.pythonapi, 'Py_InitModule4_64'):
-            _Py_ssize_t = ctypes.c_int64
-        else:
-            _Py_ssize_t = ctypes.c_int
-    else:
-        # platform ssize_t on Python 3
-        _Py_ssize_t = ctypes.c_ssize_t
-
-    # regular python
-    class _PyObject(ctypes.Structure):
-        pass
-    _PyObject._fields_ = [
-        ('ob_refcnt', _Py_ssize_t),
-        ('ob_type', ctypes.POINTER(_PyObject))
-    ]
-
-    # python with trace
-    if hasattr(sys, 'getobjects'):
-        class _PyObject(ctypes.Structure):
-            pass
-        _PyObject._fields_ = [
-            ('_ob_next', ctypes.POINTER(_PyObject)),
-            ('_ob_prev', ctypes.POINTER(_PyObject)),
-            ('ob_refcnt', _Py_ssize_t),
-            ('ob_type', ctypes.POINTER(_PyObject))
-        ]
-
-    class _Traceback(_PyObject):
-        pass
-    _Traceback._fields_ = [
-        ('tb_next', ctypes.POINTER(_Traceback)),
-        ('tb_frame', ctypes.POINTER(_PyObject)),
-        ('tb_lasti', ctypes.c_int),
-        ('tb_lineno', ctypes.c_int)
-    ]
-
-    def tb_set_next(tb, next):
-        """Set the tb_next attribute of a traceback object."""
-        if not (isinstance(tb, TracebackType) and
-                (next is None or isinstance(next, TracebackType))):
-            raise TypeError('tb_set_next arguments must be traceback objects')
-        obj = _Traceback.from_address(id(tb))
-        if tb.tb_next is not None:
-            old = _Traceback.from_address(id(tb.tb_next))
-            old.ob_refcnt -= 1
-        if next is None:
-            obj.tb_next = ctypes.POINTER(_Traceback)()
-        else:
-            next = _Traceback.from_address(id(next))
-            next.ob_refcnt += 1
-            obj.tb_next = ctypes.pointer(next)
-
-    return tb_set_next
-
-
-# try to get a tb_set_next implementation if we don't have transparent
-# proxies.
-tb_set_next = None
-if tproxy is None:
-    try:
-        tb_set_next = _init_ugly_crap()
-    except:
-        pass
-    del _init_ugly_crap
diff --git a/third_party/jinja2/defaults.py b/third_party/jinja2/defaults.py
deleted file mode 100644
index 3717a72..0000000
--- a/third_party/jinja2/defaults.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.defaults
-    ~~~~~~~~~~~~~~~
-
-    Jinja default filters and tags.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-from jinja2._compat import range_type
-from jinja2.utils import generate_lorem_ipsum, Cycler, Joiner
-
-
-# defaults for the parser / lexer
-BLOCK_START_STRING = '{%'
-BLOCK_END_STRING = '%}'
-VARIABLE_START_STRING = '{{'
-VARIABLE_END_STRING = '}}'
-COMMENT_START_STRING = '{#'
-COMMENT_END_STRING = '#}'
-LINE_STATEMENT_PREFIX = None
-LINE_COMMENT_PREFIX = None
-TRIM_BLOCKS = False
-LSTRIP_BLOCKS = False
-NEWLINE_SEQUENCE = '\n'
-KEEP_TRAILING_NEWLINE = False
-
-
-# default filters, tests and namespace
-from jinja2.filters import FILTERS as DEFAULT_FILTERS
-from jinja2.tests import TESTS as DEFAULT_TESTS
-DEFAULT_NAMESPACE = {
-    'range':        range_type,
-    'dict':         dict,
-    'lipsum':       generate_lorem_ipsum,
-    'cycler':       Cycler,
-    'joiner':       Joiner
-}
-
-
-# export all constants
-__all__ = tuple(x for x in locals().keys() if x.isupper())
diff --git a/third_party/jinja2/environment.py b/third_party/jinja2/environment.py
deleted file mode 100644
index 8b2572b..0000000
--- a/third_party/jinja2/environment.py
+++ /dev/null
@@ -1,1213 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.environment
-    ~~~~~~~~~~~~~~~~~~
-
-    Provides a class that holds runtime and parsing time options.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import os
-import sys
-from jinja2 import nodes
-from jinja2.defaults import BLOCK_START_STRING, \
-     BLOCK_END_STRING, VARIABLE_START_STRING, VARIABLE_END_STRING, \
-     COMMENT_START_STRING, COMMENT_END_STRING, LINE_STATEMENT_PREFIX, \
-     LINE_COMMENT_PREFIX, TRIM_BLOCKS, NEWLINE_SEQUENCE, \
-     DEFAULT_FILTERS, DEFAULT_TESTS, DEFAULT_NAMESPACE, \
-     KEEP_TRAILING_NEWLINE, LSTRIP_BLOCKS
-from jinja2.lexer import get_lexer, TokenStream
-from jinja2.parser import Parser
-from jinja2.nodes import EvalContext
-from jinja2.optimizer import optimize
-from jinja2.compiler import generate, CodeGenerator
-from jinja2.runtime import Undefined, new_context, Context
-from jinja2.exceptions import TemplateSyntaxError, TemplateNotFound, \
-     TemplatesNotFound, TemplateRuntimeError
-from jinja2.utils import import_string, LRUCache, Markup, missing, \
-     concat, consume, internalcode
-from jinja2._compat import imap, ifilter, string_types, iteritems, \
-     text_type, reraise, implements_iterator, implements_to_string, \
-     get_next, encode_filename, PY2, PYPY
-from functools import reduce
-
-
-# for direct template usage we have up to ten living environments
-_spontaneous_environments = LRUCache(10)
-
-# the function to create jinja traceback objects.  This is dynamically
-# imported on the first exception in the exception handler.
-_make_traceback = None
-
-
-def get_spontaneous_environment(*args):
-    """Return a new spontaneous environment.  A spontaneous environment is an
-    unnamed and unaccessible (in theory) environment that is used for
-    templates generated from a string and not from the file system.
-    """
-    try:
-        env = _spontaneous_environments.get(args)
-    except TypeError:
-        return Environment(*args)
-    if env is not None:
-        return env
-    _spontaneous_environments[args] = env = Environment(*args)
-    env.shared = True
-    return env
-
-
-def create_cache(size):
-    """Return the cache class for the given size."""
-    if size == 0:
-        return None
-    if size < 0:
-        return {}
-    return LRUCache(size)
-
-
-def copy_cache(cache):
-    """Create an empty copy of the given cache."""
-    if cache is None:
-        return None
-    elif type(cache) is dict:
-        return {}
-    return LRUCache(cache.capacity)
-
-
-def load_extensions(environment, extensions):
-    """Load the extensions from the list and bind it to the environment.
-    Returns a dict of instantiated environments.
-    """
-    result = {}
-    for extension in extensions:
-        if isinstance(extension, string_types):
-            extension = import_string(extension)
-        result[extension.identifier] = extension(environment)
-    return result
-
-
-def _environment_sanity_check(environment):
-    """Perform a sanity check on the environment."""
-    assert issubclass(environment.undefined, Undefined), 'undefined must ' \
-        'be a subclass of undefined because filters depend on it.'
-    assert environment.block_start_string != \
-        environment.variable_start_string != \
-        environment.comment_start_string, 'block, variable and comment ' \
-        'start strings must be different'
-    assert environment.newline_sequence in ('\r', '\r\n', '\n'), \
-        'newline_sequence set to unknown line ending string.'
-    return environment
-
-
-class Environment(object):
-    r"""The core component of Jinja is the `Environment`.  It contains
-    important shared variables like configuration, filters, tests,
-    globals and others.  Instances of this class may be modified if
-    they are not shared and if no template was loaded so far.
-    Modifications on environments after the first template was loaded
-    will lead to surprising effects and undefined behavior.
-
-    Here are the possible initialization parameters:
-
-        `block_start_string`
-            The string marking the beginning of a block.  Defaults to ``'{%'``.
-
-        `block_end_string`
-            The string marking the end of a block.  Defaults to ``'%}'``.
-
-        `variable_start_string`
-            The string marking the beginning of a print statement.
-            Defaults to ``'{{'``.
-
-        `variable_end_string`
-            The string marking the end of a print statement.  Defaults to
-            ``'}}'``.
-
-        `comment_start_string`
-            The string marking the beginning of a comment.  Defaults to ``'{#'``.
-
-        `comment_end_string`
-            The string marking the end of a comment.  Defaults to ``'#}'``.
-
-        `line_statement_prefix`
-            If given and a string, this will be used as prefix for line based
-            statements.  See also :ref:`line-statements`.
-
-        `line_comment_prefix`
-            If given and a string, this will be used as prefix for line based
-            comments.  See also :ref:`line-statements`.
-
-            .. versionadded:: 2.2
-
-        `trim_blocks`
-            If this is set to ``True`` the first newline after a block is
-            removed (block, not variable tag!).  Defaults to `False`.
-
-        `lstrip_blocks`
-            If this is set to ``True`` leading spaces and tabs are stripped
-            from the start of a line to a block.  Defaults to `False`.
-
-        `newline_sequence`
-            The sequence that starts a newline.  Must be one of ``'\r'``,
-            ``'\n'`` or ``'\r\n'``.  The default is ``'\n'`` which is a
-            useful default for Linux and OS X systems as well as web
-            applications.
-
-        `keep_trailing_newline`
-            Preserve the trailing newline when rendering templates.
-            The default is ``False``, which causes a single newline,
-            if present, to be stripped from the end of the template.
-
-            .. versionadded:: 2.7
-
-        `extensions`
-            List of Jinja extensions to use.  This can either be import paths
-            as strings or extension classes.  For more information have a
-            look at :ref:`the extensions documentation <jinja-extensions>`.
-
-        `optimized`
-            should the optimizer be enabled?  Default is `True`.
-
-        `undefined`
-            :class:`Undefined` or a subclass of it that is used to represent
-            undefined values in the template.
-
-        `finalize`
-            A callable that can be used to process the result of a variable
-            expression before it is output.  For example one can convert
-            `None` implicitly into an empty string here.
-
-        `autoescape`
-            If set to true the XML/HTML autoescaping feature is enabled by
-            default.  For more details about autoescaping see
-            :class:`~jinja2.utils.Markup`.  As of Jinja 2.4 this can also
-            be a callable that is passed the template name and has to
-            return `True` or `False` depending on autoescape should be
-            enabled by default.
-
-            .. versionchanged:: 2.4
-               `autoescape` can now be a function
-
-        `loader`
-            The template loader for this environment.
-
-        `cache_size`
-            The size of the cache.  Per default this is ``400`` which means
-            that if more than 400 templates are loaded the loader will clean
-            out the least recently used template.  If the cache size is set to
-            ``0`` templates are recompiled all the time, if the cache size is
-            ``-1`` the cache will not be cleaned.
-
-            .. versionchanged:: 2.8
-               The cache size was increased to 400 from a low 50.
-
-        `auto_reload`
-            Some loaders load templates from locations where the template
-            sources may change (ie: file system or database).  If
-            `auto_reload` is set to `True` (default) every time a template is
-            requested the loader checks if the source changed and if yes, it
-            will reload the template.  For higher performance it's possible to
-            disable that.
-
-        `bytecode_cache`
-            If set to a bytecode cache object, this object will provide a
-            cache for the internal Jinja bytecode so that templates don't
-            have to be parsed if they were not changed.
-
-            See :ref:`bytecode-cache` for more information.
-    """
-
-    #: if this environment is sandboxed.  Modifying this variable won't make
-    #: the environment sandboxed though.  For a real sandboxed environment
-    #: have a look at jinja2.sandbox.  This flag alone controls the code
-    #: generation by the compiler.
-    sandboxed = False
-
-    #: True if the environment is just an overlay
-    overlayed = False
-
-    #: the environment this environment is linked to if it is an overlay
-    linked_to = None
-
-    #: shared environments have this set to `True`.  A shared environment
-    #: must not be modified
-    shared = False
-
-    #: these are currently EXPERIMENTAL undocumented features.
-    exception_handler = None
-    exception_formatter = None
-
-    #: the class that is used for code generation.  See
-    #: :class:`~jinja2.compiler.CodeGenerator` for more information.
-    code_generator_class = CodeGenerator
-
-    #: the context class thatis used for templates.  See
-    #: :class:`~jinja2.runtime.Context` for more information.
-    context_class = Context
-
-    def __init__(self,
-                 block_start_string=BLOCK_START_STRING,
-                 block_end_string=BLOCK_END_STRING,
-                 variable_start_string=VARIABLE_START_STRING,
-                 variable_end_string=VARIABLE_END_STRING,
-                 comment_start_string=COMMENT_START_STRING,
-                 comment_end_string=COMMENT_END_STRING,
-                 line_statement_prefix=LINE_STATEMENT_PREFIX,
-                 line_comment_prefix=LINE_COMMENT_PREFIX,
-                 trim_blocks=TRIM_BLOCKS,
-                 lstrip_blocks=LSTRIP_BLOCKS,
-                 newline_sequence=NEWLINE_SEQUENCE,
-                 keep_trailing_newline=KEEP_TRAILING_NEWLINE,
-                 extensions=(),
-                 optimized=True,
-                 undefined=Undefined,
-                 finalize=None,
-                 autoescape=False,
-                 loader=None,
-                 cache_size=400,
-                 auto_reload=True,
-                 bytecode_cache=None):
-        # !!Important notice!!
-        #   The constructor accepts quite a few arguments that should be
-        #   passed by keyword rather than position.  However it's important to
-        #   not change the order of arguments because it's used at least
-        #   internally in those cases:
-        #       -   spontaneous environments (i18n extension and Template)
-        #       -   unittests
-        #   If parameter changes are required only add parameters at the end
-        #   and don't change the arguments (or the defaults!) of the arguments
-        #   existing already.
-
-        # lexer / parser information
-        self.block_start_string = block_start_string
-        self.block_end_string = block_end_string
-        self.variable_start_string = variable_start_string
-        self.variable_end_string = variable_end_string
-        self.comment_start_string = comment_start_string
-        self.comment_end_string = comment_end_string
-        self.line_statement_prefix = line_statement_prefix
-        self.line_comment_prefix = line_comment_prefix
-        self.trim_blocks = trim_blocks
-        self.lstrip_blocks = lstrip_blocks
-        self.newline_sequence = newline_sequence
-        self.keep_trailing_newline = keep_trailing_newline
-
-        # runtime information
-        self.undefined = undefined
-        self.optimized = optimized
-        self.finalize = finalize
-        self.autoescape = autoescape
-
-        # defaults
-        self.filters = DEFAULT_FILTERS.copy()
-        self.tests = DEFAULT_TESTS.copy()
-        self.globals = DEFAULT_NAMESPACE.copy()
-
-        # set the loader provided
-        self.loader = loader
-        self.cache = create_cache(cache_size)
-        self.bytecode_cache = bytecode_cache
-        self.auto_reload = auto_reload
-
-        # load extensions
-        self.extensions = load_extensions(self, extensions)
-
-        _environment_sanity_check(self)
-
-    def add_extension(self, extension):
-        """Adds an extension after the environment was created.
-
-        .. versionadded:: 2.5
-        """
-        self.extensions.update(load_extensions(self, [extension]))
-
-    def extend(self, **attributes):
-        """Add the items to the instance of the environment if they do not exist
-        yet.  This is used by :ref:`extensions <writing-extensions>` to register
-        callbacks and configuration values without breaking inheritance.
-        """
-        for key, value in iteritems(attributes):
-            if not hasattr(self, key):
-                setattr(self, key, value)
-
-    def overlay(self, block_start_string=missing, block_end_string=missing,
-                variable_start_string=missing, variable_end_string=missing,
-                comment_start_string=missing, comment_end_string=missing,
-                line_statement_prefix=missing, line_comment_prefix=missing,
-                trim_blocks=missing, lstrip_blocks=missing,
-                extensions=missing, optimized=missing,
-                undefined=missing, finalize=missing, autoescape=missing,
-                loader=missing, cache_size=missing, auto_reload=missing,
-                bytecode_cache=missing):
-        """Create a new overlay environment that shares all the data with the
-        current environment except for cache and the overridden attributes.
-        Extensions cannot be removed for an overlayed environment.  An overlayed
-        environment automatically gets all the extensions of the environment it
-        is linked to plus optional extra extensions.
-
-        Creating overlays should happen after the initial environment was set
-        up completely.  Not all attributes are truly linked, some are just
-        copied over so modifications on the original environment may not shine
-        through.
-        """
-        args = dict(locals())
-        del args['self'], args['cache_size'], args['extensions']
-
-        rv = object.__new__(self.__class__)
-        rv.__dict__.update(self.__dict__)
-        rv.overlayed = True
-        rv.linked_to = self
-
-        for key, value in iteritems(args):
-            if value is not missing:
-                setattr(rv, key, value)
-
-        if cache_size is not missing:
-            rv.cache = create_cache(cache_size)
-        else:
-            rv.cache = copy_cache(self.cache)
-
-        rv.extensions = {}
-        for key, value in iteritems(self.extensions):
-            rv.extensions[key] = value.bind(rv)
-        if extensions is not missing:
-            rv.extensions.update(load_extensions(rv, extensions))
-
-        return _environment_sanity_check(rv)
-
-    lexer = property(get_lexer, doc="The lexer for this environment.")
-
-    def iter_extensions(self):
-        """Iterates over the extensions by priority."""
-        return iter(sorted(self.extensions.values(),
-                           key=lambda x: x.priority))
-
-    def getitem(self, obj, argument):
-        """Get an item or attribute of an object but prefer the item."""
-        try:
-            return obj[argument]
-        except (TypeError, LookupError):
-            if isinstance(argument, string_types):
-                try:
-                    attr = str(argument)
-                except Exception:
-                    pass
-                else:
-                    try:
-                        return getattr(obj, attr)
-                    except AttributeError:
-                        pass
-            return self.undefined(obj=obj, name=argument)
-
-    def getattr(self, obj, attribute):
-        """Get an item or attribute of an object but prefer the attribute.
-        Unlike :meth:`getitem` the attribute *must* be a bytestring.
-        """
-        try:
-            return getattr(obj, attribute)
-        except AttributeError:
-            pass
-        try:
-            return obj[attribute]
-        except (TypeError, LookupError, AttributeError):
-            return self.undefined(obj=obj, name=attribute)
-
-    def call_filter(self, name, value, args=None, kwargs=None,
-                    context=None, eval_ctx=None):
-        """Invokes a filter on a value the same way the compiler does it.
-
-        .. versionadded:: 2.7
-        """
-        func = self.filters.get(name)
-        if func is None:
-            raise TemplateRuntimeError('no filter named %r' % name)
-        args = [value] + list(args or ())
-        if getattr(func, 'contextfilter', False):
-            if context is None:
-                raise TemplateRuntimeError('Attempted to invoke context '
-                                           'filter without context')
-            args.insert(0, context)
-        elif getattr(func, 'evalcontextfilter', False):
-            if eval_ctx is None:
-                if context is not None:
-                    eval_ctx = context.eval_ctx
-                else:
-                    eval_ctx = EvalContext(self)
-            args.insert(0, eval_ctx)
-        elif getattr(func, 'environmentfilter', False):
-            args.insert(0, self)
-        return func(*args, **(kwargs or {}))
-
-    def call_test(self, name, value, args=None, kwargs=None):
-        """Invokes a test on a value the same way the compiler does it.
-
-        .. versionadded:: 2.7
-        """
-        func = self.tests.get(name)
-        if func is None:
-            raise TemplateRuntimeError('no test named %r' % name)
-        return func(value, *(args or ()), **(kwargs or {}))
-
-    @internalcode
-    def parse(self, source, name=None, filename=None):
-        """Parse the sourcecode and return the abstract syntax tree.  This
-        tree of nodes is used by the compiler to convert the template into
-        executable source- or bytecode.  This is useful for debugging or to
-        extract information from templates.
-
-        If you are :ref:`developing Jinja2 extensions <writing-extensions>`
-        this gives you a good overview of the node tree generated.
-        """
-        try:
-            return self._parse(source, name, filename)
-        except TemplateSyntaxError:
-            exc_info = sys.exc_info()
-        self.handle_exception(exc_info, source_hint=source)
-
-    def _parse(self, source, name, filename):
-        """Internal parsing function used by `parse` and `compile`."""
-        return Parser(self, source, name, encode_filename(filename)).parse()
-
-    def lex(self, source, name=None, filename=None):
-        """Lex the given sourcecode and return a generator that yields
-        tokens as tuples in the form ``(lineno, token_type, value)``.
-        This can be useful for :ref:`extension development <writing-extensions>`
-        and debugging templates.
-
-        This does not perform preprocessing.  If you want the preprocessing
-        of the extensions to be applied you have to filter source through
-        the :meth:`preprocess` method.
-        """
-        source = text_type(source)
-        try:
-            return self.lexer.tokeniter(source, name, filename)
-        except TemplateSyntaxError:
-            exc_info = sys.exc_info()
-        self.handle_exception(exc_info, source_hint=source)
-
-    def preprocess(self, source, name=None, filename=None):
-        """Preprocesses the source with all extensions.  This is automatically
-        called for all parsing and compiling methods but *not* for :meth:`lex`
-        because there you usually only want the actual source tokenized.
-        """
-        return reduce(lambda s, e: e.preprocess(s, name, filename),
-                      self.iter_extensions(), text_type(source))
-
-    def _tokenize(self, source, name, filename=None, state=None):
-        """Called by the parser to do the preprocessing and filtering
-        for all the extensions.  Returns a :class:`~jinja2.lexer.TokenStream`.
-        """
-        source = self.preprocess(source, name, filename)
-        stream = self.lexer.tokenize(source, name, filename, state)
-        for ext in self.iter_extensions():
-            stream = ext.filter_stream(stream)
-            if not isinstance(stream, TokenStream):
-                stream = TokenStream(stream, name, filename)
-        return stream
-
-    def _generate(self, source, name, filename, defer_init=False):
-        """Internal hook that can be overridden to hook a different generate
-        method in.
-
-        .. versionadded:: 2.5
-        """
-        return generate(source, self, name, filename, defer_init=defer_init)
-
-    def _compile(self, source, filename):
-        """Internal hook that can be overridden to hook a different compile
-        method in.
-
-        .. versionadded:: 2.5
-        """
-        return compile(source, filename, 'exec')
-
-    @internalcode
-    def compile(self, source, name=None, filename=None, raw=False,
-                defer_init=False):
-        """Compile a node or template source code.  The `name` parameter is
-        the load name of the template after it was joined using
-        :meth:`join_path` if necessary, not the filename on the file system.
-        the `filename` parameter is the estimated filename of the template on
-        the file system.  If the template came from a database or memory this
-        can be omitted.
-
-        The return value of this method is a python code object.  If the `raw`
-        parameter is `True` the return value will be a string with python
-        code equivalent to the bytecode returned otherwise.  This method is
-        mainly used internally.
-
-        `defer_init` is use internally to aid the module code generator.  This
-        causes the generated code to be able to import without the global
-        environment variable to be set.
-
-        .. versionadded:: 2.4
-           `defer_init` parameter added.
-        """
-        source_hint = None
-        try:
-            if isinstance(source, string_types):
-                source_hint = source
-                source = self._parse(source, name, filename)
-            if self.optimized:
-                source = optimize(source, self)
-            source = self._generate(source, name, filename,
-                                    defer_init=defer_init)
-            if raw:
-                return source
-            if filename is None:
-                filename = '<template>'
-            else:
-                filename = encode_filename(filename)
-            return self._compile(source, filename)
-        except TemplateSyntaxError:
-            exc_info = sys.exc_info()
-        self.handle_exception(exc_info, source_hint=source_hint)
-
-    def compile_expression(self, source, undefined_to_none=True):
-        """A handy helper method that returns a callable that accepts keyword
-        arguments that appear as variables in the expression.  If called it
-        returns the result of the expression.
-
-        This is useful if applications want to use the same rules as Jinja
-        in template "configuration files" or similar situations.
-
-        Example usage:
-
-        >>> env = Environment()
-        >>> expr = env.compile_expression('foo == 42')
-        >>> expr(foo=23)
-        False
-        >>> expr(foo=42)
-        True
-
-        Per default the return value is converted to `None` if the
-        expression returns an undefined value.  This can be changed
-        by setting `undefined_to_none` to `False`.
-
-        >>> env.compile_expression('var')() is None
-        True
-        >>> env.compile_expression('var', undefined_to_none=False)()
-        Undefined
-
-        .. versionadded:: 2.1
-        """
-        parser = Parser(self, source, state='variable')
-        exc_info = None
-        try:
-            expr = parser.parse_expression()
-            if not parser.stream.eos:
-                raise TemplateSyntaxError('chunk after expression',
-                                          parser.stream.current.lineno,
-                                          None, None)
-            expr.set_environment(self)
-        except TemplateSyntaxError:
-            exc_info = sys.exc_info()
-        if exc_info is not None:
-            self.handle_exception(exc_info, source_hint=source)
-        body = [nodes.Assign(nodes.Name('result', 'store'), expr, lineno=1)]
-        template = self.from_string(nodes.Template(body, lineno=1))
-        return TemplateExpression(template, undefined_to_none)
-
-    def compile_templates(self, target, extensions=None, filter_func=None,
-                          zip='deflated', log_function=None,
-                          ignore_errors=True, py_compile=False):
-        """Finds all the templates the loader can find, compiles them
-        and stores them in `target`.  If `zip` is `None`, instead of in a
-        zipfile, the templates will be stored in a directory.
-        By default a deflate zip algorithm is used. To switch to
-        the stored algorithm, `zip` can be set to ``'stored'``.
-
-        `extensions` and `filter_func` are passed to :meth:`list_templates`.
-        Each template returned will be compiled to the target folder or
-        zipfile.
-
-        By default template compilation errors are ignored.  In case a
-        log function is provided, errors are logged.  If you want template
-        syntax errors to abort the compilation you can set `ignore_errors`
-        to `False` and you will get an exception on syntax errors.
-
-        If `py_compile` is set to `True` .pyc files will be written to the
-        target instead of standard .py files.  This flag does not do anything
-        on pypy and Python 3 where pyc files are not picked up by itself and
-        don't give much benefit.
-
-        .. versionadded:: 2.4
-        """
-        from jinja2.loaders import ModuleLoader
-
-        if log_function is None:
-            log_function = lambda x: None
-
-        if py_compile:
-            if not PY2 or PYPY:
-                from warnings import warn
-                warn(Warning('py_compile has no effect on pypy or Python 3'))
-                py_compile = False
-            else:
-                import imp
-                import marshal
-                py_header = imp.get_magic() + \
-                    u'\xff\xff\xff\xff'.encode('iso-8859-15')
-
-                # Python 3.3 added a source filesize to the header
-                if sys.version_info >= (3, 3):
-                    py_header += u'\x00\x00\x00\x00'.encode('iso-8859-15')
-
-        def write_file(filename, data, mode):
-            if zip:
-                info = ZipInfo(filename)
-                info.external_attr = 0o755 << 16
-                zip_file.writestr(info, data)
-            else:
-                f = open(os.path.join(target, filename), mode)
-                try:
-                    f.write(data)
-                finally:
-                    f.close()
-
-        if zip is not None:
-            from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, ZIP_STORED
-            zip_file = ZipFile(target, 'w', dict(deflated=ZIP_DEFLATED,
-                                                 stored=ZIP_STORED)[zip])
-            log_function('Compiling into Zip archive "%s"' % target)
-        else:
-            if not os.path.isdir(target):
-                os.makedirs(target)
-            log_function('Compiling into folder "%s"' % target)
-
-        try:
-            for name in self.list_templates(extensions, filter_func):
-                source, filename, _ = self.loader.get_source(self, name)
-                try:
-                    code = self.compile(source, name, filename, True, True)
-                except TemplateSyntaxError as e:
-                    if not ignore_errors:
-                        raise
-                    log_function('Could not compile "%s": %s' % (name, e))
-                    continue
-
-                filename = ModuleLoader.get_module_filename(name)
-
-                if py_compile:
-                    c = self._compile(code, encode_filename(filename))
-                    write_file(filename + 'c', py_header +
-                               marshal.dumps(c), 'wb')
-                    log_function('Byte-compiled "%s" as %s' %
-                                 (name, filename + 'c'))
-                else:
-                    write_file(filename, code, 'w')
-                    log_function('Compiled "%s" as %s' % (name, filename))
-        finally:
-            if zip:
-                zip_file.close()
-
-        log_function('Finished compiling templates')
-
-    def list_templates(self, extensions=None, filter_func=None):
-        """Returns a list of templates for this environment.  This requires
-        that the loader supports the loader's
-        :meth:`~BaseLoader.list_templates` method.
-
-        If there are other files in the template folder besides the
-        actual templates, the returned list can be filtered.  There are two
-        ways: either `extensions` is set to a list of file extensions for
-        templates, or a `filter_func` can be provided which is a callable that
-        is passed a template name and should return `True` if it should end up
-        in the result list.
-
-        If the loader does not support that, a :exc:`TypeError` is raised.
-
-        .. versionadded:: 2.4
-        """
-        x = self.loader.list_templates()
-        if extensions is not None:
-            if filter_func is not None:
-                raise TypeError('either extensions or filter_func '
-                                'can be passed, but not both')
-            filter_func = lambda x: '.' in x and \
-                                    x.rsplit('.', 1)[1] in extensions
-        if filter_func is not None:
-            x = list(ifilter(filter_func, x))
-        return x
-
-    def handle_exception(self, exc_info=None, rendered=False, source_hint=None):
-        """Exception handling helper.  This is used internally to either raise
-        rewritten exceptions or return a rendered traceback for the template.
-        """
-        global _make_traceback
-        if exc_info is None:
-            exc_info = sys.exc_info()
-
-        # the debugging module is imported when it's used for the first time.
-        # we're doing a lot of stuff there and for applications that do not
-        # get any exceptions in template rendering there is no need to load
-        # all of that.
-        if _make_traceback is None:
-            from jinja2.debug import make_traceback as _make_traceback
-        traceback = _make_traceback(exc_info, source_hint)
-        if rendered and self.exception_formatter is not None:
-            return self.exception_formatter(traceback)
-        if self.exception_handler is not None:
-            self.exception_handler(traceback)
-        exc_type, exc_value, tb = traceback.standard_exc_info
-        reraise(exc_type, exc_value, tb)
-
-    def join_path(self, template, parent):
-        """Join a template with the parent.  By default all the lookups are
-        relative to the loader root so this method returns the `template`
-        parameter unchanged, but if the paths should be relative to the
-        parent template, this function can be used to calculate the real
-        template name.
-
-        Subclasses may override this method and implement template path
-        joining here.
-        """
-        return template
-
-    @internalcode
-    def _load_template(self, name, globals):
-        if self.loader is None:
-            raise TypeError('no loader for this environment specified')
-        try:
-            # use abs path for cache key
-            cache_key = self.loader.get_source(self, name)[1]
-        except RuntimeError:
-            # if loader does not implement get_source()
-            cache_key = None
-        # if template is not file, use name for cache key
-        if cache_key is None:
-            cache_key = name
-        if self.cache is not None:
-            template = self.cache.get(cache_key)
-            if template is not None and (not self.auto_reload or
-                                         template.is_up_to_date):
-                return template
-        template = self.loader.load(self, name, globals)
-        if self.cache is not None:
-            self.cache[cache_key] = template
-        return template
-
-    @internalcode
-    def get_template(self, name, parent=None, globals=None):
-        """Load a template from the loader.  If a loader is configured this
-        method ask the loader for the template and returns a :class:`Template`.
-        If the `parent` parameter is not `None`, :meth:`join_path` is called
-        to get the real template name before loading.
-
-        The `globals` parameter can be used to provide template wide globals.
-        These variables are available in the context at render time.
-
-        If the template does not exist a :exc:`TemplateNotFound` exception is
-        raised.
-
-        .. versionchanged:: 2.4
-           If `name` is a :class:`Template` object it is returned from the
-           function unchanged.
-        """
-        if isinstance(name, Template):
-            return name
-        if parent is not None:
-            name = self.join_path(name, parent)
-        return self._load_template(name, self.make_globals(globals))
-
-    @internalcode
-    def select_template(self, names, parent=None, globals=None):
-        """Works like :meth:`get_template` but tries a number of templates
-        before it fails.  If it cannot find any of the templates, it will
-        raise a :exc:`TemplatesNotFound` exception.
-
-        .. versionadded:: 2.3
-
-        .. versionchanged:: 2.4
-           If `names` contains a :class:`Template` object it is returned
-           from the function unchanged.
-        """
-        if not names:
-            raise TemplatesNotFound(message=u'Tried to select from an empty list '
-                                            u'of templates.')
-        globals = self.make_globals(globals)
-        for name in names:
-            if isinstance(name, Template):
-                return name
-            if parent is not None:
-                name = self.join_path(name, parent)
-            try:
-                return self._load_template(name, globals)
-            except TemplateNotFound:
-                pass
-        raise TemplatesNotFound(names)
-
-    @internalcode
-    def get_or_select_template(self, template_name_or_list,
-                               parent=None, globals=None):
-        """Does a typecheck and dispatches to :meth:`select_template`
-        if an iterable of template names is given, otherwise to
-        :meth:`get_template`.
-
-        .. versionadded:: 2.3
-        """
-        if isinstance(template_name_or_list, string_types):
-            return self.get_template(template_name_or_list, parent, globals)
-        elif isinstance(template_name_or_list, Template):
-            return template_name_or_list
-        return self.select_template(template_name_or_list, parent, globals)
-
-    def from_string(self, source, globals=None, template_class=None):
-        """Load a template from a string.  This parses the source given and
-        returns a :class:`Template` object.
-        """
-        globals = self.make_globals(globals)
-        cls = template_class or self.template_class
-        return cls.from_code(self, self.compile(source), globals, None)
-
-    def make_globals(self, d):
-        """Return a dict for the globals."""
-        if not d:
-            return self.globals
-        return dict(self.globals, **d)
-
-
-class Template(object):
-    """The central template object.  This class represents a compiled template
-    and is used to evaluate it.
-
-    Normally the template object is generated from an :class:`Environment` but
-    it also has a constructor that makes it possible to create a template
-    instance directly using the constructor.  It takes the same arguments as
-    the environment constructor but it's not possible to specify a loader.
-
-    Every template object has a few methods and members that are guaranteed
-    to exist.  However it's important that a template object should be
-    considered immutable.  Modifications on the object are not supported.
-
-    Template objects created from the constructor rather than an environment
-    do have an `environment` attribute that points to a temporary environment
-    that is probably shared with other templates created with the constructor
-    and compatible settings.
-
-    >>> template = Template('Hello {{ name }}!')
-    >>> template.render(name='John Doe') == u'Hello John Doe!'
-    True
-    >>> stream = template.stream(name='John Doe')
-    >>> next(stream) == u'Hello John Doe!'
-    True
-    >>> next(stream)
-    Traceback (most recent call last):
-        ...
-    StopIteration
-    """
-
-    def __new__(cls, source,
-                block_start_string=BLOCK_START_STRING,
-                block_end_string=BLOCK_END_STRING,
-                variable_start_string=VARIABLE_START_STRING,
-                variable_end_string=VARIABLE_END_STRING,
-                comment_start_string=COMMENT_START_STRING,
-                comment_end_string=COMMENT_END_STRING,
-                line_statement_prefix=LINE_STATEMENT_PREFIX,
-                line_comment_prefix=LINE_COMMENT_PREFIX,
-                trim_blocks=TRIM_BLOCKS,
-                lstrip_blocks=LSTRIP_BLOCKS,
-                newline_sequence=NEWLINE_SEQUENCE,
-                keep_trailing_newline=KEEP_TRAILING_NEWLINE,
-                extensions=(),
-                optimized=True,
-                undefined=Undefined,
-                finalize=None,
-                autoescape=False):
-        env = get_spontaneous_environment(
-            block_start_string, block_end_string, variable_start_string,
-            variable_end_string, comment_start_string, comment_end_string,
-            line_statement_prefix, line_comment_prefix, trim_blocks,
-            lstrip_blocks, newline_sequence, keep_trailing_newline,
-            frozenset(extensions), optimized, undefined, finalize, autoescape,
-            None, 0, False, None)
-        return env.from_string(source, template_class=cls)
-
-    @classmethod
-    def from_code(cls, environment, code, globals, uptodate=None):
-        """Creates a template object from compiled code and the globals.  This
-        is used by the loaders and environment to create a template object.
-        """
-        namespace = {
-            'environment':  environment,
-            '__file__':     code.co_filename
-        }
-        exec(code, namespace)
-        rv = cls._from_namespace(environment, namespace, globals)
-        rv._uptodate = uptodate
-        return rv
-
-    @classmethod
-    def from_module_dict(cls, environment, module_dict, globals):
-        """Creates a template object from a module.  This is used by the
-        module loader to create a template object.
-
-        .. versionadded:: 2.4
-        """
-        return cls._from_namespace(environment, module_dict, globals)
-
-    @classmethod
-    def _from_namespace(cls, environment, namespace, globals):
-        t = object.__new__(cls)
-        t.environment = environment
-        t.globals = globals
-        t.name = namespace['name']
-        t.filename = namespace['__file__']
-        t.blocks = namespace['blocks']
-
-        # render function and module
-        t.root_render_func = namespace['root']
-        t._module = None
-
-        # debug and loader helpers
-        t._debug_info = namespace['debug_info']
-        t._uptodate = None
-
-        # store the reference
-        namespace['environment'] = environment
-        namespace['__jinja_template__'] = t
-
-        return t
-
-    def render(self, *args, **kwargs):
-        """This method accepts the same arguments as the `dict` constructor:
-        A dict, a dict subclass or some keyword arguments.  If no arguments
-        are given the context will be empty.  These two calls do the same::
-
-            template.render(knights='that say nih')
-            template.render({'knights': 'that say nih'})
-
-        This will return the rendered template as unicode string.
-        """
-        vars = dict(*args, **kwargs)
-        try:
-            return concat(self.root_render_func(self.new_context(vars)))
-        except Exception:
-            exc_info = sys.exc_info()
-        return self.environment.handle_exception(exc_info, True)
-
-    def stream(self, *args, **kwargs):
-        """Works exactly like :meth:`generate` but returns a
-        :class:`TemplateStream`.
-        """
-        return TemplateStream(self.generate(*args, **kwargs))
-
-    def generate(self, *args, **kwargs):
-        """For very large templates it can be useful to not render the whole
-        template at once but evaluate each statement after another and yield
-        piece for piece.  This method basically does exactly that and returns
-        a generator that yields one item after another as unicode strings.
-
-        It accepts the same arguments as :meth:`render`.
-        """
-        vars = dict(*args, **kwargs)
-        try:
-            for event in self.root_render_func(self.new_context(vars)):
-                yield event
-        except Exception:
-            exc_info = sys.exc_info()
-        else:
-            return
-        yield self.environment.handle_exception(exc_info, True)
-
-    def new_context(self, vars=None, shared=False, locals=None):
-        """Create a new :class:`Context` for this template.  The vars
-        provided will be passed to the template.  Per default the globals
-        are added to the context.  If shared is set to `True` the data
-        is passed as it to the context without adding the globals.
-
-        `locals` can be a dict of local variables for internal usage.
-        """
-        return new_context(self.environment, self.name, self.blocks,
-                           vars, shared, self.globals, locals)
-
-    def make_module(self, vars=None, shared=False, locals=None):
-        """This method works like the :attr:`module` attribute when called
-        without arguments but it will evaluate the template on every call
-        rather than caching it.  It's also possible to provide
-        a dict which is then used as context.  The arguments are the same
-        as for the :meth:`new_context` method.
-        """
-        return TemplateModule(self, self.new_context(vars, shared, locals))
-
-    @property
-    def module(self):
-        """The template as module.  This is used for imports in the
-        template runtime but is also useful if one wants to access
-        exported template variables from the Python layer:
-
-        >>> t = Template('{% macro foo() %}42{% endmacro %}23')
-        >>> str(t.module)
-        '23'
-        >>> t.module.foo() == u'42'
-        True
-        """
-        if self._module is not None:
-            return self._module
-        self._module = rv = self.make_module()
-        return rv
-
-    def get_corresponding_lineno(self, lineno):
-        """Return the source line number of a line number in the
-        generated bytecode as they are not in sync.
-        """
-        for template_line, code_line in reversed(self.debug_info):
-            if code_line <= lineno:
-                return template_line
-        return 1
-
-    @property
-    def is_up_to_date(self):
-        """If this variable is `False` there is a newer version available."""
-        if self._uptodate is None:
-            return True
-        return self._uptodate()
-
-    @property
-    def debug_info(self):
-        """The debug info mapping."""
-        return [tuple(imap(int, x.split('='))) for x in
-                self._debug_info.split('&')]
-
-    def __repr__(self):
-        if self.name is None:
-            name = 'memory:%x' % id(self)
-        else:
-            name = repr(self.name)
-        return '<%s %s>' % (self.__class__.__name__, name)
-
-
-@implements_to_string
-class TemplateModule(object):
-    """Represents an imported template.  All the exported names of the
-    template are available as attributes on this object.  Additionally
-    converting it into an unicode- or bytestrings renders the contents.
-    """
-
-    def __init__(self, template, context):
-        self._body_stream = list(template.root_render_func(context))
-        self.__dict__.update(context.get_exported())
-        self.__name__ = template.name
-
-    def __html__(self):
-        return Markup(concat(self._body_stream))
-
-    def __str__(self):
-        return concat(self._body_stream)
-
-    def __repr__(self):
-        if self.__name__ is None:
-            name = 'memory:%x' % id(self)
-        else:
-            name = repr(self.__name__)
-        return '<%s %s>' % (self.__class__.__name__, name)
-
-
-class TemplateExpression(object):
-    """The :meth:`jinja2.Environment.compile_expression` method returns an
-    instance of this object.  It encapsulates the expression-like access
-    to the template with an expression it wraps.
-    """
-
-    def __init__(self, template, undefined_to_none):
-        self._template = template
-        self._undefined_to_none = undefined_to_none
-
-    def __call__(self, *args, **kwargs):
-        context = self._template.new_context(dict(*args, **kwargs))
-        consume(self._template.root_render_func(context))
-        rv = context.vars['result']
-        if self._undefined_to_none and isinstance(rv, Undefined):
-            rv = None
-        return rv
-
-
-@implements_iterator
-class TemplateStream(object):
-    """A template stream works pretty much like an ordinary python generator
-    but it can buffer multiple items to reduce the number of total iterations.
-    Per default the output is unbuffered which means that for every unbuffered
-    instruction in the template one unicode string is yielded.
-
-    If buffering is enabled with a buffer size of 5, five items are combined
-    into a new unicode string.  This is mainly useful if you are streaming
-    big templates to a client via WSGI which flushes after each iteration.
-    """
-
-    def __init__(self, gen):
-        self._gen = gen
-        self.disable_buffering()
-
-    def dump(self, fp, encoding=None, errors='strict'):
-        """Dump the complete stream into a file or file-like object.
-        Per default unicode strings are written, if you want to encode
-        before writing specify an `encoding`.
-
-        Example usage::
-
-            Template('Hello {{ name }}!').stream(name='foo').dump('hello.html')
-        """
-        close = False
-        if isinstance(fp, string_types):
-            if encoding is None:
-                encoding = 'utf-8'
-            fp = open(fp, 'wb')
-            close = True
-        try:
-            if encoding is not None:
-                iterable = (x.encode(encoding, errors) for x in self)
-            else:
-                iterable = self
-            if hasattr(fp, 'writelines'):
-                fp.writelines(iterable)
-            else:
-                for item in iterable:
-                    fp.write(item)
-        finally:
-            if close:
-                fp.close()
-
-    def disable_buffering(self):
-        """Disable the output buffering."""
-        self._next = get_next(self._gen)
-        self.buffered = False
-
-    def enable_buffering(self, size=5):
-        """Enable buffering.  Buffer `size` items before yielding them."""
-        if size <= 1:
-            raise ValueError('buffer size too small')
-
-        def generator(next):
-            buf = []
-            c_size = 0
-            push = buf.append
-
-            while 1:
-                try:
-                    while c_size < size:
-                        c = next()
-                        push(c)
-                        if c:
-                            c_size += 1
-                except StopIteration:
-                    if not c_size:
-                        return
-                yield concat(buf)
-                del buf[:]
-                c_size = 0
-
-        self.buffered = True
-        self._next = get_next(generator(get_next(self._gen)))
-
-    def __iter__(self):
-        return self
-
-    def __next__(self):
-        return self._next()
-
-
-# hook in default template class.  if anyone reads this comment: ignore that
-# it's possible to use custom templates ;-)
-Environment.template_class = Template
diff --git a/third_party/jinja2/exceptions.py b/third_party/jinja2/exceptions.py
deleted file mode 100644
index c9df6dc..0000000
--- a/third_party/jinja2/exceptions.py
+++ /dev/null
@@ -1,146 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.exceptions
-    ~~~~~~~~~~~~~~~~~
-
-    Jinja exceptions.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-from jinja2._compat import imap, text_type, PY2, implements_to_string
-
-
-class TemplateError(Exception):
-    """Baseclass for all template errors."""
-
-    if PY2:
-        def __init__(self, message=None):
-            if message is not None:
-                message = text_type(message).encode('utf-8')
-            Exception.__init__(self, message)
-
-        @property
-        def message(self):
-            if self.args:
-                message = self.args[0]
-                if message is not None:
-                    return message.decode('utf-8', 'replace')
-
-        def __unicode__(self):
-            return self.message or u''
-    else:
-        def __init__(self, message=None):
-            Exception.__init__(self, message)
-
-        @property
-        def message(self):
-            if self.args:
-                message = self.args[0]
-                if message is not None:
-                    return message
-
-
-@implements_to_string
-class TemplateNotFound(IOError, LookupError, TemplateError):
-    """Raised if a template does not exist."""
-
-    # looks weird, but removes the warning descriptor that just
-    # bogusly warns us about message being deprecated
-    message = None
-
-    def __init__(self, name, message=None):
-        IOError.__init__(self)
-        if message is None:
-            message = name
-        self.message = message
-        self.name = name
-        self.templates = [name]
-
-    def __str__(self):
-        return self.message
-
-
-class TemplatesNotFound(TemplateNotFound):
-    """Like :class:`TemplateNotFound` but raised if multiple templates
-    are selected.  This is a subclass of :class:`TemplateNotFound`
-    exception, so just catching the base exception will catch both.
-
-    .. versionadded:: 2.2
-    """
-
-    def __init__(self, names=(), message=None):
-        if message is None:
-            message = u'none of the templates given were found: ' + \
-                      u', '.join(imap(text_type, names))
-        TemplateNotFound.__init__(self, names and names[-1] or None, message)
-        self.templates = list(names)
-
-
-@implements_to_string
-class TemplateSyntaxError(TemplateError):
-    """Raised to tell the user that there is a problem with the template."""
-
-    def __init__(self, message, lineno, name=None, filename=None):
-        TemplateError.__init__(self, message)
-        self.lineno = lineno
-        self.name = name
-        self.filename = filename
-        self.source = None
-
-        # this is set to True if the debug.translate_syntax_error
-        # function translated the syntax error into a new traceback
-        self.translated = False
-
-    def __str__(self):
-        # for translated errors we only return the message
-        if self.translated:
-            return self.message
-
-        # otherwise attach some stuff
-        location = 'line %d' % self.lineno
-        name = self.filename or self.name
-        if name:
-            location = 'File "%s", %s' % (name, location)
-        lines = [self.message, '  ' + location]
-
-        # if the source is set, add the line to the output
-        if self.source is not None:
-            try:
-                line = self.source.splitlines()[self.lineno - 1]
-            except IndexError:
-                line = None
-            if line:
-                lines.append('    ' + line.strip())
-
-        return u'\n'.join(lines)
-
-
-class TemplateAssertionError(TemplateSyntaxError):
-    """Like a template syntax error, but covers cases where something in the
-    template caused an error at compile time that wasn't necessarily caused
-    by a syntax error.  However it's a direct subclass of
-    :exc:`TemplateSyntaxError` and has the same attributes.
-    """
-
-
-class TemplateRuntimeError(TemplateError):
-    """A generic runtime error in the template engine.  Under some situations
-    Jinja may raise this exception.
-    """
-
-
-class UndefinedError(TemplateRuntimeError):
-    """Raised if a template tries to operate on :class:`Undefined`."""
-
-
-class SecurityError(TemplateRuntimeError):
-    """Raised if a template tries to do something insecure if the
-    sandbox is enabled.
-    """
-
-
-class FilterArgumentError(TemplateRuntimeError):
-    """This error is raised if a filter was called with inappropriate
-    arguments
-    """
diff --git a/third_party/jinja2/ext.py b/third_party/jinja2/ext.py
deleted file mode 100644
index 562ab50..0000000
--- a/third_party/jinja2/ext.py
+++ /dev/null
@@ -1,636 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.ext
-    ~~~~~~~~~~
-
-    Jinja extensions allow to add custom tags similar to the way django custom
-    tags work.  By default two example extensions exist: an i18n and a cache
-    extension.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD.
-"""
-from jinja2 import nodes
-from jinja2.defaults import BLOCK_START_STRING, \
-     BLOCK_END_STRING, VARIABLE_START_STRING, VARIABLE_END_STRING, \
-     COMMENT_START_STRING, COMMENT_END_STRING, LINE_STATEMENT_PREFIX, \
-     LINE_COMMENT_PREFIX, TRIM_BLOCKS, NEWLINE_SEQUENCE, \
-     KEEP_TRAILING_NEWLINE, LSTRIP_BLOCKS
-from jinja2.environment import Environment
-from jinja2.runtime import concat
-from jinja2.exceptions import TemplateAssertionError, TemplateSyntaxError
-from jinja2.utils import contextfunction, import_string, Markup
-from jinja2._compat import with_metaclass, string_types, iteritems
-
-
-# the only real useful gettext functions for a Jinja template.  Note
-# that ugettext must be assigned to gettext as Jinja doesn't support
-# non unicode strings.
-GETTEXT_FUNCTIONS = ('_', 'gettext', 'ngettext')
-
-
-class ExtensionRegistry(type):
-    """Gives the extension an unique identifier."""
-
-    def __new__(cls, name, bases, d):
-        rv = type.__new__(cls, name, bases, d)
-        rv.identifier = rv.__module__ + '.' + rv.__name__
-        return rv
-
-
-class Extension(with_metaclass(ExtensionRegistry, object)):
-    """Extensions can be used to add extra functionality to the Jinja template
-    system at the parser level.  Custom extensions are bound to an environment
-    but may not store environment specific data on `self`.  The reason for
-    this is that an extension can be bound to another environment (for
-    overlays) by creating a copy and reassigning the `environment` attribute.
-
-    As extensions are created by the environment they cannot accept any
-    arguments for configuration.  One may want to work around that by using
-    a factory function, but that is not possible as extensions are identified
-    by their import name.  The correct way to configure the extension is
-    storing the configuration values on the environment.  Because this way the
-    environment ends up acting as central configuration storage the
-    attributes may clash which is why extensions have to ensure that the names
-    they choose for configuration are not too generic.  ``prefix`` for example
-    is a terrible name, ``fragment_cache_prefix`` on the other hand is a good
-    name as includes the name of the extension (fragment cache).
-    """
-
-    #: if this extension parses this is the list of tags it's listening to.
-    tags = set()
-
-    #: the priority of that extension.  This is especially useful for
-    #: extensions that preprocess values.  A lower value means higher
-    #: priority.
-    #:
-    #: .. versionadded:: 2.4
-    priority = 100
-
-    def __init__(self, environment):
-        self.environment = environment
-
-    def bind(self, environment):
-        """Create a copy of this extension bound to another environment."""
-        rv = object.__new__(self.__class__)
-        rv.__dict__.update(self.__dict__)
-        rv.environment = environment
-        return rv
-
-    def preprocess(self, source, name, filename=None):
-        """This method is called before the actual lexing and can be used to
-        preprocess the source.  The `filename` is optional.  The return value
-        must be the preprocessed source.
-        """
-        return source
-
-    def filter_stream(self, stream):
-        """It's passed a :class:`~jinja2.lexer.TokenStream` that can be used
-        to filter tokens returned.  This method has to return an iterable of
-        :class:`~jinja2.lexer.Token`\s, but it doesn't have to return a
-        :class:`~jinja2.lexer.TokenStream`.
-
-        In the `ext` folder of the Jinja2 source distribution there is a file
-        called `inlinegettext.py` which implements a filter that utilizes this
-        method.
-        """
-        return stream
-
-    def parse(self, parser):
-        """If any of the :attr:`tags` matched this method is called with the
-        parser as first argument.  The token the parser stream is pointing at
-        is the name token that matched.  This method has to return one or a
-        list of multiple nodes.
-        """
-        raise NotImplementedError()
-
-    def attr(self, name, lineno=None):
-        """Return an attribute node for the current extension.  This is useful
-        to pass constants on extensions to generated template code.
-
-        ::
-
-            self.attr('_my_attribute', lineno=lineno)
-        """
-        return nodes.ExtensionAttribute(self.identifier, name, lineno=lineno)
-
-    def call_method(self, name, args=None, kwargs=None, dyn_args=None,
-                    dyn_kwargs=None, lineno=None):
-        """Call a method of the extension.  This is a shortcut for
-        :meth:`attr` + :class:`jinja2.nodes.Call`.
-        """
-        if args is None:
-            args = []
-        if kwargs is None:
-            kwargs = []
-        return nodes.Call(self.attr(name, lineno=lineno), args, kwargs,
-                          dyn_args, dyn_kwargs, lineno=lineno)
-
-
-@contextfunction
-def _gettext_alias(__context, *args, **kwargs):
-    return __context.call(__context.resolve('gettext'), *args, **kwargs)
-
-
-def _make_new_gettext(func):
-    @contextfunction
-    def gettext(__context, __string, **variables):
-        rv = __context.call(func, __string)
-        if __context.eval_ctx.autoescape:
-            rv = Markup(rv)
-        return rv % variables
-    return gettext
-
-
-def _make_new_ngettext(func):
-    @contextfunction
-    def ngettext(__context, __singular, __plural, __num, **variables):
-        variables.setdefault('num', __num)
-        rv = __context.call(func, __singular, __plural, __num)
-        if __context.eval_ctx.autoescape:
-            rv = Markup(rv)
-        return rv % variables
-    return ngettext
-
-
-class InternationalizationExtension(Extension):
-    """This extension adds gettext support to Jinja2."""
-    tags = set(['trans'])
-
-    # TODO: the i18n extension is currently reevaluating values in a few
-    # situations.  Take this example:
-    #   {% trans count=something() %}{{ count }} foo{% pluralize
-    #     %}{{ count }} fooss{% endtrans %}
-    # something is called twice here.  One time for the gettext value and
-    # the other time for the n-parameter of the ngettext function.
-
-    def __init__(self, environment):
-        Extension.__init__(self, environment)
-        environment.globals['_'] = _gettext_alias
-        environment.extend(
-            install_gettext_translations=self._install,
-            install_null_translations=self._install_null,
-            install_gettext_callables=self._install_callables,
-            uninstall_gettext_translations=self._uninstall,
-            extract_translations=self._extract,
-            newstyle_gettext=False
-        )
-
-    def _install(self, translations, newstyle=None):
-        gettext = getattr(translations, 'ugettext', None)
-        if gettext is None:
-            gettext = translations.gettext
-        ngettext = getattr(translations, 'ungettext', None)
-        if ngettext is None:
-            ngettext = translations.ngettext
-        self._install_callables(gettext, ngettext, newstyle)
-
-    def _install_null(self, newstyle=None):
-        self._install_callables(
-            lambda x: x,
-            lambda s, p, n: (n != 1 and (p,) or (s,))[0],
-            newstyle
-        )
-
-    def _install_callables(self, gettext, ngettext, newstyle=None):
-        if newstyle is not None:
-            self.environment.newstyle_gettext = newstyle
-        if self.environment.newstyle_gettext:
-            gettext = _make_new_gettext(gettext)
-            ngettext = _make_new_ngettext(ngettext)
-        self.environment.globals.update(
-            gettext=gettext,
-            ngettext=ngettext
-        )
-
-    def _uninstall(self, translations):
-        for key in 'gettext', 'ngettext':
-            self.environment.globals.pop(key, None)
-
-    def _extract(self, source, gettext_functions=GETTEXT_FUNCTIONS):
-        if isinstance(source, string_types):
-            source = self.environment.parse(source)
-        return extract_from_ast(source, gettext_functions)
-
-    def parse(self, parser):
-        """Parse a translatable tag."""
-        lineno = next(parser.stream).lineno
-        num_called_num = False
-
-        # find all the variables referenced.  Additionally a variable can be
-        # defined in the body of the trans block too, but this is checked at
-        # a later state.
-        plural_expr = None
-        plural_expr_assignment = None
-        variables = {}
-        while parser.stream.current.type != 'block_end':
-            if variables:
-                parser.stream.expect('comma')
-
-            # skip colon for python compatibility
-            if parser.stream.skip_if('colon'):
-                break
-
-            name = parser.stream.expect('name')
-            if name.value in variables:
-                parser.fail('translatable variable %r defined twice.' %
-                            name.value, name.lineno,
-                            exc=TemplateAssertionError)
-
-            # expressions
-            if parser.stream.current.type == 'assign':
-                next(parser.stream)
-                variables[name.value] = var = parser.parse_expression()
-            else:
-                variables[name.value] = var = nodes.Name(name.value, 'load')
-
-            if plural_expr is None:
-                if isinstance(var, nodes.Call):
-                    plural_expr = nodes.Name('_trans', 'load')
-                    variables[name.value] = plural_expr
-                    plural_expr_assignment = nodes.Assign(
-                        nodes.Name('_trans', 'store'), var)
-                else:
-                    plural_expr = var
-                num_called_num = name.value == 'num'
-
-        parser.stream.expect('block_end')
-
-        plural = plural_names = None
-        have_plural = False
-        referenced = set()
-
-        # now parse until endtrans or pluralize
-        singular_names, singular = self._parse_block(parser, True)
-        if singular_names:
-            referenced.update(singular_names)
-            if plural_expr is None:
-                plural_expr = nodes.Name(singular_names[0], 'load')
-                num_called_num = singular_names[0] == 'num'
-
-        # if we have a pluralize block, we parse that too
-        if parser.stream.current.test('name:pluralize'):
-            have_plural = True
-            next(parser.stream)
-            if parser.stream.current.type != 'block_end':
-                name = parser.stream.expect('name')
-                if name.value not in variables:
-                    parser.fail('unknown variable %r for pluralization' %
-                                name.value, name.lineno,
-                                exc=TemplateAssertionError)
-                plural_expr = variables[name.value]
-                num_called_num = name.value == 'num'
-            parser.stream.expect('block_end')
-            plural_names, plural = self._parse_block(parser, False)
-            next(parser.stream)
-            referenced.update(plural_names)
-        else:
-            next(parser.stream)
-
-        # register free names as simple name expressions
-        for var in referenced:
-            if var not in variables:
-                variables[var] = nodes.Name(var, 'load')
-
-        if not have_plural:
-            plural_expr = None
-        elif plural_expr is None:
-            parser.fail('pluralize without variables', lineno)
-
-        node = self._make_node(singular, plural, variables, plural_expr,
-                               bool(referenced),
-                               num_called_num and have_plural)
-        node.set_lineno(lineno)
-        if plural_expr_assignment is not None:
-            return [plural_expr_assignment, node]
-        else:
-            return node
-
-    def _parse_block(self, parser, allow_pluralize):
-        """Parse until the next block tag with a given name."""
-        referenced = []
-        buf = []
-        while 1:
-            if parser.stream.current.type == 'data':
-                buf.append(parser.stream.current.value.replace('%', '%%'))
-                next(parser.stream)
-            elif parser.stream.current.type == 'variable_begin':
-                next(parser.stream)
-                name = parser.stream.expect('name').value
-                referenced.append(name)
-                buf.append('%%(%s)s' % name)
-                parser.stream.expect('variable_end')
-            elif parser.stream.current.type == 'block_begin':
-                next(parser.stream)
-                if parser.stream.current.test('name:endtrans'):
-                    break
-                elif parser.stream.current.test('name:pluralize'):
-                    if allow_pluralize:
-                        break
-                    parser.fail('a translatable section can have only one '
-                                'pluralize section')
-                parser.fail('control structures in translatable sections are '
-                            'not allowed')
-            elif parser.stream.eos:
-                parser.fail('unclosed translation block')
-            else:
-                assert False, 'internal parser error'
-
-        return referenced, concat(buf)
-
-    def _make_node(self, singular, plural, variables, plural_expr,
-                   vars_referenced, num_called_num):
-        """Generates a useful node from the data provided."""
-        # no variables referenced?  no need to escape for old style
-        # gettext invocations only if there are vars.
-        if not vars_referenced and not self.environment.newstyle_gettext:
-            singular = singular.replace('%%', '%')
-            if plural:
-                plural = plural.replace('%%', '%')
-
-        # singular only:
-        if plural_expr is None:
-            gettext = nodes.Name('gettext', 'load')
-            node = nodes.Call(gettext, [nodes.Const(singular)],
-                              [], None, None)
-
-        # singular and plural
-        else:
-            ngettext = nodes.Name('ngettext', 'load')
-            node = nodes.Call(ngettext, [
-                nodes.Const(singular),
-                nodes.Const(plural),
-                plural_expr
-            ], [], None, None)
-
-        # in case newstyle gettext is used, the method is powerful
-        # enough to handle the variable expansion and autoescape
-        # handling itself
-        if self.environment.newstyle_gettext:
-            for key, value in iteritems(variables):
-                # the function adds that later anyways in case num was
-                # called num, so just skip it.
-                if num_called_num and key == 'num':
-                    continue
-                node.kwargs.append(nodes.Keyword(key, value))
-
-        # otherwise do that here
-        else:
-            # mark the return value as safe if we are in an
-            # environment with autoescaping turned on
-            node = nodes.MarkSafeIfAutoescape(node)
-            if variables:
-                node = nodes.Mod(node, nodes.Dict([
-                    nodes.Pair(nodes.Const(key), value)
-                    for key, value in variables.items()
-                ]))
-        return nodes.Output([node])
-
-
-class ExprStmtExtension(Extension):
-    """Adds a `do` tag to Jinja2 that works like the print statement just
-    that it doesn't print the return value.
-    """
-    tags = set(['do'])
-
-    def parse(self, parser):
-        node = nodes.ExprStmt(lineno=next(parser.stream).lineno)
-        node.node = parser.parse_tuple()
-        return node
-
-
-class LoopControlExtension(Extension):
-    """Adds break and continue to the template engine."""
-    tags = set(['break', 'continue'])
-
-    def parse(self, parser):
-        token = next(parser.stream)
-        if token.value == 'break':
-            return nodes.Break(lineno=token.lineno)
-        return nodes.Continue(lineno=token.lineno)
-
-
-class WithExtension(Extension):
-    """Adds support for a django-like with block."""
-    tags = set(['with'])
-
-    def parse(self, parser):
-        node = nodes.Scope(lineno=next(parser.stream).lineno)
-        assignments = []
-        while parser.stream.current.type != 'block_end':
-            lineno = parser.stream.current.lineno
-            if assignments:
-                parser.stream.expect('comma')
-            target = parser.parse_assign_target()
-            parser.stream.expect('assign')
-            expr = parser.parse_expression()
-            assignments.append(nodes.Assign(target, expr, lineno=lineno))
-        node.body = assignments + \
-            list(parser.parse_statements(('name:endwith',),
-                                         drop_needle=True))
-        return node
-
-
-class AutoEscapeExtension(Extension):
-    """Changes auto escape rules for a scope."""
-    tags = set(['autoescape'])
-
-    def parse(self, parser):
-        node = nodes.ScopedEvalContextModifier(lineno=next(parser.stream).lineno)
-        node.options = [
-            nodes.Keyword('autoescape', parser.parse_expression())
-        ]
-        node.body = parser.parse_statements(('name:endautoescape',),
-                                            drop_needle=True)
-        return nodes.Scope([node])
-
-
-def extract_from_ast(node, gettext_functions=GETTEXT_FUNCTIONS,
-                     babel_style=True):
-    """Extract localizable strings from the given template node.  Per
-    default this function returns matches in babel style that means non string
-    parameters as well as keyword arguments are returned as `None`.  This
-    allows Babel to figure out what you really meant if you are using
-    gettext functions that allow keyword arguments for placeholder expansion.
-    If you don't want that behavior set the `babel_style` parameter to `False`
-    which causes only strings to be returned and parameters are always stored
-    in tuples.  As a consequence invalid gettext calls (calls without a single
-    string parameter or string parameters after non-string parameters) are
-    skipped.
-
-    This example explains the behavior:
-
-    >>> from jinja2 import Environment
-    >>> env = Environment()
-    >>> node = env.parse('{{ (_("foo"), _(), ngettext("foo", "bar", 42)) }}')
-    >>> list(extract_from_ast(node))
-    [(1, '_', 'foo'), (1, '_', ()), (1, 'ngettext', ('foo', 'bar', None))]
-    >>> list(extract_from_ast(node, babel_style=False))
-    [(1, '_', ('foo',)), (1, 'ngettext', ('foo', 'bar'))]
-
-    For every string found this function yields a ``(lineno, function,
-    message)`` tuple, where:
-
-    * ``lineno`` is the number of the line on which the string was found,
-    * ``function`` is the name of the ``gettext`` function used (if the
-      string was extracted from embedded Python code), and
-    *  ``message`` is the string itself (a ``unicode`` object, or a tuple
-       of ``unicode`` objects for functions with multiple string arguments).
-
-    This extraction function operates on the AST and is because of that unable
-    to extract any comments.  For comment support you have to use the babel
-    extraction interface or extract comments yourself.
-    """
-    for node in node.find_all(nodes.Call):
-        if not isinstance(node.node, nodes.Name) or \
-           node.node.name not in gettext_functions:
-            continue
-
-        strings = []
-        for arg in node.args:
-            if isinstance(arg, nodes.Const) and \
-               isinstance(arg.value, string_types):
-                strings.append(arg.value)
-            else:
-                strings.append(None)
-
-        for arg in node.kwargs:
-            strings.append(None)
-        if node.dyn_args is not None:
-            strings.append(None)
-        if node.dyn_kwargs is not None:
-            strings.append(None)
-
-        if not babel_style:
-            strings = tuple(x for x in strings if x is not None)
-            if not strings:
-                continue
-        else:
-            if len(strings) == 1:
-                strings = strings[0]
-            else:
-                strings = tuple(strings)
-        yield node.lineno, node.node.name, strings
-
-
-class _CommentFinder(object):
-    """Helper class to find comments in a token stream.  Can only
-    find comments for gettext calls forwards.  Once the comment
-    from line 4 is found, a comment for line 1 will not return a
-    usable value.
-    """
-
-    def __init__(self, tokens, comment_tags):
-        self.tokens = tokens
-        self.comment_tags = comment_tags
-        self.offset = 0
-        self.last_lineno = 0
-
-    def find_backwards(self, offset):
-        try:
-            for _, token_type, token_value in \
-                    reversed(self.tokens[self.offset:offset]):
-                if token_type in ('comment', 'linecomment'):
-                    try:
-                        prefix, comment = token_value.split(None, 1)
-                    except ValueError:
-                        continue
-                    if prefix in self.comment_tags:
-                        return [comment.rstrip()]
-            return []
-        finally:
-            self.offset = offset
-
-    def find_comments(self, lineno):
-        if not self.comment_tags or self.last_lineno > lineno:
-            return []
-        for idx, (token_lineno, _, _) in enumerate(self.tokens[self.offset:]):
-            if token_lineno > lineno:
-                return self.find_backwards(self.offset + idx)
-        return self.find_backwards(len(self.tokens))
-
-
-def babel_extract(fileobj, keywords, comment_tags, options):
-    """Babel extraction method for Jinja templates.
-
-    .. versionchanged:: 2.3
-       Basic support for translation comments was added.  If `comment_tags`
-       is now set to a list of keywords for extraction, the extractor will
-       try to find the best preceeding comment that begins with one of the
-       keywords.  For best results, make sure to not have more than one
-       gettext call in one line of code and the matching comment in the
-       same line or the line before.
-
-    .. versionchanged:: 2.5.1
-       The `newstyle_gettext` flag can be set to `True` to enable newstyle
-       gettext calls.
-
-    .. versionchanged:: 2.7
-       A `silent` option can now be provided.  If set to `False` template
-       syntax errors are propagated instead of being ignored.
-
-    :param fileobj: the file-like object the messages should be extracted from
-    :param keywords: a list of keywords (i.e. function names) that should be
-                     recognized as translation functions
-    :param comment_tags: a list of translator tags to search for and include
-                         in the results.
-    :param options: a dictionary of additional options (optional)
-    :return: an iterator over ``(lineno, funcname, message, comments)`` tuples.
-             (comments will be empty currently)
-    """
-    extensions = set()
-    for extension in options.get('extensions', '').split(','):
-        extension = extension.strip()
-        if not extension:
-            continue
-        extensions.add(import_string(extension))
-    if InternationalizationExtension not in extensions:
-        extensions.add(InternationalizationExtension)
-
-    def getbool(options, key, default=False):
-        return options.get(key, str(default)).lower() in \
-            ('1', 'on', 'yes', 'true')
-
-    silent = getbool(options, 'silent', True)
-    environment = Environment(
-        options.get('block_start_string', BLOCK_START_STRING),
-        options.get('block_end_string', BLOCK_END_STRING),
-        options.get('variable_start_string', VARIABLE_START_STRING),
-        options.get('variable_end_string', VARIABLE_END_STRING),
-        options.get('comment_start_string', COMMENT_START_STRING),
-        options.get('comment_end_string', COMMENT_END_STRING),
-        options.get('line_statement_prefix') or LINE_STATEMENT_PREFIX,
-        options.get('line_comment_prefix') or LINE_COMMENT_PREFIX,
-        getbool(options, 'trim_blocks', TRIM_BLOCKS),
-        getbool(options, 'lstrip_blocks', LSTRIP_BLOCKS),
-        NEWLINE_SEQUENCE,
-        getbool(options, 'keep_trailing_newline', KEEP_TRAILING_NEWLINE),
-        frozenset(extensions),
-        cache_size=0,
-        auto_reload=False
-    )
-
-    if getbool(options, 'newstyle_gettext'):
-        environment.newstyle_gettext = True
-
-    source = fileobj.read().decode(options.get('encoding', 'utf-8'))
-    try:
-        node = environment.parse(source)
-        tokens = list(environment.lex(environment.preprocess(source)))
-    except TemplateSyntaxError as e:
-        if not silent:
-            raise
-        # skip templates with syntax errors
-        return
-
-    finder = _CommentFinder(tokens, comment_tags)
-    for lineno, func, message in extract_from_ast(node, keywords):
-        yield lineno, func, message, finder.find_comments(lineno)
-
-
-#: nicer import names
-i18n = InternationalizationExtension
-do = ExprStmtExtension
-loopcontrols = LoopControlExtension
-with_ = WithExtension
-autoescape = AutoEscapeExtension
diff --git a/third_party/jinja2/filters.py b/third_party/jinja2/filters.py
deleted file mode 100644
index e5c7a1a..0000000
--- a/third_party/jinja2/filters.py
+++ /dev/null
@@ -1,996 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.filters
-    ~~~~~~~~~~~~~~
-
-    Bundled jinja filters.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import re
-import math
-
-from random import choice
-from operator import itemgetter
-from itertools import groupby
-from jinja2.utils import Markup, escape, pformat, urlize, soft_unicode, \
-     unicode_urlencode
-from jinja2.runtime import Undefined
-from jinja2.exceptions import FilterArgumentError
-from jinja2._compat import imap, string_types, text_type, iteritems
-
-
-_word_re = re.compile(r'\w+(?u)')
-
-
-def contextfilter(f):
-    """Decorator for marking context dependent filters. The current
-    :class:`Context` will be passed as first argument.
-    """
-    f.contextfilter = True
-    return f
-
-
-def evalcontextfilter(f):
-    """Decorator for marking eval-context dependent filters.  An eval
-    context object is passed as first argument.  For more information
-    about the eval context, see :ref:`eval-context`.
-
-    .. versionadded:: 2.4
-    """
-    f.evalcontextfilter = True
-    return f
-
-
-def environmentfilter(f):
-    """Decorator for marking evironment dependent filters.  The current
-    :class:`Environment` is passed to the filter as first argument.
-    """
-    f.environmentfilter = True
-    return f
-
-
-def make_attrgetter(environment, attribute):
-    """Returns a callable that looks up the given attribute from a
-    passed object with the rules of the environment.  Dots are allowed
-    to access attributes of attributes.  Integer parts in paths are
-    looked up as integers.
-    """
-    if not isinstance(attribute, string_types) \
-       or ('.' not in attribute and not attribute.isdigit()):
-        return lambda x: environment.getitem(x, attribute)
-    attribute = attribute.split('.')
-    def attrgetter(item):
-        for part in attribute:
-            if part.isdigit():
-                part = int(part)
-            item = environment.getitem(item, part)
-        return item
-    return attrgetter
-
-
-def do_forceescape(value):
-    """Enforce HTML escaping.  This will probably double escape variables."""
-    if hasattr(value, '__html__'):
-        value = value.__html__()
-    return escape(text_type(value))
-
-
-def do_urlencode(value):
-    """Escape strings for use in URLs (uses UTF-8 encoding).  It accepts both
-    dictionaries and regular strings as well as pairwise iterables.
-
-    .. versionadded:: 2.7
-    """
-    itemiter = None
-    if isinstance(value, dict):
-        itemiter = iteritems(value)
-    elif not isinstance(value, string_types):
-        try:
-            itemiter = iter(value)
-        except TypeError:
-            pass
-    if itemiter is None:
-        return unicode_urlencode(value)
-    return u'&'.join(unicode_urlencode(k) + '=' +
-                     unicode_urlencode(v, for_qs=True)
-                     for k, v in itemiter)
-
-
-@evalcontextfilter
-def do_replace(eval_ctx, s, old, new, count=None):
-    """Return a copy of the value with all occurrences of a substring
-    replaced with a new one. The first argument is the substring
-    that should be replaced, the second is the replacement string.
-    If the optional third argument ``count`` is given, only the first
-    ``count`` occurrences are replaced:
-
-    .. sourcecode:: jinja
-
-        {{ "Hello World"|replace("Hello", "Goodbye") }}
-            -> Goodbye World
-
-        {{ "aaaaargh"|replace("a", "d'oh, ", 2) }}
-            -> d'oh, d'oh, aaargh
-    """
-    if count is None:
-        count = -1
-    if not eval_ctx.autoescape:
-        return text_type(s).replace(text_type(old), text_type(new), count)
-    if hasattr(old, '__html__') or hasattr(new, '__html__') and \
-       not hasattr(s, '__html__'):
-        s = escape(s)
-    else:
-        s = soft_unicode(s)
-    return s.replace(soft_unicode(old), soft_unicode(new), count)
-
-
-def do_upper(s):
-    """Convert a value to uppercase."""
-    return soft_unicode(s).upper()
-
-
-def do_lower(s):
-    """Convert a value to lowercase."""
-    return soft_unicode(s).lower()
-
-
-@evalcontextfilter
-def do_xmlattr(_eval_ctx, d, autospace=True):
-    """Create an SGML/XML attribute string based on the items in a dict.
-    All values that are neither `none` nor `undefined` are automatically
-    escaped:
-
-    .. sourcecode:: html+jinja
-
-        <ul{{ {'class': 'my_list', 'missing': none,
-                'id': 'list-%d'|format(variable)}|xmlattr }}>
-        ...
-        </ul>
-
-    Results in something like this:
-
-    .. sourcecode:: html
-
-        <ul class="my_list" id="list-42">
-        ...
-        </ul>
-
-    As you can see it automatically prepends a space in front of the item
-    if the filter returned something unless the second parameter is false.
-    """
-    rv = u' '.join(
-        u'%s="%s"' % (escape(key), escape(value))
-        for key, value in iteritems(d)
-        if value is not None and not isinstance(value, Undefined)
-    )
-    if autospace and rv:
-        rv = u' ' + rv
-    if _eval_ctx.autoescape:
-        rv = Markup(rv)
-    return rv
-
-
-def do_capitalize(s):
-    """Capitalize a value. The first character will be uppercase, all others
-    lowercase.
-    """
-    return soft_unicode(s).capitalize()
-
-
-def do_title(s):
-    """Return a titlecased version of the value. I.e. words will start with
-    uppercase letters, all remaining characters are lowercase.
-    """
-    rv = []
-    for item in re.compile(r'([-\s]+)(?u)').split(soft_unicode(s)):
-        if not item:
-            continue
-        rv.append(item[0].upper() + item[1:].lower())
-    return ''.join(rv)
-
-
-def do_dictsort(value, case_sensitive=False, by='key'):
-    """Sort a dict and yield (key, value) pairs. Because python dicts are
-    unsorted you may want to use this function to order them by either
-    key or value:
-
-    .. sourcecode:: jinja
-
-        {% for item in mydict|dictsort %}
-            sort the dict by key, case insensitive
-
-        {% for item in mydict|dictsort(true) %}
-            sort the dict by key, case sensitive
-
-        {% for item in mydict|dictsort(false, 'value') %}
-            sort the dict by value, case insensitive
-    """
-    if by == 'key':
-        pos = 0
-    elif by == 'value':
-        pos = 1
-    else:
-        raise FilterArgumentError('You can only sort by either '
-                                  '"key" or "value"')
-    def sort_func(item):
-        value = item[pos]
-        if isinstance(value, string_types) and not case_sensitive:
-            value = value.lower()
-        return value
-
-    return sorted(value.items(), key=sort_func)
-
-
-@environmentfilter
-def do_sort(environment, value, reverse=False, case_sensitive=False,
-            attribute=None):
-    """Sort an iterable.  Per default it sorts ascending, if you pass it
-    true as first argument it will reverse the sorting.
-
-    If the iterable is made of strings the third parameter can be used to
-    control the case sensitiveness of the comparison which is disabled by
-    default.
-
-    .. sourcecode:: jinja
-
-        {% for item in iterable|sort %}
-            ...
-        {% endfor %}
-
-    It is also possible to sort by an attribute (for example to sort
-    by the date of an object) by specifying the `attribute` parameter:
-
-    .. sourcecode:: jinja
-
-        {% for item in iterable|sort(attribute='date') %}
-            ...
-        {% endfor %}
-
-    .. versionchanged:: 2.6
-       The `attribute` parameter was added.
-    """
-    if not case_sensitive:
-        def sort_func(item):
-            if isinstance(item, string_types):
-                item = item.lower()
-            return item
-    else:
-        sort_func = None
-    if attribute is not None:
-        getter = make_attrgetter(environment, attribute)
-        def sort_func(item, processor=sort_func or (lambda x: x)):
-            return processor(getter(item))
-    return sorted(value, key=sort_func, reverse=reverse)
-
-
-def do_default(value, default_value=u'', boolean=False):
-    """If the value is undefined it will return the passed default value,
-    otherwise the value of the variable:
-
-    .. sourcecode:: jinja
-
-        {{ my_variable|default('my_variable is not defined') }}
-
-    This will output the value of ``my_variable`` if the variable was
-    defined, otherwise ``'my_variable is not defined'``. If you want
-    to use default with variables that evaluate to false you have to
-    set the second parameter to `true`:
-
-    .. sourcecode:: jinja
-
-        {{ ''|default('the string was empty', true) }}
-    """
-    if isinstance(value, Undefined) or (boolean and not value):
-        return default_value
-    return value
-
-
-@evalcontextfilter
-def do_join(eval_ctx, value, d=u'', attribute=None):
-    """Return a string which is the concatenation of the strings in the
-    sequence. The separator between elements is an empty string per
-    default, you can define it with the optional parameter:
-
-    .. sourcecode:: jinja
-
-        {{ [1, 2, 3]|join('|') }}
-            -> 1|2|3
-
-        {{ [1, 2, 3]|join }}
-            -> 123
-
-    It is also possible to join certain attributes of an object:
-
-    .. sourcecode:: jinja
-
-        {{ users|join(', ', attribute='username') }}
-
-    .. versionadded:: 2.6
-       The `attribute` parameter was added.
-    """
-    if attribute is not None:
-        value = imap(make_attrgetter(eval_ctx.environment, attribute), value)
-
-    # no automatic escaping?  joining is a lot eaiser then
-    if not eval_ctx.autoescape:
-        return text_type(d).join(imap(text_type, value))
-
-    # if the delimiter doesn't have an html representation we check
-    # if any of the items has.  If yes we do a coercion to Markup
-    if not hasattr(d, '__html__'):
-        value = list(value)
-        do_escape = False
-        for idx, item in enumerate(value):
-            if hasattr(item, '__html__'):
-                do_escape = True
-            else:
-                value[idx] = text_type(item)
-        if do_escape:
-            d = escape(d)
-        else:
-            d = text_type(d)
-        return d.join(value)
-
-    # no html involved, to normal joining
-    return soft_unicode(d).join(imap(soft_unicode, value))
-
-
-def do_center(value, width=80):
-    """Centers the value in a field of a given width."""
-    return text_type(value).center(width)
-
-
-@environmentfilter
-def do_first(environment, seq):
-    """Return the first item of a sequence."""
-    try:
-        return next(iter(seq))
-    except StopIteration:
-        return environment.undefined('No first item, sequence was empty.')
-
-
-@environmentfilter
-def do_last(environment, seq):
-    """Return the last item of a sequence."""
-    try:
-        return next(iter(reversed(seq)))
-    except StopIteration:
-        return environment.undefined('No last item, sequence was empty.')
-
-
-@environmentfilter
-def do_random(environment, seq):
-    """Return a random item from the sequence."""
-    try:
-        return choice(seq)
-    except IndexError:
-        return environment.undefined('No random item, sequence was empty.')
-
-
-def do_filesizeformat(value, binary=False):
-    """Format the value like a 'human-readable' file size (i.e. 13 kB,
-    4.1 MB, 102 Bytes, etc).  Per default decimal prefixes are used (Mega,
-    Giga, etc.), if the second parameter is set to `True` the binary
-    prefixes are used (Mebi, Gibi).
-    """
-    bytes = float(value)
-    base = binary and 1024 or 1000
-    prefixes = [
-        (binary and 'KiB' or 'kB'),
-        (binary and 'MiB' or 'MB'),
-        (binary and 'GiB' or 'GB'),
-        (binary and 'TiB' or 'TB'),
-        (binary and 'PiB' or 'PB'),
-        (binary and 'EiB' or 'EB'),
-        (binary and 'ZiB' or 'ZB'),
-        (binary and 'YiB' or 'YB')
-    ]
-    if bytes == 1:
-        return '1 Byte'
-    elif bytes < base:
-        return '%d Bytes' % bytes
-    else:
-        for i, prefix in enumerate(prefixes):
-            unit = base ** (i + 2)
-            if bytes < unit:
-                return '%.1f %s' % ((base * bytes / unit), prefix)
-        return '%.1f %s' % ((base * bytes / unit), prefix)
-
-
-def do_pprint(value, verbose=False):
-    """Pretty print a variable. Useful for debugging.
-
-    With Jinja 1.2 onwards you can pass it a parameter.  If this parameter
-    is truthy the output will be more verbose (this requires `pretty`)
-    """
-    return pformat(value, verbose=verbose)
-
-
-@evalcontextfilter
-def do_urlize(eval_ctx, value, trim_url_limit=None, nofollow=False,
-              target=None):
-    """Converts URLs in plain text into clickable links.
-
-    If you pass the filter an additional integer it will shorten the urls
-    to that number. Also a third argument exists that makes the urls
-    "nofollow":
-
-    .. sourcecode:: jinja
-
-        {{ mytext|urlize(40, true) }}
-            links are shortened to 40 chars and defined with rel="nofollow"
-
-    If *target* is specified, the ``target`` attribute will be added to the
-    ``<a>`` tag:
-
-    .. sourcecode:: jinja
-
-       {{ mytext|urlize(40, target='_blank') }}
-
-    .. versionchanged:: 2.8+
-       The *target* parameter was added.
-    """
-    rv = urlize(value, trim_url_limit, nofollow, target)
-    if eval_ctx.autoescape:
-        rv = Markup(rv)
-    return rv
-
-
-def do_indent(s, width=4, indentfirst=False):
-    """Return a copy of the passed string, each line indented by
-    4 spaces. The first line is not indented. If you want to
-    change the number of spaces or indent the first line too
-    you can pass additional parameters to the filter:
-
-    .. sourcecode:: jinja
-
-        {{ mytext|indent(2, true) }}
-            indent by two spaces and indent the first line too.
-    """
-    indention = u' ' * width
-    rv = (u'\n' + indention).join(s.splitlines())
-    if indentfirst:
-        rv = indention + rv
-    return rv
-
-
-def do_truncate(s, length=255, killwords=False, end='...'):
-    """Return a truncated copy of the string. The length is specified
-    with the first parameter which defaults to ``255``. If the second
-    parameter is ``true`` the filter will cut the text at length. Otherwise
-    it will discard the last word. If the text was in fact
-    truncated it will append an ellipsis sign (``"..."``). If you want a
-    different ellipsis sign than ``"..."`` you can specify it using the
-    third parameter.
-
-    .. sourcecode:: jinja
-
-        {{ "foo bar baz"|truncate(9) }}
-            -> "foo ..."
-        {{ "foo bar baz"|truncate(9, True) }}
-            -> "foo ba..."
-
-    """
-    if len(s) <= length:
-        return s
-    elif killwords:
-        return s[:length - len(end)] + end
-
-    result = s[:length - len(end)].rsplit(' ', 1)[0]
-    if len(result) < length:
-        result += ' '
-    return result + end
-
-
-@environmentfilter
-def do_wordwrap(environment, s, width=79, break_long_words=True,
-                wrapstring=None):
-    """
-    Return a copy of the string passed to the filter wrapped after
-    ``79`` characters.  You can override this default using the first
-    parameter.  If you set the second parameter to `false` Jinja will not
-    split words apart if they are longer than `width`. By default, the newlines
-    will be the default newlines for the environment, but this can be changed
-    using the wrapstring keyword argument.
-
-    .. versionadded:: 2.7
-       Added support for the `wrapstring` parameter.
-    """
-    if not wrapstring:
-        wrapstring = environment.newline_sequence
-    import textwrap
-    return wrapstring.join(textwrap.wrap(s, width=width, expand_tabs=False,
-                                   replace_whitespace=False,
-                                   break_long_words=break_long_words))
-
-
-def do_wordcount(s):
-    """Count the words in that string."""
-    return len(_word_re.findall(s))
-
-
-def do_int(value, default=0, base=10):
-    """Convert the value into an integer. If the
-    conversion doesn't work it will return ``0``. You can
-    override this default using the first parameter. You
-    can also override the default base (10) in the second
-    parameter, which handles input with prefixes such as
-    0b, 0o and 0x for bases 2, 8 and 16 respectively.
-    """
-    try:
-        return int(value, base)
-    except (TypeError, ValueError):
-        # this quirk is necessary so that "42.23"|int gives 42.
-        try:
-            return int(float(value))
-        except (TypeError, ValueError):
-            return default
-
-
-def do_float(value, default=0.0):
-    """Convert the value into a floating point number. If the
-    conversion doesn't work it will return ``0.0``. You can
-    override this default using the first parameter.
-    """
-    try:
-        return float(value)
-    except (TypeError, ValueError):
-        return default
-
-
-def do_format(value, *args, **kwargs):
-    """
-    Apply python string formatting on an object:
-
-    .. sourcecode:: jinja
-
-        {{ "%s - %s"|format("Hello?", "Foo!") }}
-            -> Hello? - Foo!
-    """
-    if args and kwargs:
-        raise FilterArgumentError('can\'t handle positional and keyword '
-                                  'arguments at the same time')
-    return soft_unicode(value) % (kwargs or args)
-
-
-def do_trim(value):
-    """Strip leading and trailing whitespace."""
-    return soft_unicode(value).strip()
-
-
-def do_striptags(value):
-    """Strip SGML/XML tags and replace adjacent whitespace by one space.
-    """
-    if hasattr(value, '__html__'):
-        value = value.__html__()
-    return Markup(text_type(value)).striptags()
-
-
-def do_slice(value, slices, fill_with=None):
-    """Slice an iterator and return a list of lists containing
-    those items. Useful if you want to create a div containing
-    three ul tags that represent columns:
-
-    .. sourcecode:: html+jinja
-
-        <div class="columwrapper">
-          {%- for column in items|slice(3) %}
-            <ul class="column-{{ loop.index }}">
-            {%- for item in column %}
-              <li>{{ item }}</li>
-            {%- endfor %}
-            </ul>
-          {%- endfor %}
-        </div>
-
-    If you pass it a second argument it's used to fill missing
-    values on the last iteration.
-    """
-    seq = list(value)
-    length = len(seq)
-    items_per_slice = length // slices
-    slices_with_extra = length % slices
-    offset = 0
-    for slice_number in range(slices):
-        start = offset + slice_number * items_per_slice
-        if slice_number < slices_with_extra:
-            offset += 1
-        end = offset + (slice_number + 1) * items_per_slice
-        tmp = seq[start:end]
-        if fill_with is not None and slice_number >= slices_with_extra:
-            tmp.append(fill_with)
-        yield tmp
-
-
-def do_batch(value, linecount, fill_with=None):
-    """
-    A filter that batches items. It works pretty much like `slice`
-    just the other way round. It returns a list of lists with the
-    given number of items. If you provide a second parameter this
-    is used to fill up missing items. See this example:
-
-    .. sourcecode:: html+jinja
-
-        <table>
-        {%- for row in items|batch(3, '&nbsp;') %}
-          <tr>
-          {%- for column in row %}
-            <td>{{ column }}</td>
-          {%- endfor %}
-          </tr>
-        {%- endfor %}
-        </table>
-    """
-    tmp = []
-    for item in value:
-        if len(tmp) == linecount:
-            yield tmp
-            tmp = []
-        tmp.append(item)
-    if tmp:
-        if fill_with is not None and len(tmp) < linecount:
-            tmp += [fill_with] * (linecount - len(tmp))
-        yield tmp
-
-
-def do_round(value, precision=0, method='common'):
-    """Round the number to a given precision. The first
-    parameter specifies the precision (default is ``0``), the
-    second the rounding method:
-
-    - ``'common'`` rounds either up or down
-    - ``'ceil'`` always rounds up
-    - ``'floor'`` always rounds down
-
-    If you don't specify a method ``'common'`` is used.
-
-    .. sourcecode:: jinja
-
-        {{ 42.55|round }}
-            -> 43.0
-        {{ 42.55|round(1, 'floor') }}
-            -> 42.5
-
-    Note that even if rounded to 0 precision, a float is returned.  If
-    you need a real integer, pipe it through `int`:
-
-    .. sourcecode:: jinja
-
-        {{ 42.55|round|int }}
-            -> 43
-    """
-    if not method in ('common', 'ceil', 'floor'):
-        raise FilterArgumentError('method must be common, ceil or floor')
-    if method == 'common':
-        return round(value, precision)
-    func = getattr(math, method)
-    return func(value * (10 ** precision)) / (10 ** precision)
-
-
-@environmentfilter
-def do_groupby(environment, value, attribute):
-    """Group a sequence of objects by a common attribute.
-
-    If you for example have a list of dicts or objects that represent persons
-    with `gender`, `first_name` and `last_name` attributes and you want to
-    group all users by genders you can do something like the following
-    snippet:
-
-    .. sourcecode:: html+jinja
-
-        <ul>
-        {% for group in persons|groupby('gender') %}
-            <li>{{ group.grouper }}<ul>
-            {% for person in group.list %}
-                <li>{{ person.first_name }} {{ person.last_name }}</li>
-            {% endfor %}</ul></li>
-        {% endfor %}
-        </ul>
-
-    Additionally it's possible to use tuple unpacking for the grouper and
-    list:
-
-    .. sourcecode:: html+jinja
-
-        <ul>
-        {% for grouper, list in persons|groupby('gender') %}
-            ...
-        {% endfor %}
-        </ul>
-
-    As you can see the item we're grouping by is stored in the `grouper`
-    attribute and the `list` contains all the objects that have this grouper
-    in common.
-
-    .. versionchanged:: 2.6
-       It's now possible to use dotted notation to group by the child
-       attribute of another attribute.
-    """
-    expr = make_attrgetter(environment, attribute)
-    return sorted(map(_GroupTuple, groupby(sorted(value, key=expr), expr)))
-
-
-class _GroupTuple(tuple):
-    __slots__ = ()
-    grouper = property(itemgetter(0))
-    list = property(itemgetter(1))
-
-    def __new__(cls, xxx_todo_changeme):
-        (key, value) = xxx_todo_changeme
-        return tuple.__new__(cls, (key, list(value)))
-
-
-@environmentfilter
-def do_sum(environment, iterable, attribute=None, start=0):
-    """Returns the sum of a sequence of numbers plus the value of parameter
-    'start' (which defaults to 0).  When the sequence is empty it returns
-    start.
-
-    It is also possible to sum up only certain attributes:
-
-    .. sourcecode:: jinja
-
-        Total: {{ items|sum(attribute='price') }}
-
-    .. versionchanged:: 2.6
-       The `attribute` parameter was added to allow suming up over
-       attributes.  Also the `start` parameter was moved on to the right.
-    """
-    if attribute is not None:
-        iterable = imap(make_attrgetter(environment, attribute), iterable)
-    return sum(iterable, start)
-
-
-def do_list(value):
-    """Convert the value into a list.  If it was a string the returned list
-    will be a list of characters.
-    """
-    return list(value)
-
-
-def do_mark_safe(value):
-    """Mark the value as safe which means that in an environment with automatic
-    escaping enabled this variable will not be escaped.
-    """
-    return Markup(value)
-
-
-def do_mark_unsafe(value):
-    """Mark a value as unsafe.  This is the reverse operation for :func:`safe`."""
-    return text_type(value)
-
-
-def do_reverse(value):
-    """Reverse the object or return an iterator that iterates over it the other
-    way round.
-    """
-    if isinstance(value, string_types):
-        return value[::-1]
-    try:
-        return reversed(value)
-    except TypeError:
-        try:
-            rv = list(value)
-            rv.reverse()
-            return rv
-        except TypeError:
-            raise FilterArgumentError('argument must be iterable')
-
-
-@environmentfilter
-def do_attr(environment, obj, name):
-    """Get an attribute of an object.  ``foo|attr("bar")`` works like
-    ``foo.bar`` just that always an attribute is returned and items are not
-    looked up.
-
-    See :ref:`Notes on subscriptions <notes-on-subscriptions>` for more details.
-    """
-    try:
-        name = str(name)
-    except UnicodeError:
-        pass
-    else:
-        try:
-            value = getattr(obj, name)
-        except AttributeError:
-            pass
-        else:
-            if environment.sandboxed and not \
-               environment.is_safe_attribute(obj, name, value):
-                return environment.unsafe_undefined(obj, name)
-            return value
-    return environment.undefined(obj=obj, name=name)
-
-
-@contextfilter
-def do_map(*args, **kwargs):
-    """Applies a filter on a sequence of objects or looks up an attribute.
-    This is useful when dealing with lists of objects but you are really
-    only interested in a certain value of it.
-
-    The basic usage is mapping on an attribute.  Imagine you have a list
-    of users but you are only interested in a list of usernames:
-
-    .. sourcecode:: jinja
-
-        Users on this page: {{ users|map(attribute='username')|join(', ') }}
-
-    Alternatively you can let it invoke a filter by passing the name of the
-    filter and the arguments afterwards.  A good example would be applying a
-    text conversion filter on a sequence:
-
-    .. sourcecode:: jinja
-
-        Users on this page: {{ titles|map('lower')|join(', ') }}
-
-    .. versionadded:: 2.7
-    """
-    context = args[0]
-    seq = args[1]
-
-    if len(args) == 2 and 'attribute' in kwargs:
-        attribute = kwargs.pop('attribute')
-        if kwargs:
-            raise FilterArgumentError('Unexpected keyword argument %r' %
-                next(iter(kwargs)))
-        func = make_attrgetter(context.environment, attribute)
-    else:
-        try:
-            name = args[2]
-            args = args[3:]
-        except LookupError:
-            raise FilterArgumentError('map requires a filter argument')
-        func = lambda item: context.environment.call_filter(
-            name, item, args, kwargs, context=context)
-
-    if seq:
-        for item in seq:
-            yield func(item)
-
-
-@contextfilter
-def do_select(*args, **kwargs):
-    """Filters a sequence of objects by applying a test to the object and only
-    selecting the ones with the test succeeding.
-
-    Example usage:
-
-    .. sourcecode:: jinja
-
-        {{ numbers|select("odd") }}
-        {{ numbers|select("odd") }}
-
-    .. versionadded:: 2.7
-    """
-    return _select_or_reject(args, kwargs, lambda x: x, False)
-
-
-@contextfilter
-def do_reject(*args, **kwargs):
-    """Filters a sequence of objects by applying a test to the object and
-    rejecting the ones with the test succeeding.
-
-    Example usage:
-
-    .. sourcecode:: jinja
-
-        {{ numbers|reject("odd") }}
-
-    .. versionadded:: 2.7
-    """
-    return _select_or_reject(args, kwargs, lambda x: not x, False)
-
-
-@contextfilter
-def do_selectattr(*args, **kwargs):
-    """Filters a sequence of objects by applying a test to an attribute of an
-    object and only selecting the ones with the test succeeding.
-
-    Example usage:
-
-    .. sourcecode:: jinja
-
-        {{ users|selectattr("is_active") }}
-        {{ users|selectattr("email", "none") }}
-
-    .. versionadded:: 2.7
-    """
-    return _select_or_reject(args, kwargs, lambda x: x, True)
-
-
-@contextfilter
-def do_rejectattr(*args, **kwargs):
-    """Filters a sequence of objects by applying a test to an attribute of an
-    object or the attribute and rejecting the ones with the test succeeding.
-
-    .. sourcecode:: jinja
-
-        {{ users|rejectattr("is_active") }}
-        {{ users|rejectattr("email", "none") }}
-
-    .. versionadded:: 2.7
-    """
-    return _select_or_reject(args, kwargs, lambda x: not x, True)
-
-
-def _select_or_reject(args, kwargs, modfunc, lookup_attr):
-    context = args[0]
-    seq = args[1]
-    if lookup_attr:
-        try:
-            attr = args[2]
-        except LookupError:
-            raise FilterArgumentError('Missing parameter for attribute name')
-        transfunc = make_attrgetter(context.environment, attr)
-        off = 1
-    else:
-        off = 0
-        transfunc = lambda x: x
-
-    try:
-        name = args[2 + off]
-        args = args[3 + off:]
-        func = lambda item: context.environment.call_test(
-            name, item, args, kwargs)
-    except LookupError:
-        func = bool
-
-    if seq:
-        for item in seq:
-            if modfunc(func(transfunc(item))):
-                yield item
-
-
-FILTERS = {
-    'abs':                  abs,
-    'attr':                 do_attr,
-    'batch':                do_batch,
-    'capitalize':           do_capitalize,
-    'center':               do_center,
-    'count':                len,
-    'd':                    do_default,
-    'default':              do_default,
-    'dictsort':             do_dictsort,
-    'e':                    escape,
-    'escape':               escape,
-    'filesizeformat':       do_filesizeformat,
-    'first':                do_first,
-    'float':                do_float,
-    'forceescape':          do_forceescape,
-    'format':               do_format,
-    'groupby':              do_groupby,
-    'indent':               do_indent,
-    'int':                  do_int,
-    'join':                 do_join,
-    'last':                 do_last,
-    'length':               len,
-    'list':                 do_list,
-    'lower':                do_lower,
-    'map':                  do_map,
-    'pprint':               do_pprint,
-    'random':               do_random,
-    'reject':               do_reject,
-    'rejectattr':           do_rejectattr,
-    'replace':              do_replace,
-    'reverse':              do_reverse,
-    'round':                do_round,
-    'safe':                 do_mark_safe,
-    'select':               do_select,
-    'selectattr':           do_selectattr,
-    'slice':                do_slice,
-    'sort':                 do_sort,
-    'string':               soft_unicode,
-    'striptags':            do_striptags,
-    'sum':                  do_sum,
-    'title':                do_title,
-    'trim':                 do_trim,
-    'truncate':             do_truncate,
-    'upper':                do_upper,
-    'urlencode':            do_urlencode,
-    'urlize':               do_urlize,
-    'wordcount':            do_wordcount,
-    'wordwrap':             do_wordwrap,
-    'xmlattr':              do_xmlattr,
-}
diff --git a/third_party/jinja2/get_jinja2.sh b/third_party/jinja2/get_jinja2.sh
deleted file mode 100755
index 0018349..0000000
--- a/third_party/jinja2/get_jinja2.sh
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/bin/bash
-# Download and extract Jinja2
-# Homepage:
-# http://jinja.pocoo.org/
-# Installation instructions:
-# http://jinja.pocoo.org/docs/intro/#from-the-tarball-release
-# Download page:
-# https://pypi.python.org/pypi/Jinja2
-PACKAGE='Jinja2'
-VERSION='2.8'
-SRC_URL='https://pypi.python.org/packages/f2/2f/0b98b06a345a761bec91a079ccae392d282690c2d8272e708f4d10829e22/Jinja2-2.8.tar.gz'
-PACKAGE_DIR='jinja2'
-
-CHROMIUM_FILES="README.chromium OWNERS get_jinja2.sh"
-EXTRA_FILES='LICENSE AUTHORS'
-REMOVE_FILES='testsuite'
-
-FILENAME="$(basename $SRC_URL)"
-MD5_FILENAME="$FILENAME.md5"
-SHA512_FILENAME="$FILENAME.sha512"
-CHROMIUM_FILES+=" $MD5_FILENAME $SHA512_FILENAME"
-
-BUILD_DIR="$PACKAGE-$VERSION"
-THIRD_PARTY="$(dirname $(realpath $(dirname "${BASH_SOURCE[0]}")))"
-INSTALL_DIR="$THIRD_PARTY/$PACKAGE_DIR"
-OUT_DIR="$INSTALL_DIR/$BUILD_DIR/$PACKAGE_DIR"
-OLD_DIR="$THIRD_PARTY/$PACKAGE_DIR.old"
-
-function check_hashes {
-  # Hashes generated via:
-  # FILENAME=Jinja2-2.8.tar.gz
-  # md5sum "$FILENAME" > "$FILENAME.md5"
-  # sha512sum "$FILENAME" > "$FILENAME.sha512"
-  # unset FILENAME
-
-  # MD5
-  if ! [ -f "$MD5_FILENAME" ]
-  then
-    echo "MD5 hash file $MD5_FILENAME not found, could not verify archive"
-    exit 1
-  fi
-
-  # 32-digit hash, followed by filename
-  MD5_HASHFILE_REGEX="^[0-9a-f]{32}  $FILENAME"
-  if ! grep --extended-regex --line-regex --silent \
-    "$MD5_HASHFILE_REGEX" "$MD5_FILENAME"
-  then
-    echo "MD5 hash file $MD5_FILENAME does not contain hash for $FILENAME," \
-         'could not verify archive'
-    echo 'Hash file contents are:'
-    cat "$MD5_FILENAME"
-    exit 1
-  fi
-
-  if ! md5sum --check "$MD5_FILENAME"
-  then
-    echo 'MD5 hash does not match,' \
-         "archive file $FILENAME corrupt or compromised!"
-    exit 1
-  fi
-
-  # SHA-512
-  if ! [ -f "$SHA512_FILENAME" ]
-  then
-    echo "SHA-512 hash file $SHA512_FILENAME not found," \
-         'could not verify archive'
-    exit 1
-  fi
-
-  # 128-digit hash, followed by filename
-  SHA512_HASHFILE_REGEX="^[0-9a-f]{128}  $FILENAME"
-  if ! grep --extended-regex --line-regex --silent \
-    "$SHA512_HASHFILE_REGEX" "$SHA512_FILENAME"
-  then
-    echo "SHA-512 hash file $SHA512_FILENAME does not contain hash for" \
-         "$FILENAME, could not verify archive"
-    echo 'Hash file contents are:'
-    cat "$SHA512_FILENAME"
-    exit 1
-  fi
-
-  if ! sha512sum --check "$SHA512_FILENAME"
-  then
-    echo 'SHA-512 hash does not match,' \
-         "archive file $FILENAME corrupt or compromised!"
-    exit 1
-  fi
-}
-
-
-################################################################################
-# Body
-
-cd "$INSTALL_DIR"
-echo "Downloading $SRC_URL"
-curl --remote-name "$SRC_URL"
-check_hashes
-tar xvzf "$FILENAME"
-# Copy extra files over
-for FILE in $CHROMIUM_FILES
-do
-  cp "$FILE" "$OUT_DIR"
-done
-
-cd "$BUILD_DIR"
-for FILE in $EXTRA_FILES
-do
-  cp "$FILE" "$OUT_DIR"
-done
-
-cd "$OUT_DIR"
-for FILE in $REMOVE_FILES
-do
-  rm -fr "$FILE"
-done
-
-# Replace with new directory
-cd ..
-mv "$INSTALL_DIR" "$OLD_DIR"
-mv "$PACKAGE_DIR" "$INSTALL_DIR"
-cd "$INSTALL_DIR"
-rm -fr "$OLD_DIR"
diff --git a/third_party/jinja2/lexer.py b/third_party/jinja2/lexer.py
deleted file mode 100644
index c8dac21..0000000
--- a/third_party/jinja2/lexer.py
+++ /dev/null
@@ -1,734 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.lexer
-    ~~~~~~~~~~~~
-
-    This module implements a Jinja / Python combination lexer. The
-    `Lexer` class provided by this module is used to do some preprocessing
-    for Jinja.
-
-    On the one hand it filters out invalid operators like the bitshift
-    operators we don't allow in templates. On the other hand it separates
-    template code and python code in expressions.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import re
-
-from operator import itemgetter
-from collections import deque
-from jinja2.exceptions import TemplateSyntaxError
-from jinja2.utils import LRUCache
-from jinja2._compat import iteritems, implements_iterator, text_type, \
-     intern, PY2
-
-
-# cache for the lexers. Exists in order to be able to have multiple
-# environments with the same lexer
-_lexer_cache = LRUCache(50)
-
-# static regular expressions
-whitespace_re = re.compile(r'\s+', re.U)
-string_re = re.compile(r"('([^'\\]*(?:\\.[^'\\]*)*)'"
-                       r'|"([^"\\]*(?:\\.[^"\\]*)*)")', re.S)
-integer_re = re.compile(r'\d+')
-
-# we use the unicode identifier rule if this python version is able
-# to handle unicode identifiers, otherwise the standard ASCII one.
-try:
-    compile('föö', '<unknown>', 'eval')
-except SyntaxError:
-    name_re = re.compile(r'\b[a-zA-Z_][a-zA-Z0-9_]*\b')
-else:
-    from jinja2 import _stringdefs
-    name_re = re.compile(r'[%s][%s]*' % (_stringdefs.xid_start,
-                                         _stringdefs.xid_continue))
-
-float_re = re.compile(r'(?<!\.)\d+\.\d+')
-newline_re = re.compile(r'(\r\n|\r|\n)')
-
-# internal the tokens and keep references to them
-TOKEN_ADD = intern('add')
-TOKEN_ASSIGN = intern('assign')
-TOKEN_COLON = intern('colon')
-TOKEN_COMMA = intern('comma')
-TOKEN_DIV = intern('div')
-TOKEN_DOT = intern('dot')
-TOKEN_EQ = intern('eq')
-TOKEN_FLOORDIV = intern('floordiv')
-TOKEN_GT = intern('gt')
-TOKEN_GTEQ = intern('gteq')
-TOKEN_LBRACE = intern('lbrace')
-TOKEN_LBRACKET = intern('lbracket')
-TOKEN_LPAREN = intern('lparen')
-TOKEN_LT = intern('lt')
-TOKEN_LTEQ = intern('lteq')
-TOKEN_MOD = intern('mod')
-TOKEN_MUL = intern('mul')
-TOKEN_NE = intern('ne')
-TOKEN_PIPE = intern('pipe')
-TOKEN_POW = intern('pow')
-TOKEN_RBRACE = intern('rbrace')
-TOKEN_RBRACKET = intern('rbracket')
-TOKEN_RPAREN = intern('rparen')
-TOKEN_SEMICOLON = intern('semicolon')
-TOKEN_SUB = intern('sub')
-TOKEN_TILDE = intern('tilde')
-TOKEN_WHITESPACE = intern('whitespace')
-TOKEN_FLOAT = intern('float')
-TOKEN_INTEGER = intern('integer')
-TOKEN_NAME = intern('name')
-TOKEN_STRING = intern('string')
-TOKEN_OPERATOR = intern('operator')
-TOKEN_BLOCK_BEGIN = intern('block_begin')
-TOKEN_BLOCK_END = intern('block_end')
-TOKEN_VARIABLE_BEGIN = intern('variable_begin')
-TOKEN_VARIABLE_END = intern('variable_end')
-TOKEN_RAW_BEGIN = intern('raw_begin')
-TOKEN_RAW_END = intern('raw_end')
-TOKEN_COMMENT_BEGIN = intern('comment_begin')
-TOKEN_COMMENT_END = intern('comment_end')
-TOKEN_COMMENT = intern('comment')
-TOKEN_LINESTATEMENT_BEGIN = intern('linestatement_begin')
-TOKEN_LINESTATEMENT_END = intern('linestatement_end')
-TOKEN_LINECOMMENT_BEGIN = intern('linecomment_begin')
-TOKEN_LINECOMMENT_END = intern('linecomment_end')
-TOKEN_LINECOMMENT = intern('linecomment')
-TOKEN_DATA = intern('data')
-TOKEN_INITIAL = intern('initial')
-TOKEN_EOF = intern('eof')
-
-# bind operators to token types
-operators = {
-    '+':            TOKEN_ADD,
-    '-':            TOKEN_SUB,
-    '/':            TOKEN_DIV,
-    '//':           TOKEN_FLOORDIV,
-    '*':            TOKEN_MUL,
-    '%':            TOKEN_MOD,
-    '**':           TOKEN_POW,
-    '~':            TOKEN_TILDE,
-    '[':            TOKEN_LBRACKET,
-    ']':            TOKEN_RBRACKET,
-    '(':            TOKEN_LPAREN,
-    ')':            TOKEN_RPAREN,
-    '{':            TOKEN_LBRACE,
-    '}':            TOKEN_RBRACE,
-    '==':           TOKEN_EQ,
-    '!=':           TOKEN_NE,
-    '>':            TOKEN_GT,
-    '>=':           TOKEN_GTEQ,
-    '<':            TOKEN_LT,
-    '<=':           TOKEN_LTEQ,
-    '=':            TOKEN_ASSIGN,
-    '.':            TOKEN_DOT,
-    ':':            TOKEN_COLON,
-    '|':            TOKEN_PIPE,
-    ',':            TOKEN_COMMA,
-    ';':            TOKEN_SEMICOLON
-}
-
-reverse_operators = dict([(v, k) for k, v in iteritems(operators)])
-assert len(operators) == len(reverse_operators), 'operators dropped'
-operator_re = re.compile('(%s)' % '|'.join(re.escape(x) for x in
-                         sorted(operators, key=lambda x: -len(x))))
-
-ignored_tokens = frozenset([TOKEN_COMMENT_BEGIN, TOKEN_COMMENT,
-                            TOKEN_COMMENT_END, TOKEN_WHITESPACE,
-                            TOKEN_LINECOMMENT_BEGIN, TOKEN_LINECOMMENT_END,
-                            TOKEN_LINECOMMENT])
-ignore_if_empty = frozenset([TOKEN_WHITESPACE, TOKEN_DATA,
-                             TOKEN_COMMENT, TOKEN_LINECOMMENT])
-
-
-def _describe_token_type(token_type):
-    if token_type in reverse_operators:
-        return reverse_operators[token_type]
-    return {
-        TOKEN_COMMENT_BEGIN:        'begin of comment',
-        TOKEN_COMMENT_END:          'end of comment',
-        TOKEN_COMMENT:              'comment',
-        TOKEN_LINECOMMENT:          'comment',
-        TOKEN_BLOCK_BEGIN:          'begin of statement block',
-        TOKEN_BLOCK_END:            'end of statement block',
-        TOKEN_VARIABLE_BEGIN:       'begin of print statement',
-        TOKEN_VARIABLE_END:         'end of print statement',
-        TOKEN_LINESTATEMENT_BEGIN:  'begin of line statement',
-        TOKEN_LINESTATEMENT_END:    'end of line statement',
-        TOKEN_DATA:                 'template data / text',
-        TOKEN_EOF:                  'end of template'
-    }.get(token_type, token_type)
-
-
-def describe_token(token):
-    """Returns a description of the token."""
-    if token.type == 'name':
-        return token.value
-    return _describe_token_type(token.type)
-
-
-def describe_token_expr(expr):
-    """Like `describe_token` but for token expressions."""
-    if ':' in expr:
-        type, value = expr.split(':', 1)
-        if type == 'name':
-            return value
-    else:
-        type = expr
-    return _describe_token_type(type)
-
-
-def count_newlines(value):
-    """Count the number of newline characters in the string.  This is
-    useful for extensions that filter a stream.
-    """
-    return len(newline_re.findall(value))
-
-
-def compile_rules(environment):
-    """Compiles all the rules from the environment into a list of rules."""
-    e = re.escape
-    rules = [
-        (len(environment.comment_start_string), 'comment',
-         e(environment.comment_start_string)),
-        (len(environment.block_start_string), 'block',
-         e(environment.block_start_string)),
-        (len(environment.variable_start_string), 'variable',
-         e(environment.variable_start_string))
-    ]
-
-    if environment.line_statement_prefix is not None:
-        rules.append((len(environment.line_statement_prefix), 'linestatement',
-                      r'^[ \t\v]*' + e(environment.line_statement_prefix)))
-    if environment.line_comment_prefix is not None:
-        rules.append((len(environment.line_comment_prefix), 'linecomment',
-                      r'(?:^|(?<=\S))[^\S\r\n]*' +
-                      e(environment.line_comment_prefix)))
-
-    return [x[1:] for x in sorted(rules, reverse=True)]
-
-
-class Failure(object):
-    """Class that raises a `TemplateSyntaxError` if called.
-    Used by the `Lexer` to specify known errors.
-    """
-
-    def __init__(self, message, cls=TemplateSyntaxError):
-        self.message = message
-        self.error_class = cls
-
-    def __call__(self, lineno, filename):
-        raise self.error_class(self.message, lineno, filename)
-
-
-class Token(tuple):
-    """Token class."""
-    __slots__ = ()
-    lineno, type, value = (property(itemgetter(x)) for x in range(3))
-
-    def __new__(cls, lineno, type, value):
-        return tuple.__new__(cls, (lineno, intern(str(type)), value))
-
-    def __str__(self):
-        if self.type in reverse_operators:
-            return reverse_operators[self.type]
-        elif self.type == 'name':
-            return self.value
-        return self.type
-
-    def test(self, expr):
-        """Test a token against a token expression.  This can either be a
-        token type or ``'token_type:token_value'``.  This can only test
-        against string values and types.
-        """
-        # here we do a regular string equality check as test_any is usually
-        # passed an iterable of not interned strings.
-        if self.type == expr:
-            return True
-        elif ':' in expr:
-            return expr.split(':', 1) == [self.type, self.value]
-        return False
-
-    def test_any(self, *iterable):
-        """Test against multiple token expressions."""
-        for expr in iterable:
-            if self.test(expr):
-                return True
-        return False
-
-    def __repr__(self):
-        return 'Token(%r, %r, %r)' % (
-            self.lineno,
-            self.type,
-            self.value
-        )
-
-
-@implements_iterator
-class TokenStreamIterator(object):
-    """The iterator for tokenstreams.  Iterate over the stream
-    until the eof token is reached.
-    """
-
-    def __init__(self, stream):
-        self.stream = stream
-
-    def __iter__(self):
-        return self
-
-    def __next__(self):
-        token = self.stream.current
-        if token.type is TOKEN_EOF:
-            self.stream.close()
-            raise StopIteration()
-        next(self.stream)
-        return token
-
-
-@implements_iterator
-class TokenStream(object):
-    """A token stream is an iterable that yields :class:`Token`\s.  The
-    parser however does not iterate over it but calls :meth:`next` to go
-    one token ahead.  The current active token is stored as :attr:`current`.
-    """
-
-    def __init__(self, generator, name, filename):
-        self._iter = iter(generator)
-        self._pushed = deque()
-        self.name = name
-        self.filename = filename
-        self.closed = False
-        self.current = Token(1, TOKEN_INITIAL, '')
-        next(self)
-
-    def __iter__(self):
-        return TokenStreamIterator(self)
-
-    def __bool__(self):
-        return bool(self._pushed) or self.current.type is not TOKEN_EOF
-    __nonzero__ = __bool__  # py2
-
-    eos = property(lambda x: not x, doc="Are we at the end of the stream?")
-
-    def push(self, token):
-        """Push a token back to the stream."""
-        self._pushed.append(token)
-
-    def look(self):
-        """Look at the next token."""
-        old_token = next(self)
-        result = self.current
-        self.push(result)
-        self.current = old_token
-        return result
-
-    def skip(self, n=1):
-        """Got n tokens ahead."""
-        for x in range(n):
-            next(self)
-
-    def next_if(self, expr):
-        """Perform the token test and return the token if it matched.
-        Otherwise the return value is `None`.
-        """
-        if self.current.test(expr):
-            return next(self)
-
-    def skip_if(self, expr):
-        """Like :meth:`next_if` but only returns `True` or `False`."""
-        return self.next_if(expr) is not None
-
-    def __next__(self):
-        """Go one token ahead and return the old one"""
-        rv = self.current
-        if self._pushed:
-            self.current = self._pushed.popleft()
-        elif self.current.type is not TOKEN_EOF:
-            try:
-                self.current = next(self._iter)
-            except StopIteration:
-                self.close()
-        return rv
-
-    def close(self):
-        """Close the stream."""
-        self.current = Token(self.current.lineno, TOKEN_EOF, '')
-        self._iter = None
-        self.closed = True
-
-    def expect(self, expr):
-        """Expect a given token type and return it.  This accepts the same
-        argument as :meth:`jinja2.lexer.Token.test`.
-        """
-        if not self.current.test(expr):
-            expr = describe_token_expr(expr)
-            if self.current.type is TOKEN_EOF:
-                raise TemplateSyntaxError('unexpected end of template, '
-                                          'expected %r.' % expr,
-                                          self.current.lineno,
-                                          self.name, self.filename)
-            raise TemplateSyntaxError("expected token %r, got %r" %
-                                      (expr, describe_token(self.current)),
-                                      self.current.lineno,
-                                      self.name, self.filename)
-        try:
-            return self.current
-        finally:
-            next(self)
-
-
-def get_lexer(environment):
-    """Return a lexer which is probably cached."""
-    key = (environment.block_start_string,
-           environment.block_end_string,
-           environment.variable_start_string,
-           environment.variable_end_string,
-           environment.comment_start_string,
-           environment.comment_end_string,
-           environment.line_statement_prefix,
-           environment.line_comment_prefix,
-           environment.trim_blocks,
-           environment.lstrip_blocks,
-           environment.newline_sequence,
-           environment.keep_trailing_newline)
-    lexer = _lexer_cache.get(key)
-    if lexer is None:
-        lexer = Lexer(environment)
-        _lexer_cache[key] = lexer
-    return lexer
-
-
-class Lexer(object):
-    """Class that implements a lexer for a given environment. Automatically
-    created by the environment class, usually you don't have to do that.
-
-    Note that the lexer is not automatically bound to an environment.
-    Multiple environments can share the same lexer.
-    """
-
-    def __init__(self, environment):
-        # shortcuts
-        c = lambda x: re.compile(x, re.M | re.S)
-        e = re.escape
-
-        # lexing rules for tags
-        tag_rules = [
-            (whitespace_re, TOKEN_WHITESPACE, None),
-            (float_re, TOKEN_FLOAT, None),
-            (integer_re, TOKEN_INTEGER, None),
-            (name_re, TOKEN_NAME, None),
-            (string_re, TOKEN_STRING, None),
-            (operator_re, TOKEN_OPERATOR, None)
-        ]
-
-        # assemble the root lexing rule. because "|" is ungreedy
-        # we have to sort by length so that the lexer continues working
-        # as expected when we have parsing rules like <% for block and
-        # <%= for variables. (if someone wants asp like syntax)
-        # variables are just part of the rules if variable processing
-        # is required.
-        root_tag_rules = compile_rules(environment)
-
-        # block suffix if trimming is enabled
-        block_suffix_re = environment.trim_blocks and '\\n?' or ''
-
-        # strip leading spaces if lstrip_blocks is enabled
-        prefix_re = {}
-        if environment.lstrip_blocks:
-            # use '{%+' to manually disable lstrip_blocks behavior
-            no_lstrip_re = e('+')
-            # detect overlap between block and variable or comment strings
-            block_diff = c(r'^%s(.*)' % e(environment.block_start_string))
-            # make sure we don't mistake a block for a variable or a comment
-            m = block_diff.match(environment.comment_start_string)
-            no_lstrip_re += m and r'|%s' % e(m.group(1)) or ''
-            m = block_diff.match(environment.variable_start_string)
-            no_lstrip_re += m and r'|%s' % e(m.group(1)) or ''
-
-            # detect overlap between comment and variable strings
-            comment_diff = c(r'^%s(.*)' % e(environment.comment_start_string))
-            m = comment_diff.match(environment.variable_start_string)
-            no_variable_re = m and r'(?!%s)' % e(m.group(1)) or ''
-
-            lstrip_re = r'^[ \t]*'
-            block_prefix_re = r'%s%s(?!%s)|%s\+?' % (
-                    lstrip_re,
-                    e(environment.block_start_string),
-                    no_lstrip_re,
-                    e(environment.block_start_string),
-                    )
-            comment_prefix_re = r'%s%s%s|%s\+?' % (
-                    lstrip_re,
-                    e(environment.comment_start_string),
-                    no_variable_re,
-                    e(environment.comment_start_string),
-                    )
-            prefix_re['block'] = block_prefix_re
-            prefix_re['comment'] = comment_prefix_re
-        else:
-            block_prefix_re = '%s' % e(environment.block_start_string)
-
-        self.newline_sequence = environment.newline_sequence
-        self.keep_trailing_newline = environment.keep_trailing_newline
-
-        # global lexing rules
-        self.rules = {
-            'root': [
-                # directives
-                (c('(.*?)(?:%s)' % '|'.join(
-                    [r'(?P<raw_begin>(?:\s*%s\-|%s)\s*raw\s*(?:\-%s\s*|%s))' % (
-                        e(environment.block_start_string),
-                        block_prefix_re,
-                        e(environment.block_end_string),
-                        e(environment.block_end_string)
-                    )] + [
-                        r'(?P<%s_begin>\s*%s\-|%s)' % (n, r, prefix_re.get(n,r))
-                        for n, r in root_tag_rules
-                    ])), (TOKEN_DATA, '#bygroup'), '#bygroup'),
-                # data
-                (c('.+'), TOKEN_DATA, None)
-            ],
-            # comments
-            TOKEN_COMMENT_BEGIN: [
-                (c(r'(.*?)((?:\-%s\s*|%s)%s)' % (
-                    e(environment.comment_end_string),
-                    e(environment.comment_end_string),
-                    block_suffix_re
-                )), (TOKEN_COMMENT, TOKEN_COMMENT_END), '#pop'),
-                (c('(.)'), (Failure('Missing end of comment tag'),), None)
-            ],
-            # blocks
-            TOKEN_BLOCK_BEGIN: [
-                (c('(?:\-%s\s*|%s)%s' % (
-                    e(environment.block_end_string),
-                    e(environment.block_end_string),
-                    block_suffix_re
-                )), TOKEN_BLOCK_END, '#pop'),
-            ] + tag_rules,
-            # variables
-            TOKEN_VARIABLE_BEGIN: [
-                (c('\-%s\s*|%s' % (
-                    e(environment.variable_end_string),
-                    e(environment.variable_end_string)
-                )), TOKEN_VARIABLE_END, '#pop')
-            ] + tag_rules,
-            # raw block
-            TOKEN_RAW_BEGIN: [
-                (c('(.*?)((?:\s*%s\-|%s)\s*endraw\s*(?:\-%s\s*|%s%s))' % (
-                    e(environment.block_start_string),
-                    block_prefix_re,
-                    e(environment.block_end_string),
-                    e(environment.block_end_string),
-                    block_suffix_re
-                )), (TOKEN_DATA, TOKEN_RAW_END), '#pop'),
-                (c('(.)'), (Failure('Missing end of raw directive'),), None)
-            ],
-            # line statements
-            TOKEN_LINESTATEMENT_BEGIN: [
-                (c(r'\s*(\n|$)'), TOKEN_LINESTATEMENT_END, '#pop')
-            ] + tag_rules,
-            # line comments
-            TOKEN_LINECOMMENT_BEGIN: [
-                (c(r'(.*?)()(?=\n|$)'), (TOKEN_LINECOMMENT,
-                 TOKEN_LINECOMMENT_END), '#pop')
-            ]
-        }
-
-    def _normalize_newlines(self, value):
-        """Called for strings and template data to normalize it to unicode."""
-        return newline_re.sub(self.newline_sequence, value)
-
-    def tokenize(self, source, name=None, filename=None, state=None):
-        """Calls tokeniter + tokenize and wraps it in a token stream.
-        """
-        stream = self.tokeniter(source, name, filename, state)
-        return TokenStream(self.wrap(stream, name, filename), name, filename)
-
-    def wrap(self, stream, name=None, filename=None):
-        """This is called with the stream as returned by `tokenize` and wraps
-        every token in a :class:`Token` and converts the value.
-        """
-        for lineno, token, value in stream:
-            if token in ignored_tokens:
-                continue
-            elif token == 'linestatement_begin':
-                token = 'block_begin'
-            elif token == 'linestatement_end':
-                token = 'block_end'
-            # we are not interested in those tokens in the parser
-            elif token in ('raw_begin', 'raw_end'):
-                continue
-            elif token == 'data':
-                value = self._normalize_newlines(value)
-            elif token == 'keyword':
-                token = value
-            elif token == 'name':
-                value = str(value)
-            elif token == 'string':
-                # try to unescape string
-                try:
-                    value = self._normalize_newlines(value[1:-1]) \
-                        .encode('ascii', 'backslashreplace') \
-                        .decode('unicode-escape')
-                except Exception as e:
-                    msg = str(e).split(':')[-1].strip()
-                    raise TemplateSyntaxError(msg, lineno, name, filename)
-                # if we can express it as bytestring (ascii only)
-                # we do that for support of semi broken APIs
-                # as datetime.datetime.strftime.  On python 3 this
-                # call becomes a noop thanks to 2to3
-                if PY2:
-                    try:
-                        value = value.encode('ascii')
-                    except UnicodeError:
-                        pass
-            elif token == 'integer':
-                value = int(value)
-            elif token == 'float':
-                value = float(value)
-            elif token == 'operator':
-                token = operators[value]
-            yield Token(lineno, token, value)
-
-    def tokeniter(self, source, name, filename=None, state=None):
-        """This method tokenizes the text and returns the tokens in a
-        generator.  Use this method if you just want to tokenize a template.
-        """
-        source = text_type(source)
-        lines = source.splitlines()
-        if self.keep_trailing_newline and source:
-            for newline in ('\r\n', '\r', '\n'):
-                if source.endswith(newline):
-                    lines.append('')
-                    break
-        source = '\n'.join(lines)
-        pos = 0
-        lineno = 1
-        stack = ['root']
-        if state is not None and state != 'root':
-            assert state in ('variable', 'block'), 'invalid state'
-            stack.append(state + '_begin')
-        else:
-            state = 'root'
-        statetokens = self.rules[stack[-1]]
-        source_length = len(source)
-
-        balancing_stack = []
-
-        while 1:
-            # tokenizer loop
-            for regex, tokens, new_state in statetokens:
-                m = regex.match(source, pos)
-                # if no match we try again with the next rule
-                if m is None:
-                    continue
-
-                # we only match blocks and variables if braces / parentheses
-                # are balanced. continue parsing with the lower rule which
-                # is the operator rule. do this only if the end tags look
-                # like operators
-                if balancing_stack and \
-                   tokens in ('variable_end', 'block_end',
-                              'linestatement_end'):
-                    continue
-
-                # tuples support more options
-                if isinstance(tokens, tuple):
-                    for idx, token in enumerate(tokens):
-                        # failure group
-                        if token.__class__ is Failure:
-                            raise token(lineno, filename)
-                        # bygroup is a bit more complex, in that case we
-                        # yield for the current token the first named
-                        # group that matched
-                        elif token == '#bygroup':
-                            for key, value in iteritems(m.groupdict()):
-                                if value is not None:
-                                    yield lineno, key, value
-                                    lineno += value.count('\n')
-                                    break
-                            else:
-                                raise RuntimeError('%r wanted to resolve '
-                                                   'the token dynamically'
-                                                   ' but no group matched'
-                                                   % regex)
-                        # normal group
-                        else:
-                            data = m.group(idx + 1)
-                            if data or token not in ignore_if_empty:
-                                yield lineno, token, data
-                            lineno += data.count('\n')
-
-                # strings as token just are yielded as it.
-                else:
-                    data = m.group()
-                    # update brace/parentheses balance
-                    if tokens == 'operator':
-                        if data == '{':
-                            balancing_stack.append('}')
-                        elif data == '(':
-                            balancing_stack.append(')')
-                        elif data == '[':
-                            balancing_stack.append(']')
-                        elif data in ('}', ')', ']'):
-                            if not balancing_stack:
-                                raise TemplateSyntaxError('unexpected \'%s\'' %
-                                                          data, lineno, name,
-                                                          filename)
-                            expected_op = balancing_stack.pop()
-                            if expected_op != data:
-                                raise TemplateSyntaxError('unexpected \'%s\', '
-                                                          'expected \'%s\'' %
-                                                          (data, expected_op),
-                                                          lineno, name,
-                                                          filename)
-                    # yield items
-                    if data or tokens not in ignore_if_empty:
-                        yield lineno, tokens, data
-                    lineno += data.count('\n')
-
-                # fetch new position into new variable so that we can check
-                # if there is a internal parsing error which would result
-                # in an infinite loop
-                pos2 = m.end()
-
-                # handle state changes
-                if new_state is not None:
-                    # remove the uppermost state
-                    if new_state == '#pop':
-                        stack.pop()
-                    # resolve the new state by group checking
-                    elif new_state == '#bygroup':
-                        for key, value in iteritems(m.groupdict()):
-                            if value is not None:
-                                stack.append(key)
-                                break
-                        else:
-                            raise RuntimeError('%r wanted to resolve the '
-                                               'new state dynamically but'
-                                               ' no group matched' %
-                                               regex)
-                    # direct state name given
-                    else:
-                        stack.append(new_state)
-                    statetokens = self.rules[stack[-1]]
-                # we are still at the same position and no stack change.
-                # this means a loop without break condition, avoid that and
-                # raise error
-                elif pos2 == pos:
-                    raise RuntimeError('%r yielded empty string without '
-                                       'stack change' % regex)
-                # publish new function and start again
-                pos = pos2
-                break
-            # if loop terminated without break we haven't found a single match
-            # either we are at the end of the file or we have a problem
-            else:
-                # end of text
-                if pos >= source_length:
-                    return
-                # something went wrong
-                raise TemplateSyntaxError('unexpected char %r at %d' %
-                                          (source[pos], pos), lineno,
-                                          name, filename)
diff --git a/third_party/jinja2/loaders.py b/third_party/jinja2/loaders.py
deleted file mode 100644
index 44aa392..0000000
--- a/third_party/jinja2/loaders.py
+++ /dev/null
@@ -1,481 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.loaders
-    ~~~~~~~~~~~~~~
-
-    Jinja loader classes.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import os
-import sys
-import weakref
-from types import ModuleType
-from os import path
-from hashlib import sha1
-from jinja2.exceptions import TemplateNotFound
-from jinja2.utils import open_if_exists, internalcode
-from jinja2._compat import string_types, iteritems
-
-
-def split_template_path(template):
-    """Split a path into segments and perform a sanity check.  If it detects
-    '..' in the path it will raise a `TemplateNotFound` error.
-    """
-    pieces = []
-    for piece in template.split('/'):
-        if path.sep in piece \
-           or (path.altsep and path.altsep in piece) or \
-           piece == path.pardir:
-            raise TemplateNotFound(template)
-        elif piece and piece != '.':
-            pieces.append(piece)
-    return pieces
-
-
-class BaseLoader(object):
-    """Baseclass for all loaders.  Subclass this and override `get_source` to
-    implement a custom loading mechanism.  The environment provides a
-    `get_template` method that calls the loader's `load` method to get the
-    :class:`Template` object.
-
-    A very basic example for a loader that looks up templates on the file
-    system could look like this::
-
-        from jinja2 import BaseLoader, TemplateNotFound
-        from os.path import join, exists, getmtime
-
-        class MyLoader(BaseLoader):
-
-            def __init__(self, path):
-                self.path = path
-
-            def get_source(self, environment, template):
-                path = join(self.path, template)
-                if not exists(path):
-                    raise TemplateNotFound(template)
-                mtime = getmtime(path)
-                with file(path) as f:
-                    source = f.read().decode('utf-8')
-                return source, path, lambda: mtime == getmtime(path)
-    """
-
-    #: if set to `False` it indicates that the loader cannot provide access
-    #: to the source of templates.
-    #:
-    #: .. versionadded:: 2.4
-    has_source_access = True
-
-    def get_source(self, environment, template):
-        """Get the template source, filename and reload helper for a template.
-        It's passed the environment and template name and has to return a
-        tuple in the form ``(source, filename, uptodate)`` or raise a
-        `TemplateNotFound` error if it can't locate the template.
-
-        The source part of the returned tuple must be the source of the
-        template as unicode string or a ASCII bytestring.  The filename should
-        be the name of the file on the filesystem if it was loaded from there,
-        otherwise `None`.  The filename is used by python for the tracebacks
-        if no loader extension is used.
-
-        The last item in the tuple is the `uptodate` function.  If auto
-        reloading is enabled it's always called to check if the template
-        changed.  No arguments are passed so the function must store the
-        old state somewhere (for example in a closure).  If it returns `False`
-        the template will be reloaded.
-        """
-        if not self.has_source_access:
-            raise RuntimeError('%s cannot provide access to the source' %
-                               self.__class__.__name__)
-        raise TemplateNotFound(template)
-
-    def list_templates(self):
-        """Iterates over all templates.  If the loader does not support that
-        it should raise a :exc:`TypeError` which is the default behavior.
-        """
-        raise TypeError('this loader cannot iterate over all templates')
-
-    @internalcode
-    def load(self, environment, name, globals=None):
-        """Loads a template.  This method looks up the template in the cache
-        or loads one by calling :meth:`get_source`.  Subclasses should not
-        override this method as loaders working on collections of other
-        loaders (such as :class:`PrefixLoader` or :class:`ChoiceLoader`)
-        will not call this method but `get_source` directly.
-        """
-        code = None
-        if globals is None:
-            globals = {}
-
-        # first we try to get the source for this template together
-        # with the filename and the uptodate function.
-        source, filename, uptodate = self.get_source(environment, name)
-
-        # try to load the code from the bytecode cache if there is a
-        # bytecode cache configured.
-        bcc = environment.bytecode_cache
-        if bcc is not None:
-            bucket = bcc.get_bucket(environment, name, filename, source)
-            code = bucket.code
-
-        # if we don't have code so far (not cached, no longer up to
-        # date) etc. we compile the template
-        if code is None:
-            code = environment.compile(source, name, filename)
-
-        # if the bytecode cache is available and the bucket doesn't
-        # have a code so far, we give the bucket the new code and put
-        # it back to the bytecode cache.
-        if bcc is not None and bucket.code is None:
-            bucket.code = code
-            bcc.set_bucket(bucket)
-
-        return environment.template_class.from_code(environment, code,
-                                                    globals, uptodate)
-
-
-class FileSystemLoader(BaseLoader):
-    """Loads templates from the file system.  This loader can find templates
-    in folders on the file system and is the preferred way to load them.
-
-    The loader takes the path to the templates as string, or if multiple
-    locations are wanted a list of them which is then looked up in the
-    given order::
-
-    >>> loader = FileSystemLoader('/path/to/templates')
-    >>> loader = FileSystemLoader(['/path/to/templates', '/other/path'])
-
-    Per default the template encoding is ``'utf-8'`` which can be changed
-    by setting the `encoding` parameter to something else.
-
-    To follow symbolic links, set the *followlinks* parameter to ``True``::
-
-    >>> loader = FileSystemLoader('/path/to/templates', followlinks=True)
-
-    .. versionchanged:: 2.8+
-       The *followlinks* parameter was added.
-    """
-
-    def __init__(self, searchpath, encoding='utf-8', followlinks=False):
-        if isinstance(searchpath, string_types):
-            searchpath = [searchpath]
-        self.searchpath = list(searchpath)
-        self.encoding = encoding
-        self.followlinks = followlinks
-
-    def get_source(self, environment, template):
-        pieces = split_template_path(template)
-        for searchpath in self.searchpath:
-            filename = path.join(searchpath, *pieces)
-            f = open_if_exists(filename)
-            if f is None:
-                continue
-            try:
-                contents = f.read().decode(self.encoding)
-            finally:
-                f.close()
-
-            mtime = path.getmtime(filename)
-
-            def uptodate():
-                try:
-                    return path.getmtime(filename) == mtime
-                except OSError:
-                    return False
-            return contents, filename, uptodate
-        raise TemplateNotFound(template)
-
-    def list_templates(self):
-        found = set()
-        for searchpath in self.searchpath:
-            walk_dir = os.walk(searchpath, followlinks=self.followlinks)
-            for dirpath, dirnames, filenames in walk_dir:
-                for filename in filenames:
-                    template = os.path.join(dirpath, filename) \
-                        [len(searchpath):].strip(os.path.sep) \
-                                          .replace(os.path.sep, '/')
-                    if template[:2] == './':
-                        template = template[2:]
-                    if template not in found:
-                        found.add(template)
-        return sorted(found)
-
-
-class PackageLoader(BaseLoader):
-    """Load templates from python eggs or packages.  It is constructed with
-    the name of the python package and the path to the templates in that
-    package::
-
-        loader = PackageLoader('mypackage', 'views')
-
-    If the package path is not given, ``'templates'`` is assumed.
-
-    Per default the template encoding is ``'utf-8'`` which can be changed
-    by setting the `encoding` parameter to something else.  Due to the nature
-    of eggs it's only possible to reload templates if the package was loaded
-    from the file system and not a zip file.
-    """
-
-    def __init__(self, package_name, package_path='templates',
-                 encoding='utf-8'):
-        from pkg_resources import DefaultProvider, ResourceManager, \
-                                  get_provider
-        provider = get_provider(package_name)
-        self.encoding = encoding
-        self.manager = ResourceManager()
-        self.filesystem_bound = isinstance(provider, DefaultProvider)
-        self.provider = provider
-        self.package_path = package_path
-
-    def get_source(self, environment, template):
-        pieces = split_template_path(template)
-        p = '/'.join((self.package_path,) + tuple(pieces))
-        if not self.provider.has_resource(p):
-            raise TemplateNotFound(template)
-
-        filename = uptodate = None
-        if self.filesystem_bound:
-            filename = self.provider.get_resource_filename(self.manager, p)
-            mtime = path.getmtime(filename)
-            def uptodate():
-                try:
-                    return path.getmtime(filename) == mtime
-                except OSError:
-                    return False
-
-        source = self.provider.get_resource_string(self.manager, p)
-        return source.decode(self.encoding), filename, uptodate
-
-    def list_templates(self):
-        path = self.package_path
-        if path[:2] == './':
-            path = path[2:]
-        elif path == '.':
-            path = ''
-        offset = len(path)
-        results = []
-        def _walk(path):
-            for filename in self.provider.resource_listdir(path):
-                fullname = path + '/' + filename
-                if self.provider.resource_isdir(fullname):
-                    _walk(fullname)
-                else:
-                    results.append(fullname[offset:].lstrip('/'))
-        _walk(path)
-        results.sort()
-        return results
-
-
-class DictLoader(BaseLoader):
-    """Loads a template from a python dict.  It's passed a dict of unicode
-    strings bound to template names.  This loader is useful for unittesting:
-
-    >>> loader = DictLoader({'index.html': 'source here'})
-
-    Because auto reloading is rarely useful this is disabled per default.
-    """
-
-    def __init__(self, mapping):
-        self.mapping = mapping
-
-    def get_source(self, environment, template):
-        if template in self.mapping:
-            source = self.mapping[template]
-            return source, None, lambda: source == self.mapping.get(template)
-        raise TemplateNotFound(template)
-
-    def list_templates(self):
-        return sorted(self.mapping)
-
-
-class FunctionLoader(BaseLoader):
-    """A loader that is passed a function which does the loading.  The
-    function receives the name of the template and has to return either
-    an unicode string with the template source, a tuple in the form ``(source,
-    filename, uptodatefunc)`` or `None` if the template does not exist.
-
-    >>> def load_template(name):
-    ...     if name == 'index.html':
-    ...         return '...'
-    ...
-    >>> loader = FunctionLoader(load_template)
-
-    The `uptodatefunc` is a function that is called if autoreload is enabled
-    and has to return `True` if the template is still up to date.  For more
-    details have a look at :meth:`BaseLoader.get_source` which has the same
-    return value.
-    """
-
-    def __init__(self, load_func):
-        self.load_func = load_func
-
-    def get_source(self, environment, template):
-        rv = self.load_func(template)
-        if rv is None:
-            raise TemplateNotFound(template)
-        elif isinstance(rv, string_types):
-            return rv, None, None
-        return rv
-
-
-class PrefixLoader(BaseLoader):
-    """A loader that is passed a dict of loaders where each loader is bound
-    to a prefix.  The prefix is delimited from the template by a slash per
-    default, which can be changed by setting the `delimiter` argument to
-    something else::
-
-        loader = PrefixLoader({
-            'app1':     PackageLoader('mypackage.app1'),
-            'app2':     PackageLoader('mypackage.app2')
-        })
-
-    By loading ``'app1/index.html'`` the file from the app1 package is loaded,
-    by loading ``'app2/index.html'`` the file from the second.
-    """
-
-    def __init__(self, mapping, delimiter='/'):
-        self.mapping = mapping
-        self.delimiter = delimiter
-
-    def get_loader(self, template):
-        try:
-            prefix, name = template.split(self.delimiter, 1)
-            loader = self.mapping[prefix]
-        except (ValueError, KeyError):
-            raise TemplateNotFound(template)
-        return loader, name
-
-    def get_source(self, environment, template):
-        loader, name = self.get_loader(template)
-        try:
-            return loader.get_source(environment, name)
-        except TemplateNotFound:
-            # re-raise the exception with the correct fileame here.
-            # (the one that includes the prefix)
-            raise TemplateNotFound(template)
-
-    @internalcode
-    def load(self, environment, name, globals=None):
-        loader, local_name = self.get_loader(name)
-        try:
-            return loader.load(environment, local_name, globals)
-        except TemplateNotFound:
-            # re-raise the exception with the correct fileame here.
-            # (the one that includes the prefix)
-            raise TemplateNotFound(name)
-
-    def list_templates(self):
-        result = []
-        for prefix, loader in iteritems(self.mapping):
-            for template in loader.list_templates():
-                result.append(prefix + self.delimiter + template)
-        return result
-
-
-class ChoiceLoader(BaseLoader):
-    """This loader works like the `PrefixLoader` just that no prefix is
-    specified.  If a template could not be found by one loader the next one
-    is tried.
-
-    >>> loader = ChoiceLoader([
-    ...     FileSystemLoader('/path/to/user/templates'),
-    ...     FileSystemLoader('/path/to/system/templates')
-    ... ])
-
-    This is useful if you want to allow users to override builtin templates
-    from a different location.
-    """
-
-    def __init__(self, loaders):
-        self.loaders = loaders
-
-    def get_source(self, environment, template):
-        for loader in self.loaders:
-            try:
-                return loader.get_source(environment, template)
-            except TemplateNotFound:
-                pass
-        raise TemplateNotFound(template)
-
-    @internalcode
-    def load(self, environment, name, globals=None):
-        for loader in self.loaders:
-            try:
-                return loader.load(environment, name, globals)
-            except TemplateNotFound:
-                pass
-        raise TemplateNotFound(name)
-
-    def list_templates(self):
-        found = set()
-        for loader in self.loaders:
-            found.update(loader.list_templates())
-        return sorted(found)
-
-
-class _TemplateModule(ModuleType):
-    """Like a normal module but with support for weak references"""
-
-
-class ModuleLoader(BaseLoader):
-    """This loader loads templates from precompiled templates.
-
-    Example usage:
-
-    >>> loader = ChoiceLoader([
-    ...     ModuleLoader('/path/to/compiled/templates'),
-    ...     FileSystemLoader('/path/to/templates')
-    ... ])
-
-    Templates can be precompiled with :meth:`Environment.compile_templates`.
-    """
-
-    has_source_access = False
-
-    def __init__(self, path):
-        package_name = '_jinja2_module_templates_%x' % id(self)
-
-        # create a fake module that looks for the templates in the
-        # path given.
-        mod = _TemplateModule(package_name)
-        if isinstance(path, string_types):
-            path = [path]
-        else:
-            path = list(path)
-        mod.__path__ = path
-
-        sys.modules[package_name] = weakref.proxy(mod,
-            lambda x: sys.modules.pop(package_name, None))
-
-        # the only strong reference, the sys.modules entry is weak
-        # so that the garbage collector can remove it once the
-        # loader that created it goes out of business.
-        self.module = mod
-        self.package_name = package_name
-
-    @staticmethod
-    def get_template_key(name):
-        return 'tmpl_' + sha1(name.encode('utf-8')).hexdigest()
-
-    @staticmethod
-    def get_module_filename(name):
-        return ModuleLoader.get_template_key(name) + '.py'
-
-    @internalcode
-    def load(self, environment, name, globals=None):
-        key = self.get_template_key(name)
-        module = '%s.%s' % (self.package_name, key)
-        mod = getattr(self.module, module, None)
-        if mod is None:
-            try:
-                mod = __import__(module, None, None, ['root'])
-            except ImportError:
-                raise TemplateNotFound(name)
-
-            # remove the entry from sys.modules, we only want the attribute
-            # on the module object we have stored on the loader.
-            sys.modules.pop(module, None)
-
-        return environment.template_class.from_module_dict(
-            environment, mod.__dict__, globals)
diff --git a/third_party/jinja2/meta.py b/third_party/jinja2/meta.py
deleted file mode 100644
index 3dbab7c..0000000
--- a/third_party/jinja2/meta.py
+++ /dev/null
@@ -1,103 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.meta
-    ~~~~~~~~~~~
-
-    This module implements various functions that exposes information about
-    templates that might be interesting for various kinds of applications.
-
-    :copyright: (c) 2010 by the Jinja Team, see AUTHORS for more details.
-    :license: BSD, see LICENSE for more details.
-"""
-from jinja2 import nodes
-from jinja2.compiler import CodeGenerator
-from jinja2._compat import string_types
-
-
-class TrackingCodeGenerator(CodeGenerator):
-    """We abuse the code generator for introspection."""
-
-    def __init__(self, environment):
-        CodeGenerator.__init__(self, environment, '<introspection>',
-                               '<introspection>')
-        self.undeclared_identifiers = set()
-
-    def write(self, x):
-        """Don't write."""
-
-    def pull_locals(self, frame):
-        """Remember all undeclared identifiers."""
-        self.undeclared_identifiers.update(frame.identifiers.undeclared)
-
-
-def find_undeclared_variables(ast):
-    """Returns a set of all variables in the AST that will be looked up from
-    the context at runtime.  Because at compile time it's not known which
-    variables will be used depending on the path the execution takes at
-    runtime, all variables are returned.
-
-    >>> from jinja2 import Environment, meta
-    >>> env = Environment()
-    >>> ast = env.parse('{% set foo = 42 %}{{ bar + foo }}')
-    >>> meta.find_undeclared_variables(ast) == set(['bar'])
-    True
-
-    .. admonition:: Implementation
-
-       Internally the code generator is used for finding undeclared variables.
-       This is good to know because the code generator might raise a
-       :exc:`TemplateAssertionError` during compilation and as a matter of
-       fact this function can currently raise that exception as well.
-    """
-    codegen = TrackingCodeGenerator(ast.environment)
-    codegen.visit(ast)
-    return codegen.undeclared_identifiers
-
-
-def find_referenced_templates(ast):
-    """Finds all the referenced templates from the AST.  This will return an
-    iterator over all the hardcoded template extensions, inclusions and
-    imports.  If dynamic inheritance or inclusion is used, `None` will be
-    yielded.
-
-    >>> from jinja2 import Environment, meta
-    >>> env = Environment()
-    >>> ast = env.parse('{% extends "layout.html" %}{% include helper %}')
-    >>> list(meta.find_referenced_templates(ast))
-    ['layout.html', None]
-
-    This function is useful for dependency tracking.  For example if you want
-    to rebuild parts of the website after a layout template has changed.
-    """
-    for node in ast.find_all((nodes.Extends, nodes.FromImport, nodes.Import,
-                              nodes.Include)):
-        if not isinstance(node.template, nodes.Const):
-            # a tuple with some non consts in there
-            if isinstance(node.template, (nodes.Tuple, nodes.List)):
-                for template_name in node.template.items:
-                    # something const, only yield the strings and ignore
-                    # non-string consts that really just make no sense
-                    if isinstance(template_name, nodes.Const):
-                        if isinstance(template_name.value, string_types):
-                            yield template_name.value
-                    # something dynamic in there
-                    else:
-                        yield None
-            # something dynamic we don't know about here
-            else:
-                yield None
-            continue
-        # constant is a basestring, direct template name
-        if isinstance(node.template.value, string_types):
-            yield node.template.value
-        # a tuple or list (latter *should* not happen) made of consts,
-        # yield the consts that are strings.  We could warn here for
-        # non string values
-        elif isinstance(node, nodes.Include) and \
-             isinstance(node.template.value, (tuple, list)):
-            for template_name in node.template.value:
-                if isinstance(template_name, string_types):
-                    yield template_name
-        # something else we don't care about, we could warn here
-        else:
-            yield None
diff --git a/third_party/jinja2/nodes.py b/third_party/jinja2/nodes.py
deleted file mode 100644
index d32046c..0000000
--- a/third_party/jinja2/nodes.py
+++ /dev/null
@@ -1,919 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.nodes
-    ~~~~~~~~~~~~
-
-    This module implements additional nodes derived from the ast base node.
-
-    It also provides some node tree helper functions like `in_lineno` and
-    `get_nodes` used by the parser and translator in order to normalize
-    python and jinja nodes.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import types
-import operator
-
-from collections import deque
-from jinja2.utils import Markup
-from jinja2._compat import izip, with_metaclass, text_type
-
-
-#: the types we support for context functions
-_context_function_types = (types.FunctionType, types.MethodType)
-
-
-_binop_to_func = {
-    '*':        operator.mul,
-    '/':        operator.truediv,
-    '//':       operator.floordiv,
-    '**':       operator.pow,
-    '%':        operator.mod,
-    '+':        operator.add,
-    '-':        operator.sub
-}
-
-_uaop_to_func = {
-    'not':      operator.not_,
-    '+':        operator.pos,
-    '-':        operator.neg
-}
-
-_cmpop_to_func = {
-    'eq':       operator.eq,
-    'ne':       operator.ne,
-    'gt':       operator.gt,
-    'gteq':     operator.ge,
-    'lt':       operator.lt,
-    'lteq':     operator.le,
-    'in':       lambda a, b: a in b,
-    'notin':    lambda a, b: a not in b
-}
-
-
-class Impossible(Exception):
-    """Raised if the node could not perform a requested action."""
-
-
-class NodeType(type):
-    """A metaclass for nodes that handles the field and attribute
-    inheritance.  fields and attributes from the parent class are
-    automatically forwarded to the child."""
-
-    def __new__(cls, name, bases, d):
-        for attr in 'fields', 'attributes':
-            storage = []
-            storage.extend(getattr(bases[0], attr, ()))
-            storage.extend(d.get(attr, ()))
-            assert len(bases) == 1, 'multiple inheritance not allowed'
-            assert len(storage) == len(set(storage)), 'layout conflict'
-            d[attr] = tuple(storage)
-        d.setdefault('abstract', False)
-        return type.__new__(cls, name, bases, d)
-
-
-class EvalContext(object):
-    """Holds evaluation time information.  Custom attributes can be attached
-    to it in extensions.
-    """
-
-    def __init__(self, environment, template_name=None):
-        self.environment = environment
-        if callable(environment.autoescape):
-            self.autoescape = environment.autoescape(template_name)
-        else:
-            self.autoescape = environment.autoescape
-        self.volatile = False
-
-    def save(self):
-        return self.__dict__.copy()
-
-    def revert(self, old):
-        self.__dict__.clear()
-        self.__dict__.update(old)
-
-
-def get_eval_context(node, ctx):
-    if ctx is None:
-        if node.environment is None:
-            raise RuntimeError('if no eval context is passed, the '
-                               'node must have an attached '
-                               'environment.')
-        return EvalContext(node.environment)
-    return ctx
-
-
-class Node(with_metaclass(NodeType, object)):
-    """Baseclass for all Jinja2 nodes.  There are a number of nodes available
-    of different types.  There are four major types:
-
-    -   :class:`Stmt`: statements
-    -   :class:`Expr`: expressions
-    -   :class:`Helper`: helper nodes
-    -   :class:`Template`: the outermost wrapper node
-
-    All nodes have fields and attributes.  Fields may be other nodes, lists,
-    or arbitrary values.  Fields are passed to the constructor as regular
-    positional arguments, attributes as keyword arguments.  Each node has
-    two attributes: `lineno` (the line number of the node) and `environment`.
-    The `environment` attribute is set at the end of the parsing process for
-    all nodes automatically.
-    """
-    fields = ()
-    attributes = ('lineno', 'environment')
-    abstract = True
-
-    def __init__(self, *fields, **attributes):
-        if self.abstract:
-            raise TypeError('abstract nodes are not instanciable')
-        if fields:
-            if len(fields) != len(self.fields):
-                if not self.fields:
-                    raise TypeError('%r takes 0 arguments' %
-                                    self.__class__.__name__)
-                raise TypeError('%r takes 0 or %d argument%s' % (
-                    self.__class__.__name__,
-                    len(self.fields),
-                    len(self.fields) != 1 and 's' or ''
-                ))
-            for name, arg in izip(self.fields, fields):
-                setattr(self, name, arg)
-        for attr in self.attributes:
-            setattr(self, attr, attributes.pop(attr, None))
-        if attributes:
-            raise TypeError('unknown attribute %r' %
-                            next(iter(attributes)))
-
-    def iter_fields(self, exclude=None, only=None):
-        """This method iterates over all fields that are defined and yields
-        ``(key, value)`` tuples.  Per default all fields are returned, but
-        it's possible to limit that to some fields by providing the `only`
-        parameter or to exclude some using the `exclude` parameter.  Both
-        should be sets or tuples of field names.
-        """
-        for name in self.fields:
-            if (exclude is only is None) or \
-               (exclude is not None and name not in exclude) or \
-               (only is not None and name in only):
-                try:
-                    yield name, getattr(self, name)
-                except AttributeError:
-                    pass
-
-    def iter_child_nodes(self, exclude=None, only=None):
-        """Iterates over all direct child nodes of the node.  This iterates
-        over all fields and yields the values of they are nodes.  If the value
-        of a field is a list all the nodes in that list are returned.
-        """
-        for field, item in self.iter_fields(exclude, only):
-            if isinstance(item, list):
-                for n in item:
-                    if isinstance(n, Node):
-                        yield n
-            elif isinstance(item, Node):
-                yield item
-
-    def find(self, node_type):
-        """Find the first node of a given type.  If no such node exists the
-        return value is `None`.
-        """
-        for result in self.find_all(node_type):
-            return result
-
-    def find_all(self, node_type):
-        """Find all the nodes of a given type.  If the type is a tuple,
-        the check is performed for any of the tuple items.
-        """
-        for child in self.iter_child_nodes():
-            if isinstance(child, node_type):
-                yield child
-            for result in child.find_all(node_type):
-                yield result
-
-    def set_ctx(self, ctx):
-        """Reset the context of a node and all child nodes.  Per default the
-        parser will all generate nodes that have a 'load' context as it's the
-        most common one.  This method is used in the parser to set assignment
-        targets and other nodes to a store context.
-        """
-        todo = deque([self])
-        while todo:
-            node = todo.popleft()
-            if 'ctx' in node.fields:
-                node.ctx = ctx
-            todo.extend(node.iter_child_nodes())
-        return self
-
-    def set_lineno(self, lineno, override=False):
-        """Set the line numbers of the node and children."""
-        todo = deque([self])
-        while todo:
-            node = todo.popleft()
-            if 'lineno' in node.attributes:
-                if node.lineno is None or override:
-                    node.lineno = lineno
-            todo.extend(node.iter_child_nodes())
-        return self
-
-    def set_environment(self, environment):
-        """Set the environment for all nodes."""
-        todo = deque([self])
-        while todo:
-            node = todo.popleft()
-            node.environment = environment
-            todo.extend(node.iter_child_nodes())
-        return self
-
-    def __eq__(self, other):
-        return type(self) is type(other) and \
-               tuple(self.iter_fields()) == tuple(other.iter_fields())
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-    # Restore Python 2 hashing behavior on Python 3
-    __hash__ = object.__hash__
-
-    def __repr__(self):
-        return '%s(%s)' % (
-            self.__class__.__name__,
-            ', '.join('%s=%r' % (arg, getattr(self, arg, None)) for
-                      arg in self.fields)
-        )
-
-
-class Stmt(Node):
-    """Base node for all statements."""
-    abstract = True
-
-
-class Helper(Node):
-    """Nodes that exist in a specific context only."""
-    abstract = True
-
-
-class Template(Node):
-    """Node that represents a template.  This must be the outermost node that
-    is passed to the compiler.
-    """
-    fields = ('body',)
-
-
-class Output(Stmt):
-    """A node that holds multiple expressions which are then printed out.
-    This is used both for the `print` statement and the regular template data.
-    """
-    fields = ('nodes',)
-
-
-class Extends(Stmt):
-    """Represents an extends statement."""
-    fields = ('template',)
-
-
-class For(Stmt):
-    """The for loop.  `target` is the target for the iteration (usually a
-    :class:`Name` or :class:`Tuple`), `iter` the iterable.  `body` is a list
-    of nodes that are used as loop-body, and `else_` a list of nodes for the
-    `else` block.  If no else node exists it has to be an empty list.
-
-    For filtered nodes an expression can be stored as `test`, otherwise `None`.
-    """
-    fields = ('target', 'iter', 'body', 'else_', 'test', 'recursive')
-
-
-class If(Stmt):
-    """If `test` is true, `body` is rendered, else `else_`."""
-    fields = ('test', 'body', 'else_')
-
-
-class Macro(Stmt):
-    """A macro definition.  `name` is the name of the macro, `args` a list of
-    arguments and `defaults` a list of defaults if there are any.  `body` is
-    a list of nodes for the macro body.
-    """
-    fields = ('name', 'args', 'defaults', 'body')
-
-
-class CallBlock(Stmt):
-    """Like a macro without a name but a call instead.  `call` is called with
-    the unnamed macro as `caller` argument this node holds.
-    """
-    fields = ('call', 'args', 'defaults', 'body')
-
-
-class FilterBlock(Stmt):
-    """Node for filter sections."""
-    fields = ('body', 'filter')
-
-
-class Block(Stmt):
-    """A node that represents a block."""
-    fields = ('name', 'body', 'scoped')
-
-
-class Include(Stmt):
-    """A node that represents the include tag."""
-    fields = ('template', 'with_context', 'ignore_missing')
-
-
-class Import(Stmt):
-    """A node that represents the import tag."""
-    fields = ('template', 'target', 'with_context')
-
-
-class FromImport(Stmt):
-    """A node that represents the from import tag.  It's important to not
-    pass unsafe names to the name attribute.  The compiler translates the
-    attribute lookups directly into getattr calls and does *not* use the
-    subscript callback of the interface.  As exported variables may not
-    start with double underscores (which the parser asserts) this is not a
-    problem for regular Jinja code, but if this node is used in an extension
-    extra care must be taken.
-
-    The list of names may contain tuples if aliases are wanted.
-    """
-    fields = ('template', 'names', 'with_context')
-
-
-class ExprStmt(Stmt):
-    """A statement that evaluates an expression and discards the result."""
-    fields = ('node',)
-
-
-class Assign(Stmt):
-    """Assigns an expression to a target."""
-    fields = ('target', 'node')
-
-
-class AssignBlock(Stmt):
-    """Assigns a block to a target."""
-    fields = ('target', 'body')
-
-
-class Expr(Node):
-    """Baseclass for all expressions."""
-    abstract = True
-
-    def as_const(self, eval_ctx=None):
-        """Return the value of the expression as constant or raise
-        :exc:`Impossible` if this was not possible.
-
-        An :class:`EvalContext` can be provided, if none is given
-        a default context is created which requires the nodes to have
-        an attached environment.
-
-        .. versionchanged:: 2.4
-           the `eval_ctx` parameter was added.
-        """
-        raise Impossible()
-
-    def can_assign(self):
-        """Check if it's possible to assign something to this node."""
-        return False
-
-
-class BinExpr(Expr):
-    """Baseclass for all binary expressions."""
-    fields = ('left', 'right')
-    operator = None
-    abstract = True
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        # intercepted operators cannot be folded at compile time
-        if self.environment.sandboxed and \
-           self.operator in self.environment.intercepted_binops:
-            raise Impossible()
-        f = _binop_to_func[self.operator]
-        try:
-            return f(self.left.as_const(eval_ctx), self.right.as_const(eval_ctx))
-        except Exception:
-            raise Impossible()
-
-
-class UnaryExpr(Expr):
-    """Baseclass for all unary expressions."""
-    fields = ('node',)
-    operator = None
-    abstract = True
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        # intercepted operators cannot be folded at compile time
-        if self.environment.sandboxed and \
-           self.operator in self.environment.intercepted_unops:
-            raise Impossible()
-        f = _uaop_to_func[self.operator]
-        try:
-            return f(self.node.as_const(eval_ctx))
-        except Exception:
-            raise Impossible()
-
-
-class Name(Expr):
-    """Looks up a name or stores a value in a name.
-    The `ctx` of the node can be one of the following values:
-
-    -   `store`: store a value in the name
-    -   `load`: load that name
-    -   `param`: like `store` but if the name was defined as function parameter.
-    """
-    fields = ('name', 'ctx')
-
-    def can_assign(self):
-        return self.name not in ('true', 'false', 'none',
-                                 'True', 'False', 'None')
-
-
-class Literal(Expr):
-    """Baseclass for literals."""
-    abstract = True
-
-
-class Const(Literal):
-    """All constant values.  The parser will return this node for simple
-    constants such as ``42`` or ``"foo"`` but it can be used to store more
-    complex values such as lists too.  Only constants with a safe
-    representation (objects where ``eval(repr(x)) == x`` is true).
-    """
-    fields = ('value',)
-
-    def as_const(self, eval_ctx=None):
-        return self.value
-
-    @classmethod
-    def from_untrusted(cls, value, lineno=None, environment=None):
-        """Return a const object if the value is representable as
-        constant value in the generated code, otherwise it will raise
-        an `Impossible` exception.
-        """
-        from .compiler import has_safe_repr
-        if not has_safe_repr(value):
-            raise Impossible()
-        return cls(value, lineno=lineno, environment=environment)
-
-
-class TemplateData(Literal):
-    """A constant template string."""
-    fields = ('data',)
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        if eval_ctx.volatile:
-            raise Impossible()
-        if eval_ctx.autoescape:
-            return Markup(self.data)
-        return self.data
-
-
-class Tuple(Literal):
-    """For loop unpacking and some other things like multiple arguments
-    for subscripts.  Like for :class:`Name` `ctx` specifies if the tuple
-    is used for loading the names or storing.
-    """
-    fields = ('items', 'ctx')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return tuple(x.as_const(eval_ctx) for x in self.items)
-
-    def can_assign(self):
-        for item in self.items:
-            if not item.can_assign():
-                return False
-        return True
-
-
-class List(Literal):
-    """Any list literal such as ``[1, 2, 3]``"""
-    fields = ('items',)
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return [x.as_const(eval_ctx) for x in self.items]
-
-
-class Dict(Literal):
-    """Any dict literal such as ``{1: 2, 3: 4}``.  The items must be a list of
-    :class:`Pair` nodes.
-    """
-    fields = ('items',)
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return dict(x.as_const(eval_ctx) for x in self.items)
-
-
-class Pair(Helper):
-    """A key, value pair for dicts."""
-    fields = ('key', 'value')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return self.key.as_const(eval_ctx), self.value.as_const(eval_ctx)
-
-
-class Keyword(Helper):
-    """A key, value pair for keyword arguments where key is a string."""
-    fields = ('key', 'value')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return self.key, self.value.as_const(eval_ctx)
-
-
-class CondExpr(Expr):
-    """A conditional expression (inline if expression).  (``{{
-    foo if bar else baz }}``)
-    """
-    fields = ('test', 'expr1', 'expr2')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        if self.test.as_const(eval_ctx):
-            return self.expr1.as_const(eval_ctx)
-
-        # if we evaluate to an undefined object, we better do that at runtime
-        if self.expr2 is None:
-            raise Impossible()
-
-        return self.expr2.as_const(eval_ctx)
-
-
-class Filter(Expr):
-    """This node applies a filter on an expression.  `name` is the name of
-    the filter, the rest of the fields are the same as for :class:`Call`.
-
-    If the `node` of a filter is `None` the contents of the last buffer are
-    filtered.  Buffers are created by macros and filter blocks.
-    """
-    fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        if eval_ctx.volatile or self.node is None:
-            raise Impossible()
-        # we have to be careful here because we call filter_ below.
-        # if this variable would be called filter, 2to3 would wrap the
-        # call in a list beause it is assuming we are talking about the
-        # builtin filter function here which no longer returns a list in
-        # python 3.  because of that, do not rename filter_ to filter!
-        filter_ = self.environment.filters.get(self.name)
-        if filter_ is None or getattr(filter_, 'contextfilter', False):
-            raise Impossible()
-        obj = self.node.as_const(eval_ctx)
-        args = [x.as_const(eval_ctx) for x in self.args]
-        if getattr(filter_, 'evalcontextfilter', False):
-            args.insert(0, eval_ctx)
-        elif getattr(filter_, 'environmentfilter', False):
-            args.insert(0, self.environment)
-        kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs)
-        if self.dyn_args is not None:
-            try:
-                args.extend(self.dyn_args.as_const(eval_ctx))
-            except Exception:
-                raise Impossible()
-        if self.dyn_kwargs is not None:
-            try:
-                kwargs.update(self.dyn_kwargs.as_const(eval_ctx))
-            except Exception:
-                raise Impossible()
-        try:
-            return filter_(obj, *args, **kwargs)
-        except Exception:
-            raise Impossible()
-
-
-class Test(Expr):
-    """Applies a test on an expression.  `name` is the name of the test, the
-    rest of the fields are the same as for :class:`Call`.
-    """
-    fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
-
-
-class Call(Expr):
-    """Calls an expression.  `args` is a list of arguments, `kwargs` a list
-    of keyword arguments (list of :class:`Keyword` nodes), and `dyn_args`
-    and `dyn_kwargs` has to be either `None` or a node that is used as
-    node for dynamic positional (``*args``) or keyword (``**kwargs``)
-    arguments.
-    """
-    fields = ('node', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        if eval_ctx.volatile:
-            raise Impossible()
-        obj = self.node.as_const(eval_ctx)
-
-        # don't evaluate context functions
-        args = [x.as_const(eval_ctx) for x in self.args]
-        if isinstance(obj, _context_function_types):
-            if getattr(obj, 'contextfunction', False):
-                raise Impossible()
-            elif getattr(obj, 'evalcontextfunction', False):
-                args.insert(0, eval_ctx)
-            elif getattr(obj, 'environmentfunction', False):
-                args.insert(0, self.environment)
-
-        kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs)
-        if self.dyn_args is not None:
-            try:
-                args.extend(self.dyn_args.as_const(eval_ctx))
-            except Exception:
-                raise Impossible()
-        if self.dyn_kwargs is not None:
-            try:
-                kwargs.update(self.dyn_kwargs.as_const(eval_ctx))
-            except Exception:
-                raise Impossible()
-        try:
-            return obj(*args, **kwargs)
-        except Exception:
-            raise Impossible()
-
-
-class Getitem(Expr):
-    """Get an attribute or item from an expression and prefer the item."""
-    fields = ('node', 'arg', 'ctx')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        if self.ctx != 'load':
-            raise Impossible()
-        try:
-            return self.environment.getitem(self.node.as_const(eval_ctx),
-                                            self.arg.as_const(eval_ctx))
-        except Exception:
-            raise Impossible()
-
-    def can_assign(self):
-        return False
-
-
-class Getattr(Expr):
-    """Get an attribute or item from an expression that is a ascii-only
-    bytestring and prefer the attribute.
-    """
-    fields = ('node', 'attr', 'ctx')
-
-    def as_const(self, eval_ctx=None):
-        if self.ctx != 'load':
-            raise Impossible()
-        try:
-            eval_ctx = get_eval_context(self, eval_ctx)
-            return self.environment.getattr(self.node.as_const(eval_ctx),
-                                            self.attr)
-        except Exception:
-            raise Impossible()
-
-    def can_assign(self):
-        return False
-
-
-class Slice(Expr):
-    """Represents a slice object.  This must only be used as argument for
-    :class:`Subscript`.
-    """
-    fields = ('start', 'stop', 'step')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        def const(obj):
-            if obj is None:
-                return None
-            return obj.as_const(eval_ctx)
-        return slice(const(self.start), const(self.stop), const(self.step))
-
-
-class Concat(Expr):
-    """Concatenates the list of expressions provided after converting them to
-    unicode.
-    """
-    fields = ('nodes',)
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return ''.join(text_type(x.as_const(eval_ctx)) for x in self.nodes)
-
-
-class Compare(Expr):
-    """Compares an expression with some other expressions.  `ops` must be a
-    list of :class:`Operand`\s.
-    """
-    fields = ('expr', 'ops')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        result = value = self.expr.as_const(eval_ctx)
-        try:
-            for op in self.ops:
-                new_value = op.expr.as_const(eval_ctx)
-                result = _cmpop_to_func[op.op](value, new_value)
-                value = new_value
-        except Exception:
-            raise Impossible()
-        return result
-
-
-class Operand(Helper):
-    """Holds an operator and an expression."""
-    fields = ('op', 'expr')
-
-if __debug__:
-    Operand.__doc__ += '\nThe following operators are available: ' + \
-        ', '.join(sorted('``%s``' % x for x in set(_binop_to_func) |
-                  set(_uaop_to_func) | set(_cmpop_to_func)))
-
-
-class Mul(BinExpr):
-    """Multiplies the left with the right node."""
-    operator = '*'
-
-
-class Div(BinExpr):
-    """Divides the left by the right node."""
-    operator = '/'
-
-
-class FloorDiv(BinExpr):
-    """Divides the left by the right node and truncates conver the
-    result into an integer by truncating.
-    """
-    operator = '//'
-
-
-class Add(BinExpr):
-    """Add the left to the right node."""
-    operator = '+'
-
-
-class Sub(BinExpr):
-    """Subtract the right from the left node."""
-    operator = '-'
-
-
-class Mod(BinExpr):
-    """Left modulo right."""
-    operator = '%'
-
-
-class Pow(BinExpr):
-    """Left to the power of right."""
-    operator = '**'
-
-
-class And(BinExpr):
-    """Short circuited AND."""
-    operator = 'and'
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return self.left.as_const(eval_ctx) and self.right.as_const(eval_ctx)
-
-
-class Or(BinExpr):
-    """Short circuited OR."""
-    operator = 'or'
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return self.left.as_const(eval_ctx) or self.right.as_const(eval_ctx)
-
-
-class Not(UnaryExpr):
-    """Negate the expression."""
-    operator = 'not'
-
-
-class Neg(UnaryExpr):
-    """Make the expression negative."""
-    operator = '-'
-
-
-class Pos(UnaryExpr):
-    """Make the expression positive (noop for most expressions)"""
-    operator = '+'
-
-
-# Helpers for extensions
-
-
-class EnvironmentAttribute(Expr):
-    """Loads an attribute from the environment object.  This is useful for
-    extensions that want to call a callback stored on the environment.
-    """
-    fields = ('name',)
-
-
-class ExtensionAttribute(Expr):
-    """Returns the attribute of an extension bound to the environment.
-    The identifier is the identifier of the :class:`Extension`.
-
-    This node is usually constructed by calling the
-    :meth:`~jinja2.ext.Extension.attr` method on an extension.
-    """
-    fields = ('identifier', 'name')
-
-
-class ImportedName(Expr):
-    """If created with an import name the import name is returned on node
-    access.  For example ``ImportedName('cgi.escape')`` returns the `escape`
-    function from the cgi module on evaluation.  Imports are optimized by the
-    compiler so there is no need to assign them to local variables.
-    """
-    fields = ('importname',)
-
-
-class InternalName(Expr):
-    """An internal name in the compiler.  You cannot create these nodes
-    yourself but the parser provides a
-    :meth:`~jinja2.parser.Parser.free_identifier` method that creates
-    a new identifier for you.  This identifier is not available from the
-    template and is not threated specially by the compiler.
-    """
-    fields = ('name',)
-
-    def __init__(self):
-        raise TypeError('Can\'t create internal names.  Use the '
-                        '`free_identifier` method on a parser.')
-
-
-class MarkSafe(Expr):
-    """Mark the wrapped expression as safe (wrap it as `Markup`)."""
-    fields = ('expr',)
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return Markup(self.expr.as_const(eval_ctx))
-
-
-class MarkSafeIfAutoescape(Expr):
-    """Mark the wrapped expression as safe (wrap it as `Markup`) but
-    only if autoescaping is active.
-
-    .. versionadded:: 2.5
-    """
-    fields = ('expr',)
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        if eval_ctx.volatile:
-            raise Impossible()
-        expr = self.expr.as_const(eval_ctx)
-        if eval_ctx.autoescape:
-            return Markup(expr)
-        return expr
-
-
-class ContextReference(Expr):
-    """Returns the current template context.  It can be used like a
-    :class:`Name` node, with a ``'load'`` ctx and will return the
-    current :class:`~jinja2.runtime.Context` object.
-
-    Here an example that assigns the current template name to a
-    variable named `foo`::
-
-        Assign(Name('foo', ctx='store'),
-               Getattr(ContextReference(), 'name'))
-    """
-
-
-class Continue(Stmt):
-    """Continue a loop."""
-
-
-class Break(Stmt):
-    """Break a loop."""
-
-
-class Scope(Stmt):
-    """An artificial scope."""
-    fields = ('body',)
-
-
-class EvalContextModifier(Stmt):
-    """Modifies the eval context.  For each option that should be modified,
-    a :class:`Keyword` has to be added to the :attr:`options` list.
-
-    Example to change the `autoescape` setting::
-
-        EvalContextModifier(options=[Keyword('autoescape', Const(True))])
-    """
-    fields = ('options',)
-
-
-class ScopedEvalContextModifier(EvalContextModifier):
-    """Modifies the eval context and reverts it later.  Works exactly like
-    :class:`EvalContextModifier` but will only modify the
-    :class:`~jinja2.nodes.EvalContext` for nodes in the :attr:`body`.
-    """
-    fields = ('body',)
-
-
-# make sure nobody creates custom nodes
-def _failing_new(*args, **kwargs):
-    raise TypeError('can\'t create custom node types')
-NodeType.__new__ = staticmethod(_failing_new); del _failing_new
diff --git a/third_party/jinja2/optimizer.py b/third_party/jinja2/optimizer.py
deleted file mode 100644
index 00eab11..0000000
--- a/third_party/jinja2/optimizer.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.optimizer
-    ~~~~~~~~~~~~~~~~
-
-    The jinja optimizer is currently trying to constant fold a few expressions
-    and modify the AST in place so that it should be easier to evaluate it.
-
-    Because the AST does not contain all the scoping information and the
-    compiler has to find that out, we cannot do all the optimizations we
-    want.  For example loop unrolling doesn't work because unrolled loops would
-    have a different scoping.
-
-    The solution would be a second syntax tree that has the scoping rules stored.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD.
-"""
-from jinja2 import nodes
-from jinja2.visitor import NodeTransformer
-
-
-def optimize(node, environment):
-    """The context hint can be used to perform an static optimization
-    based on the context given."""
-    optimizer = Optimizer(environment)
-    return optimizer.visit(node)
-
-
-class Optimizer(NodeTransformer):
-
-    def __init__(self, environment):
-        self.environment = environment
-
-    def visit_If(self, node):
-        """Eliminate dead code."""
-        # do not optimize ifs that have a block inside so that it doesn't
-        # break super().
-        if node.find(nodes.Block) is not None:
-            return self.generic_visit(node)
-        try:
-            val = self.visit(node.test).as_const()
-        except nodes.Impossible:
-            return self.generic_visit(node)
-        if val:
-            body = node.body
-        else:
-            body = node.else_
-        result = []
-        for node in body:
-            result.extend(self.visit_list(node))
-        return result
-
-    def fold(self, node):
-        """Do constant folding."""
-        node = self.generic_visit(node)
-        try:
-            return nodes.Const.from_untrusted(node.as_const(),
-                                              lineno=node.lineno,
-                                              environment=self.environment)
-        except nodes.Impossible:
-            return node
-
-    visit_Add = visit_Sub = visit_Mul = visit_Div = visit_FloorDiv = \
-    visit_Pow = visit_Mod = visit_And = visit_Or = visit_Pos = visit_Neg = \
-    visit_Not = visit_Compare = visit_Getitem = visit_Getattr = visit_Call = \
-    visit_Filter = visit_Test = visit_CondExpr = fold
-    del fold
diff --git a/third_party/jinja2/parser.py b/third_party/jinja2/parser.py
deleted file mode 100644
index d24da18..0000000
--- a/third_party/jinja2/parser.py
+++ /dev/null
@@ -1,899 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.parser
-    ~~~~~~~~~~~~~
-
-    Implements the template parser.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-from jinja2 import nodes
-from jinja2.exceptions import TemplateSyntaxError, TemplateAssertionError
-from jinja2.lexer import describe_token, describe_token_expr
-from jinja2._compat import imap
-
-
-_statement_keywords = frozenset(['for', 'if', 'block', 'extends', 'print',
-                                 'macro', 'include', 'from', 'import',
-                                 'set'])
-_compare_operators = frozenset(['eq', 'ne', 'lt', 'lteq', 'gt', 'gteq'])
-
-
-class Parser(object):
-    """This is the central parsing class Jinja2 uses.  It's passed to
-    extensions and can be used to parse expressions or statements.
-    """
-
-    def __init__(self, environment, source, name=None, filename=None,
-                 state=None):
-        self.environment = environment
-        self.stream = environment._tokenize(source, name, filename, state)
-        self.name = name
-        self.filename = filename
-        self.closed = False
-        self.extensions = {}
-        for extension in environment.iter_extensions():
-            for tag in extension.tags:
-                self.extensions[tag] = extension.parse
-        self._last_identifier = 0
-        self._tag_stack = []
-        self._end_token_stack = []
-
-    def fail(self, msg, lineno=None, exc=TemplateSyntaxError):
-        """Convenience method that raises `exc` with the message, passed
-        line number or last line number as well as the current name and
-        filename.
-        """
-        if lineno is None:
-            lineno = self.stream.current.lineno
-        raise exc(msg, lineno, self.name, self.filename)
-
-    def _fail_ut_eof(self, name, end_token_stack, lineno):
-        expected = []
-        for exprs in end_token_stack:
-            expected.extend(imap(describe_token_expr, exprs))
-        if end_token_stack:
-            currently_looking = ' or '.join(
-                "'%s'" % describe_token_expr(expr)
-                for expr in end_token_stack[-1])
-        else:
-            currently_looking = None
-
-        if name is None:
-            message = ['Unexpected end of template.']
-        else:
-            message = ['Encountered unknown tag \'%s\'.' % name]
-
-        if currently_looking:
-            if name is not None and name in expected:
-                message.append('You probably made a nesting mistake. Jinja '
-                               'is expecting this tag, but currently looking '
-                               'for %s.' % currently_looking)
-            else:
-                message.append('Jinja was looking for the following tags: '
-                               '%s.' % currently_looking)
-
-        if self._tag_stack:
-            message.append('The innermost block that needs to be '
-                           'closed is \'%s\'.' % self._tag_stack[-1])
-
-        self.fail(' '.join(message), lineno)
-
-    def fail_unknown_tag(self, name, lineno=None):
-        """Called if the parser encounters an unknown tag.  Tries to fail
-        with a human readable error message that could help to identify
-        the problem.
-        """
-        return self._fail_ut_eof(name, self._end_token_stack, lineno)
-
-    def fail_eof(self, end_tokens=None, lineno=None):
-        """Like fail_unknown_tag but for end of template situations."""
-        stack = list(self._end_token_stack)
-        if end_tokens is not None:
-            stack.append(end_tokens)
-        return self._fail_ut_eof(None, stack, lineno)
-
-    def is_tuple_end(self, extra_end_rules=None):
-        """Are we at the end of a tuple?"""
-        if self.stream.current.type in ('variable_end', 'block_end', 'rparen'):
-            return True
-        elif extra_end_rules is not None:
-            return self.stream.current.test_any(extra_end_rules)
-        return False
-
-    def free_identifier(self, lineno=None):
-        """Return a new free identifier as :class:`~jinja2.nodes.InternalName`."""
-        self._last_identifier += 1
-        rv = object.__new__(nodes.InternalName)
-        nodes.Node.__init__(rv, 'fi%d' % self._last_identifier, lineno=lineno)
-        return rv
-
-    def parse_statement(self):
-        """Parse a single statement."""
-        token = self.stream.current
-        if token.type != 'name':
-            self.fail('tag name expected', token.lineno)
-        self._tag_stack.append(token.value)
-        pop_tag = True
-        try:
-            if token.value in _statement_keywords:
-                return getattr(self, 'parse_' + self.stream.current.value)()
-            if token.value == 'call':
-                return self.parse_call_block()
-            if token.value == 'filter':
-                return self.parse_filter_block()
-            ext = self.extensions.get(token.value)
-            if ext is not None:
-                return ext(self)
-
-            # did not work out, remove the token we pushed by accident
-            # from the stack so that the unknown tag fail function can
-            # produce a proper error message.
-            self._tag_stack.pop()
-            pop_tag = False
-            self.fail_unknown_tag(token.value, token.lineno)
-        finally:
-            if pop_tag:
-                self._tag_stack.pop()
-
-    def parse_statements(self, end_tokens, drop_needle=False):
-        """Parse multiple statements into a list until one of the end tokens
-        is reached.  This is used to parse the body of statements as it also
-        parses template data if appropriate.  The parser checks first if the
-        current token is a colon and skips it if there is one.  Then it checks
-        for the block end and parses until if one of the `end_tokens` is
-        reached.  Per default the active token in the stream at the end of
-        the call is the matched end token.  If this is not wanted `drop_needle`
-        can be set to `True` and the end token is removed.
-        """
-        # the first token may be a colon for python compatibility
-        self.stream.skip_if('colon')
-
-        # in the future it would be possible to add whole code sections
-        # by adding some sort of end of statement token and parsing those here.
-        self.stream.expect('block_end')
-        result = self.subparse(end_tokens)
-
-        # we reached the end of the template too early, the subparser
-        # does not check for this, so we do that now
-        if self.stream.current.type == 'eof':
-            self.fail_eof(end_tokens)
-
-        if drop_needle:
-            next(self.stream)
-        return result
-
-    def parse_set(self):
-        """Parse an assign statement."""
-        lineno = next(self.stream).lineno
-        target = self.parse_assign_target()
-        if self.stream.skip_if('assign'):
-            expr = self.parse_tuple()
-            return nodes.Assign(target, expr, lineno=lineno)
-        body = self.parse_statements(('name:endset',),
-                                     drop_needle=True)
-        return nodes.AssignBlock(target, body, lineno=lineno)
-
-    def parse_for(self):
-        """Parse a for loop."""
-        lineno = self.stream.expect('name:for').lineno
-        target = self.parse_assign_target(extra_end_rules=('name:in',))
-        self.stream.expect('name:in')
-        iter = self.parse_tuple(with_condexpr=False,
-                                extra_end_rules=('name:recursive',))
-        test = None
-        if self.stream.skip_if('name:if'):
-            test = self.parse_expression()
-        recursive = self.stream.skip_if('name:recursive')
-        body = self.parse_statements(('name:endfor', 'name:else'))
-        if next(self.stream).value == 'endfor':
-            else_ = []
-        else:
-            else_ = self.parse_statements(('name:endfor',), drop_needle=True)
-        return nodes.For(target, iter, body, else_, test,
-                         recursive, lineno=lineno)
-
-    def parse_if(self):
-        """Parse an if construct."""
-        node = result = nodes.If(lineno=self.stream.expect('name:if').lineno)
-        while 1:
-            node.test = self.parse_tuple(with_condexpr=False)
-            node.body = self.parse_statements(('name:elif', 'name:else',
-                                               'name:endif'))
-            token = next(self.stream)
-            if token.test('name:elif'):
-                new_node = nodes.If(lineno=self.stream.current.lineno)
-                node.else_ = [new_node]
-                node = new_node
-                continue
-            elif token.test('name:else'):
-                node.else_ = self.parse_statements(('name:endif',),
-                                                   drop_needle=True)
-            else:
-                node.else_ = []
-            break
-        return result
-
-    def parse_block(self):
-        node = nodes.Block(lineno=next(self.stream).lineno)
-        node.name = self.stream.expect('name').value
-        node.scoped = self.stream.skip_if('name:scoped')
-
-        # common problem people encounter when switching from django
-        # to jinja.  we do not support hyphens in block names, so let's
-        # raise a nicer error message in that case.
-        if self.stream.current.type == 'sub':
-            self.fail('Block names in Jinja have to be valid Python '
-                      'identifiers and may not contain hyphens, use an '
-                      'underscore instead.')
-
-        node.body = self.parse_statements(('name:endblock',), drop_needle=True)
-        self.stream.skip_if('name:' + node.name)
-        return node
-
-    def parse_extends(self):
-        node = nodes.Extends(lineno=next(self.stream).lineno)
-        node.template = self.parse_expression()
-        return node
-
-    def parse_import_context(self, node, default):
-        if self.stream.current.test_any('name:with', 'name:without') and \
-           self.stream.look().test('name:context'):
-            node.with_context = next(self.stream).value == 'with'
-            self.stream.skip()
-        else:
-            node.with_context = default
-        return node
-
-    def parse_include(self):
-        node = nodes.Include(lineno=next(self.stream).lineno)
-        node.template = self.parse_expression()
-        if self.stream.current.test('name:ignore') and \
-           self.stream.look().test('name:missing'):
-            node.ignore_missing = True
-            self.stream.skip(2)
-        else:
-            node.ignore_missing = False
-        return self.parse_import_context(node, True)
-
-    def parse_import(self):
-        node = nodes.Import(lineno=next(self.stream).lineno)
-        node.template = self.parse_expression()
-        self.stream.expect('name:as')
-        node.target = self.parse_assign_target(name_only=True).name
-        return self.parse_import_context(node, False)
-
-    def parse_from(self):
-        node = nodes.FromImport(lineno=next(self.stream).lineno)
-        node.template = self.parse_expression()
-        self.stream.expect('name:import')
-        node.names = []
-
-        def parse_context():
-            if self.stream.current.value in ('with', 'without') and \
-               self.stream.look().test('name:context'):
-                node.with_context = next(self.stream).value == 'with'
-                self.stream.skip()
-                return True
-            return False
-
-        while 1:
-            if node.names:
-                self.stream.expect('comma')
-            if self.stream.current.type == 'name':
-                if parse_context():
-                    break
-                target = self.parse_assign_target(name_only=True)
-                if target.name.startswith('_'):
-                    self.fail('names starting with an underline can not '
-                              'be imported', target.lineno,
-                              exc=TemplateAssertionError)
-                if self.stream.skip_if('name:as'):
-                    alias = self.parse_assign_target(name_only=True)
-                    node.names.append((target.name, alias.name))
-                else:
-                    node.names.append(target.name)
-                if parse_context() or self.stream.current.type != 'comma':
-                    break
-            else:
-                break
-        if not hasattr(node, 'with_context'):
-            node.with_context = False
-            self.stream.skip_if('comma')
-        return node
-
-    def parse_signature(self, node):
-        node.args = args = []
-        node.defaults = defaults = []
-        self.stream.expect('lparen')
-        while self.stream.current.type != 'rparen':
-            if args:
-                self.stream.expect('comma')
-            arg = self.parse_assign_target(name_only=True)
-            arg.set_ctx('param')
-            if self.stream.skip_if('assign'):
-                defaults.append(self.parse_expression())
-            elif defaults:
-                self.fail('non-default argument follows default argument')
-            args.append(arg)
-        self.stream.expect('rparen')
-
-    def parse_call_block(self):
-        node = nodes.CallBlock(lineno=next(self.stream).lineno)
-        if self.stream.current.type == 'lparen':
-            self.parse_signature(node)
-        else:
-            node.args = []
-            node.defaults = []
-
-        node.call = self.parse_expression()
-        if not isinstance(node.call, nodes.Call):
-            self.fail('expected call', node.lineno)
-        node.body = self.parse_statements(('name:endcall',), drop_needle=True)
-        return node
-
-    def parse_filter_block(self):
-        node = nodes.FilterBlock(lineno=next(self.stream).lineno)
-        node.filter = self.parse_filter(None, start_inline=True)
-        node.body = self.parse_statements(('name:endfilter',),
-                                          drop_needle=True)
-        return node
-
-    def parse_macro(self):
-        node = nodes.Macro(lineno=next(self.stream).lineno)
-        node.name = self.parse_assign_target(name_only=True).name
-        self.parse_signature(node)
-        node.body = self.parse_statements(('name:endmacro',),
-                                          drop_needle=True)
-        return node
-
-    def parse_print(self):
-        node = nodes.Output(lineno=next(self.stream).lineno)
-        node.nodes = []
-        while self.stream.current.type != 'block_end':
-            if node.nodes:
-                self.stream.expect('comma')
-            node.nodes.append(self.parse_expression())
-        return node
-
-    def parse_assign_target(self, with_tuple=True, name_only=False,
-                            extra_end_rules=None):
-        """Parse an assignment target.  As Jinja2 allows assignments to
-        tuples, this function can parse all allowed assignment targets.  Per
-        default assignments to tuples are parsed, that can be disable however
-        by setting `with_tuple` to `False`.  If only assignments to names are
-        wanted `name_only` can be set to `True`.  The `extra_end_rules`
-        parameter is forwarded to the tuple parsing function.
-        """
-        if name_only:
-            token = self.stream.expect('name')
-            target = nodes.Name(token.value, 'store', lineno=token.lineno)
-        else:
-            if with_tuple:
-                target = self.parse_tuple(simplified=True,
-                                          extra_end_rules=extra_end_rules)
-            else:
-                target = self.parse_primary()
-            target.set_ctx('store')
-        if not target.can_assign():
-            self.fail('can\'t assign to %r' % target.__class__.
-                      __name__.lower(), target.lineno)
-        return target
-
-    def parse_expression(self, with_condexpr=True):
-        """Parse an expression.  Per default all expressions are parsed, if
-        the optional `with_condexpr` parameter is set to `False` conditional
-        expressions are not parsed.
-        """
-        if with_condexpr:
-            return self.parse_condexpr()
-        return self.parse_or()
-
-    def parse_condexpr(self):
-        lineno = self.stream.current.lineno
-        expr1 = self.parse_or()
-        while self.stream.skip_if('name:if'):
-            expr2 = self.parse_or()
-            if self.stream.skip_if('name:else'):
-                expr3 = self.parse_condexpr()
-            else:
-                expr3 = None
-            expr1 = nodes.CondExpr(expr2, expr1, expr3, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return expr1
-
-    def parse_or(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_and()
-        while self.stream.skip_if('name:or'):
-            right = self.parse_and()
-            left = nodes.Or(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_and(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_not()
-        while self.stream.skip_if('name:and'):
-            right = self.parse_not()
-            left = nodes.And(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_not(self):
-        if self.stream.current.test('name:not'):
-            lineno = next(self.stream).lineno
-            return nodes.Not(self.parse_not(), lineno=lineno)
-        return self.parse_compare()
-
-    def parse_compare(self):
-        lineno = self.stream.current.lineno
-        expr = self.parse_add()
-        ops = []
-        while 1:
-            token_type = self.stream.current.type
-            if token_type in _compare_operators:
-                next(self.stream)
-                ops.append(nodes.Operand(token_type, self.parse_add()))
-            elif self.stream.skip_if('name:in'):
-                ops.append(nodes.Operand('in', self.parse_add()))
-            elif (self.stream.current.test('name:not') and
-                  self.stream.look().test('name:in')):
-                self.stream.skip(2)
-                ops.append(nodes.Operand('notin', self.parse_add()))
-            else:
-                break
-            lineno = self.stream.current.lineno
-        if not ops:
-            return expr
-        return nodes.Compare(expr, ops, lineno=lineno)
-
-    def parse_add(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_sub()
-        while self.stream.current.type == 'add':
-            next(self.stream)
-            right = self.parse_sub()
-            left = nodes.Add(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_sub(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_concat()
-        while self.stream.current.type == 'sub':
-            next(self.stream)
-            right = self.parse_concat()
-            left = nodes.Sub(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_concat(self):
-        lineno = self.stream.current.lineno
-        args = [self.parse_mul()]
-        while self.stream.current.type == 'tilde':
-            next(self.stream)
-            args.append(self.parse_mul())
-        if len(args) == 1:
-            return args[0]
-        return nodes.Concat(args, lineno=lineno)
-
-    def parse_mul(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_div()
-        while self.stream.current.type == 'mul':
-            next(self.stream)
-            right = self.parse_div()
-            left = nodes.Mul(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_div(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_floordiv()
-        while self.stream.current.type == 'div':
-            next(self.stream)
-            right = self.parse_floordiv()
-            left = nodes.Div(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_floordiv(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_mod()
-        while self.stream.current.type == 'floordiv':
-            next(self.stream)
-            right = self.parse_mod()
-            left = nodes.FloorDiv(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_mod(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_pow()
-        while self.stream.current.type == 'mod':
-            next(self.stream)
-            right = self.parse_pow()
-            left = nodes.Mod(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_pow(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_unary()
-        while self.stream.current.type == 'pow':
-            next(self.stream)
-            right = self.parse_unary()
-            left = nodes.Pow(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_unary(self, with_filter=True):
-        token_type = self.stream.current.type
-        lineno = self.stream.current.lineno
-        if token_type == 'sub':
-            next(self.stream)
-            node = nodes.Neg(self.parse_unary(False), lineno=lineno)
-        elif token_type == 'add':
-            next(self.stream)
-            node = nodes.Pos(self.parse_unary(False), lineno=lineno)
-        else:
-            node = self.parse_primary()
-        node = self.parse_postfix(node)
-        if with_filter:
-            node = self.parse_filter_expr(node)
-        return node
-
-    def parse_primary(self):
-        token = self.stream.current
-        if token.type == 'name':
-            if token.value in ('true', 'false', 'True', 'False'):
-                node = nodes.Const(token.value in ('true', 'True'),
-                                   lineno=token.lineno)
-            elif token.value in ('none', 'None'):
-                node = nodes.Const(None, lineno=token.lineno)
-            else:
-                node = nodes.Name(token.value, 'load', lineno=token.lineno)
-            next(self.stream)
-        elif token.type == 'string':
-            next(self.stream)
-            buf = [token.value]
-            lineno = token.lineno
-            while self.stream.current.type == 'string':
-                buf.append(self.stream.current.value)
-                next(self.stream)
-            node = nodes.Const(''.join(buf), lineno=lineno)
-        elif token.type in ('integer', 'float'):
-            next(self.stream)
-            node = nodes.Const(token.value, lineno=token.lineno)
-        elif token.type == 'lparen':
-            next(self.stream)
-            node = self.parse_tuple(explicit_parentheses=True)
-            self.stream.expect('rparen')
-        elif token.type == 'lbracket':
-            node = self.parse_list()
-        elif token.type == 'lbrace':
-            node = self.parse_dict()
-        else:
-            self.fail("unexpected '%s'" % describe_token(token), token.lineno)
-        return node
-
-    def parse_tuple(self, simplified=False, with_condexpr=True,
-                    extra_end_rules=None, explicit_parentheses=False):
-        """Works like `parse_expression` but if multiple expressions are
-        delimited by a comma a :class:`~jinja2.nodes.Tuple` node is created.
-        This method could also return a regular expression instead of a tuple
-        if no commas where found.
-
-        The default parsing mode is a full tuple.  If `simplified` is `True`
-        only names and literals are parsed.  The `no_condexpr` parameter is
-        forwarded to :meth:`parse_expression`.
-
-        Because tuples do not require delimiters and may end in a bogus comma
-        an extra hint is needed that marks the end of a tuple.  For example
-        for loops support tuples between `for` and `in`.  In that case the
-        `extra_end_rules` is set to ``['name:in']``.
-
-        `explicit_parentheses` is true if the parsing was triggered by an
-        expression in parentheses.  This is used to figure out if an empty
-        tuple is a valid expression or not.
-        """
-        lineno = self.stream.current.lineno
-        if simplified:
-            parse = self.parse_primary
-        elif with_condexpr:
-            parse = self.parse_expression
-        else:
-            parse = lambda: self.parse_expression(with_condexpr=False)
-        args = []
-        is_tuple = False
-        while 1:
-            if args:
-                self.stream.expect('comma')
-            if self.is_tuple_end(extra_end_rules):
-                break
-            args.append(parse())
-            if self.stream.current.type == 'comma':
-                is_tuple = True
-            else:
-                break
-            lineno = self.stream.current.lineno
-
-        if not is_tuple:
-            if args:
-                return args[0]
-
-            # if we don't have explicit parentheses, an empty tuple is
-            # not a valid expression.  This would mean nothing (literally
-            # nothing) in the spot of an expression would be an empty
-            # tuple.
-            if not explicit_parentheses:
-                self.fail('Expected an expression, got \'%s\'' %
-                          describe_token(self.stream.current))
-
-        return nodes.Tuple(args, 'load', lineno=lineno)
-
-    def parse_list(self):
-        token = self.stream.expect('lbracket')
-        items = []
-        while self.stream.current.type != 'rbracket':
-            if items:
-                self.stream.expect('comma')
-            if self.stream.current.type == 'rbracket':
-                break
-            items.append(self.parse_expression())
-        self.stream.expect('rbracket')
-        return nodes.List(items, lineno=token.lineno)
-
-    def parse_dict(self):
-        token = self.stream.expect('lbrace')
-        items = []
-        while self.stream.current.type != 'rbrace':
-            if items:
-                self.stream.expect('comma')
-            if self.stream.current.type == 'rbrace':
-                break
-            key = self.parse_expression()
-            self.stream.expect('colon')
-            value = self.parse_expression()
-            items.append(nodes.Pair(key, value, lineno=key.lineno))
-        self.stream.expect('rbrace')
-        return nodes.Dict(items, lineno=token.lineno)
-
-    def parse_postfix(self, node):
-        while 1:
-            token_type = self.stream.current.type
-            if token_type == 'dot' or token_type == 'lbracket':
-                node = self.parse_subscript(node)
-            # calls are valid both after postfix expressions (getattr
-            # and getitem) as well as filters and tests
-            elif token_type == 'lparen':
-                node = self.parse_call(node)
-            else:
-                break
-        return node
-
-    def parse_filter_expr(self, node):
-        while 1:
-            token_type = self.stream.current.type
-            if token_type == 'pipe':
-                node = self.parse_filter(node)
-            elif token_type == 'name' and self.stream.current.value == 'is':
-                node = self.parse_test(node)
-            # calls are valid both after postfix expressions (getattr
-            # and getitem) as well as filters and tests
-            elif token_type == 'lparen':
-                node = self.parse_call(node)
-            else:
-                break
-        return node
-
-    def parse_subscript(self, node):
-        token = next(self.stream)
-        if token.type == 'dot':
-            attr_token = self.stream.current
-            next(self.stream)
-            if attr_token.type == 'name':
-                return nodes.Getattr(node, attr_token.value, 'load',
-                                     lineno=token.lineno)
-            elif attr_token.type != 'integer':
-                self.fail('expected name or number', attr_token.lineno)
-            arg = nodes.Const(attr_token.value, lineno=attr_token.lineno)
-            return nodes.Getitem(node, arg, 'load', lineno=token.lineno)
-        if token.type == 'lbracket':
-            args = []
-            while self.stream.current.type != 'rbracket':
-                if args:
-                    self.stream.expect('comma')
-                args.append(self.parse_subscribed())
-            self.stream.expect('rbracket')
-            if len(args) == 1:
-                arg = args[0]
-            else:
-                arg = nodes.Tuple(args, 'load', lineno=token.lineno)
-            return nodes.Getitem(node, arg, 'load', lineno=token.lineno)
-        self.fail('expected subscript expression', self.lineno)
-
-    def parse_subscribed(self):
-        lineno = self.stream.current.lineno
-
-        if self.stream.current.type == 'colon':
-            next(self.stream)
-            args = [None]
-        else:
-            node = self.parse_expression()
-            if self.stream.current.type != 'colon':
-                return node
-            next(self.stream)
-            args = [node]
-
-        if self.stream.current.type == 'colon':
-            args.append(None)
-        elif self.stream.current.type not in ('rbracket', 'comma'):
-            args.append(self.parse_expression())
-        else:
-            args.append(None)
-
-        if self.stream.current.type == 'colon':
-            next(self.stream)
-            if self.stream.current.type not in ('rbracket', 'comma'):
-                args.append(self.parse_expression())
-            else:
-                args.append(None)
-        else:
-            args.append(None)
-
-        return nodes.Slice(lineno=lineno, *args)
-
-    def parse_call(self, node):
-        token = self.stream.expect('lparen')
-        args = []
-        kwargs = []
-        dyn_args = dyn_kwargs = None
-        require_comma = False
-
-        def ensure(expr):
-            if not expr:
-                self.fail('invalid syntax for function call expression',
-                          token.lineno)
-
-        while self.stream.current.type != 'rparen':
-            if require_comma:
-                self.stream.expect('comma')
-                # support for trailing comma
-                if self.stream.current.type == 'rparen':
-                    break
-            if self.stream.current.type == 'mul':
-                ensure(dyn_args is None and dyn_kwargs is None)
-                next(self.stream)
-                dyn_args = self.parse_expression()
-            elif self.stream.current.type == 'pow':
-                ensure(dyn_kwargs is None)
-                next(self.stream)
-                dyn_kwargs = self.parse_expression()
-            else:
-                ensure(dyn_args is None and dyn_kwargs is None)
-                if self.stream.current.type == 'name' and \
-                   self.stream.look().type == 'assign':
-                    key = self.stream.current.value
-                    self.stream.skip(2)
-                    value = self.parse_expression()
-                    kwargs.append(nodes.Keyword(key, value,
-                                                lineno=value.lineno))
-                else:
-                    ensure(not kwargs)
-                    args.append(self.parse_expression())
-
-            require_comma = True
-        self.stream.expect('rparen')
-
-        if node is None:
-            return args, kwargs, dyn_args, dyn_kwargs
-        return nodes.Call(node, args, kwargs, dyn_args, dyn_kwargs,
-                          lineno=token.lineno)
-
-    def parse_filter(self, node, start_inline=False):
-        while self.stream.current.type == 'pipe' or start_inline:
-            if not start_inline:
-                next(self.stream)
-            token = self.stream.expect('name')
-            name = token.value
-            while self.stream.current.type == 'dot':
-                next(self.stream)
-                name += '.' + self.stream.expect('name').value
-            if self.stream.current.type == 'lparen':
-                args, kwargs, dyn_args, dyn_kwargs = self.parse_call(None)
-            else:
-                args = []
-                kwargs = []
-                dyn_args = dyn_kwargs = None
-            node = nodes.Filter(node, name, args, kwargs, dyn_args,
-                                dyn_kwargs, lineno=token.lineno)
-            start_inline = False
-        return node
-
-    def parse_test(self, node):
-        token = next(self.stream)
-        if self.stream.current.test('name:not'):
-            next(self.stream)
-            negated = True
-        else:
-            negated = False
-        name = self.stream.expect('name').value
-        while self.stream.current.type == 'dot':
-            next(self.stream)
-            name += '.' + self.stream.expect('name').value
-        dyn_args = dyn_kwargs = None
-        kwargs = []
-        if self.stream.current.type == 'lparen':
-            args, kwargs, dyn_args, dyn_kwargs = self.parse_call(None)
-        elif (self.stream.current.type in ('name', 'string', 'integer',
-                                           'float', 'lparen', 'lbracket',
-                                           'lbrace') and not
-              self.stream.current.test_any('name:else', 'name:or',
-                                           'name:and')):
-            if self.stream.current.test('name:is'):
-                self.fail('You cannot chain multiple tests with is')
-            args = [self.parse_expression()]
-        else:
-            args = []
-        node = nodes.Test(node, name, args, kwargs, dyn_args,
-                          dyn_kwargs, lineno=token.lineno)
-        if negated:
-            node = nodes.Not(node, lineno=token.lineno)
-        return node
-
-    def subparse(self, end_tokens=None):
-        body = []
-        data_buffer = []
-        add_data = data_buffer.append
-
-        if end_tokens is not None:
-            self._end_token_stack.append(end_tokens)
-
-        def flush_data():
-            if data_buffer:
-                lineno = data_buffer[0].lineno
-                body.append(nodes.Output(data_buffer[:], lineno=lineno))
-                del data_buffer[:]
-
-        try:
-            while self.stream:
-                token = self.stream.current
-                if token.type == 'data':
-                    if token.value:
-                        add_data(nodes.TemplateData(token.value,
-                                                    lineno=token.lineno))
-                    next(self.stream)
-                elif token.type == 'variable_begin':
-                    next(self.stream)
-                    add_data(self.parse_tuple(with_condexpr=True))
-                    self.stream.expect('variable_end')
-                elif token.type == 'block_begin':
-                    flush_data()
-                    next(self.stream)
-                    if end_tokens is not None and \
-                       self.stream.current.test_any(*end_tokens):
-                        return body
-                    rv = self.parse_statement()
-                    if isinstance(rv, list):
-                        body.extend(rv)
-                    else:
-                        body.append(rv)
-                    self.stream.expect('block_end')
-                else:
-                    raise AssertionError('internal parsing error')
-
-            flush_data()
-        finally:
-            if end_tokens is not None:
-                self._end_token_stack.pop()
-
-        return body
-
-    def parse(self):
-        """Parse the whole template into a `Template` node."""
-        result = nodes.Template(self.subparse(), lineno=1)
-        result.set_environment(self.environment)
-        return result
diff --git a/third_party/jinja2/runtime.py b/third_party/jinja2/runtime.py
deleted file mode 100644
index 685a12d..0000000
--- a/third_party/jinja2/runtime.py
+++ /dev/null
@@ -1,667 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.runtime
-    ~~~~~~~~~~~~~~
-
-    Runtime helpers.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD.
-"""
-import sys
-
-from itertools import chain
-from jinja2.nodes import EvalContext, _context_function_types
-from jinja2.utils import Markup, soft_unicode, escape, missing, concat, \
-     internalcode, object_type_repr
-from jinja2.exceptions import UndefinedError, TemplateRuntimeError, \
-     TemplateNotFound
-from jinja2._compat import imap, text_type, iteritems, \
-     implements_iterator, implements_to_string, string_types, PY2
-
-
-# these variables are exported to the template runtime
-__all__ = ['LoopContext', 'TemplateReference', 'Macro', 'Markup',
-           'TemplateRuntimeError', 'missing', 'concat', 'escape',
-           'markup_join', 'unicode_join', 'to_string', 'identity',
-           'TemplateNotFound', 'make_logging_undefined']
-
-#: the name of the function that is used to convert something into
-#: a string.  We can just use the text type here.
-to_string = text_type
-
-#: the identity function.  Useful for certain things in the environment
-identity = lambda x: x
-
-_last_iteration = object()
-
-
-def markup_join(seq):
-    """Concatenation that escapes if necessary and converts to unicode."""
-    buf = []
-    iterator = imap(soft_unicode, seq)
-    for arg in iterator:
-        buf.append(arg)
-        if hasattr(arg, '__html__'):
-            return Markup(u'').join(chain(buf, iterator))
-    return concat(buf)
-
-
-def unicode_join(seq):
-    """Simple args to unicode conversion and concatenation."""
-    return concat(imap(text_type, seq))
-
-
-def new_context(environment, template_name, blocks, vars=None,
-                shared=None, globals=None, locals=None):
-    """Internal helper to for context creation."""
-    if vars is None:
-        vars = {}
-    if shared:
-        parent = vars
-    else:
-        parent = dict(globals or (), **vars)
-    if locals:
-        # if the parent is shared a copy should be created because
-        # we don't want to modify the dict passed
-        if shared:
-            parent = dict(parent)
-        for key, value in iteritems(locals):
-            if key[:2] == 'l_' and value is not missing:
-                parent[key[2:]] = value
-    return environment.context_class(environment, parent, template_name,
-                                     blocks)
-
-
-class TemplateReference(object):
-    """The `self` in templates."""
-
-    def __init__(self, context):
-        self.__context = context
-
-    def __getitem__(self, name):
-        blocks = self.__context.blocks[name]
-        return BlockReference(name, self.__context, blocks, 0)
-
-    def __repr__(self):
-        return '<%s %r>' % (
-            self.__class__.__name__,
-            self.__context.name
-        )
-
-
-class Context(object):
-    """The template context holds the variables of a template.  It stores the
-    values passed to the template and also the names the template exports.
-    Creating instances is neither supported nor useful as it's created
-    automatically at various stages of the template evaluation and should not
-    be created by hand.
-
-    The context is immutable.  Modifications on :attr:`parent` **must not**
-    happen and modifications on :attr:`vars` are allowed from generated
-    template code only.  Template filters and global functions marked as
-    :func:`contextfunction`\s get the active context passed as first argument
-    and are allowed to access the context read-only.
-
-    The template context supports read only dict operations (`get`,
-    `keys`, `values`, `items`, `iterkeys`, `itervalues`, `iteritems`,
-    `__getitem__`, `__contains__`).  Additionally there is a :meth:`resolve`
-    method that doesn't fail with a `KeyError` but returns an
-    :class:`Undefined` object for missing variables.
-    """
-    __slots__ = ('parent', 'vars', 'environment', 'eval_ctx', 'exported_vars',
-                 'name', 'blocks', '__weakref__')
-
-    def __init__(self, environment, parent, name, blocks):
-        self.parent = parent
-        self.vars = {}
-        self.environment = environment
-        self.eval_ctx = EvalContext(self.environment, name)
-        self.exported_vars = set()
-        self.name = name
-
-        # create the initial mapping of blocks.  Whenever template inheritance
-        # takes place the runtime will update this mapping with the new blocks
-        # from the template.
-        self.blocks = dict((k, [v]) for k, v in iteritems(blocks))
-
-    def super(self, name, current):
-        """Render a parent block."""
-        try:
-            blocks = self.blocks[name]
-            index = blocks.index(current) + 1
-            blocks[index]
-        except LookupError:
-            return self.environment.undefined('there is no parent block '
-                                              'called %r.' % name,
-                                              name='super')
-        return BlockReference(name, self, blocks, index)
-
-    def get(self, key, default=None):
-        """Returns an item from the template context, if it doesn't exist
-        `default` is returned.
-        """
-        try:
-            return self[key]
-        except KeyError:
-            return default
-
-    def resolve(self, key):
-        """Looks up a variable like `__getitem__` or `get` but returns an
-        :class:`Undefined` object with the name of the name looked up.
-        """
-        if key in self.vars:
-            return self.vars[key]
-        if key in self.parent:
-            return self.parent[key]
-        return self.environment.undefined(name=key)
-
-    def get_exported(self):
-        """Get a new dict with the exported variables."""
-        return dict((k, self.vars[k]) for k in self.exported_vars)
-
-    def get_all(self):
-        """Return a copy of the complete context as dict including the
-        exported variables.
-        """
-        return dict(self.parent, **self.vars)
-
-    @internalcode
-    def call(__self, __obj, *args, **kwargs):
-        """Call the callable with the arguments and keyword arguments
-        provided but inject the active context or environment as first
-        argument if the callable is a :func:`contextfunction` or
-        :func:`environmentfunction`.
-        """
-        if __debug__:
-            __traceback_hide__ = True  # noqa
-
-        # Allow callable classes to take a context
-        fn = __obj.__call__
-        for fn_type in ('contextfunction',
-                        'evalcontextfunction',
-                        'environmentfunction'):
-            if hasattr(fn, fn_type):
-                __obj = fn
-                break
-
-        if isinstance(__obj, _context_function_types):
-            if getattr(__obj, 'contextfunction', 0):
-                args = (__self,) + args
-            elif getattr(__obj, 'evalcontextfunction', 0):
-                args = (__self.eval_ctx,) + args
-            elif getattr(__obj, 'environmentfunction', 0):
-                args = (__self.environment,) + args
-        try:
-            return __obj(*args, **kwargs)
-        except StopIteration:
-            return __self.environment.undefined('value was undefined because '
-                                                'a callable raised a '
-                                                'StopIteration exception')
-
-    def derived(self, locals=None):
-        """Internal helper function to create a derived context."""
-        context = new_context(self.environment, self.name, {},
-                              self.parent, True, None, locals)
-        context.vars.update(self.vars)
-        context.eval_ctx = self.eval_ctx
-        context.blocks.update((k, list(v)) for k, v in iteritems(self.blocks))
-        return context
-
-    def _all(meth):
-        proxy = lambda self: getattr(self.get_all(), meth)()
-        proxy.__doc__ = getattr(dict, meth).__doc__
-        proxy.__name__ = meth
-        return proxy
-
-    keys = _all('keys')
-    values = _all('values')
-    items = _all('items')
-
-    # not available on python 3
-    if PY2:
-        iterkeys = _all('iterkeys')
-        itervalues = _all('itervalues')
-        iteritems = _all('iteritems')
-    del _all
-
-    def __contains__(self, name):
-        return name in self.vars or name in self.parent
-
-    def __getitem__(self, key):
-        """Lookup a variable or raise `KeyError` if the variable is
-        undefined.
-        """
-        item = self.resolve(key)
-        if isinstance(item, Undefined):
-            raise KeyError(key)
-        return item
-
-    def __repr__(self):
-        return '<%s %s of %r>' % (
-            self.__class__.__name__,
-            repr(self.get_all()),
-            self.name
-        )
-
-
-# register the context as mapping if possible
-try:
-    from collections import Mapping
-    Mapping.register(Context)
-except ImportError:
-    pass
-
-
-class BlockReference(object):
-    """One block on a template reference."""
-
-    def __init__(self, name, context, stack, depth):
-        self.name = name
-        self._context = context
-        self._stack = stack
-        self._depth = depth
-
-    @property
-    def super(self):
-        """Super the block."""
-        if self._depth + 1 >= len(self._stack):
-            return self._context.environment. \
-                undefined('there is no parent block called %r.' %
-                          self.name, name='super')
-        return BlockReference(self.name, self._context, self._stack,
-                              self._depth + 1)
-
-    @internalcode
-    def __call__(self):
-        rv = concat(self._stack[self._depth](self._context))
-        if self._context.eval_ctx.autoescape:
-            rv = Markup(rv)
-        return rv
-
-
-class LoopContext(object):
-    """A loop context for dynamic iteration."""
-
-    def __init__(self, iterable, recurse=None, depth0=0):
-        self._iterator = iter(iterable)
-        self._recurse = recurse
-        self._after = self._safe_next()
-        self.index0 = -1
-        self.depth0 = depth0
-
-        # try to get the length of the iterable early.  This must be done
-        # here because there are some broken iterators around where there
-        # __len__ is the number of iterations left (i'm looking at your
-        # listreverseiterator!).
-        try:
-            self._length = len(iterable)
-        except (TypeError, AttributeError):
-            self._length = None
-
-    def cycle(self, *args):
-        """Cycles among the arguments with the current loop index."""
-        if not args:
-            raise TypeError('no items for cycling given')
-        return args[self.index0 % len(args)]
-
-    first = property(lambda x: x.index0 == 0)
-    last = property(lambda x: x._after is _last_iteration)
-    index = property(lambda x: x.index0 + 1)
-    revindex = property(lambda x: x.length - x.index0)
-    revindex0 = property(lambda x: x.length - x.index)
-    depth = property(lambda x: x.depth0 + 1)
-
-    def __len__(self):
-        return self.length
-
-    def __iter__(self):
-        return LoopContextIterator(self)
-
-    def _safe_next(self):
-        try:
-            return next(self._iterator)
-        except StopIteration:
-            return _last_iteration
-
-    @internalcode
-    def loop(self, iterable):
-        if self._recurse is None:
-            raise TypeError('Tried to call non recursive loop.  Maybe you '
-                            "forgot the 'recursive' modifier.")
-        return self._recurse(iterable, self._recurse, self.depth0 + 1)
-
-    # a nifty trick to enhance the error message if someone tried to call
-    # the the loop without or with too many arguments.
-    __call__ = loop
-    del loop
-
-    @property
-    def length(self):
-        if self._length is None:
-            # if was not possible to get the length of the iterator when
-            # the loop context was created (ie: iterating over a generator)
-            # we have to convert the iterable into a sequence and use the
-            # length of that + the number of iterations so far.
-            iterable = tuple(self._iterator)
-            self._iterator = iter(iterable)
-            iterations_done = self.index0 + 2
-            self._length = len(iterable) + iterations_done
-        return self._length
-
-    def __repr__(self):
-        return '<%s %r/%r>' % (
-            self.__class__.__name__,
-            self.index,
-            self.length
-        )
-
-
-@implements_iterator
-class LoopContextIterator(object):
-    """The iterator for a loop context."""
-    __slots__ = ('context',)
-
-    def __init__(self, context):
-        self.context = context
-
-    def __iter__(self):
-        return self
-
-    def __next__(self):
-        ctx = self.context
-        ctx.index0 += 1
-        if ctx._after is _last_iteration:
-            raise StopIteration()
-        next_elem = ctx._after
-        ctx._after = ctx._safe_next()
-        return next_elem, ctx
-
-
-class Macro(object):
-    """Wraps a macro function."""
-
-    def __init__(self, environment, func, name, arguments, defaults,
-                 catch_kwargs, catch_varargs, caller):
-        self._environment = environment
-        self._func = func
-        self._argument_count = len(arguments)
-        self.name = name
-        self.arguments = arguments
-        self.defaults = defaults
-        self.catch_kwargs = catch_kwargs
-        self.catch_varargs = catch_varargs
-        self.caller = caller
-
-    @internalcode
-    def __call__(self, *args, **kwargs):
-        # try to consume the positional arguments
-        arguments = list(args[:self._argument_count])
-        off = len(arguments)
-
-        # if the number of arguments consumed is not the number of
-        # arguments expected we start filling in keyword arguments
-        # and defaults.
-        if off != self._argument_count:
-            for idx, name in enumerate(self.arguments[len(arguments):]):
-                try:
-                    value = kwargs.pop(name)
-                except KeyError:
-                    try:
-                        value = self.defaults[idx - self._argument_count + off]
-                    except IndexError:
-                        value = self._environment.undefined(
-                            'parameter %r was not provided' % name, name=name)
-                arguments.append(value)
-
-        # it's important that the order of these arguments does not change
-        # if not also changed in the compiler's `function_scoping` method.
-        # the order is caller, keyword arguments, positional arguments!
-        if self.caller:
-            caller = kwargs.pop('caller', None)
-            if caller is None:
-                caller = self._environment.undefined('No caller defined',
-                                                     name='caller')
-            arguments.append(caller)
-        if self.catch_kwargs:
-            arguments.append(kwargs)
-        elif kwargs:
-            raise TypeError('macro %r takes no keyword argument %r' %
-                            (self.name, next(iter(kwargs))))
-        if self.catch_varargs:
-            arguments.append(args[self._argument_count:])
-        elif len(args) > self._argument_count:
-            raise TypeError('macro %r takes not more than %d argument(s)' %
-                            (self.name, len(self.arguments)))
-        return self._func(*arguments)
-
-    def __repr__(self):
-        return '<%s %s>' % (
-            self.__class__.__name__,
-            self.name is None and 'anonymous' or repr(self.name)
-        )
-
-
-@implements_to_string
-class Undefined(object):
-    """The default undefined type.  This undefined type can be printed and
-    iterated over, but every other access will raise an :exc:`jinja2.exceptions.UndefinedError`:
-
-    >>> foo = Undefined(name='foo')
-    >>> str(foo)
-    ''
-    >>> not foo
-    True
-    >>> foo + 42
-    Traceback (most recent call last):
-      ...
-    jinja2.exceptions.UndefinedError: 'foo' is undefined
-    """
-    __slots__ = ('_undefined_hint', '_undefined_obj', '_undefined_name',
-                 '_undefined_exception')
-
-    def __init__(self, hint=None, obj=missing, name=None, exc=UndefinedError):
-        self._undefined_hint = hint
-        self._undefined_obj = obj
-        self._undefined_name = name
-        self._undefined_exception = exc
-
-    @internalcode
-    def _fail_with_undefined_error(self, *args, **kwargs):
-        """Regular callback function for undefined objects that raises an
-        `jinja2.exceptions.UndefinedError` on call.
-        """
-        if self._undefined_hint is None:
-            if self._undefined_obj is missing:
-                hint = '%r is undefined' % self._undefined_name
-            elif not isinstance(self._undefined_name, string_types):
-                hint = '%s has no element %r' % (
-                    object_type_repr(self._undefined_obj),
-                    self._undefined_name
-                )
-            else:
-                hint = '%r has no attribute %r' % (
-                    object_type_repr(self._undefined_obj),
-                    self._undefined_name
-                )
-        else:
-            hint = self._undefined_hint
-        raise self._undefined_exception(hint)
-
-    @internalcode
-    def __getattr__(self, name):
-        if name[:2] == '__':
-            raise AttributeError(name)
-        return self._fail_with_undefined_error()
-
-    __add__ = __radd__ = __mul__ = __rmul__ = __div__ = __rdiv__ = \
-        __truediv__ = __rtruediv__ = __floordiv__ = __rfloordiv__ = \
-        __mod__ = __rmod__ = __pos__ = __neg__ = __call__ = \
-        __getitem__ = __lt__ = __le__ = __gt__ = __ge__ = __int__ = \
-        __float__ = __complex__ = __pow__ = __rpow__ = \
-        _fail_with_undefined_error
-
-    def __eq__(self, other):
-        return type(self) is type(other)
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-    def __hash__(self):
-        return id(type(self))
-
-    def __str__(self):
-        return u''
-
-    def __len__(self):
-        return 0
-
-    def __iter__(self):
-        if 0:
-            yield None
-
-    def __nonzero__(self):
-        return False
-    __bool__ = __nonzero__
-
-    def __repr__(self):
-        return 'Undefined'
-
-
-def make_logging_undefined(logger=None, base=None):
-    """Given a logger object this returns a new undefined class that will
-    log certain failures.  It will log iterations and printing.  If no
-    logger is given a default logger is created.
-
-    Example::
-
-        logger = logging.getLogger(__name__)
-        LoggingUndefined = make_logging_undefined(
-            logger=logger,
-            base=Undefined
-        )
-
-    .. versionadded:: 2.8
-
-    :param logger: the logger to use.  If not provided, a default logger
-                   is created.
-    :param base: the base class to add logging functionality to.  This
-                 defaults to :class:`Undefined`.
-    """
-    if logger is None:
-        import logging
-        logger = logging.getLogger(__name__)
-        logger.addHandler(logging.StreamHandler(sys.stderr))
-    if base is None:
-        base = Undefined
-
-    def _log_message(undef):
-        if undef._undefined_hint is None:
-            if undef._undefined_obj is missing:
-                hint = '%s is undefined' % undef._undefined_name
-            elif not isinstance(undef._undefined_name, string_types):
-                hint = '%s has no element %s' % (
-                    object_type_repr(undef._undefined_obj),
-                    undef._undefined_name)
-            else:
-                hint = '%s has no attribute %s' % (
-                    object_type_repr(undef._undefined_obj),
-                    undef._undefined_name)
-        else:
-            hint = undef._undefined_hint
-        logger.warning('Template variable warning: %s', hint)
-
-    class LoggingUndefined(base):
-
-        def _fail_with_undefined_error(self, *args, **kwargs):
-            try:
-                return base._fail_with_undefined_error(self, *args, **kwargs)
-            except self._undefined_exception as e:
-                logger.error('Template variable error: %s', str(e))
-                raise e
-
-        def __str__(self):
-            rv = base.__str__(self)
-            _log_message(self)
-            return rv
-
-        def __iter__(self):
-            rv = base.__iter__(self)
-            _log_message(self)
-            return rv
-
-        if PY2:
-            def __nonzero__(self):
-                rv = base.__nonzero__(self)
-                _log_message(self)
-                return rv
-
-            def __unicode__(self):
-                rv = base.__unicode__(self)
-                _log_message(self)
-                return rv
-        else:
-            def __bool__(self):
-                rv = base.__bool__(self)
-                _log_message(self)
-                return rv
-
-    return LoggingUndefined
-
-
-@implements_to_string
-class DebugUndefined(Undefined):
-    """An undefined that returns the debug info when printed.
-
-    >>> foo = DebugUndefined(name='foo')
-    >>> str(foo)
-    '{{ foo }}'
-    >>> not foo
-    True
-    >>> foo + 42
-    Traceback (most recent call last):
-      ...
-    jinja2.exceptions.UndefinedError: 'foo' is undefined
-    """
-    __slots__ = ()
-
-    def __str__(self):
-        if self._undefined_hint is None:
-            if self._undefined_obj is missing:
-                return u'{{ %s }}' % self._undefined_name
-            return '{{ no such element: %s[%r] }}' % (
-                object_type_repr(self._undefined_obj),
-                self._undefined_name
-            )
-        return u'{{ undefined value printed: %s }}' % self._undefined_hint
-
-
-@implements_to_string
-class StrictUndefined(Undefined):
-    """An undefined that barks on print and iteration as well as boolean
-    tests and all kinds of comparisons.  In other words: you can do nothing
-    with it except checking if it's defined using the `defined` test.
-
-    >>> foo = StrictUndefined(name='foo')
-    >>> str(foo)
-    Traceback (most recent call last):
-      ...
-    jinja2.exceptions.UndefinedError: 'foo' is undefined
-    >>> not foo
-    Traceback (most recent call last):
-      ...
-    jinja2.exceptions.UndefinedError: 'foo' is undefined
-    >>> foo + 42
-    Traceback (most recent call last):
-      ...
-    jinja2.exceptions.UndefinedError: 'foo' is undefined
-    """
-    __slots__ = ()
-    __iter__ = __str__ = __len__ = __nonzero__ = __eq__ = \
-        __ne__ = __bool__ = __hash__ = \
-        Undefined._fail_with_undefined_error
-
-
-# remove remaining slots attributes, after the metaclass did the magic they
-# are unneeded and irritating as they contain wrong data for the subclasses.
-del Undefined.__slots__, DebugUndefined.__slots__, StrictUndefined.__slots__
diff --git a/third_party/jinja2/sandbox.py b/third_party/jinja2/sandbox.py
deleted file mode 100644
index 7e40ab3..0000000
--- a/third_party/jinja2/sandbox.py
+++ /dev/null
@@ -1,367 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.sandbox
-    ~~~~~~~~~~~~~~
-
-    Adds a sandbox layer to Jinja as it was the default behavior in the old
-    Jinja 1 releases.  This sandbox is slightly different from Jinja 1 as the
-    default behavior is easier to use.
-
-    The behavior can be changed by subclassing the environment.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD.
-"""
-import types
-import operator
-from jinja2.environment import Environment
-from jinja2.exceptions import SecurityError
-from jinja2._compat import string_types, PY2
-
-
-#: maximum number of items a range may produce
-MAX_RANGE = 100000
-
-#: attributes of function objects that are considered unsafe.
-if PY2:
-    UNSAFE_FUNCTION_ATTRIBUTES = set(['func_closure', 'func_code', 'func_dict',
-                                      'func_defaults', 'func_globals'])
-else:
-    # On versions > python 2 the special attributes on functions are gone,
-    # but they remain on methods and generators for whatever reason.
-    UNSAFE_FUNCTION_ATTRIBUTES = set()
-
-
-#: unsafe method attributes.  function attributes are unsafe for methods too
-UNSAFE_METHOD_ATTRIBUTES = set(['im_class', 'im_func', 'im_self'])
-
-#: unsafe generator attirbutes.
-UNSAFE_GENERATOR_ATTRIBUTES = set(['gi_frame', 'gi_code'])
-
-import warnings
-
-# make sure we don't warn in python 2.6 about stuff we don't care about
-warnings.filterwarnings('ignore', 'the sets module', DeprecationWarning,
-                        module='jinja2.sandbox')
-
-from collections import deque
-
-_mutable_set_types = (set,)
-_mutable_mapping_types = (dict,)
-_mutable_sequence_types = (list,)
-
-
-# on python 2.x we can register the user collection types
-try:
-    from UserDict import UserDict, DictMixin
-    from UserList import UserList
-    _mutable_mapping_types += (UserDict, DictMixin)
-    _mutable_set_types += (UserList,)
-except ImportError:
-    pass
-
-# if sets is still available, register the mutable set from there as well
-try:
-    from sets import Set
-    _mutable_set_types += (Set,)
-except ImportError:
-    pass
-
-#: register Python 2.6 abstract base classes
-try:
-    from collections import MutableSet, MutableMapping, MutableSequence
-    _mutable_set_types += (MutableSet,)
-    _mutable_mapping_types += (MutableMapping,)
-    _mutable_sequence_types += (MutableSequence,)
-except ImportError:
-    pass
-
-_mutable_spec = (
-    (_mutable_set_types, frozenset([
-        'add', 'clear', 'difference_update', 'discard', 'pop', 'remove',
-        'symmetric_difference_update', 'update'
-    ])),
-    (_mutable_mapping_types, frozenset([
-        'clear', 'pop', 'popitem', 'setdefault', 'update'
-    ])),
-    (_mutable_sequence_types, frozenset([
-        'append', 'reverse', 'insert', 'sort', 'extend', 'remove'
-    ])),
-    (deque, frozenset([
-        'append', 'appendleft', 'clear', 'extend', 'extendleft', 'pop',
-        'popleft', 'remove', 'rotate'
-    ]))
-)
-
-
-def safe_range(*args):
-    """A range that can't generate ranges with a length of more than
-    MAX_RANGE items.
-    """
-    rng = range(*args)
-    if len(rng) > MAX_RANGE:
-        raise OverflowError('range too big, maximum size for range is %d' %
-                            MAX_RANGE)
-    return rng
-
-
-def unsafe(f):
-    """Marks a function or method as unsafe.
-
-    ::
-
-        @unsafe
-        def delete(self):
-            pass
-    """
-    f.unsafe_callable = True
-    return f
-
-
-def is_internal_attribute(obj, attr):
-    """Test if the attribute given is an internal python attribute.  For
-    example this function returns `True` for the `func_code` attribute of
-    python objects.  This is useful if the environment method
-    :meth:`~SandboxedEnvironment.is_safe_attribute` is overridden.
-
-    >>> from jinja2.sandbox import is_internal_attribute
-    >>> is_internal_attribute(str, "mro")
-    True
-    >>> is_internal_attribute(str, "upper")
-    False
-    """
-    if isinstance(obj, types.FunctionType):
-        if attr in UNSAFE_FUNCTION_ATTRIBUTES:
-            return True
-    elif isinstance(obj, types.MethodType):
-        if attr in UNSAFE_FUNCTION_ATTRIBUTES or \
-           attr in UNSAFE_METHOD_ATTRIBUTES:
-            return True
-    elif isinstance(obj, type):
-        if attr == 'mro':
-            return True
-    elif isinstance(obj, (types.CodeType, types.TracebackType, types.FrameType)):
-        return True
-    elif isinstance(obj, types.GeneratorType):
-        if attr in UNSAFE_GENERATOR_ATTRIBUTES:
-            return True
-    return attr.startswith('__')
-
-
-def modifies_known_mutable(obj, attr):
-    """This function checks if an attribute on a builtin mutable object
-    (list, dict, set or deque) would modify it if called.  It also supports
-    the "user"-versions of the objects (`sets.Set`, `UserDict.*` etc.) and
-    with Python 2.6 onwards the abstract base classes `MutableSet`,
-    `MutableMapping`, and `MutableSequence`.
-
-    >>> modifies_known_mutable({}, "clear")
-    True
-    >>> modifies_known_mutable({}, "keys")
-    False
-    >>> modifies_known_mutable([], "append")
-    True
-    >>> modifies_known_mutable([], "index")
-    False
-
-    If called with an unsupported object (such as unicode) `False` is
-    returned.
-
-    >>> modifies_known_mutable("foo", "upper")
-    False
-    """
-    for typespec, unsafe in _mutable_spec:
-        if isinstance(obj, typespec):
-            return attr in unsafe
-    return False
-
-
-class SandboxedEnvironment(Environment):
-    """The sandboxed environment.  It works like the regular environment but
-    tells the compiler to generate sandboxed code.  Additionally subclasses of
-    this environment may override the methods that tell the runtime what
-    attributes or functions are safe to access.
-
-    If the template tries to access insecure code a :exc:`SecurityError` is
-    raised.  However also other exceptions may occour during the rendering so
-    the caller has to ensure that all exceptions are catched.
-    """
-    sandboxed = True
-
-    #: default callback table for the binary operators.  A copy of this is
-    #: available on each instance of a sandboxed environment as
-    #: :attr:`binop_table`
-    default_binop_table = {
-        '+':        operator.add,
-        '-':        operator.sub,
-        '*':        operator.mul,
-        '/':        operator.truediv,
-        '//':       operator.floordiv,
-        '**':       operator.pow,
-        '%':        operator.mod
-    }
-
-    #: default callback table for the unary operators.  A copy of this is
-    #: available on each instance of a sandboxed environment as
-    #: :attr:`unop_table`
-    default_unop_table = {
-        '+':        operator.pos,
-        '-':        operator.neg
-    }
-
-    #: a set of binary operators that should be intercepted.  Each operator
-    #: that is added to this set (empty by default) is delegated to the
-    #: :meth:`call_binop` method that will perform the operator.  The default
-    #: operator callback is specified by :attr:`binop_table`.
-    #:
-    #: The following binary operators are interceptable:
-    #: ``//``, ``%``, ``+``, ``*``, ``-``, ``/``, and ``**``
-    #:
-    #: The default operation form the operator table corresponds to the
-    #: builtin function.  Intercepted calls are always slower than the native
-    #: operator call, so make sure only to intercept the ones you are
-    #: interested in.
-    #:
-    #: .. versionadded:: 2.6
-    intercepted_binops = frozenset()
-
-    #: a set of unary operators that should be intercepted.  Each operator
-    #: that is added to this set (empty by default) is delegated to the
-    #: :meth:`call_unop` method that will perform the operator.  The default
-    #: operator callback is specified by :attr:`unop_table`.
-    #:
-    #: The following unary operators are interceptable: ``+``, ``-``
-    #:
-    #: The default operation form the operator table corresponds to the
-    #: builtin function.  Intercepted calls are always slower than the native
-    #: operator call, so make sure only to intercept the ones you are
-    #: interested in.
-    #:
-    #: .. versionadded:: 2.6
-    intercepted_unops = frozenset()
-
-    def intercept_unop(self, operator):
-        """Called during template compilation with the name of a unary
-        operator to check if it should be intercepted at runtime.  If this
-        method returns `True`, :meth:`call_unop` is excuted for this unary
-        operator.  The default implementation of :meth:`call_unop` will use
-        the :attr:`unop_table` dictionary to perform the operator with the
-        same logic as the builtin one.
-
-        The following unary operators are interceptable: ``+`` and ``-``
-
-        Intercepted calls are always slower than the native operator call,
-        so make sure only to intercept the ones you are interested in.
-
-        .. versionadded:: 2.6
-        """
-        return False
-
-
-    def __init__(self, *args, **kwargs):
-        Environment.__init__(self, *args, **kwargs)
-        self.globals['range'] = safe_range
-        self.binop_table = self.default_binop_table.copy()
-        self.unop_table = self.default_unop_table.copy()
-
-    def is_safe_attribute(self, obj, attr, value):
-        """The sandboxed environment will call this method to check if the
-        attribute of an object is safe to access.  Per default all attributes
-        starting with an underscore are considered private as well as the
-        special attributes of internal python objects as returned by the
-        :func:`is_internal_attribute` function.
-        """
-        return not (attr.startswith('_') or is_internal_attribute(obj, attr))
-
-    def is_safe_callable(self, obj):
-        """Check if an object is safely callable.  Per default a function is
-        considered safe unless the `unsafe_callable` attribute exists and is
-        True.  Override this method to alter the behavior, but this won't
-        affect the `unsafe` decorator from this module.
-        """
-        return not (getattr(obj, 'unsafe_callable', False) or
-                    getattr(obj, 'alters_data', False))
-
-    def call_binop(self, context, operator, left, right):
-        """For intercepted binary operator calls (:meth:`intercepted_binops`)
-        this function is executed instead of the builtin operator.  This can
-        be used to fine tune the behavior of certain operators.
-
-        .. versionadded:: 2.6
-        """
-        return self.binop_table[operator](left, right)
-
-    def call_unop(self, context, operator, arg):
-        """For intercepted unary operator calls (:meth:`intercepted_unops`)
-        this function is executed instead of the builtin operator.  This can
-        be used to fine tune the behavior of certain operators.
-
-        .. versionadded:: 2.6
-        """
-        return self.unop_table[operator](arg)
-
-    def getitem(self, obj, argument):
-        """Subscribe an object from sandboxed code."""
-        try:
-            return obj[argument]
-        except (TypeError, LookupError):
-            if isinstance(argument, string_types):
-                try:
-                    attr = str(argument)
-                except Exception:
-                    pass
-                else:
-                    try:
-                        value = getattr(obj, attr)
-                    except AttributeError:
-                        pass
-                    else:
-                        if self.is_safe_attribute(obj, argument, value):
-                            return value
-                        return self.unsafe_undefined(obj, argument)
-        return self.undefined(obj=obj, name=argument)
-
-    def getattr(self, obj, attribute):
-        """Subscribe an object from sandboxed code and prefer the
-        attribute.  The attribute passed *must* be a bytestring.
-        """
-        try:
-            value = getattr(obj, attribute)
-        except AttributeError:
-            try:
-                return obj[attribute]
-            except (TypeError, LookupError):
-                pass
-        else:
-            if self.is_safe_attribute(obj, attribute, value):
-                return value
-            return self.unsafe_undefined(obj, attribute)
-        return self.undefined(obj=obj, name=attribute)
-
-    def unsafe_undefined(self, obj, attribute):
-        """Return an undefined object for unsafe attributes."""
-        return self.undefined('access to attribute %r of %r '
-                              'object is unsafe.' % (
-            attribute,
-            obj.__class__.__name__
-        ), name=attribute, obj=obj, exc=SecurityError)
-
-    def call(__self, __context, __obj, *args, **kwargs):
-        """Call an object from sandboxed code."""
-        # the double prefixes are to avoid double keyword argument
-        # errors when proxying the call.
-        if not __self.is_safe_callable(__obj):
-            raise SecurityError('%r is not safely callable' % (__obj,))
-        return __context.call(__obj, *args, **kwargs)
-
-
-class ImmutableSandboxedEnvironment(SandboxedEnvironment):
-    """Works exactly like the regular `SandboxedEnvironment` but does not
-    permit modifications on the builtin mutable objects `list`, `set`, and
-    `dict` by using the :func:`modifies_known_mutable` function.
-    """
-
-    def is_safe_attribute(self, obj, attr, value):
-        if not SandboxedEnvironment.is_safe_attribute(self, obj, attr, value):
-            return False
-        return not modifies_known_mutable(obj, attr)
diff --git a/third_party/jinja2/tests.py b/third_party/jinja2/tests.py
deleted file mode 100644
index bb32349..0000000
--- a/third_party/jinja2/tests.py
+++ /dev/null
@@ -1,173 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.tests
-    ~~~~~~~~~~~~
-
-    Jinja test functions. Used with the "is" operator.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import re
-from collections import Mapping
-from jinja2.runtime import Undefined
-from jinja2._compat import text_type, string_types, integer_types
-import decimal
-
-number_re = re.compile(r'^-?\d+(\.\d+)?$')
-regex_type = type(number_re)
-
-
-test_callable = callable
-
-
-def test_odd(value):
-    """Return true if the variable is odd."""
-    return value % 2 == 1
-
-
-def test_even(value):
-    """Return true if the variable is even."""
-    return value % 2 == 0
-
-
-def test_divisibleby(value, num):
-    """Check if a variable is divisible by a number."""
-    return value % num == 0
-
-
-def test_defined(value):
-    """Return true if the variable is defined:
-
-    .. sourcecode:: jinja
-
-        {% if variable is defined %}
-            value of variable: {{ variable }}
-        {% else %}
-            variable is not defined
-        {% endif %}
-
-    See the :func:`default` filter for a simple way to set undefined
-    variables.
-    """
-    return not isinstance(value, Undefined)
-
-
-def test_undefined(value):
-    """Like :func:`defined` but the other way round."""
-    return isinstance(value, Undefined)
-
-
-def test_none(value):
-    """Return true if the variable is none."""
-    return value is None
-
-
-def test_lower(value):
-    """Return true if the variable is lowercased."""
-    return text_type(value).islower()
-
-
-def test_upper(value):
-    """Return true if the variable is uppercased."""
-    return text_type(value).isupper()
-
-
-def test_string(value):
-    """Return true if the object is a string."""
-    return isinstance(value, string_types)
-
-
-def test_mapping(value):
-    """Return true if the object is a mapping (dict etc.).
-
-    .. versionadded:: 2.6
-    """
-    return isinstance(value, Mapping)
-
-
-def test_number(value):
-    """Return true if the variable is a number."""
-    return isinstance(value, integer_types + (float, complex, decimal.Decimal))
-
-
-def test_sequence(value):
-    """Return true if the variable is a sequence. Sequences are variables
-    that are iterable.
-    """
-    try:
-        len(value)
-        value.__getitem__
-    except:
-        return False
-    return True
-
-
-def test_equalto(value, other):
-    """Check if an object has the same value as another object:
-
-    .. sourcecode:: jinja
-
-        {% if foo.expression is equalto 42 %}
-            the foo attribute evaluates to the constant 42
-        {% endif %}
-
-    This appears to be a useless test as it does exactly the same as the
-    ``==`` operator, but it can be useful when used together with the
-    `selectattr` function:
-
-    .. sourcecode:: jinja
-
-        {{ users|selectattr("email", "equalto", "foo@bar.invalid") }}
-
-    .. versionadded:: 2.8
-    """
-    return value == other
-
-
-def test_sameas(value, other):
-    """Check if an object points to the same memory address than another
-    object:
-
-    .. sourcecode:: jinja
-
-        {% if foo.attribute is sameas false %}
-            the foo attribute really is the `False` singleton
-        {% endif %}
-    """
-    return value is other
-
-
-def test_iterable(value):
-    """Check if it's possible to iterate over an object."""
-    try:
-        iter(value)
-    except TypeError:
-        return False
-    return True
-
-
-def test_escaped(value):
-    """Check if the value is escaped."""
-    return hasattr(value, '__html__')
-
-
-TESTS = {
-    'odd':              test_odd,
-    'even':             test_even,
-    'divisibleby':      test_divisibleby,
-    'defined':          test_defined,
-    'undefined':        test_undefined,
-    'none':             test_none,
-    'lower':            test_lower,
-    'upper':            test_upper,
-    'string':           test_string,
-    'mapping':          test_mapping,
-    'number':           test_number,
-    'sequence':         test_sequence,
-    'iterable':         test_iterable,
-    'callable':         test_callable,
-    'sameas':           test_sameas,
-    'equalto':          test_equalto,
-    'escaped':          test_escaped
-}
diff --git a/third_party/jinja2/utils.py b/third_party/jinja2/utils.py
deleted file mode 100644
index cdd4cd3..0000000
--- a/third_party/jinja2/utils.py
+++ /dev/null
@@ -1,531 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.utils
-    ~~~~~~~~~~~~
-
-    Utility functions.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import re
-import errno
-from collections import deque
-from threading import Lock
-from jinja2._compat import text_type, string_types, implements_iterator, \
-     url_quote
-
-
-_word_split_re = re.compile(r'(\s+)')
-_punctuation_re = re.compile(
-    '^(?P<lead>(?:%s)*)(?P<middle>.*?)(?P<trail>(?:%s)*)$' % (
-        '|'.join(map(re.escape, ('(', '<', '&lt;'))),
-        '|'.join(map(re.escape, ('.', ',', ')', '>', '\n', '&gt;')))
-    )
-)
-_simple_email_re = re.compile(r'^\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+$')
-_striptags_re = re.compile(r'(<!--.*?-->|<[^>]*>)')
-_entity_re = re.compile(r'&([^;]+);')
-_letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
-_digits = '0123456789'
-
-# special singleton representing missing values for the runtime
-missing = type('MissingType', (), {'__repr__': lambda x: 'missing'})()
-
-# internal code
-internal_code = set()
-
-concat = u''.join
-
-
-def contextfunction(f):
-    """This decorator can be used to mark a function or method context callable.
-    A context callable is passed the active :class:`Context` as first argument when
-    called from the template.  This is useful if a function wants to get access
-    to the context or functions provided on the context object.  For example
-    a function that returns a sorted list of template variables the current
-    template exports could look like this::
-
-        @contextfunction
-        def get_exported_names(context):
-            return sorted(context.exported_vars)
-    """
-    f.contextfunction = True
-    return f
-
-
-def evalcontextfunction(f):
-    """This decorator can be used to mark a function or method as an eval
-    context callable.  This is similar to the :func:`contextfunction`
-    but instead of passing the context, an evaluation context object is
-    passed.  For more information about the eval context, see
-    :ref:`eval-context`.
-
-    .. versionadded:: 2.4
-    """
-    f.evalcontextfunction = True
-    return f
-
-
-def environmentfunction(f):
-    """This decorator can be used to mark a function or method as environment
-    callable.  This decorator works exactly like the :func:`contextfunction`
-    decorator just that the first argument is the active :class:`Environment`
-    and not context.
-    """
-    f.environmentfunction = True
-    return f
-
-
-def internalcode(f):
-    """Marks the function as internally used"""
-    internal_code.add(f.__code__)
-    return f
-
-
-def is_undefined(obj):
-    """Check if the object passed is undefined.  This does nothing more than
-    performing an instance check against :class:`Undefined` but looks nicer.
-    This can be used for custom filters or tests that want to react to
-    undefined variables.  For example a custom default filter can look like
-    this::
-
-        def default(var, default=''):
-            if is_undefined(var):
-                return default
-            return var
-    """
-    from jinja2.runtime import Undefined
-    return isinstance(obj, Undefined)
-
-
-def consume(iterable):
-    """Consumes an iterable without doing anything with it."""
-    for event in iterable:
-        pass
-
-
-def clear_caches():
-    """Jinja2 keeps internal caches for environments and lexers.  These are
-    used so that Jinja2 doesn't have to recreate environments and lexers all
-    the time.  Normally you don't have to care about that but if you are
-    messuring memory consumption you may want to clean the caches.
-    """
-    from jinja2.environment import _spontaneous_environments
-    from jinja2.lexer import _lexer_cache
-    _spontaneous_environments.clear()
-    _lexer_cache.clear()
-
-
-def import_string(import_name, silent=False):
-    """Imports an object based on a string.  This is useful if you want to
-    use import paths as endpoints or something similar.  An import path can
-    be specified either in dotted notation (``xml.sax.saxutils.escape``)
-    or with a colon as object delimiter (``xml.sax.saxutils:escape``).
-
-    If the `silent` is True the return value will be `None` if the import
-    fails.
-
-    :return: imported object
-    """
-    try:
-        if ':' in import_name:
-            module, obj = import_name.split(':', 1)
-        elif '.' in import_name:
-            items = import_name.split('.')
-            module = '.'.join(items[:-1])
-            obj = items[-1]
-        else:
-            return __import__(import_name)
-        return getattr(__import__(module, None, None, [obj]), obj)
-    except (ImportError, AttributeError):
-        if not silent:
-            raise
-
-
-def open_if_exists(filename, mode='rb'):
-    """Returns a file descriptor for the filename if that file exists,
-    otherwise `None`.
-    """
-    try:
-        return open(filename, mode)
-    except IOError as e:
-        if e.errno not in (errno.ENOENT, errno.EISDIR, errno.EINVAL):
-            raise
-
-
-def object_type_repr(obj):
-    """Returns the name of the object's type.  For some recognized
-    singletons the name of the object is returned instead. (For
-    example for `None` and `Ellipsis`).
-    """
-    if obj is None:
-        return 'None'
-    elif obj is Ellipsis:
-        return 'Ellipsis'
-    # __builtin__ in 2.x, builtins in 3.x
-    if obj.__class__.__module__ in ('__builtin__', 'builtins'):
-        name = obj.__class__.__name__
-    else:
-        name = obj.__class__.__module__ + '.' + obj.__class__.__name__
-    return '%s object' % name
-
-
-def pformat(obj, verbose=False):
-    """Prettyprint an object.  Either use the `pretty` library or the
-    builtin `pprint`.
-    """
-    try:
-        from pretty import pretty
-        return pretty(obj, verbose=verbose)
-    except ImportError:
-        from pprint import pformat
-        return pformat(obj)
-
-
-def urlize(text, trim_url_limit=None, nofollow=False, target=None):
-    """Converts any URLs in text into clickable links. Works on http://,
-    https:// and www. links. Links can have trailing punctuation (periods,
-    commas, close-parens) and leading punctuation (opening parens) and
-    it'll still do the right thing.
-
-    If trim_url_limit is not None, the URLs in link text will be limited
-    to trim_url_limit characters.
-
-    If nofollow is True, the URLs in link text will get a rel="nofollow"
-    attribute.
-
-    If target is not None, a target attribute will be added to the link.
-    """
-    trim_url = lambda x, limit=trim_url_limit: limit is not None \
-                         and (x[:limit] + (len(x) >=limit and '...'
-                         or '')) or x
-    words = _word_split_re.split(text_type(escape(text)))
-    nofollow_attr = nofollow and ' rel="nofollow"' or ''
-    if target is not None and isinstance(target, string_types):
-        target_attr = ' target="%s"' % target
-    else:
-        target_attr = ''
-    for i, word in enumerate(words):
-        match = _punctuation_re.match(word)
-        if match:
-            lead, middle, trail = match.groups()
-            if middle.startswith('www.') or (
-                '@' not in middle and
-                not middle.startswith('http://') and
-                not middle.startswith('https://') and
-                len(middle) > 0 and
-                middle[0] in _letters + _digits and (
-                    middle.endswith('.org') or
-                    middle.endswith('.net') or
-                    middle.endswith('.com')
-                )):
-                middle = '<a href="http://%s"%s%s>%s</a>' % (middle,
-                    nofollow_attr, target_attr, trim_url(middle))
-            if middle.startswith('http://') or \
-               middle.startswith('https://'):
-                middle = '<a href="%s"%s%s>%s</a>' % (middle,
-                    nofollow_attr, target_attr, trim_url(middle))
-            if '@' in middle and not middle.startswith('www.') and \
-               not ':' in middle and _simple_email_re.match(middle):
-                middle = '<a href="mailto:%s">%s</a>' % (middle, middle)
-            if lead + middle + trail != word:
-                words[i] = lead + middle + trail
-    return u''.join(words)
-
-
-def generate_lorem_ipsum(n=5, html=True, min=20, max=100):
-    """Generate some lorem ipsum for the template."""
-    from jinja2.constants import LOREM_IPSUM_WORDS
-    from random import choice, randrange
-    words = LOREM_IPSUM_WORDS.split()
-    result = []
-
-    for _ in range(n):
-        next_capitalized = True
-        last_comma = last_fullstop = 0
-        word = None
-        last = None
-        p = []
-
-        # each paragraph contains out of 20 to 100 words.
-        for idx, _ in enumerate(range(randrange(min, max))):
-            while True:
-                word = choice(words)
-                if word != last:
-                    last = word
-                    break
-            if next_capitalized:
-                word = word.capitalize()
-                next_capitalized = False
-            # add commas
-            if idx - randrange(3, 8) > last_comma:
-                last_comma = idx
-                last_fullstop += 2
-                word += ','
-            # add end of sentences
-            if idx - randrange(10, 20) > last_fullstop:
-                last_comma = last_fullstop = idx
-                word += '.'
-                next_capitalized = True
-            p.append(word)
-
-        # ensure that the paragraph ends with a dot.
-        p = u' '.join(p)
-        if p.endswith(','):
-            p = p[:-1] + '.'
-        elif not p.endswith('.'):
-            p += '.'
-        result.append(p)
-
-    if not html:
-        return u'\n\n'.join(result)
-    return Markup(u'\n'.join(u'<p>%s</p>' % escape(x) for x in result))
-
-
-def unicode_urlencode(obj, charset='utf-8', for_qs=False):
-    """URL escapes a single bytestring or unicode string with the
-    given charset if applicable to URL safe quoting under all rules
-    that need to be considered under all supported Python versions.
-
-    If non strings are provided they are converted to their unicode
-    representation first.
-    """
-    if not isinstance(obj, string_types):
-        obj = text_type(obj)
-    if isinstance(obj, text_type):
-        obj = obj.encode(charset)
-    safe = for_qs and b'' or b'/'
-    rv = text_type(url_quote(obj, safe))
-    if for_qs:
-        rv = rv.replace('%20', '+')
-    return rv
-
-
-class LRUCache(object):
-    """A simple LRU Cache implementation."""
-
-    # this is fast for small capacities (something below 1000) but doesn't
-    # scale.  But as long as it's only used as storage for templates this
-    # won't do any harm.
-
-    def __init__(self, capacity):
-        self.capacity = capacity
-        self._mapping = {}
-        self._queue = deque()
-        self._postinit()
-
-    def _postinit(self):
-        # alias all queue methods for faster lookup
-        self._popleft = self._queue.popleft
-        self._pop = self._queue.pop
-        self._remove = self._queue.remove
-        self._wlock = Lock()
-        self._append = self._queue.append
-
-    def __getstate__(self):
-        return {
-            'capacity':     self.capacity,
-            '_mapping':     self._mapping,
-            '_queue':       self._queue
-        }
-
-    def __setstate__(self, d):
-        self.__dict__.update(d)
-        self._postinit()
-
-    def __getnewargs__(self):
-        return (self.capacity,)
-
-    def copy(self):
-        """Return a shallow copy of the instance."""
-        rv = self.__class__(self.capacity)
-        rv._mapping.update(self._mapping)
-        rv._queue = deque(self._queue)
-        return rv
-
-    def get(self, key, default=None):
-        """Return an item from the cache dict or `default`"""
-        try:
-            return self[key]
-        except KeyError:
-            return default
-
-    def setdefault(self, key, default=None):
-        """Set `default` if the key is not in the cache otherwise
-        leave unchanged. Return the value of this key.
-        """
-        self._wlock.acquire()
-        try:
-            try:
-                return self[key]
-            except KeyError:
-                self[key] = default
-                return default
-        finally:
-            self._wlock.release()
-
-    def clear(self):
-        """Clear the cache."""
-        self._wlock.acquire()
-        try:
-            self._mapping.clear()
-            self._queue.clear()
-        finally:
-            self._wlock.release()
-
-    def __contains__(self, key):
-        """Check if a key exists in this cache."""
-        return key in self._mapping
-
-    def __len__(self):
-        """Return the current size of the cache."""
-        return len(self._mapping)
-
-    def __repr__(self):
-        return '<%s %r>' % (
-            self.__class__.__name__,
-            self._mapping
-        )
-
-    def __getitem__(self, key):
-        """Get an item from the cache. Moves the item up so that it has the
-        highest priority then.
-
-        Raise a `KeyError` if it does not exist.
-        """
-        self._wlock.acquire()
-        try:
-            rv = self._mapping[key]
-            if self._queue[-1] != key:
-                try:
-                    self._remove(key)
-                except ValueError:
-                    # if something removed the key from the container
-                    # when we read, ignore the ValueError that we would
-                    # get otherwise.
-                    pass
-                self._append(key)
-            return rv
-        finally:
-            self._wlock.release()
-
-    def __setitem__(self, key, value):
-        """Sets the value for an item. Moves the item up so that it
-        has the highest priority then.
-        """
-        self._wlock.acquire()
-        try:
-            if key in self._mapping:
-                self._remove(key)
-            elif len(self._mapping) == self.capacity:
-                del self._mapping[self._popleft()]
-            self._append(key)
-            self._mapping[key] = value
-        finally:
-            self._wlock.release()
-
-    def __delitem__(self, key):
-        """Remove an item from the cache dict.
-        Raise a `KeyError` if it does not exist.
-        """
-        self._wlock.acquire()
-        try:
-            del self._mapping[key]
-            try:
-                self._remove(key)
-            except ValueError:
-                # __getitem__ is not locked, it might happen
-                pass
-        finally:
-            self._wlock.release()
-
-    def items(self):
-        """Return a list of items."""
-        result = [(key, self._mapping[key]) for key in list(self._queue)]
-        result.reverse()
-        return result
-
-    def iteritems(self):
-        """Iterate over all items."""
-        return iter(self.items())
-
-    def values(self):
-        """Return a list of all values."""
-        return [x[1] for x in self.items()]
-
-    def itervalue(self):
-        """Iterate over all values."""
-        return iter(self.values())
-
-    def keys(self):
-        """Return a list of all keys ordered by most recent usage."""
-        return list(self)
-
-    def iterkeys(self):
-        """Iterate over all keys in the cache dict, ordered by
-        the most recent usage.
-        """
-        return reversed(tuple(self._queue))
-
-    __iter__ = iterkeys
-
-    def __reversed__(self):
-        """Iterate over the values in the cache dict, oldest items
-        coming first.
-        """
-        return iter(tuple(self._queue))
-
-    __copy__ = copy
-
-
-# register the LRU cache as mutable mapping if possible
-try:
-    from collections import MutableMapping
-    MutableMapping.register(LRUCache)
-except ImportError:
-    pass
-
-
-@implements_iterator
-class Cycler(object):
-    """A cycle helper for templates."""
-
-    def __init__(self, *items):
-        if not items:
-            raise RuntimeError('at least one item has to be provided')
-        self.items = items
-        self.reset()
-
-    def reset(self):
-        """Resets the cycle."""
-        self.pos = 0
-
-    @property
-    def current(self):
-        """Returns the current item."""
-        return self.items[self.pos]
-
-    def __next__(self):
-        """Goes one item ahead and returns it."""
-        rv = self.current
-        self.pos = (self.pos + 1) % len(self.items)
-        return rv
-
-
-class Joiner(object):
-    """A joining helper for templates."""
-
-    def __init__(self, sep=u', '):
-        self.sep = sep
-        self.used = False
-
-    def __call__(self):
-        if not self.used:
-            self.used = True
-            return u''
-        return self.sep
-
-
-# Imported here because that's where it was in the past
-from markupsafe import Markup, escape, soft_unicode
diff --git a/third_party/jinja2/visitor.py b/third_party/jinja2/visitor.py
deleted file mode 100644
index 413e7c3..0000000
--- a/third_party/jinja2/visitor.py
+++ /dev/null
@@ -1,87 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.visitor
-    ~~~~~~~~~~~~~~
-
-    This module implements a visitor for the nodes.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD.
-"""
-from jinja2.nodes import Node
-
-
-class NodeVisitor(object):
-    """Walks the abstract syntax tree and call visitor functions for every
-    node found.  The visitor functions may return values which will be
-    forwarded by the `visit` method.
-
-    Per default the visitor functions for the nodes are ``'visit_'`` +
-    class name of the node.  So a `TryFinally` node visit function would
-    be `visit_TryFinally`.  This behavior can be changed by overriding
-    the `get_visitor` function.  If no visitor function exists for a node
-    (return value `None`) the `generic_visit` visitor is used instead.
-    """
-
-    def get_visitor(self, node):
-        """Return the visitor function for this node or `None` if no visitor
-        exists for this node.  In that case the generic visit function is
-        used instead.
-        """
-        method = 'visit_' + node.__class__.__name__
-        return getattr(self, method, None)
-
-    def visit(self, node, *args, **kwargs):
-        """Visit a node."""
-        f = self.get_visitor(node)
-        if f is not None:
-            return f(node, *args, **kwargs)
-        return self.generic_visit(node, *args, **kwargs)
-
-    def generic_visit(self, node, *args, **kwargs):
-        """Called if no explicit visitor function exists for a node."""
-        for node in node.iter_child_nodes():
-            self.visit(node, *args, **kwargs)
-
-
-class NodeTransformer(NodeVisitor):
-    """Walks the abstract syntax tree and allows modifications of nodes.
-
-    The `NodeTransformer` will walk the AST and use the return value of the
-    visitor functions to replace or remove the old node.  If the return
-    value of the visitor function is `None` the node will be removed
-    from the previous location otherwise it's replaced with the return
-    value.  The return value may be the original node in which case no
-    replacement takes place.
-    """
-
-    def generic_visit(self, node, *args, **kwargs):
-        for field, old_value in node.iter_fields():
-            if isinstance(old_value, list):
-                new_values = []
-                for value in old_value:
-                    if isinstance(value, Node):
-                        value = self.visit(value, *args, **kwargs)
-                        if value is None:
-                            continue
-                        elif not isinstance(value, Node):
-                            new_values.extend(value)
-                            continue
-                    new_values.append(value)
-                old_value[:] = new_values
-            elif isinstance(old_value, Node):
-                new_node = self.visit(old_value, *args, **kwargs)
-                if new_node is None:
-                    delattr(node, field)
-                else:
-                    setattr(node, field, new_node)
-        return node
-
-    def visit_list(self, node, *args, **kwargs):
-        """As transformers may return lists in some places this method
-        can be used to enforce a list as return value.
-        """
-        rv = self.visit(node, *args, **kwargs)
-        if not isinstance(rv, list):
-            rv = [rv]
-        return rv
diff --git a/third_party/markupsafe/AUTHORS b/third_party/markupsafe/AUTHORS
deleted file mode 100644
index f7e2942..0000000
--- a/third_party/markupsafe/AUTHORS
+++ /dev/null
@@ -1,13 +0,0 @@
-MarkupSafe is written and maintained by Armin Ronacher and
-various contributors:
-
-Development Lead
-````````````````
-
-- Armin Ronacher <armin.ronacher@active-4.com>
-
-Patches and Suggestions
-```````````````````````
-
-- Georg Brandl
-- Mickaël Guérin
diff --git a/third_party/markupsafe/LICENSE b/third_party/markupsafe/LICENSE
deleted file mode 100644
index 5d26938..0000000
--- a/third_party/markupsafe/LICENSE
+++ /dev/null
@@ -1,33 +0,0 @@
-Copyright (c) 2010 by Armin Ronacher and contributors.  See AUTHORS
-for more details.
-
-Some rights reserved.
-
-Redistribution and use in source and binary forms of the software as well
-as documentation, with or without modification, are permitted provided
-that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright
-  notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above
-  copyright notice, this list of conditions and the following
-  disclaimer in the documentation and/or other materials provided
-  with the distribution.
-
-* The names of the contributors may not be used to endorse or
-  promote products derived from this software without specific
-  prior written permission.
-
-THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
-NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
diff --git a/third_party/markupsafe/MarkupSafe-0.18.tar.gz.md5 b/third_party/markupsafe/MarkupSafe-0.18.tar.gz.md5
deleted file mode 100644
index 1348d1e..0000000
--- a/third_party/markupsafe/MarkupSafe-0.18.tar.gz.md5
+++ /dev/null
@@ -1 +0,0 @@
-f8d252fd05371e51dec2fe9a36890687  MarkupSafe-0.18.tar.gz
diff --git a/third_party/markupsafe/MarkupSafe-0.18.tar.gz.sha512 b/third_party/markupsafe/MarkupSafe-0.18.tar.gz.sha512
deleted file mode 100644
index ab75220..0000000
--- a/third_party/markupsafe/MarkupSafe-0.18.tar.gz.sha512
+++ /dev/null
@@ -1 +0,0 @@
-0438ddf0fdab465c40d9afba8c14ad346be0868df654c11130d05e329992d456a9bc278551970cbd09244a29c77213885d0c363c951b0cfd4d9aa95b248ecff5  MarkupSafe-0.18.tar.gz
diff --git a/third_party/markupsafe/README.chromium b/third_party/markupsafe/README.chromium
deleted file mode 100644
index 0fcab52..0000000
--- a/third_party/markupsafe/README.chromium
+++ /dev/null
@@ -1,24 +0,0 @@
-Name: MarkupSafe Python Safe String Class
-Short Name: markupsafe
-URL: https://github.com/mitsuhiko/markupsafe
-Version: 0.18
-License: BSD 3-clause License
-License File: NOT_SHIPPED
-Security Critical: no
-
-Description:
-Safe string class, used by Jinja2 template engine.
-
-Source:
-https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.18.tar.gz
-MD5: f8d252fd05371e51dec2fe9a36890687
-SHA-512: 0438ddf0fdab465c40d9afba8c14ad346be0868df654c11130d05e329992d456
-         a9bc278551970cbd09244a29c77213885d0c363c951b0cfd4d9aa95b248ecff5
-
-Local Modifications:
-This only includes the markup directory from the tarball and the LICENSE and
-AUTHORS files, removing the unneeded unit tests (tests.py).
-Also includes install script (get_markupsafe.sh) and files of hashes (MD5 is
-also posted on website, SHA-512 computed locally); script checks hash then
-unpacks archive and installs desired files.
-Retrieve or update by executing markupsafe/get_markupsafe.sh from third_party.
diff --git a/third_party/markupsafe/__init__.py b/third_party/markupsafe/__init__.py
deleted file mode 100644
index 25f00d3..0000000
--- a/third_party/markupsafe/__init__.py
+++ /dev/null
@@ -1,234 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    markupsafe
-    ~~~~~~~~~~
-
-    Implements a Markup string.
-
-    :copyright: (c) 2010 by Armin Ronacher.
-    :license: BSD, see LICENSE for more details.
-"""
-import re
-from markupsafe._compat import text_type, string_types, int_types, \
-     unichr, PY2
-
-
-__all__ = ['Markup', 'soft_unicode', 'escape', 'escape_silent']
-
-
-_striptags_re = re.compile(r'(<!--.*?-->|<[^>]*>)')
-_entity_re = re.compile(r'&([^;]+);')
-
-
-class Markup(text_type):
-    r"""Marks a string as being safe for inclusion in HTML/XML output without
-    needing to be escaped.  This implements the `__html__` interface a couple
-    of frameworks and web applications use.  :class:`Markup` is a direct
-    subclass of `unicode` and provides all the methods of `unicode` just that
-    it escapes arguments passed and always returns `Markup`.
-
-    The `escape` function returns markup objects so that double escaping can't
-    happen.
-
-    The constructor of the :class:`Markup` class can be used for three
-    different things:  When passed an unicode object it's assumed to be safe,
-    when passed an object with an HTML representation (has an `__html__`
-    method) that representation is used, otherwise the object passed is
-    converted into a unicode string and then assumed to be safe:
-
-    >>> Markup("Hello <em>World</em>!")
-    Markup(u'Hello <em>World</em>!')
-    >>> class Foo(object):
-    ...  def __html__(self):
-    ...   return '<a href="#">foo</a>'
-    ... 
-    >>> Markup(Foo())
-    Markup(u'<a href="#">foo</a>')
-
-    If you want object passed being always treated as unsafe you can use the
-    :meth:`escape` classmethod to create a :class:`Markup` object:
-
-    >>> Markup.escape("Hello <em>World</em>!")
-    Markup(u'Hello &lt;em&gt;World&lt;/em&gt;!')
-
-    Operations on a markup string are markup aware which means that all
-    arguments are passed through the :func:`escape` function:
-
-    >>> em = Markup("<em>%s</em>")
-    >>> em % "foo & bar"
-    Markup(u'<em>foo &amp; bar</em>')
-    >>> strong = Markup("<strong>%(text)s</strong>")
-    >>> strong % {'text': '<blink>hacker here</blink>'}
-    Markup(u'<strong>&lt;blink&gt;hacker here&lt;/blink&gt;</strong>')
-    >>> Markup("<em>Hello</em> ") + "<foo>"
-    Markup(u'<em>Hello</em> &lt;foo&gt;')
-    """
-    __slots__ = ()
-
-    def __new__(cls, base=u'', encoding=None, errors='strict'):
-        if hasattr(base, '__html__'):
-            base = base.__html__()
-        if encoding is None:
-            return text_type.__new__(cls, base)
-        return text_type.__new__(cls, base, encoding, errors)
-
-    def __html__(self):
-        return self
-
-    def __add__(self, other):
-        if isinstance(other, string_types) or hasattr(other, '__html__'):
-            return self.__class__(super(Markup, self).__add__(self.escape(other)))
-        return NotImplemented
-
-    def __radd__(self, other):
-        if hasattr(other, '__html__') or isinstance(other, string_types):
-            return self.escape(other).__add__(self)
-        return NotImplemented
-
-    def __mul__(self, num):
-        if isinstance(num, int_types):
-            return self.__class__(text_type.__mul__(self, num))
-        return NotImplemented
-    __rmul__ = __mul__
-
-    def __mod__(self, arg):
-        if isinstance(arg, tuple):
-            arg = tuple(_MarkupEscapeHelper(x, self.escape) for x in arg)
-        else:
-            arg = _MarkupEscapeHelper(arg, self.escape)
-        return self.__class__(text_type.__mod__(self, arg))
-
-    def __repr__(self):
-        return '%s(%s)' % (
-            self.__class__.__name__,
-            text_type.__repr__(self)
-        )
-
-    def join(self, seq):
-        return self.__class__(text_type.join(self, map(self.escape, seq)))
-    join.__doc__ = text_type.join.__doc__
-
-    def split(self, *args, **kwargs):
-        return list(map(self.__class__, text_type.split(self, *args, **kwargs)))
-    split.__doc__ = text_type.split.__doc__
-
-    def rsplit(self, *args, **kwargs):
-        return list(map(self.__class__, text_type.rsplit(self, *args, **kwargs)))
-    rsplit.__doc__ = text_type.rsplit.__doc__
-
-    def splitlines(self, *args, **kwargs):
-        return list(map(self.__class__, text_type.splitlines(self, *args, **kwargs)))
-    splitlines.__doc__ = text_type.splitlines.__doc__
-
-    def unescape(self):
-        r"""Unescape markup again into an text_type string.  This also resolves
-        known HTML4 and XHTML entities:
-
-        >>> Markup("Main &raquo; <em>About</em>").unescape()
-        u'Main \xbb <em>About</em>'
-        """
-        from markupsafe._constants import HTML_ENTITIES
-        def handle_match(m):
-            name = m.group(1)
-            if name in HTML_ENTITIES:
-                return unichr(HTML_ENTITIES[name])
-            try:
-                if name[:2] in ('#x', '#X'):
-                    return unichr(int(name[2:], 16))
-                elif name.startswith('#'):
-                    return unichr(int(name[1:]))
-            except ValueError:
-                pass
-            return u''
-        return _entity_re.sub(handle_match, text_type(self))
-
-    def striptags(self):
-        r"""Unescape markup into an text_type string and strip all tags.  This
-        also resolves known HTML4 and XHTML entities.  Whitespace is
-        normalized to one:
-
-        >>> Markup("Main &raquo;  <em>About</em>").striptags()
-        u'Main \xbb About'
-        """
-        stripped = u' '.join(_striptags_re.sub('', self).split())
-        return Markup(stripped).unescape()
-
-    @classmethod
-    def escape(cls, s):
-        """Escape the string.  Works like :func:`escape` with the difference
-        that for subclasses of :class:`Markup` this function would return the
-        correct subclass.
-        """
-        rv = escape(s)
-        if rv.__class__ is not cls:
-            return cls(rv)
-        return rv
-
-    def make_wrapper(name):
-        orig = getattr(text_type, name)
-        def func(self, *args, **kwargs):
-            args = _escape_argspec(list(args), enumerate(args), self.escape)
-            #_escape_argspec(kwargs, kwargs.iteritems(), None)
-            return self.__class__(orig(self, *args, **kwargs))
-        func.__name__ = orig.__name__
-        func.__doc__ = orig.__doc__
-        return func
-
-    for method in '__getitem__', 'capitalize', \
-                  'title', 'lower', 'upper', 'replace', 'ljust', \
-                  'rjust', 'lstrip', 'rstrip', 'center', 'strip', \
-                  'translate', 'expandtabs', 'swapcase', 'zfill':
-        locals()[method] = make_wrapper(method)
-
-    # new in python 2.5
-    if hasattr(text_type, 'partition'):
-        def partition(self, sep):
-            return tuple(map(self.__class__,
-                             text_type.partition(self, self.escape(sep))))
-        def rpartition(self, sep):
-            return tuple(map(self.__class__,
-                             text_type.rpartition(self, self.escape(sep))))
-
-    # new in python 2.6
-    if hasattr(text_type, 'format'):
-        format = make_wrapper('format')
-
-    # not in python 3
-    if hasattr(text_type, '__getslice__'):
-        __getslice__ = make_wrapper('__getslice__')
-
-    del method, make_wrapper
-
-
-def _escape_argspec(obj, iterable, escape):
-    """Helper for various string-wrapped functions."""
-    for key, value in iterable:
-        if hasattr(value, '__html__') or isinstance(value, string_types):
-            obj[key] = escape(value)
-    return obj
-
-
-class _MarkupEscapeHelper(object):
-    """Helper for Markup.__mod__"""
-
-    def __init__(self, obj, escape):
-        self.obj = obj
-        self.escape = escape
-
-    __getitem__ = lambda s, x: _MarkupEscapeHelper(s.obj[x], s.escape)
-    __unicode__ = __str__ = lambda s: text_type(s.escape(s.obj))
-    __repr__ = lambda s: str(s.escape(repr(s.obj)))
-    __int__ = lambda s: int(s.obj)
-    __float__ = lambda s: float(s.obj)
-
-
-# we have to import it down here as the speedups and native
-# modules imports the markup type which is define above.
-try:
-    from markupsafe._speedups import escape, escape_silent, soft_unicode
-except ImportError:
-    from markupsafe._native import escape, escape_silent, soft_unicode
-
-if not PY2:
-    soft_str = soft_unicode
-    __all__.append('soft_str')
diff --git a/third_party/markupsafe/_compat.py b/third_party/markupsafe/_compat.py
deleted file mode 100644
index 29e4a3d..0000000
--- a/third_party/markupsafe/_compat.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    markupsafe._compat
-    ~~~~~~~~~~~~~~~~~~
-
-    Compatibility module for different Python versions.
-
-    :copyright: (c) 2013 by Armin Ronacher.
-    :license: BSD, see LICENSE for more details.
-"""
-import sys
-
-PY2 = sys.version_info[0] == 2
-
-if not PY2:
-    text_type = str
-    string_types = (str,)
-    unichr = chr
-    int_types = (int,)
-else:
-    text_type = unicode
-    string_types = (str, unicode)
-    unichr = unichr
-    int_types = (int, long)
diff --git a/third_party/markupsafe/_constants.py b/third_party/markupsafe/_constants.py
deleted file mode 100644
index 919bf03..0000000
--- a/third_party/markupsafe/_constants.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    markupsafe._constants
-    ~~~~~~~~~~~~~~~~~~~~~
-
-    Highlevel implementation of the Markup string.
-
-    :copyright: (c) 2010 by Armin Ronacher.
-    :license: BSD, see LICENSE for more details.
-"""
-
-
-HTML_ENTITIES = {
-    'AElig': 198,
-    'Aacute': 193,
-    'Acirc': 194,
-    'Agrave': 192,
-    'Alpha': 913,
-    'Aring': 197,
-    'Atilde': 195,
-    'Auml': 196,
-    'Beta': 914,
-    'Ccedil': 199,
-    'Chi': 935,
-    'Dagger': 8225,
-    'Delta': 916,
-    'ETH': 208,
-    'Eacute': 201,
-    'Ecirc': 202,
-    'Egrave': 200,
-    'Epsilon': 917,
-    'Eta': 919,
-    'Euml': 203,
-    'Gamma': 915,
-    'Iacute': 205,
-    'Icirc': 206,
-    'Igrave': 204,
-    'Iota': 921,
-    'Iuml': 207,
-    'Kappa': 922,
-    'Lambda': 923,
-    'Mu': 924,
-    'Ntilde': 209,
-    'Nu': 925,
-    'OElig': 338,
-    'Oacute': 211,
-    'Ocirc': 212,
-    'Ograve': 210,
-    'Omega': 937,
-    'Omicron': 927,
-    'Oslash': 216,
-    'Otilde': 213,
-    'Ouml': 214,
-    'Phi': 934,
-    'Pi': 928,
-    'Prime': 8243,
-    'Psi': 936,
-    'Rho': 929,
-    'Scaron': 352,
-    'Sigma': 931,
-    'THORN': 222,
-    'Tau': 932,
-    'Theta': 920,
-    'Uacute': 218,
-    'Ucirc': 219,
-    'Ugrave': 217,
-    'Upsilon': 933,
-    'Uuml': 220,
-    'Xi': 926,
-    'Yacute': 221,
-    'Yuml': 376,
-    'Zeta': 918,
-    'aacute': 225,
-    'acirc': 226,
-    'acute': 180,
-    'aelig': 230,
-    'agrave': 224,
-    'alefsym': 8501,
-    'alpha': 945,
-    'amp': 38,
-    'and': 8743,
-    'ang': 8736,
-    'apos': 39,
-    'aring': 229,
-    'asymp': 8776,
-    'atilde': 227,
-    'auml': 228,
-    'bdquo': 8222,
-    'beta': 946,
-    'brvbar': 166,
-    'bull': 8226,
-    'cap': 8745,
-    'ccedil': 231,
-    'cedil': 184,
-    'cent': 162,
-    'chi': 967,
-    'circ': 710,
-    'clubs': 9827,
-    'cong': 8773,
-    'copy': 169,
-    'crarr': 8629,
-    'cup': 8746,
-    'curren': 164,
-    'dArr': 8659,
-    'dagger': 8224,
-    'darr': 8595,
-    'deg': 176,
-    'delta': 948,
-    'diams': 9830,
-    'divide': 247,
-    'eacute': 233,
-    'ecirc': 234,
-    'egrave': 232,
-    'empty': 8709,
-    'emsp': 8195,
-    'ensp': 8194,
-    'epsilon': 949,
-    'equiv': 8801,
-    'eta': 951,
-    'eth': 240,
-    'euml': 235,
-    'euro': 8364,
-    'exist': 8707,
-    'fnof': 402,
-    'forall': 8704,
-    'frac12': 189,
-    'frac14': 188,
-    'frac34': 190,
-    'frasl': 8260,
-    'gamma': 947,
-    'ge': 8805,
-    'gt': 62,
-    'hArr': 8660,
-    'harr': 8596,
-    'hearts': 9829,
-    'hellip': 8230,
-    'iacute': 237,
-    'icirc': 238,
-    'iexcl': 161,
-    'igrave': 236,
-    'image': 8465,
-    'infin': 8734,
-    'int': 8747,
-    'iota': 953,
-    'iquest': 191,
-    'isin': 8712,
-    'iuml': 239,
-    'kappa': 954,
-    'lArr': 8656,
-    'lambda': 955,
-    'lang': 9001,
-    'laquo': 171,
-    'larr': 8592,
-    'lceil': 8968,
-    'ldquo': 8220,
-    'le': 8804,
-    'lfloor': 8970,
-    'lowast': 8727,
-    'loz': 9674,
-    'lrm': 8206,
-    'lsaquo': 8249,
-    'lsquo': 8216,
-    'lt': 60,
-    'macr': 175,
-    'mdash': 8212,
-    'micro': 181,
-    'middot': 183,
-    'minus': 8722,
-    'mu': 956,
-    'nabla': 8711,
-    'nbsp': 160,
-    'ndash': 8211,
-    'ne': 8800,
-    'ni': 8715,
-    'not': 172,
-    'notin': 8713,
-    'nsub': 8836,
-    'ntilde': 241,
-    'nu': 957,
-    'oacute': 243,
-    'ocirc': 244,
-    'oelig': 339,
-    'ograve': 242,
-    'oline': 8254,
-    'omega': 969,
-    'omicron': 959,
-    'oplus': 8853,
-    'or': 8744,
-    'ordf': 170,
-    'ordm': 186,
-    'oslash': 248,
-    'otilde': 245,
-    'otimes': 8855,
-    'ouml': 246,
-    'para': 182,
-    'part': 8706,
-    'permil': 8240,
-    'perp': 8869,
-    'phi': 966,
-    'pi': 960,
-    'piv': 982,
-    'plusmn': 177,
-    'pound': 163,
-    'prime': 8242,
-    'prod': 8719,
-    'prop': 8733,
-    'psi': 968,
-    'quot': 34,
-    'rArr': 8658,
-    'radic': 8730,
-    'rang': 9002,
-    'raquo': 187,
-    'rarr': 8594,
-    'rceil': 8969,
-    'rdquo': 8221,
-    'real': 8476,
-    'reg': 174,
-    'rfloor': 8971,
-    'rho': 961,
-    'rlm': 8207,
-    'rsaquo': 8250,
-    'rsquo': 8217,
-    'sbquo': 8218,
-    'scaron': 353,
-    'sdot': 8901,
-    'sect': 167,
-    'shy': 173,
-    'sigma': 963,
-    'sigmaf': 962,
-    'sim': 8764,
-    'spades': 9824,
-    'sub': 8834,
-    'sube': 8838,
-    'sum': 8721,
-    'sup': 8835,
-    'sup1': 185,
-    'sup2': 178,
-    'sup3': 179,
-    'supe': 8839,
-    'szlig': 223,
-    'tau': 964,
-    'there4': 8756,
-    'theta': 952,
-    'thetasym': 977,
-    'thinsp': 8201,
-    'thorn': 254,
-    'tilde': 732,
-    'times': 215,
-    'trade': 8482,
-    'uArr': 8657,
-    'uacute': 250,
-    'uarr': 8593,
-    'ucirc': 251,
-    'ugrave': 249,
-    'uml': 168,
-    'upsih': 978,
-    'upsilon': 965,
-    'uuml': 252,
-    'weierp': 8472,
-    'xi': 958,
-    'yacute': 253,
-    'yen': 165,
-    'yuml': 255,
-    'zeta': 950,
-    'zwj': 8205,
-    'zwnj': 8204
-}
diff --git a/third_party/markupsafe/_native.py b/third_party/markupsafe/_native.py
deleted file mode 100644
index 5e83f10..0000000
--- a/third_party/markupsafe/_native.py
+++ /dev/null
@@ -1,46 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    markupsafe._native
-    ~~~~~~~~~~~~~~~~~~
-
-    Native Python implementation the C module is not compiled.
-
-    :copyright: (c) 2010 by Armin Ronacher.
-    :license: BSD, see LICENSE for more details.
-"""
-from markupsafe import Markup
-from markupsafe._compat import text_type
-
-
-def escape(s):
-    """Convert the characters &, <, >, ' and " in string s to HTML-safe
-    sequences.  Use this if you need to display text that might contain
-    such characters in HTML.  Marks return value as markup string.
-    """
-    if hasattr(s, '__html__'):
-        return s.__html__()
-    return Markup(text_type(s)
-        .replace('&', '&amp;')
-        .replace('>', '&gt;')
-        .replace('<', '&lt;')
-        .replace("'", '&#39;')
-        .replace('"', '&#34;')
-    )
-
-
-def escape_silent(s):
-    """Like :func:`escape` but converts `None` into an empty
-    markup string.
-    """
-    if s is None:
-        return Markup()
-    return escape(s)
-
-
-def soft_unicode(s):
-    """Make a string unicode if it isn't already.  That way a markup
-    string is not converted back to unicode.
-    """
-    if not isinstance(s, text_type):
-        s = text_type(s)
-    return s
diff --git a/third_party/markupsafe/_speedups.c b/third_party/markupsafe/_speedups.c
deleted file mode 100644
index f349feb..0000000
--- a/third_party/markupsafe/_speedups.c
+++ /dev/null
@@ -1,239 +0,0 @@
-/**
- * markupsafe._speedups
- * ~~~~~~~~~~~~~~~~~~~~
- *
- * This module implements functions for automatic escaping in C for better
- * performance.
- *
- * :copyright: (c) 2010 by Armin Ronacher.
- * :license: BSD.
- */
-
-#include <Python.h>
-
-#define ESCAPED_CHARS_TABLE_SIZE 63
-#define UNICHR(x) (PyUnicode_AS_UNICODE((PyUnicodeObject*)PyUnicode_DecodeASCII(x, strlen(x), NULL)));
-
-#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
-typedef int Py_ssize_t;
-#define PY_SSIZE_T_MAX INT_MAX
-#define PY_SSIZE_T_MIN INT_MIN
-#endif
-
-
-static PyObject* markup;
-static Py_ssize_t escaped_chars_delta_len[ESCAPED_CHARS_TABLE_SIZE];
-static Py_UNICODE *escaped_chars_repl[ESCAPED_CHARS_TABLE_SIZE];
-
-static int
-init_constants(void)
-{
-	PyObject *module;
-	/* happing of characters to replace */
-	escaped_chars_repl['"'] = UNICHR("&#34;");
-	escaped_chars_repl['\''] = UNICHR("&#39;");
-	escaped_chars_repl['&'] = UNICHR("&amp;");
-	escaped_chars_repl['<'] = UNICHR("&lt;");
-	escaped_chars_repl['>'] = UNICHR("&gt;");
-
-	/* lengths of those characters when replaced - 1 */
-	memset(escaped_chars_delta_len, 0, sizeof (escaped_chars_delta_len));
-	escaped_chars_delta_len['"'] = escaped_chars_delta_len['\''] = \
-		escaped_chars_delta_len['&'] = 4;
-	escaped_chars_delta_len['<'] = escaped_chars_delta_len['>'] = 3;
-	
-	/* import markup type so that we can mark the return value */
-	module = PyImport_ImportModule("markupsafe");
-	if (!module)
-		return 0;
-	markup = PyObject_GetAttrString(module, "Markup");
-	Py_DECREF(module);
-
-	return 1;
-}
-
-static PyObject*
-escape_unicode(PyUnicodeObject *in)
-{
-	PyUnicodeObject *out;
-	Py_UNICODE *inp = PyUnicode_AS_UNICODE(in);
-	const Py_UNICODE *inp_end = PyUnicode_AS_UNICODE(in) + PyUnicode_GET_SIZE(in);
-	Py_UNICODE *next_escp;
-	Py_UNICODE *outp;
-	Py_ssize_t delta=0, erepl=0, delta_len=0;
-
-	/* First we need to figure out how long the escaped string will be */
-	while (*(inp) || inp < inp_end) {
-		if (*inp < ESCAPED_CHARS_TABLE_SIZE) {
-			delta += escaped_chars_delta_len[*inp];
-			erepl += !!escaped_chars_delta_len[*inp];
-		}
-		++inp;
-	}
-
-	/* Do we need to escape anything at all? */
-	if (!erepl) {
-		Py_INCREF(in);
-		return (PyObject*)in;
-	}
-
-	out = (PyUnicodeObject*)PyUnicode_FromUnicode(NULL, PyUnicode_GET_SIZE(in) + delta);
-	if (!out)
-		return NULL;
-
-	outp = PyUnicode_AS_UNICODE(out);
-	inp = PyUnicode_AS_UNICODE(in);
-	while (erepl-- > 0) {
-		/* look for the next substitution */
-		next_escp = inp;
-		while (next_escp < inp_end) {
-			if (*next_escp < ESCAPED_CHARS_TABLE_SIZE &&
-			    (delta_len = escaped_chars_delta_len[*next_escp])) {
-				++delta_len;
-				break;
-			}
-			++next_escp;
-		}
-		
-		if (next_escp > inp) {
-			/* copy unescaped chars between inp and next_escp */
-			Py_UNICODE_COPY(outp, inp, next_escp-inp);
-			outp += next_escp - inp;
-		}
-
-		/* escape 'next_escp' */
-		Py_UNICODE_COPY(outp, escaped_chars_repl[*next_escp], delta_len);
-		outp += delta_len;
-
-		inp = next_escp + 1;
-	}
-	if (inp < inp_end)
-		Py_UNICODE_COPY(outp, inp, PyUnicode_GET_SIZE(in) - (inp - PyUnicode_AS_UNICODE(in)));
-
-	return (PyObject*)out;
-}
-
-
-static PyObject*
-escape(PyObject *self, PyObject *text)
-{
-	PyObject *s = NULL, *rv = NULL, *html;
-
-	/* we don't have to escape integers, bools or floats */
-	if (PyLong_CheckExact(text) ||
-#if PY_MAJOR_VERSION < 3
-	    PyInt_CheckExact(text) ||
-#endif
-	    PyFloat_CheckExact(text) || PyBool_Check(text) ||
-	    text == Py_None)
-		return PyObject_CallFunctionObjArgs(markup, text, NULL);
-
-	/* if the object has an __html__ method that performs the escaping */
-	html = PyObject_GetAttrString(text, "__html__");
-	if (html) {
-		rv = PyObject_CallObject(html, NULL);
-		Py_DECREF(html);
-		return rv;
-	}
-
-	/* otherwise make the object unicode if it isn't, then escape */
-	PyErr_Clear();
-	if (!PyUnicode_Check(text)) {
-#if PY_MAJOR_VERSION < 3
-		PyObject *unicode = PyObject_Unicode(text);
-#else
-		PyObject *unicode = PyObject_Str(text);
-#endif
-		if (!unicode)
-			return NULL;
-		s = escape_unicode((PyUnicodeObject*)unicode);
-		Py_DECREF(unicode);
-	}
-	else
-		s = escape_unicode((PyUnicodeObject*)text);
-
-	/* convert the unicode string into a markup object. */
-	rv = PyObject_CallFunctionObjArgs(markup, (PyObject*)s, NULL);
-	Py_DECREF(s);
-	return rv;
-}
-
-
-static PyObject*
-escape_silent(PyObject *self, PyObject *text)
-{
-	if (text != Py_None)
-		return escape(self, text);
-	return PyObject_CallFunctionObjArgs(markup, NULL);
-}
-
-
-static PyObject*
-soft_unicode(PyObject *self, PyObject *s)
-{
-	if (!PyUnicode_Check(s))
-#if PY_MAJOR_VERSION < 3
-		return PyObject_Unicode(s);
-#else
-		return PyObject_Str(s);
-#endif
-	Py_INCREF(s);
-	return s;
-}
-
-
-static PyMethodDef module_methods[] = {
-	{"escape", (PyCFunction)escape, METH_O,
-	 "escape(s) -> markup\n\n"
-	 "Convert the characters &, <, >, ', and \" in string s to HTML-safe\n"
-	 "sequences.  Use this if you need to display text that might contain\n"
-	 "such characters in HTML.  Marks return value as markup string."},
-	{"escape_silent", (PyCFunction)escape_silent, METH_O,
-	 "escape_silent(s) -> markup\n\n"
-	 "Like escape but converts None to an empty string."},
-	{"soft_unicode", (PyCFunction)soft_unicode, METH_O,
-	 "soft_unicode(object) -> string\n\n"
-         "Make a string unicode if it isn't already.  That way a markup\n"
-         "string is not converted back to unicode."},
-	{NULL, NULL, 0, NULL}		/* Sentinel */
-};
-
-
-#if PY_MAJOR_VERSION < 3
-
-#ifndef PyMODINIT_FUNC	/* declarations for DLL import/export */
-#define PyMODINIT_FUNC void
-#endif
-PyMODINIT_FUNC
-init_speedups(void)
-{
-	if (!init_constants())
-		return;
-
-	Py_InitModule3("markupsafe._speedups", module_methods, "");
-}
-
-#else /* Python 3.x module initialization */
-
-static struct PyModuleDef module_definition = {
-        PyModuleDef_HEAD_INIT,
-	"markupsafe._speedups",
-	NULL,
-	-1,
-	module_methods,
-	NULL,
-	NULL,
-	NULL,
-	NULL
-};
-
-PyMODINIT_FUNC
-PyInit__speedups(void)
-{
-	if (!init_constants())
-		return NULL;
-
-	return PyModule_Create(&module_definition);
-}
-
-#endif
diff --git a/third_party/markupsafe/get_markupsafe.sh b/third_party/markupsafe/get_markupsafe.sh
deleted file mode 100755
index d268832..0000000
--- a/third_party/markupsafe/get_markupsafe.sh
+++ /dev/null
@@ -1,121 +0,0 @@
-#!/bin/bash
-# Download and extract MarkupSafe
-# Homepage:
-# https://github.com/mitsuhiko/markupsafe
-# Download page:
-# https://pypi.python.org/pypi/MarkupSafe
-PACKAGE='MarkupSafe'
-VERSION='0.18'
-PACKAGE_DIR='markupsafe'
-
-CHROMIUM_FILES="README.chromium OWNERS get_markupsafe.sh"
-EXTRA_FILES='LICENSE AUTHORS'
-REMOVE_FILES='tests.py'
-
-SRC_URL='https://pypi.python.org/packages/source/'
-SRC_URL+="${PACKAGE:0:1}/$PACKAGE/$PACKAGE-$VERSION.tar.gz"
-FILENAME="$(basename $SRC_URL)"
-MD5_FILENAME="$FILENAME.md5"
-SHA512_FILENAME="$FILENAME.sha512"
-CHROMIUM_FILES+=" $MD5_FILENAME $SHA512_FILENAME"
-
-BUILD_DIR="$PACKAGE-$VERSION"
-THIRD_PARTY="$(dirname $(realpath $(dirname "${BASH_SOURCE[0]}")))"
-INSTALL_DIR="$THIRD_PARTY/$PACKAGE_DIR"
-OUT_DIR="$INSTALL_DIR/$BUILD_DIR/$PACKAGE_DIR"
-OLD_DIR="$THIRD_PARTY/$PACKAGE_DIR.old"
-
-function check_hashes {
-  # Hashes generated via:
-  # FILENAME=MarkupSafe-0.18.tar.gz
-  # md5sum "$FILENAME" > "$FILENAME.md5"
-  # sha512sum "$FILENAME" > "$FILENAME.sha512"
-  # unset FILENAME
-
-  # MD5
-  if ! [ -f "$MD5_FILENAME" ]
-  then
-    echo "MD5 hash file $MD5_FILENAME not found, could not verify archive"
-    exit 1
-  fi
-
-  # 32-digit hash, followed by filename
-  MD5_HASHFILE_REGEX="^[0-9a-f]{32}  $FILENAME"
-  if ! grep --extended-regex --line-regex --silent \
-    "$MD5_HASHFILE_REGEX" "$MD5_FILENAME"
-  then
-    echo "MD5 hash file $MD5_FILENAME does not contain hash for $FILENAME," \
-         'could not verify archive'
-    echo 'Hash file contents are:'
-    cat "$MD5_FILENAME"
-    exit 1
-  fi
-
-  if ! md5sum --check "$MD5_FILENAME"
-  then
-    echo 'MD5 hash does not match,' \
-         "archive file $FILENAME corrupt or compromised!"
-    exit 1
-  fi
-
-  # SHA-512
-  if ! [ -f "$SHA512_FILENAME" ]
-  then
-    echo "SHA-512 hash file $SHA512_FILENAME not found," \
-         'could not verify archive'
-    exit 1
-  fi
-
-  # 128-digit hash, followed by filename
-  SHA512_HASHFILE_REGEX="^[0-9a-f]{128}  $FILENAME"
-  if ! grep --extended-regex --line-regex --silent \
-    "$SHA512_HASHFILE_REGEX" "$SHA512_FILENAME"
-  then
-    echo "SHA-512 hash file $SHA512_FILENAME does not contain hash for" \
-         "$FILENAME, could not verify archive"
-    echo 'Hash file contents are:'
-    cat "$SHA512_FILENAME"
-    exit 1
-  fi
-
-  if ! sha512sum --check "$SHA512_FILENAME"
-  then
-    echo 'SHA-512 hash does not match,' \
-         "archive file $FILENAME corrupt or compromised!"
-    exit 1
-  fi
-}
-
-
-################################################################################
-# Body
-
-cd "$INSTALL_DIR"
-echo "Downloading $SRC_URL"
-curl --remote-name "$SRC_URL"
-check_hashes
-tar xvzf "$FILENAME"
-# Copy extra files over
-for FILE in $CHROMIUM_FILES
-do
-  cp "$FILE" "$OUT_DIR"
-done
-
-cd "$BUILD_DIR"
-for FILE in $EXTRA_FILES
-do
-  cp "$FILE" "$OUT_DIR"
-done
-
-cd "$OUT_DIR"
-for FILE in $REMOVE_FILES
-do
-  rm -fr "$FILE"
-done
-
-# Replace with new directory
-cd ..
-mv "$INSTALL_DIR" "$OLD_DIR"
-mv "$PACKAGE_DIR" "$INSTALL_DIR"
-cd "$INSTALL_DIR"
-rm -fr "$OLD_DIR"
diff --git a/third_party/ply/LICENSE b/third_party/ply/LICENSE
deleted file mode 100644
index b273866..0000000
--- a/third_party/ply/LICENSE
+++ /dev/null
@@ -1,30 +0,0 @@
-PLY (Python Lex-Yacc)                   Version 3.4
-
-Copyright (C) 2001-2011,
-David M. Beazley (Dabeaz LLC)
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-* Redistributions of source code must retain the above copyright notice,
-  this list of conditions and the following disclaimer.  
-* Redistributions in binary form must reproduce the above copyright notice, 
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.  
-* Neither the name of the David Beazley or Dabeaz LLC may be used to
-  endorse or promote products derived from this software without
-  specific prior written permission. 
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/third_party/ply/README b/third_party/ply/README
deleted file mode 100644
index f384d1a..0000000
--- a/third_party/ply/README
+++ /dev/null
@@ -1,271 +0,0 @@
-PLY (Python Lex-Yacc)                   Version 3.4
-
-Copyright (C) 2001-2011,
-David M. Beazley (Dabeaz LLC)
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-* Redistributions of source code must retain the above copyright notice,
-  this list of conditions and the following disclaimer.  
-* Redistributions in binary form must reproduce the above copyright notice, 
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.  
-* Neither the name of the David Beazley or Dabeaz LLC may be used to
-  endorse or promote products derived from this software without
-  specific prior written permission. 
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Introduction
-============
-
-PLY is a 100% Python implementation of the common parsing tools lex
-and yacc. Here are a few highlights:
-
- -  PLY is very closely modeled after traditional lex/yacc.
-    If you know how to use these tools in C, you will find PLY
-    to be similar.
-
- -  PLY provides *very* extensive error reporting and diagnostic 
-    information to assist in parser construction.  The original
-    implementation was developed for instructional purposes.  As
-    a result, the system tries to identify the most common types
-    of errors made by novice users.  
-
- -  PLY provides full support for empty productions, error recovery,
-    precedence specifiers, and moderately ambiguous grammars.
-
- -  Parsing is based on LR-parsing which is fast, memory efficient, 
-    better suited to large grammars, and which has a number of nice
-    properties when dealing with syntax errors and other parsing problems.
-    Currently, PLY builds its parsing tables using the LALR(1)
-    algorithm used in yacc.
-
- -  PLY uses Python introspection features to build lexers and parsers.  
-    This greatly simplifies the task of parser construction since it reduces 
-    the number of files and eliminates the need to run a separate lex/yacc 
-    tool before running your program.
-
- -  PLY can be used to build parsers for "real" programming languages.
-    Although it is not ultra-fast due to its Python implementation,
-    PLY can be used to parse grammars consisting of several hundred
-    rules (as might be found for a language like C).  The lexer and LR 
-    parser are also reasonably efficient when parsing typically
-    sized programs.  People have used PLY to build parsers for
-    C, C++, ADA, and other real programming languages.
-
-How to Use
-==========
-
-PLY consists of two files : lex.py and yacc.py.  These are contained
-within the 'ply' directory which may also be used as a Python package.
-To use PLY, simply copy the 'ply' directory to your project and import
-lex and yacc from the associated 'ply' package.  For example:
-
-     import ply.lex as lex
-     import ply.yacc as yacc
-
-Alternatively, you can copy just the files lex.py and yacc.py
-individually and use them as modules.  For example:
-
-     import lex
-     import yacc
-
-The file setup.py can be used to install ply using distutils.
-
-The file doc/ply.html contains complete documentation on how to use
-the system.
-
-The example directory contains several different examples including a
-PLY specification for ANSI C as given in K&R 2nd Ed.   
-
-A simple example is found at the end of this document
-
-Requirements
-============
-PLY requires the use of Python 2.2 or greater.  However, you should
-use the latest Python release if possible.  It should work on just
-about any platform.  PLY has been tested with both CPython and Jython.
-It also seems to work with IronPython.
-
-Resources
-=========
-More information about PLY can be obtained on the PLY webpage at:
-
-     http://www.dabeaz.com/ply
-
-For a detailed overview of parsing theory, consult the excellent
-book "Compilers : Principles, Techniques, and Tools" by Aho, Sethi, and
-Ullman.  The topics found in "Lex & Yacc" by Levine, Mason, and Brown
-may also be useful.
-
-A Google group for PLY can be found at
-
-     http://groups.google.com/group/ply-hack
-
-Acknowledgments
-===============
-A special thanks is in order for all of the students in CS326 who
-suffered through about 25 different versions of these tools :-).
-
-The CHANGES file acknowledges those who have contributed patches.
-
-Elias Ioup did the first implementation of LALR(1) parsing in PLY-1.x. 
-Andrew Waters and Markus Schoepflin were instrumental in reporting bugs
-and testing a revised LALR(1) implementation for PLY-2.0.
-
-Special Note for PLY-3.0
-========================
-PLY-3.0 the first PLY release to support Python 3. However, backwards
-compatibility with Python 2.2 is still preserved. PLY provides dual
-Python 2/3 compatibility by restricting its implementation to a common
-subset of basic language features. You should not convert PLY using
-2to3--it is not necessary and may in fact break the implementation.
-
-Example
-=======
-
-Here is a simple example showing a PLY implementation of a calculator
-with variables.
-
-# -----------------------------------------------------------------------------
-# calc.py
-#
-# A simple calculator with variables.
-# -----------------------------------------------------------------------------
-
-tokens = (
-    'NAME','NUMBER',
-    'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
-    'LPAREN','RPAREN',
-    )
-
-# Tokens
-
-t_PLUS    = r'\+'
-t_MINUS   = r'-'
-t_TIMES   = r'\*'
-t_DIVIDE  = r'/'
-t_EQUALS  = r'='
-t_LPAREN  = r'\('
-t_RPAREN  = r'\)'
-t_NAME    = r'[a-zA-Z_][a-zA-Z0-9_]*'
-
-def t_NUMBER(t):
-    r'\d+'
-    t.value = int(t.value)
-    return t
-
-# Ignored characters
-t_ignore = " \t"
-
-def t_newline(t):
-    r'\n+'
-    t.lexer.lineno += t.value.count("\n")
-    
-def t_error(t):
-    print("Illegal character '%s'" % t.value[0])
-    t.lexer.skip(1)
-    
-# Build the lexer
-import ply.lex as lex
-lex.lex()
-
-# Precedence rules for the arithmetic operators
-precedence = (
-    ('left','PLUS','MINUS'),
-    ('left','TIMES','DIVIDE'),
-    ('right','UMINUS'),
-    )
-
-# dictionary of names (for storing variables)
-names = { }
-
-def p_statement_assign(p):
-    'statement : NAME EQUALS expression'
-    names[p[1]] = p[3]
-
-def p_statement_expr(p):
-    'statement : expression'
-    print(p[1])
-
-def p_expression_binop(p):
-    '''expression : expression PLUS expression
-                  | expression MINUS expression
-                  | expression TIMES expression
-                  | expression DIVIDE expression'''
-    if p[2] == '+'  : p[0] = p[1] + p[3]
-    elif p[2] == '-': p[0] = p[1] - p[3]
-    elif p[2] == '*': p[0] = p[1] * p[3]
-    elif p[2] == '/': p[0] = p[1] / p[3]
-
-def p_expression_uminus(p):
-    'expression : MINUS expression %prec UMINUS'
-    p[0] = -p[2]
-
-def p_expression_group(p):
-    'expression : LPAREN expression RPAREN'
-    p[0] = p[2]
-
-def p_expression_number(p):
-    'expression : NUMBER'
-    p[0] = p[1]
-
-def p_expression_name(p):
-    'expression : NAME'
-    try:
-        p[0] = names[p[1]]
-    except LookupError:
-        print("Undefined name '%s'" % p[1])
-        p[0] = 0
-
-def p_error(p):
-    print("Syntax error at '%s'" % p.value)
-
-import ply.yacc as yacc
-yacc.yacc()
-
-while 1:
-    try:
-        s = raw_input('calc > ')   # use input() on Python 3
-    except EOFError:
-        break
-    yacc.parse(s)
-
-
-Bug Reports and Patches
-=======================
-My goal with PLY is to simply have a decent lex/yacc implementation
-for Python.  As a general rule, I don't spend huge amounts of time
-working on it unless I receive very specific bug reports and/or
-patches to fix problems. I also try to incorporate submitted feature
-requests and enhancements into each new version.  To contact me about
-bugs and/or new features, please send email to dave@dabeaz.com.
-
-In addition there is a Google group for discussing PLY related issues at
-
-    http://groups.google.com/group/ply-hack
- 
--- Dave
-
-
-
-
-
-
-
-
-
diff --git a/third_party/ply/README.chromium b/third_party/ply/README.chromium
deleted file mode 100644
index 6466e54..0000000
--- a/third_party/ply/README.chromium
+++ /dev/null
@@ -1,21 +0,0 @@
-Name: PLY (Python Lex-Yacc)
-Current version: 3.4
-URL: http://www.dabeaz.com/ply/ply-3.4.tar.gz
-License: BSD
-License File: LICENSE
-Security Critical: no
-Version: 3.4
-
-This directory contains a copy of these ply-3.4 components:
-
-README            ply-3.4/README
-Sources           ply-3.4/ply/__init__.py
-                  ply-3.4/ply/lex.py
-                  ply-3.4/ply/yacc.py
-
-
-The license is in LICENSE.
-
-Modifications made with initial commit:
-- Added the file README.chromium (this file)
-- Applies license.patch
diff --git a/third_party/ply/__init__.py b/third_party/ply/__init__.py
deleted file mode 100644
index f3da03e..0000000
--- a/third_party/ply/__init__.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# PLY package
-# Author: David Beazley (dave@dabeaz.com)
-# -----------------------------------------------------------------------------
-# ply: yacc.py
-#
-# Copyright (C) 2001-2011,
-# David M. Beazley (Dabeaz LLC)
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-#   this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.
-# * Neither the name of the David Beazley or Dabeaz LLC may be used to
-#   endorse or promote products derived from this software without
-#  specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# -----------------------------------------------------------------------------
-
-__all__ = ['lex','yacc']
diff --git a/third_party/ply/lex.py b/third_party/ply/lex.py
deleted file mode 100644
index bd32da9..0000000
--- a/third_party/ply/lex.py
+++ /dev/null
@@ -1,1058 +0,0 @@
-# -----------------------------------------------------------------------------
-# ply: lex.py
-#
-# Copyright (C) 2001-2011,
-# David M. Beazley (Dabeaz LLC)
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-# 
-# * Redistributions of source code must retain the above copyright notice,
-#   this list of conditions and the following disclaimer.  
-# * Redistributions in binary form must reproduce the above copyright notice, 
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.  
-# * Neither the name of the David Beazley or Dabeaz LLC may be used to
-#   endorse or promote products derived from this software without
-#  specific prior written permission. 
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# -----------------------------------------------------------------------------
-
-__version__    = "3.4"
-__tabversion__ = "3.2"       # Version of table file used
-
-import re, sys, types, copy, os
-
-# This tuple contains known string types
-try:
-    # Python 2.6
-    StringTypes = (types.StringType, types.UnicodeType)
-except AttributeError:
-    # Python 3.0
-    StringTypes = (str, bytes)
-
-# Extract the code attribute of a function. Different implementations
-# are for Python 2/3 compatibility.
-
-if sys.version_info[0] < 3:
-    def func_code(f):
-        return f.func_code
-else:
-    def func_code(f):
-        return f.__code__
-
-# This regular expression is used to match valid token names
-_is_identifier = re.compile(r'^[a-zA-Z0-9_]+$')
-
-# Exception thrown when invalid token encountered and no default error
-# handler is defined.
-
-class LexError(Exception):
-    def __init__(self,message,s):
-         self.args = (message,)
-         self.text = s
-
-# Token class.  This class is used to represent the tokens produced.
-class LexToken(object):
-    def __str__(self):
-        return "LexToken(%s,%r,%d,%d)" % (self.type,self.value,self.lineno,self.lexpos)
-    def __repr__(self):
-        return str(self)
-
-# This object is a stand-in for a logging object created by the 
-# logging module.  
-
-class PlyLogger(object):
-    def __init__(self,f):
-        self.f = f
-    def critical(self,msg,*args,**kwargs):
-        self.f.write((msg % args) + "\n")
-
-    def warning(self,msg,*args,**kwargs):
-        self.f.write("WARNING: "+ (msg % args) + "\n")
-
-    def error(self,msg,*args,**kwargs):
-        self.f.write("ERROR: " + (msg % args) + "\n")
-
-    info = critical
-    debug = critical
-
-# Null logger is used when no output is generated. Does nothing.
-class NullLogger(object):
-    def __getattribute__(self,name):
-        return self
-    def __call__(self,*args,**kwargs):
-        return self
-
-# -----------------------------------------------------------------------------
-#                        === Lexing Engine ===
-#
-# The following Lexer class implements the lexer runtime.   There are only
-# a few public methods and attributes:
-#
-#    input()          -  Store a new string in the lexer
-#    token()          -  Get the next token
-#    clone()          -  Clone the lexer
-#
-#    lineno           -  Current line number
-#    lexpos           -  Current position in the input string
-# -----------------------------------------------------------------------------
-
-class Lexer:
-    def __init__(self):
-        self.lexre = None             # Master regular expression. This is a list of
-                                      # tuples (re,findex) where re is a compiled
-                                      # regular expression and findex is a list
-                                      # mapping regex group numbers to rules
-        self.lexretext = None         # Current regular expression strings
-        self.lexstatere = {}          # Dictionary mapping lexer states to master regexs
-        self.lexstateretext = {}      # Dictionary mapping lexer states to regex strings
-        self.lexstaterenames = {}     # Dictionary mapping lexer states to symbol names
-        self.lexstate = "INITIAL"     # Current lexer state
-        self.lexstatestack = []       # Stack of lexer states
-        self.lexstateinfo = None      # State information
-        self.lexstateignore = {}      # Dictionary of ignored characters for each state
-        self.lexstateerrorf = {}      # Dictionary of error functions for each state
-        self.lexreflags = 0           # Optional re compile flags
-        self.lexdata = None           # Actual input data (as a string)
-        self.lexpos = 0               # Current position in input text
-        self.lexlen = 0               # Length of the input text
-        self.lexerrorf = None         # Error rule (if any)
-        self.lextokens = None         # List of valid tokens
-        self.lexignore = ""           # Ignored characters
-        self.lexliterals = ""         # Literal characters that can be passed through
-        self.lexmodule = None         # Module
-        self.lineno = 1               # Current line number
-        self.lexoptimize = 0          # Optimized mode
-
-    def clone(self,object=None):
-        c = copy.copy(self)
-
-        # If the object parameter has been supplied, it means we are attaching the
-        # lexer to a new object.  In this case, we have to rebind all methods in
-        # the lexstatere and lexstateerrorf tables.
-
-        if object:
-            newtab = { }
-            for key, ritem in self.lexstatere.items():
-                newre = []
-                for cre, findex in ritem:
-                     newfindex = []
-                     for f in findex:
-                         if not f or not f[0]:
-                             newfindex.append(f)
-                             continue
-                         newfindex.append((getattr(object,f[0].__name__),f[1]))
-                newre.append((cre,newfindex))
-                newtab[key] = newre
-            c.lexstatere = newtab
-            c.lexstateerrorf = { }
-            for key, ef in self.lexstateerrorf.items():
-                c.lexstateerrorf[key] = getattr(object,ef.__name__)
-            c.lexmodule = object
-        return c
-
-    # ------------------------------------------------------------
-    # writetab() - Write lexer information to a table file
-    # ------------------------------------------------------------
-    def writetab(self,tabfile,outputdir=""):
-        if isinstance(tabfile,types.ModuleType):
-            return
-        basetabfilename = tabfile.split(".")[-1]
-        filename = os.path.join(outputdir,basetabfilename)+".py"
-        tf = open(filename,"w")
-        tf.write("# %s.py. This file automatically created by PLY (version %s). Don't edit!\n" % (tabfile,__version__))
-        tf.write("_tabversion   = %s\n" % repr(__version__))
-        tf.write("_lextokens    = %s\n" % repr(self.lextokens))
-        tf.write("_lexreflags   = %s\n" % repr(self.lexreflags))
-        tf.write("_lexliterals  = %s\n" % repr(self.lexliterals))
-        tf.write("_lexstateinfo = %s\n" % repr(self.lexstateinfo))
-
-        tabre = { }
-        # Collect all functions in the initial state
-        initial = self.lexstatere["INITIAL"]
-        initialfuncs = []
-        for part in initial:
-            for f in part[1]:
-                if f and f[0]:
-                    initialfuncs.append(f)
-
-        for key, lre in self.lexstatere.items():
-             titem = []
-             for i in range(len(lre)):
-                  titem.append((self.lexstateretext[key][i],_funcs_to_names(lre[i][1],self.lexstaterenames[key][i])))
-             tabre[key] = titem
-
-        tf.write("_lexstatere   = %s\n" % repr(tabre))
-        tf.write("_lexstateignore = %s\n" % repr(self.lexstateignore))
-
-        taberr = { }
-        for key, ef in self.lexstateerrorf.items():
-             if ef:
-                  taberr[key] = ef.__name__
-             else:
-                  taberr[key] = None
-        tf.write("_lexstateerrorf = %s\n" % repr(taberr))
-        tf.close()
-
-    # ------------------------------------------------------------
-    # readtab() - Read lexer information from a tab file
-    # ------------------------------------------------------------
-    def readtab(self,tabfile,fdict):
-        if isinstance(tabfile,types.ModuleType):
-            lextab = tabfile
-        else:
-            if sys.version_info[0] < 3:
-                exec("import %s as lextab" % tabfile)
-            else:
-                env = { }
-                exec("import %s as lextab" % tabfile, env,env)
-                lextab = env['lextab']
-
-        if getattr(lextab,"_tabversion","0.0") != __version__:
-            raise ImportError("Inconsistent PLY version")
-
-        self.lextokens      = lextab._lextokens
-        self.lexreflags     = lextab._lexreflags
-        self.lexliterals    = lextab._lexliterals
-        self.lexstateinfo   = lextab._lexstateinfo
-        self.lexstateignore = lextab._lexstateignore
-        self.lexstatere     = { }
-        self.lexstateretext = { }
-        for key,lre in lextab._lexstatere.items():
-             titem = []
-             txtitem = []
-             for i in range(len(lre)):
-                  titem.append((re.compile(lre[i][0],lextab._lexreflags | re.VERBOSE),_names_to_funcs(lre[i][1],fdict)))
-                  txtitem.append(lre[i][0])
-             self.lexstatere[key] = titem
-             self.lexstateretext[key] = txtitem
-        self.lexstateerrorf = { }
-        for key,ef in lextab._lexstateerrorf.items():
-             self.lexstateerrorf[key] = fdict[ef]
-        self.begin('INITIAL')
-
-    # ------------------------------------------------------------
-    # input() - Push a new string into the lexer
-    # ------------------------------------------------------------
-    def input(self,s):
-        # Pull off the first character to see if s looks like a string
-        c = s[:1]
-        if not isinstance(c,StringTypes):
-            raise ValueError("Expected a string")
-        self.lexdata = s
-        self.lexpos = 0
-        self.lexlen = len(s)
-
-    # ------------------------------------------------------------
-    # begin() - Changes the lexing state
-    # ------------------------------------------------------------
-    def begin(self,state):
-        if not state in self.lexstatere:
-            raise ValueError("Undefined state")
-        self.lexre = self.lexstatere[state]
-        self.lexretext = self.lexstateretext[state]
-        self.lexignore = self.lexstateignore.get(state,"")
-        self.lexerrorf = self.lexstateerrorf.get(state,None)
-        self.lexstate = state
-
-    # ------------------------------------------------------------
-    # push_state() - Changes the lexing state and saves old on stack
-    # ------------------------------------------------------------
-    def push_state(self,state):
-        self.lexstatestack.append(self.lexstate)
-        self.begin(state)
-
-    # ------------------------------------------------------------
-    # pop_state() - Restores the previous state
-    # ------------------------------------------------------------
-    def pop_state(self):
-        self.begin(self.lexstatestack.pop())
-
-    # ------------------------------------------------------------
-    # current_state() - Returns the current lexing state
-    # ------------------------------------------------------------
-    def current_state(self):
-        return self.lexstate
-
-    # ------------------------------------------------------------
-    # skip() - Skip ahead n characters
-    # ------------------------------------------------------------
-    def skip(self,n):
-        self.lexpos += n
-
-    # ------------------------------------------------------------
-    # opttoken() - Return the next token from the Lexer
-    #
-    # Note: This function has been carefully implemented to be as fast
-    # as possible.  Don't make changes unless you really know what
-    # you are doing
-    # ------------------------------------------------------------
-    def token(self):
-        # Make local copies of frequently referenced attributes
-        lexpos    = self.lexpos
-        lexlen    = self.lexlen
-        lexignore = self.lexignore
-        lexdata   = self.lexdata
-
-        while lexpos < lexlen:
-            # This code provides some short-circuit code for whitespace, tabs, and other ignored characters
-            if lexdata[lexpos] in lexignore:
-                lexpos += 1
-                continue
-
-            # Look for a regular expression match
-            for lexre,lexindexfunc in self.lexre:
-                m = lexre.match(lexdata,lexpos)
-                if not m: continue
-
-                # Create a token for return
-                tok = LexToken()
-                tok.value = m.group()
-                tok.lineno = self.lineno
-                tok.lexpos = lexpos
-
-                i = m.lastindex
-                func,tok.type = lexindexfunc[i]
-
-                if not func:
-                   # If no token type was set, it's an ignored token
-                   if tok.type:
-                      self.lexpos = m.end()
-                      return tok
-                   else:
-                      lexpos = m.end()
-                      break
-
-                lexpos = m.end()
-
-                # If token is processed by a function, call it
-
-                tok.lexer = self      # Set additional attributes useful in token rules
-                self.lexmatch = m
-                self.lexpos = lexpos
-
-                newtok = func(tok)
-
-                # Every function must return a token, if nothing, we just move to next token
-                if not newtok:
-                    lexpos    = self.lexpos         # This is here in case user has updated lexpos.
-                    lexignore = self.lexignore      # This is here in case there was a state change
-                    break
-
-                # Verify type of the token.  If not in the token map, raise an error
-                if not self.lexoptimize:
-                    if not newtok.type in self.lextokens:
-                        raise LexError("%s:%d: Rule '%s' returned an unknown token type '%s'" % (
-                            func_code(func).co_filename, func_code(func).co_firstlineno,
-                            func.__name__, newtok.type),lexdata[lexpos:])
-
-                return newtok
-            else:
-                # No match, see if in literals
-                if lexdata[lexpos] in self.lexliterals:
-                    tok = LexToken()
-                    tok.value = lexdata[lexpos]
-                    tok.lineno = self.lineno
-                    tok.type = tok.value
-                    tok.lexpos = lexpos
-                    self.lexpos = lexpos + 1
-                    return tok
-
-                # No match. Call t_error() if defined.
-                if self.lexerrorf:
-                    tok = LexToken()
-                    tok.value = self.lexdata[lexpos:]
-                    tok.lineno = self.lineno
-                    tok.type = "error"
-                    tok.lexer = self
-                    tok.lexpos = lexpos
-                    self.lexpos = lexpos
-                    newtok = self.lexerrorf(tok)
-                    if lexpos == self.lexpos:
-                        # Error method didn't change text position at all. This is an error.
-                        raise LexError("Scanning error. Illegal character '%s'" % (lexdata[lexpos]), lexdata[lexpos:])
-                    lexpos = self.lexpos
-                    if not newtok: continue
-                    return newtok
-
-                self.lexpos = lexpos
-                raise LexError("Illegal character '%s' at index %d" % (lexdata[lexpos],lexpos), lexdata[lexpos:])
-
-        self.lexpos = lexpos + 1
-        if self.lexdata is None:
-             raise RuntimeError("No input string given with input()")
-        return None
-
-    # Iterator interface
-    def __iter__(self):
-        return self
-
-    def next(self):
-        t = self.token()
-        if t is None:
-            raise StopIteration
-        return t
-
-    __next__ = next
-
-# -----------------------------------------------------------------------------
-#                           ==== Lex Builder ===
-#
-# The functions and classes below are used to collect lexing information
-# and build a Lexer object from it.
-# -----------------------------------------------------------------------------
-
-# -----------------------------------------------------------------------------
-# get_caller_module_dict()
-#
-# This function returns a dictionary containing all of the symbols defined within
-# a caller further down the call stack.  This is used to get the environment
-# associated with the yacc() call if none was provided.
-# -----------------------------------------------------------------------------
-
-def get_caller_module_dict(levels):
-    try:
-        raise RuntimeError
-    except RuntimeError:
-        e,b,t = sys.exc_info()
-        f = t.tb_frame
-        while levels > 0:
-            f = f.f_back                   
-            levels -= 1
-        ldict = f.f_globals.copy()
-        if f.f_globals != f.f_locals:
-            ldict.update(f.f_locals)
-
-        return ldict
-
-# -----------------------------------------------------------------------------
-# _funcs_to_names()
-#
-# Given a list of regular expression functions, this converts it to a list
-# suitable for output to a table file
-# -----------------------------------------------------------------------------
-
-def _funcs_to_names(funclist,namelist):
-    result = []
-    for f,name in zip(funclist,namelist):
-         if f and f[0]:
-             result.append((name, f[1]))
-         else:
-             result.append(f)
-    return result
-
-# -----------------------------------------------------------------------------
-# _names_to_funcs()
-#
-# Given a list of regular expression function names, this converts it back to
-# functions.
-# -----------------------------------------------------------------------------
-
-def _names_to_funcs(namelist,fdict):
-     result = []
-     for n in namelist:
-          if n and n[0]:
-              result.append((fdict[n[0]],n[1]))
-          else:
-              result.append(n)
-     return result
-
-# -----------------------------------------------------------------------------
-# _form_master_re()
-#
-# This function takes a list of all of the regex components and attempts to
-# form the master regular expression.  Given limitations in the Python re
-# module, it may be necessary to break the master regex into separate expressions.
-# -----------------------------------------------------------------------------
-
-def _form_master_re(relist,reflags,ldict,toknames):
-    if not relist: return []
-    regex = "|".join(relist)
-    try:
-        lexre = re.compile(regex,re.VERBOSE | reflags)
-
-        # Build the index to function map for the matching engine
-        lexindexfunc = [ None ] * (max(lexre.groupindex.values())+1)
-        lexindexnames = lexindexfunc[:]
-
-        for f,i in lexre.groupindex.items():
-            handle = ldict.get(f,None)
-            if type(handle) in (types.FunctionType, types.MethodType):
-                lexindexfunc[i] = (handle,toknames[f])
-                lexindexnames[i] = f
-            elif handle is not None:
-                lexindexnames[i] = f
-                if f.find("ignore_") > 0:
-                    lexindexfunc[i] = (None,None)
-                else:
-                    lexindexfunc[i] = (None, toknames[f])
-        
-        return [(lexre,lexindexfunc)],[regex],[lexindexnames]
-    except Exception:
-        m = int(len(relist)/2)
-        if m == 0: m = 1
-        llist, lre, lnames = _form_master_re(relist[:m],reflags,ldict,toknames)
-        rlist, rre, rnames = _form_master_re(relist[m:],reflags,ldict,toknames)
-        return llist+rlist, lre+rre, lnames+rnames
-
-# -----------------------------------------------------------------------------
-# def _statetoken(s,names)
-#
-# Given a declaration name s of the form "t_" and a dictionary whose keys are
-# state names, this function returns a tuple (states,tokenname) where states
-# is a tuple of state names and tokenname is the name of the token.  For example,
-# calling this with s = "t_foo_bar_SPAM" might return (('foo','bar'),'SPAM')
-# -----------------------------------------------------------------------------
-
-def _statetoken(s,names):
-    nonstate = 1
-    parts = s.split("_")
-    for i in range(1,len(parts)):
-         if not parts[i] in names and parts[i] != 'ANY': break
-    if i > 1:
-       states = tuple(parts[1:i])
-    else:
-       states = ('INITIAL',)
-
-    if 'ANY' in states:
-       states = tuple(names)
-
-    tokenname = "_".join(parts[i:])
-    return (states,tokenname)
-
-
-# -----------------------------------------------------------------------------
-# LexerReflect()
-#
-# This class represents information needed to build a lexer as extracted from a
-# user's input file.
-# -----------------------------------------------------------------------------
-class LexerReflect(object):
-    def __init__(self,ldict,log=None,reflags=0):
-        self.ldict      = ldict
-        self.error_func = None
-        self.tokens     = []
-        self.reflags    = reflags
-        self.stateinfo  = { 'INITIAL' : 'inclusive'}
-        self.files      = {}
-        self.error      = 0
-
-        if log is None:
-            self.log = PlyLogger(sys.stderr)
-        else:
-            self.log = log
-
-    # Get all of the basic information
-    def get_all(self):
-        self.get_tokens()
-        self.get_literals()
-        self.get_states()
-        self.get_rules()
-        
-    # Validate all of the information
-    def validate_all(self):
-        self.validate_tokens()
-        self.validate_literals()
-        self.validate_rules()
-        return self.error
-
-    # Get the tokens map
-    def get_tokens(self):
-        tokens = self.ldict.get("tokens",None)
-        if not tokens:
-            self.log.error("No token list is defined")
-            self.error = 1
-            return
-
-        if not isinstance(tokens,(list, tuple)):
-            self.log.error("tokens must be a list or tuple")
-            self.error = 1
-            return
-        
-        if not tokens:
-            self.log.error("tokens is empty")
-            self.error = 1
-            return
-
-        self.tokens = tokens
-
-    # Validate the tokens
-    def validate_tokens(self):
-        terminals = {}
-        for n in self.tokens:
-            if not _is_identifier.match(n):
-                self.log.error("Bad token name '%s'",n)
-                self.error = 1
-            if n in terminals:
-                self.log.warning("Token '%s' multiply defined", n)
-            terminals[n] = 1
-
-    # Get the literals specifier
-    def get_literals(self):
-        self.literals = self.ldict.get("literals","")
-
-    # Validate literals
-    def validate_literals(self):
-        try:
-            for c in self.literals:
-                if not isinstance(c,StringTypes) or len(c) > 1:
-                    self.log.error("Invalid literal %s. Must be a single character", repr(c))
-                    self.error = 1
-                    continue
-
-        except TypeError:
-            self.log.error("Invalid literals specification. literals must be a sequence of characters")
-            self.error = 1
-
-    def get_states(self):
-        self.states = self.ldict.get("states",None)
-        # Build statemap
-        if self.states:
-             if not isinstance(self.states,(tuple,list)):
-                  self.log.error("states must be defined as a tuple or list")
-                  self.error = 1
-             else:
-                  for s in self.states:
-                        if not isinstance(s,tuple) or len(s) != 2:
-                               self.log.error("Invalid state specifier %s. Must be a tuple (statename,'exclusive|inclusive')",repr(s))
-                               self.error = 1
-                               continue
-                        name, statetype = s
-                        if not isinstance(name,StringTypes):
-                               self.log.error("State name %s must be a string", repr(name))
-                               self.error = 1
-                               continue
-                        if not (statetype == 'inclusive' or statetype == 'exclusive'):
-                               self.log.error("State type for state %s must be 'inclusive' or 'exclusive'",name)
-                               self.error = 1
-                               continue
-                        if name in self.stateinfo:
-                               self.log.error("State '%s' already defined",name)
-                               self.error = 1
-                               continue
-                        self.stateinfo[name] = statetype
-
-    # Get all of the symbols with a t_ prefix and sort them into various
-    # categories (functions, strings, error functions, and ignore characters)
-
-    def get_rules(self):
-        tsymbols = [f for f in self.ldict if f[:2] == 't_' ]
-
-        # Now build up a list of functions and a list of strings
-
-        self.toknames = { }        # Mapping of symbols to token names
-        self.funcsym =  { }        # Symbols defined as functions
-        self.strsym =   { }        # Symbols defined as strings
-        self.ignore   = { }        # Ignore strings by state
-        self.errorf   = { }        # Error functions by state
-
-        for s in self.stateinfo:
-             self.funcsym[s] = []
-             self.strsym[s] = []
-
-        if len(tsymbols) == 0:
-            self.log.error("No rules of the form t_rulename are defined")
-            self.error = 1
-            return
-
-        for f in tsymbols:
-            t = self.ldict[f]
-            states, tokname = _statetoken(f,self.stateinfo)
-            self.toknames[f] = tokname
-
-            if hasattr(t,"__call__"):
-                if tokname == 'error':
-                    for s in states:
-                        self.errorf[s] = t
-                elif tokname == 'ignore':
-                    line = func_code(t).co_firstlineno
-                    file = func_code(t).co_filename
-                    self.log.error("%s:%d: Rule '%s' must be defined as a string",file,line,t.__name__)
-                    self.error = 1
-                else:
-                    for s in states: 
-                        self.funcsym[s].append((f,t))
-            elif isinstance(t, StringTypes):
-                if tokname == 'ignore':
-                    for s in states:
-                        self.ignore[s] = t
-                    if "\\" in t:
-                        self.log.warning("%s contains a literal backslash '\\'",f)
-
-                elif tokname == 'error':
-                    self.log.error("Rule '%s' must be defined as a function", f)
-                    self.error = 1
-                else:
-                    for s in states: 
-                        self.strsym[s].append((f,t))
-            else:
-                self.log.error("%s not defined as a function or string", f)
-                self.error = 1
-
-        # Sort the functions by line number
-        for f in self.funcsym.values():
-            if sys.version_info[0] < 3:
-                f.sort(lambda x,y: cmp(func_code(x[1]).co_firstlineno,func_code(y[1]).co_firstlineno))
-            else:
-                # Python 3.0
-                f.sort(key=lambda x: func_code(x[1]).co_firstlineno)
-
-        # Sort the strings by regular expression length
-        for s in self.strsym.values():
-            if sys.version_info[0] < 3:
-                s.sort(lambda x,y: (len(x[1]) < len(y[1])) - (len(x[1]) > len(y[1])))
-            else:
-                # Python 3.0
-                s.sort(key=lambda x: len(x[1]),reverse=True)
-
-    # Validate all of the t_rules collected 
-    def validate_rules(self):
-        for state in self.stateinfo:
-            # Validate all rules defined by functions
-
-            
-
-            for fname, f in self.funcsym[state]:
-                line = func_code(f).co_firstlineno
-                file = func_code(f).co_filename
-                self.files[file] = 1
-
-                tokname = self.toknames[fname]
-                if isinstance(f, types.MethodType):
-                    reqargs = 2
-                else:
-                    reqargs = 1
-                nargs = func_code(f).co_argcount
-                if nargs > reqargs:
-                    self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__)
-                    self.error = 1
-                    continue
-
-                if nargs < reqargs:
-                    self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__)
-                    self.error = 1
-                    continue
-
-                if not f.__doc__:
-                    self.log.error("%s:%d: No regular expression defined for rule '%s'",file,line,f.__name__)
-                    self.error = 1
-                    continue
-
-                try:
-                    c = re.compile("(?P<%s>%s)" % (fname,f.__doc__), re.VERBOSE | self.reflags)
-                    if c.match(""):
-                        self.log.error("%s:%d: Regular expression for rule '%s' matches empty string", file,line,f.__name__)
-                        self.error = 1
-                except re.error:
-                    _etype, e, _etrace = sys.exc_info()
-                    self.log.error("%s:%d: Invalid regular expression for rule '%s'. %s", file,line,f.__name__,e)
-                    if '#' in f.__doc__:
-                        self.log.error("%s:%d. Make sure '#' in rule '%s' is escaped with '\\#'",file,line, f.__name__)
-                    self.error = 1
-
-            # Validate all rules defined by strings
-            for name,r in self.strsym[state]:
-                tokname = self.toknames[name]
-                if tokname == 'error':
-                    self.log.error("Rule '%s' must be defined as a function", name)
-                    self.error = 1
-                    continue
-
-                if not tokname in self.tokens and tokname.find("ignore_") < 0:
-                    self.log.error("Rule '%s' defined for an unspecified token %s",name,tokname)
-                    self.error = 1
-                    continue
-
-                try:
-                    c = re.compile("(?P<%s>%s)" % (name,r),re.VERBOSE | self.reflags)
-                    if (c.match("")):
-                         self.log.error("Regular expression for rule '%s' matches empty string",name)
-                         self.error = 1
-                except re.error:
-                    _etype, e, _etrace = sys.exc_info()
-                    self.log.error("Invalid regular expression for rule '%s'. %s",name,e)
-                    if '#' in r:
-                         self.log.error("Make sure '#' in rule '%s' is escaped with '\\#'",name)
-                    self.error = 1
-
-            if not self.funcsym[state] and not self.strsym[state]:
-                self.log.error("No rules defined for state '%s'",state)
-                self.error = 1
-
-            # Validate the error function
-            efunc = self.errorf.get(state,None)
-            if efunc:
-                f = efunc
-                line = func_code(f).co_firstlineno
-                file = func_code(f).co_filename
-                self.files[file] = 1
-
-                if isinstance(f, types.MethodType):
-                    reqargs = 2
-                else:
-                    reqargs = 1
-                nargs = func_code(f).co_argcount
-                if nargs > reqargs:
-                    self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__)
-                    self.error = 1
-
-                if nargs < reqargs:
-                    self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__)
-                    self.error = 1
-
-        for f in self.files:
-            self.validate_file(f)
-
-
-    # -----------------------------------------------------------------------------
-    # validate_file()
-    #
-    # This checks to see if there are duplicated t_rulename() functions or strings
-    # in the parser input file.  This is done using a simple regular expression
-    # match on each line in the given file.  
-    # -----------------------------------------------------------------------------
-
-    def validate_file(self,filename):
-        import os.path
-        base,ext = os.path.splitext(filename)
-        if ext != '.py': return         # No idea what the file is. Return OK
-
-        try:
-            f = open(filename)
-            lines = f.readlines()
-            f.close()
-        except IOError:
-            return                      # Couldn't find the file.  Don't worry about it
-
-        fre = re.compile(r'\s*def\s+(t_[a-zA-Z_0-9]*)\(')
-        sre = re.compile(r'\s*(t_[a-zA-Z_0-9]*)\s*=')
-
-        counthash = { }
-        linen = 1
-        for l in lines:
-            m = fre.match(l)
-            if not m:
-                m = sre.match(l)
-            if m:
-                name = m.group(1)
-                prev = counthash.get(name)
-                if not prev:
-                    counthash[name] = linen
-                else:
-                    self.log.error("%s:%d: Rule %s redefined. Previously defined on line %d",filename,linen,name,prev)
-                    self.error = 1
-            linen += 1
-            
-# -----------------------------------------------------------------------------
-# lex(module)
-#
-# Build all of the regular expression rules from definitions in the supplied module
-# -----------------------------------------------------------------------------
-def lex(module=None,object=None,debug=0,optimize=0,lextab="lextab",reflags=0,nowarn=0,outputdir="", debuglog=None, errorlog=None):
-    global lexer
-    ldict = None
-    stateinfo  = { 'INITIAL' : 'inclusive'}
-    lexobj = Lexer()
-    lexobj.lexoptimize = optimize
-    global token,input
-
-    if errorlog is None:
-        errorlog = PlyLogger(sys.stderr)
-
-    if debug:
-        if debuglog is None:
-            debuglog = PlyLogger(sys.stderr)
-
-    # Get the module dictionary used for the lexer
-    if object: module = object
-
-    if module:
-        _items = [(k,getattr(module,k)) for k in dir(module)]
-        ldict = dict(_items)
-    else:
-        ldict = get_caller_module_dict(2)
-
-    # Collect parser information from the dictionary
-    linfo = LexerReflect(ldict,log=errorlog,reflags=reflags)
-    linfo.get_all()
-    if not optimize:
-        if linfo.validate_all():
-            raise SyntaxError("Can't build lexer")
-
-    if optimize and lextab:
-        try:
-            lexobj.readtab(lextab,ldict)
-            token = lexobj.token
-            input = lexobj.input
-            lexer = lexobj
-            return lexobj
-
-        except ImportError:
-            pass
-
-    # Dump some basic debugging information
-    if debug:
-        debuglog.info("lex: tokens   = %r", linfo.tokens)
-        debuglog.info("lex: literals = %r", linfo.literals)
-        debuglog.info("lex: states   = %r", linfo.stateinfo)
-
-    # Build a dictionary of valid token names
-    lexobj.lextokens = { }
-    for n in linfo.tokens:
-        lexobj.lextokens[n] = 1
-
-    # Get literals specification
-    if isinstance(linfo.literals,(list,tuple)):
-        lexobj.lexliterals = type(linfo.literals[0])().join(linfo.literals)
-    else:
-        lexobj.lexliterals = linfo.literals
-
-    # Get the stateinfo dictionary
-    stateinfo = linfo.stateinfo
-
-    regexs = { }
-    # Build the master regular expressions
-    for state in stateinfo:
-        regex_list = []
-
-        # Add rules defined by functions first
-        for fname, f in linfo.funcsym[state]:
-            line = func_code(f).co_firstlineno
-            file = func_code(f).co_filename
-            regex_list.append("(?P<%s>%s)" % (fname,f.__doc__))
-            if debug:
-                debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",fname,f.__doc__, state)
-
-        # Now add all of the simple rules
-        for name,r in linfo.strsym[state]:
-            regex_list.append("(?P<%s>%s)" % (name,r))
-            if debug:
-                debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",name,r, state)
-
-        regexs[state] = regex_list
-
-    # Build the master regular expressions
-
-    if debug:
-        debuglog.info("lex: ==== MASTER REGEXS FOLLOW ====")
-
-    for state in regexs:
-        lexre, re_text, re_names = _form_master_re(regexs[state],reflags,ldict,linfo.toknames)
-        lexobj.lexstatere[state] = lexre
-        lexobj.lexstateretext[state] = re_text
-        lexobj.lexstaterenames[state] = re_names
-        if debug:
-            for i in range(len(re_text)):
-                debuglog.info("lex: state '%s' : regex[%d] = '%s'",state, i, re_text[i])
-
-    # For inclusive states, we need to add the regular expressions from the INITIAL state
-    for state,stype in stateinfo.items():
-        if state != "INITIAL" and stype == 'inclusive':
-             lexobj.lexstatere[state].extend(lexobj.lexstatere['INITIAL'])
-             lexobj.lexstateretext[state].extend(lexobj.lexstateretext['INITIAL'])
-             lexobj.lexstaterenames[state].extend(lexobj.lexstaterenames['INITIAL'])
-
-    lexobj.lexstateinfo = stateinfo
-    lexobj.lexre = lexobj.lexstatere["INITIAL"]
-    lexobj.lexretext = lexobj.lexstateretext["INITIAL"]
-    lexobj.lexreflags = reflags
-
-    # Set up ignore variables
-    lexobj.lexstateignore = linfo.ignore
-    lexobj.lexignore = lexobj.lexstateignore.get("INITIAL","")
-
-    # Set up error functions
-    lexobj.lexstateerrorf = linfo.errorf
-    lexobj.lexerrorf = linfo.errorf.get("INITIAL",None)
-    if not lexobj.lexerrorf:
-        errorlog.warning("No t_error rule is defined")
-
-    # Check state information for ignore and error rules
-    for s,stype in stateinfo.items():
-        if stype == 'exclusive':
-              if not s in linfo.errorf:
-                   errorlog.warning("No error rule is defined for exclusive state '%s'", s)
-              if not s in linfo.ignore and lexobj.lexignore:
-                   errorlog.warning("No ignore rule is defined for exclusive state '%s'", s)
-        elif stype == 'inclusive':
-              if not s in linfo.errorf:
-                   linfo.errorf[s] = linfo.errorf.get("INITIAL",None)
-              if not s in linfo.ignore:
-                   linfo.ignore[s] = linfo.ignore.get("INITIAL","")
-
-    # Create global versions of the token() and input() functions
-    token = lexobj.token
-    input = lexobj.input
-    lexer = lexobj
-
-    # If in optimize mode, we write the lextab
-    if lextab and optimize:
-        lexobj.writetab(lextab,outputdir)
-
-    return lexobj
-
-# -----------------------------------------------------------------------------
-# runmain()
-#
-# This runs the lexer as a main program
-# -----------------------------------------------------------------------------
-
-def runmain(lexer=None,data=None):
-    if not data:
-        try:
-            filename = sys.argv[1]
-            f = open(filename)
-            data = f.read()
-            f.close()
-        except IndexError:
-            sys.stdout.write("Reading from standard input (type EOF to end):\n")
-            data = sys.stdin.read()
-
-    if lexer:
-        _input = lexer.input
-    else:
-        _input = input
-    _input(data)
-    if lexer:
-        _token = lexer.token
-    else:
-        _token = token
-
-    while 1:
-        tok = _token()
-        if not tok: break
-        sys.stdout.write("(%s,%r,%d,%d)\n" % (tok.type, tok.value, tok.lineno,tok.lexpos))
-
-# -----------------------------------------------------------------------------
-# @TOKEN(regex)
-#
-# This decorator function can be used to set the regex expression on a function
-# when its docstring might need to be set in an alternative way
-# -----------------------------------------------------------------------------
-
-def TOKEN(r):
-    def set_doc(f):
-        if hasattr(r,"__call__"):
-            f.__doc__ = r.__doc__
-        else:
-            f.__doc__ = r
-        return f
-    return set_doc
-
-# Alternative spelling of the TOKEN decorator
-Token = TOKEN
-
diff --git a/third_party/ply/license.patch b/third_party/ply/license.patch
deleted file mode 100644
index 7b2621f..0000000
--- a/third_party/ply/license.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-diff --git a/third_party/ply/__init__.py b/third_party/ply/__init__.py
-index 853a985..f3da03e 100644
---- a/third_party/ply/__init__.py
-+++ b/third_party/ply/__init__.py
-@@ -1,4 +1,36 @@
- # PLY package
- # Author: David Beazley (dave@dabeaz.com)
-+# -----------------------------------------------------------------------------
-+# ply: yacc.py
-+#
-+# Copyright (C) 2001-2011,
-+# David M. Beazley (Dabeaz LLC)
-+# All rights reserved.
-+#
-+# Redistribution and use in source and binary forms, with or without
-+# modification, are permitted provided that the following conditions are
-+# met:
-+#
-+# * Redistributions of source code must retain the above copyright notice,
-+#   this list of conditions and the following disclaimer.
-+# * Redistributions in binary form must reproduce the above copyright notice,
-+#   this list of conditions and the following disclaimer in the documentation
-+#   and/or other materials provided with the distribution.
-+# * Neither the name of the David Beazley or Dabeaz LLC may be used to
-+#   endorse or promote products derived from this software without
-+#  specific prior written permission.
-+#
-+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+# -----------------------------------------------------------------------------
- 
- __all__ = ['lex','yacc']
diff --git a/third_party/ply/yacc.py b/third_party/ply/yacc.py
deleted file mode 100644
index f70439e..0000000
--- a/third_party/ply/yacc.py
+++ /dev/null
@@ -1,3276 +0,0 @@
-# -----------------------------------------------------------------------------
-# ply: yacc.py
-#
-# Copyright (C) 2001-2011,
-# David M. Beazley (Dabeaz LLC)
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-# 
-# * Redistributions of source code must retain the above copyright notice,
-#   this list of conditions and the following disclaimer.  
-# * Redistributions in binary form must reproduce the above copyright notice, 
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.  
-# * Neither the name of the David Beazley or Dabeaz LLC may be used to
-#   endorse or promote products derived from this software without
-#  specific prior written permission. 
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# -----------------------------------------------------------------------------
-#
-# This implements an LR parser that is constructed from grammar rules defined
-# as Python functions. The grammer is specified by supplying the BNF inside
-# Python documentation strings.  The inspiration for this technique was borrowed
-# from John Aycock's Spark parsing system.  PLY might be viewed as cross between
-# Spark and the GNU bison utility.
-#
-# The current implementation is only somewhat object-oriented. The
-# LR parser itself is defined in terms of an object (which allows multiple
-# parsers to co-exist).  However, most of the variables used during table
-# construction are defined in terms of global variables.  Users shouldn't
-# notice unless they are trying to define multiple parsers at the same
-# time using threads (in which case they should have their head examined).
-#
-# This implementation supports both SLR and LALR(1) parsing.  LALR(1)
-# support was originally implemented by Elias Ioup (ezioup@alumni.uchicago.edu),
-# using the algorithm found in Aho, Sethi, and Ullman "Compilers: Principles,
-# Techniques, and Tools" (The Dragon Book).  LALR(1) has since been replaced
-# by the more efficient DeRemer and Pennello algorithm.
-#
-# :::::::: WARNING :::::::
-#
-# Construction of LR parsing tables is fairly complicated and expensive.
-# To make this module run fast, a *LOT* of work has been put into
-# optimization---often at the expensive of readability and what might
-# consider to be good Python "coding style."   Modify the code at your
-# own risk!
-# ----------------------------------------------------------------------------
-
-__version__    = "3.4"
-__tabversion__ = "3.2"       # Table version
-
-#-----------------------------------------------------------------------------
-#                     === User configurable parameters ===
-#
-# Change these to modify the default behavior of yacc (if you wish)
-#-----------------------------------------------------------------------------
-
-yaccdebug   = 1                # Debugging mode.  If set, yacc generates a
-                               # a 'parser.out' file in the current directory
-
-debug_file  = 'parser.out'     # Default name of the debugging file
-tab_module  = 'parsetab'       # Default name of the table module
-default_lr  = 'LALR'           # Default LR table generation method
-
-error_count = 3                # Number of symbols that must be shifted to leave recovery mode
-
-yaccdevel   = 0                # Set to True if developing yacc.  This turns off optimized
-                               # implementations of certain functions.
-
-resultlimit = 40               # Size limit of results when running in debug mode.
-
-pickle_protocol = 0            # Protocol to use when writing pickle files
-
-import re, types, sys, os.path
-
-# Compatibility function for python 2.6/3.0
-if sys.version_info[0] < 3:
-    def func_code(f):
-        return f.func_code
-else:
-    def func_code(f):
-        return f.__code__
-
-# Compatibility
-try:
-    MAXINT = sys.maxint
-except AttributeError:
-    MAXINT = sys.maxsize
-
-# Python 2.x/3.0 compatibility.
-def load_ply_lex():
-    if sys.version_info[0] < 3:
-        import lex
-    else:
-        import ply.lex as lex
-    return lex
-
-# This object is a stand-in for a logging object created by the 
-# logging module.   PLY will use this by default to create things
-# such as the parser.out file.  If a user wants more detailed
-# information, they can create their own logging object and pass
-# it into PLY.
-
-class PlyLogger(object):
-    def __init__(self,f):
-        self.f = f
-    def debug(self,msg,*args,**kwargs):
-        self.f.write((msg % args) + "\n")
-    info     = debug
-
-    def warning(self,msg,*args,**kwargs):
-        self.f.write("WARNING: "+ (msg % args) + "\n")
-
-    def error(self,msg,*args,**kwargs):
-        self.f.write("ERROR: " + (msg % args) + "\n")
-
-    critical = debug
-
-# Null logger is used when no output is generated. Does nothing.
-class NullLogger(object):
-    def __getattribute__(self,name):
-        return self
-    def __call__(self,*args,**kwargs):
-        return self
-        
-# Exception raised for yacc-related errors
-class YaccError(Exception):   pass
-
-# Format the result message that the parser produces when running in debug mode.
-def format_result(r):
-    repr_str = repr(r)
-    if '\n' in repr_str: repr_str = repr(repr_str)
-    if len(repr_str) > resultlimit:
-        repr_str = repr_str[:resultlimit]+" ..."
-    result = "<%s @ 0x%x> (%s)" % (type(r).__name__,id(r),repr_str)
-    return result
-
-
-# Format stack entries when the parser is running in debug mode
-def format_stack_entry(r):
-    repr_str = repr(r)
-    if '\n' in repr_str: repr_str = repr(repr_str)
-    if len(repr_str) < 16:
-        return repr_str
-    else:
-        return "<%s @ 0x%x>" % (type(r).__name__,id(r))
-
-#-----------------------------------------------------------------------------
-#                        ===  LR Parsing Engine ===
-#
-# The following classes are used for the LR parser itself.  These are not
-# used during table construction and are independent of the actual LR
-# table generation algorithm
-#-----------------------------------------------------------------------------
-
-# This class is used to hold non-terminal grammar symbols during parsing.
-# It normally has the following attributes set:
-#        .type       = Grammar symbol type
-#        .value      = Symbol value
-#        .lineno     = Starting line number
-#        .endlineno  = Ending line number (optional, set automatically)
-#        .lexpos     = Starting lex position
-#        .endlexpos  = Ending lex position (optional, set automatically)
-
-class YaccSymbol:
-    def __str__(self):    return self.type
-    def __repr__(self):   return str(self)
-
-# This class is a wrapper around the objects actually passed to each
-# grammar rule.   Index lookup and assignment actually assign the
-# .value attribute of the underlying YaccSymbol object.
-# The lineno() method returns the line number of a given
-# item (or 0 if not defined).   The linespan() method returns
-# a tuple of (startline,endline) representing the range of lines
-# for a symbol.  The lexspan() method returns a tuple (lexpos,endlexpos)
-# representing the range of positional information for a symbol.
-
-class YaccProduction:
-    def __init__(self,s,stack=None):
-        self.slice = s
-        self.stack = stack
-        self.lexer = None
-        self.parser= None
-    def __getitem__(self,n):
-        if n >= 0: return self.slice[n].value
-        else: return self.stack[n].value
-
-    def __setitem__(self,n,v):
-        self.slice[n].value = v
-
-    def __getslice__(self,i,j):
-        return [s.value for s in self.slice[i:j]]
-
-    def __len__(self):
-        return len(self.slice)
-
-    def lineno(self,n):
-        return getattr(self.slice[n],"lineno",0)
-
-    def set_lineno(self,n,lineno):
-        self.slice[n].lineno = lineno
-
-    def linespan(self,n):
-        startline = getattr(self.slice[n],"lineno",0)
-        endline = getattr(self.slice[n],"endlineno",startline)
-        return startline,endline
-
-    def lexpos(self,n):
-        return getattr(self.slice[n],"lexpos",0)
-
-    def lexspan(self,n):
-        startpos = getattr(self.slice[n],"lexpos",0)
-        endpos = getattr(self.slice[n],"endlexpos",startpos)
-        return startpos,endpos
-
-    def error(self):
-       raise SyntaxError
-
-
-# -----------------------------------------------------------------------------
-#                               == LRParser ==
-#
-# The LR Parsing engine.
-# -----------------------------------------------------------------------------
-
-class LRParser:
-    def __init__(self,lrtab,errorf):
-        self.productions = lrtab.lr_productions
-        self.action      = lrtab.lr_action
-        self.goto        = lrtab.lr_goto
-        self.errorfunc   = errorf
-
-    def errok(self):
-        self.errorok     = 1
-
-    def restart(self):
-        del self.statestack[:]
-        del self.symstack[:]
-        sym = YaccSymbol()
-        sym.type = '$end'
-        self.symstack.append(sym)
-        self.statestack.append(0)
-
-    def parse(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None):
-        if debug or yaccdevel:
-            if isinstance(debug,int):
-                debug = PlyLogger(sys.stderr)
-            return self.parsedebug(input,lexer,debug,tracking,tokenfunc)
-        elif tracking:
-            return self.parseopt(input,lexer,debug,tracking,tokenfunc)
-        else:
-            return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc)
-        
-
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    # parsedebug().
-    #
-    # This is the debugging enabled version of parse().  All changes made to the
-    # parsing engine should be made here.   For the non-debugging version,
-    # copy this code to a method parseopt() and delete all of the sections
-    # enclosed in:
-    #
-    #      #--! DEBUG
-    #      statements
-    #      #--! DEBUG
-    #
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-    def parsedebug(self,input=None,lexer=None,debug=None,tracking=0,tokenfunc=None):
-        lookahead = None                 # Current lookahead symbol
-        lookaheadstack = [ ]             # Stack of lookahead symbols
-        actions = self.action            # Local reference to action table (to avoid lookup on self.)
-        goto    = self.goto              # Local reference to goto table (to avoid lookup on self.)
-        prod    = self.productions       # Local reference to production list (to avoid lookup on self.)
-        pslice  = YaccProduction(None)   # Production object passed to grammar rules
-        errorcount = 0                   # Used during error recovery 
-
-        # --! DEBUG
-        debug.info("PLY: PARSE DEBUG START")
-        # --! DEBUG
-
-        # If no lexer was given, we will try to use the lex module
-        if not lexer:
-            lex = load_ply_lex()
-            lexer = lex.lexer
-
-        # Set up the lexer and parser objects on pslice
-        pslice.lexer = lexer
-        pslice.parser = self
-
-        # If input was supplied, pass to lexer
-        if input is not None:
-            lexer.input(input)
-
-        if tokenfunc is None:
-           # Tokenize function
-           get_token = lexer.token
-        else:
-           get_token = tokenfunc
-
-        # Set up the state and symbol stacks
-
-        statestack = [ ]                # Stack of parsing states
-        self.statestack = statestack
-        symstack   = [ ]                # Stack of grammar symbols
-        self.symstack = symstack
-
-        pslice.stack = symstack         # Put in the production
-        errtoken   = None               # Err token
-
-        # The start state is assumed to be (0,$end)
-
-        statestack.append(0)
-        sym = YaccSymbol()
-        sym.type = "$end"
-        symstack.append(sym)
-        state = 0
-        while 1:
-            # Get the next symbol on the input.  If a lookahead symbol
-            # is already set, we just use that. Otherwise, we'll pull
-            # the next token off of the lookaheadstack or from the lexer
-
-            # --! DEBUG
-            debug.debug('')
-            debug.debug('State  : %s', state)
-            # --! DEBUG
-
-            if not lookahead:
-                if not lookaheadstack:
-                    lookahead = get_token()     # Get the next token
-                else:
-                    lookahead = lookaheadstack.pop()
-                if not lookahead:
-                    lookahead = YaccSymbol()
-                    lookahead.type = "$end"
-
-            # --! DEBUG
-            debug.debug('Stack  : %s',
-                        ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip())
-            # --! DEBUG
-
-            # Check the action table
-            ltype = lookahead.type
-            t = actions[state].get(ltype)
-
-            if t is not None:
-                if t > 0:
-                    # shift a symbol on the stack
-                    statestack.append(t)
-                    state = t
-                    
-                    # --! DEBUG
-                    debug.debug("Action : Shift and goto state %s", t)
-                    # --! DEBUG
-
-                    symstack.append(lookahead)
-                    lookahead = None
-
-                    # Decrease error count on successful shift
-                    if errorcount: errorcount -=1
-                    continue
-
-                if t < 0:
-                    # reduce a symbol on the stack, emit a production
-                    p = prod[-t]
-                    pname = p.name
-                    plen  = p.len
-
-                    # Get production function
-                    sym = YaccSymbol()
-                    sym.type = pname       # Production name
-                    sym.value = None
-
-                    # --! DEBUG
-                    if plen:
-                        debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, "["+",".join([format_stack_entry(_v.value) for _v in symstack[-plen:]])+"]",-t)
-                    else:
-                        debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, [],-t)
-                        
-                    # --! DEBUG
-
-                    if plen:
-                        targ = symstack[-plen-1:]
-                        targ[0] = sym
-
-                        # --! TRACKING
-                        if tracking:
-                           t1 = targ[1]
-                           sym.lineno = t1.lineno
-                           sym.lexpos = t1.lexpos
-                           t1 = targ[-1]
-                           sym.endlineno = getattr(t1,"endlineno",t1.lineno)
-                           sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos)
-
-                        # --! TRACKING
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # below as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-                        
-                        try:
-                            # Call the grammar rule with our special slice object
-                            del symstack[-plen:]
-                            del statestack[-plen:]
-                            p.callable(pslice)
-                            # --! DEBUG
-                            debug.info("Result : %s", format_result(pslice[0]))
-                            # --! DEBUG
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    
-                    else:
-
-                        # --! TRACKING
-                        if tracking:
-                           sym.lineno = lexer.lineno
-                           sym.lexpos = lexer.lexpos
-                        # --! TRACKING
-
-                        targ = [ sym ]
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # above as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-
-                        try:
-                            # Call the grammar rule with our special slice object
-                            p.callable(pslice)
-                            # --! DEBUG
-                            debug.info("Result : %s", format_result(pslice[0]))
-                            # --! DEBUG
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-                if t == 0:
-                    n = symstack[-1]
-                    result = getattr(n,"value",None)
-                    # --! DEBUG
-                    debug.info("Done   : Returning %s", format_result(result))
-                    debug.info("PLY: PARSE DEBUG END")
-                    # --! DEBUG
-                    return result
-
-            if t == None:
-
-                # --! DEBUG
-                debug.error('Error  : %s',
-                            ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip())
-                # --! DEBUG
-
-                # We have some kind of parsing error here.  To handle
-                # this, we are going to push the current token onto
-                # the tokenstack and replace it with an 'error' token.
-                # If there are any synchronization rules, they may
-                # catch it.
-                #
-                # In addition to pushing the error token, we call call
-                # the user defined p_error() function if this is the
-                # first syntax error.  This function is only called if
-                # errorcount == 0.
-                if errorcount == 0 or self.errorok:
-                    errorcount = error_count
-                    self.errorok = 0
-                    errtoken = lookahead
-                    if errtoken.type == "$end":
-                        errtoken = None               # End of file!
-                    if self.errorfunc:
-                        global errok,token,restart
-                        errok = self.errok        # Set some special functions available in error recovery
-                        token = get_token
-                        restart = self.restart
-                        if errtoken and not hasattr(errtoken,'lexer'):
-                            errtoken.lexer = lexer
-                        tok = self.errorfunc(errtoken)
-                        del errok, token, restart   # Delete special functions
-
-                        if self.errorok:
-                            # User must have done some kind of panic
-                            # mode recovery on their own.  The
-                            # returned token is the next lookahead
-                            lookahead = tok
-                            errtoken = None
-                            continue
-                    else:
-                        if errtoken:
-                            if hasattr(errtoken,"lineno"): lineno = lookahead.lineno
-                            else: lineno = 0
-                            if lineno:
-                                sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type))
-                            else:
-                                sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type)
-                        else:
-                            sys.stderr.write("yacc: Parse error in input. EOF\n")
-                            return
-
-                else:
-                    errorcount = error_count
-
-                # case 1:  the statestack only has 1 entry on it.  If we're in this state, the
-                # entire parse has been rolled back and we're completely hosed.   The token is
-                # discarded and we just keep going.
-
-                if len(statestack) <= 1 and lookahead.type != "$end":
-                    lookahead = None
-                    errtoken = None
-                    state = 0
-                    # Nuke the pushback stack
-                    del lookaheadstack[:]
-                    continue
-
-                # case 2: the statestack has a couple of entries on it, but we're
-                # at the end of the file. nuke the top entry and generate an error token
-
-                # Start nuking entries on the stack
-                if lookahead.type == "$end":
-                    # Whoa. We're really hosed here. Bail out
-                    return
-
-                if lookahead.type != 'error':
-                    sym = symstack[-1]
-                    if sym.type == 'error':
-                        # Hmmm. Error is on top of stack, we'll just nuke input
-                        # symbol and continue
-                        lookahead = None
-                        continue
-                    t = YaccSymbol()
-                    t.type = 'error'
-                    if hasattr(lookahead,"lineno"):
-                        t.lineno = lookahead.lineno
-                    t.value = lookahead
-                    lookaheadstack.append(lookahead)
-                    lookahead = t
-                else:
-                    symstack.pop()
-                    statestack.pop()
-                    state = statestack[-1]       # Potential bug fix
-
-                continue
-
-            # Call an error function here
-            raise RuntimeError("yacc: internal parser error!!!\n")
-
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    # parseopt().
-    #
-    # Optimized version of parse() method.  DO NOT EDIT THIS CODE DIRECTLY.
-    # Edit the debug version above, then copy any modifications to the method
-    # below while removing #--! DEBUG sections.
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-
-    def parseopt(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None):
-        lookahead = None                 # Current lookahead symbol
-        lookaheadstack = [ ]             # Stack of lookahead symbols
-        actions = self.action            # Local reference to action table (to avoid lookup on self.)
-        goto    = self.goto              # Local reference to goto table (to avoid lookup on self.)
-        prod    = self.productions       # Local reference to production list (to avoid lookup on self.)
-        pslice  = YaccProduction(None)   # Production object passed to grammar rules
-        errorcount = 0                   # Used during error recovery 
-
-        # If no lexer was given, we will try to use the lex module
-        if not lexer:
-            lex = load_ply_lex()
-            lexer = lex.lexer
-        
-        # Set up the lexer and parser objects on pslice
-        pslice.lexer = lexer
-        pslice.parser = self
-
-        # If input was supplied, pass to lexer
-        if input is not None:
-            lexer.input(input)
-
-        if tokenfunc is None:
-           # Tokenize function
-           get_token = lexer.token
-        else:
-           get_token = tokenfunc
-
-        # Set up the state and symbol stacks
-
-        statestack = [ ]                # Stack of parsing states
-        self.statestack = statestack
-        symstack   = [ ]                # Stack of grammar symbols
-        self.symstack = symstack
-
-        pslice.stack = symstack         # Put in the production
-        errtoken   = None               # Err token
-
-        # The start state is assumed to be (0,$end)
-
-        statestack.append(0)
-        sym = YaccSymbol()
-        sym.type = '$end'
-        symstack.append(sym)
-        state = 0
-        while 1:
-            # Get the next symbol on the input.  If a lookahead symbol
-            # is already set, we just use that. Otherwise, we'll pull
-            # the next token off of the lookaheadstack or from the lexer
-
-            if not lookahead:
-                if not lookaheadstack:
-                    lookahead = get_token()     # Get the next token
-                else:
-                    lookahead = lookaheadstack.pop()
-                if not lookahead:
-                    lookahead = YaccSymbol()
-                    lookahead.type = '$end'
-
-            # Check the action table
-            ltype = lookahead.type
-            t = actions[state].get(ltype)
-
-            if t is not None:
-                if t > 0:
-                    # shift a symbol on the stack
-                    statestack.append(t)
-                    state = t
-
-                    symstack.append(lookahead)
-                    lookahead = None
-
-                    # Decrease error count on successful shift
-                    if errorcount: errorcount -=1
-                    continue
-
-                if t < 0:
-                    # reduce a symbol on the stack, emit a production
-                    p = prod[-t]
-                    pname = p.name
-                    plen  = p.len
-
-                    # Get production function
-                    sym = YaccSymbol()
-                    sym.type = pname       # Production name
-                    sym.value = None
-
-                    if plen:
-                        targ = symstack[-plen-1:]
-                        targ[0] = sym
-
-                        # --! TRACKING
-                        if tracking:
-                           t1 = targ[1]
-                           sym.lineno = t1.lineno
-                           sym.lexpos = t1.lexpos
-                           t1 = targ[-1]
-                           sym.endlineno = getattr(t1,"endlineno",t1.lineno)
-                           sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos)
-
-                        # --! TRACKING
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # below as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-                        
-                        try:
-                            # Call the grammar rule with our special slice object
-                            del symstack[-plen:]
-                            del statestack[-plen:]
-                            p.callable(pslice)
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    
-                    else:
-
-                        # --! TRACKING
-                        if tracking:
-                           sym.lineno = lexer.lineno
-                           sym.lexpos = lexer.lexpos
-                        # --! TRACKING
-
-                        targ = [ sym ]
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # above as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-
-                        try:
-                            # Call the grammar rule with our special slice object
-                            p.callable(pslice)
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-                if t == 0:
-                    n = symstack[-1]
-                    return getattr(n,"value",None)
-
-            if t == None:
-
-                # We have some kind of parsing error here.  To handle
-                # this, we are going to push the current token onto
-                # the tokenstack and replace it with an 'error' token.
-                # If there are any synchronization rules, they may
-                # catch it.
-                #
-                # In addition to pushing the error token, we call call
-                # the user defined p_error() function if this is the
-                # first syntax error.  This function is only called if
-                # errorcount == 0.
-                if errorcount == 0 or self.errorok:
-                    errorcount = error_count
-                    self.errorok = 0
-                    errtoken = lookahead
-                    if errtoken.type == '$end':
-                        errtoken = None               # End of file!
-                    if self.errorfunc:
-                        global errok,token,restart
-                        errok = self.errok        # Set some special functions available in error recovery
-                        token = get_token
-                        restart = self.restart
-                        if errtoken and not hasattr(errtoken,'lexer'):
-                            errtoken.lexer = lexer
-                        tok = self.errorfunc(errtoken)
-                        del errok, token, restart   # Delete special functions
-
-                        if self.errorok:
-                            # User must have done some kind of panic
-                            # mode recovery on their own.  The
-                            # returned token is the next lookahead
-                            lookahead = tok
-                            errtoken = None
-                            continue
-                    else:
-                        if errtoken:
-                            if hasattr(errtoken,"lineno"): lineno = lookahead.lineno
-                            else: lineno = 0
-                            if lineno:
-                                sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type))
-                            else:
-                                sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type)
-                        else:
-                            sys.stderr.write("yacc: Parse error in input. EOF\n")
-                            return
-
-                else:
-                    errorcount = error_count
-
-                # case 1:  the statestack only has 1 entry on it.  If we're in this state, the
-                # entire parse has been rolled back and we're completely hosed.   The token is
-                # discarded and we just keep going.
-
-                if len(statestack) <= 1 and lookahead.type != '$end':
-                    lookahead = None
-                    errtoken = None
-                    state = 0
-                    # Nuke the pushback stack
-                    del lookaheadstack[:]
-                    continue
-
-                # case 2: the statestack has a couple of entries on it, but we're
-                # at the end of the file. nuke the top entry and generate an error token
-
-                # Start nuking entries on the stack
-                if lookahead.type == '$end':
-                    # Whoa. We're really hosed here. Bail out
-                    return
-
-                if lookahead.type != 'error':
-                    sym = symstack[-1]
-                    if sym.type == 'error':
-                        # Hmmm. Error is on top of stack, we'll just nuke input
-                        # symbol and continue
-                        lookahead = None
-                        continue
-                    t = YaccSymbol()
-                    t.type = 'error'
-                    if hasattr(lookahead,"lineno"):
-                        t.lineno = lookahead.lineno
-                    t.value = lookahead
-                    lookaheadstack.append(lookahead)
-                    lookahead = t
-                else:
-                    symstack.pop()
-                    statestack.pop()
-                    state = statestack[-1]       # Potential bug fix
-
-                continue
-
-            # Call an error function here
-            raise RuntimeError("yacc: internal parser error!!!\n")
-
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    # parseopt_notrack().
-    #
-    # Optimized version of parseopt() with line number tracking removed. 
-    # DO NOT EDIT THIS CODE DIRECTLY. Copy the optimized version and remove
-    # code in the #--! TRACKING sections
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-    def parseopt_notrack(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None):
-        lookahead = None                 # Current lookahead symbol
-        lookaheadstack = [ ]             # Stack of lookahead symbols
-        actions = self.action            # Local reference to action table (to avoid lookup on self.)
-        goto    = self.goto              # Local reference to goto table (to avoid lookup on self.)
-        prod    = self.productions       # Local reference to production list (to avoid lookup on self.)
-        pslice  = YaccProduction(None)   # Production object passed to grammar rules
-        errorcount = 0                   # Used during error recovery 
-
-        # If no lexer was given, we will try to use the lex module
-        if not lexer:
-            lex = load_ply_lex()
-            lexer = lex.lexer
-        
-        # Set up the lexer and parser objects on pslice
-        pslice.lexer = lexer
-        pslice.parser = self
-
-        # If input was supplied, pass to lexer
-        if input is not None:
-            lexer.input(input)
-
-        if tokenfunc is None:
-           # Tokenize function
-           get_token = lexer.token
-        else:
-           get_token = tokenfunc
-
-        # Set up the state and symbol stacks
-
-        statestack = [ ]                # Stack of parsing states
-        self.statestack = statestack
-        symstack   = [ ]                # Stack of grammar symbols
-        self.symstack = symstack
-
-        pslice.stack = symstack         # Put in the production
-        errtoken   = None               # Err token
-
-        # The start state is assumed to be (0,$end)
-
-        statestack.append(0)
-        sym = YaccSymbol()
-        sym.type = '$end'
-        symstack.append(sym)
-        state = 0
-        while 1:
-            # Get the next symbol on the input.  If a lookahead symbol
-            # is already set, we just use that. Otherwise, we'll pull
-            # the next token off of the lookaheadstack or from the lexer
-
-            if not lookahead:
-                if not lookaheadstack:
-                    lookahead = get_token()     # Get the next token
-                else:
-                    lookahead = lookaheadstack.pop()
-                if not lookahead:
-                    lookahead = YaccSymbol()
-                    lookahead.type = '$end'
-
-            # Check the action table
-            ltype = lookahead.type
-            t = actions[state].get(ltype)
-
-            if t is not None:
-                if t > 0:
-                    # shift a symbol on the stack
-                    statestack.append(t)
-                    state = t
-
-                    symstack.append(lookahead)
-                    lookahead = None
-
-                    # Decrease error count on successful shift
-                    if errorcount: errorcount -=1
-                    continue
-
-                if t < 0:
-                    # reduce a symbol on the stack, emit a production
-                    p = prod[-t]
-                    pname = p.name
-                    plen  = p.len
-
-                    # Get production function
-                    sym = YaccSymbol()
-                    sym.type = pname       # Production name
-                    sym.value = None
-
-                    if plen:
-                        targ = symstack[-plen-1:]
-                        targ[0] = sym
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # below as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-                        
-                        try:
-                            # Call the grammar rule with our special slice object
-                            del symstack[-plen:]
-                            del statestack[-plen:]
-                            p.callable(pslice)
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    
-                    else:
-
-                        targ = [ sym ]
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # above as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-
-                        try:
-                            # Call the grammar rule with our special slice object
-                            p.callable(pslice)
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-                if t == 0:
-                    n = symstack[-1]
-                    return getattr(n,"value",None)
-
-            if t == None:
-
-                # We have some kind of parsing error here.  To handle
-                # this, we are going to push the current token onto
-                # the tokenstack and replace it with an 'error' token.
-                # If there are any synchronization rules, they may
-                # catch it.
-                #
-                # In addition to pushing the error token, we call call
-                # the user defined p_error() function if this is the
-                # first syntax error.  This function is only called if
-                # errorcount == 0.
-                if errorcount == 0 or self.errorok:
-                    errorcount = error_count
-                    self.errorok = 0
-                    errtoken = lookahead
-                    if errtoken.type == '$end':
-                        errtoken = None               # End of file!
-                    if self.errorfunc:
-                        global errok,token,restart
-                        errok = self.errok        # Set some special functions available in error recovery
-                        token = get_token
-                        restart = self.restart
-                        if errtoken and not hasattr(errtoken,'lexer'):
-                            errtoken.lexer = lexer
-                        tok = self.errorfunc(errtoken)
-                        del errok, token, restart   # Delete special functions
-
-                        if self.errorok:
-                            # User must have done some kind of panic
-                            # mode recovery on their own.  The
-                            # returned token is the next lookahead
-                            lookahead = tok
-                            errtoken = None
-                            continue
-                    else:
-                        if errtoken:
-                            if hasattr(errtoken,"lineno"): lineno = lookahead.lineno
-                            else: lineno = 0
-                            if lineno:
-                                sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type))
-                            else:
-                                sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type)
-                        else:
-                            sys.stderr.write("yacc: Parse error in input. EOF\n")
-                            return
-
-                else:
-                    errorcount = error_count
-
-                # case 1:  the statestack only has 1 entry on it.  If we're in this state, the
-                # entire parse has been rolled back and we're completely hosed.   The token is
-                # discarded and we just keep going.
-
-                if len(statestack) <= 1 and lookahead.type != '$end':
-                    lookahead = None
-                    errtoken = None
-                    state = 0
-                    # Nuke the pushback stack
-                    del lookaheadstack[:]
-                    continue
-
-                # case 2: the statestack has a couple of entries on it, but we're
-                # at the end of the file. nuke the top entry and generate an error token
-
-                # Start nuking entries on the stack
-                if lookahead.type == '$end':
-                    # Whoa. We're really hosed here. Bail out
-                    return
-
-                if lookahead.type != 'error':
-                    sym = symstack[-1]
-                    if sym.type == 'error':
-                        # Hmmm. Error is on top of stack, we'll just nuke input
-                        # symbol and continue
-                        lookahead = None
-                        continue
-                    t = YaccSymbol()
-                    t.type = 'error'
-                    if hasattr(lookahead,"lineno"):
-                        t.lineno = lookahead.lineno
-                    t.value = lookahead
-                    lookaheadstack.append(lookahead)
-                    lookahead = t
-                else:
-                    symstack.pop()
-                    statestack.pop()
-                    state = statestack[-1]       # Potential bug fix
-
-                continue
-
-            # Call an error function here
-            raise RuntimeError("yacc: internal parser error!!!\n")
-
-# -----------------------------------------------------------------------------
-#                          === Grammar Representation ===
-#
-# The following functions, classes, and variables are used to represent and
-# manipulate the rules that make up a grammar. 
-# -----------------------------------------------------------------------------
-
-import re
-
-# regex matching identifiers
-_is_identifier = re.compile(r'^[a-zA-Z0-9_-]+$')
-
-# -----------------------------------------------------------------------------
-# class Production:
-#
-# This class stores the raw information about a single production or grammar rule.
-# A grammar rule refers to a specification such as this:
-#
-#       expr : expr PLUS term 
-#
-# Here are the basic attributes defined on all productions
-#
-#       name     - Name of the production.  For example 'expr'
-#       prod     - A list of symbols on the right side ['expr','PLUS','term']
-#       prec     - Production precedence level
-#       number   - Production number.
-#       func     - Function that executes on reduce
-#       file     - File where production function is defined
-#       lineno   - Line number where production function is defined
-#
-# The following attributes are defined or optional.
-#
-#       len       - Length of the production (number of symbols on right hand side)
-#       usyms     - Set of unique symbols found in the production
-# -----------------------------------------------------------------------------
-
-class Production(object):
-    reduced = 0
-    def __init__(self,number,name,prod,precedence=('right',0),func=None,file='',line=0):
-        self.name     = name
-        self.prod     = tuple(prod)
-        self.number   = number
-        self.func     = func
-        self.callable = None
-        self.file     = file
-        self.line     = line
-        self.prec     = precedence
-
-        # Internal settings used during table construction
-        
-        self.len  = len(self.prod)   # Length of the production
-
-        # Create a list of unique production symbols used in the production
-        self.usyms = [ ]             
-        for s in self.prod:
-            if s not in self.usyms:
-                self.usyms.append(s)
-
-        # List of all LR items for the production
-        self.lr_items = []
-        self.lr_next = None
-
-        # Create a string representation
-        if self.prod:
-            self.str = "%s -> %s" % (self.name," ".join(self.prod))
-        else:
-            self.str = "%s -> <empty>" % self.name
-
-    def __str__(self):
-        return self.str
-
-    def __repr__(self):
-        return "Production("+str(self)+")"
-
-    def __len__(self):
-        return len(self.prod)
-
-    def __nonzero__(self):
-        return 1
-
-    def __getitem__(self,index):
-        return self.prod[index]
-            
-    # Return the nth lr_item from the production (or None if at the end)
-    def lr_item(self,n):
-        if n > len(self.prod): return None
-        p = LRItem(self,n)
-
-        # Precompute the list of productions immediately following.  Hack. Remove later
-        try:
-            p.lr_after = Prodnames[p.prod[n+1]]
-        except (IndexError,KeyError):
-            p.lr_after = []
-        try:
-            p.lr_before = p.prod[n-1]
-        except IndexError:
-            p.lr_before = None
-
-        return p
-    
-    # Bind the production function name to a callable
-    def bind(self,pdict):
-        if self.func:
-            self.callable = pdict[self.func]
-
-# This class serves as a minimal standin for Production objects when
-# reading table data from files.   It only contains information
-# actually used by the LR parsing engine, plus some additional
-# debugging information.
-class MiniProduction(object):
-    def __init__(self,str,name,len,func,file,line):
-        self.name     = name
-        self.len      = len
-        self.func     = func
-        self.callable = None
-        self.file     = file
-        self.line     = line
-        self.str      = str
-    def __str__(self):
-        return self.str
-    def __repr__(self):
-        return "MiniProduction(%s)" % self.str
-
-    # Bind the production function name to a callable
-    def bind(self,pdict):
-        if self.func:
-            self.callable = pdict[self.func]
-
-
-# -----------------------------------------------------------------------------
-# class LRItem
-#
-# This class represents a specific stage of parsing a production rule.  For
-# example: 
-#
-#       expr : expr . PLUS term 
-#
-# In the above, the "." represents the current location of the parse.  Here
-# basic attributes:
-#
-#       name       - Name of the production.  For example 'expr'
-#       prod       - A list of symbols on the right side ['expr','.', 'PLUS','term']
-#       number     - Production number.
-#
-#       lr_next      Next LR item. Example, if we are ' expr -> expr . PLUS term'
-#                    then lr_next refers to 'expr -> expr PLUS . term'
-#       lr_index   - LR item index (location of the ".") in the prod list.
-#       lookaheads - LALR lookahead symbols for this item
-#       len        - Length of the production (number of symbols on right hand side)
-#       lr_after    - List of all productions that immediately follow
-#       lr_before   - Grammar symbol immediately before
-# -----------------------------------------------------------------------------
-
-class LRItem(object):
-    def __init__(self,p,n):
-        self.name       = p.name
-        self.prod       = list(p.prod)
-        self.number     = p.number
-        self.lr_index   = n
-        self.lookaheads = { }
-        self.prod.insert(n,".")
-        self.prod       = tuple(self.prod)
-        self.len        = len(self.prod)
-        self.usyms      = p.usyms
-
-    def __str__(self):
-        if self.prod:
-            s = "%s -> %s" % (self.name," ".join(self.prod))
-        else:
-            s = "%s -> <empty>" % self.name
-        return s
-
-    def __repr__(self):
-        return "LRItem("+str(self)+")"
-
-# -----------------------------------------------------------------------------
-# rightmost_terminal()
-#
-# Return the rightmost terminal from a list of symbols.  Used in add_production()
-# -----------------------------------------------------------------------------
-def rightmost_terminal(symbols, terminals):
-    i = len(symbols) - 1
-    while i >= 0:
-        if symbols[i] in terminals:
-            return symbols[i]
-        i -= 1
-    return None
-
-# -----------------------------------------------------------------------------
-#                           === GRAMMAR CLASS ===
-#
-# The following class represents the contents of the specified grammar along
-# with various computed properties such as first sets, follow sets, LR items, etc.
-# This data is used for critical parts of the table generation process later.
-# -----------------------------------------------------------------------------
-
-class GrammarError(YaccError): pass
-
-class Grammar(object):
-    def __init__(self,terminals):
-        self.Productions  = [None]  # A list of all of the productions.  The first
-                                    # entry is always reserved for the purpose of
-                                    # building an augmented grammar
-
-        self.Prodnames    = { }     # A dictionary mapping the names of nonterminals to a list of all
-                                    # productions of that nonterminal.
-
-        self.Prodmap      = { }     # A dictionary that is only used to detect duplicate
-                                    # productions.
-
-        self.Terminals    = { }     # A dictionary mapping the names of terminal symbols to a
-                                    # list of the rules where they are used.
-
-        for term in terminals:
-            self.Terminals[term] = []
-
-        self.Terminals['error'] = []
-
-        self.Nonterminals = { }     # A dictionary mapping names of nonterminals to a list
-                                    # of rule numbers where they are used.
-
-        self.First        = { }     # A dictionary of precomputed FIRST(x) symbols
-
-        self.Follow       = { }     # A dictionary of precomputed FOLLOW(x) symbols
-
-        self.Precedence   = { }     # Precedence rules for each terminal. Contains tuples of the
-                                    # form ('right',level) or ('nonassoc', level) or ('left',level)
-
-        self.UsedPrecedence = { }   # Precedence rules that were actually used by the grammer.
-                                    # This is only used to provide error checking and to generate
-                                    # a warning about unused precedence rules.
-
-        self.Start = None           # Starting symbol for the grammar
-
-
-    def __len__(self):
-        return len(self.Productions)
-
-    def __getitem__(self,index):
-        return self.Productions[index]
-
-    # -----------------------------------------------------------------------------
-    # set_precedence()
-    #
-    # Sets the precedence for a given terminal. assoc is the associativity such as
-    # 'left','right', or 'nonassoc'.  level is a numeric level.
-    #
-    # -----------------------------------------------------------------------------
-
-    def set_precedence(self,term,assoc,level):
-        assert self.Productions == [None],"Must call set_precedence() before add_production()"
-        if term in self.Precedence:
-            raise GrammarError("Precedence already specified for terminal '%s'" % term)
-        if assoc not in ['left','right','nonassoc']:
-            raise GrammarError("Associativity must be one of 'left','right', or 'nonassoc'")
-        self.Precedence[term] = (assoc,level)
- 
-    # -----------------------------------------------------------------------------
-    # add_production()
-    #
-    # Given an action function, this function assembles a production rule and
-    # computes its precedence level.
-    #
-    # The production rule is supplied as a list of symbols.   For example,
-    # a rule such as 'expr : expr PLUS term' has a production name of 'expr' and
-    # symbols ['expr','PLUS','term'].
-    #
-    # Precedence is determined by the precedence of the right-most non-terminal
-    # or the precedence of a terminal specified by %prec.
-    #
-    # A variety of error checks are performed to make sure production symbols
-    # are valid and that %prec is used correctly.
-    # -----------------------------------------------------------------------------
-
-    def add_production(self,prodname,syms,func=None,file='',line=0):
-
-        if prodname in self.Terminals:
-            raise GrammarError("%s:%d: Illegal rule name '%s'. Already defined as a token" % (file,line,prodname))
-        if prodname == 'error':
-            raise GrammarError("%s:%d: Illegal rule name '%s'. error is a reserved word" % (file,line,prodname))
-        if not _is_identifier.match(prodname):
-            raise GrammarError("%s:%d: Illegal rule name '%s'" % (file,line,prodname))
-
-        # Look for literal tokens 
-        for n,s in enumerate(syms):
-            if s[0] in "'\"":
-                 try:
-                     c = eval(s)
-                     if (len(c) > 1):
-                          raise GrammarError("%s:%d: Literal token %s in rule '%s' may only be a single character" % (file,line,s, prodname))
-                     if not c in self.Terminals:
-                          self.Terminals[c] = []
-                     syms[n] = c
-                     continue
-                 except SyntaxError:
-                     pass
-            if not _is_identifier.match(s) and s != '%prec':
-                raise GrammarError("%s:%d: Illegal name '%s' in rule '%s'" % (file,line,s, prodname))
-        
-        # Determine the precedence level
-        if '%prec' in syms:
-            if syms[-1] == '%prec':
-                raise GrammarError("%s:%d: Syntax error. Nothing follows %%prec" % (file,line))
-            if syms[-2] != '%prec':
-                raise GrammarError("%s:%d: Syntax error. %%prec can only appear at the end of a grammar rule" % (file,line))
-            precname = syms[-1]
-            prodprec = self.Precedence.get(precname,None)
-            if not prodprec:
-                raise GrammarError("%s:%d: Nothing known about the precedence of '%s'" % (file,line,precname))
-            else:
-                self.UsedPrecedence[precname] = 1
-            del syms[-2:]     # Drop %prec from the rule
-        else:
-            # If no %prec, precedence is determined by the rightmost terminal symbol
-            precname = rightmost_terminal(syms,self.Terminals)
-            prodprec = self.Precedence.get(precname,('right',0)) 
-            
-        # See if the rule is already in the rulemap
-        map = "%s -> %s" % (prodname,syms)
-        if map in self.Prodmap:
-            m = self.Prodmap[map]
-            raise GrammarError("%s:%d: Duplicate rule %s. " % (file,line, m) +
-                               "Previous definition at %s:%d" % (m.file, m.line))
-
-        # From this point on, everything is valid.  Create a new Production instance
-        pnumber  = len(self.Productions)
-        if not prodname in self.Nonterminals:
-            self.Nonterminals[prodname] = [ ]
-
-        # Add the production number to Terminals and Nonterminals
-        for t in syms:
-            if t in self.Terminals:
-                self.Terminals[t].append(pnumber)
-            else:
-                if not t in self.Nonterminals:
-                    self.Nonterminals[t] = [ ]
-                self.Nonterminals[t].append(pnumber)
-
-        # Create a production and add it to the list of productions
-        p = Production(pnumber,prodname,syms,prodprec,func,file,line)
-        self.Productions.append(p)
-        self.Prodmap[map] = p
-
-        # Add to the global productions list
-        try:
-            self.Prodnames[prodname].append(p)
-        except KeyError:
-            self.Prodnames[prodname] = [ p ]
-        return 0
-
-    # -----------------------------------------------------------------------------
-    # set_start()
-    #
-    # Sets the starting symbol and creates the augmented grammar.  Production 
-    # rule 0 is S' -> start where start is the start symbol.
-    # -----------------------------------------------------------------------------
-
-    def set_start(self,start=None):
-        if not start:
-            start = self.Productions[1].name
-        if start not in self.Nonterminals:
-            raise GrammarError("start symbol %s undefined" % start)
-        self.Productions[0] = Production(0,"S'",[start])
-        self.Nonterminals[start].append(0)
-        self.Start = start
-
-    # -----------------------------------------------------------------------------
-    # find_unreachable()
-    #
-    # Find all of the nonterminal symbols that can't be reached from the starting
-    # symbol.  Returns a list of nonterminals that can't be reached.
-    # -----------------------------------------------------------------------------
-
-    def find_unreachable(self):
-        
-        # Mark all symbols that are reachable from a symbol s
-        def mark_reachable_from(s):
-            if reachable[s]:
-                # We've already reached symbol s.
-                return
-            reachable[s] = 1
-            for p in self.Prodnames.get(s,[]):
-                for r in p.prod:
-                    mark_reachable_from(r)
-
-        reachable   = { }
-        for s in list(self.Terminals) + list(self.Nonterminals):
-            reachable[s] = 0
-
-        mark_reachable_from( self.Productions[0].prod[0] )
-
-        return [s for s in list(self.Nonterminals)
-                        if not reachable[s]]
-    
-    # -----------------------------------------------------------------------------
-    # infinite_cycles()
-    #
-    # This function looks at the various parsing rules and tries to detect
-    # infinite recursion cycles (grammar rules where there is no possible way
-    # to derive a string of only terminals).
-    # -----------------------------------------------------------------------------
-
-    def infinite_cycles(self):
-        terminates = {}
-
-        # Terminals:
-        for t in self.Terminals:
-            terminates[t] = 1
-
-        terminates['$end'] = 1
-
-        # Nonterminals:
-
-        # Initialize to false:
-        for n in self.Nonterminals:
-            terminates[n] = 0
-
-        # Then propagate termination until no change:
-        while 1:
-            some_change = 0
-            for (n,pl) in self.Prodnames.items():
-                # Nonterminal n terminates iff any of its productions terminates.
-                for p in pl:
-                    # Production p terminates iff all of its rhs symbols terminate.
-                    for s in p.prod:
-                        if not terminates[s]:
-                            # The symbol s does not terminate,
-                            # so production p does not terminate.
-                            p_terminates = 0
-                            break
-                    else:
-                        # didn't break from the loop,
-                        # so every symbol s terminates
-                        # so production p terminates.
-                        p_terminates = 1
-
-                    if p_terminates:
-                        # symbol n terminates!
-                        if not terminates[n]:
-                            terminates[n] = 1
-                            some_change = 1
-                        # Don't need to consider any more productions for this n.
-                        break
-
-            if not some_change:
-                break
-
-        infinite = []
-        for (s,term) in terminates.items():
-            if not term:
-                if not s in self.Prodnames and not s in self.Terminals and s != 'error':
-                    # s is used-but-not-defined, and we've already warned of that,
-                    # so it would be overkill to say that it's also non-terminating.
-                    pass
-                else:
-                    infinite.append(s)
-
-        return infinite
-
-
-    # -----------------------------------------------------------------------------
-    # undefined_symbols()
-    #
-    # Find all symbols that were used the grammar, but not defined as tokens or
-    # grammar rules.  Returns a list of tuples (sym, prod) where sym in the symbol
-    # and prod is the production where the symbol was used. 
-    # -----------------------------------------------------------------------------
-    def undefined_symbols(self):
-        result = []
-        for p in self.Productions:
-            if not p: continue
-
-            for s in p.prod:
-                if not s in self.Prodnames and not s in self.Terminals and s != 'error':
-                    result.append((s,p))
-        return result
-
-    # -----------------------------------------------------------------------------
-    # unused_terminals()
-    #
-    # Find all terminals that were defined, but not used by the grammar.  Returns
-    # a list of all symbols.
-    # -----------------------------------------------------------------------------
-    def unused_terminals(self):
-        unused_tok = []
-        for s,v in self.Terminals.items():
-            if s != 'error' and not v:
-                unused_tok.append(s)
-
-        return unused_tok
-
-    # ------------------------------------------------------------------------------
-    # unused_rules()
-    #
-    # Find all grammar rules that were defined,  but not used (maybe not reachable)
-    # Returns a list of productions.
-    # ------------------------------------------------------------------------------
-
-    def unused_rules(self):
-        unused_prod = []
-        for s,v in self.Nonterminals.items():
-            if not v:
-                p = self.Prodnames[s][0]
-                unused_prod.append(p)
-        return unused_prod
-
-    # -----------------------------------------------------------------------------
-    # unused_precedence()
-    #
-    # Returns a list of tuples (term,precedence) corresponding to precedence
-    # rules that were never used by the grammar.  term is the name of the terminal
-    # on which precedence was applied and precedence is a string such as 'left' or
-    # 'right' corresponding to the type of precedence. 
-    # -----------------------------------------------------------------------------
-
-    def unused_precedence(self):
-        unused = []
-        for termname in self.Precedence:
-            if not (termname in self.Terminals or termname in self.UsedPrecedence):
-                unused.append((termname,self.Precedence[termname][0]))
-                
-        return unused
-
-    # -------------------------------------------------------------------------
-    # _first()
-    #
-    # Compute the value of FIRST1(beta) where beta is a tuple of symbols.
-    #
-    # During execution of compute_first1, the result may be incomplete.
-    # Afterward (e.g., when called from compute_follow()), it will be complete.
-    # -------------------------------------------------------------------------
-    def _first(self,beta):
-
-        # We are computing First(x1,x2,x3,...,xn)
-        result = [ ]
-        for x in beta:
-            x_produces_empty = 0
-
-            # Add all the non-<empty> symbols of First[x] to the result.
-            for f in self.First[x]:
-                if f == '<empty>':
-                    x_produces_empty = 1
-                else:
-                    if f not in result: result.append(f)
-
-            if x_produces_empty:
-                # We have to consider the next x in beta,
-                # i.e. stay in the loop.
-                pass
-            else:
-                # We don't have to consider any further symbols in beta.
-                break
-        else:
-            # There was no 'break' from the loop,
-            # so x_produces_empty was true for all x in beta,
-            # so beta produces empty as well.
-            result.append('<empty>')
-
-        return result
-
-    # -------------------------------------------------------------------------
-    # compute_first()
-    #
-    # Compute the value of FIRST1(X) for all symbols
-    # -------------------------------------------------------------------------
-    def compute_first(self):
-        if self.First:
-            return self.First
-
-        # Terminals:
-        for t in self.Terminals:
-            self.First[t] = [t]
-
-        self.First['$end'] = ['$end']
-
-        # Nonterminals:
-
-        # Initialize to the empty set:
-        for n in self.Nonterminals:
-            self.First[n] = []
-
-        # Then propagate symbols until no change:
-        while 1:
-            some_change = 0
-            for n in self.Nonterminals:
-                for p in self.Prodnames[n]:
-                    for f in self._first(p.prod):
-                        if f not in self.First[n]:
-                            self.First[n].append( f )
-                            some_change = 1
-            if not some_change:
-                break
-        
-        return self.First
-
-    # ---------------------------------------------------------------------
-    # compute_follow()
-    #
-    # Computes all of the follow sets for every non-terminal symbol.  The
-    # follow set is the set of all symbols that might follow a given
-    # non-terminal.  See the Dragon book, 2nd Ed. p. 189.
-    # ---------------------------------------------------------------------
-    def compute_follow(self,start=None):
-        # If already computed, return the result
-        if self.Follow:
-            return self.Follow
-
-        # If first sets not computed yet, do that first.
-        if not self.First:
-            self.compute_first()
-
-        # Add '$end' to the follow list of the start symbol
-        for k in self.Nonterminals:
-            self.Follow[k] = [ ]
-
-        if not start:
-            start = self.Productions[1].name
-
-        self.Follow[start] = [ '$end' ]
-
-        while 1:
-            didadd = 0
-            for p in self.Productions[1:]:
-                # Here is the production set
-                for i in range(len(p.prod)):
-                    B = p.prod[i]
-                    if B in self.Nonterminals:
-                        # Okay. We got a non-terminal in a production
-                        fst = self._first(p.prod[i+1:])
-                        hasempty = 0
-                        for f in fst:
-                            if f != '<empty>' and f not in self.Follow[B]:
-                                self.Follow[B].append(f)
-                                didadd = 1
-                            if f == '<empty>':
-                                hasempty = 1
-                        if hasempty or i == (len(p.prod)-1):
-                            # Add elements of follow(a) to follow(b)
-                            for f in self.Follow[p.name]:
-                                if f not in self.Follow[B]:
-                                    self.Follow[B].append(f)
-                                    didadd = 1
-            if not didadd: break
-        return self.Follow
-
-
-    # -----------------------------------------------------------------------------
-    # build_lritems()
-    #
-    # This function walks the list of productions and builds a complete set of the
-    # LR items.  The LR items are stored in two ways:  First, they are uniquely
-    # numbered and placed in the list _lritems.  Second, a linked list of LR items
-    # is built for each production.  For example:
-    #
-    #   E -> E PLUS E
-    #
-    # Creates the list
-    #
-    #  [E -> . E PLUS E, E -> E . PLUS E, E -> E PLUS . E, E -> E PLUS E . ]
-    # -----------------------------------------------------------------------------
-
-    def build_lritems(self):
-        for p in self.Productions:
-            lastlri = p
-            i = 0
-            lr_items = []
-            while 1:
-                if i > len(p):
-                    lri = None
-                else:
-                    lri = LRItem(p,i)
-                    # Precompute the list of productions immediately following
-                    try:
-                        lri.lr_after = self.Prodnames[lri.prod[i+1]]
-                    except (IndexError,KeyError):
-                        lri.lr_after = []
-                    try:
-                        lri.lr_before = lri.prod[i-1]
-                    except IndexError:
-                        lri.lr_before = None
-
-                lastlri.lr_next = lri
-                if not lri: break
-                lr_items.append(lri)
-                lastlri = lri
-                i += 1
-            p.lr_items = lr_items
-
-# -----------------------------------------------------------------------------
-#                            == Class LRTable ==
-#
-# This basic class represents a basic table of LR parsing information.  
-# Methods for generating the tables are not defined here.  They are defined
-# in the derived class LRGeneratedTable.
-# -----------------------------------------------------------------------------
-
-class VersionError(YaccError): pass
-
-class LRTable(object):
-    def __init__(self):
-        self.lr_action = None
-        self.lr_goto = None
-        self.lr_productions = None
-        self.lr_method = None
-
-    def read_table(self,module):
-        if isinstance(module,types.ModuleType):
-            parsetab = module
-        else:
-            if sys.version_info[0] < 3:
-                exec("import %s as parsetab" % module)
-            else:
-                env = { }
-                exec("import %s as parsetab" % module, env, env)
-                parsetab = env['parsetab']
-
-        if parsetab._tabversion != __tabversion__:
-            raise VersionError("yacc table file version is out of date")
-
-        self.lr_action = parsetab._lr_action
-        self.lr_goto = parsetab._lr_goto
-
-        self.lr_productions = []
-        for p in parsetab._lr_productions:
-            self.lr_productions.append(MiniProduction(*p))
-
-        self.lr_method = parsetab._lr_method
-        return parsetab._lr_signature
-
-    def read_pickle(self,filename):
-        try:
-            import cPickle as pickle
-        except ImportError:
-            import pickle
-
-        in_f = open(filename,"rb")
-
-        tabversion = pickle.load(in_f)
-        if tabversion != __tabversion__:
-            raise VersionError("yacc table file version is out of date")
-        self.lr_method = pickle.load(in_f)
-        signature      = pickle.load(in_f)
-        self.lr_action = pickle.load(in_f)
-        self.lr_goto   = pickle.load(in_f)
-        productions    = pickle.load(in_f)
-
-        self.lr_productions = []
-        for p in productions:
-            self.lr_productions.append(MiniProduction(*p))
-
-        in_f.close()
-        return signature
-
-    # Bind all production function names to callable objects in pdict
-    def bind_callables(self,pdict):
-        for p in self.lr_productions:
-            p.bind(pdict)
-    
-# -----------------------------------------------------------------------------
-#                           === LR Generator ===
-#
-# The following classes and functions are used to generate LR parsing tables on 
-# a grammar.
-# -----------------------------------------------------------------------------
-
-# -----------------------------------------------------------------------------
-# digraph()
-# traverse()
-#
-# The following two functions are used to compute set valued functions
-# of the form:
-#
-#     F(x) = F'(x) U U{F(y) | x R y}
-#
-# This is used to compute the values of Read() sets as well as FOLLOW sets
-# in LALR(1) generation.
-#
-# Inputs:  X    - An input set
-#          R    - A relation
-#          FP   - Set-valued function
-# ------------------------------------------------------------------------------
-
-def digraph(X,R,FP):
-    N = { }
-    for x in X:
-       N[x] = 0
-    stack = []
-    F = { }
-    for x in X:
-        if N[x] == 0: traverse(x,N,stack,F,X,R,FP)
-    return F
-
-def traverse(x,N,stack,F,X,R,FP):
-    stack.append(x)
-    d = len(stack)
-    N[x] = d
-    F[x] = FP(x)             # F(X) <- F'(x)
-
-    rel = R(x)               # Get y's related to x
-    for y in rel:
-        if N[y] == 0:
-             traverse(y,N,stack,F,X,R,FP)
-        N[x] = min(N[x],N[y])
-        for a in F.get(y,[]):
-            if a not in F[x]: F[x].append(a)
-    if N[x] == d:
-       N[stack[-1]] = MAXINT
-       F[stack[-1]] = F[x]
-       element = stack.pop()
-       while element != x:
-           N[stack[-1]] = MAXINT
-           F[stack[-1]] = F[x]
-           element = stack.pop()
-
-class LALRError(YaccError): pass
-
-# -----------------------------------------------------------------------------
-#                             == LRGeneratedTable ==
-#
-# This class implements the LR table generation algorithm.  There are no
-# public methods except for write()
-# -----------------------------------------------------------------------------
-
-class LRGeneratedTable(LRTable):
-    def __init__(self,grammar,method='LALR',log=None):
-        if method not in ['SLR','LALR']:
-            raise LALRError("Unsupported method %s" % method)
-
-        self.grammar = grammar
-        self.lr_method = method
-
-        # Set up the logger
-        if not log:
-            log = NullLogger()
-        self.log = log
-
-        # Internal attributes
-        self.lr_action     = {}        # Action table
-        self.lr_goto       = {}        # Goto table
-        self.lr_productions  = grammar.Productions    # Copy of grammar Production array
-        self.lr_goto_cache = {}        # Cache of computed gotos
-        self.lr0_cidhash   = {}        # Cache of closures
-
-        self._add_count    = 0         # Internal counter used to detect cycles
-
-        # Diagonistic information filled in by the table generator
-        self.sr_conflict   = 0
-        self.rr_conflict   = 0
-        self.conflicts     = []        # List of conflicts
-
-        self.sr_conflicts  = []
-        self.rr_conflicts  = []
-
-        # Build the tables
-        self.grammar.build_lritems()
-        self.grammar.compute_first()
-        self.grammar.compute_follow()
-        self.lr_parse_table()
-
-    # Compute the LR(0) closure operation on I, where I is a set of LR(0) items.
-
-    def lr0_closure(self,I):
-        self._add_count += 1
-
-        # Add everything in I to J
-        J = I[:]
-        didadd = 1
-        while didadd:
-            didadd = 0
-            for j in J:
-                for x in j.lr_after:
-                    if getattr(x,"lr0_added",0) == self._add_count: continue
-                    # Add B --> .G to J
-                    J.append(x.lr_next)
-                    x.lr0_added = self._add_count
-                    didadd = 1
-
-        return J
-
-    # Compute the LR(0) goto function goto(I,X) where I is a set
-    # of LR(0) items and X is a grammar symbol.   This function is written
-    # in a way that guarantees uniqueness of the generated goto sets
-    # (i.e. the same goto set will never be returned as two different Python
-    # objects).  With uniqueness, we can later do fast set comparisons using
-    # id(obj) instead of element-wise comparison.
-
-    def lr0_goto(self,I,x):
-        # First we look for a previously cached entry
-        g = self.lr_goto_cache.get((id(I),x),None)
-        if g: return g
-
-        # Now we generate the goto set in a way that guarantees uniqueness
-        # of the result
-
-        s = self.lr_goto_cache.get(x,None)
-        if not s:
-            s = { }
-            self.lr_goto_cache[x] = s
-
-        gs = [ ]
-        for p in I:
-            n = p.lr_next
-            if n and n.lr_before == x:
-                s1 = s.get(id(n),None)
-                if not s1:
-                    s1 = { }
-                    s[id(n)] = s1
-                gs.append(n)
-                s = s1
-        g = s.get('$end',None)
-        if not g:
-            if gs:
-                g = self.lr0_closure(gs)
-                s['$end'] = g
-            else:
-                s['$end'] = gs
-        self.lr_goto_cache[(id(I),x)] = g
-        return g
-
-    # Compute the LR(0) sets of item function
-    def lr0_items(self):
-
-        C = [ self.lr0_closure([self.grammar.Productions[0].lr_next]) ]
-        i = 0
-        for I in C:
-            self.lr0_cidhash[id(I)] = i
-            i += 1
-
-        # Loop over the items in C and each grammar symbols
-        i = 0
-        while i < len(C):
-            I = C[i]
-            i += 1
-
-            # Collect all of the symbols that could possibly be in the goto(I,X) sets
-            asyms = { }
-            for ii in I:
-                for s in ii.usyms:
-                    asyms[s] = None
-
-            for x in asyms:
-                g = self.lr0_goto(I,x)
-                if not g:  continue
-                if id(g) in self.lr0_cidhash: continue
-                self.lr0_cidhash[id(g)] = len(C)
-                C.append(g)
-
-        return C
-
-    # -----------------------------------------------------------------------------
-    #                       ==== LALR(1) Parsing ====
-    #
-    # LALR(1) parsing is almost exactly the same as SLR except that instead of
-    # relying upon Follow() sets when performing reductions, a more selective
-    # lookahead set that incorporates the state of the LR(0) machine is utilized.
-    # Thus, we mainly just have to focus on calculating the lookahead sets.
-    #
-    # The method used here is due to DeRemer and Pennelo (1982).
-    #
-    # DeRemer, F. L., and T. J. Pennelo: "Efficient Computation of LALR(1)
-    #     Lookahead Sets", ACM Transactions on Programming Languages and Systems,
-    #     Vol. 4, No. 4, Oct. 1982, pp. 615-649
-    #
-    # Further details can also be found in:
-    #
-    #  J. Tremblay and P. Sorenson, "The Theory and Practice of Compiler Writing",
-    #      McGraw-Hill Book Company, (1985).
-    #
-    # -----------------------------------------------------------------------------
-
-    # -----------------------------------------------------------------------------
-    # compute_nullable_nonterminals()
-    #
-    # Creates a dictionary containing all of the non-terminals that might produce
-    # an empty production.
-    # -----------------------------------------------------------------------------
-
-    def compute_nullable_nonterminals(self):
-        nullable = {}
-        num_nullable = 0
-        while 1:
-           for p in self.grammar.Productions[1:]:
-               if p.len == 0:
-                    nullable[p.name] = 1
-                    continue
-               for t in p.prod:
-                    if not t in nullable: break
-               else:
-                    nullable[p.name] = 1
-           if len(nullable) == num_nullable: break
-           num_nullable = len(nullable)
-        return nullable
-
-    # -----------------------------------------------------------------------------
-    # find_nonterminal_trans(C)
-    #
-    # Given a set of LR(0) items, this functions finds all of the non-terminal
-    # transitions.    These are transitions in which a dot appears immediately before
-    # a non-terminal.   Returns a list of tuples of the form (state,N) where state
-    # is the state number and N is the nonterminal symbol.
-    #
-    # The input C is the set of LR(0) items.
-    # -----------------------------------------------------------------------------
-
-    def find_nonterminal_transitions(self,C):
-         trans = []
-         for state in range(len(C)):
-             for p in C[state]:
-                 if p.lr_index < p.len - 1:
-                      t = (state,p.prod[p.lr_index+1])
-                      if t[1] in self.grammar.Nonterminals:
-                            if t not in trans: trans.append(t)
-             state = state + 1
-         return trans
-
-    # -----------------------------------------------------------------------------
-    # dr_relation()
-    #
-    # Computes the DR(p,A) relationships for non-terminal transitions.  The input
-    # is a tuple (state,N) where state is a number and N is a nonterminal symbol.
-    #
-    # Returns a list of terminals.
-    # -----------------------------------------------------------------------------
-
-    def dr_relation(self,C,trans,nullable):
-        dr_set = { }
-        state,N = trans
-        terms = []
-
-        g = self.lr0_goto(C[state],N)
-        for p in g:
-           if p.lr_index < p.len - 1:
-               a = p.prod[p.lr_index+1]
-               if a in self.grammar.Terminals:
-                   if a not in terms: terms.append(a)
-
-        # This extra bit is to handle the start state
-        if state == 0 and N == self.grammar.Productions[0].prod[0]:
-           terms.append('$end')
-
-        return terms
-
-    # -----------------------------------------------------------------------------
-    # reads_relation()
-    #
-    # Computes the READS() relation (p,A) READS (t,C).
-    # -----------------------------------------------------------------------------
-
-    def reads_relation(self,C, trans, empty):
-        # Look for empty transitions
-        rel = []
-        state, N = trans
-
-        g = self.lr0_goto(C[state],N)
-        j = self.lr0_cidhash.get(id(g),-1)
-        for p in g:
-            if p.lr_index < p.len - 1:
-                 a = p.prod[p.lr_index + 1]
-                 if a in empty:
-                      rel.append((j,a))
-
-        return rel
-
-    # -----------------------------------------------------------------------------
-    # compute_lookback_includes()
-    #
-    # Determines the lookback and includes relations
-    #
-    # LOOKBACK:
-    #
-    # This relation is determined by running the LR(0) state machine forward.
-    # For example, starting with a production "N : . A B C", we run it forward
-    # to obtain "N : A B C ."   We then build a relationship between this final
-    # state and the starting state.   These relationships are stored in a dictionary
-    # lookdict.
-    #
-    # INCLUDES:
-    #
-    # Computes the INCLUDE() relation (p,A) INCLUDES (p',B).
-    #
-    # This relation is used to determine non-terminal transitions that occur
-    # inside of other non-terminal transition states.   (p,A) INCLUDES (p', B)
-    # if the following holds:
-    #
-    #       B -> LAT, where T -> epsilon and p' -L-> p
-    #
-    # L is essentially a prefix (which may be empty), T is a suffix that must be
-    # able to derive an empty string.  State p' must lead to state p with the string L.
-    #
-    # -----------------------------------------------------------------------------
-
-    def compute_lookback_includes(self,C,trans,nullable):
-
-        lookdict = {}          # Dictionary of lookback relations
-        includedict = {}       # Dictionary of include relations
-
-        # Make a dictionary of non-terminal transitions
-        dtrans = {}
-        for t in trans:
-            dtrans[t] = 1
-
-        # Loop over all transitions and compute lookbacks and includes
-        for state,N in trans:
-            lookb = []
-            includes = []
-            for p in C[state]:
-                if p.name != N: continue
-
-                # Okay, we have a name match.  We now follow the production all the way
-                # through the state machine until we get the . on the right hand side
-
-                lr_index = p.lr_index
-                j = state
-                while lr_index < p.len - 1:
-                     lr_index = lr_index + 1
-                     t = p.prod[lr_index]
-
-                     # Check to see if this symbol and state are a non-terminal transition
-                     if (j,t) in dtrans:
-                           # Yes.  Okay, there is some chance that this is an includes relation
-                           # the only way to know for certain is whether the rest of the
-                           # production derives empty
-
-                           li = lr_index + 1
-                           while li < p.len:
-                                if p.prod[li] in self.grammar.Terminals: break      # No forget it
-                                if not p.prod[li] in nullable: break
-                                li = li + 1
-                           else:
-                                # Appears to be a relation between (j,t) and (state,N)
-                                includes.append((j,t))
-
-                     g = self.lr0_goto(C[j],t)               # Go to next set
-                     j = self.lr0_cidhash.get(id(g),-1)     # Go to next state
-
-                # When we get here, j is the final state, now we have to locate the production
-                for r in C[j]:
-                     if r.name != p.name: continue
-                     if r.len != p.len:   continue
-                     i = 0
-                     # This look is comparing a production ". A B C" with "A B C ."
-                     while i < r.lr_index:
-                          if r.prod[i] != p.prod[i+1]: break
-                          i = i + 1
-                     else:
-                          lookb.append((j,r))
-            for i in includes:
-                 if not i in includedict: includedict[i] = []
-                 includedict[i].append((state,N))
-            lookdict[(state,N)] = lookb
-
-        return lookdict,includedict
-
-    # -----------------------------------------------------------------------------
-    # compute_read_sets()
-    #
-    # Given a set of LR(0) items, this function computes the read sets.
-    #
-    # Inputs:  C        =  Set of LR(0) items
-    #          ntrans   = Set of nonterminal transitions
-    #          nullable = Set of empty transitions
-    #
-    # Returns a set containing the read sets
-    # -----------------------------------------------------------------------------
-
-    def compute_read_sets(self,C, ntrans, nullable):
-        FP = lambda x: self.dr_relation(C,x,nullable)
-        R =  lambda x: self.reads_relation(C,x,nullable)
-        F = digraph(ntrans,R,FP)
-        return F
-
-    # -----------------------------------------------------------------------------
-    # compute_follow_sets()
-    #
-    # Given a set of LR(0) items, a set of non-terminal transitions, a readset,
-    # and an include set, this function computes the follow sets
-    #
-    # Follow(p,A) = Read(p,A) U U {Follow(p',B) | (p,A) INCLUDES (p',B)}
-    #
-    # Inputs:
-    #            ntrans     = Set of nonterminal transitions
-    #            readsets   = Readset (previously computed)
-    #            inclsets   = Include sets (previously computed)
-    #
-    # Returns a set containing the follow sets
-    # -----------------------------------------------------------------------------
-
-    def compute_follow_sets(self,ntrans,readsets,inclsets):
-         FP = lambda x: readsets[x]
-         R  = lambda x: inclsets.get(x,[])
-         F = digraph(ntrans,R,FP)
-         return F
-
-    # -----------------------------------------------------------------------------
-    # add_lookaheads()
-    #
-    # Attaches the lookahead symbols to grammar rules.
-    #
-    # Inputs:    lookbacks         -  Set of lookback relations
-    #            followset         -  Computed follow set
-    #
-    # This function directly attaches the lookaheads to productions contained
-    # in the lookbacks set
-    # -----------------------------------------------------------------------------
-
-    def add_lookaheads(self,lookbacks,followset):
-        for trans,lb in lookbacks.items():
-            # Loop over productions in lookback
-            for state,p in lb:
-                 if not state in p.lookaheads:
-                      p.lookaheads[state] = []
-                 f = followset.get(trans,[])
-                 for a in f:
-                      if a not in p.lookaheads[state]: p.lookaheads[state].append(a)
-
-    # -----------------------------------------------------------------------------
-    # add_lalr_lookaheads()
-    #
-    # This function does all of the work of adding lookahead information for use
-    # with LALR parsing
-    # -----------------------------------------------------------------------------
-
-    def add_lalr_lookaheads(self,C):
-        # Determine all of the nullable nonterminals
-        nullable = self.compute_nullable_nonterminals()
-
-        # Find all non-terminal transitions
-        trans = self.find_nonterminal_transitions(C)
-
-        # Compute read sets
-        readsets = self.compute_read_sets(C,trans,nullable)
-
-        # Compute lookback/includes relations
-        lookd, included = self.compute_lookback_includes(C,trans,nullable)
-
-        # Compute LALR FOLLOW sets
-        followsets = self.compute_follow_sets(trans,readsets,included)
-
-        # Add all of the lookaheads
-        self.add_lookaheads(lookd,followsets)
-
-    # -----------------------------------------------------------------------------
-    # lr_parse_table()
-    #
-    # This function constructs the parse tables for SLR or LALR
-    # -----------------------------------------------------------------------------
-    def lr_parse_table(self):
-        Productions = self.grammar.Productions
-        Precedence  = self.grammar.Precedence
-        goto   = self.lr_goto         # Goto array
-        action = self.lr_action       # Action array
-        log    = self.log             # Logger for output
-
-        actionp = { }                 # Action production array (temporary)
-        
-        log.info("Parsing method: %s", self.lr_method)
-
-        # Step 1: Construct C = { I0, I1, ... IN}, collection of LR(0) items
-        # This determines the number of states
-
-        C = self.lr0_items()
-
-        if self.lr_method == 'LALR':
-            self.add_lalr_lookaheads(C)
-
-        # Build the parser table, state by state
-        st = 0
-        for I in C:
-            # Loop over each production in I
-            actlist = [ ]              # List of actions
-            st_action  = { }
-            st_actionp = { }
-            st_goto    = { }
-            log.info("")
-            log.info("state %d", st)
-            log.info("")
-            for p in I:
-                log.info("    (%d) %s", p.number, str(p))
-            log.info("")
-
-            for p in I:
-                    if p.len == p.lr_index + 1:
-                        if p.name == "S'":
-                            # Start symbol. Accept!
-                            st_action["$end"] = 0
-                            st_actionp["$end"] = p
-                        else:
-                            # We are at the end of a production.  Reduce!
-                            if self.lr_method == 'LALR':
-                                laheads = p.lookaheads[st]
-                            else:
-                                laheads = self.grammar.Follow[p.name]
-                            for a in laheads:
-                                actlist.append((a,p,"reduce using rule %d (%s)" % (p.number,p)))
-                                r = st_action.get(a,None)
-                                if r is not None:
-                                    # Whoa. Have a shift/reduce or reduce/reduce conflict
-                                    if r > 0:
-                                        # Need to decide on shift or reduce here
-                                        # By default we favor shifting. Need to add
-                                        # some precedence rules here.
-                                        sprec,slevel = Productions[st_actionp[a].number].prec
-                                        rprec,rlevel = Precedence.get(a,('right',0))
-                                        if (slevel < rlevel) or ((slevel == rlevel) and (rprec == 'left')):
-                                            # We really need to reduce here.
-                                            st_action[a] = -p.number
-                                            st_actionp[a] = p
-                                            if not slevel and not rlevel:
-                                                log.info("  ! shift/reduce conflict for %s resolved as reduce",a)
-                                                self.sr_conflicts.append((st,a,'reduce'))
-                                            Productions[p.number].reduced += 1
-                                        elif (slevel == rlevel) and (rprec == 'nonassoc'):
-                                            st_action[a] = None
-                                        else:
-                                            # Hmmm. Guess we'll keep the shift
-                                            if not rlevel:
-                                                log.info("  ! shift/reduce conflict for %s resolved as shift",a)
-                                                self.sr_conflicts.append((st,a,'shift'))
-                                    elif r < 0:
-                                        # Reduce/reduce conflict.   In this case, we favor the rule
-                                        # that was defined first in the grammar file
-                                        oldp = Productions[-r]
-                                        pp = Productions[p.number]
-                                        if oldp.line > pp.line:
-                                            st_action[a] = -p.number
-                                            st_actionp[a] = p
-                                            chosenp,rejectp = pp,oldp
-                                            Productions[p.number].reduced += 1
-                                            Productions[oldp.number].reduced -= 1
-                                        else:
-                                            chosenp,rejectp = oldp,pp
-                                        self.rr_conflicts.append((st,chosenp,rejectp))
-                                        log.info("  ! reduce/reduce conflict for %s resolved using rule %d (%s)", a,st_actionp[a].number, st_actionp[a])
-                                    else:
-                                        raise LALRError("Unknown conflict in state %d" % st)
-                                else:
-                                    st_action[a] = -p.number
-                                    st_actionp[a] = p
-                                    Productions[p.number].reduced += 1
-                    else:
-                        i = p.lr_index
-                        a = p.prod[i+1]       # Get symbol right after the "."
-                        if a in self.grammar.Terminals:
-                            g = self.lr0_goto(I,a)
-                            j = self.lr0_cidhash.get(id(g),-1)
-                            if j >= 0:
-                                # We are in a shift state
-                                actlist.append((a,p,"shift and go to state %d" % j))
-                                r = st_action.get(a,None)
-                                if r is not None:
-                                    # Whoa have a shift/reduce or shift/shift conflict
-                                    if r > 0:
-                                        if r != j:
-                                            raise LALRError("Shift/shift conflict in state %d" % st)
-                                    elif r < 0:
-                                        # Do a precedence check.
-                                        #   -  if precedence of reduce rule is higher, we reduce.
-                                        #   -  if precedence of reduce is same and left assoc, we reduce.
-                                        #   -  otherwise we shift
-                                        rprec,rlevel = Productions[st_actionp[a].number].prec
-                                        sprec,slevel = Precedence.get(a,('right',0))
-                                        if (slevel > rlevel) or ((slevel == rlevel) and (rprec == 'right')):
-                                            # We decide to shift here... highest precedence to shift
-                                            Productions[st_actionp[a].number].reduced -= 1
-                                            st_action[a] = j
-                                            st_actionp[a] = p
-                                            if not rlevel:
-                                                log.info("  ! shift/reduce conflict for %s resolved as shift",a)
-                                                self.sr_conflicts.append((st,a,'shift'))
-                                        elif (slevel == rlevel) and (rprec == 'nonassoc'):
-                                            st_action[a] = None
-                                        else:
-                                            # Hmmm. Guess we'll keep the reduce
-                                            if not slevel and not rlevel:
-                                                log.info("  ! shift/reduce conflict for %s resolved as reduce",a)
-                                                self.sr_conflicts.append((st,a,'reduce'))
-
-                                    else:
-                                        raise LALRError("Unknown conflict in state %d" % st)
-                                else:
-                                    st_action[a] = j
-                                    st_actionp[a] = p
-
-            # Print the actions associated with each terminal
-            _actprint = { }
-            for a,p,m in actlist:
-                if a in st_action:
-                    if p is st_actionp[a]:
-                        log.info("    %-15s %s",a,m)
-                        _actprint[(a,m)] = 1
-            log.info("")
-            # Print the actions that were not used. (debugging)
-            not_used = 0
-            for a,p,m in actlist:
-                if a in st_action:
-                    if p is not st_actionp[a]:
-                        if not (a,m) in _actprint:
-                            log.debug("  ! %-15s [ %s ]",a,m)
-                            not_used = 1
-                            _actprint[(a,m)] = 1
-            if not_used:
-                log.debug("")
-
-            # Construct the goto table for this state
-
-            nkeys = { }
-            for ii in I:
-                for s in ii.usyms:
-                    if s in self.grammar.Nonterminals:
-                        nkeys[s] = None
-            for n in nkeys:
-                g = self.lr0_goto(I,n)
-                j = self.lr0_cidhash.get(id(g),-1)
-                if j >= 0:
-                    st_goto[n] = j
-                    log.info("    %-30s shift and go to state %d",n,j)
-
-            action[st] = st_action
-            actionp[st] = st_actionp
-            goto[st] = st_goto
-            st += 1
-
-
-    # -----------------------------------------------------------------------------
-    # write()
-    #
-    # This function writes the LR parsing tables to a file
-    # -----------------------------------------------------------------------------
-
-    def write_table(self,modulename,outputdir='',signature=""):
-        basemodulename = modulename.split(".")[-1]
-        filename = os.path.join(outputdir,basemodulename) + ".py"
-        try:
-            f = open(filename,"w")
-
-            f.write("""
-# %s
-# This file is automatically generated. Do not edit.
-_tabversion = %r
-
-_lr_method = %r
-
-_lr_signature = %r
-    """ % (filename, __tabversion__, self.lr_method, signature))
-
-            # Change smaller to 0 to go back to original tables
-            smaller = 1
-
-            # Factor out names to try and make smaller
-            if smaller:
-                items = { }
-
-                for s,nd in self.lr_action.items():
-                   for name,v in nd.items():
-                      i = items.get(name)
-                      if not i:
-                         i = ([],[])
-                         items[name] = i
-                      i[0].append(s)
-                      i[1].append(v)
-
-                f.write("\n_lr_action_items = {")
-                for k,v in items.items():
-                    f.write("%r:([" % k)
-                    for i in v[0]:
-                        f.write("%r," % i)
-                    f.write("],[")
-                    for i in v[1]:
-                        f.write("%r," % i)
-
-                    f.write("]),")
-                f.write("}\n")
-
-                f.write("""
-_lr_action = { }
-for _k, _v in _lr_action_items.items():
-   for _x,_y in zip(_v[0],_v[1]):
-      if not _x in _lr_action:  _lr_action[_x] = { }
-      _lr_action[_x][_k] = _y
-del _lr_action_items
-""")
-
-            else:
-                f.write("\n_lr_action = { ");
-                for k,v in self.lr_action.items():
-                    f.write("(%r,%r):%r," % (k[0],k[1],v))
-                f.write("}\n");
-
-            if smaller:
-                # Factor out names to try and make smaller
-                items = { }
-
-                for s,nd in self.lr_goto.items():
-                   for name,v in nd.items():
-                      i = items.get(name)
-                      if not i:
-                         i = ([],[])
-                         items[name] = i
-                      i[0].append(s)
-                      i[1].append(v)
-
-                f.write("\n_lr_goto_items = {")
-                for k,v in items.items():
-                    f.write("%r:([" % k)
-                    for i in v[0]:
-                        f.write("%r," % i)
-                    f.write("],[")
-                    for i in v[1]:
-                        f.write("%r," % i)
-
-                    f.write("]),")
-                f.write("}\n")
-
-                f.write("""
-_lr_goto = { }
-for _k, _v in _lr_goto_items.items():
-   for _x,_y in zip(_v[0],_v[1]):
-       if not _x in _lr_goto: _lr_goto[_x] = { }
-       _lr_goto[_x][_k] = _y
-del _lr_goto_items
-""")
-            else:
-                f.write("\n_lr_goto = { ");
-                for k,v in self.lr_goto.items():
-                    f.write("(%r,%r):%r," % (k[0],k[1],v))
-                f.write("}\n");
-
-            # Write production table
-            f.write("_lr_productions = [\n")
-            for p in self.lr_productions:
-                if p.func:
-                    f.write("  (%r,%r,%d,%r,%r,%d),\n" % (p.str,p.name, p.len, p.func,p.file,p.line))
-                else:
-                    f.write("  (%r,%r,%d,None,None,None),\n" % (str(p),p.name, p.len))
-            f.write("]\n")
-            f.close()
-
-        except IOError:
-            e = sys.exc_info()[1]
-            sys.stderr.write("Unable to create '%s'\n" % filename)
-            sys.stderr.write(str(e)+"\n")
-            return
-
-
-    # -----------------------------------------------------------------------------
-    # pickle_table()
-    #
-    # This function pickles the LR parsing tables to a supplied file object
-    # -----------------------------------------------------------------------------
-
-    def pickle_table(self,filename,signature=""):
-        try:
-            import cPickle as pickle
-        except ImportError:
-            import pickle
-        outf = open(filename,"wb")
-        pickle.dump(__tabversion__,outf,pickle_protocol)
-        pickle.dump(self.lr_method,outf,pickle_protocol)
-        pickle.dump(signature,outf,pickle_protocol)
-        pickle.dump(self.lr_action,outf,pickle_protocol)
-        pickle.dump(self.lr_goto,outf,pickle_protocol)
-
-        outp = []
-        for p in self.lr_productions:
-            if p.func:
-                outp.append((p.str,p.name, p.len, p.func,p.file,p.line))
-            else:
-                outp.append((str(p),p.name,p.len,None,None,None))
-        pickle.dump(outp,outf,pickle_protocol)
-        outf.close()
-
-# -----------------------------------------------------------------------------
-#                            === INTROSPECTION ===
-#
-# The following functions and classes are used to implement the PLY
-# introspection features followed by the yacc() function itself.
-# -----------------------------------------------------------------------------
-
-# -----------------------------------------------------------------------------
-# get_caller_module_dict()
-#
-# This function returns a dictionary containing all of the symbols defined within
-# a caller further down the call stack.  This is used to get the environment
-# associated with the yacc() call if none was provided.
-# -----------------------------------------------------------------------------
-
-def get_caller_module_dict(levels):
-    try:
-        raise RuntimeError
-    except RuntimeError:
-        e,b,t = sys.exc_info()
-        f = t.tb_frame
-        while levels > 0:
-            f = f.f_back                   
-            levels -= 1
-        ldict = f.f_globals.copy()
-        if f.f_globals != f.f_locals:
-            ldict.update(f.f_locals)
-
-        return ldict
-
-# -----------------------------------------------------------------------------
-# parse_grammar()
-#
-# This takes a raw grammar rule string and parses it into production data
-# -----------------------------------------------------------------------------
-def parse_grammar(doc,file,line):
-    grammar = []
-    # Split the doc string into lines
-    pstrings = doc.splitlines()
-    lastp = None
-    dline = line
-    for ps in pstrings:
-        dline += 1
-        p = ps.split()
-        if not p: continue
-        try:
-            if p[0] == '|':
-                # This is a continuation of a previous rule
-                if not lastp:
-                    raise SyntaxError("%s:%d: Misplaced '|'" % (file,dline))
-                prodname = lastp
-                syms = p[1:]
-            else:
-                prodname = p[0]
-                lastp = prodname
-                syms   = p[2:]
-                assign = p[1]
-                if assign != ':' and assign != '::=':
-                    raise SyntaxError("%s:%d: Syntax error. Expected ':'" % (file,dline))
-
-            grammar.append((file,dline,prodname,syms))
-        except SyntaxError:
-            raise
-        except Exception:
-            raise SyntaxError("%s:%d: Syntax error in rule '%s'" % (file,dline,ps.strip()))
-
-    return grammar
-
-# -----------------------------------------------------------------------------
-# ParserReflect()
-#
-# This class represents information extracted for building a parser including
-# start symbol, error function, tokens, precedence list, action functions,
-# etc.
-# -----------------------------------------------------------------------------
-class ParserReflect(object):
-    def __init__(self,pdict,log=None):
-        self.pdict      = pdict
-        self.start      = None
-        self.error_func = None
-        self.tokens     = None
-        self.files      = {}
-        self.grammar    = []
-        self.error      = 0
-
-        if log is None:
-            self.log = PlyLogger(sys.stderr)
-        else:
-            self.log = log
-
-    # Get all of the basic information
-    def get_all(self):
-        self.get_start()
-        self.get_error_func()
-        self.get_tokens()
-        self.get_precedence()
-        self.get_pfunctions()
-        
-    # Validate all of the information
-    def validate_all(self):
-        self.validate_start()
-        self.validate_error_func()
-        self.validate_tokens()
-        self.validate_precedence()
-        self.validate_pfunctions()
-        self.validate_files()
-        return self.error
-
-    # Compute a signature over the grammar
-    def signature(self):
-        try:
-            from hashlib import md5
-        except ImportError:
-            from md5 import md5
-        try:
-            sig = md5()
-            if self.start:
-                sig.update(self.start.encode('latin-1'))
-            if self.prec:
-                sig.update("".join(["".join(p) for p in self.prec]).encode('latin-1'))
-            if self.tokens:
-                sig.update(" ".join(self.tokens).encode('latin-1'))
-            for f in self.pfuncs:
-                if f[3]:
-                    sig.update(f[3].encode('latin-1'))
-        except (TypeError,ValueError):
-            pass
-        return sig.digest()
-
-    # -----------------------------------------------------------------------------
-    # validate_file()
-    #
-    # This method checks to see if there are duplicated p_rulename() functions
-    # in the parser module file.  Without this function, it is really easy for
-    # users to make mistakes by cutting and pasting code fragments (and it's a real
-    # bugger to try and figure out why the resulting parser doesn't work).  Therefore,
-    # we just do a little regular expression pattern matching of def statements
-    # to try and detect duplicates.
-    # -----------------------------------------------------------------------------
-
-    def validate_files(self):
-        # Match def p_funcname(
-        fre = re.compile(r'\s*def\s+(p_[a-zA-Z_0-9]*)\(')
-
-        for filename in self.files.keys():
-            base,ext = os.path.splitext(filename)
-            if ext != '.py': return 1          # No idea. Assume it's okay.
-
-            try:
-                f = open(filename)
-                lines = f.readlines()
-                f.close()
-            except IOError:
-                continue
-
-            counthash = { }
-            for linen,l in enumerate(lines):
-                linen += 1
-                m = fre.match(l)
-                if m:
-                    name = m.group(1)
-                    prev = counthash.get(name)
-                    if not prev:
-                        counthash[name] = linen
-                    else:
-                        self.log.warning("%s:%d: Function %s redefined. Previously defined on line %d", filename,linen,name,prev)
-
-    # Get the start symbol
-    def get_start(self):
-        self.start = self.pdict.get('start')
-
-    # Validate the start symbol
-    def validate_start(self):
-        if self.start is not None:
-            if not isinstance(self.start,str):
-                self.log.error("'start' must be a string")
-
-    # Look for error handler
-    def get_error_func(self):
-        self.error_func = self.pdict.get('p_error')
-
-    # Validate the error function
-    def validate_error_func(self):
-        if self.error_func:
-            if isinstance(self.error_func,types.FunctionType):
-                ismethod = 0
-            elif isinstance(self.error_func, types.MethodType):
-                ismethod = 1
-            else:
-                self.log.error("'p_error' defined, but is not a function or method")
-                self.error = 1
-                return
-
-            eline = func_code(self.error_func).co_firstlineno
-            efile = func_code(self.error_func).co_filename
-            self.files[efile] = 1
-
-            if (func_code(self.error_func).co_argcount != 1+ismethod):
-                self.log.error("%s:%d: p_error() requires 1 argument",efile,eline)
-                self.error = 1
-
-    # Get the tokens map
-    def get_tokens(self):
-        tokens = self.pdict.get("tokens",None)
-        if not tokens:
-            self.log.error("No token list is defined")
-            self.error = 1
-            return
-
-        if not isinstance(tokens,(list, tuple)):
-            self.log.error("tokens must be a list or tuple")
-            self.error = 1
-            return
-        
-        if not tokens:
-            self.log.error("tokens is empty")
-            self.error = 1
-            return
-
-        self.tokens = tokens
-
-    # Validate the tokens
-    def validate_tokens(self):
-        # Validate the tokens.
-        if 'error' in self.tokens:
-            self.log.error("Illegal token name 'error'. Is a reserved word")
-            self.error = 1
-            return
-
-        terminals = {}
-        for n in self.tokens:
-            if n in terminals:
-                self.log.warning("Token '%s' multiply defined", n)
-            terminals[n] = 1
-
-    # Get the precedence map (if any)
-    def get_precedence(self):
-        self.prec = self.pdict.get("precedence",None)
-
-    # Validate and parse the precedence map
-    def validate_precedence(self):
-        preclist = []
-        if self.prec:
-            if not isinstance(self.prec,(list,tuple)):
-                self.log.error("precedence must be a list or tuple")
-                self.error = 1
-                return
-            for level,p in enumerate(self.prec):
-                if not isinstance(p,(list,tuple)):
-                    self.log.error("Bad precedence table")
-                    self.error = 1
-                    return
-
-                if len(p) < 2:
-                    self.log.error("Malformed precedence entry %s. Must be (assoc, term, ..., term)",p)
-                    self.error = 1
-                    return
-                assoc = p[0]
-                if not isinstance(assoc,str):
-                    self.log.error("precedence associativity must be a string")
-                    self.error = 1
-                    return
-                for term in p[1:]:
-                    if not isinstance(term,str):
-                        self.log.error("precedence items must be strings")
-                        self.error = 1
-                        return
-                    preclist.append((term,assoc,level+1))
-        self.preclist = preclist
-
-    # Get all p_functions from the grammar
-    def get_pfunctions(self):
-        p_functions = []
-        for name, item in self.pdict.items():
-            if name[:2] != 'p_': continue
-            if name == 'p_error': continue
-            if isinstance(item,(types.FunctionType,types.MethodType)):
-                line = func_code(item).co_firstlineno
-                file = func_code(item).co_filename
-                p_functions.append((line,file,name,item.__doc__))
-
-        # Sort all of the actions by line number
-        p_functions.sort()
-        self.pfuncs = p_functions
-
-
-    # Validate all of the p_functions
-    def validate_pfunctions(self):
-        grammar = []
-        # Check for non-empty symbols
-        if len(self.pfuncs) == 0:
-            self.log.error("no rules of the form p_rulename are defined")
-            self.error = 1
-            return 
-        
-        for line, file, name, doc in self.pfuncs:
-            func = self.pdict[name]
-            if isinstance(func, types.MethodType):
-                reqargs = 2
-            else:
-                reqargs = 1
-            if func_code(func).co_argcount > reqargs:
-                self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,func.__name__)
-                self.error = 1
-            elif func_code(func).co_argcount < reqargs:
-                self.log.error("%s:%d: Rule '%s' requires an argument",file,line,func.__name__)
-                self.error = 1
-            elif not func.__doc__:
-                self.log.warning("%s:%d: No documentation string specified in function '%s' (ignored)",file,line,func.__name__)
-            else:
-                try:
-                    parsed_g = parse_grammar(doc,file,line)
-                    for g in parsed_g:
-                        grammar.append((name, g))
-                except SyntaxError:
-                    e = sys.exc_info()[1]
-                    self.log.error(str(e))
-                    self.error = 1
-
-                # Looks like a valid grammar rule
-                # Mark the file in which defined.
-                self.files[file] = 1
-
-        # Secondary validation step that looks for p_ definitions that are not functions
-        # or functions that look like they might be grammar rules.
-
-        for n,v in self.pdict.items():
-            if n[0:2] == 'p_' and isinstance(v, (types.FunctionType, types.MethodType)): continue
-            if n[0:2] == 't_': continue
-            if n[0:2] == 'p_' and n != 'p_error':
-                self.log.warning("'%s' not defined as a function", n)
-            if ((isinstance(v,types.FunctionType) and func_code(v).co_argcount == 1) or
-                (isinstance(v,types.MethodType) and func_code(v).co_argcount == 2)):
-                try:
-                    doc = v.__doc__.split(" ")
-                    if doc[1] == ':':
-                        self.log.warning("%s:%d: Possible grammar rule '%s' defined without p_ prefix",
-                                         func_code(v).co_filename, func_code(v).co_firstlineno,n)
-                except Exception:
-                    pass
-
-        self.grammar = grammar
-
-# -----------------------------------------------------------------------------
-# yacc(module)
-#
-# Build a parser
-# -----------------------------------------------------------------------------
-
-def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, start=None, 
-         check_recursion=1, optimize=0, write_tables=1, debugfile=debug_file,outputdir='',
-         debuglog=None, errorlog = None, picklefile=None):
-
-    global parse                 # Reference to the parsing method of the last built parser
-
-    # If pickling is enabled, table files are not created
-
-    if picklefile:
-        write_tables = 0
-
-    if errorlog is None:
-        errorlog = PlyLogger(sys.stderr)
-
-    # Get the module dictionary used for the parser
-    if module:
-        _items = [(k,getattr(module,k)) for k in dir(module)]
-        pdict = dict(_items)
-    else:
-        pdict = get_caller_module_dict(2)
-
-    # Collect parser information from the dictionary
-    pinfo = ParserReflect(pdict,log=errorlog)
-    pinfo.get_all()
-
-    if pinfo.error:
-        raise YaccError("Unable to build parser")
-
-    # Check signature against table files (if any)
-    signature = pinfo.signature()
-
-    # Read the tables
-    try:
-        lr = LRTable()
-        if picklefile:
-            read_signature = lr.read_pickle(picklefile)
-        else:
-            read_signature = lr.read_table(tabmodule)
-        if optimize or (read_signature == signature):
-            try:
-                lr.bind_callables(pinfo.pdict)
-                parser = LRParser(lr,pinfo.error_func)
-                parse = parser.parse
-                return parser
-            except Exception:
-                e = sys.exc_info()[1]
-                errorlog.warning("There was a problem loading the table file: %s", repr(e))
-    except VersionError:
-        e = sys.exc_info()
-        errorlog.warning(str(e))
-    except Exception:
-        pass
-
-    if debuglog is None:
-        if debug:
-            debuglog = PlyLogger(open(debugfile,"w"))
-        else:
-            debuglog = NullLogger()
-
-    debuglog.info("Created by PLY version %s (http://www.dabeaz.com/ply)", __version__)
-
-
-    errors = 0
-
-    # Validate the parser information
-    if pinfo.validate_all():
-        raise YaccError("Unable to build parser")
-    
-    if not pinfo.error_func:
-        errorlog.warning("no p_error() function is defined")
-
-    # Create a grammar object
-    grammar = Grammar(pinfo.tokens)
-
-    # Set precedence level for terminals
-    for term, assoc, level in pinfo.preclist:
-        try:
-            grammar.set_precedence(term,assoc,level)
-        except GrammarError:
-            e = sys.exc_info()[1]
-            errorlog.warning("%s",str(e))
-
-    # Add productions to the grammar
-    for funcname, gram in pinfo.grammar:
-        file, line, prodname, syms = gram
-        try:
-            grammar.add_production(prodname,syms,funcname,file,line)
-        except GrammarError:
-            e = sys.exc_info()[1]
-            errorlog.error("%s",str(e))
-            errors = 1
-
-    # Set the grammar start symbols
-    try:
-        if start is None:
-            grammar.set_start(pinfo.start)
-        else:
-            grammar.set_start(start)
-    except GrammarError:
-        e = sys.exc_info()[1]
-        errorlog.error(str(e))
-        errors = 1
-
-    if errors:
-        raise YaccError("Unable to build parser")
-
-    # Verify the grammar structure
-    undefined_symbols = grammar.undefined_symbols()
-    for sym, prod in undefined_symbols:
-        errorlog.error("%s:%d: Symbol '%s' used, but not defined as a token or a rule",prod.file,prod.line,sym)
-        errors = 1
-
-    unused_terminals = grammar.unused_terminals()
-    if unused_terminals:
-        debuglog.info("")
-        debuglog.info("Unused terminals:")
-        debuglog.info("")
-        for term in unused_terminals:
-            errorlog.warning("Token '%s' defined, but not used", term)
-            debuglog.info("    %s", term)
-
-    # Print out all productions to the debug log
-    if debug:
-        debuglog.info("")
-        debuglog.info("Grammar")
-        debuglog.info("")
-        for n,p in enumerate(grammar.Productions):
-            debuglog.info("Rule %-5d %s", n, p)
-
-    # Find unused non-terminals
-    unused_rules = grammar.unused_rules()
-    for prod in unused_rules:
-        errorlog.warning("%s:%d: Rule '%s' defined, but not used", prod.file, prod.line, prod.name)
-
-    if len(unused_terminals) == 1:
-        errorlog.warning("There is 1 unused token")
-    if len(unused_terminals) > 1:
-        errorlog.warning("There are %d unused tokens", len(unused_terminals))
-
-    if len(unused_rules) == 1:
-        errorlog.warning("There is 1 unused rule")
-    if len(unused_rules) > 1:
-        errorlog.warning("There are %d unused rules", len(unused_rules))
-
-    if debug:
-        debuglog.info("")
-        debuglog.info("Terminals, with rules where they appear")
-        debuglog.info("")
-        terms = list(grammar.Terminals)
-        terms.sort()
-        for term in terms:
-            debuglog.info("%-20s : %s", term, " ".join([str(s) for s in grammar.Terminals[term]]))
-        
-        debuglog.info("")
-        debuglog.info("Nonterminals, with rules where they appear")
-        debuglog.info("")
-        nonterms = list(grammar.Nonterminals)
-        nonterms.sort()
-        for nonterm in nonterms:
-            debuglog.info("%-20s : %s", nonterm, " ".join([str(s) for s in grammar.Nonterminals[nonterm]]))
-        debuglog.info("")
-
-    if check_recursion:
-        unreachable = grammar.find_unreachable()
-        for u in unreachable:
-            errorlog.warning("Symbol '%s' is unreachable",u)
-
-        infinite = grammar.infinite_cycles()
-        for inf in infinite:
-            errorlog.error("Infinite recursion detected for symbol '%s'", inf)
-            errors = 1
-        
-    unused_prec = grammar.unused_precedence()
-    for term, assoc in unused_prec:
-        errorlog.error("Precedence rule '%s' defined for unknown symbol '%s'", assoc, term)
-        errors = 1
-
-    if errors:
-        raise YaccError("Unable to build parser")
-    
-    # Run the LRGeneratedTable on the grammar
-    if debug:
-        errorlog.debug("Generating %s tables", method)
-            
-    lr = LRGeneratedTable(grammar,method,debuglog)
-
-    if debug:
-        num_sr = len(lr.sr_conflicts)
-
-        # Report shift/reduce and reduce/reduce conflicts
-        if num_sr == 1:
-            errorlog.warning("1 shift/reduce conflict")
-        elif num_sr > 1:
-            errorlog.warning("%d shift/reduce conflicts", num_sr)
-
-        num_rr = len(lr.rr_conflicts)
-        if num_rr == 1:
-            errorlog.warning("1 reduce/reduce conflict")
-        elif num_rr > 1:
-            errorlog.warning("%d reduce/reduce conflicts", num_rr)
-
-    # Write out conflicts to the output file
-    if debug and (lr.sr_conflicts or lr.rr_conflicts):
-        debuglog.warning("")
-        debuglog.warning("Conflicts:")
-        debuglog.warning("")
-
-        for state, tok, resolution in lr.sr_conflicts:
-            debuglog.warning("shift/reduce conflict for %s in state %d resolved as %s",  tok, state, resolution)
-        
-        already_reported = {}
-        for state, rule, rejected in lr.rr_conflicts:
-            if (state,id(rule),id(rejected)) in already_reported:
-                continue
-            debuglog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule)
-            debuglog.warning("rejected rule (%s) in state %d", rejected,state)
-            errorlog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule)
-            errorlog.warning("rejected rule (%s) in state %d", rejected, state)
-            already_reported[state,id(rule),id(rejected)] = 1
-        
-        warned_never = []
-        for state, rule, rejected in lr.rr_conflicts:
-            if not rejected.reduced and (rejected not in warned_never):
-                debuglog.warning("Rule (%s) is never reduced", rejected)
-                errorlog.warning("Rule (%s) is never reduced", rejected)
-                warned_never.append(rejected)
-
-    # Write the table file if requested
-    if write_tables:
-        lr.write_table(tabmodule,outputdir,signature)
-
-    # Write a pickled version of the tables
-    if picklefile:
-        lr.pickle_table(picklefile,signature)
-
-    # Build the parser
-    lr.bind_callables(pinfo.pdict)
-    parser = LRParser(lr,pinfo.error_func)
-
-    parse = parser.parse
-    return parser
diff --git a/ui/gfx/geometry/mojo/BUILD.gn b/ui/gfx/geometry/mojo/BUILD.gn
deleted file mode 100644
index f6cda9d..0000000
--- a/ui/gfx/geometry/mojo/BUILD.gn
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-
-# This target does NOT depend on skia. One can depend on this target to avoid
-# picking up a dependency on skia.
-mojom("mojo") {
-  sources = [
-    "geometry.mojom",
-  ]
-}
-
-mojom("test_interfaces") {
-  sources = [
-    "geometry_traits_test_service.mojom",
-  ]
-
-  public_deps = [
-    ":mojo",
-  ]
-}
-
-source_set("unit_test") {
-  testonly = true
-
-  sources = [
-    "geometry_struct_traits_unittest.cc",
-  ]
-
-  deps = [
-    ":test_interfaces",
-    "//base",
-    "//mojo/public/cpp/bindings",
-    "//testing/gtest",
-    "//ui/gfx/geometry",
-  ]
-}
-
-source_set("struct_traits") {
-  sources = [
-    "geometry_struct_traits.h",
-  ]
-  public_deps = [
-    ":mojo_shared_cpp_sources",
-    "//ui/gfx/geometry",
-  ]
-}
diff --git a/ui/gfx/geometry/mojo/DEPS b/ui/gfx/geometry/mojo/DEPS
deleted file mode 100644
index 3ad6543..0000000
--- a/ui/gfx/geometry/mojo/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  "+mojo/public",
-  "+ui/gfx/geometry",
-]
diff --git a/ui/gfx/geometry/mojo/geometry.mojom b/ui/gfx/geometry/mojo/geometry.mojom
deleted file mode 100644
index 9714386..0000000
--- a/ui/gfx/geometry/mojo/geometry.mojom
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module gfx.mojom;
-
-struct Point {
-  int32 x;
-  int32 y;
-};
-
-struct PointF {
-  float x;
-  float y;
-};
-
-struct Size {
-  int32 width;
-  int32 height;
-};
-
-struct SizeF {
-  float width;
-  float height;
-};
-
-struct Rect {
-  int32 x;
-  int32 y;
-  int32 width;
-  int32 height;
-};
-
-struct RectF {
-  float x;
-  float y;
-  float width;
-  float height;
-};
-
-struct Insets {
-  int32 top;
-  int32 left;
-  int32 bottom;
-  int32 right;
-};
-
-struct InsetsF {
-  float top;
-  float left;
-  float bottom;
-  float right;
-};
-
-struct Vector2d {
-  int32 x;
-  int32 y;
-};
-
-struct Vector2dF {
-  float x;
-  float y;
-};
diff --git a/ui/gfx/geometry/mojo/geometry.typemap b/ui/gfx/geometry/mojo/geometry.typemap
deleted file mode 100644
index 686ea05..0000000
--- a/ui/gfx/geometry/mojo/geometry.typemap
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//ui/gfx/geometry/mojo/geometry.mojom"
-public_headers = [
-  "//ui/gfx/geometry/point.h",
-  "//ui/gfx/geometry/point_f.h",
-  "//ui/gfx/geometry/size.h",
-  "//ui/gfx/geometry/rect.h",
-  "//ui/gfx/geometry/rect_f.h",
-  "//ui/gfx/geometry/safe_integer_conversions.h",
-  "//ui/gfx/geometry/insets.h",
-  "//ui/gfx/geometry/vector2d.h",
-  "//ui/gfx/geometry/vector2d_f.h",
-]
-traits_headers = [ "//ui/gfx/geometry/mojo/geometry_struct_traits.h" ]
-deps = [
-  "//ui/gfx/geometry/mojo:struct_traits",
-]
-type_mappings = [
-  "gfx.mojom.Point=gfx::Point",
-  "gfx.mojom.PointF=gfx::PointF",
-  "gfx.mojom.Size=gfx::Size",
-  "gfx.mojom.SizeF=gfx::SizeF",
-  "gfx.mojom.Rect=gfx::Rect",
-  "gfx.mojom.RectF=gfx::RectF",
-  "gfx.mojom.Insets=gfx::Insets",
-  "gfx.mojom.InsetsF=gfx::InsetsF",
-  "gfx.mojom.Vector2d=gfx::Vector2d",
-  "gfx.mojom.Vector2dF=gfx::Vector2dF",
-]
diff --git a/ui/gfx/geometry/mojo/geometry_struct_traits.h b/ui/gfx/geometry/mojo/geometry_struct_traits.h
deleted file mode 100644
index a31d738..0000000
--- a/ui/gfx/geometry/mojo/geometry_struct_traits.h
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_GFX_GEOMETRY_MOJO_GEOMETRY_STRUCT_TRAITS_H_
-#define UI_GFX_GEOMETRY_MOJO_GEOMETRY_STRUCT_TRAITS_H_
-
-#include "ui/gfx/geometry/insets.h"
-#include "ui/gfx/geometry/insets_f.h"
-#include "ui/gfx/geometry/mojo/geometry.mojom-shared.h"
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/point_f.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/rect_f.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/geometry/size_f.h"
-#include "ui/gfx/geometry/vector2d.h"
-#include "ui/gfx/geometry/vector2d_f.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<gfx::mojom::InsetsDataView, gfx::Insets> {
-  static int top(const gfx::Insets& p) { return p.top(); }
-  static int left(const gfx::Insets& p) { return p.left(); }
-  static int bottom(const gfx::Insets& p) { return p.bottom(); }
-  static int right(const gfx::Insets& p) { return p.right(); }
-  static bool Read(gfx::mojom::InsetsDataView data, gfx::Insets* out) {
-    out->Set(data.top(), data.left(), data.bottom(), data.right());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::InsetsFDataView, gfx::InsetsF> {
-  static float top(const gfx::InsetsF& p) { return p.top(); }
-  static float left(const gfx::InsetsF& p) { return p.left(); }
-  static float bottom(const gfx::InsetsF& p) { return p.bottom(); }
-  static float right(const gfx::InsetsF& p) { return p.right(); }
-  static bool Read(gfx::mojom::InsetsFDataView data, gfx::InsetsF* out) {
-    out->Set(data.top(), data.left(), data.bottom(), data.right());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::PointDataView, gfx::Point> {
-  static int x(const gfx::Point& p) { return p.x(); }
-  static int y(const gfx::Point& p) { return p.y(); }
-  static bool Read(gfx::mojom::PointDataView data, gfx::Point* out) {
-    out->SetPoint(data.x(), data.y());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::PointFDataView, gfx::PointF> {
-  static float x(const gfx::PointF& p) { return p.x(); }
-  static float y(const gfx::PointF& p) { return p.y(); }
-  static bool Read(gfx::mojom::PointFDataView data, gfx::PointF* out) {
-    out->SetPoint(data.x(), data.y());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::RectDataView, gfx::Rect> {
-  static int x(const gfx::Rect& p) { return p.x(); }
-  static int y(const gfx::Rect& p) { return p.y(); }
-  static int width(const gfx::Rect& p) { return p.width(); }
-  static int height(const gfx::Rect& p) { return p.height(); }
-  static bool Read(gfx::mojom::RectDataView data, gfx::Rect* out) {
-    if (data.width() < 0 || data.height() < 0)
-      return false;
-
-    out->SetRect(data.x(), data.y(), data.width(), data.height());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::RectFDataView, gfx::RectF> {
-  static float x(const gfx::RectF& p) { return p.x(); }
-  static float y(const gfx::RectF& p) { return p.y(); }
-  static float width(const gfx::RectF& p) { return p.width(); }
-  static float height(const gfx::RectF& p) { return p.height(); }
-  static bool Read(gfx::mojom::RectFDataView data, gfx::RectF* out) {
-    if (data.width() < 0 || data.height() < 0)
-      return false;
-
-    out->SetRect(data.x(), data.y(), data.width(), data.height());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::SizeDataView, gfx::Size> {
-  static int width(const gfx::Size& p) { return p.width(); }
-  static int height(const gfx::Size& p) { return p.height(); }
-  static bool Read(gfx::mojom::SizeDataView data, gfx::Size* out) {
-    if (data.width() < 0 || data.height() < 0)
-      return false;
-
-    out->SetSize(data.width(), data.height());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::SizeFDataView, gfx::SizeF> {
-  static float width(const gfx::SizeF& p) { return p.width(); }
-  static float height(const gfx::SizeF& p) { return p.height(); }
-  static bool Read(gfx::mojom::SizeFDataView data, gfx::SizeF* out) {
-    if (data.width() < 0 || data.height() < 0)
-      return false;
-
-    out->SetSize(data.width(), data.height());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::Vector2dDataView, gfx::Vector2d> {
-  static int x(const gfx::Vector2d& v) { return v.x(); }
-  static int y(const gfx::Vector2d& v) { return v.y(); }
-  static bool Read(gfx::mojom::Vector2dDataView data, gfx::Vector2d* out) {
-    out->set_x(data.x());
-    out->set_y(data.y());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::Vector2dFDataView, gfx::Vector2dF> {
-  static float x(const gfx::Vector2dF& v) { return v.x(); }
-  static float y(const gfx::Vector2dF& v) { return v.y(); }
-  static bool Read(gfx::mojom::Vector2dFDataView data, gfx::Vector2dF* out) {
-    out->set_x(data.x());
-    out->set_y(data.y());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // UI_GFX_GEOMETRY_MOJO_GEOMETRY_STRUCT_TRAITS_H_
diff --git a/ui/gfx/geometry/mojo/geometry_struct_traits_unittest.cc b/ui/gfx/geometry/mojo/geometry_struct_traits_unittest.cc
deleted file mode 100644
index d595794..0000000
--- a/ui/gfx/geometry/mojo/geometry_struct_traits_unittest.cc
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_loop.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/geometry/mojo/geometry_traits_test_service.mojom.h"
-#include "ui/gfx/geometry/point.h"
-
-namespace gfx {
-
-namespace {
-
-class GeometryStructTraitsTest : public testing::Test,
-                                 public mojom::GeometryTraitsTestService {
- public:
-  GeometryStructTraitsTest() {}
-
- protected:
-  mojom::GeometryTraitsTestServicePtr GetTraitsTestProxy() {
-    return traits_test_bindings_.CreateInterfacePtrAndBind(this);
-  }
-
- private:
-  // GeometryTraitsTestService:
-  void EchoPoint(const Point& p, const EchoPointCallback& callback) override {
-    callback.Run(p);
-  }
-
-  void EchoPointF(const PointF& p,
-                  const EchoPointFCallback& callback) override {
-    callback.Run(p);
-  }
-
-  void EchoSize(const Size& s, const EchoSizeCallback& callback) override {
-    callback.Run(s);
-  }
-
-  void EchoSizeF(const SizeF& s, const EchoSizeFCallback& callback) override {
-    callback.Run(s);
-  }
-
-  void EchoRect(const Rect& r, const EchoRectCallback& callback) override {
-    callback.Run(r);
-  }
-
-  void EchoRectF(const RectF& r, const EchoRectFCallback& callback) override {
-    callback.Run(r);
-  }
-
-  void EchoInsets(const Insets& i,
-                  const EchoInsetsCallback& callback) override {
-    callback.Run(i);
-  }
-
-  void EchoInsetsF(const InsetsF& i,
-                   const EchoInsetsFCallback& callback) override {
-    callback.Run(i);
-  }
-
-  void EchoVector2d(const Vector2d& v,
-                    const EchoVector2dCallback& callback) override {
-    callback.Run(v);
-  }
-
-  void EchoVector2dF(const Vector2dF& v,
-                     const EchoVector2dFCallback& callback) override {
-    callback.Run(v);
-  }
-
-  base::MessageLoop loop_;
-  mojo::BindingSet<GeometryTraitsTestService> traits_test_bindings_;
-
-  DISALLOW_COPY_AND_ASSIGN(GeometryStructTraitsTest);
-};
-
-}  // namespace
-
-TEST_F(GeometryStructTraitsTest, Point) {
-  const int32_t x = 1234;
-  const int32_t y = -5678;
-  gfx::Point input(x, y);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Point output;
-  proxy->EchoPoint(input, &output);
-  EXPECT_EQ(x, output.x());
-  EXPECT_EQ(y, output.y());
-}
-
-TEST_F(GeometryStructTraitsTest, PointF) {
-  const float x = 1234.5f;
-  const float y = 6789.6f;
-  gfx::PointF input(x, y);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::PointF output;
-  proxy->EchoPointF(input, &output);
-  EXPECT_EQ(x, output.x());
-  EXPECT_EQ(y, output.y());
-}
-
-TEST_F(GeometryStructTraitsTest, Size) {
-  const int32_t width = 1234;
-  const int32_t height = 5678;
-  gfx::Size input(width, height);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Size output;
-  proxy->EchoSize(input, &output);
-  EXPECT_EQ(width, output.width());
-  EXPECT_EQ(height, output.height());
-}
-
-TEST_F(GeometryStructTraitsTest, SizeF) {
-  const float width = 1234.5f;
-  const float height = 6789.6f;
-  gfx::SizeF input(width, height);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::SizeF output;
-  proxy->EchoSizeF(input, &output);
-  EXPECT_EQ(width, output.width());
-  EXPECT_EQ(height, output.height());
-}
-
-TEST_F(GeometryStructTraitsTest, Rect) {
-  const int32_t x = 1234;
-  const int32_t y = 5678;
-  const int32_t width = 4321;
-  const int32_t height = 8765;
-  gfx::Rect input(x, y, width, height);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Rect output;
-  proxy->EchoRect(input, &output);
-  EXPECT_EQ(x, output.x());
-  EXPECT_EQ(y, output.y());
-  EXPECT_EQ(width, output.width());
-  EXPECT_EQ(height, output.height());
-}
-
-TEST_F(GeometryStructTraitsTest, RectF) {
-  const float x = 1234.1f;
-  const float y = 5678.2f;
-  const float width = 4321.3f;
-  const float height = 8765.4f;
-  gfx::RectF input(x, y, width, height);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::RectF output;
-  proxy->EchoRectF(input, &output);
-  EXPECT_EQ(x, output.x());
-  EXPECT_EQ(y, output.y());
-  EXPECT_EQ(width, output.width());
-  EXPECT_EQ(height, output.height());
-}
-
-TEST_F(GeometryStructTraitsTest, Insets) {
-  const int32_t top = 1234;
-  const int32_t left = 5678;
-  const int32_t bottom = 4321;
-  const int32_t right = 8765;
-  gfx::Insets input(top, left, bottom, right);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Insets output;
-  proxy->EchoInsets(input, &output);
-  EXPECT_EQ(top, output.top());
-  EXPECT_EQ(left, output.left());
-  EXPECT_EQ(bottom, output.bottom());
-  EXPECT_EQ(right, output.right());
-}
-
-TEST_F(GeometryStructTraitsTest, InsetsF) {
-  const float top = 1234.1f;
-  const float left = 5678.2f;
-  const float bottom = 4321.3f;
-  const float right = 8765.4f;
-  gfx::InsetsF input(top, left, bottom, right);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::InsetsF output;
-  proxy->EchoInsetsF(input, &output);
-  EXPECT_EQ(top, output.top());
-  EXPECT_EQ(left, output.left());
-  EXPECT_EQ(bottom, output.bottom());
-  EXPECT_EQ(right, output.right());
-}
-
-TEST_F(GeometryStructTraitsTest, Vector2d) {
-  const int32_t x = 1234;
-  const int32_t y = -5678;
-  gfx::Vector2d input(x, y);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Vector2d output;
-  proxy->EchoVector2d(input, &output);
-  EXPECT_EQ(x, output.x());
-  EXPECT_EQ(y, output.y());
-}
-
-TEST_F(GeometryStructTraitsTest, Vector2dF) {
-  const float x = 1234.5f;
-  const float y = 6789.6f;
-  gfx::Vector2dF input(x, y);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Vector2dF output;
-  proxy->EchoVector2dF(input, &output);
-  EXPECT_EQ(x, output.x());
-  EXPECT_EQ(y, output.y());
-}
-
-}  // namespace gfx
diff --git a/ui/gfx/geometry/mojo/geometry_traits_test_service.mojom b/ui/gfx/geometry/mojo/geometry_traits_test_service.mojom
deleted file mode 100644
index 8d4fb94..0000000
--- a/ui/gfx/geometry/mojo/geometry_traits_test_service.mojom
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module gfx.mojom;
-
-import "ui/gfx/geometry/mojo/geometry.mojom";
-
-// All functions on this interface echo their arguments to test StructTraits
-// serialization and deserialization.
-interface GeometryTraitsTestService {
-  [Sync]
-  EchoPoint(Point p) => (Point pass);
-
-  [Sync]
-  EchoPointF(PointF p) => (PointF pass);
-
-  [Sync]
-  EchoSize(Size s) => (Size pass);
-
-  [Sync]
-  EchoSizeF(SizeF s) => (SizeF pass);
-
-  [Sync]
-  EchoRect(Rect r) => (Rect pass);
-
-  [Sync]
-  EchoRectF(RectF r) => (RectF pass);
-
-  [Sync]
-  EchoInsets(Insets i) => (Insets pass);
-
-  [Sync]
-  EchoInsetsF(InsetsF i) => (InsetsF pass);
-
-  [Sync]
-  EchoVector2d(Vector2d v) => (Vector2d pass);
-
-  [Sync]
-  EchoVector2dF(Vector2dF v) => (Vector2dF pass);
-};
diff --git a/ui/gfx/range/mojo/BUILD.gn b/ui/gfx/range/mojo/BUILD.gn
deleted file mode 100644
index b6d458d..0000000
--- a/ui/gfx/range/mojo/BUILD.gn
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-
-# This target does NOT depend on skia. One can depend on this target to avoid
-# picking up a dependency on skia.
-mojom("mojo") {
-  sources = [
-    "range.mojom",
-  ]
-}
-
-mojom("test_interfaces") {
-  sources = [
-    "range_traits_test_service.mojom",
-  ]
-
-  public_deps = [
-    ":mojo",
-  ]
-}
-
-source_set("unit_test") {
-  testonly = true
-
-  sources = [
-    "range_struct_traits_unittest.cc",
-  ]
-
-  deps = [
-    ":test_interfaces",
-    "//base",
-    "//mojo/public/cpp/bindings",
-    "//testing/gtest",
-    "//ui/gfx/range",
-  ]
-}
-
-source_set("struct_traits") {
-  sources = [
-    "range_struct_traits.h",
-  ]
-  public_deps = [
-    ":mojo_shared_cpp_sources",
-    "//ui/gfx/range",
-  ]
-}
diff --git a/ui/gfx/range/mojo/DEPS b/ui/gfx/range/mojo/DEPS
deleted file mode 100644
index 418fc69..0000000
--- a/ui/gfx/range/mojo/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  "+mojo/public",
-  "+ui/gfx/range",
-]
diff --git a/ui/gfx/range/mojo/range.mojom b/ui/gfx/range/mojo/range.mojom
deleted file mode 100644
index 079c146..0000000
--- a/ui/gfx/range/mojo/range.mojom
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module gfx.mojom;
-
-struct Range {
-  uint32 start;
-  uint32 end;
-};
-
-struct RangeF {
-  float start;
-  float end;
-};
diff --git a/ui/gfx/range/mojo/range.typemap b/ui/gfx/range/mojo/range.typemap
deleted file mode 100644
index ebf07d1..0000000
--- a/ui/gfx/range/mojo/range.typemap
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//ui/gfx/range/mojo/range.mojom"
-public_headers = [
-  "//ui/gfx/range/range.h",
-  "//ui/gfx/range/range_f.h",
-]
-traits_headers = [ "//ui/gfx/range/mojo/range_struct_traits.h" ]
-deps = [
-  "//ui/gfx/range/mojo:struct_traits",
-]
-type_mappings = [
-  "gfx.mojom.Range=gfx::Range",
-  "gfx.mojom.RangeF=gfx::RangeF",
-]
diff --git a/ui/gfx/range/mojo/range_struct_traits.h b/ui/gfx/range/mojo/range_struct_traits.h
deleted file mode 100644
index e717d41..0000000
--- a/ui/gfx/range/mojo/range_struct_traits.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_GFX_RANGE_MOJO_RANGE_STRUCT_TRAITS_H_
-#define UI_GFX_RANGE_MOJO_RANGE_STRUCT_TRAITS_H_
-
-#include "ui/gfx/range/mojo/range.mojom-shared.h"
-#include "ui/gfx/range/range.h"
-#include "ui/gfx/range/range_f.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<gfx::mojom::RangeDataView, gfx::Range> {
-  static uint32_t start(const gfx::Range& r) { return r.start(); }
-  static uint32_t end(const gfx::Range& r) { return r.end(); }
-  static bool Read(gfx::mojom::RangeDataView data, gfx::Range* out) {
-    out->set_start(data.start());
-    out->set_end(data.end());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::RangeFDataView, gfx::RangeF> {
-  static float start(const gfx::RangeF& r) { return r.start(); }
-  static float end(const gfx::RangeF& r) { return r.end(); }
-  static bool Read(gfx::mojom::RangeFDataView data, gfx::RangeF* out) {
-    out->set_start(data.start());
-    out->set_end(data.end());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // UI_GFX_RANGE_MOJO_RANGE_STRUCT_TRAITS_H_
diff --git a/ui/gfx/range/mojo/range_struct_traits_unittest.cc b/ui/gfx/range/mojo/range_struct_traits_unittest.cc
deleted file mode 100644
index 70b32f3..0000000
--- a/ui/gfx/range/mojo/range_struct_traits_unittest.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_loop.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/range/mojo/range_traits_test_service.mojom.h"
-
-namespace gfx {
-
-namespace {
-
-class RangeStructTraitsTest : public testing::Test,
-                              public mojom::RangeTraitsTestService {
- public:
-  RangeStructTraitsTest() {}
-
- protected:
-  mojom::RangeTraitsTestServicePtr GetTraitsTestProxy() {
-    return traits_test_bindings_.CreateInterfacePtrAndBind(this);
-  }
-
- private:
-  // RangeTraitsTestService:
-  void EchoRange(const Range& p, const EchoRangeCallback& callback) override {
-    callback.Run(p);
-  }
-
-  void EchoRangeF(const RangeF& p,
-                  const EchoRangeFCallback& callback) override {
-    callback.Run(p);
-  }
-
-  base::MessageLoop loop_;
-  mojo::BindingSet<RangeTraitsTestService> traits_test_bindings_;
-
-  DISALLOW_COPY_AND_ASSIGN(RangeStructTraitsTest);
-};
-
-}  // namespace
-
-TEST_F(RangeStructTraitsTest, Range) {
-  const uint32_t start = 1234;
-  const uint32_t end = 5678;
-  gfx::Range input(start, end);
-  mojom::RangeTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Range output;
-  proxy->EchoRange(input, &output);
-  EXPECT_EQ(start, output.start());
-  EXPECT_EQ(end, output.end());
-}
-
-TEST_F(RangeStructTraitsTest, RangeF) {
-  const float start = 1234.5f;
-  const float end = 6789.6f;
-  gfx::RangeF input(start, end);
-  mojom::RangeTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::RangeF output;
-  proxy->EchoRangeF(input, &output);
-  EXPECT_EQ(start, output.start());
-  EXPECT_EQ(end, output.end());
-}
-
-}  // namespace gfx
diff --git a/ui/gfx/range/mojo/range_traits_test_service.mojom b/ui/gfx/range/mojo/range_traits_test_service.mojom
deleted file mode 100644
index 3cde75c..0000000
--- a/ui/gfx/range/mojo/range_traits_test_service.mojom
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module gfx.mojom;
-
-import "ui/gfx/range/mojo/range.mojom";
-
-// All functions on this interface echo their arguments to test StructTraits
-// serialization and deserialization.
-interface RangeTraitsTestService {
-  [Sync]
-  EchoRange(Range p) => (Range pass);
-
-  [Sync]
-  EchoRangeF(RangeF p) => (RangeF pass);
-};
